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.
*/
[email protected]("2.2.0")
[email protected]("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"));
+ }
+
}