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);
}