ovidiu 2002/09/24 01:23:00 Modified: src/java/org/apache/cocoon/components/treeprocessor/sitemap CallFunctionNode.java Log: Changed to handle resuming continuation objects as well as invoking control flow functions. Revision Changes Path 1.5 +56 -44 xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/CallFunctionNode.java Index: CallFunctionNode.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/CallFunctionNode.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- CallFunctionNode.java 8 Sep 2002 00:27:06 -0000 1.4 +++ CallFunctionNode.java 24 Sep 2002 08:23:00 -0000 1.5 @@ -69,22 +69,25 @@ import org.apache.cocoon.environment.Environment; import org.apache.cocoon.environment.Redirector; import org.apache.cocoon.sitemap.PatternException; +import org.apache.cocoon.components.flow.Interpreter; /** - * Node handler for calling functions in the control flow layer. + * Node handler for calling functions and resuming continuations in + * the control flow layer. * * @author <a href="mailto:[EMAIL PROTECTED]">Ovidiu Predescu</a> * @since March 13, 2002 */ public class CallFunctionNode extends AbstractProcessingNode - implements Configurable, Composable, Initializable + implements Configurable, Composable { protected String functionName; + protected String continuationId; protected List parameters; - protected VariableResolver resourceResolver; + protected VariableResolver functionNameResolver; + protected VariableResolver continuationResolver; protected ComponentManager manager; - protected CategoryNode resources; - protected String language; + protected Interpreter interpreter; public static List resolveList(List expressions, ComponentManager manager, List mapStack, Map objectModel) throws PatternException @@ -104,15 +107,16 @@ return result; } - public CallFunctionNode(String funName) + public CallFunctionNode(String funName, String contId) { functionName = funName; + continuationId = contId; } - public void setResources(CategoryNode resources) + public void setInterpreter(Interpreter interp) throws Exception { - this.resources = resources; + this.interpreter = interp; } /** @@ -125,8 +129,6 @@ public void configure(Configuration config) throws ConfigurationException { - language = config.getAttribute("language", null); - parameters = new ArrayList(); Configuration[] params = config.getChildren("parameter"); @@ -138,10 +140,17 @@ } try { - if (VariableResolverFactory.needsResolve(functionName)) { - // Will always be resolved at invoke time - this.resourceResolver = VariableResolverFactory.getResolver(functionName, this.manager); - } + // Check to see if we need to resolve the function name or the + // continuation id at runtime + if (functionName != null + && VariableResolverFactory.needsResolve(functionName)) + functionNameResolver + = VariableResolverFactory.getResolver(functionName, manager); + + if (continuationId != null + && VariableResolverFactory.needsResolve(continuationId)) + continuationResolver + = VariableResolverFactory.getResolver(continuationId, manager); } catch (PatternException ex) { throw new ConfigurationException(ex.toString()); @@ -150,16 +159,7 @@ public void compose(ComponentManager manager) { - this.manager = manager; - } - - public void initialize() - throws Exception - { - InterpreterSelector selector - = (InterpreterSelector)manager.lookup(Interpreter.ROLE); - if (language == null) - language = selector.getDefaultLanguage(); + manager = manager; } public boolean invoke(Environment env, InvokeContext context) @@ -167,34 +167,46 @@ { List params = null; + env.setComponentManager(manager); + // Resolve parameters - if (this.parameters != null) - params = resolveList(this.parameters, this.manager, context.getMapStack(), env.getObjectModel()); + if (parameters != null) + params = resolveList(parameters, manager, context.getMapStack(), + env.getObjectModel()); - String name = functionName; - if (resourceResolver != null) { + String continuation; + if (continuationResolver != null) { // Need to resolve the function name at runtime - name = resourceResolver.resolve(context.getMapStack(), env.getObjectModel()); + continuation = continuationResolver.resolve(context.getMapStack(), + env.getObjectModel()); } + else + continuation = continuationId; - 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); + // If the continuation id is not null, it takes precedence over + // the function call, so we invoke it here. + if (continuation != null) { + interpreter.handleContinuation(continuation, params, env); + return true; + } - // Obtain the redirector - Redirector redirector = PipelinesNode.getRedirector(env); + // We don't have a continuation id passed in <map:call>, so invoke + // the specified function - env.setComponentManager(this.manager); - try { - interpreter.callFunction(name, params, env /*, redirector*/); + String name; + if (functionNameResolver != null) { + // Need to resolve the function name at runtime + name = functionNameResolver.resolve(context.getMapStack(), + env.getObjectModel()); } - finally { - selector.release((Component)interpreter); + else + name = functionName; + + if (name != null) { + interpreter.callFunction(name, params, env); + return true; } - return true; + + return false; } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]