]> source.dussan.org Git - vaadin-framework.git/commitdiff
Changed SystemMessagesProvider parameter into object (#10226) 91/291/2
authorArtur Signell <artur@vaadin.com>
Mon, 19 Nov 2012 18:19:47 +0000 (20:19 +0200)
committerArtur Signell <artur@vaadin.com>
Mon, 19 Nov 2012 18:31:46 +0000 (20:31 +0200)
Change-Id: I7ba22460ae5105e29b88b17bc3e3ac664e9ca980

server/src/com/vaadin/server/AbstractCommunicationManager.java
server/src/com/vaadin/server/BootstrapHandler.java
server/src/com/vaadin/server/DefaultSystemMessagesProvider.java
server/src/com/vaadin/server/SystemMessages.java
server/src/com/vaadin/server/SystemMessagesInfo.java [new file with mode: 0644]
server/src/com/vaadin/server/SystemMessagesProvider.java
server/src/com/vaadin/server/VaadinPortlet.java
server/src/com/vaadin/server/VaadinService.java
server/src/com/vaadin/server/VaadinServlet.java
uitest/src/com/vaadin/tests/applicationservlet/SystemMessagesTest.html [new file with mode: 0644]
uitest/src/com/vaadin/tests/applicationservlet/SystemMessagesTest.java [new file with mode: 0644]

index 148108524771388186fc7a8cee616c6fabfcac88..834d7d8a17377f78a8af5d73c5fff498e412b285 100644 (file)
@@ -590,7 +590,7 @@ public abstract class AbstractCommunicationManager implements Serializable {
 
                 // var inconsistency; the client is probably out-of-sync
                 SystemMessages ci = response.getService().getSystemMessages(
-                        uI.getLocale());
+                        uI.getLocale(), request);
                 String msg = ci.getOutOfSyncMessage();
                 String cap = ci.getOutOfSyncCaption();
                 if (msg != null || cap != null) {
@@ -1042,7 +1042,7 @@ public abstract class AbstractCommunicationManager implements Serializable {
             }
 
             SystemMessages ci = request.getService().getSystemMessages(
-                    ui.getLocale());
+                    ui.getLocale(), request);
 
             // meta instruction for client to enable auto-forward to
             // sessionExpiredURL after timer expires.
index d0e87d5e08f4a82bd6fa5ff7de2e6458c061855c..36a09253d9b3a18b5b30a24e22ae35cd8c8747a8 100644 (file)
@@ -413,7 +413,8 @@ public abstract class BootstrapHandler implements RequestHandler {
         Locale locale = ServletPortletHelper.findLocale(null,
                 context.getSession(), context.getRequest());
         // Get system messages
-        SystemMessages systemMessages = vaadinService.getSystemMessages(locale);
+        SystemMessages systemMessages = vaadinService.getSystemMessages(locale,
+                request);
         if (systemMessages != null) {
             // Write the CommunicationError -message to client
             JSONObject comErrMsg = new JSONObject();
index 08042d384840059ea095c816a6a10d3f00f2d669..7111a8bbbb23c2cbbed20129d82923476a94d966 100644 (file)
@@ -16,7 +16,6 @@
 
 package com.vaadin.server;
 
-import java.util.Locale;
 
 /**
  * System messages provider using the built-in default system messages. This
@@ -34,7 +33,8 @@ public class DefaultSystemMessagesProvider implements SystemMessagesProvider {
     }
 
     @Override
-    public SystemMessages getSystemMessages(Locale locale) {
+    public SystemMessages getSystemMessages(
+            SystemMessagesInfo systemMessagesInfo) {
         return ServletPortletHelper.DEFAULT_SYSTEM_MESSAGES;
     }
 
index 647266d8e35c85f2e1843c284025b937778ed9e1..f36a8e85708e96d1a341fdfe841c2d42947dc31d 100644 (file)
@@ -22,8 +22,8 @@ import java.io.Serializable;
  * Contains the system messages used to notify the user about various critical
  * situations that can occur.
  * <p>
- * Customize by overriding the static {@link VaadinSession#getSystemMessages()}
- * and returning {@link CustomizedSystemMessages}.
+ * Use {@link VaadinService#setSystemMessagesProvider(SystemMessagesProvider)}
+ * to customize.
  * </p>
  * <p>
  * The defaults defined in this class are:
diff --git a/server/src/com/vaadin/server/SystemMessagesInfo.java b/server/src/com/vaadin/server/SystemMessagesInfo.java
new file mode 100644 (file)
index 0000000..30a6e82
--- /dev/null
@@ -0,0 +1,53 @@
+package com.vaadin.server;\r
+\r
+import java.io.Serializable;\r
+import java.util.Locale;\r
+\r
+public class SystemMessagesInfo implements Serializable {\r
+\r
+    private Locale locale;\r
+    private VaadinRequest request;\r
+    private VaadinService service;\r
+\r
+    /**\r
+     * The locale of the UI related to the {@link SystemMessages} request.\r
+     * \r
+     * @return The Locale or null if the locale is not known\r
+     */\r
+    public Locale getLocale() {\r
+        return locale;\r
+    }\r
+\r
+    public void setLocale(Locale locale) {\r
+        this.locale = locale;\r
+    }\r
+\r
+    /**\r
+     * Gets the request currently in progress.\r
+     * \r
+     * @return The request currently in progress or null if no request is in\r
+     *         progress.\r
+     */\r
+    public VaadinRequest getRequest() {\r
+        return request;\r
+    }\r
+\r
+    public void setRequest(VaadinRequest request) {\r
+        this.request = request;\r
+    }\r
+\r
+    /**\r
+     * Returns the service this SystemMessages request comes from.\r
+     * \r
+     * @return The service which triggered this request or null of not triggered\r
+     *         from a service.\r
+     */\r
+    public VaadinService getService() {\r
+        return service;\r
+    }\r
+\r
+    public void setService(VaadinService service) {\r
+        this.service = service;\r
+    }\r
+\r
+}\r
index 21263a2950b3146226c059e5bd00082b6453ea71..caef8de4205ae91982eed2b708008e2bdad43ed3 100644 (file)
@@ -17,7 +17,6 @@
 package com.vaadin.server;
 
 import java.io.Serializable;
-import java.util.Locale;
 
 import com.vaadin.ui.UI;
 
@@ -30,16 +29,16 @@ import com.vaadin.ui.UI;
  */
 public interface SystemMessagesProvider extends Serializable {
     /**
-     * Gets the system messages to use in the given context. Locale is the only
-     * piece of information guaranteed to be available, but in most cases some
-     * or all of {@link VaadinService#getCurrent()},
-     * {@link VaadinService#getCurrentRequest()},
-     * {@link VaadinSession#getCurrent()} and {@link UI#getCurrent()} can also
-     * be used to find more information to help the decision.
+     * Gets the system messages to use in the given context. The
+     * {@link SystemMessagesInfo} object contains available information but in
+     * most cases some or both of {@link VaadinSession#getCurrent()} and
+     * {@link UI#getCurrent()} can also be used to find more information to help
+     * the decision.
      * 
-     * @param locale
-     *            the desired locale of the system messages
+     * @param systemMessagesInfo
+     *            Locale, current request and other information available.
      * @return a system messages object
      */
-    public SystemMessages getSystemMessages(Locale locale);
+    public SystemMessages getSystemMessages(
+            SystemMessagesInfo systemMessagesInfo);
 }
index 51a71f1cd614ed772975a583422e6d55fb5743bb..b1843ce9e5144623f75a4f06a5caad3dd6055fee 100644 (file)
@@ -628,7 +628,7 @@ public class VaadinPortlet extends GenericPortlet implements Constants {
         if (getRequestType(request) == RequestType.UIDL) {
             SystemMessages ci = getService().getSystemMessages(
                     ServletPortletHelper.findLocale(null, vaadinSession,
-                            request));
+                            request), request);
             criticalNotification(request, response,
                     ci.getInternalErrorCaption(), ci.getInternalErrorMessage(),
                     null, ci.getInternalErrorURL());
index 2a3c04c49e0a3f1853e8eff78642ec9bf484c323..a4caf6cdd6b66aba259cce6f8fb50772686e9c2c 100644 (file)
@@ -250,10 +250,16 @@ public abstract class VaadinService implements Serializable {
      * 
      * @param locale
      *            the desired locale for the system messages
+     * @param request
      * @return the system messages to use
      */
-    public SystemMessages getSystemMessages(Locale locale) {
-        return getSystemMessagesProvider().getSystemMessages(locale);
+    public SystemMessages getSystemMessages(Locale locale, VaadinRequest request) {
+        SystemMessagesInfo systemMessagesInfo = new SystemMessagesInfo();
+        systemMessagesInfo.setLocale(locale);
+        systemMessagesInfo.setService(this);
+        systemMessagesInfo.setRequest(request);
+        return getSystemMessagesProvider()
+                .getSystemMessages(systemMessagesInfo);
     }
 
     /**
index 48e5304cc7a2504797c3729e56818828695c30fa..2ef95508231ffdcedc82fa4fafb709bd55237e04 100644 (file)
@@ -418,7 +418,8 @@ public class VaadinServlet extends HttpServlet implements Constants {
             if (request.getRequestedSessionId() == null) {
                 // User has cookies disabled
                 SystemMessages systemMessages = getService().getSystemMessages(
-                        ServletPortletHelper.findLocale(null, null, request));
+                        ServletPortletHelper.findLocale(null, null, request),
+                        request);
                 criticalNotification(request, response,
                         systemMessages.getCookiesDisabledCaption(),
                         systemMessages.getCookiesDisabledMessage(), null,
@@ -576,7 +577,7 @@ public class VaadinServlet extends HttpServlet implements Constants {
         if (getRequestType(request) == RequestType.UIDL) {
             SystemMessages ci = getService().getSystemMessages(
                     ServletPortletHelper.findLocale(null, vaadinSession,
-                            request));
+                            request), request);
             criticalNotification(request, response,
                     ci.getInternalErrorCaption(), ci.getInternalErrorMessage(),
                     null, ci.getInternalErrorURL());
@@ -652,7 +653,8 @@ public class VaadinServlet extends HttpServlet implements Constants {
 
         try {
             SystemMessages ci = getService().getSystemMessages(
-                    ServletPortletHelper.findLocale(null, null, request));
+                    ServletPortletHelper.findLocale(null, null, request),
+                    request);
             RequestType requestType = getRequestType(request);
             if (requestType == RequestType.UIDL) {
                 /*
@@ -702,7 +704,7 @@ public class VaadinServlet extends HttpServlet implements Constants {
              * this case so just use the info provided in the request.
              */
             SystemMessages ci = getService().getSystemMessages(
-                    request.getLocale());
+                    request.getLocale(), request);
             RequestType requestType = getRequestType(request);
             if (requestType == RequestType.UIDL) {
                 // send uidl redirect
diff --git a/uitest/src/com/vaadin/tests/applicationservlet/SystemMessagesTest.html b/uitest/src/com/vaadin/tests/applicationservlet/SystemMessagesTest.html
new file mode 100644 (file)
index 0000000..a764255
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\r
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">\r
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+<link rel="selenium.base" href="http://localhost:8888/" />\r
+<title>New Test</title>\r
+</head>\r
+<body>\r
+<table cellpadding="1" cellspacing="1" border="1">\r
+<thead>\r
+<tr><td rowspan="1" colspan="3">New Test</td></tr>\r
+</thead><tbody>\r
+<tr>\r
+       <td>open</td>\r
+       <td>/run/com.vaadin.tests.applicationservlet.SystemMessagesTest?restartApplication</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>click</td>\r
+       <td>vaadin=runcomvaadintestsapplicationservletSystemMessagesTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>assertText</td>\r
+       <td>vaadin=runcomvaadintestsapplicationservletSystemMessagesTest::Root/VNotification[0]/domChild[0]</td>\r
+       <td>Internal error*MessagesInfo locale: fi_FI</td>\r
+</tr>\r
+<tr>\r
+       <td>open</td>\r
+       <td>/run/com.vaadin.tests.applicationservlet.SystemMessagesTest?restartApplication</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>select</td>\r
+       <td>vaadin=runcomvaadintestsapplicationservletSystemMessagesTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VNativeSelect[0]/domChild[0]</td>\r
+       <td>label=de_DE</td>\r
+</tr>\r
+<tr>\r
+       <td>click</td>\r
+       <td>vaadin=runcomvaadintestsapplicationservletSystemMessagesTest::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>\r
+       <td></td>\r
+</tr>\r
+<tr>\r
+       <td>assertText</td>\r
+       <td>vaadin=runcomvaadintestsapplicationservletSystemMessagesTest::Root/VNotification[0]/domChild[0]</td>\r
+       <td>Internal error*MessagesInfo locale: de_DE</td>\r
+</tr>\r
+\r
+</tbody></table>\r
+</body>\r
+</html>\r
diff --git a/uitest/src/com/vaadin/tests/applicationservlet/SystemMessagesTest.java b/uitest/src/com/vaadin/tests/applicationservlet/SystemMessagesTest.java
new file mode 100644 (file)
index 0000000..516c0ca
--- /dev/null
@@ -0,0 +1,90 @@
+package com.vaadin.tests.applicationservlet;\r
+\r
+import java.util.Locale;\r
+\r
+import com.vaadin.data.Property.ValueChangeEvent;\r
+import com.vaadin.data.Property.ValueChangeListener;\r
+import com.vaadin.server.CustomizedSystemMessages;\r
+import com.vaadin.server.SystemMessages;\r
+import com.vaadin.server.SystemMessagesInfo;\r
+import com.vaadin.server.SystemMessagesProvider;\r
+import com.vaadin.server.VaadinRequest;\r
+import com.vaadin.tests.components.AbstractTestUI;\r
+import com.vaadin.ui.Button;\r
+import com.vaadin.ui.Button.ClickEvent;\r
+import com.vaadin.ui.Button.ClickListener;\r
+import com.vaadin.ui.NativeSelect;\r
+\r
+public class SystemMessagesTest extends AbstractTestUI {\r
+\r
+    public class MyButton extends Button {\r
+        private boolean fail = false;\r
+\r
+        @Override\r
+        public void beforeClientResponse(boolean initial) {\r
+            super.beforeClientResponse(initial);\r
+            if (fail) {\r
+                throw new RuntimeException("Failed on purpose");\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    @Override\r
+    protected void setup(VaadinRequest request) {\r
+        final NativeSelect localeSelect = new NativeSelect("UI locale");\r
+        localeSelect.setImmediate(true);\r
+        localeSelect.addItem(new Locale("en", "US"));\r
+        localeSelect.addItem(new Locale("fi", "FI"));\r
+        localeSelect.addItem(Locale.GERMANY);\r
+        localeSelect.addValueChangeListener(new ValueChangeListener() {\r
+\r
+            @Override\r
+            public void valueChange(ValueChangeEvent event) {\r
+                setLocale((Locale) localeSelect.getValue());\r
+                getSession().getService().setSystemMessagesProvider(\r
+                        new SystemMessagesProvider() {\r
+\r
+                            @Override\r
+                            public SystemMessages getSystemMessages(\r
+                                    SystemMessagesInfo systemMessagesInfo) {\r
+                                CustomizedSystemMessages csm = new CustomizedSystemMessages();\r
+                                // csm.setInternalErrorCaption("Request query string: "\r
+                                // + ((VaadinServletRequest) systemMessagesInfo\r
+                                // .getRequest()).getQueryString());\r
+                                csm.setInternalErrorMessage("MessagesInfo locale: "\r
+                                        + systemMessagesInfo.getLocale());\r
+                                return csm;\r
+\r
+                            }\r
+                        });\r
+            }\r
+        });\r
+        localeSelect.setValue(new Locale("fi", "FI"));\r
+        addComponent(localeSelect);\r
+        final MyButton failButton = new MyButton();\r
+        failButton.setCaption("Generate server side error");\r
+        failButton.addClickListener(new ClickListener() {\r
+\r
+            @Override\r
+            public void buttonClick(ClickEvent event) {\r
+                failButton.fail = true;\r
+            }\r
+        });\r
+        addComponent(failButton);\r
+\r
+    }\r
+\r
+    @Override\r
+    protected String getTestDescription() {\r
+        // TODO Auto-generated method stub\r
+        return null;\r
+    }\r
+\r
+    @Override\r
+    protected Integer getTicketNumber() {\r
+        // TODO Auto-generated method stub\r
+        return null;\r
+    }\r
+\r
+}\r