Author: simoneg
Date: Mon Sep 14 11:48:02 2009
New Revision: 814593

URL: http://svn.apache.org/viewvc?rev=814593&view=rev
Log:
LABS-451 : support for custom HTTP error codes and redirection

Added:
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpCodeException.java
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpRedirectException.java
Modified:
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Dispatch.java
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/WebHandler.java
    
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/WebHandlerCycleTest.java
    
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/teststuff/SimpleWebHandler.java

Modified: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Dispatch.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Dispatch.java?rev=814593&r1=814592&r2=814593&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Dispatch.java
 (original)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Dispatch.java
 Mon Sep 14 11:48:02 2009
@@ -96,13 +96,13 @@
                }
                
                // try to resolve the path
-               Producer producer = findProducer(pathInfo);
-               if (producer == null && originalPathInfo != null) {
-                       // Fall back, in case of resources
-                       producer = findProducer(originalPathInfo);
-                       extension = "HTML";
-               }
                try {
+                       Producer producer = findProducer(pathInfo);
+                       if (producer == null && originalPathInfo != null) {
+                               // Fall back, in case of resources
+                               producer = findProducer(originalPathInfo);
+                               extension = "HTML";
+                       }
                        if (producer != null) {
                                if (method == null) {
                                        method = findMethod(extension);         
                        
@@ -144,12 +144,23 @@
        }
 
        protected void handleException(Throwable t, HttpServletResponse resp) {
-               ServletOutputStream out = null;
                try {
+                       // Find the exception hidden inside redirects
+                       Throwable act = t;
+                       while (act.getCause() != null) act = act.getCause();
+                       if (act instanceof HttpCodeException) {
+                               ((HttpCodeException)act).apply(resp);
+                               return;
+                       }
+                       ServletOutputStream out = null;
                        out = resp.getOutputStream();
                        out.write("<pre>".getBytes());
+                       if (act != null && act != t) {
+                               act.printStackTrace(new PrintStream(out));
+                       }
+                       out.write("<small>".getBytes());
                        t.printStackTrace(new PrintStream(out));
-                       out.write("</pre>".getBytes());
+                       out.write("</small></pre>".getBytes());
                } catch (IOException e) {
                        t.printStackTrace();
                        return;

Added: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpCodeException.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpCodeException.java?rev=814593&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpCodeException.java
 (added)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpCodeException.java
 Mon Sep 14 11:48:02 2009
@@ -0,0 +1,41 @@
+package org.apache.magma.website;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+public class HttpCodeException extends Error {
+       
+       private int code = 500;
+       private Map<String, String> otherHeaders = null;
+       private String message;
+       
+       public HttpCodeException(int code) {
+               this.code = code;
+       }
+       
+       public void addHeader(String name, String value) {
+               if (otherHeaders == null) otherHeaders = new HashMap<String, 
String>();
+               otherHeaders.put(name, value);
+       }
+       
+       public void setMessage(String message) {
+               this.message = message;
+       }
+       
+       public void apply(HttpServletResponse resp) throws IOException {
+               if (otherHeaders != null && otherHeaders.size() > 0) {
+                       for (Map.Entry<String, String> entry : 
otherHeaders.entrySet()) {
+                               resp.setHeader(entry.getKey(), 
entry.getValue());
+                       }
+               }
+               if (message != null) {
+                       resp.sendError(code, message);
+               } else {
+                       resp.sendError(code);
+               }
+       }
+
+}

Added: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpRedirectException.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpRedirectException.java?rev=814593&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpRedirectException.java
 (added)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/HttpRedirectException.java
 Mon Sep 14 11:48:02 2009
@@ -0,0 +1,21 @@
+package org.apache.magma.website;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+public class HttpRedirectException extends HttpCodeException {
+
+       private String location = null;
+       
+       public HttpRedirectException(String url) {
+               super(303);
+               this.location = url;
+       }
+       
+       @Override
+       public void apply(HttpServletResponse resp) throws IOException {
+               resp.sendRedirect(location);
+       }
+       
+}

Modified: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/WebHandler.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/WebHandler.java?rev=814593&r1=814592&r2=814593&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/WebHandler.java
 (original)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/WebHandler.java
 Mon Sep 14 11:48:02 2009
@@ -19,11 +19,13 @@
 import org.apache.magma.basics.MagmaException;
 import org.apache.magma.basics.context.ContextOwner;
 import org.apache.magma.basics.context.RunningContext;
+import org.apache.magma.basics.startup.Cycle;
 import org.apache.magma.basics.utils.GenericClass;
 import org.apache.magma.basics.utils.GenericClass.MethodDef;
 import org.apache.magma.conversion.Converter;
 import org.apache.magma.conversion.Converters;
 import org.apache.magma.website.templating.Template;
+import org.apache.magma.website.utils.URLRewritingStream;
 
 import java.lang.reflect.Method;
 import java.util.Arrays;
@@ -280,6 +282,12 @@
                return to;
        }
        
+       public void redirect(String url) {
+               URLRewritingStream rew = Cycle.get().getRewriting();
+               url = rew.absoluteUrl(url);
+               throw new HttpRedirectException(url);
+       }
+       
        protected RootWebHandler root() {
                return RootWebHandler.getInstance();
        }

Modified: 
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/WebHandlerCycleTest.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/WebHandlerCycleTest.java?rev=814593&r1=814592&r2=814593&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/WebHandlerCycleTest.java
 (original)
+++ 
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/WebHandlerCycleTest.java
 Mon Sep 14 11:48:02 2009
@@ -45,6 +45,27 @@
        }
        
        @Test
+       public void redirectURI() throws Exception {
+               final DefaultExpectations def = new DefaultExpectations() {{
+                       one(resp).sendRedirect("http://www.google.com/";);
+                       
+               }};
+               def.setupDefaults("/test/redirectGoogle");
+               
+               def.start();
+       }
+
+       @Test
+       public void redirectInternalURI() throws Exception {
+               final DefaultExpectations def = new DefaultExpectations() {{
+                       
one(resp).sendRedirect("http://localhost/app/tests/redirected";);
+                       
+               }};
+               def.setupDefaults("/test/redirectInternal");
+               def.start();
+       }
+       
+       @Test
        public void findAndbind() throws Exception {
                
                final DefaultExpectations def = new DefaultExpectations();

Modified: 
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/teststuff/SimpleWebHandler.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/teststuff/SimpleWebHandler.java?rev=814593&r1=814592&r2=814593&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/teststuff/SimpleWebHandler.java
 (original)
+++ 
labs/magma/trunk/foundation-website/src/test/java/org/apache/magma/website/teststuff/SimpleWebHandler.java
 Mon Sep 14 11:48:02 2009
@@ -99,4 +99,14 @@
        public HtmlProducer doTestAspectInjection() {
                return new FakeHtmlProducer();
        }
+       
+       public HtmlProducer doRedirectGoogle() {
+               redirect("http://www.google.com/";);
+               return null;
+       }
+       
+       public HtmlProducer doRedirectInternal() {
+               redirect("magma:/redirected");
+               return null;
+       }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to