]> source.dussan.org Git - vaadin-framework.git/commitdiff
Wrap null values into JsonNull json objects in bootstrap handler(#14594)
authorDenis Anisimov <denis@vaadin.com>
Tue, 4 Nov 2014 11:09:03 +0000 (13:09 +0200)
committerDenis Anisimov <denis@vaadin.com>
Sat, 10 Jan 2015 12:31:57 +0000 (14:31 +0200)
Change-Id: I1e03bfd1b4eff77e920208892f030582ff877d78

server/src/com/vaadin/server/BootstrapHandler.java
uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java
uitest/src/com/vaadin/tests/requesthandlers/CommunicationError.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/requesthandlers/CommunicationErrorTest.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java

index bfe195ccf95e79e7ab8f773db1374f610e41456a..30e43f48a88aacf52e438af6c9dcb37829186263 100644 (file)
@@ -513,7 +513,6 @@ public abstract class BootstrapHandler extends SynchronizedRequestHandler {
         }
 
         appConfig.put("versionInfo", versionInfo);
-
         appConfig.put("widgetset", context.getWidgetsetName());
 
         // Use locale from session if set, else from the request
@@ -525,42 +524,32 @@ public abstract class BootstrapHandler extends SynchronizedRequestHandler {
         if (systemMessages != null) {
             // Write the CommunicationError -message to client
             JsonObject comErrMsg = Json.createObject();
-            comErrMsg.put("caption",
+            putValueOrNull(comErrMsg, "caption",
                     systemMessages.getCommunicationErrorCaption());
-            comErrMsg.put("message",
+            putValueOrNull(comErrMsg, "message",
                     systemMessages.getCommunicationErrorMessage());
-            if (systemMessages.getCommunicationErrorURL() == null) {
-                comErrMsg.put("url", Json.createNull());
-            } else {
-                comErrMsg.put("url", systemMessages.getCommunicationErrorURL());
-            }
+            putValueOrNull(comErrMsg, "url",
+                    systemMessages.getCommunicationErrorURL());
 
             appConfig.put("comErrMsg", comErrMsg);
 
             JsonObject authErrMsg = Json.createObject();
-            authErrMsg.put("caption",
+            putValueOrNull(authErrMsg, "caption",
                     systemMessages.getAuthenticationErrorCaption());
-            authErrMsg.put("message",
+            putValueOrNull(authErrMsg, "message",
                     systemMessages.getAuthenticationErrorMessage());
-            if (systemMessages.getAuthenticationErrorURL() == null) {
-                authErrMsg.put("url", Json.createNull());
-            } else {
-                authErrMsg.put("url",
-                        systemMessages.getAuthenticationErrorURL());
-            }
+            putValueOrNull(authErrMsg, "url",
+                    systemMessages.getAuthenticationErrorURL());
 
             appConfig.put("authErrMsg", authErrMsg);
 
             JsonObject sessExpMsg = Json.createObject();
-            sessExpMsg
-                    .put("caption", systemMessages.getSessionExpiredCaption());
-            sessExpMsg
-                    .put("message", systemMessages.getSessionExpiredMessage());
-            if (systemMessages.getSessionExpiredURL() == null) {
-                sessExpMsg.put("url", Json.createNull());
-            } else {
-                sessExpMsg.put("url", systemMessages.getSessionExpiredURL());
-            }
+            putValueOrNull(sessExpMsg, "caption",
+                    systemMessages.getSessionExpiredCaption());
+            putValueOrNull(sessExpMsg, "message",
+                    systemMessages.getSessionExpiredMessage());
+            putValueOrNull(sessExpMsg, "url",
+                    systemMessages.getSessionExpiredURL());
 
             appConfig.put("sessExpMsg", sessExpMsg);
         }
@@ -648,4 +637,14 @@ public abstract class BootstrapHandler extends SynchronizedRequestHandler {
         response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                 e.getLocalizedMessage());
     }
+
+    private void putValueOrNull(JsonObject object, String key, String value) {
+        assert object != null;
+        assert key != null;
+        if (value == null) {
+            object.put(key, Json.createNull());
+        } else {
+            object.put(key, value);
+        }
+    }
 }
index 1cbb1aa03974945c8ff8c7c79751a0fe70b1b9ad..e2b93ab7d235465ed1b1658fb52cd37fc465faf5 100644 (file)
@@ -46,6 +46,9 @@ import com.vaadin.server.LegacyVaadinServlet;
 import com.vaadin.server.ServiceException;
 import com.vaadin.server.SessionInitEvent;
 import com.vaadin.server.SessionInitListener;
+import com.vaadin.server.SystemMessages;
+import com.vaadin.server.SystemMessagesInfo;
+import com.vaadin.server.SystemMessagesProvider;
 import com.vaadin.server.UIClassSelectionEvent;
 import com.vaadin.server.UIProvider;
 import com.vaadin.server.VaadinRequest;
@@ -61,6 +64,9 @@ import com.vaadin.util.CurrentInstance;
 @SuppressWarnings("serial")
 public class ApplicationRunnerServlet extends LegacyVaadinServlet {
 
+    public static String CUSTOM_SYSTEM_MESSAGES_PROPERTY = "custom-"
+            + SystemMessages.class.getName();
+
     /**
      * The name of the application class currently used. Only valid within one
      * request.
@@ -339,6 +345,34 @@ public class ApplicationRunnerServlet extends LegacyVaadinServlet {
                 new ProxyDeploymentConfiguration(originalConfiguration));
     }
 
+    @Override
+    protected VaadinServletService createServletService(
+            DeploymentConfiguration deploymentConfiguration)
+            throws ServiceException {
+        VaadinServletService service = super
+                .createServletService(deploymentConfiguration);
+        final SystemMessagesProvider provider = service
+                .getSystemMessagesProvider();
+        service.setSystemMessagesProvider(new SystemMessagesProvider() {
+
+            @Override
+            public SystemMessages getSystemMessages(
+                    SystemMessagesInfo systemMessagesInfo) {
+                if (systemMessagesInfo.getRequest() == null) {
+                    return provider.getSystemMessages(systemMessagesInfo);
+                }
+                Object messages = systemMessagesInfo.getRequest().getAttribute(
+                        CUSTOM_SYSTEM_MESSAGES_PROPERTY);
+                if (messages instanceof SystemMessages) {
+                    return (SystemMessages) messages;
+                }
+                return provider.getSystemMessages(systemMessagesInfo);
+            }
+
+        });
+        return service;
+    }
+
     private static DeploymentConfiguration findDeploymentConfiguration(
             DeploymentConfiguration originalConfiguration) throws Exception {
         // First level of cache
diff --git a/uitest/src/com/vaadin/tests/requesthandlers/CommunicationError.java b/uitest/src/com/vaadin/tests/requesthandlers/CommunicationError.java
new file mode 100644 (file)
index 0000000..31ec765
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2000-2014 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.tests.requesthandlers;
+
+import com.vaadin.launcher.ApplicationRunnerServlet;
+import com.vaadin.server.CustomizedSystemMessages;
+import com.vaadin.server.SystemMessages;
+import com.vaadin.server.UIClassSelectionEvent;
+import com.vaadin.server.UIProvider;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.server.VaadinService;
+import com.vaadin.server.VaadinServletRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.UI;
+
+/**
+ * Test UI provider to check communication error json object null values.
+ * 
+ * @author Vaadin Ltd
+ */
+public class CommunicationError extends UIProvider {
+
+    @Override
+    public Class<? extends UI> getUIClass(UIClassSelectionEvent event) {
+        VaadinServletRequest request = (VaadinServletRequest) event
+                .getRequest();
+        String currentUrl = request.getRequestURL().toString();
+        StringBuilder redirectClass = new StringBuilder(
+                CommunicationError.class.getSimpleName());
+        redirectClass.append('$');
+        redirectClass.append(RedirectedUI.class.getSimpleName());
+
+        String restartApplication = "?restartApplication";
+        if (!currentUrl.contains(restartApplication)) {
+            redirectClass.append(restartApplication);
+        }
+        final String url = currentUrl.replace(
+                CommunicationError.class.getSimpleName(), redirectClass);
+
+        request.setAttribute(
+                ApplicationRunnerServlet.CUSTOM_SYSTEM_MESSAGES_PROPERTY,
+                createSystemMessages(url));
+
+        return CommunicationErrorUI.class;
+    }
+
+    public static class CommunicationErrorUI extends AbstractTestUI {
+
+        @Override
+        protected void setup(VaadinRequest request) {
+            Button button = new Button("Send bad request",
+                    new Button.ClickListener() {
+
+                        @Override
+                        public void buttonClick(ClickEvent event) {
+                            VaadinService.getCurrentResponse().setStatus(400);
+                        }
+                    });
+            addComponent(button);
+        }
+
+        @Override
+        protected Integer getTicketNumber() {
+            return 14594;
+        }
+
+        @Override
+        protected String getTestDescription() {
+            return "Null values should be wrapped into JsonNull objects.";
+        }
+    }
+
+    public static class RedirectedUI extends UI {
+
+        @Override
+        protected void init(VaadinRequest request) {
+            Label label = new Label("redirected");
+            label.addStyleName("redirected");
+            setContent(label);
+        }
+
+    }
+
+    private SystemMessages createSystemMessages(String url) {
+        CustomizedSystemMessages messages = new CustomizedSystemMessages();
+        messages.setCommunicationErrorCaption(null);
+        messages.setCommunicationErrorMessage(null);
+        messages.setCommunicationErrorURL(url);
+        return messages;
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/requesthandlers/CommunicationErrorTest.java b/uitest/src/com/vaadin/tests/requesthandlers/CommunicationErrorTest.java
new file mode 100644 (file)
index 0000000..f295ec5
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2000-2014 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.tests.requesthandlers;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Test for null values in communication error json object .
+ * 
+ * @author Vaadin Ltd
+ */
+public class CommunicationErrorTest extends MultiBrowserTest {
+
+    @Test
+    public void testRedirection() {
+        openTestURL();
+
+        $(ButtonElement.class).first().click();
+
+        Assert.assertTrue(isElementPresent(By.className("redirected")));
+    }
+
+}
index b5a345bd3004bc1d9e3da6b3f247e8072783ab87..2e3d25cbbe407a93cfa435dc3049606d44836180 100644 (file)
@@ -837,7 +837,8 @@ public abstract class AbstractTB3Test extends TestBenchTestCase {
             runPath = "/run-push";
         }
 
-        if (UI.class.isAssignableFrom(uiClass)) {
+        if (UI.class.isAssignableFrom(uiClass)
+                || UIProvider.class.isAssignableFrom(uiClass)) {
             return runPath + "/" + uiClass.getCanonicalName()
                     + (isDebug() ? "?debug" : "");
         } else if (LegacyApplication.class.isAssignableFrom(uiClass)) {