diff options
author | Leif Åstrand <leif@vaadin.com> | 2011-11-03 17:04:12 +0200 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2011-11-03 17:04:12 +0200 |
commit | ec72287d69c5806c649fb0df9a82426d0074a5c7 (patch) | |
tree | bb674d077f636bfe28c2d177271c9da4c2cb79b6 | |
parent | f57881f8d67d9094dba55c04b1ff3e80524e3c15 (diff) | |
download | vaadin-framework-ec72287d69c5806c649fb0df9a82426d0074a5c7.tar.gz vaadin-framework-ec72287d69c5806c649fb0df9a82426d0074a5c7.zip |
Added initial support for RequestHandlers
-rw-r--r-- | src/com/vaadin/Application.java | 32 | ||||
-rw-r--r-- | src/com/vaadin/RootTestApplication.java | 25 | ||||
-rw-r--r-- | src/com/vaadin/terminal/RequestHandler.java | 8 | ||||
-rw-r--r-- | src/com/vaadin/terminal/WrappedRequest.java | 26 | ||||
-rw-r--r-- | src/com/vaadin/terminal/WrappedResponse.java | 19 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java | 9 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java | 71 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java | 43 |
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(); + } + +} |