import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
-import javax.portlet.EventPortlet;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.GenericPortlet;
/* Start the newly created application */
startApplication(request, application, applicationContext);
-
+
/*
* Transaction starts. Call transaction listeners. Transaction
* end is called in the finally block below.
*/
applicationContext.startTransaction(application, request);
-
+
+ /* Notify listeners */
+
+ // TODO Should this happen before or after the transaction starts?
+
+ if (request instanceof RenderRequest) {
+ applicationContext.firePortletRenderRequest(application, (RenderRequest) request, (RenderResponse) response);
+ } else if (request instanceof ActionRequest) {
+ applicationContext.firePortletActionRequest(application, (ActionRequest) request, (ActionResponse) response);
+ } else if (request instanceof EventRequest) {
+ applicationContext.firePortletEventRequest(application, (EventRequest) request, (EventResponse) response);
+ } else if (request instanceof ResourceRequest) {
+ applicationContext.firePortletResourceRequest(application, (ResourceRequest) request, (ResourceResponse) response);
+ }
+
/* Handle the request */
if (requestType == RequestType.FILE_UPLOAD) {
applicationManager.handleFileUpload(
(ResourceRequest) request,
(ResourceResponse) response, this);
return;
- } else if (requestType == RequestType.EVENT) {
- /*
- * Redirect portlet event to application if it implements
- * the EventPortlet interface (contains only one method).
- */
- // TODO Figure out a better way of handling events
- if (application instanceof EventPortlet) {
- ((EventPortlet) application).processEvent(
- (EventRequest) request,
- (EventResponse) response);
- }
} else {
/*
* Removes the application if it has stopped
package com.vaadin.terminal.gwt.server;
import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.CacheControl;
+import javax.portlet.EventRequest;
+import javax.portlet.EventResponse;
+import javax.portlet.PortletMode;
import javax.portlet.PortletRequest;
import javax.portlet.PortletSession;
+import javax.portlet.PortletURL;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.ResourceURL;
+import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+
import com.vaadin.Application;
import com.vaadin.service.ApplicationContext;
protected LinkedList<TransactionListener> listeners;
+ protected Map<Application, Set<PortletListener>> portletListeners = new HashMap<Application, Set<PortletListener>>();
+
protected transient PortletSession session;
protected final HashSet<Application> applications = new HashSet<Application>();
e.printStackTrace();
}
}
+
+ public void addPortletListener(Application app, PortletListener listener) {
+ Set<PortletListener> l = portletListeners.get(app);
+ if (l == null) {
+ l = new LinkedHashSet<PortletListener>();
+ portletListeners.put(app, l);
+ }
+ l.add(listener);
+ }
+
+ public void removePortletListener(Application app, PortletListener listener) {
+ Set<PortletListener> l = portletListeners.get(app);
+ if (l != null) {
+ l.remove(listener);
+ }
+ }
+
+ public void firePortletRenderRequest(Application app,
+ RenderRequest request, RenderResponse response) {
+ Set<PortletListener> listeners = portletListeners.get(app);
+ if (listeners != null) {
+ for (PortletListener l : listeners) {
+ l.handleRenderRequest(request, new RestrictedRenderResponse(response));
+ }
+ }
+ }
+
+ public void firePortletActionRequest(Application app,
+ ActionRequest request, ActionResponse response) {
+ Set<PortletListener> listeners = portletListeners.get(app);
+ if (listeners != null) {
+ for (PortletListener l : listeners) {
+ l.handleActionRequest(request, response);
+ }
+ }
+ }
+
+ public void firePortletEventRequest(Application app, EventRequest request,
+ EventResponse response) {
+ Set<PortletListener> listeners = portletListeners.get(app);
+ if (listeners != null) {
+ for (PortletListener l : listeners) {
+ l.handleEventRequest(request, response);
+ }
+ }
+ }
+
+ public void firePortletResourceRequest(Application app,
+ ResourceRequest request, ResourceResponse response) {
+ Set<PortletListener> listeners = portletListeners.get(app);
+ if (listeners != null) {
+ for (PortletListener l : listeners) {
+ l.handleResourceRequest(request, response);
+ }
+ }
+ }
+
+ public interface PortletListener extends Serializable {
+
+ public void handleRenderRequest(RenderRequest request,
+ RenderResponse response);
+
+ public void handleActionRequest(ActionRequest request,
+ ActionResponse response);
+
+ public void handleEventRequest(EventRequest request,
+ EventResponse response);
+
+ public void handleResourceRequest(ResourceRequest request,
+ ResourceResponse response);
+ }
+
+ private class RestrictedRenderResponse implements RenderResponse,
+ Serializable {
+
+ private RenderResponse response;
+
+ private RestrictedRenderResponse(RenderResponse response) {
+ this.response = response;
+ }
+
+ public void addProperty(String key, String value) {
+ response.addProperty(key, value);
+ }
+
+ public PortletURL createActionURL() {
+ return response.createActionURL();
+ }
+
+ public PortletURL createRenderURL() {
+ return response.createRenderURL();
+ }
+
+ public String encodeURL(String path) {
+ return response.encodeURL(path);
+ }
+
+ public void flushBuffer() throws IOException {
+ // NOP
+ // TODO throw?
+ }
+
+ public int getBufferSize() {
+ return response.getBufferSize();
+ }
+
+ public String getCharacterEncoding() {
+ return response.getCharacterEncoding();
+ }
+
+ public String getContentType() {
+ return response.getContentType();
+ }
+
+ public Locale getLocale() {
+ return response.getLocale();
+ }
+
+ public String getNamespace() {
+ return response.getNamespace();
+ }
+
+ public OutputStream getPortletOutputStream() throws IOException {
+ // write forbidden
+ return null;
+ }
+
+ public PrintWriter getWriter() throws IOException {
+ // write forbidden
+ return null;
+ }
+
+ public boolean isCommitted() {
+ return response.isCommitted();
+ }
+
+ public void reset() {
+ // NOP
+ // TODO throw?
+ }
+
+ public void resetBuffer() {
+ // NOP
+ // TODO throw?
+ }
+
+ public void setBufferSize(int size) {
+ // NOP
+ // TODO throw?
+ }
+
+ public void setContentType(String type) {
+ // NOP
+ // TODO throw?
+ }
+
+ public void setProperty(String key, String value) {
+ response.setProperty(key, value);
+ }
+
+ public void setTitle(String title) {
+ response.setTitle(title);
+ }
+
+ public void setNextPossiblePortletModes(
+ Collection<PortletMode> portletModes) {
+ // NOP
+ // TODO throw?
+ }
+
+ public ResourceURL createResourceURL() {
+ return response.createResourceURL();
+ }
+
+ public CacheControl getCacheControl() {
+ return response.getCacheControl();
+ }
+
+ public void addProperty(Cookie cookie) {
+ // NOP
+ // TODO throw?
+ }
+
+ public void addProperty(String key, Element element) {
+ // NOP
+ // TODO throw?
+ }
+
+ public Element createElement(String tagName) throws DOMException {
+ // NOP
+ return null;
+ }
+ }
+
}