Introduces Locale overload for toUpperCase/toLowerCase.
This patch introduces a simple Locale emulation that defines the constants
for common Locale classes used by shared code to avoid locale specific
String transformations (e.g. String.toLowerCase(Locale.US)).
Also adds Locale overloads to toUpperCase/toLowerCase so it does the right
thing when the locale is passed. More specifically calls
- javascript toXXXCase if Locale is US, ENGLISH and ROOT.
- javascript toLocaleXXXCase if Locale is Locale#getDefault()
By this way, shared code can perform both locale specific and non-locale
specific String transformations that works cross-platform (given that it's
supported by the underlying browser).
Change-Id: I753c61ccf46f441afeee542f88171bd47e0d973f
Review-Link: https://gwt-review.googlesource.com/#/c/8991/
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 2ed5862..4f9c2dc 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -23,6 +23,7 @@
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Comparator;
+import java.util.Locale;
/**
* Intrinsic string class.
@@ -965,10 +966,50 @@
return charArr;
}
+ /**
+ * Transforms the String to lower-case in a locale insensitive way.
+ * <p>
+ * Unlike JRE, we don't do locale specific transformation by default. That is backward compatible
+ * for GWT and in most of the cases that is what the developer actually wants. If you want to make
+ * a transformation based on native locale of the browser, you can do
+ * {@code toLowerCase(Locale.getDefault())} instead.
+ */
public native String toLowerCase() /*-{
return this.toLowerCase();
}-*/;
+ /**
+ * Transforms the String to lower-case based on the native locale of the browser.
+ */
+ private native String toLocaleLowerCase() /*-{
+ return this.toLocaleLowerCase();
+ }-*/;
+
+ /**
+ * If provided {@code locale} is {@link Locale#getDefault()}, uses javascript's
+ * {@code toLocaleLowerCase} to do a locale specific transformation. Otherwise, it will fallback
+ * to {@code toLowerCase} which performs the right thing for the limited set of Locale's
+ * predefined in GWT Locale emulation.
+ */
+ public String toLowerCase(Locale locale) {
+ return locale == Locale.getDefault() ? toLocaleLowerCase() : toLowerCase();
+ }
+
+ // See the notes in lowerCase pair.
+ public native String toUpperCase() /*-{
+ return this.toUpperCase();
+ }-*/;
+
+ // See the notes in lowerCase pair.
+ private native String toLocaleUpperCase() /*-{
+ return this.toLocaleUpperCase();
+ }-*/;
+
+ // See the notes in lowerCase pair.
+ public String toUpperCase(Locale locale) {
+ return locale == Locale.getDefault() ? toLocaleUpperCase() : toUpperCase();
+ }
+
@Override
public String toString() {
/*
@@ -978,10 +1019,6 @@
return this;
}
- public native String toUpperCase() /*-{
- return this.toUpperCase();
- }-*/;
-
public native String trim() /*-{
if (this.length == 0 || (this[0] > '\u0020' && this[this.length - 1] > '\u0020')) {
return this;
diff --git a/user/super/com/google/gwt/emul/java/util/Locale.java b/user/super/com/google/gwt/emul/java/util/Locale.java
new file mode 100644
index 0000000..48606e9
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/util/Locale.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * 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 java.util;
+
+/**
+ * A very simple emulation of Locale for shared-code patterns like
+ * {@code String.toUpperCase(Locale.US)}.
+ * <p>
+ * Note: Any changes to this class should put into account the assumption that was made in rest of
+ * the JRE emulation.
+ */
+public class Locale {
+
+ public static final Locale ROOT = new Locale() {
+ @Override
+ public String toString() {
+ return "";
+ }
+ };
+
+ public static final Locale ENGLISH = new Locale() {
+ @Override
+ public String toString() {
+ return "en";
+ }
+ };
+
+ public static final Locale US = new Locale() {
+ @Override
+ public String toString() {
+ return "en_US";
+ }
+ };
+
+ private static Locale defaultLocale = new Locale() {
+ @Override
+ public String toString() {
+ return "unknown";
+ }
+ };
+
+ /**
+ * Returns an instance that represents the browser's default locale (not necessarily the one
+ * defined by 'gwt.locale').
+ */
+ public static Locale getDefault() {
+ return defaultLocale;
+ }
+
+ // Hidden as we don't support manual creation of Locales.
+ private Locale() { }
+}
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 1d81463..41af5de 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -21,6 +21,7 @@
import com.google.gwt.junit.client.GWTTestCase;
import java.io.UnsupportedEncodingException;
+import java.util.Locale;
/**
* TODO: COMPILER OPTIMIZATIONS HAVE MADE THIS TEST NOT ACTUALLY TEST ANYTHING!
@@ -453,9 +454,17 @@
* TODO: needs rewriting to avoid compiler optimizations.
*/
public void testLowerCase() {
- assertEquals("abc", StringCase.toLower("AbC"));
- assertEquals("abc", StringCase.toLower("abc"));
- assertEquals("", StringCase.toLower(""));
+ assertEquals("abc", "AbC".toLowerCase());
+ assertEquals("abc", "abc".toLowerCase());
+ assertEquals("", "".toLowerCase());
+
+ assertEquals("abc", "AbC".toLowerCase(Locale.US));
+ assertEquals("abc", "abc".toLowerCase(Locale.US));
+ assertEquals("", "".toLowerCase(Locale.US));
+
+ assertEquals("abc", "AbC".toLowerCase(Locale.getDefault()));
+ assertEquals("abc", "abc".toLowerCase(Locale.getDefault()));
+ assertEquals("", "".toLowerCase(Locale.getDefault()));
}
public void testMatch() {
@@ -705,9 +714,17 @@
* TODO: needs rewriting to avoid compiler optimizations.
*/
public void testUpperCase() {
- assertEquals("abc", StringCase.toLower("AbC"));
- assertEquals("abc", StringCase.toLower("abc"));
- assertEquals("", StringCase.toLower(""));
+ assertEquals("ABC", "AbC".toUpperCase());
+ assertEquals("ABC", "abc".toUpperCase());
+ assertEquals("", "".toUpperCase());
+
+ assertEquals("ABC", "AbC".toUpperCase(Locale.US));
+ assertEquals("ABC", "abc".toUpperCase(Locale.US));
+ assertEquals("", "".toUpperCase(Locale.US));
+
+ assertEquals("ABC", "AbC".toUpperCase(Locale.getDefault()));
+ assertEquals("ABC", "abc".toUpperCase(Locale.getDefault()));
+ assertEquals("", "".toUpperCase(Locale.getDefault()));
}
/*