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);
+    }
 }