You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2009/02/26 19:56:30 UTC

svn commit: r748272 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/PersistentLocaleImpl.java test/java/org/apache/tapestry5/internal/services/PersistentLocaleImplTest.java

Author: hlship
Date: Thu Feb 26 18:56:29 2009
New Revision: 748272

URL: http://svn.apache.org/viewvc?rev=748272&view=rev
Log:
TAP5-537: PersistentLocale.setLocale() allows the application to set a locale that isn't supported, and the subsequent URL may not be interpreted correctly

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PersistentLocaleImplTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PersistentLocaleImpl.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PersistentLocaleImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PersistentLocaleImpl.java?rev=748272&r1=748271&r2=748272&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PersistentLocaleImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PersistentLocaleImpl.java Thu Feb 26 18:56:29 2009
@@ -14,30 +14,64 @@
 
 package org.apache.tapestry5.internal.services;
 
-import org.apache.tapestry5.ioc.ScopeConstants;
-import org.apache.tapestry5.ioc.annotations.Scope;
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.internal.TapestryInternalUtils;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.Defense;
+import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.services.PersistentLocale;
 
 import java.util.Locale;
+import java.util.Set;
 
-@Scope(ScopeConstants.PERTHREAD)
 public class PersistentLocaleImpl implements PersistentLocale
 {
-    private Locale locale;
+    private final PerthreadManager perThreadManager;
+
+    private final String supportedLocales;
+
+    private final Set<String> localeNames = CollectionFactory.newSet();
+
+    public PersistentLocaleImpl(PerthreadManager perThreadManager,
+
+                                @Inject @Symbol(SymbolConstants.SUPPORTED_LOCALES)
+                                String supportedLocales)
+    {
+        this.perThreadManager = perThreadManager;
+        this.supportedLocales = supportedLocales;
+
+        for (String name : TapestryInternalUtils.splitAtCommas(supportedLocales))
+        {
+            localeNames.add(name.toLowerCase());
+        }
+    }
 
     public void set(Locale locale)
     {
-        this.locale = Defense.notNull(locale, "locale");
+        Defense.notNull(locale, "locale");
+
+        if (!localeNames.contains(locale.toString().toLowerCase()))
+        {
+            String message = String.format(
+                    "Locale '%s' is not supported by this application. Supported locales are '%s'; this is configured via the %s symbol.",
+                    locale, supportedLocales, SymbolConstants.SUPPORTED_LOCALES);
+
+            throw new IllegalArgumentException(message);
+        }
+
+
+        perThreadManager.put(this, locale);
     }
 
     public Locale get()
     {
-        return locale;
+        return (Locale) perThreadManager.get(this);
     }
 
     public boolean isSet()
     {
-        return locale != null;
+        return get() != null;
     }
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PersistentLocaleImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PersistentLocaleImplTest.java?rev=748272&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PersistentLocaleImplTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PersistentLocaleImplTest.java Thu Feb 26 18:56:29 2009
@@ -0,0 +1,46 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// 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 org.apache.tapestry5.internal.services;
+
+import org.apache.tapestry5.ioc.test.TestBase;
+import org.apache.tapestry5.services.PersistentLocale;
+import org.testng.annotations.Test;
+
+import java.util.Locale;
+
+public class PersistentLocaleImplTest extends TestBase
+{
+    /**
+     * TAP5-537
+     */
+    @Test
+    public void set_to_unsupported_locale()
+    {
+        PersistentLocale pl = new PersistentLocaleImpl(null, "en,fr");
+
+        try
+        {
+            pl.set(Locale.CHINESE);
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            assertEquals(ex.getMessage(),
+                         "Locale 'zh' is not supported by this application. Supported locales are 'en,fr'; this is configured via the tapestry.supported-locales symbol.");
+        }
+
+    }
+
+}