Skip to content

Commit

Permalink
Wrap null values into JsonNull json objects in bootstrap handler(#14594)
Browse files Browse the repository at this point in the history
Change-Id: I1e03bfd1b4eff77e920208892f030582ff877d78
  • Loading branch information
Denis Anisimov committed Jan 10, 2015
1 parent 3a65f98 commit acffa17
Show file tree
Hide file tree
Showing 5 changed files with 208 additions and 26 deletions.
49 changes: 24 additions & 25 deletions server/src/com/vaadin/server/BootstrapHandler.java
Expand Up @@ -513,7 +513,6 @@ protected JsonObject getApplicationParameters(BootstrapContext context)
}

appConfig.put("versionInfo", versionInfo);

appConfig.put("widgetset", context.getWidgetsetName());

// Use locale from session if set, else from the request
Expand All @@ -525,42 +524,32 @@ protected JsonObject getApplicationParameters(BootstrapContext context)
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);
}
Expand Down Expand Up @@ -648,4 +637,14 @@ protected void writeError(VaadinResponse response, Throwable e)
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);
}
}
}
34 changes: 34 additions & 0 deletions uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java
Expand Up @@ -46,6 +46,9 @@
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;
Expand All @@ -61,6 +64,9 @@
@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.
Expand Down Expand Up @@ -339,6 +345,34 @@ protected DeploymentConfiguration createDeploymentConfiguration(
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
Expand Down
107 changes: 107 additions & 0 deletions 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;
}
}
@@ -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")));
}

}
3 changes: 2 additions & 1 deletion uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java
Expand Up @@ -837,7 +837,8 @@ private String getDeploymentPath(Class<?> uiClass) {
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)) {
Expand Down

0 comments on commit acffa17

Please sign in to comment.