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]