ovidiu      02/03/15 15:39:44

  Modified:    
src/scratchpad/schecoon/src/org/apache/cocoon/components/treeprocessor/sitemap
                        CallFunctionNode.java
  Log:
  Maintain parameters in a list.
  
  Revision  Changes    Path
  1.2       +79 -30    
xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/components/treeprocessor/sitemap/CallFunctionNode.java
  
  Index: CallFunctionNode.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/components/treeprocessor/sitemap/CallFunctionNode.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CallFunctionNode.java     13 Mar 2002 19:03:59 -0000      1.1
  +++ CallFunctionNode.java     15 Mar 2002 23:39:44 -0000      1.2
  @@ -1,72 +1,121 @@
   package org.apache.cocoon.components.treeprocessor.sitemap;
   
  +import java.util.ArrayList;
  +import java.util.Collections;
  +import java.util.List;
  +import java.util.Map;
   import org.apache.avalon.framework.activity.Initializable;
  -
  -import org.apache.cocoon.environment.Environment;
  -
  -import org.apache.cocoon.sitemap.PatternException;
  -
  +import org.apache.avalon.framework.component.Component;
  +import org.apache.avalon.framework.component.ComponentManager;
  +import org.apache.avalon.framework.component.Composable;
  +import org.apache.avalon.framework.configuration.Configurable;
  +import org.apache.avalon.framework.configuration.Configuration;
  +import org.apache.avalon.framework.configuration.ConfigurationException;
  +import org.apache.cocoon.components.flow.Interpreter;
  +import org.apache.cocoon.components.flow.InterpreterSelector;
   import org.apache.cocoon.components.treeprocessor.AbstractProcessingNode;
   import org.apache.cocoon.components.treeprocessor.CategoryNode;
   import org.apache.cocoon.components.treeprocessor.InvokeContext;
   import org.apache.cocoon.components.treeprocessor.MapStackResolver;
   import org.apache.cocoon.components.treeprocessor.ParameterizableProcessingNode;
   import org.apache.cocoon.components.treeprocessor.ProcessingNode;
  -
  -import java.util.List;
  -import java.util.Map;
  +import org.apache.cocoon.environment.Environment;
  +import org.apache.cocoon.sitemap.PatternException;
   
   public class CallFunctionNode extends AbstractProcessingNode
  -    implements Initializable, ParameterizableProcessingNode
  +  implements Component, Configurable, Composable
   {
  -  protected Map parameters;
     protected String functionName;
  +  protected ArrayList parameters;
     protected MapStackResolver resourceResolver;
  +  protected ComponentManager manager;
  +  String language;
   
     public CallFunctionNode(String funName)
     {
       functionName = funName;
     }
   
  -  public void setParameters(Map params)
  +  public static List resolveList(List expressions, List mapStack)
  +    throws PatternException 
     {
  -    parameters = params;
  -    System.out.println("CallFunctionNode: params = " + params);
  +    int size;
  +    if (expressions == null || (size = expressions.size()) == 0)
  +      return Collections.EMPTY_LIST;
  +
  +    List result = new ArrayList(size);
  +
  +    for (int i = 0; i < size; i++) {
  +      Interpreter.Argument arg = (Interpreter.Argument)expressions.get(i);
  +      String value = MapStackResolver.getResolver(arg.value).resolve(mapStack);
  +      result.add (new Interpreter.Argument(arg.name, value));
  +    }
  +
  +    return result;
     }
   
  -  public void initialize()
  -    throws Exception
  +  /**
  +   * Obtain the configuration specific to this node type and update
  +   * the internal state.
  +   *
  +   * @param config a <code>Configuration</code> value
  +   * @exception ConfigurationException if an error occurs
  +   */
  +  public void configure(Configuration config)
  +    throws ConfigurationException
     {
  -    if (MapStackResolver.needsResolve(functionName)) {
  -      // Will always be resolved at invoke time
  -      this.resourceResolver = MapStackResolver.getResolver(functionName);
  +    language = config.getAttribute("language", null);
  +
  +    parameters = new ArrayList();
  +
  +    Configuration[] params = config.getChildren("parameter");
  +    for (int i = 0; i < params.length; i++) {
  +      Configuration param = params[i];
  +      String name = param.getAttribute("name", null);
  +      String value = param.getAttribute("value", null);
  +      parameters.add(new Interpreter.Argument(name, value));
       }
  +
  +    try {
  +      if (MapStackResolver.needsResolve(functionName)) {
  +        // Will always be resolved at invoke time
  +        this.resourceResolver = MapStackResolver.getResolver(functionName);
  +      }
  +    }
  +    catch (PatternException ex) {
  +      throw new ConfigurationException(ex.toString());
  +    }
  +  }
  +
  +  public void compose(ComponentManager manager)
  +  {
  +    this.manager = manager;
     }
   
     public boolean invoke(Environment env, InvokeContext context)
         throws Exception
     {
  -    Map params = parameters;
  +    List params = null;
   
       // Resolve parameters
  -    if (this.parameters != null) {
  -      params = MapStackResolver.resolveMap(this.parameters,
  -                                           context.getMapStack());
  -    }
  +    if (this.parameters != null)
  +      params = resolveList(this.parameters, context.getMapStack());
   
       String name = functionName;
  -
       if (resourceResolver != null) {
         // Need to resolve the function name at runtime
         name = resourceResolver.resolve(context.getMapStack());
  -
  -      if (getLogger().isInfoEnabled()) {
  -        getLogger().info("Calling function " + name);
  -      }
       }
   
  -    System.out.println("CallFunctionNode: invoking " + name
  -                       + ", params = " + params);
  +    InterpreterSelector selector
  +      = (InterpreterSelector)manager.lookup(Interpreter.ROLE);
  +    if (language == null)
  +      language = selector.getDefaultLanguage();
  +    
  +    // Obtain the Interpreter instance for this language
  +    Interpreter interpreter = (Interpreter)selector.select(language);
  +
  +    interpreter.callFunction(name, params, env, context);
       return true;
     }
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to