You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by re...@apache.org on 2009/08/19 12:57:41 UTC
svn commit: r805745 - in /cocoon/cocoon3/trunk:
cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/
cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/
cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/ cocoon-sample/sr...
Author: reinhard
Date: Wed Aug 19 10:57:40 2009
New Revision: 805745
URL: http://svn.apache.org/viewvc?rev=805745&view=rev
Log:
Fix content-type handling which didn't work correctly when multiple internal requests occurred within one external request.
Modified:
cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java
cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/URLResponse.java
cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/RedirectTest.java
cocoon/cocoon3/trunk/cocoon-sample/src/test/java/org/apache/cocoon/sitemap/SitemapBuilderTest.java
cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/XMLSitemapServlet.java
cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/component/RedirectorComponent.java
cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/LastModifiedCollector.java
cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/MimeTypeCollector.java
Modified: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java (original)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/SpringRESTController.java Wed Aug 19 10:57:40 2009
@@ -43,6 +43,7 @@
import org.apache.cocoon.rest.controller.response.RestResponse;
import org.apache.cocoon.rest.controller.response.RestResponseMetaData;
import org.apache.cocoon.rest.controller.util.AnnotationCollector;
+import org.apache.cocoon.servlet.node.MimeTypeCollector;
import org.apache.cocoon.servlet.node.StatusCodeCollector;
import org.apache.cocoon.servlet.util.HttpContextHelper;
import org.apache.cocoon.servlet.util.SettingsHelper;
@@ -89,6 +90,9 @@
// set the status-code with the result produced by the restResponse execution
StatusCodeCollector.setStatusCode(restResponseMetaData.getStatusCode());
+ // set the content type with the result produced by the restResponse execution
+ MimeTypeCollector.setMimeType(restResponseMetaData.getContentType());
+
// return the content type
return restResponseMetaData.getContentType();
} catch (Exception e) {
Modified: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/URLResponse.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/URLResponse.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/URLResponse.java (original)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/URLResponse.java Wed Aug 19 10:57:40 2009
@@ -85,7 +85,7 @@
restResponseMetaData.setStatusCode(httpURLConnection.getResponseCode());
}
- restResponseMetaData.setContentType(servletConnection.getContentEncoding());
+ restResponseMetaData.setContentType(servletConnection.getContentType());
return restResponseMetaData;
} finally {
URLConnectionUtils.closeQuietly(servletConnection);
Modified: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/RedirectTest.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/RedirectTest.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/RedirectTest.java (original)
+++ cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/RedirectTest.java Wed Aug 19 10:57:40 2009
@@ -39,5 +39,4 @@
assertEquals("text/xml", this.response.getContentType());
this.assertXPath("/html/body/p", "3");
}
-
}
Modified: cocoon/cocoon3/trunk/cocoon-sample/src/test/java/org/apache/cocoon/sitemap/SitemapBuilderTest.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/test/java/org/apache/cocoon/sitemap/SitemapBuilderTest.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/test/java/org/apache/cocoon/sitemap/SitemapBuilderTest.java (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/test/java/org/apache/cocoon/sitemap/SitemapBuilderTest.java Wed Aug 19 10:57:40 2009
@@ -59,13 +59,12 @@
// invocation.getThrowable() instanceof CustomException);
}
+
@SuppressWarnings("unchecked")
public void testErrorHandlingPipeline() throws Exception {
Invocation invocation = this.buildInvocation("error-handling/custom-error-per-pipeline-error-handling");
MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();
HttpContextHelper.storeResponse(mockHttpServletResponse, invocation.getParameters());
- CallStackHelper.enterServlet(new MockServletContext(), new MockHttpServletRequest(Collections.EMPTY_MAP),
- mockHttpServletResponse);
this.sitemap.invoke(invocation);
// invocation should be marked as error-invocation
@@ -75,7 +74,6 @@
invocation.getThrowable() instanceof CustomException);
assertEquals(501, StatusCodeCollector.getStatusCode());
- CallStackHelper.leaveServlet();
}
@SuppressWarnings("unchecked")
@@ -84,9 +82,6 @@
MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();
HttpContextHelper.storeResponse(mockHttpServletResponse, invocation.getParameters());
- CallStackHelper.enterServlet(new MockServletContext(), new MockHttpServletRequest(Collections.EMPTY_MAP),
- mockHttpServletResponse);
-
InvocationResult invocationResult = this.sitemap.invoke(invocation);
assertNotNull(invocationResult);
assertSame(InvocationResult.COMPLETED, invocationResult);
@@ -94,15 +89,10 @@
// invocation should not be marked as error-invocation
assertFalse(invocation.isErrorInvocation());
assertEquals(401, StatusCodeCollector.getStatusCode());
-
- CallStackHelper.leaveServlet();
}
@SuppressWarnings("unchecked")
public void testNoMatchingPipeline() throws Exception {
- CallStackHelper.enterServlet(new MockServletContext(), new MockHttpServletRequest(Collections.EMPTY_MAP),
- new MockHttpServletResponse());
-
Invocation invocation = this.buildInvocation("unknown");
InvocationResult invocationResult = this.sitemap.invoke(invocation);
@@ -110,33 +100,21 @@
assertTrue(invocation.isErrorInvocation());
assertTrue("Expected NoMatchingPipelineException but received " + invocation.getThrowable(), invocation
.getThrowable() instanceof NoMatchingPipelineException);
-
- CallStackHelper.leaveServlet();
}
@SuppressWarnings("unchecked")
public void testController() throws Exception {
- CallStackHelper.enterServlet(new MockServletContext(), new MockHttpServletRequest(Collections.EMPTY_MAP),
- new MockHttpServletResponse());
-
Invocation invocation = this.buildInvocation("controller/invoke");
InvocationResult invocationResult = this.sitemap.invoke(invocation);
assertNotNull(invocationResult);
assertTrue(invocationResult.isCompleted());
-
- CallStackHelper.leaveServlet();
}
@SuppressWarnings("unchecked")
public void testXSLT() throws Exception {
- CallStackHelper.enterServlet(new MockServletContext(), new MockHttpServletRequest(Collections.EMPTY_MAP),
- new MockHttpServletResponse());
-
Invocation invocation = this.buildInvocation("xslt/main");
InvocationResult invocationResult = this.sitemap.invoke(invocation);
assertNotNull(invocationResult);
-
- CallStackHelper.leaveServlet();
}
public void testObjectModelPipeline() {
@@ -219,6 +197,8 @@
@Override
protected void setUp() throws Exception {
+ super.setUp();
+
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] {
"META-INF/cocoon/spring/cocoon-sitemap.xml", "META-INF/cocoon/spring/cocoon-pipeline-action.xml",
"META-INF/cocoon/spring/cocoon-pipeline-component.xml", "META-INF/cocoon/spring/cocoon-pipeline.xml",
@@ -234,6 +214,17 @@
URL sitemapURL = this.getClass().getResource("/COB-INF/sitemap.xmap");
this.sitemapBuilder = (SitemapBuilder) applicationContext.getBean("org.apache.cocoon.sitemap.SitemapBuilder");
this.sitemap = this.sitemapBuilder.build(sitemapURL);
+
+ Map<String, String> emptyMap = Collections.emptyMap();
+ CallStackHelper.enterServlet(new MockServletContext(), new MockHttpServletRequest(emptyMap),
+ new MockHttpServletResponse());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ CallStackHelper.leaveServlet();
}
private Invocation buildInvocation(String request) {
Modified: cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/XMLSitemapServlet.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/XMLSitemapServlet.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/XMLSitemapServlet.java (original)
+++ cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/XMLSitemapServlet.java Wed Aug 19 10:57:40 2009
@@ -98,9 +98,6 @@
try {
Settings settings = (Settings) this.beanFactory.getBean(Settings.class.getName());
- MimeTypeCollector.clearMimeType();
- LastModifiedCollector.clearLastModified();
-
// assemble parameters
Map<String, Object> parameters = this.getInvocationParameters(request);
HttpContextHelper.storeRequest(request, parameters);
Modified: cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/component/RedirectorComponent.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/component/RedirectorComponent.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/component/RedirectorComponent.java (original)
+++ cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/component/RedirectorComponent.java Wed Aug 19 10:57:40 2009
@@ -22,6 +22,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
+import java.net.URLConnection;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
@@ -40,11 +41,12 @@
private Map<String, Object> parameters;
private String uri;
+ private URLConnection urlConnection;
private OutputStream outputStream;
/**
* {@inheritDoc}
- *
+ *
* @see org.apache.cocoon.pipeline.component.Starter#execute()
*/
public void execute() {
@@ -52,7 +54,7 @@
try {
if (this.uri.startsWith("servlet:")) {
- InputStream inputStream = new URL(this.uri).openStream();
+ InputStream inputStream = this.getURLConnection().getInputStream();
byte[] data = new byte[1024];
while (true) {
int bytesRead = inputStream.read(data, 0, data.length);
@@ -73,18 +75,31 @@
}
}
+ private URLConnection getURLConnection() {
+ if (this.urlConnection == null) {
+ try {
+ this.urlConnection = new URL(this.uri).openConnection();
+
+ } catch (IOException e) {
+ throw new ProcessingException("Can't connect to the URI " + this.uri, e);
+ }
+ }
+
+ return this.urlConnection;
+ }
+
/**
* {@inheritDoc}
- *
+ *
* @see org.apache.cocoon.pipeline.component.Finisher#getContentType()
*/
public String getContentType() {
- return null;
+ return this.urlConnection.getContentType();
}
/**
* {@inheritDoc}
- *
+ *
* @see org.apache.cocoon.pipeline.component.PipelineComponent#setConfiguration(java.util.Map)
*/
@Override
@@ -94,7 +109,7 @@
/**
* {@inheritDoc}
- *
+ *
* @see org.apache.cocoon.pipeline.component.AbstractPipelineComponent#setup(java.util.Map)
*/
@Override
@@ -104,7 +119,7 @@
/**
* {@inheritDoc}
- *
+ *
* @see org.apache.cocoon.pipeline.component.Finisher#setOutputStream(java.io.OutputStream)
*/
public void setOutputStream(OutputStream outputStream) {
@@ -113,7 +128,7 @@
/**
* {@inheritDoc}
- *
+ *
* @see java.lang.Object#toString()
*/
@Override
Modified: cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/LastModifiedCollector.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/LastModifiedCollector.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/LastModifiedCollector.java (original)
+++ cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/LastModifiedCollector.java Wed Aug 19 10:57:40 2009
@@ -16,6 +16,7 @@
*/
package org.apache.cocoon.servlet.node;
+import org.apache.cocoon.callstack.CallStack;
import org.apache.cocoon.pipeline.Pipeline;
import org.apache.cocoon.pipeline.component.PipelineComponent;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -25,16 +26,17 @@
@Aspect
public class LastModifiedCollector {
- private static final ThreadLocal<Long> THREAD_LOCAL = new ThreadLocal<Long>();
+ private static final String CALL_FRAME_KEY = LastModifiedCollector.class.getName() + "/last-modified";
public static long getLastModified() {
- return THREAD_LOCAL.get();
+ return (Long) CallStack.getCurrentFrame().getAttribute(CALL_FRAME_KEY);
}
- public static void clearLastModified() {
- THREAD_LOCAL.set(null);
+ private static void setLastModified(Long lastModified) {
+ CallStack.getCurrentFrame().setAttribute(CALL_FRAME_KEY, lastModified);
}
+
@SuppressWarnings("unchecked")
@Around("execution(* org.apache.cocoon.pipeline.Pipeline.execute(..))")
public Object interceptInvoke(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
@@ -42,7 +44,7 @@
Pipeline<PipelineComponent> pipeline = (Pipeline<PipelineComponent>) proceedingJoinPoint.getTarget();
long lastModified = pipeline.getLastModified();
- THREAD_LOCAL.set(lastModified);
+ setLastModified(lastModified);
return result;
}
Modified: cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/MimeTypeCollector.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/MimeTypeCollector.java?rev=805745&r1=805744&r2=805745&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/MimeTypeCollector.java (original)
+++ cocoon/cocoon3/trunk/cocoon-servlet/src/main/java/org/apache/cocoon/servlet/node/MimeTypeCollector.java Wed Aug 19 10:57:40 2009
@@ -16,6 +16,7 @@
*/
package org.apache.cocoon.servlet.node;
+import org.apache.cocoon.callstack.CallStack;
import org.apache.cocoon.pipeline.Pipeline;
import org.apache.cocoon.pipeline.component.PipelineComponent;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -25,14 +26,11 @@
@Aspect
public class MimeTypeCollector {
- private static final ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<String>();
-
- public static void clearMimeType() {
- THREAD_LOCAL.set(null);
- }
+ private static final String CALL_FRAME_KEY = MimeTypeCollector.class.getName() + "/mime-type";
public static String getMimeType() {
- return THREAD_LOCAL.get();
+ System.out.println("getmimetype=" + CallStack.getCurrentFrame().getAttribute(CALL_FRAME_KEY));
+ return (String) CallStack.getCurrentFrame().getAttribute(CALL_FRAME_KEY);
}
@SuppressWarnings("unchecked")
@@ -43,9 +41,14 @@
Pipeline<PipelineComponent> pipeline = (Pipeline<PipelineComponent>) proceedingJoinPoint.getTarget();
String newValue = pipeline.getContentType();
if (newValue != null) {
- THREAD_LOCAL.set(newValue);
+ setMimeType(newValue);
}
return result;
}
+
+ public static void setMimeType(String mimeType) {
+ System.out.println("setMimeType=" + mimeType);
+ CallStack.getCurrentFrame().setAttribute(CALL_FRAME_KEY, mimeType);
+ }
}