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.