http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java index e1bba2e..5661ee2 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java @@ -18,32 +18,26 @@ */ package org.apache.johnzon.mapper.access; -import org.apache.johnzon.mapper.Adapter; -import org.apache.johnzon.mapper.JohnzonAny; -import org.apache.johnzon.mapper.Converter; -import org.apache.johnzon.mapper.JohnzonConverter; -import org.apache.johnzon.mapper.MapperConverter; -import org.apache.johnzon.mapper.ObjectConverter; -import org.apache.johnzon.mapper.internal.ConverterAdapter; -import org.apache.johnzon.mapper.reflection.JohnzonParameterizedType; +import static org.apache.johnzon.mapper.reflection.Converters.matches; import java.beans.ConstructorProperties; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; -import java.lang.reflect.GenericDeclaration; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Map; -import static java.util.Arrays.asList; -import static org.apache.johnzon.mapper.reflection.Converters.matches; +import org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.Converter; +import org.apache.johnzon.mapper.JohnzonAny; +import org.apache.johnzon.mapper.JohnzonConverter; +import org.apache.johnzon.mapper.MapperConverter; +import org.apache.johnzon.mapper.ObjectConverter; +import org.apache.johnzon.mapper.internal.ConverterAdapter; // handle some specific types public abstract class BaseAccessMode implements AccessMode { @@ -134,6 +128,7 @@ public abstract class BaseAccessMode implements AccessMode { final String[] constructorParameters; final Adapter<?, ?>[] constructorParameterConverters; final Adapter<?, ?>[] constructorItemParameterConverters; + final ObjectConverter.Codec<?>[] objectConverters; if (constructorHasArguments) { factoryParameterTypes = constructor.getGenericParameterTypes(); @@ -143,6 +138,7 @@ public abstract class BaseAccessMode implements AccessMode { constructorParameterConverters = new Adapter<?, ?>[constructor.getGenericParameterTypes().length]; constructorItemParameterConverters = new Adapter<?, ?>[constructorParameterConverters.length]; + objectConverters = new ObjectConverter.Codec[constructorParameterConverters.length]; for (int i = 0; i < constructorParameters.length; i++) { for (final Annotation a : constructor.getParameterAnnotations()[i]) { if (a.annotationType() == JohnzonConverter.class) { @@ -158,7 +154,7 @@ public abstract class BaseAccessMode implements AccessMode { constructorItemParameterConverters[i] = converter; } } else { - throw new UnsupportedOperationException("TODO implement"); + objectConverters[i] = (ObjectConverter.Codec<?>) mapperConverter; } } catch (final Exception e) { throw new IllegalArgumentException(e); @@ -171,6 +167,7 @@ public abstract class BaseAccessMode implements AccessMode { constructorParameters = null; constructorParameterConverters = null; constructorItemParameterConverters = null; + objectConverters = null; } final Constructor<?> cons = constructor; @@ -213,6 +210,11 @@ public abstract class BaseAccessMode implements AccessMode { public Adapter<?, ?>[] getParameterItemConverter() { return constructorItemParameterConverters; } + + @Override + public ObjectConverter.Codec<?>[] getObjectConverter() { + return objectConverters; + } }; } @@ -263,78 +265,4 @@ public abstract class BaseAccessMode implements AccessMode { } return delegate; } - - protected Type fixType(final Class<?> clazz, final Type type) { // to enhance - if (TypeVariable.class.isInstance(type)) { // we need to handle it on deserialization side, not needed on serialization side - return fixTypeVariable(clazz, type); - } - if (ParameterizedType.class.isInstance(type)) { - final ParameterizedType pt = ParameterizedType.class.cast(type); - final Type[] actualTypeArguments = pt.getActualTypeArguments(); - if (actualTypeArguments.length == 1 && Class.class.isInstance(pt.getRawType()) - && Collection.class.isAssignableFrom(Class.class.cast(pt.getRawType())) - && Class.class.cast(pt.getRawType()).getName().startsWith("java.util.") - && TypeVariable.class.isInstance(actualTypeArguments[0])) { - return new JohnzonParameterizedType(pt.getRawType(), fixTypeVariable(clazz, actualTypeArguments[0])); - } else if (actualTypeArguments.length == 2 && Class.class.isInstance(pt.getRawType()) - && Map.class.isAssignableFrom(Class.class.cast(pt.getRawType())) - && Class.class.cast(pt.getRawType()).getName().startsWith("java.util.") - && TypeVariable.class.isInstance(actualTypeArguments[1])) { - return new JohnzonParameterizedType(pt.getRawType(), actualTypeArguments[0], fixTypeVariable(clazz, actualTypeArguments[1])); - } - } - return type; - } - - private Type fixTypeVariable(final Class<?> clazz, final Type type) { - final TypeVariable typeVariable = TypeVariable.class.cast(type); - final Class<?> classWithDeclaration = findClass(clazz.getSuperclass(), typeVariable.getGenericDeclaration()); - - if (classWithDeclaration != null) { - // try to match generic - final TypeVariable<? extends Class<?>>[] typeParameters = classWithDeclaration.getTypeParameters(); - final int idx = asList(typeParameters).indexOf(typeVariable); - if (idx >= 0) { - - ParameterizedType pt = findParameterizedType(clazz, classWithDeclaration); - if (pt != null) { - if (pt.getActualTypeArguments().length == typeParameters.length) { - return pt.getActualTypeArguments()[idx]; - } - } - } - } - return type; - } - - private Class<?> findClass(final Class<?> clazz, final GenericDeclaration genericDeclaration) { - - if (clazz == null || clazz == genericDeclaration) { - return clazz; - } - - final Class<?> superclass = clazz.getSuperclass(); - if (superclass != null && superclass != Object.class) { - return findClass(superclass, genericDeclaration); - } - - return null; - } - - private ParameterizedType findParameterizedType(Class<?> clazz, Class<?> classWithDeclaration) { - - if (clazz == Object.class) { - return null; - } - - Type genericSuperclass = clazz.getGenericSuperclass(); - - if (genericSuperclass instanceof ParameterizedType && - ((ParameterizedType) genericSuperclass).getRawType() == classWithDeclaration) { - - return (ParameterizedType) genericSuperclass; - } - - return findParameterizedType(clazz.getSuperclass(), classWithDeclaration); - } }
http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java index cff4358..831f895 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java @@ -18,12 +18,6 @@ */ package org.apache.johnzon.mapper.access; -import org.apache.johnzon.mapper.Adapter; -import org.apache.johnzon.mapper.JohnzonAny; -import org.apache.johnzon.mapper.JohnzonProperty; -import org.apache.johnzon.mapper.MapperException; -import org.apache.johnzon.mapper.ObjectConverter; - import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -31,6 +25,12 @@ import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; +import org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.JohnzonAny; +import org.apache.johnzon.mapper.JohnzonProperty; +import org.apache.johnzon.mapper.MapperException; +import org.apache.johnzon.mapper.ObjectConverter; + public class FieldAccessMode extends BaseAccessMode { public FieldAccessMode(final boolean useConstructor, final boolean acceptHiddenConstructor) { super(useConstructor, acceptHiddenConstructor); @@ -39,14 +39,14 @@ public class FieldAccessMode extends BaseAccessMode { @Override public Map<String, Reader> doFindReaders(final Class<?> clazz) { final Map<String, Reader> readers = new HashMap<String, Reader>(); - for (final Map.Entry<String, Field> f : fields(clazz).entrySet()) { + for (final Map.Entry<String, Field> f : fields(clazz, true).entrySet()) { final String key = f.getKey(); if (isIgnored(key) || Meta.getAnnotation(f.getValue(), JohnzonAny.class) != null) { continue; } final Field field = f.getValue(); - readers.put(extractKey(field, key), new FieldReader(field, fixType(clazz, field.getGenericType()))); + readers.put(extractKey(field, key), new FieldReader(field, field.getGenericType())); } return readers; } @@ -54,14 +54,14 @@ public class FieldAccessMode extends BaseAccessMode { @Override public Map<String, Writer> doFindWriters(final Class<?> clazz) { final Map<String, Writer> writers = new HashMap<String, Writer>(); - for (final Map.Entry<String, Field> f : fields(clazz).entrySet()) { + for (final Map.Entry<String, Field> f : fields(clazz, false).entrySet()) { final String key = f.getKey(); if (isIgnored(key)) { continue; } final Field field = f.getValue(); - writers.put(extractKey(field, key), new FieldWriter(field, fixType(clazz, field.getGenericType()))); + writers.put(extractKey(field, key), new FieldWriter(field, field.getGenericType())); } return writers; } @@ -75,7 +75,7 @@ public class FieldAccessMode extends BaseAccessMode { return key.contains("$"); } - protected Map<String, Field> fields(final Class<?> clazz) { + protected Map<String, Field> fields(final Class<?> clazz, boolean includeFinalFields) { final Map<String, Field> fields = new HashMap<String, Field>(); Class<?> current = clazz; while (current != null && current != Object.class) { @@ -84,7 +84,8 @@ public class FieldAccessMode extends BaseAccessMode { final int modifiers = f.getModifiers(); if (fields.containsKey(name) || Modifier.isStatic(modifiers) - || Modifier.isTransient(modifiers)) { + || Modifier.isTransient(modifiers) + || (!includeFinalFields && Modifier.isFinal(modifiers))) { continue; } fields.put(name, f); http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java index c81c070..b694bd2 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java @@ -18,12 +18,6 @@ */ package org.apache.johnzon.mapper.access; -import org.apache.johnzon.mapper.Adapter; -import org.apache.johnzon.mapper.JohnzonAny; -import org.apache.johnzon.mapper.JohnzonProperty; -import org.apache.johnzon.mapper.MapperException; -import org.apache.johnzon.mapper.ObjectConverter; - import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; @@ -34,6 +28,12 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.JohnzonAny; +import org.apache.johnzon.mapper.JohnzonProperty; +import org.apache.johnzon.mapper.MapperException; +import org.apache.johnzon.mapper.ObjectConverter; + public class MethodAccessMode extends BaseAccessMode { private final boolean supportGetterAsWritter; @@ -52,7 +52,7 @@ public class MethodAccessMode extends BaseAccessMode { if (isIgnored(descriptor.getName()) || Meta.getAnnotation(readMethod, JohnzonAny.class) != null) { continue; } - readers.put(extractKey(descriptor.getName(), readMethod, null), new MethodReader(readMethod, fixType(clazz, readMethod.getGenericReturnType()))); + readers.put(extractKey(descriptor.getName(), readMethod, null), new MethodReader(readMethod, readMethod.getGenericReturnType())); } } return readers; @@ -69,12 +69,12 @@ public class MethodAccessMode extends BaseAccessMode { final Method writeMethod = descriptor.getWriteMethod(); if (writeMethod != null) { writers.put(extractKey(descriptor.getName(), writeMethod, descriptor.getReadMethod()), - new MethodWriter(writeMethod, fixType(clazz, writeMethod.getGenericParameterTypes()[0]))); + new MethodWriter(writeMethod, writeMethod.getGenericParameterTypes()[0])); } else if (supportGetterAsWritter && Collection.class.isAssignableFrom(descriptor.getPropertyType()) && descriptor.getReadMethod() != null) { final Method readMethod = descriptor.getReadMethod(); - writers.put(extractKey(descriptor.getName(), readMethod, null), new MethodGetterAsWriter(readMethod, fixType(clazz, readMethod.getGenericReturnType()))); + writers.put(extractKey(descriptor.getName(), readMethod, null), new MethodGetterAsWriter(readMethod, readMethod.getGenericReturnType())); } } return writers; http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java new file mode 100644 index 0000000..201a609 --- /dev/null +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java @@ -0,0 +1,71 @@ +/* + * 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.mapper.internal; + +import org.apache.johnzon.core.JsonPointerUtil; + +/** + * Internal class to easily collect information about the 'depth' of a json object + * without having to eagerly construct it. + * + * For use in recursive generator and parser method calls to defer string operations. + */ +public class JsonPointerTracker { + private final JsonPointerTracker parent; + private final String currentNode; + + private String jsonPointer; + + + /** + * @param parent or {@code null} if this is the root object + * @param currentNode the name of the attribute or "/" for the root object + */ + public JsonPointerTracker(JsonPointerTracker parent, String currentNode) { + this.parent = parent; + this.currentNode = currentNode; + } + + /** + * For Arrays and Lists. + * @param jsonPointer + * @param i current counter number + */ + public JsonPointerTracker(JsonPointerTracker jsonPointer, int i) { + this(jsonPointer, Integer.toString(i)); + } + + @Override + public String toString() { + if (jsonPointer == null) { + if (parent != null) { + if (parent.parent == null) { + jsonPointer = "/" + JsonPointerUtil.encode(currentNode); + } else { + jsonPointer = parent.toString() + "/" + JsonPointerUtil.encode(currentNode); + } + } else { + jsonPointer = "/"; + } + } + + return jsonPointer; + } + +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java new file mode 100644 index 0000000..a456f94 --- /dev/null +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java @@ -0,0 +1,97 @@ +/* + * 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.mapper.reflection; + +import static java.util.Arrays.asList; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.util.ArrayList; +import java.util.Collection; + +public final class Generics { + private Generics() { + // no-op + } + + // todo: this piece of code needs to be enhanced a lot: + // - better handling of the hierarchy + // - wildcard support? + // - cycle handling (Foo<Foo>) + // - .... + public static Type resolve(final Type value, final Class<?> rootClass) { + if (TypeVariable.class.isInstance(value)) { + return resolveTypeVariable(value, rootClass); + } + if (ParameterizedType.class.isInstance(value)) { + return resolveParameterizedType(value, rootClass); + } + return value; + } + + private static Type resolveParameterizedType(final Type value, final Class<?> rootClass) { + Collection<Type> args = null; + final ParameterizedType parameterizedType = ParameterizedType.class.cast(value); + int index = 0; + for (final Type arg : parameterizedType.getActualTypeArguments()) { + final Type type = resolve(arg, rootClass); + if (type != arg) { + if (args == null) { + args = new ArrayList<Type>(); + if (index > 0) { + args.addAll(asList(parameterizedType.getActualTypeArguments()).subList(0, index)); + } + } + } + if (args != null) { + args.add(type); + } + index++; + } + if (args != null) { + return new JohnzonParameterizedType(parameterizedType.getRawType(), args.toArray(new Type[args.size()])); + } + return value; + } + + // for now the level is hardcoded to 2 with generic > concrete + private static Type resolveTypeVariable(final Type value, final Class<?> rootClass) { + final TypeVariable<?> tv = TypeVariable.class.cast(value); + Type parent = rootClass == null ? null : rootClass.getGenericSuperclass(); + while (Class.class.isInstance(parent)) { + parent = Class.class.cast(parent).getGenericSuperclass(); + } + while (ParameterizedType.class.isInstance(parent) && ParameterizedType.class.cast(parent).getRawType() != tv.getGenericDeclaration()) { + parent = Class.class.cast(ParameterizedType.class.cast(parent).getRawType()).getGenericSuperclass(); + } + if (ParameterizedType.class.isInstance(parent)) { + final ParameterizedType parentPt = ParameterizedType.class.cast(parent); + final int argIndex = asList(Class.class.cast(parentPt.getRawType()).getTypeParameters()).indexOf(tv); + if (argIndex >= 0) { + final Type type = parentPt.getActualTypeArguments()[argIndex]; + if (TypeVariable.class.isInstance(type)) { + return resolveTypeVariable(type, rootClass); + } + return type; + } + } + return value; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java b/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java index 532d32c..93733d9 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java @@ -69,7 +69,7 @@ public class TestBufferProvider implements BufferStrategy.BufferProvider<char[]> } public int newBufferCalls() { - return releaseCalls.get(); + return newBufferCalls.get(); } public void clear() { http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java new file mode 100644 index 0000000..4175607 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java @@ -0,0 +1,298 @@ +/* + * 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.mapper; + +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +/** + * Test serialising objects which contain the same Object multiple times, + * sometimes even with cycles. + */ +public class CircularObjectsTest { + + @Test + public void testSimpleCyclicPerson() { + Person john = new Person("John"); + Person marry = new Person("Marry"); + + john.setMarriedTo(marry); + marry.setMarriedTo(john); + + Mapper mapper = new MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build(); + String ser = mapper.writeObjectAsString(john); + + assertNotNull(ser); + assertTrue(ser.contains("\"name\":\"John\"")); + assertTrue(ser.contains("\"marriedTo\":\"/\"")); + assertTrue(ser.contains("\"name\":\"Marry\"")); + + // and now de-serialise it back + Person john2 = mapper.readObject(ser, Person.class); + assertNotNull(john2); + assertEquals("John", john2.getName()); + + Person marry2 = john2.getMarriedTo(); + assertNotNull(marry2); + assertEquals("Marry", marry2.getName()); + + assertEquals(john2, marry2.getMarriedTo()); + } + + @Test + public void testSimpleCyclicPersonAnnotatedDedup() { + DeduplicatedPerson john = new DeduplicatedPerson("John"); + DeduplicatedPerson marry = new DeduplicatedPerson("Marry"); + + john.setMarriedTo(marry); + marry.setMarriedTo(john); + + Mapper mapper = new MapperBuilder().setAccessModeName("field").build(); + String ser = mapper.writeObjectAsString(john); + + assertNotNull(ser); + assertTrue(ser.contains("\"name\":\"John\"")); + assertTrue(ser.contains("\"marriedTo\":\"/\"")); + assertTrue(ser.contains("\"name\":\"Marry\"")); + + // and now de-serialise it back + DeduplicatedPerson john2 = mapper.readObject(ser, DeduplicatedPerson.class); + assertNotNull(john2); + assertEquals("John", john2.getName()); + + DeduplicatedPerson marry2 = john2.getMarriedTo(); + assertNotNull(marry2); + assertEquals("Marry", marry2.getName()); + + assertEquals(john2, marry2.getMarriedTo()); + } + + @Test + public void testComplexCyclicPerson() { + Person karl = new Person("Karl"); + Person andrea = new Person("Andrea"); + Person lu = new Person("Lu"); + Person sue = new Person("Sue"); + + karl.setMarriedTo(andrea); + karl.getKids().add(lu); + karl.getKids().add(sue); + + andrea.setMarriedTo(karl); + andrea.getKids().add(lu); + andrea.getKids().add(sue); + + lu.setFather(karl); + lu.setMother(andrea); + + sue.setFather(karl); + sue.setMother(andrea); + + Mapper mapper = new MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build(); + + { + // test karl + String karlJson = mapper.writeObjectAsString(karl); + Person karl2 = mapper.readObject(karlJson, Person.class); + assertEquals("Karl", karl2.getName()); + assertEquals("Andrea", karl2.getMarriedTo().getName()); + assertEquals(karl2, karl2.getMarriedTo().getMarriedTo()); + assertEquals(2, karl2.getKids().size()); + assertEquals("Lu", karl2.getKids().get(0).getName()); + assertEquals("Sue", karl2.getKids().get(1).getName()); + assertEquals(2, karl2.getMarriedTo().getKids().size()); + assertEquals("Lu", karl2.getMarriedTo().getKids().get(0).getName()); + assertEquals("Sue", karl2.getMarriedTo().getKids().get(1).getName()); + } + + { + // test Sue + String sueJson = mapper.writeObjectAsString(sue); + Person sue2 = mapper.readObject(sueJson, Person.class); + + assertEquals("Sue", sue2.getName()); + assertNull(sue2.getMarriedTo()); + assertEquals("Andrea", sue2.getMother().getName()); + assertEquals("Karl", sue2.getFather().getName()); + + assertEquals(sue2.getMother().getKids().get(0), sue2.getFather().getKids().get(0)); + assertEquals(sue2.getMother().getKids().get(1), sue2.getFather().getKids().get(1)); + } + } + + @Test + public void testCyclesInArrays() { + Person karl = new Person("Karl"); + Person andrea = new Person("Andrea"); + Person lu = new Person("Lu"); + Person sue = new Person("Sue"); + + karl.setMarriedTo(andrea); + karl.getKids().add(lu); + karl.getKids().add(sue); + + andrea.setMarriedTo(karl); + andrea.getKids().add(lu); + andrea.getKids().add(sue); + + lu.setFather(karl); + lu.setMother(andrea); + + sue.setFather(karl); + sue.setMother(andrea); + + Mapper mapper = new MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build(); + + // test deep array + Person[] people = new Person[4]; + people[0] = karl; + people[1] = andrea; + people[2] = lu; + people[3] = sue; + + String peopleJson = mapper.writeArrayAsString(people); + Person[] people2 = mapper.readArray(new StringReader(peopleJson), Person.class); + assertNotNull(people2); + assertEquals(4, people2.length); + assertEquals("Karl", people2[0].getName()); + assertEquals("Andrea", people2[1].getName()); + assertEquals("Lu", people2[2].getName()); + assertEquals("Sue", people2[3].getName()); + + } + + public static class Person { + private String name; + private Person marriedTo; + private Person mother; + private Person father; + private List<Person> kids = new ArrayList<Person>(); + + public Person() { + } + + public Person(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Person getMarriedTo() { + return marriedTo; + } + + public void setMarriedTo(Person marriedTo) { + this.marriedTo = marriedTo; + } + + public Person getMother() { + return mother; + } + + public void setMother(Person mother) { + this.mother = mother; + } + + public Person getFather() { + return father; + } + + public void setFather(Person father) { + this.father = father; + } + + public List<Person> getKids() { + return kids; + } + + public void setKids(List<Person> kids) { + this.kids = kids; + } + } + + @JohnzonDeduplicateObjects + public static class DeduplicatedPerson { + private String name; + private DeduplicatedPerson marriedTo; + private DeduplicatedPerson mother; + private DeduplicatedPerson father; + private List<DeduplicatedPerson> kids = new ArrayList<DeduplicatedPerson>(); + + public DeduplicatedPerson() { + } + + public DeduplicatedPerson(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public DeduplicatedPerson getMarriedTo() { + return marriedTo; + } + + public void setMarriedTo(DeduplicatedPerson marriedTo) { + this.marriedTo = marriedTo; + } + + public DeduplicatedPerson getMother() { + return mother; + } + + public void setMother(DeduplicatedPerson mother) { + this.mother = mother; + } + + public DeduplicatedPerson getFather() { + return father; + } + + public void setFather(DeduplicatedPerson father) { + this.father = father; + } + + public List<DeduplicatedPerson> getKids() { + return kids; + } + + public void setKids(List<DeduplicatedPerson> kids) { + this.kids = kids; + } + } + +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java new file mode 100644 index 0000000..0125ff4 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java @@ -0,0 +1,67 @@ +/* + * 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.mapper; + +import org.junit.Test; + +import java.io.StringReader; +import java.util.Locale; + +import static org.junit.Assert.assertEquals; + +public class CustomEnumCodecTest { + @Test + public void roundTrip() { + final Mapper mapper = new MapperBuilder().addAdapter(E.class, String.class, new EConverter()).build(); + final String json = "{\"e\":\"a\"}"; + final EHolder holder = mapper.readObject(json, EHolder.class); + assertEquals(E.A, holder.e); + assertEquals(json, mapper.writeObjectAsString(holder)); + } + + @Test + public void roundTripArray() { + final Mapper mapper = new MapperBuilder().addAdapter(E.class, String.class, new EConverter()).build(); + final String json = "[\"b\"]"; + final E[] es = mapper.readArray(new StringReader(json), E.class); + assertEquals(1, es.length); + assertEquals(E.B, es[0]); + assertEquals(json, mapper.writeArrayAsString(es)); + } + + public static class EHolder { + public E e; + } + + public enum E { + A, B + } + + public static class EConverter implements Adapter<E, String> { + @Override + public String from(final E instance) { + return instance.name().toLowerCase(Locale.ENGLISH); + } + + @Override + public E to(final String text) { + return E.valueOf(text.toUpperCase(Locale.ENGLISH)); + } + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java index 841e4ec..f69ea3b 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java @@ -23,6 +23,7 @@ import org.junit.Test; import java.util.Arrays; import java.util.Comparator; +import java.util.EnumSet; import java.util.List; public class EnumTest { @@ -89,6 +90,21 @@ public class EnumTest { .build()); } + @Test + public void testEnumSet() { + EnumSetObject eso = new EnumSetObject(); + eso.setEnumset(EnumSet.of(AdvancedEnum.VALUE_1, AdvancedEnum.VALUE_2)); + + String json = newTestMapperBuilder().build().writeObjectAsString(eso); + + EnumSetObject eso2 = newTestMapperBuilder().build().readObject(json, EnumSetObject.class); + Assert.assertNotNull(eso2); + Assert.assertNotNull(eso2.getEnumset()); + Assert.assertEquals(2, eso2.getEnumset().size()); + Assert.assertTrue(eso2.getEnumset().contains(AdvancedEnum.VALUE_1)); + Assert.assertTrue(eso2.getEnumset().contains(AdvancedEnum.VALUE_2)); + } + private void testAdvancedEnum(Mapper mapper) { AdvancedEnumObject object = new AdvancedEnumObject(AdvancedEnum.VALUE_1, Arrays.asList(AdvancedEnum.VALUE_2, AdvancedEnum.VALUE_1, @@ -146,10 +162,22 @@ public class EnumTest { } } + public static class EnumSetObject { + private EnumSet<AdvancedEnum> enumset; + + public EnumSet<AdvancedEnum> getEnumset() { + return enumset; + } + + public void setEnumset(EnumSet<AdvancedEnum> enumset) { + this.enumset = enumset; + } + } public enum AdvancedEnum { VALUE_1("one", 1), - VALUE_2("two", 2); + VALUE_2("two", 2), + VALUE_3("three", 3); private String string; private int i; http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java new file mode 100644 index 0000000..2f78b6b --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java @@ -0,0 +1,52 @@ +/* + * 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.mapper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.superbiz.Model; + +import java.util.Comparator; + +public class GenericsTest { + @Test + public void typeVariableMultiLevel() { + final String input = "{\"aalist\":[{\"detail\":\"something2\",\"name\":\"Na2\"}]," + + "\"childA\":{\"detail\":\"something\",\"name\":\"Na\"},\"childB\":{}}"; + + final Mapper mapper = new MapperBuilder().setAttributeOrder(new Comparator<String>() { + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2); + } + }).build(); + + final Model model = mapper.readObject(input, Model.class); + assertNotNull(model.getChildA()); + assertNotNull(model.getChildB()); + assertNotNull(model.getAalist()); + assertEquals("something", model.getChildA().detail); + assertEquals("Na", model.getChildA().name); + assertEquals(1, model.getAalist().size()); + assertEquals("something2", model.getAalist().iterator().next().detail); + assertEquals(input, mapper.writeObjectAsString(model)); + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java new file mode 100644 index 0000000..c64c8e6 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java @@ -0,0 +1,67 @@ +/* + * 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.mapper; + +import org.junit.Test; + +import java.util.Collection; +import java.util.Comparator; + +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; + +public class JohnzonIgnoreNestedTest { + @Test + public void ignoreNested() { + final To to = new To(); + to.name = "to"; + + final Person from = new Person(); + from.name = "myname"; + from.street = "blastreet 1"; + from.description = "gets ignored"; + + to.person = from; + to.persons = singletonList(from); + + final Mapper mapper = new MapperBuilder().setAttributeOrder(new Comparator<String>() { + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2); + } + }).build(); + assertEquals("{\"name\":\"to\",\"person\":{\"name\":\"myname\"},\"persons\":[{\"name\":\"myname\"}]}", mapper.writeObjectAsString(to)); + } + + public static class To { + public String name; + + @JohnzonIgnoreNested(properties = {"street", "description"}) + public Person person; + + @JohnzonIgnoreNested(properties = {"street", "description"}) + public Collection<Person> persons; + } + + public static class Person { + public String name; + public String street; + public String description; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java index dc74f24..830779e 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java @@ -85,6 +85,16 @@ public class LiteralTest { } + @Test + public void readWhenUseBigDecimalForFloats() throws Exception { + final String json = "[1.5]"; + final List<Object> expected = new ArrayList<Object>(); + expected.add(new BigDecimal(1.5d)); + final Collection<Object> read = new MapperBuilder().setUseBigDecimalForFloats(true).build() + .readCollection(new StringReader(json), new JohnzonParameterizedType(List.class, Object.class)); + assertEquals(expected, read); + } + @Test(expected = NumberFormatException.class) public void writeReadNumbersInf() { final NumberClass nc = new NumberClass(); http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java index f51ce91..0a9cc7f 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java @@ -166,7 +166,7 @@ public class MapperConfigTest { new FieldAccessMode(true, true), Charset.forName("UTF-8"), null, - false); + false, false, null, false, false); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java index 594315a..0f58356 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java @@ -38,6 +38,7 @@ import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.SortedMap; import java.util.TreeMap; import static java.util.Arrays.asList; @@ -160,6 +161,29 @@ public class MapperTest { } @Test + public void sortedMap() { + final Mapper sortedMapper = new MapperBuilder().setAttributeOrder(new Comparator<String>() { + @Override + public int compare(final String o1, final String o2) { + return o2.compareTo(o1); + } + }).build(); + final Map<String, String> sorted = new TreeMap<String, String>(new Comparator<String>() { + @Override + public int compare(final String o1, final String o2) { + return o1.compareTo(o2); + } + }); + sorted.put("a", "1"); + sorted.put("b", "2"); + sorted.put("c", "3"); + assertEquals("{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\"}", sortedMapper.writeObjectAsString(sorted)); + assertEquals(asList("c", "b", "a"), new ArrayList<Object>(Map.class.cast( + sortedMapper.readObject("{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\"}", + new JohnzonParameterizedType(SortedMap.class, String.class, String.class))).keySet())); + } + + @Test public void justObjectAsModel() { final Mapper encodingAwareMapper = new MapperBuilder().setEncoding("UTF-8" /*otherwise guess algo fails for too small string*/).build(); final Mapper simpleMapper = new MapperBuilder().build(); @@ -184,8 +208,9 @@ public class MapperTest { // read assertEquals(Boolean.TRUE, simpleMapper.readObject(new ByteArrayInputStream("true".getBytes()), Object.class)); assertEquals(Boolean.FALSE, simpleMapper.readObject(new ByteArrayInputStream("false".getBytes()), Object.class)); - assertEquals(1., encodingAwareMapper - .readObject(new ByteArrayInputStream("1".getBytes()), Object.class)); + assertEquals(1., + (Double) encodingAwareMapper.readObject(new ByteArrayInputStream("1".getBytes()), Object.class), + 0.1); assertEquals("val", simpleMapper.readObject(new ByteArrayInputStream("\"val\"".getBytes()), Object.class)); assertEquals(asList("val1", "val2"), simpleMapper.readObject(new ByteArrayInputStream("[\"val1\", \"val2\"]".getBytes()), Object.class)); assertEquals(new HashMap<String, Object>() {{ http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java index 54354a2..c76d7bf 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java @@ -21,8 +21,11 @@ package org.apache.johnzon.mapper; import static org.junit.Assert.assertEquals; import java.io.StringWriter; +import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import org.junit.Test; @@ -37,6 +40,54 @@ public class NullTest { } @Test + public void writeListWithNull() { + StringWriter writer = new StringWriter(); + new MapperBuilder().build().writeIterable(Arrays.asList("one", "two", null, "four"), writer); + assertEquals("[\"one\",\"two\",null,\"four\"]", writer.toString()); + } + + @Test + public void writeListWithNullWithinMap() { + StringWriter writer = new StringWriter(); + new MapperBuilder().build().writeObject(Collections.singletonMap("list", + Arrays.asList(5L, null, 300L, 90000000000L)), writer); + assertEquals("{\"list\":[5,null,300,90000000000]}", writer.toString()); + } + + @Test + public void writeListWithNullWithinType() { + StringWriter writer = new StringWriter(); + NullContainer container = new NullContainer(); + container.setList(Arrays.asList(1.4142, 1.7320508757, null, 3.14159)); + new MapperBuilder().build().writeObject(container, writer); + assertEquals("{\"list\":[1.4142,1.7320508757,null,3.14159]}", writer.toString()); + } + + @Test + public void writeArrayWithNull() { + StringWriter writer = new StringWriter(); + new MapperBuilder().build().writeArray(new String[]{ "one", "two", "three", null }, writer); + assertEquals("[\"one\",\"two\",\"three\",null]", writer.toString()); + } + + @Test + public void writeArrayWithNullWithinMap() { + StringWriter writer = new StringWriter(); + new MapperBuilder().build().writeObject(Collections.singletonMap("array", + new Long[]{ null, 100L, 300L, 90000000000L }), writer); + assertEquals("{\"array\":[null,100,300,90000000000]}", writer.toString()); + } + + @Test + public void writeArrayWithNullWithinType() { + StringWriter writer = new StringWriter(); + NullContainer container = new NullContainer(); + container.setArray(new Double[]{ 1.4142, 1.7320508757, 2.2360679775, null }); + new MapperBuilder().build().writeObject(container, writer); + assertEquals("{\"array\":[1.4142,1.7320508757,2.2360679775,null]}", writer.toString()); + } + + @Test public void writeNullObjectDefaultMap() { final StringWriter writer = new StringWriter(); @@ -192,4 +243,24 @@ public class NullTest { } + public static class NullContainer { + private List<Double> list; + private Double[] array; + + public Double[] getArray() { + return array; + } + + public void setArray(Double[] array) { + this.array = array; + } + + public List<Double> getList() { + return list; + } + + public void setList(final List<Double> list) { + this.list = list; + } + } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java index 510672d..c465f8b 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java @@ -24,6 +24,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import javax.json.JsonObject; +import java.beans.ConstructorProperties; import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; @@ -159,6 +160,38 @@ public class ObjectConverterWithAnnotationTest { Assert.assertEquals(expected, tourDeFlanderen); } + @Test + public void testDeserializeObjectWithAnnotatedConsturctorParameter() { + + String json = "{" + + "\"bike\": {" + + "\"" + MANUFACTURER_ID + "\":1," + + "\"" + TYPE_INDEX + "\":0" + + "}" + + "}"; + + Mapper mapper = new MapperBuilder().setAccessModeName(accessMode) + .setReadAttributeBeforeWrite(true) + .build(); + + BikeWrapper bikeWrapper = mapper.readObject(json, BikeWrapper.class); + Assert.assertNotNull(bikeWrapper); + Assert.assertEquals(bikeWrapper.getBike(), new Bike("Canyon", BikeType.ROAD)); + } + + public static class BikeWrapper { + private final Bike bike; + + @ConstructorProperties(value = "bike") + BikeWrapper(@JohnzonConverter(value = BikeConverter.class) Bike bike) { + this.bike = bike; + } + + Bike getBike() { + return bike; + } + } + public static class CycleRace { private boolean monument; http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java new file mode 100644 index 0000000..b6bb10d --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java @@ -0,0 +1,74 @@ +/* + * 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.mapper; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class ObjectSerializationTest { + private final Mapper mapper = new MapperBuilder().build(); + + @Test + public void primitiveBoolean() { + assertEquals("{\"data\":true}", toJson(new Wrapper(true))); + } + + @Test + public void numberBoolean() { + assertEquals("{\"data\":1}", toJson(new Wrapper(1))); + } + + @Test + public void stringBoolean() { + assertEquals("{\"data\":\"ok\"}", toJson(new Wrapper("ok"))); + } + + @Test + public void objectBoolean() { + assertEquals("{\"data\":{\"data\":\"ok\"}}", toJson(new Wrapper(new Wrapper("ok")))); + } + + @Test + public void arrayString() { + assertEquals("{\"data\":[\"10\",\"2\"]}", toJson(new Wrapper(asList("10", "2")))); + } + + @Test + public void nestedArrayString() { + assertEquals("{\"data\":{\"data\":[\"10\",\"2\"]}}", toJson(new Wrapper(new Wrapper(asList("10", "2"))))); + } + + private String toJson(final Wrapper wrapper) { + return mapper.writeObjectAsString(wrapper); + } + + public static class Wrapper { + private final Object data; + + private Wrapper(final Object data) { + this.data = data; + } + + public Object getData() { + return data; + } + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/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 8ac0289..adfe0e5 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 @@ -127,11 +127,15 @@ public class ObjectTypeTest { } @Test - public void multiple() { + public void testGenericList() { assumeFalse("field".equals(accessMode) /*we need setType*/); final Multiple multiple = new Multiple(); - multiple.dogs = asList(new Dog(), new Beagle()); + Poodle poodle = new Poodle(); + poodle.setHairCut(true); + Beagle beagle = new Beagle(); + beagle.setColor("brown"); + multiple.dogs = asList(poodle, beagle); final Mapper mapper = new MapperBuilder() .setAccessModeName(accessMode) .setReadAttributeBeforeWrite(true) @@ -142,18 +146,19 @@ public class ObjectTypeTest { } }).build(); final String json = "{\"dogs\":[" + - "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Dog\",\"value\":{}}," + - "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{}}]}"; + "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\",\"value\":{\"hairCut\":true}}," + + "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{\"color\":\"brown\"}}]}"; 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))); + assertTrue(Poodle.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(); mum.setName("Rosa"); @@ -306,7 +311,7 @@ public class ObjectTypeTest { } } - public static class Dog { + public static abstract class Dog { private String name; private Dog father; private Dog mother; @@ -366,6 +371,15 @@ public class ObjectTypeTest { } public static class Beagle extends Dog { + private String color; + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } } public static class Poodle extends Dog { @@ -414,4 +428,25 @@ public class ObjectTypeTest { return POODLES.get(jsonObject.getString("poodleName")); } } + + public static class DogOwner { + private String name; + private List<Dog> dogs; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List<Dog> getDogs() { + return dogs; + } + + public void setDogs(List<Dog> dogs) { + this.dogs = dogs; + } + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java new file mode 100644 index 0000000..dfc3a75 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java @@ -0,0 +1,52 @@ +/* + * 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.mapper; + +import org.junit.Test; + +import java.util.Collection; +import java.util.List; + +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; + +public class SerializeValueFilterTest { + @Test + public void customIgnore() { + // in this test we will serialize lists but not sets or other collection impls + final Mapper mapper = new MapperBuilder().setSerializeValueFilter(new SerializeValueFilter() { + @Override + public boolean shouldIgnore(String name, Object value) { + return !List.class.isInstance(value); + } + }).build(); + + assertEquals("{\"list\":[\"test\"]}", mapper.writeObjectAsString(new Foo(singletonList("test")))); + assertEquals("{}", mapper.writeObjectAsString(new Foo(singleton("test")))); + } + + public static class Foo { + public Collection<String> list; + + public Foo(final Collection<String> list) { + this.list = list; + } + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java new file mode 100644 index 0000000..1bcc7f6 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java @@ -0,0 +1,39 @@ +/* + * 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.mapper.internal; + +import org.junit.Assert; +import org.junit.Test; + +public class JsonPointerTrackerTest { + + + @Test + public void testJsonPointerTracker() { + JsonPointerTracker jptRoot = new JsonPointerTracker(null, "/"); + + Assert.assertEquals("/", jptRoot.toString()); + + JsonPointerTracker jptAttrL1 = new JsonPointerTracker(jptRoot, "attrL1"); + JsonPointerTracker jptAttrL2 = new JsonPointerTracker(jptAttrL1, "attrL2"); + + Assert.assertEquals("/attrL1/attrL2", jptAttrL2.toString()); + Assert.assertEquals("/attrL1", jptAttrL1.toString()); + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java index 14844bd..142ca18 100644 --- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java +++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java @@ -71,7 +71,7 @@ public class ExtendMappingTest { public int compare(final String o1, final String o2) { return o1.compareTo(o2); } - }, false)); + }, false, false, null, false, false)); } @Override http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/Model.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/Model.java b/johnzon-mapper/src/test/java/org/superbiz/Model.java new file mode 100644 index 0000000..1b3a077 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/superbiz/Model.java @@ -0,0 +1,29 @@ +/* + * 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.superbiz; + +public class Model extends ModelBase<Model.ChildA, Model.ChildB> { + public static class ChildA extends ModelSuperBase.ChildA { + public String detail; + } + + public static class ChildB extends ModelSuperBase.ChildB { + + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java b/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java new file mode 100644 index 0000000..d7668df --- /dev/null +++ b/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java @@ -0,0 +1,34 @@ +/* + * 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.superbiz; + +import java.util.Collection; + +public abstract class ModelBase<A extends ModelSuperBase.ChildA, B extends ModelSuperBase.ChildB> + extends ModelSuperBase<A, B> { + private Collection<A> aalist; + + public Collection<A> getAalist() { + return aalist; + } + + public void setAalist(final Collection<A> aalist) { + this.aalist = aalist; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java new file mode 100644 index 0000000..c39d80b --- /dev/null +++ b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java @@ -0,0 +1,53 @@ +/* + * 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.superbiz; + +public abstract class ModelSuperBase<A extends ModelSuperBase.ChildA, B extends ModelSuperBase.ChildB> + extends ModelSuperSuperBase<A, B> { + public static class ChildA extends ModelSuperSuperBase.ChildA { + + } + + public static class ChildB extends ModelSuperSuperBase.ChildB { + + } + + private A childA; + private B childB; + + @Override + public A getChildA() { + return childA; + } + + @Override + public void setChildA(A childA) { + this.childA = childA; + } + + @Override + public B getChildB() { + return childB; + } + + @Override + public void setChildB(B childB) { + this.childB = childB; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java new file mode 100644 index 0000000..72980b6 --- /dev/null +++ b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java @@ -0,0 +1,48 @@ +/* + * 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.superbiz; + +public abstract class ModelSuperSuperBase<A extends ModelSuperSuperBase.ChildA, B extends ModelSuperSuperBase.ChildB> { + public static class ChildA { + public String name; + } + + public static class ChildB { + + } + + private A childA; + private B childB; + + public A getChildA() { + return childA; + } + + public void setChildA(A childA) { + this.childA = childA; + } + + public B getChildB() { + return childB; + } + + public void setChildB(B childB) { + this.childB = childB; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-maven-plugin/pom.xml ---------------------------------------------------------------------- diff --git a/johnzon-maven-plugin/pom.xml b/johnzon-maven-plugin/pom.xml index 1911c1e..4114091 100644 --- a/johnzon-maven-plugin/pom.xml +++ b/johnzon-maven-plugin/pom.xml @@ -39,7 +39,7 @@ <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-json_1.0_spec</artifactId> - <version>${jsonspecversion}</version> + <version>${geronimo-jsonp.version}</version> <scope>compile</scope> </dependency> <dependency> http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-websocket/pom.xml ---------------------------------------------------------------------- diff --git a/johnzon-websocket/pom.xml b/johnzon-websocket/pom.xml index d068e8f..3dc74cb 100644 --- a/johnzon-websocket/pom.xml +++ b/johnzon-websocket/pom.xml @@ -29,8 +29,8 @@ <name>Johnzon :: WebSocket</name> <properties> - <tomcat.version>8.5.3</tomcat.version> - <tomee.version>7.0.1</tomee.version> + <tomcat.version>8.5.9</tomcat.version> + <tomee.version>7.0.3</tomee.version> <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory> </properties> @@ -109,6 +109,13 @@ </dependencies> <build> + <testResources> + <testResource> + <directory>src/test/resources</directory> + <filtering>true</filtering> + </testResource> + </testResources> + <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> @@ -119,6 +126,41 @@ </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.10</version> + <executions> + <execution> <!-- override some ee api --> + <id>unpack-ee-api</id> + <phase>generate-test-resources</phase> + <goals> + <goal>unpack</goal> + </goals> + <configuration> + <outputDirectory>${project.build.directory}/ee-api</outputDirectory> + <artifactItems> + <artifactItem> + <groupId>org.apache.tomee</groupId> + <artifactId>javaee-api</artifactId> + <version>7.0-1</version> + <type>zip</type> + <excludes> + LICENSE,NOTICE,README.txt, + geronimo-jaspic_1.0_spec*jar, + geronimo-jsp_2.2_spec*.jar, + javaee-api*.jar, + tomcat-el-api*.jar, + tomcat-servlet-api*.jar, + tomcat-websocket-api*.jar, + geronimo-json_1.0_spec*.jar + </excludes> + </artifactItem> + </artifactItems> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <executions> <execution> http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-websocket/src/test/resources/arquillian.xml ---------------------------------------------------------------------- diff --git a/johnzon-websocket/src/test/resources/arquillian.xml b/johnzon-websocket/src/test/resources/arquillian.xml index 1f2d9d0..0472bd2 100644 --- a/johnzon-websocket/src/test/resources/arquillian.xml +++ b/johnzon-websocket/src/test/resources/arquillian.xml @@ -32,6 +32,12 @@ <property name="cleanOnStartUp">true</property> <property name="dir">target/apache-tomee-remote</property> <property name="appWorkingDir">target/arquillian-test-working-dir</property> + <!-- override jsonp api --> + <property name="lib">${project.build.directory}/ee-api</property> + <property name="additionalLibs"> + remove:javaee-api + mvn:org.apache.geronimo.specs:geronimo-json_1.0_spec:${geronimo-jsonp.version} + </property> </configuration> </container> </arquillian> http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/pom.xml ---------------------------------------------------------------------- diff --git a/jsonb-api/pom.xml b/jsonb-api/pom.xml deleted file mode 100644 index e9a2f3b..0000000 --- a/jsonb-api/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <parent> - <artifactId>johnzon</artifactId> - <groupId>org.apache.johnzon</groupId> - <version>1.0.1-SNAPSHOT</version> - </parent> - <modelVersion>4.0.0</modelVersion> - - <artifactId>jsonb-api</artifactId> - <version>1.0.1-SNAPSHOT</version> - <name>Johnzon :: JSON-B API</name> - - <properties> - <java-compile.version>1.8</java-compile.version> - <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory> - </properties> -</project> http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/run_sigtest.sh ---------------------------------------------------------------------- diff --git a/jsonb-api/run_sigtest.sh b/jsonb-api/run_sigtest.sh deleted file mode 100755 index e44f6f0..0000000 --- a/jsonb-api/run_sigtest.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# file to run the CDI signature tests - - -# HOWTO -# download sigtestdev.jar from http://download.java.net/sigtest/2.2/Rel/ -# copy to a local folder and set SIGTEST_HOME to it - - - -mvn dependency:copy-dependencies -DincludeScope=compile - -java -jar ${SIGTEST_HOME}/lib/sigtestdev.jar Setup -classpath ${JAVA_HOME}/jre/lib/rt.jar:./target/jsonb-api-1.0-SNAPSHOT.jar:./target/dependency/geronimo-json_1.0_spec-1.0-alpha-1.jar -Package javax.json.bind -FileName jsonb-api.sig -static - -# now run the real sig test -#java -jar ${SIGTEST_HOME}/lib/sigtestdev.jar SignatureTest -classpath ${JAVA_HOME}/jre/lib/rt.jar:./target/dependency/geronimo-jcdi_1.1_spec-1.0-alpha-1.jar:./target/dependency/geronimo-atinject_1.0_spec-1.0.jar:./target/dependency/geronimo-el_2.2_spec-1.0.2.jar:./target/dependency/geronimo-interceptor_1.2_spec-1.0-alpha-1.jar -Package javax.decorator -Package javax.enterprise -FileName cdi-api.sig -static -#java -jar ${SIGTEST_HOME}/lib/sigtestdev.jar SignatureTest -classpath ${JAVA_HOME}/jre/lib/rt.jar:./target/jsonb-api-1.0-SNAPSHOT.jar:./target/dependency/geronimo-json_1.0_spec-1.0-alpha-1.jar -Package javax.json.bind -FileName jsonb -FileName jsonb-api.sig -static - http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/src/main/java/javax/json/bind/Jsonb.java ---------------------------------------------------------------------- diff --git a/jsonb-api/src/main/java/javax/json/bind/Jsonb.java b/jsonb-api/src/main/java/javax/json/bind/Jsonb.java deleted file mode 100644 index 83de741..0000000 --- a/jsonb-api/src/main/java/javax/json/bind/Jsonb.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 javax.json.bind; - -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.lang.reflect.Type; - -public interface Jsonb extends AutoCloseable { - <T> T fromJson(String str, Class<T> type) throws JsonbException; - - <T> T fromJson(String str, Type runtimeType) throws JsonbException; - - <T> T fromJson(Reader reader, Class<T> type) throws JsonbException; - - <T> T fromJson(Reader reader, Type runtimeType) throws JsonbException; - - <T> T fromJson(InputStream stream, Class<T> type) throws JsonbException; - - <T> T fromJson(InputStream stream, Type runtimeType) throws JsonbException; - - String toJson(Object object) throws JsonbException; - - String toJson(Object object, Type runtimeType) throws JsonbException; - - void toJson(Object object, Writer writer) throws JsonbException; - - void toJson(Object object, Type runtimeType, Writer writer) throws JsonbException; - - void toJson(Object object, OutputStream stream) throws JsonbException; - - void toJson(Object object, Type runtimeType, OutputStream stream) throws JsonbException; -} http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java ---------------------------------------------------------------------- diff --git a/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java b/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java deleted file mode 100644 index 77e4a8c..0000000 --- a/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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 javax.json.bind; - -import javax.json.bind.spi.JsonbProvider; -import javax.json.spi.JsonProvider; - -public interface JsonbBuilder { - JsonbBuilder withConfig(final JsonbConfig config); - - JsonbBuilder withProvider(final JsonProvider jsonpProvider); - - Jsonb build(); - - static Jsonb create() { - return JsonbProvider.provider().create().build(); - } - - static Jsonb create(final JsonbConfig config) { - return JsonbProvider.provider().create().withConfig(config).build(); - } - - static JsonbBuilder newBuilder() { - return JsonbProvider.provider().create(); - } - - static JsonbBuilder newBuilder(final String providerName) { - return JsonbProvider.provider(providerName).create(); - } - - static JsonbBuilder newBuilder(final JsonbProvider provider) { - return provider.create(); - } -}
