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]