You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@turbine.apache.org by gk...@apache.org on 2018/05/16 13:35:03 UTC
svn commit: r1831711 - in /turbine/fulcrum/trunk:
json/gson/src/test/org/apache/fulcrum/json/gson/
json/jackson2/src/java/org/apache/fulcrum/json/jackson/
json/jackson2/src/test/org/apache/fulcrum/json/jackson/
json/jackson2/src/test/org/apache/fulcrum...
Author: gk
Date: Wed May 16 13:35:02 2018
New Revision: 1831711
URL: http://svn.apache.org/viewvc?rev=1831711&view=rev
Log:
JSON
- moving methods ser(..) closer together
- provide non interfaced helper method setMixins in Jackson2MapperService, which cleans up any previously mixins (just for one mixin, might be better a list)
- add tests for mixins
SECURITY API
- generic type bound is interface itself
Modified:
turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.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/JacksonMapperTest.java
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/concurrent/JSONConcurrentTest.java
turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java
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=1831711&r1=1831710&r2=1831711&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 Wed May 16 13:35:02 2018
@@ -227,7 +227,6 @@ public class DefaultServiceTest extends
}
@Test
public void testSerializeWithOnlyFilter() throws Exception {
-
// as gson adds we could not use multiple disjunct exclusion strategies
String serJson = sc.serializeOnlyFilter(new TestClass("mytest"),
(Class) null, "configurationName");
@@ -237,7 +236,6 @@ public class DefaultServiceTest extends
}
@Test
public void testSerializeWithOnlyFilter2() throws Exception {
-
// as gson adds we could not use multiple disjunct exclusion strategies
Rectangle filteredRectangle = new Rectangle(5, 10);
filteredRectangle.setName("jim");
@@ -247,6 +245,15 @@ public class DefaultServiceTest extends
"{\"w\":5}",
rectangle);
}
+ @Test
+ public void testSerializeNoAttributesWithOnlyFilter() throws Exception {
+ // 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);
+ System.out.println( "rectangle"+ rectangle );
+ }
+
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=1831711&r1=1831710&r2=1831711&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 May 16 13:35:02 2018
@@ -24,6 +24,7 @@ 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.List;
import java.util.Map;
@@ -156,6 +157,53 @@ public class Jackson2MapperService exten
}
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);//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);
+ }
+ // jackson bug? filter is not cleaned in collection type
+ if (type != null) {
+ // todo may do something
+ }
+ return res;
+ }
@Override
public <T> T deSer(String json, Class<T> type) throws Exception {
@@ -267,9 +315,22 @@ public class Jackson2MapperService exten
public String withMixinModule(Object src, String name, Class target,
Class mixin) throws JsonProcessingException {
Module mx = new MixinModule(name, target, mixin);
- getLogger().debug("registering module " + mx + " for: " + mixin);
+ getLogger().debug("registering module " + mx + ", mixin: " + mixin);
return mapper.registerModule(mx).writer().writeValueAsString(src);
}
+ @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 );
+ getLogger().debug("clean set mixins for target " + target + ", mixin: " + mixin);
+ return mapper.setMixIns( sourceMixins );
+ }
@Override
public <T> String serializeAllExceptFilter(Object src, String... filterAttr)
@@ -355,54 +416,11 @@ 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");
+ pf = SimpleBeanPropertyFilter.filterOutAllExcept("dummy"); // to be consistent with gson anything is filtered out.
}
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());
- // 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);//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;
- }
+ }
/**
*
Modified: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Bean.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Bean.java?rev=1831711&r1=1831710&r2=1831711&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Bean.java (original)
+++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/Bean.java Wed May 16 13:35:02 2018
@@ -40,4 +40,10 @@ public class Bean {
public void setAge(int age) {
this.age = age;
}
+
+ public void setProfession( String profession )
+ {
+ this.profession = profession;
+
+ }
}
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=1831711&r1=1831710&r2=1831711&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 Wed May 16 13:35:02 2018
@@ -18,9 +18,10 @@ package org.apache.fulcrum.json.jackson;
* specific language governing permissions and limitations
* under the License.
*/
-
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Calendar;
@@ -43,6 +44,8 @@ import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
/**
* Jackson2 JSON Test
@@ -125,6 +128,122 @@ public class JacksonMapperTest extends B
"[{'name':'joe0','age':0},{'name':'joe1','age':1},{'name':'joe2','age':2},{'name':'joe3','age':3},{'name':'joe4','age':4},{'name':'joe5','age':5},{'name':'joe6','age':6},{'name':'joe7','age':7},{'name':'joe8','age':8},{'name':'joe9','age':9}]",
filteredResult.replace('"', '\''));
}
+
+ @Test
+ public void testTwoSerializationCollectionWithTwoDifferentFilter() 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);
+ }
+ String filteredResult = sc.serializeOnlyFilter(beanList, Bean.class, "name",
+ "age");
+ System.out.println( filteredResult );
+ assertEquals("Serialization of beans failed ",
+ "[{'name':'joe0','age':0},{'name':'joe1','age':1},{'name':'joe2','age':2},{'name':'joe3','age':3},{'name':'joe4','age':4},{'name':'joe5','age':5},{'name':'joe6','age':6},{'name':'joe7','age':7},{'name':'joe8','age':8},{'name':'joe9','age':9}]",
+ filteredResult.replace('"', '\''));
+ filteredResult = sc.serializeOnlyFilter(beanList, Bean.class, "name");
+ System.out.println( filteredResult );
+ assertEquals("Serialization of beans failed ",
+ "[{'name':'joe0'},{'name':'joe1'},{'name':'joe2'},{'name':'joe3'},{'name':'joe4'},{'name':'joe5'},{'name':'joe6'},{'name':'joe7'},{'name':'joe8'},{'name':'joe9'}]",
+ filteredResult.replace('"', '\''));
+ }
+
+ /** This may be a bug in jackson, the filter is not exchanged if the same class is matched again
+ *
+ * first it may be com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap.Empty.serializerFor(Class<?>)
+ * and then
+ * com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap.Single.serializerFor(Class<?>)
+ * which returns a serializer
+ * **/
+ @Test
+ public void testTwoSerializationCollectionNoAndWithFilter() throws Exception {
+ List<Bean> beanList = new ArrayList<Bean>();
+ for (int i = 0; i < 4; i++) {
+ Bean bean = new Bean();
+ bean.setName("joe" + i);
+ bean.setAge(i);
+ beanList.add(bean);
+ }
+ String filteredResult = sc.ser(beanList, Bean.class);//unfiltered
+ System.out.println( filteredResult );
+ assertEquals("First unfiltered serialization of beans failed ",
+ "[{'name':'joe0','age':0,'profession':''},{'name':'joe1','age':1,'profession':''},{'name':'joe2','age':2,'profession':''},{'name':'joe3','age':3,'profession':''}]",
+ filteredResult.replace('"', '\''));
+
+ filteredResult = sc.serializeOnlyFilter(beanList, Bean.class, "name");
+ System.out.println( filteredResult );
+ // this may be a bug in jackson, serializer is reused, if not cleaned up
+ assertNotEquals("[{'name':'joe0'},{'name':'joe1'},{'name':'joe2'},{'name':'joe3'}]",
+ filteredResult.replace('"', '\''));
+
+ // cleaning requires, that you have to provide some other type, which is different from the (typed) source object,
+ // providing just new ArrayList<Bean>() only will not help, but an anonymous class may be sufficient.
+ // A simple object will do it, this resets to an unknown serializer, which eventaully does clean up the serializer cache.
+ sc.serializeOnlyFilter(new Object(), new String[]{});
+ filteredResult = sc.serializeOnlyFilter(beanList, Bean.class, "name");
+ System.out.println( filteredResult );
+ assertEquals("Second filtered serialization of beans failed ", "[{'name':'joe0'},{'name':'joe1'},{'name':'joe2'},{'name':'joe3'}]",
+ filteredResult.replace('"', '\''));
+ }
+
+ @Test
+ public void testSetMixin() {
+ Bean src = new Bean();
+ src.setName("joe");
+ src.setAge( 99 );
+ src.setProfession("runner");
+ //
+ // profession was already set to ignore, does not change
+ String result = null;
+ try
+ {
+ result = ((Jackson2MapperService)sc).withMixinModule(src, "mixinbean", Bean.class, BeanMixin.class );
+ assertEquals(
+ "Ser filtered Bean failed ",
+ "{\"name\":\"joe\"}",
+ result);
+ // clean up buffer is not sufficient..
+ sc.serializeOnlyFilter(new Object(), new String[]{});
+
+ // .. this assert result is not to be expected!!!
+ result = ((Jackson2MapperService)sc).withMixinModule(src, "mixin2bean", Bean.class, BeanMixin2.class );
+ assertEquals(
+ "Ser filtered Bean failed ",
+ "{\"name\":\"joe\"}",
+ result);
+ // clean up of mixin and buffer required
+
+ // clean up mixins
+ ((Jackson2MapperService)sc).setMixins(Bean.class, BeanMixin2.class );
+
+ // clean up buffer
+ sc.serializeOnlyFilter(new Object(), new String[]{});
+
+// Map<Class<?>, Class<?>> sourceMixins = new HashMap<Class<?>, Class<?>>(1);
+// sourceMixins.put( Bean.class,BeanMixin2.class );
+// ((Jackson2MapperService)sc).getMapper().setMixIns( sourceMixins );
+ result =sc.ser( src, Bean.class );
+ assertEquals(
+ "Ser filtered Bean failed ",
+ "{\"age\":99,\"profession\":\"runner\"}",
+ result);
+ }
+ catch ( JsonProcessingException e )
+ {
+ logger.error( "err",e );
+ fail();
+ }
+ catch ( Throwable e )
+ {
+ logger.error( "err",e );
+ fail();
+ }
+
+ }
@Test
public void testDeserializationCollectionWithFilter() throws Exception {
@@ -348,5 +467,11 @@ public class JacksonMapperTest extends B
@JsonProperty
abstract String getName();//
}
+ public static abstract class BeanMixin2 extends Bean {
+ BeanMixin2() {
+ }
+ @JsonIgnore
+ public abstract String getName();//
+ }
}
Modified: turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/concurrent/JSONConcurrentTest.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/concurrent/JSONConcurrentTest.java?rev=1831711&r1=1831710&r2=1831711&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/concurrent/JSONConcurrentTest.java (original)
+++ turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/concurrent/JSONConcurrentTest.java Wed May 16 13:35:02 2018
@@ -92,7 +92,7 @@ public class JSONConcurrentTest extends
@Before
- public void init() throws ComponentException {
+ public void init() throws ComponentException {
fSynchronizer = new CountDownLatch(N);
}
@@ -173,7 +173,7 @@ public class JSONConcurrentTest extends
return mapper.writer(filter).writeValueAsString(list);
}
- private ObjectMapper customMapper(boolean withType) {
+ private ObjectMapper customMapper(boolean withType) {
ObjectMapper objectMapper = new ObjectMapper(
new MappingJsonFactory(((Jackson2MapperService) jsonService).getMapper()));
if (withType) objectMapper.enableDefaultTypingAsProperty(
Modified: turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java?rev=1831711&r1=1831710&r2=1831711&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java (original)
+++ turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java Wed May 16 13:35:02 2018
@@ -44,7 +44,7 @@ import org.apache.fulcrum.security.util.
* @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
* @version $Id: AccessControlList.java 615328 2008-01-25 20:25:05Z tv $
*/
-public interface TurbineAccessControlList extends Serializable, AccessControlList
+public interface TurbineAccessControlList<T extends TurbineAccessControlList<T>> extends Serializable, AccessControlList
{
/**
* Retrieves a set of Roles an user is assigned in a Group.