]> source.dussan.org Git - vaadin-framework.git/commitdiff
Do not write 404 as a response to all action/event requests (#12056)
authorArtur Signell <artur@vaadin.com>
Thu, 13 Jun 2013 06:45:10 +0000 (09:45 +0300)
committerArtur Signell <artur@vaadin.com>
Thu, 13 Jun 2013 06:46:33 +0000 (09:46 +0300)
Change-Id: I2b820396fc1ccfeb0eefec4456f920a410068ec2

server/src/com/vaadin/server/VaadinPortletResponse.java
server/src/com/vaadin/server/VaadinPortletService.java
server/src/com/vaadin/server/communication/PortletStateAwareRequestHandler.java [new file with mode: 0644]

index f89cb6ea7a83a69ad914110801ea720a5ac45ca1..334b94a5dca649cd0e2d1845c9980bd772d5fab3 100644 (file)
@@ -65,7 +65,13 @@ public class VaadinPortletResponse implements VaadinResponse {
 
     @Override
     public OutputStream getOutputStream() throws IOException {
-        return ((MimeResponse) response).getPortletOutputStream();
+        if (response instanceof MimeResponse) {
+            return ((MimeResponse) response).getPortletOutputStream();
+        } else {
+            throw new IOException(
+                    "Output stream not available for response of type "
+                            + response.getClass().getName());
+        }
     }
 
     /**
index 2eca07dd4a36af3621970c1fbfd837f564bc8462..c7fc5a23bd3b2d9a9967fb84fbbe80dd185e3470 100644 (file)
@@ -32,6 +32,7 @@ import com.vaadin.server.VaadinPortlet.RequestType;
 import com.vaadin.server.communication.PortletBootstrapHandler;
 import com.vaadin.server.communication.PortletDummyRequestHandler;
 import com.vaadin.server.communication.PortletListenerNotifier;
+import com.vaadin.server.communication.PortletStateAwareRequestHandler;
 import com.vaadin.server.communication.PortletUIInitHandler;
 import com.vaadin.ui.UI;
 
@@ -64,6 +65,7 @@ public class VaadinPortletService extends VaadinService {
         handlers.add(new PortletListenerNotifier());
         handlers.add(0, new PortletDummyRequestHandler());
         handlers.add(0, new PortletBootstrapHandler());
+        handlers.add(0, new PortletStateAwareRequestHandler());
 
         return handlers;
     }
diff --git a/server/src/com/vaadin/server/communication/PortletStateAwareRequestHandler.java b/server/src/com/vaadin/server/communication/PortletStateAwareRequestHandler.java
new file mode 100644 (file)
index 0000000..162c479
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.server.communication;
+
+import java.io.IOException;
+
+import javax.portlet.StateAwareResponse;
+
+import com.vaadin.server.RequestHandler;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.server.VaadinResponse;
+import com.vaadin.server.VaadinSession;
+
+/**
+ * Handler which ensures that Action and Event requests are marked as handled
+ * and do not cause a 404 to be sent.
+ * 
+ * @since 7.1
+ * @author Vaadin Ltd
+ */
+public class PortletStateAwareRequestHandler implements RequestHandler {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.vaadin.server.RequestHandler#handleRequest(com.vaadin.server.
+     * VaadinSession, com.vaadin.server.VaadinRequest,
+     * com.vaadin.server.VaadinResponse)
+     */
+    @Override
+    public boolean handleRequest(VaadinSession session, VaadinRequest request,
+            VaadinResponse response) throws IOException {
+        if (response instanceof StateAwareResponse) {
+            // StateAwareResponse is fully handled by listeners through
+            // PortletListenerNotifier
+            return true;
+        }
+        return false;
+    }
+
+}