You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2008/08/21 12:51:10 UTC
svn commit: r687706 - in /cocoon/trunk/core:
cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/
cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/
cocoon-sitemap/cocoon-sitemap-impl/src/ma...
Author: gkossakowski
Date: Thu Aug 21 03:51:09 2008
New Revision: 687706
URL: http://svn.apache.org/viewvc?rev=687706&view=rev
Log:
Introduce support servlet: protocol in flow's sendPage function.
The previous behaviour was that if one called sendPage("some/path") it would be translated into redirection to "cocoon:/some/path" so any custom protocol was disallowed in sendPage calls.
Now default behaviour is preserved but additionally one can use servlet: protocol explicitly in sendPage calls.
In order to achieve that some extensions to ForwardRedirector and ConcreteTreeProcessor were introduced for special handling of "servlet:" protocol.
Current implementation does not really redirect in sense of Cocoon's internals but just makes a new request using ServletSource and after processing is finished it just copies the response to current environment.
As consequence of this change, also <map:redirect-to uri="servlet:/some/path"/> is supported.
This change resolves COCOON-2239 issue.
Modified:
cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/ForwardRedirector.java
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/AbstractInterpreter.java
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
Modified: cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/ForwardRedirector.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/ForwardRedirector.java?rev=687706&r1=687705&r2=687706&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/ForwardRedirector.java (original)
+++ cocoon/trunk/core/cocoon-pipeline/cocoon-pipeline-impl/src/main/java/org/apache/cocoon/environment/ForwardRedirector.java Thu Aug 21 03:51:09 2008
@@ -32,6 +32,8 @@
*/
public abstract class ForwardRedirector extends AbstractLogEnabled
implements Redirector, PermanentRedirector {
+
+ private static final String SERVLET_PROTOCOL = "servlet:";
/**
* Was there a call to <code>redirect()</code> ?
@@ -60,6 +62,8 @@
if (url.startsWith("cocoon:")) {
cocoonRedirect(url);
+ } else if (url.startsWith(SERVLET_PROTOCOL)) {
+ servletRedirect(url);
} else {
this.doRedirect(sessionMode, url, false, false);
}
@@ -74,6 +78,8 @@
if (url.startsWith("cocoon:")) {
cocoonRedirect(url);
+ } else if (url.startsWith(SERVLET_PROTOCOL)) {
+ servletRedirect(url);
} else {
this.doRedirect(sessionMode, url, true, false);
}
@@ -93,6 +99,8 @@
// FIXME : how to handle global redirect to cocoon: ?
if (url.startsWith("cocoon:")) {
cocoonRedirect(url);
+ } else if (url.startsWith(SERVLET_PROTOCOL)) {
+ throw new ProcessingException("Global redirect with servlet: protocol are not possible!");
} else {
this.doRedirect(sessionMode, url, false, true);
}
@@ -100,6 +108,14 @@
}
protected abstract void cocoonRedirect(String uri) throws IOException, ProcessingException;
+
+ /**
+ * Handles rediraction to <code>servlet:</code> protocol URI.
+ * @param uri starting with <code>servlet:</code>
+ * @throws IOException
+ * @throws ProcessingException
+ */
+ protected abstract void servletRedirect(String uri) throws IOException, ProcessingException;
/* (non-Javadoc)
* @see org.apache.cocoon.environment.Redirector#hasRedirected()
Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/AbstractInterpreter.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/AbstractInterpreter.java?rev=687706&r1=687705&r2=687706&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/AbstractInterpreter.java (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/flow/AbstractInterpreter.java Thu Aug 21 03:51:09 2008
@@ -199,6 +199,14 @@
// this is a hint for the redirector
objectModel.put("cocoon:forward", "true");
redirector.redirect(false, uri);
+ } if (SourceUtil.getScheme(uri).equals("servlet")) {
+ if (redirector.hasRedirected()) {
+ throw new IllegalStateException("Pipeline has already been processed for this request");
+ }
+ final Map objectModel = this.processInfoProvider.getObjectModel();
+ FlowHelper.setWebContinuation(objectModel, newObjectModel, continuation);
+ FlowHelper.setContextObject(objectModel, newObjectModel, bizData);
+ redirector.redirect(false, uri);
} else {
throw new Exception("uri is not allowed to contain a scheme (cocoon:/ is always automatically used)");
}
Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java?rev=687706&r1=687705&r2=687706&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java Thu Aug 21 03:51:09 2008
@@ -24,11 +24,8 @@
import java.util.Map;
import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.web.context.WebApplicationContext;
-
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.Processor;
import org.apache.cocoon.components.source.impl.SitemapSourceInfo;
@@ -50,6 +47,11 @@
import org.apache.cocoon.util.AbstractLogEnabled;
import org.apache.cocoon.util.location.Location;
import org.apache.cocoon.util.location.LocationImpl;
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.web.context.WebApplicationContext;
/**
* The concrete implementation of {@link Processor}, containing the evaluation tree and associated
@@ -322,6 +324,21 @@
}
return result;
}
+
+ protected boolean handleServletRedirect(String uri, Environment environment) throws IOException, ProcessingException {
+ SourceFactory sourceFactory;
+ try {
+ sourceFactory = (SourceFactory) this.manager.lookup("org.apache.excalibur.source.SourceFactory/servlet");
+ } catch (ServiceException e) {
+ throw new ProcessingException("Could not find ServletSourceFactory. Are you trying to use servlet: source " +
+ "without using Servlet Service Framework (components)?", e);
+ }
+
+ Source source = sourceFactory.getSource(uri, null);
+ org.apache.commons.io.IOUtils.copy(source.getInputStream(), environment.getOutputStream(0));
+
+ return true;
+ }
/**
* @see org.apache.avalon.framework.activity.Disposable#dispose()
@@ -374,6 +391,11 @@
throw new ProcessingException(e);
}
}
+
+ protected void servletRedirect(String uri) throws IOException, ProcessingException {
+ handleServletRedirect(uri, this.env);
+ }
+
}
public SourceResolver getSourceResolver() {