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 605e775  JOHNZON-282: add support for @JsonbTypeAdapter at class level 
(#53)
605e775 is described below

commit 605e775651a6d3821f6ccd317229d6195b7d068c
Author: Arne Limburg <arne.limb...@openknowledge.de>
AuthorDate: Sat Sep 28 17:15:12 2019 +0200

    JOHNZON-282: add support for @JsonbTypeAdapter at class level (#53)
    
    * JOHNZON-282: add support for @JsonbTypeAdapter at class level
    
    * add test with adapter at root object
    
    * remove recursion
---
 .../org/apache/johnzon/jsonb/JsonbAccessMode.java  | 28 +++++++++---
 .../java/org/apache/johnzon/jsonb/AdapterTest.java | 51 +++++++++++++++++++++-
 2 files changed, 72 insertions(+), 7 deletions(-)

diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index 89f85a5..7f6ddaa 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -868,8 +868,10 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         ReaderConverters(final DecoratedType annotationHolder) {
             final boolean numberType = 
isNumberType(annotationHolder.getType());
             final boolean dateType = isDateType(annotationHolder.getType());
+            final boolean hasRawType = hasRawType(annotationHolder.getType());
             final JsonbTypeDeserializer deserializer = 
annotationHolder.getAnnotation(JsonbTypeDeserializer.class);
             final JsonbTypeAdapter adapter = 
annotationHolder.getAnnotation(JsonbTypeAdapter.class);
+            final JsonbTypeAdapter typeAdapter = hasRawType ? 
getRawType(annotationHolder.getType()).getDeclaredAnnotation(JsonbTypeAdapter.class)
 : null;
             JsonbDateFormat dateFormat = dateType ? 
annotationHolder.getAnnotation(JsonbDateFormat.class) : null;
             JsonbNumberFormat numberFormat = numberType ? 
annotationHolder.getAnnotation(JsonbNumberFormat.class) : null;
             final JohnzonConverter johnzonConverter = 
annotationHolder.getAnnotation(JohnzonConverter.class);
@@ -881,9 +883,9 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                 numberFormat = 
annotationHolder.getClassOrPackageAnnotation(JsonbNumberFormat.class);
             }
 
-            converter = adapter == null && dateFormat == null && numberFormat 
== null && johnzonConverter == null ?
+            converter = adapter == null && typeAdapter == null && dateFormat 
== null && numberFormat == null && johnzonConverter == null ?
                     defaultConverters.get(new 
AdapterKey(annotationHolder.getType(), String.class)) :
-                    toConverter(types, annotationHolder.getType(), adapter, 
dateFormat, numberFormat);
+                    toConverter(types, annotationHolder.getType(), adapter != 
null ? adapter : typeAdapter, dateFormat, numberFormat);
 
             if (deserializer != null) {
                 final Class<? extends JsonbDeserializer> value = 
deserializer.value();
@@ -966,12 +968,14 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         WriterConverters(final DecoratedType reader, final Types types) {
             final boolean numberType = isNumberType(reader.getType());
             final boolean dateType = isDateType(reader.getType());
+            final boolean hasRawType = hasRawType(reader.getType());
             final JsonbTypeSerializer serializer = 
reader.getAnnotation(JsonbTypeSerializer.class);
             final JsonbTypeAdapter adapter = 
reader.getAnnotation(JsonbTypeAdapter.class);
+            final JsonbTypeAdapter typeAdapter = hasRawType ? 
getRawType(reader.getType()).getDeclaredAnnotation(JsonbTypeAdapter.class) : 
null;
             JsonbDateFormat dateFormat = dateType ? 
reader.getAnnotation(JsonbDateFormat.class) : null;
             JsonbNumberFormat numberFormat = numberType ? 
reader.getAnnotation(JsonbNumberFormat.class) : null;
             final JohnzonConverter johnzonConverter = 
reader.getAnnotation(JohnzonConverter.class);
-            validateAnnotations(reader, adapter, dateFormat, numberFormat, 
johnzonConverter);
+            validateAnnotations(reader, adapter != null ? adapter : 
typeAdapter, dateFormat, numberFormat, johnzonConverter);
             if (dateFormat == null && isDateType(reader.getType())) {
                 dateFormat = 
reader.getClassOrPackageAnnotation(JsonbDateFormat.class);
             }
@@ -979,9 +983,9 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                 numberFormat = 
reader.getClassOrPackageAnnotation(JsonbNumberFormat.class);
             }
 
-            converter = adapter == null && dateFormat == null && numberFormat 
== null && johnzonConverter == null ?
+            converter = adapter == null && typeAdapter == null && dateFormat 
== null && numberFormat == null && johnzonConverter == null ?
                     defaultConverters.get(new AdapterKey(reader.getType(), 
String.class)) :
-                    toConverter(types, reader.getType(), adapter, dateFormat, 
numberFormat);
+                    toConverter(types, reader.getType(), adapter != null ? 
adapter : typeAdapter, dateFormat, numberFormat);
 
             if (serializer != null) {
                 final Class<? extends JsonbSerializer> value = 
serializer.value();
@@ -1033,6 +1037,20 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         return Number.class.isAssignableFrom(clazz) || clazz.isPrimitive();
     }
 
+    private boolean hasRawType(final Type type) {
+        return Class.class.isInstance(type) || 
ParameterizedType.class.isInstance(type);
+    }
+
+    private Class<?> getRawType(final Type type) {
+        if (!Class.class.isInstance(type) && 
!ParameterizedType.class.isInstance(type)) {
+            throw new IllegalStateException("Unsupported generic type " + 
type.getClass().getName());
+        } else if (Class.class.isInstance(type)) {
+            return Class.class.cast(type);
+        } else /*if (ParameterizedType.class.isInstance(type))*/ {
+            return 
Class.class.cast(ParameterizedType.class.cast(type).getRawType());
+        }
+    }
+
     private static class ClassDecoratedType implements DecoratedType {
         private final Class<?> annotations;
 
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
index 8e12cbd..dca4576 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
@@ -1,3 +1,4 @@
+package org.apache.johnzon.jsonb;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -16,7 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.johnzon.jsonb;
+
 
 import org.junit.Test;
 
@@ -32,7 +33,11 @@ import java.util.ArrayList;
 import java.util.List;
 
 import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.endsWith;
+import static org.hamcrest.CoreMatchers.startsWith;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 public class AdapterTest {
@@ -44,13 +49,32 @@ public class AdapterTest {
             foo.bar.value = 1;
             foo.dummy = new Dummy();
             foo.dummy.value = 2L;
+            foo.baz = new Baz();
+            foo.baz.value = "3";
 
             final String toString = jsonb.toJson(foo);
-            assertEquals("{\"bar\":\"1\",\"dummy\":\"2\"}", toString);
+            assertThat(toString, startsWith("{"));
+            assertThat(toString, containsString("\"bar\":\"1\""));
+            assertThat(toString, containsString("\"dummy\":\"2\""));
+            assertThat(toString, containsString("\"baz\":\"3\""));
+            assertThat(toString, endsWith("}"));
+            
assertEquals("{\"bar\":\"1\",\"dummy\":\"2\",\"baz\":\"3\"}".length(), 
toString.length());
 
             final Foo read = jsonb.fromJson(toString, Foo.class);
             assertEquals(foo.bar.value, read.bar.value);
             assertEquals(foo.dummy.value, read.dummy.value);
+            assertEquals(foo.baz.value, read.baz.value);
+        }
+    }
+
+    @Test
+    public void adaptValue() throws Exception {
+        try (final Jsonb jsonb = JsonbBuilder.create()) {
+            final Baz baz = new Baz();
+            baz.value = "test";
+            
+            final String toString = jsonb.toJson(baz);
+            assertEquals("\"test\"", toString);
         }
     }
 
@@ -144,6 +168,8 @@ public class AdapterTest {
 
         @JsonbTypeAdapter(DummyAdapter.class)
         public Dummy dummy;
+        
+        public Baz baz;
     }
 
     public static class Bar2 extends Bar {
@@ -169,6 +195,27 @@ public class AdapterTest {
         }
     }
 
+    @JsonbTypeAdapter(BazAdapter.class)
+    public static class Baz {
+        public String value;
+    }
+
+    public static class BazAdapter implements JsonbAdapter<Baz, String> {
+
+        @Override
+        public String adaptToJson(Baz obj) throws Exception {
+            return obj.value;
+        }
+
+        @Override
+        public Baz adaptFromJson(String obj) throws Exception {
+            Baz baz = new Baz();
+            baz.value = obj;
+            return baz;
+        }
+
+    }
+
     public static class Dummy2 {
         public long value;
     }

Reply via email to