]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add SystemMessagesProvider for getting messages for a Locale (#4127) 65/65/2
authorLeif Åstrand <leif@vaadin.com>
Fri, 5 Oct 2012 07:32:48 +0000 (10:32 +0300)
committerLeif Åstrand <leif@vaadin.com>
Mon, 8 Oct 2012 07:18:31 +0000 (10:18 +0300)
Also add an internal helper for finding the most suitable Locale based
on the currently available information.

Change-Id: Ie9893db4be5ace7b0d60c030b7ca383359500525

server/src/com/vaadin/server/AbstractCommunicationManager.java
server/src/com/vaadin/server/BootstrapHandler.java
server/src/com/vaadin/server/DefaultSystemMessagesProvider.java [new file with mode: 0644]
server/src/com/vaadin/server/ServletPortletHelper.java
server/src/com/vaadin/server/SystemMessagesProvider.java [new file with mode: 0644]
server/src/com/vaadin/server/VaadinPortlet.java
server/src/com/vaadin/server/VaadinPortletService.java
server/src/com/vaadin/server/VaadinService.java
server/src/com/vaadin/server/VaadinServlet.java
server/src/com/vaadin/server/VaadinServletService.java

index 19b53c8a7a2b1645ddaa541aa6264eedac711418..0a3b18b86bc85f569a2b9660abed0bef2db05f82 100644 (file)
@@ -593,7 +593,8 @@ public abstract class AbstractCommunicationManager implements Serializable {
             if (!handleVariables(request, response, callback, session, uI)) {
 
                 // var inconsistency; the client is probably out-of-sync
-                SystemMessages ci = response.getService().getSystemMessages();
+                SystemMessages ci = response.getService().getSystemMessages(
+                        uI.getLocale());
                 String msg = ci.getOutOfSyncMessage();
                 String cap = ci.getOutOfSyncCaption();
                 if (msg != null || cap != null) {
@@ -1049,7 +1050,8 @@ public abstract class AbstractCommunicationManager implements Serializable {
                 }
             }
 
-            SystemMessages ci = request.getService().getSystemMessages();
+            SystemMessages ci = request.getService().getSystemMessages(
+                    ui.getLocale());
 
             // meta instruction for client to enable auto-forward to
             // sessionExpiredURL after timer expires.
index e10351b4addc27e2fe0b3e74f270562ae5d05c7a..c08d3bdbb1510cff4e3bacf3d54f22b95e69fe3a 100644 (file)
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
@@ -430,8 +431,11 @@ public abstract class BootstrapHandler implements RequestHandler {
 
         appConfig.put("initialParams", parameterMap);
 
+        // Use locale from session if set, else from the request
+        Locale locale = ServletPortletHelper.findLocale(null,
+                context.getSession(), context.getRequest());
         // Get system messages
-        SystemMessages systemMessages = vaadinService.getSystemMessages();
+        SystemMessages systemMessages = vaadinService.getSystemMessages(locale);
         if (systemMessages != null) {
             // Write the CommunicationError -message to client
             JSONObject comErrMsg = new JSONObject();
diff --git a/server/src/com/vaadin/server/DefaultSystemMessagesProvider.java b/server/src/com/vaadin/server/DefaultSystemMessagesProvider.java
new file mode 100644 (file)
index 0000000..08042d3
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 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;
+
+import java.util.Locale;
+
+/**
+ * System messages provider using the built-in default system messages. This
+ * singleton is accessed using {@link #get()}.
+ * 
+ * @author Vaadin Ltd
+ * @since 7.0.0
+ */
+public class DefaultSystemMessagesProvider implements SystemMessagesProvider {
+
+    private static final DefaultSystemMessagesProvider instance = new DefaultSystemMessagesProvider();
+
+    private DefaultSystemMessagesProvider() {
+        // Singleton
+    }
+
+    @Override
+    public SystemMessages getSystemMessages(Locale locale) {
+        return ServletPortletHelper.DEFAULT_SYSTEM_MESSAGES;
+    }
+
+    /**
+     * Gets the instance.
+     * 
+     * @return the default system messages provider.
+     */
+    public static SystemMessagesProvider get() {
+        return instance;
+    }
+
+}
index 2611183b236256982a337eb81a4b2d7ac28dab17..ab03e0cc063c76be02bd415675cbb7b69ac9ee8d 100644 (file)
@@ -1,10 +1,12 @@
 package com.vaadin.server;
 
 import java.io.Serializable;
+import java.util.Locale;
 import java.util.Properties;
 
 import com.vaadin.LegacyApplication;
 import com.vaadin.shared.ApplicationConstants;
+import com.vaadin.ui.Component;
 import com.vaadin.ui.UI;
 
 /*
@@ -173,4 +175,52 @@ class ServletPortletHelper implements Serializable {
         }
     }
 
+    /**
+     * Helper to find the most most suitable Locale. These potential sources are
+     * checked in order until a Locale is found:
+     * <ol>
+     * <li>The passed component (or UI) if not null</li>
+     * <li>{@link UI#getCurrent()} if defined</li>
+     * <li>The passed session if not null</li>
+     * <li>{@link VaadinServiceSession#getCurrent()} if defined</li>
+     * <li>The passed request if not null</li>
+     * <li>{@link VaadinService#getCurrentRequest()} if defined</li>
+     * <li>{@link Locale#getDefault()}</li>
+     * </ol>
+     */
+    static Locale findLocale(Component component, VaadinServiceSession session,
+            VaadinRequest request) {
+        if (component == null) {
+            component = UI.getCurrent();
+        }
+        if (component != null) {
+            Locale locale = component.getLocale();
+            if (locale != null) {
+                return locale;
+            }
+        }
+
+        if (session == null) {
+            session = VaadinServiceSession.getCurrent();
+        }
+        if (session != null) {
+            Locale locale = session.getLocale();
+            if (locale != null) {
+                return locale;
+            }
+        }
+
+        if (request == null) {
+            request = VaadinService.getCurrentRequest();
+        }
+        if (request != null) {
+            Locale locale = request.getLocale();
+            if (locale != null) {
+                return locale;
+            }
+        }
+
+        return Locale.getDefault();
+    }
+
 }
diff --git a/server/src/com/vaadin/server/SystemMessagesProvider.java b/server/src/com/vaadin/server/SystemMessagesProvider.java
new file mode 100644 (file)
index 0000000..82d1014
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 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;
+
+import java.io.Serializable;
+import java.util.Locale;
+
+import com.vaadin.ui.UI;
+
+/**
+ * Gives out system messages based on Locale. Registered using
+ * {@link VaadinService#setSystemMessagesProvider(SystemMessagesProvider)}.
+ * 
+ * @author Vaadin Ltd
+ * @since 7.0.0
+ */
+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 VaadinServiceSession#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
+     * @return a system messages object
+     */
+    public SystemMessages getSystemMessages(Locale locale);
+}
index 231a4632220ba3133e46ff6d87d5172b90468211..95178ade17140a18e5321a680cdeb5debb3ccd80 100644 (file)
@@ -627,7 +627,9 @@ public class VaadinPortlet extends GenericPortlet implements Constants {
 
         // if this was an UIDL request, response UIDL back to client
         if (getRequestType(request) == RequestType.UIDL) {
-            SystemMessages ci = getService().getSystemMessages();
+            SystemMessages ci = getService().getSystemMessages(
+                    ServletPortletHelper.findLocale(null, vaadinSession,
+                            request));
             criticalNotification(request, response,
                     ci.getInternalErrorCaption(), ci.getInternalErrorMessage(),
                     null, ci.getInternalErrorURL());
index aa81c39d9dfbaad6846b5eabb41a8259c96305da..ac48900945bcefa29f8e69732c63de15ca46ee4b 100644 (file)
@@ -111,11 +111,6 @@ public class VaadinPortletService extends VaadinService {
         return getPortlet().getPortletContext().getMimeType(resourceName);
     }
 
-    @Override
-    public SystemMessages getSystemMessages() {
-        return ServletPortletHelper.DEFAULT_SYSTEM_MESSAGES;
-    }
-
     @Override
     public File getBaseDirectory() {
         PortletContext context = getPortlet().getPortletContext();
index c56d6caeb5902c595716dcecf17534963866d2a4..28684ec8dc94d81810fe82b59eefebb09b308083 100644 (file)
@@ -77,6 +77,9 @@ public abstract class VaadinService implements Serializable {
 
     private final EventRouter eventRouter = new EventRouter();
 
+    private SystemMessagesProvider systemMessagesProvider = DefaultSystemMessagesProvider
+            .get();
+
     /**
      * Creates a new vaadin service based on a deployment configuration
      * 
@@ -206,11 +209,54 @@ public abstract class VaadinService implements Serializable {
     }
 
     /**
-     * Gets the system messages object
+     * Sets the system messages provider to use for getting system messages to
+     * display to users of this service.
+     * 
+     * @see #getSystemMessagesProvider()
+     * 
+     * @param systemMessagesProvider
+     *            the system messages provider; <code>null</code> is not
+     *            allowed.
+     */
+    public void setSystemMessagesProvider(
+            SystemMessagesProvider systemMessagesProvider) {
+        if (systemMessagesProvider == null) {
+            throw new IllegalArgumentException(
+                    "SystemMessagesProvider can not be null.");
+        }
+        this.systemMessagesProvider = systemMessagesProvider;
+    }
+
+    /**
+     * Gets the system messages provider currently defined for this service.
+     * <p>
+     * By default, the {@link DefaultSystemMessagesProvider} which always
+     * provides the built-in default {@link SystemMessages} is used.
+     * </p>
      * 
-     * @return the system messages object
+     * @see #setSystemMessagesProvider(SystemMessagesProvider)
+     * @see SystemMessagesProvider
+     * @see SystemMessages
+     * 
+     * @return the system messages provider; not <code>null</code>
+     */
+    public SystemMessagesProvider getSystemMessagesProvider() {
+        return systemMessagesProvider;
+    }
+
+    /**
+     * Gets the system message to use for a specific locale. This method may
+     * also be implemented to use information from current instances of various
+     * objects, which means that this method might return different values for
+     * the same locale under different circumstances.
+     * 
+     * @param locale
+     *            the desired locale for the system messages
+     * @return the system messages to use
      */
-    public abstract SystemMessages getSystemMessages();
+    public SystemMessages getSystemMessages(Locale locale) {
+        return getSystemMessagesProvider().getSystemMessages(locale);
+    }
 
     /**
      * Returns the context base directory.
index eb375e0b92e422b558865543ebb9565ff3a87f47..bd724aad63f554b4d2e6e00701928f72cac86d22 100644 (file)
@@ -378,8 +378,8 @@ public class VaadinServlet extends HttpServlet implements Constants {
             // This can be removed if cookieless mode (#3228) is supported
             if (request.getRequestedSessionId() == null) {
                 // User has cookies disabled
-                SystemMessages systemMessages = getService()
-                        .getSystemMessages();
+                SystemMessages systemMessages = getService().getSystemMessages(
+                        ServletPortletHelper.findLocale(null, null, request));
                 criticalNotification(request, response,
                         systemMessages.getCookiesDisabledCaption(),
                         systemMessages.getCookiesDisabledMessage(), null,
@@ -535,7 +535,9 @@ public class VaadinServlet extends HttpServlet implements Constants {
             Throwable e) throws IOException, ServletException {
         // if this was an UIDL request, response UIDL back to client
         if (getRequestType(request) == RequestType.UIDL) {
-            SystemMessages ci = getService().getSystemMessages();
+            SystemMessages ci = getService().getSystemMessages(
+                    ServletPortletHelper.findLocale(null, vaadinSession,
+                            request));
             criticalNotification(request, response,
                     ci.getInternalErrorCaption(), ci.getInternalErrorMessage(),
                     null, ci.getInternalErrorURL());
@@ -610,7 +612,8 @@ public class VaadinServlet extends HttpServlet implements Constants {
         }
 
         try {
-            SystemMessages ci = getService().getSystemMessages();
+            SystemMessages ci = getService().getSystemMessages(
+                    ServletPortletHelper.findLocale(null, null, request));
             RequestType requestType = getRequestType(request);
             if (requestType == RequestType.UIDL) {
                 /*
@@ -655,7 +658,12 @@ public class VaadinServlet extends HttpServlet implements Constants {
         }
 
         try {
-            SystemMessages ci = getService().getSystemMessages();
+            /*
+             * We might have a UI, but we don't want to leak any information in
+             * this case so just use the info provided in the request.
+             */
+            SystemMessages ci = getService().getSystemMessages(
+                    request.getLocale());
             RequestType requestType = getRequestType(request);
             if (requestType == RequestType.UIDL) {
                 // send uidl redirect
index d746ee2303b5d0cdac4b864e6c748ca8013c63b8..b8af3b13fb4b501c3c5ae5e47fb36fc37816a1d1 100644 (file)
@@ -100,11 +100,6 @@ public class VaadinServletService extends VaadinService {
         return getServlet().getServletContext().getMimeType(resourceName);
     }
 
-    @Override
-    public SystemMessages getSystemMessages() {
-        return ServletPortletHelper.DEFAULT_SYSTEM_MESSAGES;
-    }
-
     @Override
     public File getBaseDirectory() {
         final String realPath = VaadinServlet.getResourcePath(