]> source.dussan.org Git - vaadin-framework.git/commitdiff
Work in progress
authorPetter Holmström <petter.holmstrom@itmill.com>
Tue, 10 Nov 2009 06:05:18 +0000 (06:05 +0000)
committerPetter Holmström <petter.holmstrom@itmill.com>
Tue, 10 Nov 2009 06:05:18 +0000 (06:05 +0000)
svn changeset:9690/svn branch:portlet_2.0

src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java
src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java

index 71d640d3cb0879495c8d066298138748d8d07230..6119c048e07a76e3bbdb15ddde6b547d45c22285 100644 (file)
@@ -255,7 +255,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
     }
 
     enum RequestType {
-        FILE_UPLOAD, UIDL, RENDER, STATIC_FILE, APPLICATION_RESOURCE, UNKNOWN;
+        FILE_UPLOAD, UIDL, RENDER, STATIC_FILE, APPLICATION_RESOURCE, DUMMY, UNKNOWN;
     }
 
     protected RequestType getRequestType(PortletRequest request) {
@@ -266,6 +266,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
                 return RequestType.UIDL;
             } else if (isApplicationResourceRequest((ResourceRequest) request)) {
                 return RequestType.APPLICATION_RESOURCE;
+            } else if (isDummyRequest((ResourceRequest) request)) {
+                return RequestType.DUMMY;
             } else {
                 return RequestType.STATIC_FILE;
             }
@@ -287,6 +289,11 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
                 && request.getResourceID().equals("UIDL");
     }
 
+    private boolean isDummyRequest(ResourceRequest request) {
+        return request.getResourceID() != null
+                && request.getResourceID().equals("DUMMY");
+    }
+
     private boolean isFileUploadRequest(ActionRequest request) {
         return PortletFileUpload.isMultipartContent(request);
     }
@@ -313,13 +320,28 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
 
         if (requestType == RequestType.UNKNOWN) {
             System.err.println("Unknown request type");
+        } else if (requestType == RequestType.DUMMY) {
+            System.out.println("Printing Dummy page");
+            /*
+             * This dummy page is used by action responses to redirect to, in
+             * order to prevent the boot strap code from being rendered into
+             * strange places such as iframes.
+             */
+            ((ResourceResponse) response).setContentType("text/html");
+            final OutputStream out = ((ResourceResponse) response)
+                    .getPortletOutputStream();
+            final PrintWriter outWriter = new PrintWriter(new BufferedWriter(
+                    new OutputStreamWriter(out, "UTF-8")));
+            outWriter.print("<html><body>dummy page</body></html>");
+            outWriter.flush();
+            out.close();
         } else if (requestType == RequestType.STATIC_FILE) {
             serveStaticResources((ResourceRequest) request,
                     (ResourceResponse) response);
         } else {
             Application application = null;
             try {
-                // TODO What about PARAM_UNLOADBURST & redirectToApplication
+                // TODO What about PARAM_UNLOADBURST & redirectToApplication??
 
                 /* Find out which application this request is related to */
                 application = findApplicationInstance(request, requestType);
@@ -341,6 +363,19 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
                 PortletCommunicationManager applicationManager = applicationContext
                         .getApplicationManager(application);
 
+                if (response instanceof RenderResponse
+                        && applicationManager.dummyURL == null) {
+                    /*
+                     * The application manager needs an URL to the dummy page.
+                     * See the PortletCommunicationManager.sendUploadResponse
+                     * method for more information.
+                     */
+                    ResourceURL dummyURL = ((RenderResponse) response)
+                            .createResourceURL();
+                    dummyURL.setResourceID("DUMMY");
+                    applicationManager.dummyURL = dummyURL.toString();
+                }
+
                 /* Update browser information from request */
                 applicationContext.getBrowser()
                         .updateBrowserProperties(request);
@@ -411,8 +446,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
                     }
                 }
             } catch (final SessionExpiredException e) {
-                // TODO Figure out a better way to deal with SessionExpired
-                // -exceptions
+                // TODO Figure out a better way to deal with
+                // SessionExpiredExceptions
                 System.err.println("Session has expired");
                 e.printStackTrace(System.err);
             } catch (final GeneralSecurityException e) {
@@ -554,7 +589,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
             throws PortletException, IOException {
         handleRequest(request, response);
     }
-    
+
     @Override
     protected void doView(RenderRequest request, RenderResponse response)
             throws PortletException, IOException {
@@ -605,8 +640,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
     }
 
     private Application findApplicationInstance(PortletRequest request,
-            RequestType requestType) throws PortletException, SessionExpiredException,
-            MalformedURLException {
+            RequestType requestType) throws PortletException,
+            SessionExpiredException, MalformedURLException {
 
         boolean requestCanCreateApplication = requestCanCreateApplication(
                 request, requestType);
@@ -678,10 +713,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
         final PortletSession session = request
                 .getPortletSession(allowSessionCreation);
 
-//        System.out.println("getExistingApplication: allowSessionCreation="
-//                + allowSessionCreation + ", session=" + session);
-//        System.out.println("  - session.isNew() = " + session.isNew());
-
         if (session == null) {
             throw new SessionExpiredException();
         }
@@ -722,8 +753,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
             RenderResponse response, Window window, Application application)
             throws IOException, MalformedURLException, PortletException {
 
-        // System.out.println("AbstractApplicationPortlet.writeAjaxPage()");
-
         response.setContentType("text/html");
         final BufferedWriter page = new BufferedWriter(new OutputStreamWriter(
                 response.getPortletOutputStream(), "UTF-8"));
@@ -779,8 +808,10 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
                 + "\"] = {");
 
         /*
-         * We need this in order to get uploads to work TODO This may cause
-         * weird side effects on other places where appUri is used!
+         * We need this in order to get uploads to work.
+         * 
+         * TODO This may cause weird side effects on other places where appUri
+         * is used!
          */
         PortletURL appUri = response.createActionURL();
 
index e7c754c9a3fac42cfa368aeb0a4891c22db19400..1c0ab751714bd5174d10caf2615329c24ab5f923 100644 (file)
@@ -31,6 +31,8 @@ import com.vaadin.ui.Window;
 @SuppressWarnings("serial")
 public class PortletCommunicationManager extends AbstractCommunicationManager {
 
+    protected String dummyURL;
+
     private static class PortletRequestWrapper implements Request {
 
         private final PortletRequest request;
@@ -186,13 +188,20 @@ public class PortletCommunicationManager extends AbstractCommunicationManager {
         doHandleFileUpload(new PortletRequestWrapper(request),
                 new PortletResponseWrapper(response));
     }
-    
+
     @Override
     protected void sendUploadResponse(Request request, Response response)
             throws IOException {
         if (response.getWrappedResponse() instanceof ActionResponse) {
-            // FIXME Figure out a better redirect than google... (create a dummy resource URL)
-            ((ActionResponse) response.getWrappedResponse()).sendRedirect("http://www.google.com");
+            /*
+             * If we do not redirect to some other page, the entire portal page
+             * will be re-printed into the target of the upload request (an
+             * IFRAME), which in turn will cause very strange side effects.
+             */
+            System.out.println("Redirecting to dummyURL: " + dummyURL);
+            ((ActionResponse) response.getWrappedResponse())
+                    .sendRedirect(dummyURL == null ? "http://www.google.com"
+                            : dummyURL);
         } else
             super.sendUploadResponse(request, response);
     }