1 16 package org.apache.cocoon.components.treeprocessor.sitemap; 17 18 import java.util.HashMap ; 19 import java.util.Map ; 20 21 import org.apache.avalon.framework.activity.Disposable; 22 import org.apache.avalon.framework.component.ComponentException; 23 import org.apache.avalon.framework.component.ComponentManager; 24 import org.apache.avalon.framework.component.ComponentSelector; 25 import org.apache.avalon.framework.component.Composable; 26 import org.apache.avalon.framework.parameters.Parameters; 27 import org.apache.cocoon.acting.Action; 28 import org.apache.cocoon.components.treeprocessor.InvokeContext; 29 import org.apache.cocoon.components.treeprocessor.ParameterizableProcessingNode; 30 import org.apache.cocoon.components.treeprocessor.SimpleSelectorProcessingNode; 31 import org.apache.cocoon.components.treeprocessor.variables.VariableResolver; 32 import org.apache.cocoon.environment.Environment; 33 import org.apache.cocoon.environment.Redirector; 34 import org.apache.cocoon.environment.SourceResolver; 35 import org.apache.cocoon.sitemap.PatternException; 36 37 43 44 public class ActTypeNode extends SimpleSelectorProcessingNode 45 implements ParameterizableProcessingNode, Disposable, Composable { 46 47 48 private Map parameters; 49 50 51 protected VariableResolver source; 52 53 54 protected String name; 55 56 57 protected Action threadSafeAction; 58 59 protected ComponentManager manager; 60 61 protected boolean inActionSet; 62 63 public ActTypeNode(String type, VariableResolver source, String name, 64 boolean inActionSet) throws PatternException { 65 super(type); 66 this.source = source; 67 this.name = name; 68 this.inActionSet = inActionSet; 69 } 70 71 public void setParameters(Map parameterMap) { 72 this.parameters = parameterMap; 73 } 74 75 public void compose(ComponentManager manager) throws ComponentException { 76 this.manager = manager; 77 setSelector((ComponentSelector)manager.lookup(Action.ROLE + "Selector")); 78 79 this.threadSafeAction = (Action)this.getThreadSafeComponent(); 81 } 82 83 public final boolean invoke(Environment env, InvokeContext context) 84 throws Exception { 85 86 super.invoke(env, context); 88 89 Map objectModel = env.getObjectModel(); 91 Redirector redirector = context.getRedirector(); 92 SourceResolver resolver = getSourceResolver(objectModel); 93 String resolvedSource = source.resolve(context, objectModel); 94 Parameters resolvedParams = 95 VariableResolver.buildParameters(this.parameters, 96 context, objectModel); 97 98 Map actionResult; 99 100 if (inActionSet) { 102 Parameters callerParams = 103 (Parameters)env.getAttribute(ActionSetNode.CALLER_PARAMETERS); 104 if (resolvedParams == Parameters.EMPTY_PARAMETERS) { 105 resolvedParams = callerParams; 107 } else if (callerParams != Parameters.EMPTY_PARAMETERS) { 108 Parameters newParams = new Parameters(); 110 newParams.merge(resolvedParams); 112 newParams.merge(callerParams); 113 resolvedParams = newParams; 114 } 115 } 116 117 if (this.threadSafeAction != null) { 119 actionResult = this.threadSafeAction.act(redirector, resolver, 120 objectModel, resolvedSource, resolvedParams); 121 } else { 122 Action action = (Action)this.selector.select(this.componentName); 123 try { 124 actionResult = action.act(redirector, resolver, 125 objectModel, resolvedSource, resolvedParams); 126 } finally { 127 this.selector.release(action); 128 } 129 } 130 131 if (redirector.hasRedirected()) { 132 return true; 133 } 134 135 if (actionResult != null) { 136 if (this.children != null) { 138 boolean result = this.invokeNodes(this.children, env, context, name, actionResult); 139 140 if (inActionSet) { 141 Map childMap = (Map )env.getAttribute(ActionSetNode.ACTION_RESULTS); 143 if (childMap != null) { 144 Map newResults = new HashMap (childMap); 145 newResults.putAll(actionResult); 146 env.setAttribute(ActionSetNode.ACTION_RESULTS, newResults); 147 } else { 148 env.setAttribute(ActionSetNode.ACTION_RESULTS, actionResult); 150 } 151 } 152 return result; 153 } } return false; } 160 161 public void dispose() { 162 if (this.threadSafeAction != null) { 163 this.selector.release(this.threadSafeAction); 164 } 165 this.manager.release(this.selector); 166 } 167 } 168 | Popular Tags |