Author: gk Date: Wed Oct 17 10:20:29 2018 New Revision: 1844081 URL: http://svn.apache.org/viewvc?rev=1844081&view=rev Log: - Update to version 2.0.0-SNAPSHOT (java 8), - Cleanup - jackson2 module: Jackson v2.9.6 cleanup, use HashMap instead of Hashtable and split into methods for initialize in Jackson2MapperService - Jackson2 tests: use packages: mixins, example, serializers, add some tests
Added: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Jackson2MapperTest.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/example/ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/example/Bean.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/example/BeanChild.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/example/Rectangle.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/example/TestClass.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/mixins/ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/mixins/BeanMixin.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/mixins/BeanMixin2.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/mixins/RectangleMixin.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/mixins/RectangleMixin2.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/mixins/TypedRectangle.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/serializers/ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/serializers/TestDeserializer.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/serializers/TestDummyWrapperDeserializer.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/serializers/TestJsonSerializer.java (with props) turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/serializers/TestSerializer.java (with props) Removed: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/Rectangle.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/TestClass.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Bean.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/BeanChild.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/BeanMixin.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Mixin.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/TestDeserializer.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/TestJsonSerializer.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/TestSerializer.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/TypedRectangle.java Modified: turbine/fulcrum/trunk/json/api/pom.xml turbine/fulcrum/trunk/json/api/src/java/org/apache/fulcrum/json/JsonService.java turbine/fulcrum/trunk/json/dist/pom.xml turbine/fulcrum/trunk/json/jackson/pom.xml turbine/fulcrum/trunk/json/jackson2/pom.xml turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/SimpleNameIntrospector.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTyping_OBJECT_AND_NON_CONCRETE_Test.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JsonOrgJacksonMapperTest.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JsonPathJacksonTest.java turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/concurrent/JSONConcurrentTest.java turbine/fulcrum/trunk/json/pom.xml turbine/fulcrum/trunk/json/src/changes/changes.xml Modified: turbine/fulcrum/trunk/json/api/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/api/pom.xml?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/api/pom.xml (original) +++ turbine/fulcrum/trunk/json/api/pom.xml Wed Oct 17 10:20:29 2018 @@ -19,7 +19,7 @@ <parent> <artifactId>fulcrum-json-parent</artifactId> <groupId>org.apache.fulcrum</groupId> - <version>1.1.2-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> Modified: turbine/fulcrum/trunk/json/api/src/java/org/apache/fulcrum/json/JsonService.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/api/src/java/org/apache/fulcrum/json/JsonService.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/api/src/java/org/apache/fulcrum/json/JsonService.java (original) +++ turbine/fulcrum/trunk/json/api/src/java/org/apache/fulcrum/json/JsonService.java Wed Oct 17 10:20:29 2018 @@ -128,7 +128,7 @@ public interface JsonService { * * <code>refreshFilter</code> is set to <code>true</code> for this method call. */ - public <T> String serializeOnlyFilter(Object src, + public String serializeOnlyFilter(Object src, String... filterAttr) throws Exception; /** @@ -142,7 +142,7 @@ public interface JsonService { * * <code>refreshFilter</code> is set to <code>true</code> for this method call. */ - public <T> String serializeOnlyFilter(Object src, Boolean cleanFilter, + public String serializeOnlyFilter(Object src, Boolean cleanFilter, String... filterAttr) throws Exception; /** @@ -211,13 +211,13 @@ public interface JsonService { * * @see #serializeAllExceptFilter(Object, Class, Boolean, String...) */ - public <T> String serializeAllExceptFilter(Object src, + public String serializeAllExceptFilter(Object src, Boolean cleanFilter, String... filterAttr) throws Exception; /** * @see #serializeAllExceptFilter(Object, Class, Boolean, String...) */ - public <T> String serializeAllExceptFilter(Object src, + public String serializeAllExceptFilter(Object src, String... filterAttr) throws Exception; /** Modified: turbine/fulcrum/trunk/json/dist/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/dist/pom.xml?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/dist/pom.xml (original) +++ turbine/fulcrum/trunk/json/dist/pom.xml Wed Oct 17 10:20:29 2018 @@ -22,7 +22,7 @@ <parent> <groupId>org.apache.fulcrum</groupId> <artifactId>fulcrum-json-parent</artifactId> - <version>1.1.2-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> </parent> <groupId>org.apache.fulcrum</groupId> <artifactId>fulcrum-json-dist</artifactId> Modified: turbine/fulcrum/trunk/json/jackson/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson/pom.xml?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson/pom.xml (original) +++ turbine/fulcrum/trunk/json/jackson/pom.xml Wed Oct 17 10:20:29 2018 @@ -19,7 +19,7 @@ <parent> <artifactId>fulcrum-json-parent</artifactId> <groupId>org.apache.fulcrum</groupId> - <version>1.1.2-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> @@ -61,9 +61,9 @@ <dependencies> <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.7</version> </dependency> <dependency> <groupId>org.apache.avalon.framework</groupId> @@ -84,12 +84,16 @@ <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> - <version>1.9.13</version> + <version>${jackson.version}</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-xc</artifactId> - <version>1.9.13</version> + <version>${jackson.version}</version> </dependency> </dependencies> + <properties> + <!-- 1.9.13, released 14-Jul-2013: latest version see https://github.com/FasterXML/jackson --> + <jackson.version>1.9.13</jackson.version> + </properties> </project> Modified: turbine/fulcrum/trunk/json/jackson2/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/pom.xml?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/pom.xml (original) +++ turbine/fulcrum/trunk/json/jackson2/pom.xml Wed Oct 17 10:20:29 2018 @@ -19,7 +19,7 @@ <parent> <artifactId>fulcrum-json-parent</artifactId> <groupId>org.apache.fulcrum</groupId> - <version>1.1.2-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> @@ -128,6 +128,6 @@ <properties> <!-- 2.7.x hase Java 7 baseline, but is compiled with Java 6 support, cft. https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.7. With Jackson 2.8, Java 7 languages features will be allowed --> - <jackson2.version>2.7.9</jackson2.version> + <jackson2.version>2.9.6</jackson2.version> </properties> </project> Modified: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java Wed Oct 17 10:20:29 2018 @@ -34,7 +34,7 @@ import com.fasterxml.jackson.databind.se public class CacheService implements LogEnabled { AnnotationIntrospector primary; - Map<String, FilterProvider> filters = new ConcurrentHashMap<String, FilterProvider>(); + Map<String, FilterProvider> filters = new ConcurrentHashMap<>(); private static Logger logger; Modified: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java Wed Oct 17 10:20:29 2018 @@ -23,9 +23,8 @@ import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; -import java.util.Enumeration; import java.util.HashMap; -import java.util.Hashtable; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -92,26 +91,25 @@ public class Jackson2MapperService exten private static final String DATE_FORMAT = "dateFormat"; private static final String ESCAPE_CHARS = "escapeCharsGlobal"; private static final String ESCAPE_CHAR_CLASS = "escapeCharsClass"; - private static final String USEJSONPATH = "useJsonPath"; + private static final String USE_JSON_PATH = "useJsonPath"; ObjectMapper mapper; AnnotationIntrospector primary; // support default AnnotationIntrospector secondary; - public String ANNOTATIONINSPECTOR = "annotationInspectors"; + private static final String ANNOTATIONINSPECTOR = "annotationInspectors"; - private Hashtable<String, String> annotationInspectors = null; - private Hashtable<String, Boolean> features = null; - private Hashtable<String, String> featureTypes = null; + private Map<String, String> annotationInspectors = null; + private Map<String, Boolean> features = null; + private Map<String, String> featureTypes = null; private String dateFormat; /** * Default dateformat is <code>MM/dd/yyyy</code>, could be overwritten in {@link #setDateFormat(DateFormat)}. */ - public final String DEFAULTDATEFORMAT = "MM/dd/yyyy"; + public static final String DEFAULTDATEFORMAT = "MM/dd/yyyy"; - final boolean defaultType = false; - public boolean cacheFilters = true; // true -> this is by default true in jackson, if not using + private boolean cacheFilters = true; // true -> this is by default true in jackson, if not using // multiple serialization in one thread String[] defaultTypeDefs = null; private CacheService cacheService; @@ -129,11 +127,11 @@ public class Jackson2MapperService exten return ser(src, type, false); } - public <T> String ser(Object src, FilterProvider filter) throws Exception { + public String ser(Object src, FilterProvider filter) throws Exception { return ser(src, filter, false); } - public <T> String ser(Object src, FilterProvider filter, Boolean cleanCache) throws Exception { + public String ser(Object src, FilterProvider filter, Boolean cleanCache) throws Exception { String serResult= null; if (src == null) { getLogger().info("no serializable object."); @@ -145,81 +143,16 @@ public class Jackson2MapperService exten } else { getLogger().debug("add filter for cache filter Class " + src.getClass().getName()); setCustomIntrospectorWithExternalFilterId(src.getClass(), null); // filter class - if (filter != null) { - cacheService.getFilters().put(src.getClass().getName(), filter); - } + cacheService.getFilters().put(src.getClass().getName(), filter); } getLogger().debug("ser class::" + src.getClass() + " with filter " + filter); - //mapper.setFilterProvider(filter);// this is global - String res = mapper.writer().with(filter).writeValueAsString(src); - if (cleanCache) { - cacheService.cleanSerializerCache(mapper); - } - return res; - } - - @Override - public String ser(Object src, Boolean cleanCache) throws Exception { - if (cacheService.getFilters().containsKey(src.getClass().getName())) { - getLogger().warn( - "Found registered filter - using instead of default view filter for class:" - + src.getClass().getName()); - // throw new - // Exception("Found registered filter - could not use custom view and custom filter for class:"+ - // src.getClass().getName()); - SimpleFilterProvider filter = (SimpleFilterProvider) cacheService.getFilters().get(src.getClass() - .getName()); - return ser(src, filter, cleanCache); - } - String res = mapper.writerWithView(Object.class).writeValueAsString(src); - if (cleanCache != null && cleanCache) { - cacheService.cleanSerializerCache(mapper); - } - return res; - } - - @Override - public <T> String ser(Object src, Class<T> type, Boolean cleanCache) - throws Exception { - getLogger().debug("serializing object:" + src + " for type "+ type); - if (src != null && cacheService.getFilters().containsKey(src.getClass().getName())) { - getLogger() - .warn("Found registered filter - could not use custom view and custom filter for class:" - + src.getClass().getName()); - // throw new - // Exception("Found registered filter - could not use custom view and custom filter for class:"+ - // src.getClass().getName()); - SimpleFilterProvider filter = (SimpleFilterProvider) cacheService.getFilters().get(src.getClass() - .getName()); - return ser(src, filter); - } - mapper.setFilterProvider(new SimpleFilterProvider().setFailOnUnknownId(false)); - String res = (type != null)? mapper.writerWithView(type).writeValueAsString(src): mapper.writer().writeValueAsString(src); + mapper.setFilterProvider(filter); + String res = mapper.writer(filter).writeValueAsString(src); if (cleanCache) { cacheService.cleanSerializerCache(mapper); } - // jackson bug? filter is not cleaned in collection type - if (type != null) { - // todo may do something - } return res; - } - - - public <T> String ser( Object... objects) throws Exception { - return ser( objects, false ); } - /** - * convenience method to provide a list of coolections without providign a wrapper - * @param cleanCache - * @param objects - * @return serialized JSON - * @throws Exception - */ - public <T> String ser(Boolean cleanCache, Object... objects) throws Exception { - return ser( objects, cleanCache ); - } - @Override public <T> T deSer(String json, Class<T> type) throws Exception { @@ -229,11 +162,11 @@ public class Jackson2MapperService exten else reader = mapper.reader(); - return (T) reader.readValue(json); + return reader.readValue(json); } public <T> T deSer(Object src, Class<T> type) throws Exception { - return mapper.convertValue( src, type); + return mapper.convertValue( src, type); } public <T> Collection<T> deSerCollectionWithType(String json, Class<? extends Collection> collectionClass, Class<T> type) @@ -262,9 +195,8 @@ public class Jackson2MapperService exten } } - public <T> List<T> deSerList(String json, Class<? extends List> targetList, - Object listType, Class<T> elementType) throws Exception { - return mapper.readValue(json, mapper.getTypeFactory().constructParametrizedType(targetList,listType.getClass(), elementType)); + public <T> List<T> deSerList(String json, Class<? extends List> targetList, Class<T> elementType) throws Exception { + return mapper.readValue(json, mapper.getTypeFactory().constructParametricType(targetList,elementType)); } public <T,U> Map<T,U> deSerMap(String json, Class<? extends Map> mapClass, Class<T> keyClass, Class<U> valueClass) throws Exception { @@ -276,9 +208,6 @@ public class Jackson2MapperService exten return mapper.readValue(json, collectionType); } - public void getJsonService() throws InstantiationException { - } - /** * @param name name of the module * @param target target class @@ -326,7 +255,17 @@ public class Jackson2MapperService exten } return this; } - + + /** + * set a single mixin. convenience method, calls {@link ObjectMapper#registerModule(Module)}. + * + * @param src the object to be serialized + * @param name the name for the mixin + * @param target the target class for the mixin + * @param mixin the mixin class + * @return serialized result + * @throws JsonProcessingException + */ @SuppressWarnings("rawtypes") public String withMixinModule(Object src, String name, Class target, Class mixin) throws JsonProcessingException { @@ -334,28 +273,44 @@ public class Jackson2MapperService exten getLogger().debug("registering module " + mx + ", mixin: " + mixin); return mapper.registerModule(mx).writer().writeValueAsString(src); } + + /** + * convenience method with read (but old mixins will be cleared!). + * + * @see {@link ObjectMapper#setMixins(Class, Class)} + * + * @param src the object to be serialized + * @param target the target class for the mixin + * @param mixin the mixin class + * @return serialized result + * @throws JsonProcessingException + */ @SuppressWarnings("rawtypes") public String withSetMixins(Object src, Class target, Class mixin) throws JsonProcessingException { return setMixins(target, mixin).writer().writeValueAsString(src); } + @SuppressWarnings("rawtypes") public ObjectMapper setMixins(Class target, - Class mixin) throws JsonProcessingException { - Map<Class<?>, Class<?>> sourceMixins = new HashMap<Class<?>, Class<?>>(1); - sourceMixins.put( target,mixin ); + Class mixin) { + Map<Class<?>, Class<?>> sourceMixins = null; + if (target != null) { + sourceMixins = new HashMap<>(1); + sourceMixins.put( target,mixin ); + } getLogger().debug("clean set mixins for target " + target + ", mixin: " + mixin); return mapper.setMixIns( sourceMixins ); } @Override - public <T> String serializeAllExceptFilter(Object src, String... filterAttr) + public String serializeAllExceptFilter(Object src, String... filterAttr) throws Exception { return serializeAllExceptFilter(src, src.getClass(), true, filterAttr); } @Override - public synchronized <T> String serializeAllExceptFilter(Object src, Boolean cache, String... filterAttr) throws Exception { + public synchronized String serializeAllExceptFilter(Object src, Boolean cache, String... filterAttr) throws Exception { return serializeAllExceptFilter(src, src.getClass(), cache, filterAttr); } @@ -400,13 +355,13 @@ public class Jackson2MapperService exten } @Override - public <T> String serializeOnlyFilter(Object src, String... filterAttrs) + public String serializeOnlyFilter(Object src, String... filterAttrs) throws Exception { return serializeOnlyFilter(src, src.getClass(), true, filterAttrs); } @Override - public synchronized <T> String serializeOnlyFilter(Object src, + public synchronized String serializeOnlyFilter(Object src, Boolean cache, String... filterAttr) throws Exception { return serializeOnlyFilter(src, src.getClass(), cache, filterAttr); } @@ -432,11 +387,51 @@ public class Jackson2MapperService exten getLogger().debug("setting filteroutAllexcept filter for size of filterAttr: " + filterAttr.length); } else { getLogger().warn("no filter attributes set!"); - pf = SimpleBeanPropertyFilter.filterOutAllExcept("dummy"); // to be consistent with gson anything is filtered out. + pf = SimpleBeanPropertyFilter.filterOutAllExcept("dummy"); } if (filterClasses == null) throw new Exception("You have to provide some class to apply the filtering!"); return filter(src, filterClasses, null, pf, refresh); - } + } + + @Override + public String ser(Object src, Boolean cleanCache) throws Exception { + if (cacheService.getFilters().containsKey(src.getClass().getName())) { + getLogger().warn( + "Found registered filter - using instead of default view filter for class:" + + src.getClass().getName()); + SimpleFilterProvider filter = (SimpleFilterProvider) cacheService.getFilters().get(src.getClass() + .getName()); + return ser(src, filter, cleanCache);//mapper.writerWithView(src.getClass()).writeValueAsString(src); + } + String res = mapper.writerWithView(Object.class).writeValueAsString(src); + if (cleanCache != null && cleanCache) { + cacheService.cleanSerializerCache(mapper); + } + return res; + } + + @Override + public <T> String ser(Object src, Class<T> type, Boolean cleanCache) + throws Exception { + getLogger().info("serializing object:" + src + " for type "+ type); + if (src != null && cacheService.getFilters().containsKey(src.getClass().getName())) { + getLogger() + .warn("Found registered filter - could not use custom view and custom filter for class:" + + src.getClass().getName()); + // throw new + // Exception("Found registered filter - could not use custom view and custom filter for class:"+ + // src.getClass().getName()); + SimpleFilterProvider filter = (SimpleFilterProvider) cacheService.getFilters().get(src.getClass() + .getName()); + return ser(src, filter); + } + + String res = (type != null)? mapper.writerWithView(type).writeValueAsString(src): mapper.writeValueAsString(src); + if (cleanCache) { + cacheService.cleanSerializerCache(mapper); + } + return res; + } /** * @@ -538,7 +533,7 @@ public class Jackson2MapperService exten @Override public void configure(Configuration conf) throws ConfigurationException { getLogger().debug("conf.getName()" + conf.getName()); - this.annotationInspectors = new Hashtable<String, String>(); + this.annotationInspectors = new HashMap<>(); final Configuration configuredAnnotationInspectors = conf.getChild( ANNOTATIONINSPECTOR, false); @@ -550,14 +545,14 @@ public class Jackson2MapperService exten String key = nameVal[i].getName(); getLogger().debug("configured key: " + key); if (key.equals("features")) { - this.features = new Hashtable<String, Boolean>(); - this.featureTypes = new Hashtable<String, String>(); - Configuration[] features = nameVal[i].getChildren(); - for (int j = 0; j < features.length; j++) { - boolean featureValue = features[j] + this.features = new HashMap<>(); + this.featureTypes = new HashMap<>(); + Configuration[] localFeatures = nameVal[i].getChildren(); + for (int j = 0; j < localFeatures.length; j++) { + boolean featureValue = localFeatures[j] .getAttributeAsBoolean("value", false); - String featureType = features[j].getAttribute("type"); - String feature = features[j].getValue(); + String featureType = localFeatures[j].getAttribute("type"); + String feature = localFeatures[j].getValue(); getLogger().debug( "configuredAnnotationInspectors " + feature + ":" + featureValue); @@ -601,7 +596,7 @@ public class Jackson2MapperService exten configuredDefaultType.getAttribute("key") }; } final Configuration configuredjsonPath = conf.getChild( - USEJSONPATH, false); + USE_JSON_PATH, false); if (configuredjsonPath != null) { this.useJsonPath = configuredjsonPath.getValueAsBoolean(); } @@ -611,63 +606,90 @@ public class Jackson2MapperService exten public void initialize() throws Exception { mapper = new ObjectMapper(null, null, null);// add configurable JsonFactory,.. later? - Enumeration<String> enumKey = annotationInspectors.keys(); - while (enumKey.hasMoreElements()) { - String key = enumKey.nextElement(); - String avClass = annotationInspectors.get(key); - if (key.equals("primary") && avClass != null) { - try { - primary = (AnnotationIntrospector) Class.forName(avClass).getConstructor() - .newInstance(); - } catch (Exception e) { - throw new Exception( - "JsonMapperService: Error instantiating " + avClass - + " for " + key); - } - } else if (key.equals("secondary") && avClass != null) { - try { - secondary = (AnnotationIntrospector) Class.forName(avClass).getConstructor() - .newInstance(); - } catch (Exception e) { - throw new Exception( - "JsonMapperService: Error instantiating " + avClass - + " for " + key); - } + initAnnotationInspectors(); + + initFeatures(); + + initDefaultTyping(); + + getLogger().info("setting date format to:" + dateFormat); + getLogger().info("cacheFilters is:" + cacheFilters); + if (!cacheFilters) { + mapper.configure(SerializationFeature.FLUSH_AFTER_WRITE_VALUE, true); + } + + mapper.setDateFormat(new SimpleDateFormat(dateFormat)); + + if (escapeCharsGlobal) { + mapper.getFactory().setCharacterEscapes(characterEscapes); + } + if (escapeCharsClass != null) { + try { + characterEscapes = (CharacterEscapes) Class.forName(escapeCharsClass).getConstructor() + .newInstance(); + } catch (Exception e) { + throw new Exception( + "JsonMapperService: Error instantiating " + escapeCharsClass + + " for " + ESCAPE_CHAR_CLASS ); } } - if (primary == null) { - primary = new JacksonAnnotationIntrospector(); // support default + + getLogger().debug("initialized mapper:" + mapper); + + mapper.getSerializerProvider().setNullValueSerializer( + new JsonSerializer<Object>() { + @Override + public void serialize(Object value, JsonGenerator jgen, + SerializerProvider provider) throws IOException + { + jgen.writeString(""); + + } + }); + cacheService = new CacheService(primary); + if (cacheService instanceof LogEnabled) + { + cacheService.enableLogging(getLogger().getChildLogger(cacheService.getClass().getSimpleName())); getLogger().info( - "using default introspector:" - + primary.getClass().getName()); - mapper.setAnnotationIntrospector(primary); - } else if (primary != null && secondary != null){ - AnnotationIntrospector pair = new AnnotationIntrospectorPair( - primary, secondary); - mapper.setAnnotationIntrospector(pair); - } else { - mapper.setAnnotationIntrospector(primary); + "setting cacheService logger: " + + cacheService.getClass().getSimpleName()); } - if (primary instanceof LogEnabled) - { - ((LogEnabled)primary).enableLogging(getLogger().getChildLogger(primary.getClass().getSimpleName())); - getLogger().info( - "setting primary introspector logger: " - + primary.getClass().getSimpleName()); + if (useJsonPath) { + // set it before runtime + DefaultJsonPathWrapper djpw = null; + try { + djpw = new DefaultJsonPathWrapper(this.mapper); + getLogger().debug("******** initialized new jsonPath defaults: " +djpw.getJsonPathDefault()); + } catch (Exception e) { + throw new Exception( + "JsonMapperService: Error instantiating " + djpw + + " using useJsonPath=" + useJsonPath); + } + } - if (secondary instanceof LogEnabled) - { - ((LogEnabled)secondary).enableLogging(getLogger().getChildLogger(secondary.getClass().getSimpleName())); + } + + private void initDefaultTyping() + { + if (defaultTypeDefs != null && defaultTypeDefs.length == 2) { + DefaultTyping defaultTyping = DefaultTyping + .valueOf(defaultTypeDefs[0]); + mapper.enableDefaultTypingAsProperty(defaultTyping, + defaultTypeDefs[1]); getLogger().info( - "setting secondary introspector logger: " - + secondary.getClass().getSimpleName()); + "default typing is " + defaultTypeDefs[0] + " with key:" + + defaultTypeDefs[1]); } + } + private void initFeatures() + throws Exception + { if (features != null && !features.isEmpty()) { - Enumeration<String> enumFeatureKey = features.keys(); - while (enumFeatureKey.hasMoreElements()) { - String featureKey = enumFeatureKey.nextElement();// e.g. + Iterator<String> featureKeys = features.keySet().iterator(); + while (featureKeys.hasNext()) { + String featureKey = featureKeys.next();// e.g. // FAIL_ON_EMPTY_BEANS Boolean featureValue = features.get(featureKey); // e.g.false String featureType = featureTypes.get(featureKey); @@ -762,77 +784,65 @@ public class Jackson2MapperService exten } } } + } - if (defaultTypeDefs != null && defaultTypeDefs.length == 2) { - DefaultTyping defaultTyping = DefaultTyping - .valueOf(defaultTypeDefs[0]); - mapper.enableDefaultTypingAsProperty(defaultTyping, - defaultTypeDefs[1]); - getLogger().info( - "default typing is " + defaultTypeDefs[0] + " with key:" - + defaultTypeDefs[1]); + private void initAnnotationInspectors() + throws Exception + { + Iterator<String> aiKeys = annotationInspectors.keySet().iterator(); + while (aiKeys.hasNext()) { + String key = aiKeys.next(); + String avClass = annotationInspectors.get(key); + if (key.equals("primary") && avClass != null) { + try { + primary = (AnnotationIntrospector) Class.forName(avClass).getConstructor() + .newInstance(); + } catch (Exception e) { + throw new Exception( + "JsonMapperService: Error instantiating " + avClass + + " for " + key); + } + } else if (key.equals("secondary") && avClass != null) { + try { + secondary = (AnnotationIntrospector) Class.forName(avClass).getConstructor() + .newInstance(); + } catch (Exception e) { + throw new Exception( + "JsonMapperService: Error instantiating " + avClass + + " for " + key); + } + } } - - getLogger().info("setting date format to:" + dateFormat); - getLogger().info("cacheFilters is:" + cacheFilters); - if (!cacheFilters) { - mapper.configure(SerializationFeature.FLUSH_AFTER_WRITE_VALUE, true); + if (primary == null) { + primary = new JacksonAnnotationIntrospector(); // support default + getLogger().info( + "using default introspector:" + + primary.getClass().getName()); + mapper.setAnnotationIntrospector(primary); + } else if (primary != null && secondary != null){ + AnnotationIntrospector pair = new AnnotationIntrospectorPair( + primary, secondary); + mapper.setAnnotationIntrospector(pair); + } else { + mapper.setAnnotationIntrospector(primary); } - - mapper.setDateFormat(new SimpleDateFormat(dateFormat)); - if (escapeCharsGlobal) { - mapper.getFactory().setCharacterEscapes(characterEscapes); - } - if (escapeCharsClass != null) { - try { - characterEscapes = (CharacterEscapes) Class.forName(escapeCharsClass).getConstructor() - .newInstance(); - } catch (Exception e) { - throw new Exception( - "JsonMapperService: Error instantiating " + escapeCharsClass - + " for " + ESCAPE_CHAR_CLASS ); - } - } - - getLogger().debug("initialized mapper:" + mapper); - - mapper.getSerializerProvider().setNullValueSerializer( - new JsonSerializer<Object>() { - - @Override - public void serialize(Object value, JsonGenerator jgen, - SerializerProvider provider) throws IOException, - JsonProcessingException { - jgen.writeString(""); - - } - }); - cacheService = new CacheService(primary); - if (cacheService instanceof LogEnabled) + if (primary instanceof LogEnabled) { - ((LogEnabled)cacheService).enableLogging(getLogger().getChildLogger(cacheService.getClass().getSimpleName())); + ((LogEnabled)primary).enableLogging(getLogger().getChildLogger(primary.getClass().getSimpleName())); getLogger().info( - "setting cacheService logger: " - + cacheService.getClass().getSimpleName()); + "setting primary introspector logger: " + + primary.getClass().getSimpleName()); } - - if (useJsonPath) { - // set it before runtime - DefaultJsonPathWrapper djpw = null; - try { - djpw = new DefaultJsonPathWrapper(this.mapper); - getLogger().debug("******** initialized new jsonPath defaults: " +djpw.getJsonPathDefault()); - } catch (Exception e) { - throw new Exception( - "JsonMapperService: Error instantiating " + djpw - + " using useJsonPath=" + useJsonPath); - } + if (secondary instanceof LogEnabled) + { + ((LogEnabled)secondary).enableLogging(getLogger().getChildLogger(secondary.getClass().getSimpleName())); + getLogger().info( + "setting secondary introspector logger: " + + secondary.getClass().getSimpleName()); } - // JACKSON-650, Ignore missing filters, may be, because previoulsy a filter was set (e.g. ignore filter) - mapper.setFilterProvider(new SimpleFilterProvider().setFailOnUnknownId(false)); } - + public ObjectMapper getMapper() { return mapper; } Modified: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java Wed Oct 17 10:20:29 2018 @@ -39,11 +39,4 @@ public final class MixinModule extends S public void setupModule(SetupContext context) { context.setMixInAnnotations(this.clazz, this.mixin); } - -// @Override -// public Object getTypeId() -// { -// return null; // unique -// //return super.getTypeId(); -// } } \ No newline at end of file Modified: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/SimpleNameIntrospector.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/SimpleNameIntrospector.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/SimpleNameIntrospector.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/SimpleNameIntrospector.java Wed Oct 17 10:20:29 2018 @@ -48,9 +48,9 @@ public class SimpleNameIntrospector exte */ private static final long serialVersionUID = 1L; - private List<Class<?>> filteredClasses = new CopyOnWriteArrayList<Class<?>>(); - private List<String> externalFilterExcludeClasses = new CopyOnWriteArrayList<String>(); - private List<String> externalFilterIncludeClasses = new CopyOnWriteArrayList<String>(); + private List<Class<?>> filteredClasses = new CopyOnWriteArrayList<>(); + private List<String> externalFilterExcludeClasses = new CopyOnWriteArrayList<>(); + private List<String> externalFilterIncludeClasses = new CopyOnWriteArrayList<>(); // is used only for filtering by class private AtomicBoolean isExludeType = new AtomicBoolean(false); Modified: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java Wed Oct 17 10:20:29 2018 @@ -32,9 +32,17 @@ import java.util.Map; import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.Logger; import org.apache.fulcrum.json.JsonService; -import org.apache.fulcrum.json.Rectangle; -import org.apache.fulcrum.json.TestClass; +import org.apache.fulcrum.json.jackson.example.Bean; +import org.apache.fulcrum.json.jackson.example.BeanChild; +import org.apache.fulcrum.json.jackson.example.Rectangle; +import org.apache.fulcrum.json.jackson.example.TestClass; import org.apache.fulcrum.json.jackson.filters.CustomModuleWrapper; +import org.apache.fulcrum.json.jackson.mixins.BeanMixin; +import org.apache.fulcrum.json.jackson.mixins.TypedRectangle; +import org.apache.fulcrum.json.jackson.serializers.TestDeserializer; +import org.apache.fulcrum.json.jackson.serializers.TestDummyWrapperDeserializer; +import org.apache.fulcrum.json.jackson.serializers.TestJsonSerializer; +import org.apache.fulcrum.json.jackson.serializers.TestSerializer; import org.apache.fulcrum.testcontainer.BaseUnit4Test; import org.junit.Before; import org.junit.Test; @@ -79,7 +87,7 @@ public class DefaultServiceTest extends @Test public void testCustomSerializeWithoutServiceMapper() throws Exception { ObjectMapper objectMapper = customMapper(true); - String expected = "{\"type\":\"org.apache.fulcrum.json.TestClass\",\"container\":{\"type\":\"java.util.HashMap\",\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\"}"; + String expected = "{\"type\":\"org.apache.fulcrum.json.jackson.example.TestClass\",\"container\":{\"type\":\"java.util.HashMap\",\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\"}"; String serJson = customAllExceptFilter(objectMapper, new TestClass("mytest"), TestClass.class,"name"); logger.debug("serJson:"+ serJson); assertEquals("Serialization with custom mapper failed ",expected, serJson); @@ -287,7 +295,7 @@ public class DefaultServiceTest extends public void testMixinAdapter() throws Exception { TestJsonSerializer tser = new TestJsonSerializer(); CustomModuleWrapper<TestClass> cmw = new CustomModuleWrapper<TestClass>( - tser, null); + tser, new TestDummyWrapperDeserializer(TestClass.class)); sc.addAdapter("Collection Adapter", TestClass.class, cmw); String adapterSer = sc.ser(new TestClass("mytest")); assertEquals("failed adapter serialization:", @@ -339,7 +347,7 @@ public class DefaultServiceTest extends } String serColl = sc.ser(rectList); //Collection<Rectangle> resultList0 = sc.deSerCollection(serColl, List.class, Rectangle.class); - List<Rectangle> resultList0 = ((Jackson2MapperService)sc).deSerList(serColl, ArrayList.class,List.class, Rectangle.class); + List<Rectangle> resultList0 = ((Jackson2MapperService)sc).deSerList(serColl, ArrayList.class, Rectangle.class); logger.debug("resultList0 class:" +resultList0.getClass()); for (int i = 0; i < 10; i++) { assertEquals("deser reread size failed", (i * i), resultList0 @@ -505,7 +513,7 @@ public class DefaultServiceTest extends TypedRectangle filteredRect = new TypedRectangle(i, i, "rect" + i); rectList.add(filteredRect); } - Class<?> clazz = Class.forName("org.apache.fulcrum.json.jackson.TypedRectangle"); + Class<?> clazz = Class.forName("org.apache.fulcrum.json.jackson.mixins.TypedRectangle"); // no type cft. https://github.com/FasterXML/jackson-databind/issues/303 !! String jsonResult = sc.serializeOnlyFilter(rectList, clazz, true,"w"); assertEquals("[{\"w\":0},{\"w\":1}]",jsonResult); @@ -519,9 +527,9 @@ public class DefaultServiceTest extends TypedRectangle filteredRect = new TypedRectangle(i, i, "rect" + i); rectList.add(filteredRect); } - Class<?> clazz = Class.forName("org.apache.fulcrum.json.jackson.TypedRectangle"); + Class<?> clazz = Class.forName("org.apache.fulcrum.json.jackson.mixins.TypedRectangle"); sc.addAdapter("Collection Adapter", Object.class, TypedRectangle.Mixins.class); - assertEquals("[\"java.util.ArrayList\",[{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":1}]]", + assertEquals("[\"java.util.ArrayList\",[{\"type\":\"org.apache.fulcrum.json.jackson.mixins.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.mixins.TypedRectangle\",\"w\":1}]]", sc.serializeOnlyFilter(rectList, clazz, true, "w")); } @Test Added: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Jackson2MapperTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Jackson2MapperTest.java?rev=1844081&view=auto ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Jackson2MapperTest.java (added) +++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Jackson2MapperTest.java Wed Oct 17 10:20:29 2018 @@ -0,0 +1,108 @@ +package org.apache.fulcrum.json.jackson; + +/* + * 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. + */ +import static org.junit.Assert.assertEquals; + +import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.avalon.framework.logger.Logger; +import org.apache.fulcrum.json.JsonService; +import org.apache.fulcrum.json.jackson.example.Bean; +import org.apache.fulcrum.json.jackson.example.Rectangle; +import org.apache.fulcrum.testcontainer.BaseUnit4Test; +import org.junit.Before; +import org.junit.Test; + + + +/** + * More Jackson2 JSON Test + * + * Test with clearing mixins + * + * @author gk + * @version $Id$ + */ +public class Jackson2MapperTest extends BaseUnit4Test { + + private JsonService sc = null; + Logger logger; + + @Before + public void setUp() throws Exception { + sc = (JsonService) this.lookup(JsonService.ROLE); + logger = new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG); + // clear + ((Jackson2MapperService)sc).setMixins(null,null); + logger.debug( "cleared mixins"); + } + + @Test + public void testSerializeWithCustomFilter() throws Exception { + Bean bean = new Bean(); + bean.setName("joe"); + bean.setAge(12); + String filteredBean = sc.serializeOnlyFilter(bean, Bean.class, "name"); + assertEquals("Ser filtered Bean failed ", "{\"name\":\"joe\"}", filteredBean); + + Rectangle rectangle = new Rectangle(5, 10); + rectangle.setName("jim"); + String filteredRectangle = sc.serializeOnlyFilter(rectangle, + Rectangle.class, "w", "name"); + assertEquals("Ser filtered Rectangle failed ", + "{\"w\":5,\"name\":\"jim\"}", filteredRectangle); + } + + // analog seralizeAllExcept + @Test + public void testSerializeOnlyFilterMultipleFilterChanges() throws Exception { + Bean bean = new Bean(); + bean.setName("joe"); + bean.setAge(12); + + Rectangle rectangle = new Rectangle(5, 10); + rectangle.setName("jim"); + + String filteredBean = sc.serializeOnlyFilter(bean, Bean.class, "name"); + assertEquals("global Ser filtered Bean failed ", "{\"name\":\"joe\"}", filteredBean); + + String filteredRectangle = sc.serializeOnlyFilter(rectangle, + Rectangle.class, "w", "name"); + assertEquals("global Ser filtered Rectangle failed ", + "{\"w\":5,\"name\":\"jim\"}", filteredRectangle); + + filteredBean = ((Jackson2MapperService)sc).serializeOnlyFilter(bean, new Class[]{ Bean.class}, true, "age"); + assertEquals("Another Global Ser filtered Bean failed ", "{\"age\":12}", filteredBean); + + filteredRectangle = ((Jackson2MapperService)sc).serializeOnlyFilter( + rectangle, new Class[] { Rectangle.class}, true, "h", "name"); + assertEquals("Local Ser filtered Rectangle failed ", + "{\"h\":10,\"name\":\"jim\"}", filteredRectangle); + + // if refresh would be false, this would fail + filteredBean = sc.serializeOnlyFilter(bean, Bean.class, "name"); + assertEquals("global Ser filtered Bean failed ", "{\"name\":\"joe\"}", filteredBean); + + filteredRectangle = sc.serializeOnlyFilter(rectangle, + Rectangle.class, "w", "name"); + assertEquals("global Ser filtered Rectangle failed ", + "{\"w\":5,\"name\":\"jim\"}", filteredRectangle); + } + +} Propchange: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Jackson2MapperTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java Wed Oct 17 10:20:29 2018 @@ -34,14 +34,17 @@ import java.util.Map; import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.Logger; import org.apache.fulcrum.json.JsonService; -import org.apache.fulcrum.json.Rectangle; -import org.apache.fulcrum.json.TestClass; +import org.apache.fulcrum.json.jackson.example.Bean; +import org.apache.fulcrum.json.jackson.example.Rectangle; +import org.apache.fulcrum.json.jackson.example.TestClass; +import org.apache.fulcrum.json.jackson.mixins.BeanMixin; +import org.apache.fulcrum.json.jackson.mixins.RectangleMixin; +import org.apache.fulcrum.json.jackson.mixins.RectangleMixin2; +import org.apache.fulcrum.json.jackson.mixins.TypedRectangle; import org.apache.fulcrum.testcontainer.BaseUnit4Test; import org.junit.Before; import org.junit.Test; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; @@ -54,7 +57,7 @@ import com.fasterxml.jackson.databind.Ob * @version $Id$ */ public class JacksonMapperEnabledDefaultTypingTest extends BaseUnit4Test { - public static final String preDefinedOutput = "{\"type\":\"org.apache.fulcrum.json.TestClass\",\"container\":{\"type\":\"java.util.HashMap\",\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}"; + public static final String preDefinedOutput = "{\"type\":\"org.apache.fulcrum.json.jackson.example.TestClass\",\"container\":{\"type\":\"java.util.HashMap\",\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}"; private JsonService sc = null; Logger logger; @@ -101,36 +104,36 @@ public class JacksonMapperEnabledDefault } @Test public void testSerializeWithCustomFilter() throws Exception { - Bean bean = new Bean(); - bean.setName("joe"); - String filteredBean = sc.serializeOnlyFilter(bean, Bean.class, "name"); + Bean filteredBean = new Bean(); + filteredBean.setName("joe"); + String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "name"); assertEquals( "Ser filtered Bean failed ", - "{\"type\":\"org.apache.fulcrum.json.jackson.Bean\",\"name\":\"joe\"}", - filteredBean); + "{\"type\":\"org.apache.fulcrum.json.jackson.example.Bean\",\"name\":\"joe\"}", + bean); - Rectangle rectangle = new Rectangle(5, 10); - rectangle.setName("jim"); - String filteredRectangle = sc.serializeOnlyFilter(rectangle, + Rectangle filteredRectangle = new Rectangle(5, 10); + filteredRectangle.setName("jim"); + String rectangle = sc.serializeOnlyFilter(filteredRectangle, Rectangle.class, "w", "name"); assertEquals("Ser filtered Rectangle failed ", - "{\"w\":5,\"name\":\"jim\"}", filteredRectangle ); + "{\"w\":5,\"name\":\"jim\"}", rectangle); } @Test public void testSerializationCollectionWithFilter() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.serializeOnlyFilter(beanList, Bean.class, "name", "age"); assertEquals( "Serialization of beans failed ", - "['java.util.ArrayList',[{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe0','age':0},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe1','age':1},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe2','age':2},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe3','age':3},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe4','age':4},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe5','age':5},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe6','age':6},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe7','age':7},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe8','age':8},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe9','age':9}]]", + "['java.util.ArrayList',[{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe0','age':0},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe1','age':1},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe2','age':2},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe3','age':3},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe4','age':4},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe5','age':5},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe6','age':6},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe7','age':7},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe8','age':8},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe9','age':9}]]", result.replace('"', '\'')); Collection<Rectangle> resultDeSer = checkDeserCollection(result, List.class, Rectangle.class); @@ -156,10 +159,10 @@ public class JacksonMapperEnabledDefault List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.serializeOnlyFilter(beanList, Bean.class, "name", "age"); @@ -179,10 +182,10 @@ public class JacksonMapperEnabledDefault List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.serializeOnlyFilter(beanList, Bean.class, "name", "age"); @@ -202,29 +205,29 @@ public class JacksonMapperEnabledDefault Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); String serRect = sc - .addAdapter("M4RMixin", Rectangle.class, Mixin.class).ser( + .addAdapter("M4RMixin", Rectangle.class, RectangleMixin.class).ser( filteredRectangle); assertEquals("Ser failed ", "{\"width\":5}", serRect); } @Test public void testSerializeWith2Mixins() throws Exception { - Bean bean = new Bean(); - bean.setName("joe"); - Rectangle rectangle = new Rectangle(5, 10); - rectangle.setName("jim"); + Bean filteredBean = new Bean(); + filteredBean.setName("joe"); + Rectangle filteredRectangle = new Rectangle(5, 10); + filteredRectangle.setName("jim"); String serRect = sc.addAdapter("M4RMixin2", Rectangle.class, - Mixin2.class).ser(rectangle); + RectangleMixin2.class).ser(filteredRectangle); assertEquals("Ser failed ", "{\"name\":\"jim\",\"width\":5}", serRect); // - String filteredBean = sc.addAdapter("M4RBeanMixin", Bean.class, - BeanMixin.class).ser(bean);; + String bean = sc.addAdapter("M4RBeanMixin", Bean.class, + BeanMixin.class).ser(filteredBean);; assertEquals( "Ser filtered Bean failed ", - "{\"type\":\"org.apache.fulcrum.json.jackson.Bean\",\"name\":\"joe\"}", - filteredBean); + "{\"type\":\"org.apache.fulcrum.json.jackson.example.Bean\",\"name\":\"joe\"}", + bean); } @Test public void testSerializeWithMixinAndFilter() throws Exception { @@ -237,76 +240,76 @@ public class JacksonMapperEnabledDefault String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "profession"); assertEquals( "Ser filtered Bean failed ", - "{\"type\":\"org.apache.fulcrum.json.jackson.Bean\"}", + "{\"type\":\"org.apache.fulcrum.json.jackson.example.Bean\"}", bean); } @Test public void testSerializeWithUnregisteredMixinAndFilter() throws Exception { - Bean bean = new Bean(); - bean.setName("joe"); + Bean filteredBean = new Bean(); + filteredBean.setName("joe"); // sc.addAdapter("M4RBeanMixin", Bean.class, BeanMixin.class) .addAdapter("M4RBeanMixin", Bean.class, null); // now profession is used after cleaning adapter - String filteredBean = sc.serializeOnlyFilter(bean, Bean.class, "profession"); + String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "profession"); assertEquals( "Ser filtered Bean failed ", - "{\"type\":\"org.apache.fulcrum.json.jackson.Bean\",\"profession\":\"\"}", - filteredBean); + "{\"type\":\"org.apache.fulcrum.json.jackson.example.Bean\",\"profession\":\"\"}", + bean); } @Test public void testMultipleSerializingWithMixinAndFilter() throws Exception { - Rectangle rectangle = new Rectangle(5, 10); - rectangle.setName("jim"); + Rectangle filteredRectangle = new Rectangle(5, 10); + filteredRectangle.setName("jim"); // sc.addAdapter("M4RMixin2", Rectangle.class, - Mixin2.class); + RectangleMixin2.class); // if serialization is done Jackson clean cache - String rectangle0 = sc.ser(rectangle,Rectangle.class,true); + String rectangle0 = sc.ser(filteredRectangle,Rectangle.class,true); assertEquals( "Ser filtered Rectangle failed ", "{\"name\":\"jim\",\"width\":5}", rectangle0); // filtering out name, using width from mixin2 as a second filter - String rectangle1 = sc.serializeOnlyFilter(rectangle, Rectangle.class, true, "width"); + String rectangle = sc.serializeOnlyFilter(filteredRectangle, Rectangle.class, true, "width"); assertEquals( "Ser filtered Rectangle failed ", "{\"width\":5}", - rectangle1); + rectangle); // default for mixin - String rectangle2 = sc.ser(rectangle); + String rectangle1 = sc.ser(filteredRectangle); assertEquals( "Ser filtered Rectangle failed ", "{\"name\":\"jim\",\"width\":5}", - rectangle2); + rectangle1); } @Test public void testSerializationCollectionWithMixin() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.addAdapter("M4RMixin", Bean.class, BeanMixin.class) .ser(beanList); assertEquals( "Serialization of beans failed ", - "['java.util.ArrayList',[{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe2'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe3'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe4'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe5'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe6'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe7'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe8'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe9'}]]", + "['java.util.ArrayList',[{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe2'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe3'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe4'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe5'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe6'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe7'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe8'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe9'}]]", result.replace('"', '\'')); } @Test public void testDeSerializationCollectionWithMixin() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.addAdapter("M4RMixin", Bean.class, BeanMixin.class) .ser(beanList); @@ -325,17 +328,17 @@ public class JacksonMapperEnabledDefault components.add(new Rectangle(25, 3)); components.add(new Rectangle(250, 30)); for (int i = 0; i < 3; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - components.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + components.add(filteredBean); } - sc.addAdapter("M4RMixin", Rectangle.class, Mixin.class).addAdapter( + sc.addAdapter("M4RMixin", Rectangle.class, RectangleMixin.class).addAdapter( "M4BeanRMixin", Bean.class, BeanMixin.class); String serRect = sc.ser(components); assertEquals( "Serialization failed ", - "['java.util.ArrayList',[{'type':'org.apache.fulcrum.json.Rectangle','width':25},{'type':'org.apache.fulcrum.json.Rectangle','width':250},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe2'}]]", + "['java.util.ArrayList',[{'type':'org.apache.fulcrum.json.jackson.example.Rectangle','width':25},{'type':'org.apache.fulcrum.json.jackson.example.Rectangle','width':250},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe2'}]]", serRect.replace('"', '\'')); } @Test @@ -346,25 +349,7 @@ public class JacksonMapperEnabledDefault TypedRectangle filteredRect = new TypedRectangle(i, i, "rect" + i); rectList.add(filteredRect); } - assertEquals("[\"java.util.ArrayList\",[{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":1}]]", + assertEquals("[\"java.util.ArrayList\",[{\"type\":\"org.apache.fulcrum.json.jackson.mixins.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.mixins.TypedRectangle\",\"w\":1}]]", sc.serializeOnlyFilter(rectList, TypedRectangle.class, "w")); } - - // @JsonFilter("myFilter") - - public static abstract class Mixin2 { - void MixIn2(int w, int h) { - } - - @JsonProperty("width") - abstract int getW(); // rename property - - @JsonIgnore - abstract int getH(); - - @JsonIgnore - abstract int getSize(); // exclude - - abstract String getName(); - } } Modified: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTyping_OBJECT_AND_NON_CONCRETE_Test.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTyping_OBJECT_AND_NON_CONCRETE_Test.java?rev=1844081&r1=1844080&r2=1844081&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTyping_OBJECT_AND_NON_CONCRETE_Test.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTyping_OBJECT_AND_NON_CONCRETE_Test.java Wed Oct 17 10:20:29 2018 @@ -35,14 +35,17 @@ import java.util.TimeZone; import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.Logger; import org.apache.fulcrum.json.JsonService; -import org.apache.fulcrum.json.Rectangle; -import org.apache.fulcrum.json.TestClass; +import org.apache.fulcrum.json.jackson.example.Bean; +import org.apache.fulcrum.json.jackson.example.Rectangle; +import org.apache.fulcrum.json.jackson.example.TestClass; +import org.apache.fulcrum.json.jackson.mixins.BeanMixin; +import org.apache.fulcrum.json.jackson.mixins.RectangleMixin; +import org.apache.fulcrum.json.jackson.mixins.RectangleMixin2; +import org.apache.fulcrum.json.jackson.mixins.TypedRectangle; import org.apache.fulcrum.testcontainer.BaseUnit4Test; import org.junit.Before; import org.junit.Test; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; @@ -186,13 +189,13 @@ public class JacksonMapperEnabledDefault } @Test public void testSerializeWithCustomFilter() throws Exception { - Bean bean = new Bean(); - bean.setName("joe"); - String filteredBean = sc.serializeOnlyFilter(bean, "name"); + Bean filteredBean = new Bean(); + filteredBean.setName("joe"); + String bean = sc.serializeOnlyFilter(filteredBean, "name"); assertEquals( "Ser filtered Bean failed ", "{\"name\":\"joe\"}", - filteredBean); + bean); Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); String rectangle = sc.serializeOnlyFilter(filteredRectangle, @@ -205,28 +208,28 @@ public class JacksonMapperEnabledDefault List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } - String filteredResult = sc.serializeOnlyFilter(beanList, Bean.class, "name", + String result = sc.serializeOnlyFilter(beanList, Bean.class, "name", "age"); assertEquals( "Serialization of beans failed ", - "[{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe0','age':0},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe1','age':1},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe2','age':2},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe3','age':3},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe4','age':4},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe5','age':5},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe6','age':6},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe7','age':7},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe8','age':8},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe9','age':9}]", - filteredResult.replace('"', '\'')); + "[{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe0','age':0},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe1','age':1},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe2','age':2},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe3','age':3},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe4','age':4},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe5','age':5},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe6','age':6},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe7','age':7},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe8','age':8},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe9','age':9}]", + result.replace('"', '\'')); } @Test public void testDeserializationCollectionWithFilter() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } - String filteredResult = sc.serializeOnlyFilter(beanList, Bean.class, "name", + String result = sc.serializeOnlyFilter(beanList, Bean.class, "name", "age"); //System.out.println("res:"+result); // could not use TypeReference as JSON string has no type set for array: @@ -234,8 +237,8 @@ public class JacksonMapperEnabledDefault // need JSON String that contains type id (for subtype of java.util.Collection) // // -> need to use constructCollectionType - Class clazz = Class.forName("org.apache.fulcrum.json.jackson.Bean"); - List<Bean> beanList2 = (List<Bean>)sc.deSerCollection(filteredResult, new ArrayList(),clazz); + Class clazz = Class.forName("org.apache.fulcrum.json.jackson.example.Bean"); + List<Bean> beanList2 = (List<Bean>)sc.deSerCollection(result, new ArrayList(),clazz); assertTrue("DeSer failed ", beanList2.size() == 10); for (Bean bean : beanList2) { assertEquals("DeSer failed ", Bean.class, bean.getClass()); @@ -246,17 +249,17 @@ public class JacksonMapperEnabledDefault throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.serializeOnlyFilter(beanList, Bean.class, "name", "age"); // could not use TypeReference as JSON string has no type set for array: // Exception: need JSON String that contains type id (for subtype of java.util.List) // -> need to use constructCollectionType - Class clazz = Class.forName("org.apache.fulcrum.json.jackson.Bean"); + Class clazz = Class.forName("org.apache.fulcrum.json.jackson.example.Bean"); List<Bean> beanList2 = (List<Bean>)sc.deSerCollection(result, new ArrayList(),clazz); //Object beanList2 = sc.deSer(result, List.class); assertTrue("DeSer failed ", beanList2 instanceof List); @@ -274,28 +277,28 @@ public class JacksonMapperEnabledDefault Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); String serRect = sc - .addAdapter("M4RMixin", Rectangle.class, Mixin.class).ser( + .addAdapter("M4RMixin", Rectangle.class, RectangleMixin.class).ser( filteredRectangle); assertEquals("Ser failed ", "{\"width\":5}", serRect); } @Test public void testSerializeWith2Mixins() throws Exception { - Bean bean = new Bean(); - bean.setName("joe"); + Bean filteredBean = new Bean(); + filteredBean.setName("joe"); Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); String serRect = sc.addAdapter("M4RMixin2", Rectangle.class, - Mixin2.class).ser(filteredRectangle); + RectangleMixin2.class).ser(filteredRectangle); assertEquals("Ser failed ", "{\"name\":\"jim\",\"width\":5}", serRect); // - String filteredBean = sc.addAdapter("M4RBeanMixin", Bean.class, - BeanMixin.class).ser(bean);; + String bean = sc.addAdapter("M4RBeanMixin", Bean.class, + BeanMixin.class).ser(filteredBean);; assertEquals( "Ser filtered Bean failed ", "{\"name\":\"joe\"}", - filteredBean); + bean); } @Test public void testSerializeWithMixinAndFilter() throws Exception { @@ -312,74 +315,74 @@ public class JacksonMapperEnabledDefault } @Test public void testSerializeWithUnregisteredMixinAndFilter() throws Exception { - Bean bean = new Bean(); - bean.setName("joe"); + Bean filteredBean = new Bean(); + filteredBean.setName("joe"); sc.addAdapter("M4RBeanMixin", Bean.class, BeanMixin.class) .addAdapter("M4RBeanMixin", Bean.class, null); // now profession is used after cleaning adapter - String filteredBeanSer = sc.serializeOnlyFilter(bean, Bean.class, "profession"); + String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "profession"); assertEquals( "Ser filtered Bean failed ", "{\"profession\":\"\"}", - filteredBeanSer); + bean); } @Test public void testMultipleSerializingWithMixinAndFilter() throws Exception { - Rectangle rectangle = new Rectangle(5, 10); - rectangle.setName("jim"); + Rectangle filteredRectangle = new Rectangle(5, 10); + filteredRectangle.setName("jim"); sc.addAdapter("M4RMixin2", Rectangle.class, - Mixin2.class); + RectangleMixin2.class); // if serialization is done Jackson clean cache - String rectangle0 = sc.ser(rectangle,Rectangle.class,true); + String rectangle0 = sc.ser(filteredRectangle,Rectangle.class,true); assertEquals( "Ser filtered Rectangle failed ", "{\"name\":\"jim\",\"width\":5}", rectangle0); // filtering out name, using width from mixin2 as a second filter - String rectangle1 = sc.serializeOnlyFilter(rectangle, Rectangle.class, true, "width"); + String rectangle = sc.serializeOnlyFilter(filteredRectangle, Rectangle.class, true, "width"); assertEquals( "Ser filtered Rectangle failed ", "{\"width\":5}", - rectangle1); + rectangle); // default for mixin - String rectangle2 = sc.ser(rectangle); + String rectangle1 = sc.ser(filteredRectangle); assertEquals( "Ser filtered Rectangle failed ", "{\"name\":\"jim\",\"width\":5}", - rectangle2); + rectangle1); } @Test public void testSerializationCollectionWithMixin() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.addAdapter("M4RMixin", Bean.class, BeanMixin.class) .ser(beanList); assertEquals( "Serialization of beans failed ", - "[{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe2'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe3'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe4'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe5'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe6'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe7'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe8'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe9'}]", + "[{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe2'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe3'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe4'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe5'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe6'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe7'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe8'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe9'}]", result.replace('"', '\'')); } @Test public void testDeSerializationCollectionWithMixin() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); for (int i = 0; i < 10; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - beanList.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + beanList.add(filteredBean); } String result = sc.addAdapter("M4RMixin", Bean.class, BeanMixin.class) .ser(beanList); logger.debug("result:::"+ result); // Type List.class / TypeReference -> Exception: need JSON String that contains type id (for subtype of java.util.List) - // Type: Bean.class -> Exception: Can not deserialize instance of org.apache.fulcrum.json.jackson.Bean out of START_ARRAY token + // Type: Bean.class -> Exception: Can not deserialize instance of org.apache.fulcrum.json.jackson.example.Bean out of START_ARRAY token // -> need to use constructCollectionType List<Bean> beanList2 = (List<Bean>)sc.deSerCollection(result, new ArrayList(),Bean.class); @@ -394,18 +397,18 @@ public class JacksonMapperEnabledDefault components.add(new Rectangle(25, 3)); components.add(new Rectangle(250, 30)); for (int i = 0; i < 3; i++) { - Bean bean = new Bean(); - bean.setName("joe" + i); - bean.setAge(i); - components.add(bean); + Bean filteredBean = new Bean(); + filteredBean.setName("joe" + i); + filteredBean.setAge(i); + components.add(filteredBean); } // property w->width, BeanMixin: name ignore other properties - sc.addAdapter("M4RMixin", Rectangle.class, Mixin.class).addAdapter( + sc.addAdapter("M4RMixin", Rectangle.class, RectangleMixin.class).addAdapter( "M4BeanRMixin", Bean.class, BeanMixin.class); String serRect = sc.ser(components); assertEquals( "Serialization failed ", - "[{'type':'org.apache.fulcrum.json.Rectangle','width':25},{'type':'org.apache.fulcrum.json.Rectangle','width':250},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.Bean','name':'joe2'}]", + "[{'type':'org.apache.fulcrum.json.jackson.example.Rectangle','width':25},{'type':'org.apache.fulcrum.json.jackson.example.Rectangle','width':250},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe0'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe1'},{'type':'org.apache.fulcrum.json.jackson.example.Bean','name':'joe2'}]", serRect.replace('"', '\'')); } @Test @@ -416,23 +419,10 @@ public class JacksonMapperEnabledDefault TypedRectangle filteredRect = new TypedRectangle(i, i, "rect" + i); rectList.add(filteredRect); } - assertEquals("[{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":1}]", + assertEquals("[{\"type\":\"org.apache.fulcrum.json.jackson.mixins.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.mixins.TypedRectangle\",\"w\":1}]", sc.serializeOnlyFilter(rectList, TypedRectangle.class, true, "w")); } - - public static abstract class Mixin2 { - void MixIn2(int w, int h) { - } - @JsonProperty("width") - abstract int getW(); // rename property - @JsonIgnore - abstract int getH(); - @JsonIgnore - abstract int getSize(); // exclude - abstract String getName(); - } - public static class DateKeyMixin { // @JsonCreator // static Object create(Map<String, Object> map) {