Repository: johnzon
Updated Branches:
  refs/heads/master 0e418b490 -> d344cbcb8


example of wrapping with type serialization of a list - we surely need to 
enhance ObjectConverter to support that


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

Branch: refs/heads/master
Commit: d344cbcb8a2371d006f74ceb727e71b032aaf568
Parents: 0e418b4
Author: rmannibucau <[email protected]>
Authored: Fri Jan 27 19:31:48 2017 +0100
Committer: rmannibucau <[email protected]>
Committed: Fri Jan 27 19:31:48 2017 +0100

----------------------------------------------------------------------
 .../johnzon/mapper/reflection/Converters.java   |   4 +-
 .../apache/johnzon/mapper/ObjectTypeTest.java   | 156 +++++++++++++++----
 2 files changed, 129 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/d344cbcb/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Converters.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Converters.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Converters.java
index a852aff..09c176c 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Converters.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Converters.java
@@ -18,8 +18,8 @@
  */
 package org.apache.johnzon.mapper.reflection;
 
-import org.apache.johnzon.mapper.Adapter;
 import org.apache.johnzon.mapper.Converter;
+import org.apache.johnzon.mapper.MapperConverter;
 import org.apache.johnzon.mapper.TypeAwareAdapter;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 
@@ -34,7 +34,7 @@ public class Converters {
     }
 
     // TODO: more ParameterizedType and maybe TypeClosure support
