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 2019/11/03 18:59:48 UTC

[johnzon] branch master updated: JOHNZON-292 accept Enum subclasses as enums

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git


The following commit(s) were added to refs/heads/master by this push:
     new 57c3b0f  JOHNZON-292 accept Enum subclasses as enums
57c3b0f is described below

commit 57c3b0fdc9cf3cc93fa1cc7c3b31c7ca0ff8eeeb
Author: Romain Manni-Bucau <rm...@apache.org>
AuthorDate: Sun Nov 3 19:59:38 2019 +0100

    JOHNZON-292 accept Enum subclasses as enums
---
 .../java/org/apache/johnzon/jsonb/EnumTest.java    | 47 ++++++++++++++++++++++
 .../org/apache/johnzon/mapper/MapperConfig.java    |  2 +-
 .../johnzon/mapper/MappingGeneratorImpl.java       |  4 +-
 .../apache/johnzon/mapper/MappingParserImpl.java   |  2 +-
 .../java/org/apache/johnzon/mapper/Mappings.java   |  2 +-
 .../johnzon/mapper/converter/EnumConverter.java    |  6 ++-
 6 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/EnumTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/EnumTest.java
new file mode 100644
index 0000000..8bbac8a
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/EnumTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.jsonb;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class EnumTest {
+    @Rule
+    public final JsonbRule jsonb = new JsonbRule();
+
+    @Test
+    public void noDeclaringClass() { // JOHNZON-292
+        assertEquals("\"A\"", jsonb.toJson(E.A));
+
+        final Container c2 = new Container();
+        c2.e = E.A;
+        assertEquals("{\"e\":\"A\"}", jsonb.toJson(c2));
+    }
+
+    public static class Container {
+        public E e;
+    }
+
+    public enum E {
+        A {}
+    }
+}
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index fb9f609..d3ef464 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -198,7 +198,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable {
         */
         if (Class.class.isInstance(aClass)) {
             final Class<?> clazz = Class.class.cast(aClass);
-            if (clazz.isEnum()) {
+            if (Enum.class.isAssignableFrom(clazz)) {
                 final Adapter<?, ?> enumConverter = new ConverterAdapter(new EnumConverter(clazz));
                 adapters.putIfAbsent(new AdapterKey(String.class, aClass), enumConverter);
                 return enumConverter;
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index d2fe205..7e4d749 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -79,7 +79,7 @@ public class MappingGeneratorImpl implements MappingGenerator {
                             null, emptyList(), isDeduplicateObjects ? new JsonPointerTracker(null, "/") : null, generator);
                 } else if(writePrimitives(key, objectClass, object, generator)) {
                     // no-op
-                } else if (objectClass.isEnum()) {
+                } else if (Enum.class.isAssignableFrom(objectClass)) {
                     final Adapter adapter = config.findAdapter(objectClass);
                     final String adaptedValue = adapter.from(object).toString(); // we know it ends as String for enums
                     generator.write(key, adaptedValue);
@@ -139,7 +139,7 @@ public class MappingGeneratorImpl implements MappingGenerator {
             }
 
             final Class<?> objectClass = object.getClass();
-            if (objectClass.isEnum()) {
+            if (Enum.class.isAssignableFrom(objectClass)) {
                 final Adapter adapter = config.findAdapter(objectClass);
                 final String adaptedValue = adapter.from(object).toString(); // we know it ends as String for enums
                 generator.write(adaptedValue);
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index a5ed7b3..1ae08ff 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -1098,7 +1098,7 @@ public class MappingParserImpl implements MappingParser {
         }
         if (Class.class.isInstance(aClass)) {
             final Class<?> clazz = Class.class.cast(aClass);
-            if (clazz.isEnum()) {
+            if (Enum.class.isAssignableFrom(clazz)) {
                 final Adapter<?, ?> enumConverter = new ConverterAdapter(new EnumConverter(clazz));
                 config.getAdapters().putIfAbsent(new AdapterKey(String.class, aClass), enumConverter);
                 return enumConverter;
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
index 0da829f..acf5d49 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -643,7 +643,7 @@ public class Mappings {
                     }
                 }
             }
-            if (converter == null && type.isEnum()) {
+            if (converter == null && Enum.class.isAssignableFrom(type)) {
                 final AdapterKey key = new AdapterKey(String.class, type);
                 converter = adapters.get(key); // first ensure user didnt override it
                 if (converter == null) {
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
index 4588f54..4000183 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
@@ -31,8 +31,10 @@ public class EnumConverter<T extends Enum<T>> implements Converter<T>, Converter
     public EnumConverter(final Class<T> aClass) {
         this.enumType = aClass;
 
-        final T[] enumConstants = aClass.getEnumConstants();
-        values = new HashMap<String, T>(enumConstants.length);
+        final T[] enumConstants = aClass.isEnum() ?
+                aClass.getEnumConstants() :
+                (T[]) aClass.getSuperclass().getEnumConstants();
+        values = new HashMap<>(enumConstants.length);
         for (final T t : enumConstants) {
             values.put(t.name(), t);
         }