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 2008/04/20 23:20:54 UTC

svn commit: r649981 - in /cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet: SitemapServlet.java node/MimeTypeCollector.java node/StatusCodeCollector.java

Author: reinhard
Date: Sun Apr 20 14:20:53 2008
New Revision: 649981

URL: http://svn.apache.org/viewvc?rev=649981&view=rev
Log:
COCOON-2201
Set additional header fields in the HttpServletResponse in the SitemapServlet. (patch by Steven Dolg)

Modified:
    cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/SitemapServlet.java
    cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/MimeTypeCollector.java
    cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/StatusCodeCollector.java

Modified: cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/SitemapServlet.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/SitemapServlet.java?rev=649981&r1=649980&r2=649981&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/SitemapServlet.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/SitemapServlet.java Sun Apr 20 14:20:53 2008
@@ -18,6 +18,7 @@
  */
 package org.apache.cocoon.corona.servlet;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintWriter;
@@ -48,10 +49,9 @@
     private static final long serialVersionUID = 1L;
 
     private BeanFactory beanFactory;
-    private Sitemap sitemap;
     private boolean initialized;
-
     private ServletConfig servletConfig;
+    private Sitemap sitemap;
 
     @Override
     public void init(ServletConfig servletConfig) throws ServletException {
@@ -59,24 +59,9 @@
         super.init(this.servletConfig);
     }
 
-    private void lazyInitialize(ServletConfig servletConfig) throws ServletException {
-        if (!this.initialized) {
-            try {
-                SitemapBuilder sitemapBuilder = (SitemapBuilder) this.beanFactory.getBean(SitemapBuilder.class
-                        .getName());
-                URL url = servletConfig.getServletContext().getResource("/sitemap.xmap");
-                this.sitemap = sitemapBuilder.build(url);
-            } catch (Exception e) {
-                throw new ServletException(e);
-            }
-            this.initialized = true;
-        }
-    }
-
     public void invoke(String requestURI, Map<String, Object> parameters, OutputStream outputStream) {
         InvocationImpl invocation = (InvocationImpl) this.beanFactory.getBean(Invocation.class.getName());
 
-        System.out.println("Starting invocation for RequestURI " + requestURI);
         invocation.setRequestURI(requestURI);
         invocation.setParameters(parameters);
         invocation.setOutputStream(outputStream);
@@ -90,20 +75,25 @@
 
     @Override
     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        this.lazyInitialize(servletConfig);
+        this.lazyInitialize(this.servletConfig);
+
         try {
             SitemapDelegator.setSitemapServlet(this);
+            MimeTypeCollector.clearMimeType();
+            StatusCodeCollector.clearStatusCode();
 
             // assemble parameters
             Map<String, Object> parameters = this.getInvocationParameters(request);
             HttpContextHelper.storeRequest(request, parameters);
             HttpContextHelper.storeResponse(response, parameters);
 
-            this.invoke(request.getRequestURI(), parameters, response.getOutputStream());
+            ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
+            this.invoke(request.getRequestURI(), parameters, baos);
 
-            response.setStatus(StatusCodeCollector.getStatusCode());
             response.setContentType(MimeTypeCollector.getMimeType());
-            response.setContentType("text/html;charset=UTF-8");
+            response.setContentLength(baos.size());
+            response.getOutputStream().write(baos.toByteArray());
+            response.setStatus(StatusCodeCollector.getStatusCode());
         } catch (Exception e) {
             PrintWriter writer = new PrintWriter(response.getOutputStream());
             e.printStackTrace(writer);
@@ -123,5 +113,18 @@
         }
 
         return invocationParameters;
+    }
+
+    private synchronized void lazyInitialize(ServletConfig servletConfig) throws ServletException {
+        if (!this.initialized) {
+            try {
+                SitemapBuilder sitemapBuilder = (SitemapBuilder) this.beanFactory.getBean(SitemapBuilder.class.getName());
+                URL url = servletConfig.getServletContext().getResource("/sitemap.xmap");
+                this.sitemap = sitemapBuilder.build(url);
+            } catch (Exception e) {
+                throw new ServletException(e);
+            }
+            this.initialized = true;
+        }
     }
 }

