Author: gk
Date: Thu Jul 12 09:34:57 2018
New Revision: 1835712

URL: http://svn.apache.org/viewvc?rev=1835712&view=rev
Log:
- fix: use writer (per-call), if possible, not global mapper
- fix JACKSON-650 (ignore empty filter error) - set it global, may occur if any 
filter was set previously (even per-call) for a class type.
- add tests for array / collection type

Modified:
    
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java
    
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
    
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java

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=1835712&r1=1835711&r2=1835712&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 Jul 12 09:34:57 2018
@@ -150,8 +150,8 @@ public class Jackson2MapperService exten
             } 
         }
         getLogger().debug("ser class::" + src.getClass() + " with filter " + 
filter);
-        mapper.setFilterProvider(filter);
-        String res =  mapper.writer(filter).writeValueAsString(src);
+        //mapper.setFilterProvider(filter);// this is global
+        String res =  mapper.writer().with(filter).writeValueAsString(src);
         if (cleanCache) {
             cacheService.cleanSerializerCache(mapper);
         }
@@ -169,7 +169,7 @@ public class Jackson2MapperService exten
             // src.getClass().getName());
             SimpleFilterProvider filter = (SimpleFilterProvider) 
cacheService.getFilters().get(src.getClass()
                     .getName());
-            return ser(src, filter, 
cleanCache);//mapper.writerWithView(src.getClass()).writeValueAsString(src);
+            return ser(src, filter, cleanCache);
         }
         String res = 
mapper.writerWithView(Object.class).writeValueAsString(src);
         if (cleanCache != null && cleanCache) {
@@ -181,7 +181,7 @@ public class Jackson2MapperService exten
     @Override
     public <T> String ser(Object src, Class<T> type, Boolean cleanCache)
             throws Exception {
-        getLogger().info("serializing object:" + src + " for type "+ type);
+        getLogger().debug("serializing object:" + src + " for type "+ type);
         if (src != null && 
cacheService.getFilters().containsKey(src.getClass().getName())) {
             getLogger()
                     .warn("Found registered filter - could not use custom view 
and custom filter for class:"
@@ -193,8 +193,8 @@ public class Jackson2MapperService exten
                     .getName());
             return ser(src, filter);
         }
-
-        String res = (type != null)? 
mapper.writerWithView(type).writeValueAsString(src): 
mapper.writeValueAsString(src);
+        mapper.setFilterProvider(new 
SimpleFilterProvider().setFailOnUnknownId(false));
+        String res = (type != null)? 
mapper.writerWithView(type).writeValueAsString(src): 
mapper.writer().writeValueAsString(src);
         if (cleanCache) {
             cacheService.cleanSerializerCache(mapper);
         }
@@ -204,6 +204,22 @@ public class Jackson2MapperService exten
         }
         return res;
     } 
+    
+    
+    public <T> String ser( Object... objects) throws Exception {
+        return ser( objects, false );
+    }
+    /**
+     * convenience method to provide a list of coolections without providign a 
wrapper 
+     * @param cleanCache
+     * @param objects
+     * @return serialized JSON
+     * @throws Exception
+     */
+    public <T> String ser(Boolean cleanCache, Object... objects) throws 
Exception {
+        return ser( objects, cleanCache );
+    }  
+   
 
     @Override
     public <T> T deSer(String json, Class<T> type) throws Exception {
@@ -812,8 +828,9 @@ public class Jackson2MapperService exten
                         "JsonMapperService: Error instantiating " + djpw
                                 + " using useJsonPath=" + useJsonPath);
             }
-
         }
+        // JACKSON-650, Ignore missing filters, may be, because previoulsy a 
filter was set (e.g. ignore filter)
+        mapper.setFilterProvider(new 
SimpleFilterProvider().setFailOnUnknownId(false));
     }
 
     public ObjectMapper getMapper() {

Modified: 
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java?rev=1835712&r1=1835711&r2=1835712&view=diff
==============================================================================
--- 
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
 (original)
+++ 
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/MixinModule.java
 Thu Jul 12 09:34:57 2018
@@ -39,4 +39,11 @@ public final class MixinModule extends S
     public void setupModule(SetupContext context) {
         context.setMixInAnnotations(this.clazz, this.mixin);
     }
+    
+//    @Override
+//    public Object getTypeId()
+//    {
+//        return null; // unique
+//        //return super.getTypeId();
+//    }
 }
\ No newline at end of file

Modified: 
turbine/fulcrum/trunk/json/jackson2/src/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=1835712&r1=1835711&r2=1835712&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 Jul 12 09:34:57 2018
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTru
 import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
