Extract abstraction for CaseMapper.

This is so that we could replace it in WASM to prevent
infinite recursion due to Character.toLowerCase.

PiperOrigin-RevId: 373483600
Change-Id: I24e58c9eb4db6a0d95e180c9bdef4558da08fc2e
diff --git a/user/super/com/google/gwt/emul/java/lang/CaseMapper.java b/user/super/com/google/gwt/emul/java/lang/CaseMapper.java
new file mode 100644
index 0000000..b3413a8
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/lang/CaseMapper.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 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.lang;
+
+/** Performs case operations. Abstracted so can be platform specific. */
+final class CaseMapper {
+
+  public static char charToLowerCase(char c) {
+    return String.valueOf(c).toLowerCase().charAt(0);
+  }
+
+  public static char charToUpperCase(char c) {
+    return String.valueOf(c).toUpperCase().charAt(0);
+  }
+
+  private CaseMapper() {}
+}
diff --git a/user/super/com/google/gwt/emul/java/lang/Character.java b/user/super/com/google/gwt/emul/java/lang/Character.java
index 9bef6a5..3733f73 100644
--- a/user/super/com/google/gwt/emul/java/lang/Character.java
+++ b/user/super/com/google/gwt/emul/java/lang/Character.java
@@ -413,7 +413,7 @@
   }
 
   public static char toLowerCase(char c) {
-    return String.valueOf(c).toLowerCase().charAt(0);
+    return CaseMapper.charToLowerCase(c);
   }
 
   public static String toString(char x) {
@@ -421,7 +421,7 @@
   }
 
   public static char toUpperCase(char c) {
-    return String.valueOf(c).toUpperCase().charAt(0);
+    return CaseMapper.charToUpperCase(c);
   }
 
   public static Character valueOf(char c) {