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 c6d9661  JOHNZON-224 support JsonValue in adapters (parsing side)
c6d9661 is described below

commit c6d9661a05f0eae3e7fbd39b7210282d3afe9816
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Fri Jul 26 07:21:44 2019 +0200

    JOHNZON-224 support JsonValue in adapters (parsing side)
---
 .../java/org/apache/johnzon/jsonb/AdapterTest.java | 66 ++++++++++++++++++----
 .../johnzon/mapper/MappingGeneratorImpl.java       |  3 +
 .../apache/johnzon/mapper/MappingParserImpl.java   | 31 ++++++++--
 3 files changed, 84 insertions(+), 16 deletions(-)

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 d6b8a05..d09becc 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
@@ -20,6 +20,8 @@ package org.apache.johnzon.jsonb;
 
 import org.junit.Test;
 
+import javax.json.Json;
+import javax.json.JsonString;
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
 import javax.json.bind.JsonbConfig;
@@ -35,20 +37,36 @@ import static org.junit.Assert.assertTrue;
 
 public class AdapterTest {
     @Test
-    public void adapt() {
-        final Jsonb jsonb = JsonbBuilder.create(new 
JsonbConfig().withAdapters(new BarAdapter()));
-        final Foo foo = new Foo();
-        foo.bar = new Bar();
-        foo.bar.value = 1;
-        foo.dummy = new Dummy();
-        foo.dummy.value = 2L;
+    public void adapt() throws Exception {
+        try (final Jsonb jsonb = JsonbBuilder.create(new 
JsonbConfig().withAdapters(new BarAdapter()))) {
+            final Foo foo = new Foo();
+            foo.bar = new Bar();
+            foo.bar.value = 1;
+            foo.dummy = new Dummy();
+            foo.dummy.value = 2L;
+
+            final String toString = jsonb.toJson(foo);
+            assertEquals("{\"bar\":\"1\",\"dummy\":\"2\"}", toString);
+
+            final Foo read = jsonb.fromJson(toString, Foo.class);
+            assertEquals(foo.bar.value, read.bar.value);
+            assertEquals(foo.dummy.value, read.dummy.value);
+        }
+    }
 
-        final String toString = jsonb.toJson(foo);
-        assertEquals("{\"bar\":\"1\",\"dummy\":\"2\"}", toString);
+    @Test
+    public void adaptJson() throws Exception {
+        try (final Jsonb jsonb = JsonbBuilder.create(new 
JsonbConfig().withAdapters(new Dummy2Adapter()))) {
+            final Foo2 foo = new Foo2();
+            foo.dummy = new Dummy2();
+            foo.dummy.value = 2L;
+
+            final String toString = jsonb.toJson(foo);
+            assertEquals("{\"dummy\":\"2\"}", toString);
 
-        final Foo read = jsonb.fromJson(toString, Foo.class);
-        assertEquals(foo.bar.value, read.bar.value);
-        assertEquals(foo.dummy.value, read.dummy.value);
+            final Foo2 read = jsonb.fromJson(toString, Foo2.class);
+            assertEquals(foo.dummy.value, read.dummy.value);
+        }
     }
 
     @Test
@@ -115,6 +133,12 @@ public class AdapterTest {
     }
 
 
+    public static class Foo2 {
+        @JsonbTypeAdapter(Dummy2Adapter.class)
+        public Dummy2 dummy;
+    }
+
+
     public static class Foo {
         public Bar bar;
 
@@ -145,10 +169,28 @@ public class AdapterTest {
         }
     }
 
+    public static class Dummy2 {
+        public long value;
+    }
+
     public static class Dummy {
         public long value;
     }
 
+    public static class Dummy2Adapter implements JsonbAdapter<Dummy2, 
JsonString> {
+        @Override
+        public Dummy2 adaptFromJson(final JsonString obj) {
+            final Dummy2 bar = new Dummy2();
+            bar.value = Long.parseLong(obj.getString());
+            return bar;
+        }
+
+        @Override
+        public JsonString adaptToJson(final Dummy2 obj) {
+            return Json.createValue(Long.toString(obj.value));
+        }
+    }
+
     public static class DummyAdapter implements JsonbAdapter<Dummy, String> {
         @Override
         public Dummy adaptFromJson(final String obj) throws Exception {
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 1b7721e..f741aff 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
@@ -244,6 +244,9 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
         if (type == String.class) {
             generator.write(key, value.toString());
             handled = true;
+        } else if (JsonValue.class.isAssignableFrom(type)) {
+            generator.write(key, JsonValue.class.cast(value));
+            handled = true;
         } else if (type == long.class || type == Long.class) {
             generator.write(key, Long.class.cast(value).longValue());
             handled = true;
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 f8bed55..09a8a4d 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
@@ -70,9 +70,11 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import static java.util.Arrays.asList;
+import static javax.json.JsonValue.ValueType.ARRAY;
 import static javax.json.JsonValue.ValueType.FALSE;
 import static javax.json.JsonValue.ValueType.NULL;
 import static javax.json.JsonValue.ValueType.NUMBER;
+import static javax.json.JsonValue.ValueType.STRING;
 import static javax.json.JsonValue.ValueType.TRUE;
 
 /**
@@ -402,7 +404,15 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object convertTo(final Adapter converter, final JsonValue 
jsonValue, JsonPointerTracker jsonPointer) {
+        final AdapterKey key = getAdapterKey(converter);
+        if (JsonValue.class == key.getTo()) {
+            return converter.to(jsonValue);
+        }
+
         if (jsonValue.getValueType() == JsonValue.ValueType.OBJECT) {
+            if (JsonObject.class == key.getTo() || JsonStructure.class == 
key.getTo()) {
+                return converter.to(jsonValue.asJsonObject());
+            }
 
             //X TODO maybe we can put this into MapperConfig?
             //X      config.getAdapter(AdapterKey)
@@ -419,11 +429,16 @@ public class MappingParserImpl implements MappingParser {
             return converter.to(param);
         }
 
-        final AdapterKey key = getAdapterKey(converter);
         final JsonValue.ValueType valueType = jsonValue.getValueType();
         if (NULL.equals(valueType)) {
             return null;
         }
+        if (STRING.equals(valueType)) {
+            if (key.getTo() == JsonString.class) {
+                return converter.to(JsonString.class.cast(jsonValue));
+            }
+            return converter.to(JsonString.class.cast(jsonValue).getString());
+        }
         if (TRUE.equals(valueType) || FALSE.equals(valueType)) {
             if (key != null) {
                 if (boolean.class == key.getTo() || Boolean.class == 
key.getTo()) {
@@ -445,9 +460,17 @@ public class MappingParserImpl implements MappingParser {
                     return 
converter.to(JsonNumber.class.cast(jsonValue).bigIntegerValue());
                 } else if (BigDecimal.class == key.getTo()) {
                     return 
converter.to(JsonNumber.class.cast(jsonValue).bigDecimalValue());
+                } else if (JsonNumber.class == key.getTo()) {
+                    return converter.to(JsonNumber.class.cast(jsonValue));
                 }
             }
         }
+        if (ARRAY.equals(valueType)) {
+            if (JsonArray.class == key.getTo() || JsonStructure.class == 
key.getTo()) {
+                return converter.to(jsonValue.asJsonObject());
+            }
+            return buildArray(key.getTo(), jsonValue.asJsonArray(), null, 
null, jsonPointer, null);
+        }
         return converter.to(jsonValue.toString());
 
     }
@@ -733,9 +756,9 @@ public class MappingParserImpl implements MappingParser {
         }
 
         try {
-            return converter == null ? toObject(baseInstance, jsonValue, type, 
itemConverter, jsonPointer, rootType)
-                    : jsonValue.getValueType() == JsonValue.ValueType.STRING ? 
converter.to(JsonString.class.cast(jsonValue).getString())
-                    : convertTo(converter, jsonValue, jsonPointer);
+            return converter == null ?
+                    toObject(baseInstance, jsonValue, type, itemConverter, 
jsonPointer, rootType) :
+                    convertTo(converter, jsonValue, jsonPointer);
         } catch (Exception e) {
             if (e instanceof MapperException) {
                 throw e;

Reply via email to