@@ -45,6 +46,10 @@ import org.junit.Test;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
 
 
 /**
@@ -109,8 +114,8 @@ public class JacksonMapperTest extends B
                 Rectangle.class, "w", "name");
         assertEquals("Ser filtered Rectangle failed ",
                 "{\"w\":5,\"name\":\"jim\"}", filteredRectangle);
-
     }
+    
     @Test
     public void testSerializationCollectionWithFilter() throws Exception {
 
@@ -436,6 +441,91 @@ public class JacksonMapperTest extends B
             assertTrue(((List<Rectangle>)resultList3).get(i).getName()!=null);
         }
     }
+    
+    @Test
+    public void testSerializeListWithWrapper()  {
+        try
+        {
+            Bean bean = new Bean();
+            bean.setName("joe");
+            bean.setAge(12);
+            String filteredBean  = sc.serializeOnlyFilter(bean, Bean.class, 
"name");
+            assertEquals("Ser filtered Bean failed ", "{\"name\":\"joe\"}", 
filteredBean);
+
+            Rectangle rectangle = new Rectangle(5, 10);
+            rectangle.setName("quadro");
+            String filteredRectangle  = sc.serializeOnlyFilter(rectangle,
+                    Rectangle.class, "w", "name");
+            assertEquals("Ser filtered Rectangle failed ",
+                    "{\"w\":5,\"name\":\"quadro\"}", filteredRectangle);
+            
+            Bean bean2 = new Bean();
+            bean2.setName("jim");
+            bean2.setAge(92);
+            List<Bean> beans = Arrays.asList( bean, bean2 );
+            List<Rectangle> rectangles = Arrays.asList( rectangle );
+            List wrapper = new ArrayList();
+            wrapper.addAll( beans ); wrapper.addAll( rectangles );
+            
+            //String wrappedLists =  sc.serializeOnlyFilter( wrapper, "name" );
+            String jsonResult =  sc.ser( wrapper );
+            // 
res:wrappedLists:[{"name":"joe","age":12,"profession":""},{"w":5,"h":10,"name":"jim","size":50}]
+            logger.debug( "jsonResult provided wrapper:" +jsonResult );
+            List listResult = (List) 
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult, 
ArrayList.class,Object.class );
+            logger.debug( " provided wrapper lists:" +listResult );
+            
+            String jsonResult2 =  ((Jackson2MapperService)sc).ser( false, 
bean, bean2, rectangle );
+            logger.debug( "jsonResult2 bean, rectangle / no collection:" 
+jsonResult2 );
+            List listResult2 = (List) 
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult2, 
ArrayList.class,Object.class );
+            logger.debug( "bean, rectangle / no collection lists:" 
+listResult2 );
+            assertTrue( jsonResult.equals( jsonResult2 ) );
+            listResult2.removeAll( listResult );
+            assertTrue( listResult2.isEmpty() );
+            
+            String jsonResult3 =  ((Jackson2MapperService)sc).ser( false, 
(Collection)beans, (Collection)rectangles );
+            // this wrape anything
+            logger.debug( "jsonResult3 raw lists:" +jsonResult3 ); 
+            List<List> listResult3 = (List) 
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult3, 
ArrayList.class,List.class );
+            logger.debug( "raw lists:" +listResult3 );
+            listResult3.get( 0 ).removeAll( listResult );
+            listResult3.get( 1 ).removeAll( listResult );
+            assertTrue( listResult3.get( 0 ).isEmpty() );
+            assertTrue( listResult3.get( 1 ).isEmpty() );
+            
+            // this does not get any information, just to demonstrate
+            TypeReference<List<?>> typeRef = new TypeReference<List<?>>(){};
+            String jsonResult4 = 
((Jackson2MapperService)sc).serCollectionWithTypeReference(wrapper,typeRef, 
false);
+            logger.debug( "jsonResult4 typereference:" +jsonResult4 );
+            List<Object> listResult4 = (List) 
((Jackson2MapperService)sc).deSerCollectionWithType( jsonResult4, 
ArrayList.class,Object.class );
+            logger.debug( "typereference lists:" +listResult4 );
+            listResult4.removeAll( listResult );
+            assertTrue( listResult4.isEmpty() );
+
+            
((Jackson2MapperService)sc).getMapper().enable(SerializationFeature.WRAP_ROOT_VALUE);
+            String jsonResult5 =  sc.ser( wrapper );
+            // 
res:wrappedLists:[{"name":"joe","age":12,"profession":""},{"w":5,"h":10,"name":"jim","size":50}]
+            logger.debug( "jsonResult5 wrap root:" +jsonResult5 );
+            
+            
((Jackson2MapperService)sc).getMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
 true);
+            List<Object> listResult5 = (List) ((Jackson2MapperService)sc)
+                            .deSerCollectionWithType( jsonResult4, 
ArrayList.class,Object.class );
+            logger.debug( "wrap root lists:" +listResult5 );
+            listResult5.removeAll( listResult );
+            assertTrue( listResult5.isEmpty() );
+            List<Object> listResult51 = (List) ((Jackson2MapperService)sc)
+                            .deSerCollectionWithTypeReference( jsonResult5, 
new TypeReference<List<?>>() {} );
+            logger.debug( "wrap root lists typereferenced:" +listResult51 );
+            ((Map<String, List>)listResult51.get( 0 
)).values().iterator().next().removeAll( listResult );
+            assertTrue( ((Map<String, List>)listResult51.get( 0 
)).values().iterator().next().isEmpty() );
+            
+            
+        }
+        catch ( Exception e )
+        {
+            e.printStackTrace();
+           fail();
+        } 
+    }
 
 
     public static abstract class Mixin2 {


Reply via email to