sylvain 2004/01/18 14:27:15
Modified: src/java/org/apache/cocoon/components/treeprocessor
TreeProcessor.java
src/java/org/apache/cocoon/components/treeprocessor/sitemap
PipelinesNode.java
Log:
Internal redirects "cocoon:" are now processed immediately (previously,
redirecting was only setting a flag handled at the end of the tree processing)
Revision Changes Path
1.17 +51 -22
cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
Index: TreeProcessor.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- TreeProcessor.java 15 Nov 2003 04:21:30 -0000 1.16
+++ TreeProcessor.java 18 Jan 2004 22:27:14 -0000 1.17
@@ -50,6 +50,7 @@
*/
package org.apache.cocoon.components.treeprocessor;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.HashMap;
@@ -73,6 +74,7 @@
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.Processor;
import org.apache.cocoon.components.ChainedConfiguration;
import org.apache.cocoon.components.CocoonComponentManager;
@@ -81,7 +83,9 @@
import org.apache.cocoon.components.pipeline.ProcessingPipeline;
import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.components.source.impl.DelayedRefreshSourceWrapper;
+import org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode;
import org.apache.cocoon.environment.Environment;
+import org.apache.cocoon.environment.ForwardRedirector;
import org.apache.cocoon.environment.wrapper.EnvironmentWrapper;
import org.apache.cocoon.environment.wrapper.MutableEnvironmentFacade;
import org.apache.excalibur.source.Source;
@@ -104,7 +108,9 @@
Contextualizable,
Disposable {
- public static final String COCOON_REDIRECT_ATTR = "cocoon: redirect url";
+ public static final String REDIRECTOR_ATTR = "sitemap:redirector";
+
+ private static final String OBJECT_SOURCE_RESOLVER =
"sitemap:sourceresolver";
private static final String XCONF_URL =
"resource://org/apache/cocoon/components/treeprocessor/treeprocessor-builtins.xml";
@@ -350,33 +356,32 @@
// and now process
CocoonComponentManager.enterEnvironment(environment,
this.sitemapComponentManager, this);
+
+ Map objectModel = environment.getObjectModel();
+
+ Object oldResolver = objectModel.get(OBJECT_SOURCE_RESOLVER);
+ Object oldRedirector = environment.getAttribute(REDIRECTOR_ATTR);
+
+ // Build a redirector
+ TreeProcessorRedirector redirector = new
TreeProcessorRedirector(environment, context);
+ setupLogger(redirector);
+
+ objectModel.put(OBJECT_SOURCE_RESOLVER, environment);
+ environment.setAttribute(REDIRECTOR_ATTR, redirector);
try {
boolean success = this.rootNode.invoke(environment, context);
- if (success) {
- // Do we have a cocoon: redirect ?
- String cocoonRedirect =
(String)environment.getAttribute(COCOON_REDIRECT_ATTR);
- if (cocoonRedirect != null) {
- // Remove the redirect indication
- environment.removeAttribute(COCOON_REDIRECT_ATTR);
- // and handle the redirect
- return handleCocoonRedirect(cocoonRedirect, environment,
context);
- } else {
- // "normal" success
- return true;
- }
-
- } else {
- return false;
- }
+ return success;
} finally {
CocoonComponentManager.leaveEnvironment();
+ // Restore old redirector and resolver
+ environment.setAttribute(REDIRECTOR_ATTR, oldRedirector);
+ objectModel.put(PipelinesNode.OBJECT_SOURCE_RESOLVER,
oldResolver);
}
}
-
- private boolean handleCocoonRedirect(String uri, Environment
environment, InvokeContext context) throws Exception
- {
+
+ private boolean handleCocoonRedirect(String uri, Environment
environment, InvokeContext context) throws Exception {
// Build an environment wrapper
// If the current env is a facade, change the delegate and continue
processing the facade, since
@@ -407,7 +412,8 @@
}
// Process the redirect
- context.reset();
+// No more reset since with TreeProcessorRedirector, we need to pop values
from the redirect location
+// context.reset();
return processor.process(newEnv, context);
}
@@ -556,6 +562,29 @@
((Disposable)disposableNodes.get(i)).dispose();
}
this.disposableNodes = null;
+ }
+ }
+
+ private class TreeProcessorRedirector extends ForwardRedirector {
+
+ private InvokeContext context;
+ public TreeProcessorRedirector(Environment env, InvokeContext
context) {
+ super(env);
+ this.context = context;
+ }
+
+ protected void cocoonRedirect(String uri) throws IOException,
ProcessingException {
+ try {
+ TreeProcessor.this.handleCocoonRedirect(uri, this.env,
this.context);
+ } catch(IOException ioe) {
+ throw ioe;
+ } catch(ProcessingException pe) {
+ throw pe;
+ } catch(RuntimeException re) {
+ throw re;
+ } catch(Exception ex) {
+ throw new ProcessingException(ex);
+ }
}
}
1.7 +3 -20
cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java
Index: PipelinesNode.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- PipelinesNode.java 24 Oct 2003 13:36:40 -0000 1.6
+++ PipelinesNode.java 18 Jan 2004 22:27:15 -0000 1.7
@@ -59,6 +59,7 @@
import org.apache.cocoon.components.treeprocessor.InvokeContext;
import org.apache.cocoon.components.treeprocessor.ProcessingNode;
import org.apache.cocoon.components.treeprocessor.SimpleParentProcessingNode;
+import org.apache.cocoon.components.treeprocessor.TreeProcessor;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.ForwardRedirector;
import org.apache.cocoon.environment.Redirector;
@@ -76,8 +77,6 @@
public final class PipelinesNode extends SimpleParentProcessingNode
implements Composable, Disposable {
- private static final String REDIRECTOR_ATTR = "sitemap:redirector";
-
private ComponentManager manager;
private ErrorHandlerHelper errorHandlerHelper = new ErrorHandlerHelper();
@@ -116,7 +115,7 @@
}
public static Redirector getRedirector(Environment env) {
- return (Redirector)env.getAttribute(REDIRECTOR_ATTR);
+ return (Redirector)env.getAttribute(TreeProcessor.REDIRECTOR_ATTR);
}
/**
@@ -133,18 +132,6 @@
// Recompose context (and pipelines) to the local component manager
context.recompose(this.manager);
- // Build a redirector
- ForwardRedirector redirector = new ForwardRedirector(env);
- setupLogger(redirector);
-
- Map objectModel = env.getObjectModel();
-
- Object oldResolver = objectModel.get(OBJECT_SOURCE_RESOLVER);
- Object oldRedirector = env.getAttribute(REDIRECTOR_ATTR);
-
- objectModel.put(OBJECT_SOURCE_RESOLVER, env);
- env.setAttribute(REDIRECTOR_ATTR, redirector);
-
try {
// FIXME : is there any useful information that can be passed as
top-level parameters,
// such as the URI of the mount point ?
@@ -158,10 +145,6 @@
// No handler : propagate
throw ex;
}
- } finally {
- // Restore old redirector and resolver
- env.setAttribute(REDIRECTOR_ATTR, oldRedirector);
- objectModel.put(OBJECT_SOURCE_RESOLVER, oldResolver);
}
}