/*
 * Copyright (C) 2007 Helge Hess
 *
 * This file is part of JOPE.
 *
 * JOPE is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2, or (at your option) any later version.
 *
 * JOPE is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with JOPE; see the file COPYING. If not, write to the Free Software
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
package org.opengroupware.jope.jsapp;

import java.io.File;

import org.opengroupware.jope.appserver.core.WOComponent;
import org.opengroupware.jope.appserver.core.WOContext;
import org.opengroupware.jope.appserver.core.WODirectActionRequestHandler;
import org.opengroupware.jope.appserver.publisher.IJoCallable;
import org.opengroupware.jope.appserver.publisher.IJoContext;

/**
 * JSJoComponent
 * <p>
 * A callable which works on a component reachable via its File wrapper.
 */
public class JSJoComponent extends JSJoObject implements IJoCallable {
  // TBD: maybe this is superflous and can be replaced with JoPageInvocation,
  //      at least it does not contain anything JS
  
  protected File        wrapper;
  protected WOComponent component;
  
  public JSJoComponent
    (Object _container, String _nameInContainer, File _wrapper, WOContext _ctx)
  {
    super(_container, _nameInContainer, _ctx);
    this.wrapper = _wrapper;
  }
  
  /* accessors */
  
  public WOComponent component() {
    if (this.component == null) {
      this.component = this.context.application().pageWithName
        (this.nameInContainer, this.context);
      
      System.err.println("found component: " + this.component);
    }
    return this.component;
  }

  /* IJoObject */
  
  public Object lookupName(String _name, IJoContext _ctx, boolean _acquire) {
    return null; /* we stop here and process the path_info in da call*/
  }
  
  /* IJoCallable */

  public Object callInContext(Object _object, IJoContext _ctx) {
    WOContext wctx = (WOContext)_ctx;
    String actionName = "default";

    if ((actionName = wctx.request().formAction()) == null) {
      String[] handlerPath = _ctx.joTraversalPath().pathInfo();
      if (handlerPath != null || handlerPath.length > 0)
        actionName = handlerPath[0];
    }
    
    return WODirectActionRequestHandler.primaryCallComponentAction
      (this.nameInContainer, actionName, wctx);
  }

  public boolean isCallableInContext(IJoContext _ctx) {
    return true; // ctx instanceof WOContext?
  }

}