-    public static boolean matches(final Type type, final Adapter<?, ?> 
adapter) {
+    public static boolean matches(final Type type, final MapperConverter 
adapter) {
         Type convertType = null;
         if (ConverterAdapter.class.isInstance(adapter)) {
             final Converter delegate = 
ConverterAdapter.class.cast(adapter).getConverter();

http://git-wip-us.apache.org/repos/asf/johnzon/blob/d344cbcb/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
index b003ac2..8ac0289 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
@@ -19,21 +19,26 @@
 package org.apache.johnzon.mapper;
 
 
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import javax.json.JsonObject;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-
-import javax.json.JsonObject;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 @RunWith(Parameterized.class)
 public class ObjectTypeTest {
@@ -68,8 +73,8 @@ public class ObjectTypeTest {
     public void testReadWithObjectConverter() {
 
         Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
-                                           .addObjectConverter(Dog.class, new 
TestWithTypeConverter())
-                                           .build();
+                .addObjectConverter(Dog.class, new TestWithTypeConverter())
+                .build();
 
         Dog dog = mapper.readObject(getJson(), Dog.class);
         Assert.assertNotNull(dog);
@@ -82,8 +87,8 @@ public class ObjectTypeTest {
         String expectedJson = 
"[{\"poodleName\":\"Poodle1\"},{\"poodleName\":\"Poodle2\"}]";
 
         Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
-                                           .addObjectConverter(Poodle.class, 
new DBAccessPoodleConverter())
-                                           .build();
+                .addObjectConverter(Poodle.class, new 
DBAccessPoodleConverter())
+                .build();
 
         String json = mapper.writeObjectAsString(new 
ArrayList<Poodle>(DBAccessPoodleConverter.POODLES.values()));
         Assert.assertNotNull(json);
@@ -94,8 +99,8 @@ public class ObjectTypeTest {
     public void testReadWithAdvancedObjectConverter() {
 
         Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
-                                           .addObjectConverter(Poodle.class, 
new DBAccessPoodleConverter())
-                                           .build();
+                .addObjectConverter(Poodle.class, new 
DBAccessPoodleConverter())
+                .build();
 
         List<Poodle> poodles = 
mapper.readObject("[{\"poodleName\":\"Poodle1\"},{\"poodleName\":\"Poodle2\"}]",
 new ParameterizedType() {
             @Override
@@ -121,6 +126,33 @@ public class ObjectTypeTest {
         }
     }
 
+    @Test
+    public void multiple() {
+        assumeFalse("field".equals(accessMode) /*we need setType*/);
+
+        final Multiple multiple = new Multiple();
+        multiple.dogs = asList(new Dog(), new Beagle());
+        final Mapper mapper = new MapperBuilder()
+                .setAccessModeName(accessMode)
+                .setReadAttributeBeforeWrite(true)
+                .setAttributeOrder(new Comparator<String>() {
+                    @Override
+                    public int compare(final String o1, final String o2) {
+                        return o1.compareTo(o2); // type before value
+                    }
+                }).build();
+        final String json = "{\"dogs\":[" +
+                
"{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Dog\",\"value\":{}}," +
+                
"{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{}}]}";
+        assertEquals(json, mapper.writeObjectAsString(multiple));
+
+        final Multiple deser = mapper.readObject(json, Multiple.class);
+        assertEquals(2, deser.dogs.size());
+        assertTrue(Dog.class.isInstance(deser.dogs.get(0)));
+        assertFalse(Beagle.class.isInstance(deser.dogs.get(0)));
+        assertTrue(Beagle.class.isInstance(deser.dogs.get(1)));
+    }
+
 
     private Mutt getJavaObject() {
         Poodle mum = new Poodle();
@@ -143,20 +175,20 @@ public class ObjectTypeTest {
 
     private String getJson() {
         return "{" +
-                                          
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Mutt\"," +
-                                          "\"father\":{" +
-                                            
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
-                                              "\"father\":{" +
-                                                
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
-                                                "\"name\":\"Wuffi\"" +
-                                              "}," +
-                                              "\"name\":\"Gnarl\"}," +
-                                          "\"mother\":{" +
-                                            
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\"," +
-                                            "\"hairCut\":true," +
-                                            "\"name\":\"Rosa\"}," +
-                                          "\"name\":\"Snoopie\"" +
-                                        "}";
+                
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Mutt\"," +
+                "\"father\":{" +
+                
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
+                "\"father\":{" +
+                
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
+                "\"name\":\"Wuffi\"" +
+                "}," +
+                "\"name\":\"Gnarl\"}," +
+                "\"mother\":{" +
+                
"\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\"," +
+                "\"hairCut\":true," +
+                "\"name\":\"Rosa\"}," +
+                "\"name\":\"Snoopie\"" +
+                "}";
     }
 
 
@@ -176,7 +208,6 @@ public class ObjectTypeTest {
         }
 
 
-
         /**
          * Helper method to check that javaType is really a subclass of 
targetType.
          * Might get moved to a utility class
@@ -195,7 +226,7 @@ public class ObjectTypeTest {
                     if (targetType instanceof Class) {
                         targetClass = (Class) targetType;
                     } else if (targetType instanceof ParameterizedType) {
-                        targetClass = (Class)((ParameterizedType) 
targetType).getRawType();
+                        targetClass = (Class) ((ParameterizedType) 
targetType).getRawType();
                     }
                     if (targetClass != null && 
targetClass.isAssignableFrom(subClass)) {
                         return subClass;
@@ -209,6 +240,72 @@ public class ObjectTypeTest {
         }
     }
 
+    public static class Multiple {
+        @JohnzonConverter(TypeAdapter.class)
+        private List<Dog> dogs;
+
+        @JohnzonConverter(TypeAdapter.class)
+        public List<Dog> getDogs() {
+            return dogs;
+        }
+
+        @JohnzonConverter(TypeAdapter.class)
+        public void setDogs(final List<Dog> dogs) {
+            this.dogs = dogs;
+        }
+    }
+
+    public static class TypeAdapter implements TypeAwareAdapter<Dog, 
TypeInstance> {
+        @Override
+        public Dog to(final TypeInstance typeInstance) {
+            return typeInstance.value;
+        }
+
+        @Override
+        public TypeInstance from(final Dog dog) {
+            final TypeInstance typeInstance = new TypeInstance();
+            typeInstance.type = dog.getClass().getName();
+            typeInstance.value = dog;
+            return typeInstance;
+        }
+
+        @Override
+        public Type getTo() {
+            return TypeInstance.class;
+        }
+
+        @Override
+        public Type getFrom() {
+            return Dog.class;
+        }
+    }
+
+    public static class TypeInstance {
+        private String type;
+        private Dog value;
+
+        public String getType() {
+            return type;
+        }
+
+        public void setType(final String type) {
+            this.type = type;
+            try {
+                this.value = 
Dog.class.cast(Thread.currentThread().getContextClassLoader().loadClass(type).newInstance());
+            } catch (final Exception e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+        public Dog getValue() {
+            return value;
+        }
+
+        public void setValue(final Dog value) {
+            this.value = value;
+        }
+    }
+
     public static class Dog {
         private String name;
         private Dog father;
@@ -293,6 +390,7 @@ public class ObjectTypeTest {
         public static final String POODLE_2_NAME = "Poodle2";
 
         public static final Map<String, Poodle> POODLES = new 
LinkedHashMap<String, Poodle>(2);
+
         static {
             Poodle poodle1 = new Poodle();
             poodle1.setHairCut(true);

Reply via email to