You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2016/03/01 09:43:33 UTC

incubator-johnzon git commit: JOHNZON-66 support of Locale

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master cfb14a5af -> d7b7041de


JOHNZON-66 support of Locale


Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/d7b7041d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/d7b7041d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/d7b7041d

Branch: refs/heads/master
Commit: d7b7041de011c29f34be527d1f8d50ac856c140f
Parents: cfb14a5
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Tue Mar 1 09:43:15 2016 +0100
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Tue Mar 1 09:43:15 2016 +0100

----------------------------------------------------------------------
 .../JsonbLocaleParserConverterBase.java         | 11 ++--
 .../apache/johnzon/mapper/MapperBuilder.java    |  3 +
 .../mapper/converter/LocaleConverter.java       | 68 ++++++++++++++++++++
 .../org/apache/johnzon/mapper/LocaleTest.java   | 50 ++++++++++++++
 4 files changed, 125 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d7b7041d/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/converter/JsonbLocaleParserConverterBase.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/converter/JsonbLocaleParserConverterBase.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/converter/JsonbLocaleParserConverterBase.java
index 414a7a5..15b264d 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/converter/JsonbLocaleParserConverterBase.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/converter/JsonbLocaleParserConverterBase.java
@@ -19,17 +19,14 @@
 package org.apache.johnzon.jsonb.converter;
 
 import org.apache.johnzon.mapper.Converter;
+import org.apache.johnzon.mapper.converter.LocaleConverter;
 
 import java.util.Locale;
 
 public abstract class JsonbLocaleParserConverterBase<T> implements Converter<T> {
+    private final LocaleConverter delegate = new LocaleConverter();
+
     protected Locale newLocale(final String locale) {
-        final String[] parts = locale.split("-");
-        switch (parts.length) {
-            case 1: return new Locale(locale);
-            case 2: return new Locale(parts[0], parts[1]);
-            case 3: return new Locale(parts[0], parts[1], parts[2]);
-            default: throw new IllegalArgumentException(locale);
-        }
+        return delegate.fromString(locale);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d7b7041d/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index fafa581..443903b 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -34,6 +34,7 @@ import org.apache.johnzon.mapper.converter.DateConverter;
 import org.apache.johnzon.mapper.converter.DoubleConverter;
 import org.apache.johnzon.mapper.converter.FloatConverter;
 import org.apache.johnzon.mapper.converter.IntegerConverter;
+import org.apache.johnzon.mapper.converter.LocaleConverter;
 import org.apache.johnzon.mapper.converter.LongConverter;
 import org.apache.johnzon.mapper.converter.ShortConverter;
 import org.apache.johnzon.mapper.converter.StringConverter;
@@ -59,6 +60,7 @@ import java.util.Collection;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 public class MapperBuilder {
@@ -89,6 +91,7 @@ public class MapperBuilder {
         DEFAULT_CONVERTERS.put(new AdapterKey(long.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Long.class, String.class)));
         DEFAULT_CONVERTERS.put(new AdapterKey(short.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Short.class, String.class)));
         DEFAULT_CONVERTERS.put(new AdapterKey(boolean.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Boolean.class, String.class)));
+        DEFAULT_CONVERTERS.put(new AdapterKey(Locale.class, String.class), new LocaleConverter());
     }
 
     private JsonReaderFactory readerFactory;

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d7b7041d/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LocaleConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LocaleConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LocaleConverter.java
new file mode 100644
index 0000000..a03b2a1
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LocaleConverter.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.johnzon.mapper.converter;
+
+import org.apache.johnzon.mapper.Adapter;
+
+import java.util.Locale;
+
+// from [lang]
+public class LocaleConverter implements Adapter<Locale, String> {
+    @Override
+    public String from(final Locale instance) {
+        return instance.toString();
+    }
+
+    @Override
+    public Locale to(final String locale) {
+        if (locale == null) {
+            return null;
+        }
+        final int len = locale.length();
+        if (len != 2 && len != 5 && len < 7) {
+            throw new IllegalArgumentException("Invalid locale format: " + locale);
+        }
+        final char ch0 = locale.charAt(0);
+        final char ch1 = locale.charAt(1);
+        if (ch0 < 'a' || ch0 > 'z' || ch1 < 'a' || ch1 > 'z') {
+            throw new IllegalArgumentException("Invalid locale format: " + locale);
+        }
+        if (len == 2) {
+            return new Locale(locale, "");
+        }
+        if (locale.charAt(2) != '_') {
+            throw new IllegalArgumentException("Invalid locale format: " + locale);
+        }
+        final char ch3 = locale.charAt(3);
+        if (ch3 == '_') {
+            return new Locale(locale.substring(0, 2), "", locale.substring(4));
+        }
+        final char ch4 = locale.charAt(4);
+        if (ch3 < 'A' || ch3 > 'Z' || ch4 < 'A' || ch4 > 'Z') {
+            throw new IllegalArgumentException("Invalid locale format: " + locale);
+        }
+        if (len == 5) {
+            return new Locale(locale.substring(0, 2), locale.substring(3, 5));
+        }
+        if (locale.charAt(5) != '_') {
+            throw new IllegalArgumentException("Invalid locale format: " + locale);
+        }
+        return new Locale(locale.substring(0, 2), locale.substring(3, 5), locale.substring(6));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d7b7041d/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LocaleTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LocaleTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LocaleTest.java
new file mode 100644
index 0000000..3e3098c
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LocaleTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.johnzon.mapper;
+
+import org.apache.johnzon.mapper.access.FieldAccessMode;
+import org.junit.Test;
+
+import java.util.Locale;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class LocaleTest {
+    @Test
+    public void roundTrip() {
+        final String expected = "{\"locale\":\"fr_FR\"}";
+        final Mapper mapper = new MapperBuilder().setAccessMode(new FieldAccessMode(false, false)).build();
+        {
+            final Locale locale = Locale.FRANCE;
+            final LocaleHolder holder = new LocaleHolder();
+            holder.locale = locale;
+            assertEquals(expected, mapper.writeObjectAsString(holder));
+        }
+        {
+            final LocaleHolder holder = mapper.readObject(expected, LocaleHolder.class);
+            assertNotNull(holder.locale);
+            assertEquals("fr_FR", holder.locale.toString());
+        }
+    }
+
+    public static class LocaleHolder {
+        private Locale locale;
+    }
+}