aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2011-11-03 17:04:12 +0200
committerLeif Åstrand <leif@vaadin.com>2011-11-03 17:04:12 +0200
commitec72287d69c5806c649fb0df9a82426d0074a5c7 (patch)
treebb674d077f636bfe28c2d177271c9da4c2cb79b6
parentf57881f8d67d9094dba55c04b1ff3e80524e3c15 (diff)
downloadvaadin-framework-ec72287d69c5806c649fb0df9a82426d0074a5c7.tar.gz
vaadin-framework-ec72287d69c5806c649fb0df9a82426d0074a5c7.zip
Added initial support for RequestHandlers
-rw-r--r--src/com/vaadin/Application.java32
-rw-r--r--src/com/vaadin/RootTestApplication.java25
-rw-r--r--src/com/vaadin/terminal/RequestHandler.java8
-rw-r--r--src/com/vaadin/terminal/WrappedRequest.java26
-rw-r--r--src/com/vaadin/terminal/WrappedResponse.java19
-rw-r--r--src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java9
-rw-r--r--src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java71
-rw-r--r--src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java43
8 files changed, 232 insertions, 1 deletions
diff --git a/src/com/vaadin/Application.java b/src/com/vaadin/Application.java
index 4a6968fd66..a8aa7f6ba1 100644
--- a/src/com/vaadin/Application.java
+++ b/src/com/vaadin/Application.java
@@ -7,6 +7,9 @@ package com.vaadin;
import java.io.Serializable;
import java.net.SocketException;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.EventObject;
@@ -22,10 +25,13 @@ import com.vaadin.terminal.ApplicationResource;
import com.vaadin.terminal.DownloadStream;
import com.vaadin.terminal.ErrorMessage;
import com.vaadin.terminal.ParameterHandler;
+import com.vaadin.terminal.RequestHandler;
import com.vaadin.terminal.SystemError;
import com.vaadin.terminal.Terminal;
import com.vaadin.terminal.URIHandler;
import com.vaadin.terminal.VariableOwner;
+import com.vaadin.terminal.WrappedRequest;
+import com.vaadin.terminal.WrappedResponse;
import com.vaadin.terminal.gwt.server.ChangeVariablesErrorEvent;
import com.vaadin.terminal.gwt.server.PortletApplicationContext;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
@@ -187,6 +193,8 @@ public abstract class Application implements URIHandler,
*/
private Terminal.ErrorListener errorHandler = this;
+ private Collection<RequestHandler> requestHandlers = new ArrayList<RequestHandler>();
+
// /**
// * <p>
// * Gets a window by name. Returns <code>null</code> if the application is
@@ -1923,4 +1931,28 @@ public abstract class Application implements URIHandler,
}
public abstract Root getRoot();
+
+ public boolean handleRequest(WrappedRequest request,
+ WrappedResponse response) {
+ for (RequestHandler handler : new ArrayList<RequestHandler>(
+ requestHandlers)) {
+ if (handler.handleRequest(request, response)) {
+ return true;
+ }
+ }
+ // If not handled
+ return false;
+ }
+
+ public void addRequestHandler(RequestHandler handler) {
+ requestHandlers.add(handler);
+ }
+
+ public void removeRequestHandler(RequestHandler handler) {
+ requestHandlers.remove(handler);
+ }
+
+ public Collection<RequestHandler> getRequestHandlers() {
+ return Collections.unmodifiableCollection(requestHandlers);
+ }
} \ No newline at end of file
diff --git a/src/com/vaadin/RootTestApplication.java b/src/com/vaadin/RootTestApplication.java
index 2f9cef93e3..c084659d9d 100644
--- a/src/com/vaadin/RootTestApplication.java
+++ b/src/com/vaadin/RootTestApplication.java
@@ -1,5 +1,11 @@
package com.vaadin;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import com.vaadin.terminal.RequestHandler;
+import com.vaadin.terminal.WrappedRequest;
+import com.vaadin.terminal.WrappedResponse;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Root;
@@ -28,6 +34,25 @@ public class RootTestApplication extends Application {
public void init() {
// TODO Should be done by Application during init
root.setApplication(this);
+
+ addRequestHandler(new RequestHandler() {
+ public boolean handleRequest(WrappedRequest request,
+ WrappedResponse response) {
+ if (request.getParameter("myhandler") != null) {
+ response.setContentType("text/plain");
+ try {
+ PrintWriter writer = response.getWriter();
+ writer.println("Roots, bloody roots");
+ writer.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
}
@Override
diff --git a/src/com/vaadin/terminal/RequestHandler.java b/src/com/vaadin/terminal/RequestHandler.java
new file mode 100644
index 0000000000..2024d99df9
--- /dev/null
+++ b/src/com/vaadin/terminal/RequestHandler.java
@@ -0,0 +1,8 @@
+package com.vaadin.terminal;
+
+
+public interface RequestHandler {
+
+ boolean handleRequest(WrappedRequest request, WrappedResponse response);
+
+}
diff --git a/src/com/vaadin/terminal/WrappedRequest.java b/src/com/vaadin/terminal/WrappedRequest.java
new file mode 100644
index 0000000000..9e4fed638e
--- /dev/null
+++ b/src/com/vaadin/terminal/WrappedRequest.java
@@ -0,0 +1,26 @@
+package com.vaadin.terminal;
+
+import java.util.Map;
+
+import javax.servlet.http.Cookie;
+
+public interface WrappedRequest {
+ public String getParameter(String parameter);
+
+ public Iterable<String> getParameterNames();
+
+ public String[] getParameterValues(String parameter);
+
+ public Map<String, String[]> getParameterMap();
+
+ /**
+ * Gets the path of the request relative to the root url of the application.
+ *
+ * @return
+ */
+ public String getRelativePath();
+
+ public String getFullPath();
+
+ public Cookie[] getCookies();
+}
diff --git a/src/com/vaadin/terminal/WrappedResponse.java b/src/com/vaadin/terminal/WrappedResponse.java
new file mode 100644
index 0000000000..384cf26aa5
--- /dev/null
+++ b/src/com/vaadin/terminal/WrappedResponse.java
@@ -0,0 +1,19 @@
+package com.vaadin.terminal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+public interface WrappedResponse {
+
+ public void setStatus(int statusCode);
+
+ public void setContentType(String contentType);
+
+ public void setContentLenght(int contentLength);
+
+ public OutputStream getOutputStream() throws IOException;
+
+ public PrintWriter getWriter() throws IOException;
+
+}
diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java
index 35ce753cab..8db91b72bd 100644
--- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java
+++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java
@@ -467,7 +467,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements
requestStarted = true;
}
- // Start the newly created application
+ // Start the application if it's newly created
startApplication(request, application, webApplicationContext);
/*
@@ -497,6 +497,13 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements
return;
}
+ if (application.handleRequest(
+ new WrappedHttpServletRequest(request),
+ new WrappedHttpServletResponse(response))) {
+ return;
+ }
+ // TODO Should return 404 error here and not do anything more
+
// Finds the root within the application
Root root = getApplicationRoot(request, applicationManager,
application);
diff --git a/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java
new file mode 100644
index 0000000000..96f031a530
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java
@@ -0,0 +1,71 @@
+package com.vaadin.terminal.gwt.server;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
+import com.vaadin.terminal.WrappedRequest;
+
+public class WrappedHttpServletRequest implements WrappedRequest {
+
+ private final HttpServletRequest request;
+
+ public WrappedHttpServletRequest(HttpServletRequest request) {
+ this.request = request;
+ }
+
+ public HttpServletRequest getHttpServletRequest() {
+ return request;
+ }
+
+ public String getParameter(String parameter) {
+ return request.getParameter(parameter);
+ }
+
+ public Iterable<String> getParameterNames() {
+ return new Iterable<String>() {
+ public Iterator<String> iterator() {
+ final Enumeration<String> parameterNames = request
+ .getParameterNames();
+ return new Iterator<String>() {
+
+ public boolean hasNext() {
+ return parameterNames.hasMoreElements();
+ }
+
+ public String next() {
+ return parameterNames.nextElement();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+ };
+ }
+
+ public String[] getParameterValues(String parameter) {
+ return request.getParameterValues(parameter);
+ }
+
+ public Map<String, String[]> getParameterMap() {
+ return request.getParameterMap();
+ }
+
+ public String getRelativePath() {
+ return request.getPathInfo();
+ }
+
+ public String getFullPath() {
+ return request.getRequestURI();
+ }
+
+ public Cookie[] getCookies() {
+ return request.getCookies();
+ }
+
+}
diff --git a/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java
new file mode 100644
index 0000000000..12c763c609
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java
@@ -0,0 +1,43 @@
+package com.vaadin.terminal.gwt.server;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.vaadin.terminal.WrappedResponse;
+
+public class WrappedHttpServletResponse implements WrappedResponse {
+
+ private final HttpServletResponse response;
+
+ public WrappedHttpServletResponse(HttpServletResponse response) {
+ this.response = response;
+ }
+
+ public HttpServletResponse getHttpServletResponse() {
+ return response;
+ }
+
+ public void setStatus(int statusCode) {
+ response.setStatus(statusCode);
+ }
+
+ public void setContentType(String contentType) {
+ response.setContentType(contentType);
+ }
+
+ public void setContentLenght(int contentLength) {
+ response.setContentLength(contentLength);
+ }
+
+ public OutputStream getOutputStream() throws IOException {
+ return response.getOutputStream();
+ }
+
+ public PrintWriter getWriter() throws IOException {
+ return response.getWriter();
+ }
+
+}