Repository: incubator-johnzon Updated Branches: refs/heads/master 18d8d372e -> 79b8157d2
restoring previous ability to extend our mapping to add generation features to it Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/79b8157d Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/79b8157d Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/79b8157d Branch: refs/heads/master Commit: 79b8157d2a1f970edf6533e1f7dbc2f783209bf3 Parents: 18d8d37 Author: Romain manni-Bucau <[email protected]> Authored: Fri Jun 3 16:15:07 2016 +0200 Committer: Romain manni-Bucau <[email protected]> Committed: Fri Jun 3 16:15:07 2016 +0200 ---------------------------------------------------------------------- .../org/apache/johnzon/mapper/MapperConfig.java | 2 +- .../org/apache/johnzon/mapper/Mappings.java | 41 +++++---- .../java/org/superbiz/ExtendMappingTest.java | 88 ++++++++++++++++++++ 3 files changed, 109 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/79b8157d/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java index 865bd0b..efb38f6 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java @@ -35,7 +35,7 @@ import java.util.concurrent.ConcurrentMap; * Contains internal configuration for all the mapper stuff. * It needs to be immutable and 100% runtime oriented. */ -class MapperConfig implements Cloneable { +public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { private static final ObjectConverter.Codec NO_CONVERTER = new ObjectConverter.Codec() { @Override http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/79b8157d/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java index bf5149e..45a5690 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java @@ -53,13 +53,13 @@ import static org.apache.johnzon.mapper.reflection.Converters.matches; public class Mappings { public static class ClassMapping { - final Class<?> clazz; - final AccessMode.Factory factory; - final Map<String, Getter> getters; - final Map<String, Setter> setters; - final Adapter adapter; - final ObjectConverter.Reader reader; - final ObjectConverter.Writer writer; + public final Class<?> clazz; + public final AccessMode.Factory factory; + public final Map<String, Getter> getters; + public final Map<String, Setter> setters; + public final Adapter adapter; + public final ObjectConverter.Reader reader; + public final ObjectConverter.Writer writer; protected ClassMapping(final Class<?> clazz, final AccessMode.Factory factory, final Map<String, Getter> getters, final Map<String, Setter> setters, @@ -76,9 +76,9 @@ public class Mappings { } public static class CollectionMapping { - final Class<?> raw; - final Type arg; - final boolean primitive; + public final Class<?> raw; + public final Type arg; + public final boolean primitive; public CollectionMapping(final boolean primitive, final Class<?> collectionType, final Type fieldArgType) { this.raw = collectionType; @@ -88,15 +88,15 @@ public class Mappings { } public static class Getter { - final AccessMode.Reader reader; - final int version; - final Adapter converter; - final Adapter itemConverter; - final ObjectConverter.Writer objectConverter; - final boolean primitive; - final boolean array; - final boolean map; - final boolean collection; + public final AccessMode.Reader reader; + public final int version; + public final Adapter converter; + public final Adapter itemConverter; + public final ObjectConverter.Writer objectConverter; + public final boolean primitive; + public final boolean array; + public final boolean map; + public final boolean collection; public Getter(final AccessMode.Reader reader, final boolean primitive, final boolean array, @@ -227,12 +227,11 @@ public class Mappings { protected final MapperConfig config; - public Mappings(final MapperConfig config) { this.config = config; } - public <T> CollectionMapping findCollectionMapping(final ParameterizedType genericType) { + public CollectionMapping findCollectionMapping(final ParameterizedType genericType) { CollectionMapping collectionMapping = collections.get(genericType); if (collectionMapping == null) { collectionMapping = createCollectionMapping(genericType); http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/79b8157d/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 new file mode 100644 index 0000000..14844bd --- /dev/null +++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java @@ -0,0 +1,88 @@ +/* + * 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 org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.MapperConfig; +import org.apache.johnzon.mapper.Mappings; +import org.apache.johnzon.mapper.ObjectConverter; +import org.apache.johnzon.mapper.access.FieldAccessMode; +import org.apache.johnzon.mapper.internal.AdapterKey; +import org.junit.Test; + +import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +// json libs have a meta registry like our Mappings +// often other libs can use it to do advanced features without instantiating beans (swagger for instance) +// this class ensure we can do it +// that's why it is not in johnzon package +public class ExtendMappingTest { + @Test // strictly speaking compilation checked 50% of the test + public void run() { + final MyMappings myMappings = new MyMappings(); + final Mappings.ClassMapping model = myMappings.findOrCreateClassMapping(MyModel.class); + assertTrue(myMappings.classes().isEmpty()); + assertEquals(1, model.getters.size()); + assertEquals(1, model.setters.size()); + assertNotNull(FieldAccessMode.FieldReader.class.cast(model.getters.values().iterator().next().reader).getType()); + assertNotNull(FieldAccessMode.FieldWriter.class.cast(model.setters.values().iterator().next().writer).getType()); + } + + public static class MyModel { + public String name; + } + + public static class MyMappings extends Mappings { + public MyMappings() { + super(new MapperConfig( + new ConcurrentHashMap<AdapterKey, Adapter<?, ?>>(), + new HashMap<Class<?>, ObjectConverter.Writer<?>>(), + new HashMap<Class<?>, ObjectConverter.Reader<?>>(), + -1, true, true, true, false, false, false, + new FieldAccessMode(false, false), + Charset.forName("UTF-8"), + new Comparator<String>() { + @Override + public int compare(final String o1, final String o2) { + return o1.compareTo(o2); + } + }, false)); + } + + @Override + public ClassMapping findOrCreateClassMapping(final Type clazz) { + final ClassMapping mapping = super.findOrCreateClassMapping(clazz); + classes.remove(clazz); // no leak for single usage cases + return mapping; + } + + public Map<?, ?> classes() { + return classes; + } + } +}