Modified: cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/MimeTypeCollector.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/MimeTypeCollector.java?rev=649981&r1=649980&r2=649981&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/MimeTypeCollector.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/MimeTypeCollector.java Sun Apr 20 14:20:53 2008
@@ -26,24 +26,24 @@
 
     private static final ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<String>();
 
+    public static void clearMimeType() {
+        THREAD_LOCAL.set(null);
+    }
+
+    public static String getMimeType() {
+        return THREAD_LOCAL.get();
+    }
+
     @Around("execution(* org.apache.cocoon.corona.pipeline.Pipeline.execute(..))")
     public Object interceptInvoke(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
-        System.out.println("Executing MimeTypeCollector");
         Object result = proceedingJoinPoint.proceed();
 
         Pipeline pipeline = (Pipeline) proceedingJoinPoint.getTarget();
-        THREAD_LOCAL.set(pipeline.getContentType());
+        String newValue = pipeline.getContentType();
+        if (newValue != null) {
+            THREAD_LOCAL.set(newValue);
+        }
 
         return result;
-    }
-
-    public static String getMimeType() {
-        String mimeType = THREAD_LOCAL.get();
-
-        return mimeType;
-    }
-
-    public static void setMimeType(String mimeType) {
-        THREAD_LOCAL.set(mimeType);
     }
 }

Modified: cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/StatusCodeCollector.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/StatusCodeCollector.java?rev=649981&r1=649980&r2=649981&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/StatusCodeCollector.java (original)
+++ cocoon/whiteboard/corona/trunk/corona-servlet/src/main/java/org/apache/cocoon/corona/servlet/node/StatusCodeCollector.java Sun Apr 20 14:20:53 2008
@@ -29,24 +29,14 @@
 @Aspect
 public class StatusCodeCollector {
 
-    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
+    private static final ThreadLocal<Integer> THREAD_LOCAL = new ThreadLocal<Integer>();
 
-    @Around("execution(org.apache.cocoon.corona.sitemap.node.InvocationResult org.apache.cocoon.corona.sitemap.node.SerializeNode.invoke(org.apache.cocoon.corona.sitemap.Invocation))")
-    public Object interceptInvoke(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
-        SerializeNode target = (SerializeNode) proceedingJoinPoint.getTarget();
-        String statusCode = target.getParameters().get("status-code");
-
-        InvocationResult invocationResult = (InvocationResult) proceedingJoinPoint.proceed();
-
-        if (invocationResult.isProcessed() && statusCode != null) {
-            threadLocal.set(Integer.valueOf(statusCode));
-        }
-
-        return invocationResult;
+    public static void clearStatusCode() {
+        THREAD_LOCAL.set(null);
     }
 
     public static int getStatusCode() {
-        Integer integer = threadLocal.get();
+        Integer integer = THREAD_LOCAL.get();
 
         if (integer == null) {
             return HttpServletResponse.SC_OK;
@@ -56,6 +46,20 @@
     }
 
     public static void setStatusCode(int statusCode) {
-        threadLocal.set(statusCode);
+        THREAD_LOCAL.set(statusCode);
+    }
+
+    @Around("execution(org.apache.cocoon.corona.sitemap.node.InvocationResult org.apache.cocoon.corona.sitemap.node.SerializeNode.invoke(org.apache.cocoon.corona.sitemap.Invocation))")
+    public Object interceptInvoke(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
+        SerializeNode target = (SerializeNode) proceedingJoinPoint.getTarget();
+        String statusCode = target.getParameters().get("status-code");
+
+        InvocationResult invocationResult = (InvocationResult) proceedingJoinPoint.proceed();
+
+        if (invocationResult.isProcessed() && statusCode != null) {
+            THREAD_LOCAL.set(Integer.valueOf(statusCode));
+        }
+
+        return invocationResult;
     }
 }