diff options
author | Denis Anisimov <denis@vaadin.com> | 2014-11-04 13:09:03 +0200 |
---|---|---|
committer | Denis Anisimov <denis@vaadin.com> | 2015-01-10 14:31:57 +0200 |
commit | acffa172b9027cc151cf752867eadabfe896c805 (patch) | |
tree | a7eab1fa60faca934ecdfd4410064bbe24f233e0 | |
parent | 3a65f9869e2e9eccae4b28f0640920f7265cb035 (diff) | |
download | vaadin-framework-acffa172b9027cc151cf752867eadabfe896c805.tar.gz vaadin-framework-acffa172b9027cc151cf752867eadabfe896c805.zip |
Wrap null values into JsonNull json objects in bootstrap handler(#14594)
Change-Id: I1e03bfd1b4eff77e920208892f030582ff877d78
5 files changed, 208 insertions, 26 deletions
diff --git a/server/src/com/vaadin/server/BootstrapHandler.java b/server/src/com/vaadin/server/BootstrapHandler.java index bfe195ccf9..30e43f48a8 100644 --- a/server/src/com/vaadin/server/BootstrapHandler.java +++ b/server/src/com/vaadin/server/BootstrapHandler.java @@ -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); + } + } } diff --git a/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java b/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java index 1cbb1aa039..e2b93ab7d2 100644 --- a/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java +++ b/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java @@ -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 index 0000000000..31ec7658ee --- /dev/null +++ b/uitest/src/com/vaadin/tests/requesthandlers/CommunicationError.java @@ -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 index 0000000000..f295ec5ba3 --- /dev/null +++ b/uitest/src/com/vaadin/tests/requesthandlers/CommunicationErrorTest.java @@ -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"))); + } + +} diff --git a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java index b5a345bd30..2e3d25cbbe 100644 --- a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java +++ b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java @@ -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)) { |