tcurdt 2002/10/11 22:11:40
Modified: . changes.xml
src/java/org/apache/cocoon/components/treeprocessor
AbstractParentProcessingNode.java
InvokeContext.java
src/java/org/apache/cocoon/components/treeprocessor/sitemap
ActNodeBuilder.java ActSetNode.java
ActTypeNode.java ActionSetNode.java
AggregateNode.java CallFunctionNode.java
CallNode.java ContinueNode.java GenerateNode.java
MatchNode.java MatchNodeBuilder.java MountNode.java
PreparableMatchNode.java ReadNode.java
RedirectToURINode.java SelectNode.java
SerializeNode.java SwitchSelectNode.java
TransformNode.java
src/java/org/apache/cocoon/components/treeprocessor/variables
NOPVariableResolver.java
PreparedVariableResolver.java VariableResolver.java
Log:
fixed a bug for the {/1} syntax, implemented the {#name:variable}
syntax for sitemap variable anchors.
Revision Changes Path
1.264 +8 -1 xml-cocoon2/changes.xml
Index: changes.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/changes.xml,v
retrieving revision 1.263
retrieving revision 1.264
diff -u -r1.263 -r1.264
--- changes.xml 29 Sep 2002 20:24:22 -0000 1.263
+++ changes.xml 12 Oct 2002 05:11:39 -0000 1.264
@@ -40,6 +40,13 @@
</devs>
<release version="@version@" date="@date@">
+ <action dev="TC" type="add">
+ Added support for sitemap variable anchors {#name:variable}.
+ This introduces a new "name" attribute for matchers and actions
+ </action>
+ <action dev="TC" type="add">
+ added support for direct access of root level sitemap variables {/1}
+ </action>
<action dev="SW" type="add" fixes-bug="12780" due-to="Michael Melhem"
due-to-email="[EMAIL PROTECTED]">
New pipeline hint attribute to allow pipeline components (i.e. map:generate,
map:transform
and map:serialize) to hold some pipeline-specific parameters. The first usage of
this feature
1.5 +4 -2
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/AbstractParentProcessingNode.java
Index: AbstractParentProcessingNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/AbstractParentProcessingNode.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AbstractParentProcessingNode.java 6 Jun 2002 14:28:14 -0000 1.4
+++ AbstractParentProcessingNode.java 12 Oct 2002 05:11:39 -0000 1.5
@@ -69,14 +69,16 @@
* @param currentMap the <code>Map<code> of parameters produced by this node,
* which is added to <code>listOfMap</code>.
*/
+
protected final boolean invokeNodes(
ProcessingNode[] nodes,
Environment env,
InvokeContext context,
+ String currentName,
Map currentMap)
throws Exception {
- context.pushMap(currentMap);
+ context.pushMap(currentName,currentMap);
try {
for (int i = 0; i < nodes.length; i++) {
1.14 +43 -12
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/InvokeContext.java
Index: InvokeContext.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/InvokeContext.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- InvokeContext.java 9 Aug 2002 07:47:16 -0000 1.13
+++ InvokeContext.java 12 Oct 2002 05:11:39 -0000 1.14
@@ -78,12 +78,15 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Torsten Curdt</a>
* @version CVS $Id$
*/
public class InvokeContext implements Recomposable, Disposable, LogEnabled {
private List mapStack = new ArrayList();
+ private HashMap nameToMap = new HashMap();
+ private HashMap mapToName = new HashMap();
private boolean isInternalRequest;
@@ -188,7 +191,7 @@
this.processingPipeline.recompose( this.pipelinesManager );
this.processingPipeline.setup(
VariableResolver.buildParameters(this.processingPipelineParameters,
- this.getMapStack(),
this.processingPipelineObjectModel)
+ this,
this.processingPipelineObjectModel)
);
if (this.isInternalRequest) {
CocoonComponentManager.addComponentForAutomaticRelease(this.pipelineSelector,
@@ -221,35 +224,59 @@
}
/**
+ * Get the result Map by anchor name
+ */
+ public final Map getMapByAnchor(String anchor) {
+ return((Map) this.nameToMap.get(anchor));
+ }
+
+ /**
* Push a Map on top of the current Map stack.
*/
- public final void pushMap(Map map) {
+ public final void pushMap(String anchorName, Map map) {
mapStack.add(map);
if (this.logger.isDebugEnabled()) {
- dumpParameters(getMapStack());
+ dumpParameters();
+ }
+
+ if (anchorName != null) {
+ if (!nameToMap.containsKey(anchorName)) {
+ nameToMap.put(anchorName,map);
+ mapToName.put(map,anchorName);
+ }
+ else {
+ if (this.logger.isErrorEnabled()) {
+ this.logger.error("name [" + anchorName + "] clashes");
+ }
+ }
}
}
/**
* Dumps all sitemap parameters to log
*/
- protected void dumpParameters(List list)
+ protected void dumpParameters()
{
- if (!list.isEmpty()) {
+ if (!mapStack.isEmpty()) {
StringBuffer sb = new StringBuffer();
sb.append("\nCurrent Sitemap Parameters:\n");
String path = "";
- for (int i = list.size() - 1; i >= 0; i--) {
- Map map = (Map) list.get(i);
- Iterator keys = map.keySet().iterator();
+ for (int i = mapStack.size() - 1; i >= 0; i--) {
+ Map map = (Map) mapStack.get(i);
+ sb.append("LEVEL ").append(i+1);
+ if (mapToName.containsKey(map)) {
+ sb.append(" is named
'").append(String.valueOf(mapToName.get(map))).append("'");
+ }
+ sb.append("\n");
+ Iterator keys = map.keySet().iterator();
while (keys.hasNext()) {
Object key = keys.next();
- sb.append("PARAM: '").append(path).append(key);
- sb.append("' VALUE: '").append(map.get(key)).append("'\n");
+ sb.append("PARAM: '").append(path).append(key).append("' ");
+ sb.append("VALUE: '").append(map.get(key)).append("'\n");
}
path = "../" + path;
@@ -257,6 +284,7 @@
this.logger.debug(sb.toString());
}
+
}
@@ -264,7 +292,10 @@
* Pop the topmost element of the current Map stack.
*/
public final void popMap() {
- mapStack.remove(mapStack.size() - 1);
+ Object map = mapStack.remove(mapStack.size() - 1);
+ Object name = mapToName.get(map);
+ mapToName.remove(map);
+ nameToMap.remove(name);
}
/**
1.3 +4 -2
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActNodeBuilder.java
Index: ActNodeBuilder.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActNodeBuilder.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ActNodeBuilder.java 24 Jun 2002 20:32:19 -0000 1.2
+++ ActNodeBuilder.java 12 Oct 2002 05:11:39 -0000 1.3
@@ -83,12 +83,14 @@
this.actSetName = config.getAttribute("set", null);
if (actSetName == null) {
+ String name = config.getAttribute("name", null);
String source = config.getAttribute("src", null);
String type = this.treeBuilder.getTypeForStatement(config, Action.ROLE
+ "Selector");
ActTypeNode actTypeNode = new ActTypeNode(
type,
- VariableResolverFactory.getResolver(source, this.manager)
+ VariableResolverFactory.getResolver(source, this.manager),
+ name
);
this.treeBuilder.setupNode(actTypeNode, config);
1.6 +3 -3
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActSetNode.java
Index: ActSetNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActSetNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ActSetNode.java 9 Aug 2002 07:47:17 -0000 1.5
+++ ActSetNode.java 12 Oct 2002 05:11:39 -0000 1.6
@@ -104,7 +104,7 @@
Parameters resolvedParams = VariableResolver.buildParameters(
this.parameters,
- context.getMapStack(),
+ context,
env.getObjectModel()
);
@@ -120,7 +120,7 @@
return true;
} else {
- return this.invokeNodes(this.children, env, context, result);
+ return this.invokeNodes(this.children, env, context, null, result);
}
}
}
1.6 +10 -7
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActTypeNode.java
Index: ActTypeNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActTypeNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ActTypeNode.java 9 Aug 2002 07:47:17 -0000 1.5
+++ ActTypeNode.java 12 Oct 2002 05:11:39 -0000 1.6
@@ -87,14 +87,18 @@
/** The 'src' attribute */
protected VariableResolver source;
+ /** The 'name' for the variable anchor */
+ protected String name;
+
/** Pre-selected action, if it's ThreadSafe */
protected Action threadSafeAction;
protected ComponentManager manager;
- public ActTypeNode(String name, VariableResolver source) throws
PatternException {
- super(name);
+ public ActTypeNode(String type, VariableResolver source, String name) throws
PatternException {
+ super(type);
this.source = source;
+ this.name = name;
}
public void setParameters(Map parameterMap) {
@@ -119,9 +123,8 @@
Map objectModel = env.getObjectModel();
Redirector redirector = PipelinesNode.getRedirector(env);
SourceResolver resolver = getSourceResolver(objectModel);
- List mapStack = context.getMapStack();
- String resolvedSource = source.resolve(mapStack, objectModel);
- Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, mapStack, objectModel);
+ String resolvedSource = source.resolve(context, objectModel);
+ Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, context, objectModel);
Map actionResult;
@@ -152,7 +155,7 @@
} else {
// Action succeeded : process children if there are some, with the
action result
if (this.children != null) {
- return this.invokeNodes(this.children, env, context, actionResult);
+ return this.invokeNodes(this.children, env, context, name,
actionResult);
} else {
// Return false to continue sitemap invocation
1.7 +3 -4
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActionSetNode.java
Index: ActionSetNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActionSetNode.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ActionSetNode.java 11 Sep 2002 10:08:35 -0000 1.6
+++ ActionSetNode.java 12 Oct 2002 05:11:39 -0000 1.7
@@ -139,7 +139,6 @@
Map objectModel = env.getObjectModel();
Redirector redirector = PipelinesNode.getRedirector(env);
SourceResolver resolver = getSourceResolver(objectModel);
- List mapStack = context.getMapStack();
String cocoonAction = env.getAction();
@@ -154,10 +153,10 @@
Action action;
String actionName = actionNames[i];
- String source = sources[i].resolve(mapStack, objectModel);
+ String source = sources[i].resolve(context, objectModel);
if (actionName == null || actionName.equals(cocoonAction)) {
- Parameters actionParams =
VariableResolver.buildParameters(parameters[i], mapStack, objectModel);
+ Parameters actionParams =
VariableResolver.buildParameters(parameters[i], context, objectModel);
if (actionParams == Parameters.EMPTY_PARAMETERS) {
actionParams = params;
} else {
1.8 +9 -10
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/AggregateNode.java
Index: AggregateNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/AggregateNode.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- AggregateNode.java 9 Sep 2002 12:00:42 -0000 1.7
+++ AggregateNode.java 12 Oct 2002 05:11:39 -0000 1.8
@@ -120,7 +120,6 @@
boolean infoEnabled = getLogger().isInfoEnabled();
- List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
// Setup aggregator
@@ -130,9 +129,9 @@
ContentAggregator aggregator =
(ContentAggregator)processingPipeline.getGenerator();
aggregator.setRootElement(
- this.element.resolve(mapStack, objectModel),
- this.nsURI.resolve(mapStack, objectModel),
- this.nsPrefix.resolve(mapStack, objectModel)
+ this.element.resolve(context, objectModel),
+ this.nsURI.resolve(context, objectModel),
+ this.nsPrefix.resolve(context, objectModel)
);
// Get actual parts, potentially filtered by the view
@@ -158,11 +157,11 @@
Part part = actualParts[i];
if (part != null) {
aggregator.addPart(
- part.source.resolve(mapStack, objectModel),
- part.element.resolve(mapStack, objectModel),
- part.nsURI.resolve(mapStack, objectModel),
- part.stripRoot.resolve(mapStack, objectModel),
- part.nsPrefix.resolve(mapStack, objectModel)
+ part.source.resolve(context, objectModel),
+ part.element.resolve(context, objectModel),
+ part.nsURI.resolve(context, objectModel),
+ part.stripRoot.resolve(context, objectModel),
+ part.nsPrefix.resolve(context, objectModel)
);
}
}
1.7 +6 -6
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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- CallFunctionNode.java 1 Oct 2002 09:08:04 -0000 1.6
+++ CallFunctionNode.java 12 Oct 2002 05:11:39 -0000 1.7
@@ -80,8 +80,8 @@
protected ComponentManager manager;
protected Interpreter interpreter;
- public static List resolveList(List expressions, ComponentManager manager, List
mapStack, Map objectModel)
- throws PatternException
+ public static List resolveList(List expressions, ComponentManager manager,
InvokeContext context, Map objectModel)
+ throws PatternException
{
int size;
if (expressions == null || (size = expressions.size()) == 0)
@@ -91,7 +91,7 @@
for (int i = 0; i < size; i++) {
Interpreter.Argument arg = (Interpreter.Argument)expressions.get(i);
- String value = VariableResolverFactory.getResolver(arg.value,
manager).resolve(mapStack, objectModel);
+ String value = VariableResolverFactory.getResolver(arg.value,
manager).resolve(context, objectModel);
result.add (new Interpreter.Argument(arg.name, value));
}
@@ -162,13 +162,13 @@
// Resolve parameters
if (parameters != null)
- params = resolveList(parameters, manager, context.getMapStack(),
+ params = resolveList(parameters, manager, context,
env.getObjectModel());
String continuation;
if (continuationResolver != null) {
// Need to resolve the function name at runtime
- continuation = continuationResolver.resolve(context.getMapStack(),
+ continuation = continuationResolver.resolve(context,
env.getObjectModel());
}
else
@@ -187,7 +187,7 @@
String name;
if (functionNameResolver != null) {
// Need to resolve the function name at runtime
- name = functionNameResolver.resolve(context.getMapStack(),
+ name = functionNameResolver.resolve(context,
env.getObjectModel());
}
else
1.6 +5 -6
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/CallNode.java
Index: CallNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/CallNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- CallNode.java 11 Sep 2002 10:08:35 -0000 1.5
+++ CallNode.java 12 Oct 2002 05:11:39 -0000 1.6
@@ -120,15 +120,14 @@
public final boolean invoke(Environment env, InvokeContext context)
throws Exception {
- List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
// Resolve parameters, but push them only once the resource name has been
// resolved, otherwise it adds an unwanted nesting level
- Map params = VariableResolver.buildMap(this.parameters, mapStack,
objectModel);
+ Map params = VariableResolver.buildMap(this.parameters, context,
objectModel);
if (this.resourceNode != null) {
// Static resource name
- context.pushMap(params);
+ context.pushMap(null,params);
try {
return this.resourceNode.invoke(env, context);
@@ -138,13 +137,13 @@
} else {
// Resolved resource name
- String name = this.resourceResolver.resolve(mapStack, objectModel);
+ String name = this.resourceResolver.resolve(context, objectModel);
if (getLogger().isDebugEnabled()) {
getLogger().debug("Calling resource " + name);
}
// and only now push the parameters
- context.pushMap(params);
+ context.pushMap(null,params);
try {
return this.resources.invokeByName(name, env, context);
1.5 +2 -2
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ContinueNode.java
Index: ContinueNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ContinueNode.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ContinueNode.java 8 Sep 2002 00:29:20 -0000 1.4
+++ ContinueNode.java 12 Oct 2002 05:11:39 -0000 1.5
@@ -125,12 +125,12 @@
// Resolve parameters
if (this.parameters != null)
params = CallFunctionNode.resolveList(this.parameters, this.manager,
- context.getMapStack(),
env.getObjectModel());
+ context, env.getObjectModel());
String contId = continuationId;
if (continuationIdResolver != null) {
- contId = continuationIdResolver.resolve(context.getMapStack(),
env.getObjectModel());
+ contId = continuationIdResolver.resolve(context, env.getObjectModel());
}
InterpreterSelector selector
1.9 +4 -5
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/GenerateNode.java
Index: GenerateNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/GenerateNode.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- GenerateNode.java 13 Sep 2002 17:47:54 -0000 1.8
+++ GenerateNode.java 12 Oct 2002 05:11:39 -0000 1.9
@@ -95,16 +95,15 @@
public final boolean invoke(Environment env, InvokeContext context)
throws Exception {
- List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
context.getProcessingPipeline().setGenerator(
this.generatorName,
- source.resolve(mapStack, objectModel),
- VariableResolver.buildParameters(this.parameters, mapStack,
objectModel),
+ source.resolve(context, objectModel),
+ VariableResolver.buildParameters(this.parameters, context, objectModel),
this.pipelineHints == null
? Parameters.EMPTY_PARAMETERS
- : VariableResolver.buildParameters(this.pipelineHints, mapStack,
objectModel)
+ : VariableResolver.buildParameters(this.pipelineHints, context,
objectModel)
);
1.6 +10 -6
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MatchNode.java
Index: MatchNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MatchNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MatchNode.java 9 Aug 2002 07:47:17 -0000 1.5
+++ MatchNode.java 12 Oct 2002 05:11:39 -0000 1.6
@@ -79,6 +79,9 @@
/** The 'pattern' attribute */
private VariableResolver pattern;
+ /** The 'name' for the variable anchor */
+ private String name;
+
/** The matcher, if it's ThreadSafe */
private Matcher threadSafeMatcher;
@@ -86,9 +89,10 @@
private ComponentManager manager;
- public MatchNode(String name, VariableResolver pattern) throws PatternException
{
- super(name);
+ public MatchNode(String type, VariableResolver pattern, String name) throws
PatternException {
+ super(type);
this.pattern = pattern;
+ this.name = name;
}
public void setParameters(Map parameterMap) {
@@ -112,8 +116,8 @@
List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
- String resolvedPattern = pattern.resolve(mapStack, objectModel);
- Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, mapStack, objectModel);
+ String resolvedPattern = pattern.resolve(context, objectModel);
+ Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, context, objectModel);
Map result = null;
@@ -139,7 +143,7 @@
}
// Invoke children with the matcher results
- return this.invokeNodes(children, env, context, result);
+ return this.invokeNodes(children, env, context, name, result);
} else {
// Matcher failed
1.7 +4 -3
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MatchNodeBuilder.java
Index: MatchNodeBuilder.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MatchNodeBuilder.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- MatchNodeBuilder.java 25 Jun 2002 07:55:13 -0000 1.6
+++ MatchNodeBuilder.java 12 Oct 2002 05:11:39 -0000 1.7
@@ -79,6 +79,7 @@
public ProcessingNode buildNode(Configuration config) throws Exception {
String pattern = config.getAttribute("pattern", null);
+ String name = config.getAttribute("name", null);
String type = this.treeBuilder.getTypeForStatement(config, SELECTOR_ROLE);
@@ -105,9 +106,9 @@
VariableResolver patternResolver =
VariableResolverFactory.getResolver(pattern, this.manager);
if (preparable) {
- node = new PreparableMatchNode(type,
VariableResolverFactory.unescape(pattern));
+ node = new PreparableMatchNode(type,
VariableResolverFactory.unescape(pattern),name);
} else {
- node = new MatchNode(type, patternResolver);
+ node = new MatchNode(type, patternResolver,name);
}
this.treeBuilder.setupNode(node, config);
1.8 +3 -3
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java
Index: MountNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- MountNode.java 24 Jun 2002 20:32:19 -0000 1.7
+++ MountNode.java 12 Oct 2002 05:11:39 -0000 1.8
@@ -104,13 +104,13 @@
List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
- String resolvedSource = this.source.resolve(mapStack, objectModel);
+ String resolvedSource = this.source.resolve(context, objectModel);
TreeProcessor processor = (TreeProcessor)processors.get(resolvedSource);
if (processor == null) {
processor = getProcessor(env, resolvedSource);
}
- String resolvedPrefix = this.prefix.resolve(mapStack, objectModel);
+ String resolvedPrefix = this.prefix.resolve(context, objectModel);
String oldPrefix = env.getURIPrefix();
String oldURI = env.getURI();
1.7 +9 -5
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PreparableMatchNode.java
Index: PreparableMatchNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PreparableMatchNode.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- PreparableMatchNode.java 11 Sep 2002 10:08:35 -0000 1.6
+++ PreparableMatchNode.java 12 Oct 2002 05:11:39 -0000 1.7
@@ -80,6 +80,9 @@
/** The 'pattern' attribute */
private String pattern;
+ /** The 'name' for the variable anchor */
+ private String name;
+
private Object preparedPattern;
private Map parameters;
@@ -89,9 +92,10 @@
protected ComponentManager manager;
- public PreparableMatchNode(String name, String pattern) throws PatternException
{
- super(name);
+ public PreparableMatchNode(String type, String pattern, String name) throws
PatternException {
+ super(type);
this.pattern = pattern;
+ this.name = name;
}
public void setParameters(Map parameterMap) {
@@ -132,7 +136,7 @@
Map objectModel = env.getObjectModel();
Parameters resolvedParams = VariableResolver.buildParameters(
- this.parameters, context.getMapStack(), objectModel
+ this.parameters, context, objectModel
);
Map result = null;
@@ -159,7 +163,7 @@
}
// Invoke children with the matcher results
- return this.invokeNodes(children, env, context, result);
+ return this.invokeNodes(children, env, context, name, result);
} else {
// Matcher failed
1.4 +3 -4
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ReadNode.java
Index: ReadNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ReadNode.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ReadNode.java 24 Jun 2002 20:32:19 -0000 1.3
+++ ReadNode.java 12 Oct 2002 05:11:39 -0000 1.4
@@ -100,15 +100,14 @@
public final boolean invoke(Environment env, InvokeContext context)
throws Exception {
- List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
ProcessingPipeline pipeline = context.getProcessingPipeline();
pipeline.setReader(
this.readerName,
- source.resolve(mapStack, objectModel),
- VariableResolver.buildParameters(this.parameters, mapStack,
objectModel),
+ source.resolve(context, objectModel),
+ VariableResolver.buildParameters(this.parameters, context, objectModel),
this.mimeType
);
1.6 +2 -2
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/RedirectToURINode.java
Index: RedirectToURINode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/RedirectToURINode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- RedirectToURINode.java 13 Aug 2002 14:05:18 -0000 1.5
+++ RedirectToURINode.java 12 Oct 2002 05:11:39 -0000 1.6
@@ -83,7 +83,7 @@
public final boolean invoke(Environment env, InvokeContext context)
throws Exception {
- String resolvedURI = uri.resolve(context.getMapStack(),
env.getObjectModel());
+ String resolvedURI = uri.resolve(context, env.getObjectModel());
if (getLogger().isInfoEnabled()) {
getLogger().info("Redirecting to '" + resolvedURI + "' at " +
this.getLocation());
1.6 +4 -5
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SelectNode.java
Index: SelectNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SelectNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SelectNode.java 9 Aug 2002 07:47:17 -0000 1.5
+++ SelectNode.java 12 Oct 2002 05:11:39 -0000 1.6
@@ -127,15 +127,14 @@
// Prepare data needed by the action
Map objectModel = env.getObjectModel();
- List mapStack = context.getMapStack();
- Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, mapStack, objectModel);
+ Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, context, objectModel);
// If selector is ThreadSafe, avoid select() and try/catch block (faster !)
if (this.threadSafeSelector != null) {
for (int i = 0; i < this.whenTests.length; i++) {
if (this.threadSafeSelector.select(
- whenTests[i].resolve(mapStack, objectModel),
+ whenTests[i].resolve(context, objectModel),
objectModel,
resolvedParams)) {
return invokeNodes(this.whenNodes[i], env, context);
@@ -154,7 +153,7 @@
for (int i = 0; i < this.whenTests.length; i++) {
if (selector.select(
- whenTests[i].resolve(mapStack, objectModel),
+ whenTests[i].resolve(context, objectModel),
objectModel,
resolvedParams)) {
return invokeNodes(this.whenNodes[i], env, context);
1.8 +2 -2
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SerializeNode.java
Index: SerializeNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SerializeNode.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- SerializeNode.java 13 Sep 2002 17:47:54 -0000 1.7
+++ SerializeNode.java 12 Oct 2002 05:11:39 -0000 1.8
@@ -135,7 +135,7 @@
Parameters.EMPTY_PARAMETERS, // No parameters on serializers
this.pipelineHints == null
? Parameters.EMPTY_PARAMETERS
- : VariableResolver.buildParameters(this.pipelineHints, mapStack,
objectModel),
+ : VariableResolver.buildParameters(this.pipelineHints, context,
objectModel),
this.mimeType
);
1.5 +4 -5
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SwitchSelectNode.java
Index: SwitchSelectNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SwitchSelectNode.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SwitchSelectNode.java 9 Aug 2002 07:47:17 -0000 1.4
+++ SwitchSelectNode.java 12 Oct 2002 05:11:39 -0000 1.5
@@ -129,8 +129,7 @@
// Prepare data needed by the action
Map objectModel = env.getObjectModel();
- List mapStack = context.getMapStack();
- Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, mapStack, objectModel);
+ Parameters resolvedParams =
VariableResolver.buildParameters(this.parameters, context, objectModel);
// If selector is ThreadSafe, avoid select() and try/catch block (faster !)
if (this.threadSafeSelector != null) {
@@ -138,7 +137,7 @@
Object ctx = this.threadSafeSelector.getSelectorContext(objectModel,
resolvedParams);
for (int i = 0; i < this.whenTests.length; i++) {
- if (this.threadSafeSelector.select(whenTests[i].resolve(mapStack,
objectModel), ctx)) {
+ if (this.threadSafeSelector.select(whenTests[i].resolve(context,
objectModel), ctx)) {
return invokeNodes(this.whenNodes[i], env, context);
}
}
@@ -157,7 +156,7 @@
try {
for (int i = 0; i < this.whenTests.length; i++) {
- if (selector.select(whenTests[i].resolve(mapStack,
objectModel), ctx)) {
+ if (selector.select(whenTests[i].resolve(context, objectModel),
ctx)) {
return invokeNodes(this.whenNodes[i], env, context);
}
}
1.8 +4 -5
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/TransformNode.java
Index: TransformNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/TransformNode.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- TransformNode.java 13 Sep 2002 17:47:54 -0000 1.7
+++ TransformNode.java 12 Oct 2002 05:11:39 -0000 1.8
@@ -92,16 +92,15 @@
public final boolean invoke(Environment env, InvokeContext context)
throws Exception {
- List mapStack = context.getMapStack();
Map objectModel = env.getObjectModel();
context.getProcessingPipeline().addTransformer(
this.transformerName,
- source.resolve(mapStack, objectModel),
- VariableResolver.buildParameters(this.parameters, mapStack,
objectModel),
+ source.resolve(context, objectModel),
+ VariableResolver.buildParameters(this.parameters, context, objectModel),
this.pipelineHints == null
? Parameters.EMPTY_PARAMETERS
- : VariableResolver.buildParameters(this.pipelineHints, mapStack,
objectModel)
+ : VariableResolver.buildParameters(this.pipelineHints, context,
objectModel)
);
// Check view
1.3 +3 -1
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/variables/NOPVariableResolver.java
Index: NOPVariableResolver.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/variables/NOPVariableResolver.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- NOPVariableResolver.java 29 Sep 2002 20:24:22 -0000 1.2
+++ NOPVariableResolver.java 12 Oct 2002 05:11:40 -0000 1.3
@@ -50,6 +50,8 @@
*/
package org.apache.cocoon.components.treeprocessor.variables;
+import org.apache.cocoon.components.treeprocessor.InvokeContext;
+
import java.util.List;
import java.util.Map;
@@ -73,7 +75,7 @@
return this.originalExpr;
}
- public final String resolve(List mapStack, Map objectModel) {
+ public final String resolve(InvokeContext context, Map objectModel) {
return this.expression;
}
1.5 +81 -42
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java
Index: PreparedVariableResolver.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- PreparedVariableResolver.java 8 Oct 2002 17:21:59 -0000 1.4
+++ PreparedVariableResolver.java 12 Oct 2002 05:11:40 -0000 1.5
@@ -58,6 +58,7 @@
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.components.modules.input.InputModule;
+import org.apache.cocoon.components.treeprocessor.InvokeContext;
import org.apache.cocoon.sitemap.PatternException;
import java.util.ArrayList;
@@ -66,21 +67,26 @@
/**
* Prepared implementation of {@link VariableResolver} for fast evaluation.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Torsten Curdt</a>
*/
-public class PreparedVariableResolver extends VariableResolver implements
Disposable {
+final public class PreparedVariableResolver extends VariableResolver implements
Disposable {
private ComponentManager manager;
private ComponentSelector selector;
- private List items = new ArrayList();
-
+ final private List items = new ArrayList();
+ final private String originalExpr;
+
// Special constants used for levels
static final int ROOT = 0;
static final int LITERAL = -1;
static final int THREADSAFE_MODULE = -2;
static final int STATEFUL_MODULE = -3;
-
+ static final int ANCHOR = -4;
+
public PreparedVariableResolver(String expr, ComponentManager manager) throws
PatternException {
this.originalExpr = expr;
@@ -128,10 +134,17 @@
addSitemapVariable(variable);
} else {
- // Module used
String module = expr.substring(pos, colon);
String variable = expr.substring(colon + 1, end);
- addModuleVariable(module, variable);
+
+ if (module.startsWith("#")) {
+ // anchor syntax refering to a name result level
+ addAnchorVariable(module.substring(1), variable);
+ }
+ else {
+ // Module used
+ addModuleVariable(module, variable);
+ }
}
} else {
// Unprefixed name : sitemap variable
@@ -164,7 +177,13 @@
this.items.add(variable.substring(pos));
}
}
-
+
+ private void addAnchorVariable(String anchor, String variable) throws
PatternException {
+ this.items.add(new Integer(ANCHOR));
+ this.items.add(anchor);
+ this.items.add(variable);
+ }
+
private void addModuleVariable(String moduleName, String variable) throws
PatternException {
if (this.selector == null) {
try {
@@ -198,7 +217,9 @@
}
}
- public final String resolve(List mapStack, Map objectModel) throws
PatternException {
+ public final String resolve(InvokeContext context, Map objectModel) throws
PatternException {
+ List mapStack = context.getMapStack();
+
StringBuffer result = new StringBuffer();
int stackSize = mapStack.size();
@@ -236,6 +257,24 @@
}
break;
+ case ANCHOR:
+ {
+ String name = (String) this.items.get(++i);
+ Object variable = this.items.get(++i);
+ Map levelResult = context.getMapByAnchor(name);
+
+ if (levelResult == null) {
+ throw new PatternException("Error while evaluating '" +
this.originalExpr +
+ "' : no anchor '" + String.valueOf(name) + "' found in
context");
+ }
+
+ Object value = levelResult.get(variable);
+ if (value != null) {
+ result.append(value);
+ }
+ }
+ break;
+
case THREADSAFE_MODULE :
{
InputModule module = (InputModule)items.get(++i);
@@ -291,41 +330,41 @@
}
public final void dispose() {
- if (this.selector == null) {
- // No module in this expression, or already released
- return;
- }
-
- for (int i = 0; i < this.items.size(); i++) {
- int type = ((Integer)this.items.get(i)).intValue();
-
- switch(type) {
- case ROOT :
- i++; // variable
- break;
-
- case LITERAL :
- i++; // literal string
- break;
-
- case THREADSAFE_MODULE :
- i++; // module
- this.selector.release((InputModule)this.items.get(i));
- i++; // variable
- break;
-
- case STATEFUL_MODULE :
- i += 2; // module name, variable
- break;
-
- default:
- // relative sitemap variable
- i++; // variable
+ if (this.selector != null) {
+ for (int i = 0; i < this.items.size(); i++) {
+ int type = ((Integer) this.items.get(i)).intValue();
+
+ switch (type) {
+ case ROOT:
+ i++; // variable
+ break;
+
+ case LITERAL:
+ i++; // literal string
+ break;
+
+ case ANCHOR:
+ i += 2; // anchor name, variable
+ break;
+
+ case THREADSAFE_MODULE:
+ i++; // module
+ this.selector.release((InputModule) this.items.get(i));
+ i++; // variable
+ break;
+
+ case STATEFUL_MODULE:
+ i += 2; // module name, variable
+ break;
+
+ default:
+ // relative sitemap variable
+ i++; // variable
+ }
}
+ this.manager.release(this.selector);
+ this.selector = null;
+ this.manager = null;
}
-
- this.manager.release(this.selector);
- this.selector = null;
- this.manager = null;
}
}
1.3 +10 -9
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/variables/VariableResolver.java
Index: VariableResolver.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/variables/VariableResolver.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- VariableResolver.java 29 Sep 2002 20:24:22 -0000 1.2
+++ VariableResolver.java 12 Oct 2002 05:11:40 -0000 1.3
@@ -53,6 +53,7 @@
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.sitemap.PatternException;
import org.apache.cocoon.util.HashUtil;
+import org.apache.cocoon.components.treeprocessor.InvokeContext;
import java.util.Collections;
import java.util.Iterator;
@@ -68,7 +69,7 @@
*/
public abstract class VariableResolver {
-
+
public static final Map EMPTY_MAP = Collections.unmodifiableMap(new
java.util.HashMap(0));
protected String originalExpr = null;
@@ -100,7 +101,7 @@
/**
* Resolve all {...} patterns using the values given in the list of maps and
the object model.
*/
- public abstract String resolve(List mapStack, Map objectModel) throws
PatternException;
+ public abstract String resolve(InvokeContext context, Map objectModel) throws
PatternException;
/**
* Build a <code>Parameters</code> object from a Map of named
<code>VariableResolver</code>s and
@@ -108,7 +109,7 @@
*
* @return a fully resolved <code>Parameters</code>.
*/
- public static Parameters buildParameters(Map expressions, List mapStack, Map
objectModel) throws PatternException {
+ public static Parameters buildParameters(Map expressions, InvokeContext
context, Map objectModel) throws PatternException {
if (expressions == null || expressions.size() == 0) {
return Parameters.EMPTY_PARAMETERS;
}
@@ -119,8 +120,8 @@
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
result.setParameter(
- ((VariableResolver)entry.getKey()).resolve(mapStack, objectModel),
- ((VariableResolver)entry.getValue()).resolve(mapStack, objectModel)
+ ((VariableResolver)entry.getKey()).resolve(context, objectModel),
+ ((VariableResolver)entry.getValue()).resolve(context, objectModel)
);
}
@@ -133,7 +134,7 @@
*
* @return a fully resolved <code>Map</code>.
*/
- public static Map buildMap(Map expressions, List mapStack, Map objectModel)
throws PatternException {
+ public static Map buildMap(Map expressions, InvokeContext context, Map
objectModel) throws PatternException {
int size;
if (expressions == null || (size = expressions.size()) == 0) {
return EMPTY_MAP;
@@ -145,8 +146,8 @@
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
result.put(
- ((VariableResolver)entry.getKey()).resolve(mapStack, objectModel),
- ((VariableResolver)entry.getValue()).resolve(mapStack, objectModel)
+ ((VariableResolver)entry.getKey()).resolve(context, objectModel),
+ ((VariableResolver)entry.getValue()).resolve(context, objectModel)
);
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]