JOHNZON-184 fix TypeAwareAdapter support for other types than String

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

Branch: refs/heads/master
Commit: 2845dd8825b7b7d4f5f594f05a2ccea202bdb652
Parents: 29af5fb
Author: Mark Struberg <[email protected]>
Authored: Wed Aug 29 17:33:32 2018 +0200
Committer: Mark Struberg <[email protected]>
Committed: Wed Aug 29 17:33:32 2018 +0200

----------------------------------------------------------------------
 .../org/apache/johnzon/jsonb/AdapterTest.java   | 43 ++++++++++++++++++++
 .../johnzon/mapper/MappingParserImpl.java       | 29 ++++++++-----
 2 files changed, 61 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/2845dd88/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java
----------------------------------------------------------------------
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 775442e..d6b8a05 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
@@ -176,4 +176,47 @@ public class AdapterTest {
             return bar;
         }
     }
+
+    @Test
+    public void testAdapterOnEnum() {
+        Jsonb jsonb = JsonbBuilder.newBuilder().build();
+
+        DoorDTO door = new DoorDTO();
+        door.status = DoorStatus.OPEN;
+        String jsonS = jsonb.toJson(door);
+        assertEquals(
+                "The expected result must be a door with a status open as its 
enum ordinal",
+                "{\"status\":0}",
+                jsonS);
+
+        DoorDTO doorDTO = jsonb.fromJson(jsonS, DoorDTO.class);
+
+        assertEquals(
+                "The expected result must be a door with a status open as an 
enum value",
+                DoorStatus.OPEN,
+                doorDTO.status);
+    }
+
+    static class DoorDTO {
+        @JsonbTypeAdapter(StatusAdapter.class)
+        public DoorStatus status;
+    }
+
+    public enum DoorStatus {
+        OPEN, CLOSE
+    }
+
+    public static class StatusAdapter implements JsonbAdapter<DoorStatus, 
Integer> {
+
+        @Override
+        public Integer adaptToJson(DoorStatus obj) {
+            return obj.ordinal();
+        }
+
+        @Override
+        public DoorStatus adaptFromJson(Integer obj) {
+            return DoorStatus.values()[obj];
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/2845dd88/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
----------------------------------------------------------------------
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 e2dc84d..a920324 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
@@ -442,17 +442,24 @@ public class MappingParserImpl implements MappingParser {
             }
         }
         if (adapterKey == null) {
-            final Type[] types = converter.getClass().getGenericInterfaces();
-            for (final Type t : types) {
-                if (!ParameterizedType.class.isInstance(t)) {
-                    continue;
-                }
-                final ParameterizedType pt = ParameterizedType.class.cast(t);
-                if (Adapter.class == pt.getRawType()) {
-                    final Type[] actualTypeArguments = 
pt.getActualTypeArguments();
-                    adapterKey = new AdapterKey(actualTypeArguments[0], 
actualTypeArguments[1]);
-                    reverseAdaptersRegistry.putIfAbsent(converter, adapterKey);
-                    break;
+            if (converter instanceof TypeAwareAdapter) {
+                TypeAwareAdapter typeAwareAdapter = (TypeAwareAdapter) 
converter;
+                adapterKey = new AdapterKey(typeAwareAdapter.getFrom(), 
typeAwareAdapter.getTo());
+                reverseAdaptersRegistry.putIfAbsent(converter, adapterKey);
+
+            } else {
+                final Type[] types = 
converter.getClass().getGenericInterfaces();
+                for (final Type t : types) {
+                    if (!ParameterizedType.class.isInstance(t)) {
+                        continue;
+                    }
+                    final ParameterizedType pt = 
ParameterizedType.class.cast(t);
+                    if (Adapter.class == pt.getRawType()) {
+                        final Type[] actualTypeArguments = 
pt.getActualTypeArguments();
+                        adapterKey = new AdapterKey(actualTypeArguments[0], 
actualTypeArguments[1]);
+                        reverseAdaptersRegistry.putIfAbsent(converter, 
adapterKey);
+                        break;
+                    }
                 }
             }
         }

Reply via email to