You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2017/09/14 15:05:01 UTC

svn commit: r1808352 - in /sling/trunk/bundles/extensions/i18n/src: main/java/org/apache/sling/i18n/ main/java/org/apache/sling/i18n/impl/ test/java/org/apache/sling/i18n/impl/

Author: kwin
Date: Thu Sep 14 15:05:00 2017
New Revision: 1808352

URL: http://svn.apache.org/viewvc?rev=1808352&view=rev
Log:
SLING-7112 accept also user-assigned country codes

This closes #251

Modified:
    sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java
    sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/package-info.java
    sling/trunk/bundles/extensions/i18n/src/test/java/org/apache/sling/i18n/impl/JcrResourceBundleProviderTest.java

Modified: sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java?rev=1808352&r1=1808351&r2=1808352&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java (original)
+++ sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java Thu Sep 14 15:05:00 2017
@@ -38,6 +38,7 @@ import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Semaphore;
+import java.util.regex.Pattern;
 
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.Resource;
@@ -79,6 +80,12 @@ import org.slf4j.LoggerFactory;
 @Designate(ocd = JcrResourceBundleProvider.Config.class)
 public class JcrResourceBundleProvider implements ResourceBundleProvider, ResourceChangeListener, ExternalResourceChangeListener {
 
+    /**
+     * A regular expression pattern matching all custom country codes.
+     * @see <a href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#User-assigned_code_elements">User-assigned code elements</a>
+     */
+    private static final Pattern USER_ASSIGNED_COUNTRY_CODES_PATTERN = Pattern.compile("aa|q[m-z]|x[a-z]|zz");
+
     @ObjectClassDefinition(name ="Apache Sling I18N ResourceBundle Provider",
             description ="ResourceBundleProvider service which loads the messages "+
                  "from the repository. If the user name field is left empty, the provider will "+
@@ -612,11 +619,16 @@ public class JcrResourceBundleProvider i
         // country is also available
         String country = parts[1];
         boolean isValidCountryCode = false;
-        String[] countries = Locale.getISOCountries();
-        for (int i = 0; i < countries.length; i++) {
-            if (countries[i].equalsIgnoreCase(country)) {
-                isValidCountryCode = true; // signal ok
-                break;
+        // allow user-assigned codes (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#User-assigned_code_elements)
+        if (USER_ASSIGNED_COUNTRY_CODES_PATTERN.matcher(country.toLowerCase()).matches()) {
+            isValidCountryCode = true;
+        } else {
+            String[] countries = Locale.getISOCountries();
+            for (int i = 0; i < countries.length; i++) {
+                if (countries[i].equalsIgnoreCase(country)) {
+                    isValidCountryCode = true; // signal ok
+                    break;
+                }
             }
         }
         if (!isValidCountryCode) {

Modified: sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/package-info.java?rev=1808352&r1=1808351&r2=1808352&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/package-info.java (original)
+++ sling/trunk/bundles/extensions/i18n/src/main/java/org/apache/sling/i18n/package-info.java Thu Sep 14 15:05:00 2017
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("2.2.0")
+@org.osgi.annotation.versioning.Version("2.2.1")
 package org.apache.sling.i18n;
 
 

Modified: sling/trunk/bundles/extensions/i18n/src/test/java/org/apache/sling/i18n/impl/JcrResourceBundleProviderTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/i18n/src/test/java/org/apache/sling/i18n/impl/JcrResourceBundleProviderTest.java?rev=1808352&r1=1808351&r2=1808352&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/i18n/src/test/java/org/apache/sling/i18n/impl/JcrResourceBundleProviderTest.java (original)
+++ sling/trunk/bundles/extensions/i18n/src/test/java/org/apache/sling/i18n/impl/JcrResourceBundleProviderTest.java Thu Sep 14 15:05:00 2017
@@ -30,18 +30,18 @@ public class JcrResourceBundleProviderTe
     public void testToLocale() {
         // empty string must return default locale
         Assert.assertEquals(Locale.getDefault(), JcrResourceBundleProvider.toLocale(""));
-        
+
         // only language part being set
         Assert.assertEquals(Locale.ENGLISH, JcrResourceBundleProvider.toLocale("en"));
         Assert.assertEquals(Locale.GERMAN, JcrResourceBundleProvider.toLocale("de"));
         // for invalid languages assume default language
         Assert.assertEquals(new Locale(Locale.getDefault().getLanguage()), JcrResourceBundleProvider.toLocale("invalid"));
-        
+
         // both language and country being set (no matter whether lower or upper case)
         Assert.assertEquals(Locale.GERMANY, JcrResourceBundleProvider.toLocale("de_DE"));
         Assert.assertEquals(Locale.GERMANY, JcrResourceBundleProvider.toLocale("de_de"));
         Assert.assertEquals(Locale.GERMANY, JcrResourceBundleProvider.toLocale("DE_de"));
-        
+
         Assert.assertEquals(Locale.UK, JcrResourceBundleProvider.toLocale("en_GB"));
         Assert.assertEquals(Locale.UK, JcrResourceBundleProvider.toLocale("en_gb"));
         Assert.assertEquals(Locale.UK, JcrResourceBundleProvider.toLocale("EN_gb"));
@@ -49,10 +49,10 @@ public class JcrResourceBundleProviderTe
         Assert.assertEquals(new Locale(Locale.getDefault().getLanguage(), "GB"), JcrResourceBundleProvider.toLocale("invalid_GB"));
         // for invalid countries assume default country
         Assert.assertEquals(new Locale("en", Locale.getDefault().getCountry()), JcrResourceBundleProvider.toLocale("en_invalid"));
-    
+
         // language, country and variant being set
         Assert.assertEquals(new Locale(Locale.UK.getLanguage(), Locale.UK.getCountry(), "variant1"), JcrResourceBundleProvider.toLocale("en_GB_variant1"));
-        
+
         // parts after the variant are just ignored
         Assert.assertEquals(new Locale(Locale.UK.getLanguage(), Locale.UK.getCountry(), "variant1"), JcrResourceBundleProvider.toLocale("en_GB_variant1_something"));
     }
@@ -61,7 +61,7 @@ public class JcrResourceBundleProviderTe
     public void testToLocaleWithBcp47CompliantStrings() {
         // both language and country being set
         Assert.assertEquals(Locale.GERMANY, JcrResourceBundleProvider.toLocale("de-DE"));
-        
+
         Assert.assertEquals(Locale.UK, JcrResourceBundleProvider.toLocale("en-GB"));
         // for invalid languages assume default language
         Assert.assertEquals(new Locale(Locale.getDefault().getLanguage(), "GB"), JcrResourceBundleProvider.toLocale("invalid-GB"));
@@ -69,8 +69,30 @@ public class JcrResourceBundleProviderTe
         Assert.assertEquals(new Locale("en", Locale.getDefault().getCountry()), JcrResourceBundleProvider.toLocale("en-invalid"));
         // language, country and variant being set
         Assert.assertEquals(new Locale(Locale.UK.getLanguage(), Locale.UK.getCountry(), "variant1"), JcrResourceBundleProvider.toLocale("en-GB-variant1"));
-        
+
         // parts after the variant are just ignored
         Assert.assertEquals(new Locale(Locale.UK.getLanguage(), Locale.UK.getCountry(), "variant1"), JcrResourceBundleProvider.toLocale("en-GB-variant1-something-else"));
     }
+
+    @Test
+    public void testToLocaleWithPrivateUseCountryCode() {
+        // Private use Country 'XZ'
+        Assert.assertEquals(new Locale(Locale.GERMAN.getLanguage(), "XZ"), JcrResourceBundleProvider.toLocale("de_XZ"));
+
+        // Private use Country 'AA'
+        Assert.assertEquals(new Locale(Locale.GERMAN.getLanguage(), "AA"), JcrResourceBundleProvider.toLocale("de_AA"));
+
+        // Private use Country 'QX'
+        Assert.assertEquals(new Locale(Locale.GERMAN.getLanguage(), "QX"), JcrResourceBundleProvider.toLocale("de_QX"));
+
+        // Private use Country 'ZZ'
+        Assert.assertEquals(new Locale(Locale.GERMAN.getLanguage(), "ZZ"), JcrResourceBundleProvider.toLocale("de_ZZ"));
+
+        // for invalid countries assume default country
+        Assert.assertEquals(new Locale("en", Locale.getDefault().getCountry()), JcrResourceBundleProvider.toLocale("en-QB"));
+
+        // Lowercase Private use Country 'xa'
+        Assert.assertEquals(new Locale(Locale.GERMAN.getLanguage(), "XA"), JcrResourceBundleProvider.toLocale("de_xa"));
+    }
+
 }