Author: gk Date: Thu Apr 30 15:20:06 2015 New Revision: 1677013 URL: http://svn.apache.org/r1677013 Log: - added cache service - adding convenience methods - removing some method calls having null arguments - junit 3 -> 4 in master pom, with dependency to SNAPSHOT testcontainer
Added: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java (with props) turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CustomModule.java (with props) turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java (with props) 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/api/src/test/org/apache/fulcrum/json/DummTest.java turbine/fulcrum/trunk/json/gson/pom.xml turbine/fulcrum/trunk/json/gson/src/java/org/apache/fulcrum/json/gson/GSONBuilderService.java turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java turbine/fulcrum/trunk/json/jackson/pom.xml turbine/fulcrum/trunk/json/jackson/src/java/org/apache/fulcrum/json/jackson/JacksonMapperService.java turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java turbine/fulcrum/trunk/json/jackson2/pom.xml 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/SimpleNameIntrospector.java turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/filters/CustomModuleWrapper.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/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/pom.xml Modified: turbine/fulcrum/trunk/json/api/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/api/pom.xml?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/api/pom.xml (original) +++ turbine/fulcrum/trunk/json/api/pom.xml Thu Apr 30 15:20:06 2015 @@ -48,24 +48,6 @@ <artifactId>avalon-framework-api</artifactId> <version>4.3.1</version> </dependency> - <dependency> - <groupId>org.apache.fulcrum</groupId> - <artifactId>fulcrum-crypto</artifactId> - <version>1.0.7</version> - </dependency> - - <dependency> - <groupId>org.apache.fulcrum</groupId> - <artifactId>fulcrum-testcontainer</artifactId> - <version>1.0.6</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.fulcrum</groupId> - <artifactId>fulcrum-yaafi</artifactId> - <version>1.0.6</version> - <scope>test</scope> - </dependency> </dependencies> <build> <sourceDirectory>src/java</sourceDirectory> 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=1677013&r1=1677012&r2=1677013&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 Thu Apr 30 15:20:06 2015 @@ -119,11 +119,34 @@ public interface JsonService { */ <T> Collection<T> deSerCollection(String json, Object collectionType, Class<T> elementType) throws Exception; + + /** + * Custom method without caching. Caching is set to <code>false</code> for this method call. + * @see #serializeOnlyFilter(Object, Class, Boolean, String...). + * + * <code>refreshFilter</code> is set to <code>true</code> for this method call. + */ + public <T> String serializeOnlyFilter(Object src, + String... filterAttr) throws Exception; + + /** + * Custom method. Caching key is derived from param src object class. + * @see #serializeOnlyFilter(Object, Class, Boolean, String...). + * + * @param src + * The Java object to serialize + * @param cleanFilter + * The Boolean value, not null. If it is <code>true</code>, cleans cache and the custom filter after serialization. + * + * <code>refreshFilter</code> is set to <code>true</code> for this method call. + */ + public <T> String serializeOnlyFilter(Object src, Boolean cleanFilter, + String... filterAttr) throws Exception; /** * @see #serializeOnlyFilter(Object, Class, Boolean, String...). * - * <code>refreshFilter</code> is set to <code>false</code> for this method call. + * Caching is set to <code>false</code> for this method call. */ public <T> String serializeOnlyFilter(Object src, Class<T> filterClass, String... filterAttr) throws Exception; @@ -132,20 +155,20 @@ public interface JsonService { * Serialize only object properties where filter attributes are provided * * @param src - * the Java object to serialize + * The Java object to serialize * @param filterClass - * the class to which the filtering should be applied + * By default filterClass is the key in the filter object cached. * * @param cleanFilter - * the Boolean value, not null. If it is <code>true</code>, cleans cache and the custom filter after serialization. + * The Boolean value, not null. If it is <code>true</code>, cleans cache and the custom filter after serialization. * * @param filterAttr - * the class bean attributes which should be serialized + * The class bean attributes which should be serialized * * @return JSON string * * @throws Exception - * if JSON serialization or filter registration fails + * If JSON serialization or filter registration fails */ public <T> String serializeOnlyFilter(Object src, Class<T> filterClass, Boolean cleanFilter, String... filterAttr) throws Exception; @@ -154,32 +177,48 @@ public interface JsonService { * Serialize all object properties excluding provided filters attributes * * @param src - * the Java object to serialize + * The Java object to serialize * @param filterClass - * the class to which the filtering should be applied. If its the - * same class, just the filterAttributes get applied. If not the - * class is filtered out, if found as a property type. + * The class to which the filtering should be applied. If its the + * same class, just the filterAttributes get applied. If not, the + * class is filtered out, if found as a property type. By default filterClass is the key in the filter object cached. * @param cleanFilter - * if <code>true </code> cleans filter (clean cache and custom filter for this filterClass) after serialization. - * + * If <code>true </code> cleans filter (clean cache and custom filter for this filterClass) after serialization. * @param filterAttr - * the bean attributes which should not be serialized + * The bean attributes which should not be serialized * * @return JSON string * * @throws Exception - * if JSON serialization or filter registration fails + * If JSON serialization or filter registration fails */ public <T> String serializeAllExceptFilter(Object src, Class<T> filterClass, Boolean cleanFilter, String... filterAttr) throws Exception; /** + * Class Filter is derived from param src object class. + * <code>refreshFilter</code> is set to <code>false</code> for this method call. + * * @see #serializeAllExceptFilter(Object, Class, Boolean, String...) * * <code>refreshFilter</code> is <code>false</code>. */ public <T> String serializeAllExceptFilter(Object src, Class<T> filterClass, String... filterAttr) throws Exception; + + /** + * Class Filter is derived from param src object class. + * + * @see #serializeAllExceptFilter(Object, Class, Boolean, String...) + */ + public <T> String serializeAllExceptFilter(Object src, + Boolean cleanFilter, String... filterAttr) throws Exception; + + /** + * @see #serializeAllExceptFilter(Object, Class, Boolean, String...) + */ + public <T> String serializeAllExceptFilter(Object src, + String... filterAttr) throws Exception; /** * Adds an adapter (mixin, serializer,..) for the target class depending on @@ -187,16 +226,16 @@ public interface JsonService { * Cft. to {@link #addAdapter(String, Class, Object)} * * @param name - * the name of the adapter + * The name of the adapter * @param target - * the target class for this adapter + * The target class for this adapter * @param mixin - * the adapter/mixin for the target class + * The adapter/mixin for the target class * * @return the JsonService instance * * @throws Exception - * if adapter registration fails + * If adapter registration fails */ public JsonService addAdapter(String name, Class target, Class mixin) throws Exception; @@ -208,14 +247,14 @@ public interface JsonService { * implementation) * * @param name - * the name of the adapter + * The name of the adapter * @param target - * the target class for this adapter + * The target class for this adapter * @param mixin - * the adapter/mixin for the target object + * The adapter/mixin for the target object * (module/serializer/deserializer) * - * @return a JsonService instance + * @return A JsonService instance * * @throws Exception * if adapter registration fails @@ -225,7 +264,7 @@ public interface JsonService { /** * @param df - * the {@link DateFormat} to be used by the JsonService, not null. + * The {@link DateFormat} to be used by the JsonService, not null. * * It could be provided by component configuration too. * Modified: turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/DummTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/DummTest.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/DummTest.java (original) +++ turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/DummTest.java Thu Apr 30 15:20:06 2015 @@ -1,9 +1,11 @@ package org.apache.fulcrum.json; -import junit.framework.TestCase; +import org.junit.Test; -public class DummTest extends TestCase { +public class DummTest { + + @Test public void testDummy() { } Modified: turbine/fulcrum/trunk/json/gson/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/gson/pom.xml?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/gson/pom.xml (original) +++ turbine/fulcrum/trunk/json/gson/pom.xml Thu Apr 30 15:20:06 2015 @@ -84,18 +84,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>3.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.fulcrum</groupId> - <artifactId>fulcrum-testcontainer</artifactId> - <version>1.0.6</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.apache.fulcrum</groupId> <artifactId>fulcrum-yaafi</artifactId> <version>1.0.6</version> Modified: turbine/fulcrum/trunk/json/gson/src/java/org/apache/fulcrum/json/gson/GSONBuilderService.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/gson/src/java/org/apache/fulcrum/json/gson/GSONBuilderService.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/gson/src/java/org/apache/fulcrum/json/gson/GSONBuilderService.java (original) +++ turbine/fulcrum/trunk/json/gson/src/java/org/apache/fulcrum/json/gson/GSONBuilderService.java Thu Apr 30 15:20:06 2015 @@ -101,7 +101,22 @@ public class GSONBuilderService extends getLogger().debug("collectionType:" + collectionType); return gson.create().fromJson(json, (Type)collectionType); } - + + @Override + public <T> String serializeOnlyFilter(Object src, String... filterAttr) + throws Exception { + return gson + .addSerializationExclusionStrategy( + include(null,filterAttr)).create().toJson(src); + } + + @Override + public <T> String serializeOnlyFilter(Object src, Boolean notused, + String... filterAttr) throws Exception { + return gson + .addSerializationExclusionStrategy( + include(null,filterAttr)).create().toJson(src); + } @Override public <T> String serializeOnlyFilter(Object src, Class<T> filterClass, @@ -157,6 +172,22 @@ public class GSONBuilderService extends } @Override + public <T> String serializeAllExceptFilter(Object src, String... filterAttr) + throws Exception { + return gson + .addSerializationExclusionStrategy( + exclude(null, filterAttr)).create().toJson(src); + } + + @Override + public <T> String serializeAllExceptFilter(Object src, Boolean notused, + String... filterAttr) throws Exception { + return gson + .addSerializationExclusionStrategy( + exclude(null, filterAttr)).create().toJson(src); + } + + @Override public String ser(Object src, Boolean refreshCache) throws Exception { throw new Exception("Not implemented!"); } @@ -338,6 +369,4 @@ public class GSONBuilderService extends }.init(clazz, filterAttrs); } - - } Modified: turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java (original) +++ turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java Thu Apr 30 15:20:06 2015 @@ -69,7 +69,7 @@ public class DefaultServiceTest extends public void testSerializeExcludeNothing() throws Exception { String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - (Class) null, (String[]) null); + (String[]) null); assertEquals( "Serialization failed ", "{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}", @@ -98,7 +98,7 @@ public class DefaultServiceTest extends public void testSerializeExcludeField() throws Exception { String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - (Class) null, "configurationName"); + "configurationName"); assertEquals("Serialization failed ", "{\"container\":{\"cf\":\"Config.xml\"},\"name\":\"mytest\"}", serJson); @@ -238,7 +238,7 @@ public class DefaultServiceTest extends // as gson adds we could not use multiple disjunct exclusion strategies Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); - String rectangle = sc.serializeOnlyFilter(filteredRectangle, (Class) null, "w"); + String rectangle = sc.serializeOnlyFilter(filteredRectangle, "w"); assertEquals( "Ser filtered Rectangle failed ", "{\"w\":5}", Modified: turbine/fulcrum/trunk/json/jackson/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson/pom.xml?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson/pom.xml (original) +++ turbine/fulcrum/trunk/json/jackson/pom.xml Thu Apr 30 15:20:06 2015 @@ -84,18 +84,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>3.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.fulcrum</groupId> - <artifactId>fulcrum-testcontainer</artifactId> - <version>1.0.6</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.apache.fulcrum</groupId> <artifactId>fulcrum-yaafi</artifactId> <version>1.0.6</version> Modified: turbine/fulcrum/trunk/json/jackson/src/java/org/apache/fulcrum/json/jackson/JacksonMapperService.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson/src/java/org/apache/fulcrum/json/jackson/JacksonMapperService.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson/src/java/org/apache/fulcrum/json/jackson/JacksonMapperService.java (original) +++ turbine/fulcrum/trunk/json/jackson/src/java/org/apache/fulcrum/json/jackson/JacksonMapperService.java Thu Apr 30 15:20:06 2015 @@ -163,11 +163,23 @@ public class JacksonMapperService extend return mapper.readValue(json, mapper.getTypeFactory() .constructCollectionType(collectionType, type)); } + + @Override + public <T> String serializeAllExceptFilter(Object src, String... filterAttr) + throws Exception { + return serializeAllExceptFilter(src, src.getClass(), true, filterAttr); + } + + @Override + public <T> String serializeAllExceptFilter(Object src, Boolean refresh, + String... filterAttr) throws Exception { + return serializeAllExceptFilter(src, src.getClass(), refresh, filterAttr); + } @Override public synchronized <T> String serializeAllExceptFilter(Object src, Class<T> filterClass, String... filterAttr) throws Exception { - return serializeAllExceptFilter(src, filterClass, false, filterAttr); + return serializeAllExceptFilter(src, filterClass, true, filterAttr); } @Override @@ -178,7 +190,7 @@ public class JacksonMapperService extend FilterProvider filter = null; if ( filterClass != null) { if (filterAttr != null && filterAttr.length > 0 && - !this.filters.containsKey(filterClass.getName())) { + (refreshFilter || !this.filters.containsKey(filterClass.getName()))) { filter = new SimpleFilterProvider().addFilter( filterClass.getName(), SimpleBeanPropertyFilter.serializeAllExcept(filterAttr)); @@ -194,11 +206,24 @@ public class JacksonMapperService extend } return serialized; } + + + @Override + public <T> String serializeOnlyFilter(Object src, String... filterAttr) + throws Exception { + return serializeOnlyFilter(src, src.getClass(), true, filterAttr); + } + + @Override + public <T> String serializeOnlyFilter(Object src, Boolean refresh, + String... filterAttr) throws Exception { + return serializeOnlyFilter(src, src.getClass(), refresh, filterAttr); + } @Override public synchronized <T> String serializeOnlyFilter(Object src, Class<T> filterClass, String... filterAttr) throws Exception { - return serializeOnlyFilter(src, filterClass, false, filterAttr); + return serializeOnlyFilter(src, filterClass, true, filterAttr); } @Override @@ -491,5 +516,4 @@ public class JacksonMapperService extend } } - } Modified: turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java (original) +++ turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java Thu Apr 30 15:20:06 2015 @@ -63,8 +63,7 @@ public class DefaultServiceTest extends } public void testSerializeExcludeNothing() throws Exception { - String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - (Class) null, (String[]) null); + String serJson = sc.ser(new TestClass("mytest")); assertEquals( "Serialization failed ", "{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}", Modified: turbine/fulcrum/trunk/json/jackson2/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/pom.xml?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/pom.xml (original) +++ turbine/fulcrum/trunk/json/jackson2/pom.xml Thu Apr 30 15:20:06 2015 @@ -84,18 +84,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>3.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.fulcrum</groupId> - <artifactId>fulcrum-testcontainer</artifactId> - <version>1.0.6</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.apache.fulcrum</groupId> <artifactId>fulcrum-yaafi</artifactId> <version>1.0.6</version> Added: 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=1677013&view=auto ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java (added) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java Thu Apr 30 15:20:06 2015 @@ -0,0 +1,69 @@ +package org.apache.fulcrum.json.jackson; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; + +public class CacheService { + + AnnotationIntrospector primary; + Map<String, FilterProvider> filters = new ConcurrentHashMap<String, FilterProvider>();; + + public CacheService(AnnotationIntrospector primary) { + this.primary = primary; + } + + <T> void removeFilter(Class<T> filterClass, Boolean excludeType) { + if (filterClass == null) + return; + if (filters.containsKey(filterClass.getName())) { + removeCustomIntrospectorWithExternalFilterId(filterClass, excludeType); + SimpleFilterProvider smpfilter = (SimpleFilterProvider) filters + .get(filterClass.getName()); + smpfilter.removeFilter(filterClass.getName()); + filters.remove(filterClass.getName()); + } + } + + <T> void removeCustomIntrospectorWithExternalFilterId( + Class<T> externalFilterId, Boolean excludeType) { + if (primary instanceof SimpleNameIntrospector) { + if (externalFilterId != null) { + ((SimpleNameIntrospector) primary) + .removeExternalFilterClass(externalFilterId); + if (excludeType) { + ((SimpleNameIntrospector) primary) + .removeExternalFilterExcludeClass(externalFilterId); + } + } + } + } + + void cleanSerializerCache(ObjectMapper mapper) { + if (mapper.getSerializerProvider() instanceof DefaultSerializerProvider) { + int cachedSerProvs = ((DefaultSerializerProvider) mapper + .getSerializerProvider()).cachedSerializersCount(); + if (cachedSerProvs > 0) { +// getLogger() +// .debug("flushing cachedSerializersCount:" +// + cachedSerProvs); + ((DefaultSerializerProvider) mapper.getSerializerProvider()) + .flushCachedSerializers(); + } + } + } + + public Map<String, FilterProvider> getFilters() { + return filters; + } + + public void setFilters(Map<String, FilterProvider> filters) { + this.filters = filters; + } + +} Propchange: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CacheService.java ------------------------------------------------------------------------------ svn:eol-style = native Added: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CustomModule.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CustomModule.java?rev=1677013&view=auto ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CustomModule.java (added) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CustomModule.java Thu Apr 30 15:20:06 2015 @@ -0,0 +1,18 @@ +package org.apache.fulcrum.json.jackson; + +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public final class CustomModule<T> extends SimpleModule { + + private static final long serialVersionUID = 1L; + + public CustomModule(String name, Class<T> targetClazz, + StdSerializer<T> stdSer, StdDeserializer<T> stdDeser) { + super(name, Version.unknownVersion()); + addSerializer(targetClazz, stdSer); + addDeserializer(targetClazz, stdDeser); + } +} Propchange: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/CustomModule.java ------------------------------------------------------------------------------ svn:eol-style = native 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=1677013&r1=1677012&r2=1677013&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 Thu Apr 30 15:20:06 2015 @@ -25,8 +25,6 @@ import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.configuration.Configurable; @@ -40,7 +38,6 @@ import com.fasterxml.jackson.core.JsonGe import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.AnnotationIntrospector; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -54,16 +51,13 @@ import com.fasterxml.jackson.databind.Ob import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.cfg.ConfigFeature; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.PropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; /** * @@ -98,7 +92,6 @@ public class Jackson2MapperService exten private Hashtable<String, Boolean> features = null; private Hashtable<String, String> featureTypes = null; - private Map<String, FilterProvider> filters; private String dateFormat; /** @@ -110,6 +103,7 @@ public class Jackson2MapperService exten public 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; @Override public String ser(Object src) throws Exception { @@ -136,9 +130,10 @@ public class Jackson2MapperService exten return ser(src); } getLogger().debug("ser class::" + src.getClass() + " with filter " + filter); + mapper.setFilters(filter); String res = mapper.writer(filter).writeValueAsString(src); if (cleanCache) { - cleanSerializerCache(); + cacheService.cleanSerializerCache(mapper); } return res; } @@ -164,7 +159,7 @@ public class Jackson2MapperService exten throws Exception { String res = mapper.writerWithType(collectionType).writeValueAsString(src); if (cleanCache) { - cleanSerializerCache(); + cacheService.cleanSerializerCache(mapper); } return res; } @@ -180,13 +175,11 @@ public class Jackson2MapperService exten } } - public <T> Collection<T> deSerCollectionWithTypeReference(String json, TypeReference collectionType ) throws Exception { return mapper.readValue(json, collectionType); } - public void getJsonService() throws InstantiationException { } @@ -210,9 +203,9 @@ public class Jackson2MapperService exten /** * Add a named module * - * @param name name of the module + * @param name Name of the module * - * @param target target class + * @param target Target class * * @param module * Either an Jackson Module @link {@link Module} or an custom @@ -248,30 +241,68 @@ public class Jackson2MapperService exten } @Override + public <T> String serializeAllExceptFilter(Object src, String... filterAttr) + throws Exception { + return serializeAllExceptFilter(src, src.getClass(), true, filterAttr); + } + + public synchronized <T> String serializeAllExceptFilter(Object src, Boolean cache, String... filterAttr) throws Exception { + return serializeAllExceptFilter(src, src.getClass(), cache, filterAttr); + } + + public synchronized <T> String serializeAllExceptFilter(Object src, + Class<T>[] filterClasses, String... filterAttr) throws Exception { + return serializeAllExceptFilter(src, filterClasses, true, filterAttr); + } + + @Override public synchronized <T> String serializeAllExceptFilter(Object src, Class<T> filterClass, String... filterAttr) throws Exception { - return serializeAllExceptFilter(src, filterClass, false, filterAttr); + return serializeAllExceptFilter(src, filterClass, true, filterAttr); } - + + @Override + public <T> String serializeAllExceptFilter(Object src, + Class<T> filterClass, Boolean cleanFilter, String... filterAttr) + throws Exception { + return serializeAllExceptFilter(src, new Class[] {filterClass}, cleanFilter, filterAttr); + } + public synchronized <T> String serializeAllExceptFilter(Object src, - Class<T> filterClass, Boolean clean, String... filterAttr) throws Exception { + Class<T>[] filterClasses, Boolean clean, String... filterAttr) throws Exception { PropertyFilter pf = null; if (filterAttr != null) pf = SimpleBeanPropertyFilter.serializeAllExcept(filterAttr); else pf = SimpleBeanPropertyFilter.serializeAllExcept("dummy"); - return filter(src, filterClass, pf, clean, true); + return filter(src, filterClasses, pf, clean, true); + } + + @Override + public <T> String serializeOnlyFilter(Object src, String... filterAttrs) + throws Exception { + return serializeOnlyFilter(src, src.getClass(), true, filterAttrs); + } + + public synchronized <T> String serializeOnlyFilter(Object src, + Boolean cache, String... filterAttr) throws Exception { + return serializeOnlyFilter(src, src.getClass(), cache, filterAttr); } @Override public synchronized <T> String serializeOnlyFilter(Object src, Class<T> filterClass, String... filterAttr) throws Exception { - return serializeOnlyFilter(src, filterClass, false, filterAttr); + return serializeOnlyFilter(src, filterClass, true, filterAttr); } @Override public synchronized <T> String serializeOnlyFilter(Object src, Class<T> filterClass, Boolean refresh, String... filterAttr) throws Exception { + return serializeOnlyFilter(src, new Class[]{ filterClass }, refresh, filterAttr); + } + + public synchronized <T> String serializeOnlyFilter(Object src, + Class<T>[] filterClasses, Boolean refresh, String... filterAttr) throws Exception { PropertyFilter pf = null; if (filterAttr != null && filterAttr.length > 0) { pf = SimpleBeanPropertyFilter.filterOutAllExcept(filterAttr); @@ -279,25 +310,25 @@ public class Jackson2MapperService exten } else { pf = SimpleBeanPropertyFilter.filterOutAllExcept("dummy"); } - return filter(src, filterClass, pf, refresh, false); + return filter(src, filterClasses, pf, refresh, false); } @Override public String ser(Object src, Boolean cleanCache) throws Exception { - if (filters.containsKey(src.getClass().getName())) { + 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) this.filters.get(src.getClass() + 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) { - cleanSerializerCache(); + cacheService.cleanSerializerCache(mapper); } return res; } @@ -306,70 +337,87 @@ public class Jackson2MapperService exten public <T> String ser(Object src, Class<T> type, Boolean cleanCache) throws Exception { getLogger().info("serializing object:" + src + " for type "+ type); - if (src != null && filters.containsKey(src.getClass().getName())) { + 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) this.filters.get(src.getClass() + 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) { - cleanSerializerCache(); + cacheService.cleanSerializerCache(mapper); } return res; } - private <T> String filter(Object src, Class<T> filterClass, + /** + * + * @param src The source Object to be filtered. + * @param filterClass Explicit class as a class filter, which is only used as a filter in {@link #serializeAllExceptFilter(Object, Class, String...)}. In all other cases this is set to src objects´s source class to become the key in the filter object cache. + * This is because, no use case was found to include just one class in a filter, e.g. in @link {@link #serializeOnlyFilter(Object, Class, Boolean, String...)}, i.e. just serializing only a provided filter class. + * @param pf Expecting a property filter from e.g @link {@link SimpleBeanPropertyFilter}. + * @param clean if <code>true</code> does not reuse the filter object (no cashing). + * @param excludeType Is set to <code>true</code> in {@link #serializeAllExceptFilter(Object, Class, String...)}, otherweise <code>false</code>. + * @return The Serialized Object as String + * @throws Exception + */ + private <T> String filter(Object src, Class<T>[] filterClasses, PropertyFilter pf, Boolean clean, Boolean excludeType) throws Exception { FilterProvider filter = null; if (src != null) { - filter = checkFilter(pf, src.getClass(), filterClass, excludeType); + filter = checkFilter(pf, src.getClass(), filterClasses, excludeType); } getLogger().info("filtering with filter "+ filter); String serialized = ser(src, filter, clean); if (!cacheFilters || clean) { - removeFilter(filterClass, excludeType); - if (src != null) removeFilter(src.getClass(), excludeType); + if (src != null) { + cacheService.removeFilter(src.getClass(), excludeType); + } else if (filterClasses.length >0) { + cacheService.removeFilter(filterClasses[0], excludeType); + } } return serialized; } @SuppressWarnings("unchecked") private <T> FilterProvider checkFilter(PropertyFilter pf, - Class rootFilterClass, Class<T> filterClass, Boolean excludeType) { + Class rootFilterClass, Class<T>[] filterClasses, Boolean excludeType) { SimpleFilterProvider filter = null; - if ( (filterClass == null || !rootFilterClass.equals(filterClass))) { - // filter attributes in root class - filter = retrieveFilter(pf, rootFilterClass, excludeType); - } - if (filterClass != null) { - filter = retrieveFilter(pf, filterClass, excludeType); + if (filterClasses == null ) { + filter = retrieveFilter(pf, new Class[]{ rootFilterClass }, excludeType); + } else { + if (filterClasses.length > 0 && !rootFilterClass.equals(filterClasses[0])) { + filter = retrieveFilter(pf, rootFilterClass, filterClasses, excludeType ); + } else { + filter = retrieveFilter(pf, filterClasses, excludeType); + } } return filter; } - - private <T> SimpleFilterProvider retrieveFilter(PropertyFilter pf, Class<T> filterClass, Boolean excludeType ) { + + private <T> SimpleFilterProvider retrieveFilter(PropertyFilter pf, Class<T> cachefilterClass, Class<T>[] filterClasses, Boolean excludeType ) { SimpleFilterProvider filter = null; if (pf != null) { filter = new SimpleFilterProvider(); filter.setDefaultFilter(pf); } - if (!this.filters.containsKey(filterClass.getName())) { - getLogger().debug("add filter for class " + filterClass.getName()); - //filter.addFilter(filterClass.getName(), pf); - setCustomIntrospectorWithExternalFilterId(filterClass, excludeType); // filter - // class + if (!cacheService.getFilters().containsKey(cachefilterClass.getName())) { + getLogger().debug("add filter for cache filter Class " + cachefilterClass.getName()); + if (filterClasses != null && filterClasses.length > 0 && filterClasses[0] != null) { + getLogger().debug("filter classes l:" + filterClasses.length + " first el:"+ filterClasses[0]); + setCustomIntrospectorWithExternalFilterId(filterClasses, excludeType); // filter class + } if (pf != null) { - this.filters.put(filterClass.getName(), (FilterProvider) filter); + cacheService.getFilters().put(cachefilterClass.getName(), (FilterProvider) filter); } } else { - filter = (SimpleFilterProvider) this.filters.get(filterClass + filter = (SimpleFilterProvider)cacheService.getFilters().get(cachefilterClass .getName()); //setCustomIntrospectorWithExternalFilterId(filterClass); // filter // class @@ -378,77 +426,39 @@ public class Jackson2MapperService exten return filter; } - private <T> void removeFilter(Class<T> filterClass, Boolean excludeType) { - if (filterClass == null) - return; - if (this.filters.containsKey(filterClass.getName())) { - removeCustomIntrospectorWithExternalFilterId(filterClass, excludeType); - SimpleFilterProvider smpfilter = (SimpleFilterProvider) this.filters - .get(filterClass.getName()); - smpfilter.removeFilter(filterClass.getName()); - this.filters.remove(filterClass.getName()); - getLogger().debug( - "removed from SimpleFilterProvider filters " - + filterClass.getName()); - } - } - - private void cleanSerializerCache() { - if (mapper.getSerializerProvider() instanceof DefaultSerializerProvider) { - int cachedSerProvs = ((DefaultSerializerProvider) mapper - .getSerializerProvider()).cachedSerializersCount(); - if (cachedSerProvs > 0) { - getLogger() - .debug("flushing cachedSerializersCount:" - + cachedSerProvs); - ((DefaultSerializerProvider) mapper.getSerializerProvider()) - .flushCachedSerializers(); - } - } + private <T> SimpleFilterProvider retrieveFilter(PropertyFilter pf, Class<T>[] filterClasses, Boolean excludeType ) { + return retrieveFilter(pf, filterClasses[0], filterClasses, excludeType ); } private <T> void setCustomIntrospectorWithExternalFilterId( - Class<T> externalFilterId, boolean exludeType) { + Class<T>[] externalFilterIds, boolean excludeType) { if (primary instanceof SimpleNameIntrospector) { - if (externalFilterId != null) { - if (exludeType) { + if (externalFilterIds != null) { + ((SimpleNameIntrospector) primary).setIsExludeType(excludeType); + if (excludeType) { + // first one is required that we get to the PropertyFilter ((SimpleNameIntrospector) primary) - .setExternalFilterClasses(externalFilterId); + .setExternalFilterClasses(externalFilterIds); getLogger() .debug("added class for filters " - + externalFilterId.getName()); + + externalFilterIds); ((SimpleNameIntrospector) primary) - .setExternalFilterExcludeClasses(externalFilterId); + .setExternalFilterExcludeClasses(externalFilterIds); getLogger() .debug("added exclude class for filters " - + externalFilterId.getName()); + + externalFilterIds); } else { ((SimpleNameIntrospector) primary) - .setExternalFilterClasses(externalFilterId); + .setExternalFilterClasses(externalFilterIds); getLogger() .debug("added class for filters " - + externalFilterId.getName()); - } - - } - } - } - - private <T> void removeCustomIntrospectorWithExternalFilterId( - Class<T> externalFilterId, Boolean excludeType) { - if (primary instanceof SimpleNameIntrospector) { - if (externalFilterId != null) { - ((SimpleNameIntrospector) primary) - .removeExternalFilterClass(externalFilterId); - getLogger().debug( - "removed from introspector filter id " - + externalFilterId.getName()); - if (excludeType) { - ((SimpleNameIntrospector) primary) - .removeExternalFilterExcludeClass(externalFilterId); - getLogger().debug( - "removed from exclude class list " - + externalFilterId.getName()); + + externalFilterIds); + // too cumbersome +// ((SimpleNameIntrospector) primary) +// .setExternalFilterIncludeClasses(externalFilterId); +// getLogger() +// .debug("added include class for filters " +// + externalFilterId.getName()); } } } @@ -694,7 +704,6 @@ public class Jackson2MapperService exten mapper.setDateFormat(new SimpleDateFormat(dateFormat)); - filters = new ConcurrentHashMap<String, FilterProvider>(); getLogger().debug("initialized mapper:" + mapper); mapper.getSerializerProvider().setNullValueSerializer( @@ -708,6 +717,7 @@ public class Jackson2MapperService exten } }); + cacheService = new CacheService(primary); } public ObjectMapper getMapper() { @@ -718,38 +728,6 @@ public class Jackson2MapperService exten this.mapper = mapper; } - public static final class MixinModule extends SimpleModule { - /** - * - */ - private static final long serialVersionUID = 1L; - public final Class<?> clazz; - public final Class<?> mixin; - - public MixinModule(String name, Class clazz, Class mixin) { - super(name, Version.unknownVersion()); - this.clazz = clazz; - this.mixin = mixin; - } - - @Override - public void setupModule(SetupContext context) { - context.setMixInAnnotations(this.clazz, this.mixin); - } - } - - public static final class CustomModule<T> extends SimpleModule { - - private static final long serialVersionUID = 1L; - - public CustomModule(String name, Class<T> targetClazz, - StdSerializer<T> stdSer, StdDeserializer<T> stdDeser) { - super(name, Version.unknownVersion()); - addSerializer(targetClazz, stdSer); - addDeserializer(targetClazz, stdDeser); - } - } - public boolean isCacheFilters() { return cacheFilters; } Added: 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=1677013&view=auto ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java (added) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java Thu Apr 30 15:20:06 2015 @@ -0,0 +1,24 @@ +package org.apache.fulcrum.json.jackson; + +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public final class MixinModule extends SimpleModule { + /** + * + */ + private static final long serialVersionUID = 1L; + public final Class<?> clazz; + public final Class<?> mixin; + + public MixinModule(String name, Class clazz, Class mixin) { + super(name, Version.unknownVersion()); + this.clazz = clazz; + this.mixin = mixin; + } + + @Override + public void setupModule(SetupContext context) { + context.setMixInAnnotations(this.clazz, this.mixin); + } +} \ No newline at end of file Propchange: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java ------------------------------------------------------------------------------ svn:eol-style = native 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=1677013&r1=1677012&r2=1677013&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 Thu Apr 30 15:20:06 2015 @@ -21,6 +21,7 @@ package org.apache.fulcrum.json.jackson; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.AnnotatedClass; @@ -30,7 +31,8 @@ import com.fasterxml.jackson.databind.se /** * The intent of this custom introspector is to provide filtering capabilities * by using String parameters (properties and class types), which could be - * adjusted e.g. from a scriptable context (velocity template). + * adjusted e.g. from a scriptable context (velocity template). + * Class Type Filtering currently not supported except for Exclude Filter: {@link Jackson2MapperService#serializeAllExceptFilter(Object, Class, Boolean, String...)}. * * * @author gk @@ -42,20 +44,35 @@ public class SimpleNameIntrospector exte * */ private static final long serialVersionUID = 1L; - public List<String> externalFilterClasses = new CopyOnWriteArrayList<String>(); - public List<String> externalFilterExcludeClasses = new CopyOnWriteArrayList<String>(); + private List<String> externalFilterClasses = new CopyOnWriteArrayList<String>(); + private List<String> externalFilterExcludeClasses = new CopyOnWriteArrayList<String>(); + private List<String> externalFilterIncludeClasses = new CopyOnWriteArrayList<String>(); + private AtomicBoolean isExludeType = new AtomicBoolean(false); /** - * Filtering on method types, cft. @link + * Filtering on method types. * */ @Override public Boolean isIgnorableType(AnnotatedClass ac) { Boolean isIgnorable = super.isIgnorableType(ac); if (isIgnorable == null || !isIgnorable) { - if (!externalFilterExcludeClasses.isEmpty() - && externalFilterExcludeClasses.contains(ac.getName())) { - isIgnorable = true; + if (getIsExludeType()) { // could be removed, if cleaning after call ? + if (!externalFilterExcludeClasses.isEmpty() + && externalFilterExcludeClasses.contains(ac.getName())) { + isIgnorable = true; + } + } else { + // not yet used + if (!externalFilterIncludeClasses.isEmpty() + && !externalFilterIncludeClasses.contains(ac.getName())) { + try { + Class.forName(ac.getName()); + isIgnorable = true; + } catch (ClassNotFoundException e) { + // no clazz ignore, could NOT ignore as no filterable clazz + } + } } } return isIgnorable; @@ -67,8 +84,9 @@ public class SimpleNameIntrospector exte */ @Override public Object findFilterId(Annotated ac) { - // Let's default to current behavior if annotation is found: Object id = super.findFilterId(ac); + // Let's default to current behavior if annotation is found: + //Object id = super.findFilterId(ac); // but use simple class name if not if (id == null) { String name = ac.getName(); @@ -120,6 +138,29 @@ public class SimpleNameIntrospector exte if (externalFilterExcludeClasses.contains(externalFilterClass.getName())) { externalFilterExcludeClasses.remove(externalFilterClass.getName()); } -} + } + + public void setExternalFilterIncludeClasses(Class... classes) { + + for (int i = 0; i < classes.length; i++) { + if (!externalFilterIncludeClasses.contains(classes[i].getName())) { + + externalFilterIncludeClasses.add(classes[i].getName()); + } + } + } + + public void removeExternalFilterIncludeClasses(Class externalFilterClass) { + if (externalFilterIncludeClasses.contains(externalFilterClass.getName())) { + externalFilterIncludeClasses.remove(externalFilterClass.getName()); + } + } + + public boolean getIsExludeType() { + return isExludeType.get(); + } + public void setIsExludeType(boolean isExludeType) { + this.isExludeType.getAndSet(isExludeType); + } } \ No newline at end of file Modified: turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/filters/CustomModuleWrapper.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/filters/CustomModuleWrapper.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/filters/CustomModuleWrapper.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/filters/CustomModuleWrapper.java Thu Apr 30 15:20:06 2015 @@ -19,15 +19,14 @@ package org.apache.fulcrum.json.jackson. * under the License. */ -import org.apache.fulcrum.json.jackson.Jackson2MapperService; -import org.apache.fulcrum.json.jackson.Jackson2MapperService.CustomModule; +import org.apache.fulcrum.json.jackson.CustomModule; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; /** - * Used by {@link Jackson2MapperService#addAdapter(String, Class, Object)} to provide a wrapper module as a helper class - * for the inner class {@link CustomModule}. + * Provides a wrapper module as a helper class for the inner class {@link CustomModule}. + * * @author gkallidis * * @param <T> 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=1677013&r1=1677012&r2=1677013&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 Thu Apr 30 15:20:06 2015 @@ -65,9 +65,10 @@ public class DefaultServiceTest extends assertEquals("Serialization failed ", preDefinedOutput, serJson); } + //@Test + // the default test class: one String field, one Map public void testSerializeExcludeNothing() throws Exception { - String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - (Class) null, (String[]) null); + String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), (String[]) null); assertEquals( "Serialization failed ", "{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}", @@ -83,21 +84,24 @@ public class DefaultServiceTest extends } public void testSerializeExcludeClassAndField() throws Exception { - String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - String.class, "container"); + String serJson = ((Jackson2MapperService)sc).serializeAllExceptFilter(new TestClass("mytest"), + new Class[] { TestClass.class, String.class} , "container"); assertEquals("Serialization failed ", "{}", serJson); } + // adding expected result to be consistent public void testSerializeExcludeClassAndFields() throws Exception { - String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - Map.class, "configurationName", "name"); + String serJson = ((Jackson2MapperService)sc).serializeAllExceptFilter(new TestClass("mytest"), + new Class[] { Map.class, String.class} , "configurationName", "name"); assertEquals("Serialization failed ", "{}", serJson); + serJson = ((Jackson2MapperService)sc).serializeAllExceptFilter(new TestClass("mytest"), + (Class)null , "configurationName", "name"); + assertEquals("Serialization failed ", "{}", serJson); } public void testSerializeExcludeField() throws Exception { - String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), - (Class) null, "configurationName"); + String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"), "configurationName"); assertEquals("Serialization failed ", "{\"container\":{\"cf\":\"Config.xml\"},\"name\":\"mytest\"}", serJson); @@ -228,15 +232,36 @@ public class DefaultServiceTest extends public void testSerializeWithOnlyFilter() throws Exception { - String serJson = sc.serializeOnlyFilter(new TestClass("mytest"), - (Class) null, "configurationName"); + String serJson = sc.serializeOnlyFilter(new TestClass("mytest"),"configurationName"); + assertEquals("Serialization failed ", + "{\"configurationName\":\"Config.xml\"}", + serJson); + + Rectangle filteredRectangle = new Rectangle(5, 10); + filteredRectangle.setName("jim"); + String rectangle = sc.serializeOnlyFilter(filteredRectangle, "w"); + assertEquals( + "Ser filtered Rectangle failed ", + "{\"w\":5}", + rectangle); + + } + + public void testSerializeAllExceptaANDWithOnlyFilter2() throws Exception { + + String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),"configurationName"); + assertEquals("Serialization failed ", + "{\"container\":{\"cf\":\"Config.xml\"},\"name\":\"mytest\"}", + serJson); + + serJson = sc.serializeOnlyFilter(new TestClass("mytest"), "configurationName"); assertEquals("Serialization failed ", "{\"configurationName\":\"Config.xml\"}", serJson); Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); - String rectangle = sc.serializeOnlyFilter(filteredRectangle, (Class) null, "w"); + String rectangle = sc.serializeOnlyFilter(filteredRectangle, "w"); assertEquals( "Ser filtered Rectangle failed ", "{\"w\":5}", @@ -253,10 +278,11 @@ public class DefaultServiceTest extends } Class clazz = Class.forName("org.apache.fulcrum.json.jackson.TypedRectangle"); // no type cft. https://github.com/FasterXML/jackson-databind/issues/303 !! - assertTrue("[{\"w\":0},{\"w\":1}]".equals(sc.serializeOnlyFilter(rectList, clazz, true,"w"))); + assertEquals("[{\"w\":0},{\"w\":1}]",sc.serializeOnlyFilter(rectList, clazz, true,"w")); // need mixin in object class! sc.addAdapter("Collection Adapter", Object.class, TypedRectangle.Mixins.class); - assertTrue("[\"java.util.ArrayList\",[{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":1}]]".equals(sc.serializeOnlyFilter(rectList, clazz, true, "w"))); + assertEquals("[\"java.util.ArrayList\",[{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":0},{\"type\":\"org.apache.fulcrum.json.jackson.TypedRectangle\",\"w\":1}]]", + sc.serializeOnlyFilter(rectList, clazz, true, "w")); } public void testSerializeCollectionWithTypedReference() throws Exception { 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=1677013&r1=1677012&r2=1677013&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 Thu Apr 30 15:20:06 2015 @@ -120,7 +120,7 @@ public class JacksonMapperEnabledDefault public void testSerializeWithCustomFilter() throws Exception { Bean filteredBean = new Bean(); filteredBean.setName("joe"); - String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "name"); + String bean = sc.serializeOnlyFilter(filteredBean, "name"); assertEquals( "Ser filtered Bean failed ", "{\"name\":\"joe\"}", @@ -129,7 +129,7 @@ public class JacksonMapperEnabledDefault Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); String rectangle = sc.serializeOnlyFilter(filteredRectangle, - Rectangle.class, "w", "name"); + "w", "name"); assertEquals("Ser filtered Rectangle failed ", "{\"w\":5,\"name\":\"jim\"}", rectangle); } Modified: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java (original) +++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java Thu Apr 30 15:20:06 2015 @@ -34,6 +34,9 @@ import org.apache.fulcrum.json.JsonServi import org.apache.fulcrum.json.Rectangle; import org.apache.fulcrum.json.TestClass; import org.apache.fulcrum.testcontainer.BaseUnitTest; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -60,23 +63,26 @@ public class JacksonMapperTest extends B super(testName); } + @Before public void setUp() throws Exception { super.setUp(); sc = (JsonService) this.lookup(JsonService.ROLE); logger = new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG); } + @Test public void testSerialize() throws Exception { String serJson = sc.ser(new JacksonMapperTest("mytest")); assertEquals("Set failed ", "{\"name\":\"mytest\"}", serJson); } + @Ignore public void testDeSerialize() throws Exception { String serJson = sc.ser(new TestClass("mytest")); Object deson = sc.deSer(serJson, TestClass.class); assertEquals("DeSer failed ", TestClass.class, deson.getClass()); } - + @Test public void testSerializeDateWithDefaultDateFormat() throws Exception { Map<String, Date> map = new HashMap<String, Date>(); map.put("date", Calendar.getInstance().getTime()); @@ -84,7 +90,7 @@ public class JacksonMapperTest extends B assertTrue("Serialize with Adapater failed ", serJson.matches("\\{\"date\":\"\\d\\d/\\d\\d/\\d{4}\"\\}")); } - + @Test public void testDeSerializeDate() throws Exception { Map<String, Date> map = new HashMap<String, Date>(); map.put("date", Calendar.getInstance().getTime()); @@ -108,7 +114,7 @@ public class JacksonMapperTest extends B "{\"w\":5,\"name\":\"jim\"}", rectangle); } - + @Test public void testSerializationCollectionWithFilter() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); @@ -126,6 +132,7 @@ public class JacksonMapperTest extends B result.replace('"', '\'')); } + @Test public void testDeserializationCollectionWithFilter() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); @@ -145,6 +152,7 @@ public class JacksonMapperTest extends B } } + @Test public void testDeserializationUnTypedCollectionWithFilter() throws Exception { @@ -171,6 +179,7 @@ public class JacksonMapperTest extends B } + @Test public void testSerializeWithMixin() throws Exception { Rectangle filteredRectangle = new Rectangle(5, 10); filteredRectangle.setName("jim"); @@ -193,7 +202,7 @@ public class JacksonMapperTest extends B String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "name"); assertEquals("Ser filtered Bean failed ", "{\"name\":\"joe\"}", bean); } - + @Test public void testSerializationCollectionWithMixin() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); @@ -210,7 +219,7 @@ public class JacksonMapperTest extends B "[{'name':'joe0'},{'name':'joe1'},{'name':'joe2'},{'name':'joe3'},{'name':'joe4'},{'name':'joe5'},{'name':'joe6'},{'name':'joe7'},{'name':'joe8'},{'name':'joe9'}]", result.replace('"', '\'')); } - + @Test public void testDeSerUnQuotedObject() throws Exception { String jsonString = "{name:\"joe\"}"; Bean result = sc.deSer(jsonString, Bean.class); @@ -231,7 +240,7 @@ public class JacksonMapperTest extends B .get(i).getSize()); } } - + @Test public void testDeSerializationCollectionWithMixin() throws Exception { List<Bean> beanList = new ArrayList<Bean>(); @@ -256,7 +265,7 @@ public class JacksonMapperTest extends B "joe" + i)); } } - + @Test public void testCollectionWithMixins() throws Exception { List<Object> components = new ArrayList<Object>(); components.add(new Rectangle(25, 3)); Modified: turbine/fulcrum/trunk/json/pom.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/pom.xml?rev=1677013&r1=1677012&r2=1677013&view=diff ============================================================================== --- turbine/fulcrum/trunk/json/pom.xml (original) +++ turbine/fulcrum/trunk/json/pom.xml Thu Apr 30 15:20:06 2015 @@ -92,7 +92,21 @@ </plugin> </plugins> </build> - + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.fulcrum</groupId> + <artifactId>fulcrum-testcontainer</artifactId> + <version>1.0.7-SNAPSHOT</version> + <scope>test</scope> + </dependency> + </dependencies> + <profiles> <profile> <id>apache-release</id>