Author: gk
Date: Thu Aug  6 14:10:31 2015
New Revision: 1694505

URL: http://svn.apache.org/r1694505
Log:
- Added global character escape (first in jackson 2), optional class
- Update to JUnit 4 

Modified:
    
turbine/fulcrum/trunk/json/gson/src/test/org/apache/fulcrum/json/gson/DefaultServiceTest.java
    
turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java
    
turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
    
turbine/fulcrum/trunk/json/jackson2/src/java/org/apache/fulcrum/json/jackson/Jackson2MapperService.java
    turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml
    
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/DefaultServiceTest.java
    
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java
    
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTyping_OBJECT_AND_NON_CONCRETE_Test.java
    turbine/fulcrum/trunk/json/xdocs/index.xml

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=1694505&r1=1694504&r2=1694505&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 Aug  6 14:10:31 2015
@@ -19,6 +19,9 @@ package org.apache.fulcrum.json.gson;
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.lang.reflect.Type;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -32,7 +35,9 @@ import org.apache.avalon.framework.activ
 import org.apache.fulcrum.json.JsonService;
 import org.apache.fulcrum.json.Rectangle;
 import org.apache.fulcrum.json.TestClass;
-import org.apache.fulcrum.testcontainer.BaseUnitTest;
+import org.apache.fulcrum.testcontainer.BaseUnit4Test;
+import org.junit.Before;
+import org.junit.Test;
 
 import com.google.gson.reflect.TypeToken;
 
@@ -42,31 +47,21 @@ import com.google.gson.reflect.TypeToken
  * @author gk
  * @version $Id$
  */
-public class DefaultServiceTest extends BaseUnitTest {
+public class DefaultServiceTest extends BaseUnit4Test {
     private JsonService sc = null;
     private final String preDefinedOutput = 
"{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}";
-
-    /**
-     * Constructor for test.
-     * 
-     * @param testName
-     *            name of the test being executed
-     */
-    public DefaultServiceTest(String testName) {
-        super(testName);
-    }
-
-    public void setUp() throws Exception {
-        super.setUp();
-        sc = (JsonService) this.lookup(JsonService.ROLE);
-
+    @Before
+    public void setUp() throws Exception
+    {
+        sc = (JsonService) this.lookup( JsonService.ROLE );
     }
 
+    @Test
     public void testSerialize() throws Exception {
         String serJson = sc.ser(new TestClass("mytest"));
         assertEquals("Serialization failed ", preDefinedOutput, serJson);
     }
-
+    @Test
     public void testSerializeExcludeNothing() throws Exception {
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                 (String[]) null);
@@ -75,47 +70,45 @@ public class DefaultServiceTest extends
                 
"{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}",
                 serJson);
     }
-
+    @Test
     // deep exclude?!
     public void testSerializeExcludeClass() throws Exception {
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                 String.class, (String[]) null);
         assertEquals("Serialization failed ", "{\"container\":{}}", serJson);
     }
-
+    @Test
     public void testSerializeExcludeClassAndField() throws Exception {
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                 String.class, "container");
         assertEquals("Serialization failed ", "{}", serJson);
     }
-
+    @Test
     public void testSerializeExcludeClassAndFields() throws Exception {
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                 Map.class, "configurationName", "name");
         assertEquals("Serialization failed ", "{}", serJson);
     }
-
+    @Test
     public void testSerializeExcludeField() throws Exception {
-
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                  "configurationName");
         assertEquals("Serialization failed ",
                 "{\"container\":{\"cf\":\"Config.xml\"},\"name\":\"mytest\"}",
                 serJson);
     }
-
+    @Test
     public void testSerializeDate() throws Exception {
         final SimpleDateFormat MMddyyyy = new SimpleDateFormat("MM/dd/yyyy");
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("date", Calendar.getInstance().getTime());
-
         sc.setDateFormat(MMddyyyy);
         String serJson = sc.ser(map);
         System.out.println("serJson:" + serJson);
         assertTrue("Serialize with Adapater failed ",
                 serJson.matches("\\{\"date\":\"\\d\\d/\\d\\d/\\d{4}\"\\}"));
     }
-
+    @Test
     // does not seerialize size
     public void testSerializeCollection() throws Exception {
         List<Rectangle> rectList = new ArrayList<Rectangle>();
@@ -129,7 +122,7 @@ public class DefaultServiceTest extends
                 
"[{'w':0,'h':0,'name':'rect0'},{'w':1,'h':1,'name':'rect1'},{'w':2,'h':2,'name':'rect2'},{'w':3,'h':3,'name':'rect3'},{'w':4,'h':4,'name':'rect4'},{'w':5,'h':5,'name':'rect5'},{'w':6,'h':6,'name':'rect6'},{'w':7,'h':7,'name':'rect7'},{'w':8,'h':8,'name':'rect8'},{'w':9,'h':9,'name':'rect9'}]",
                 adapterSer.replace('"', '\''));
     }
-    
+    @Test
     public void testSerializationCollectioPrimitiveWrapper() throws Exception {
 
         List<Integer> intList = new ArrayList<Integer>();
@@ -143,7 +136,7 @@ public class DefaultServiceTest extends
                 "[0,1,4,9,16,25,36,49,64,81]",
                 result);
     }
-
+    @Test
     public void testSerializeTypeAdapterForCollection() throws Exception {
         sc.addAdapter("Collection Adapter", ArrayList.class,
                 new TypeAdapterForCollection());
@@ -158,7 +151,7 @@ public class DefaultServiceTest extends
                 
"{'rect0':0,'rect1':1,'rect2':4,'rect3':9,'rect4':16,'rect5':25,'rect6':36,'rect7':49,'rect8':64,'rect9':81}",
                 adapterSer.replace('"', '\''));
     }
-    
+    @Test
     public void testMixinAdapter() throws Exception {
         sc.addAdapter("Test Adapter", TestClass.class, new 
TestJsonSerializer());
         String adapterSer = sc.ser(new TestClass("mytest"));
@@ -170,13 +163,13 @@ public class DefaultServiceTest extends
         assertEquals("failed adapter serialization:",
                 
"{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}",
 defaultSer);
     }
-    
+    @Test 
     public void testDeSerialize() throws Exception {
         String serJson = sc.ser(new TestClass("mytest"));
         Object deson = sc.deSer(serJson, TestClass.class);
         assertEquals("Serialization failed ", TestClass.class, 
deson.getClass());
     }
-   
+    @Test
     public void testDeserializationCollection() throws Exception {
         List<Rectangle> rectList = new ArrayList<Rectangle>();
         for (int i = 0; i < 10; i++) {
@@ -191,7 +184,7 @@ public class DefaultServiceTest extends
                     .get(i).getSize());
         }
     }
-
+    @Test
     public void testDeserializationTypeAdapterForCollection() throws Exception 
{
         sc.addAdapter("Collection Adapter", ArrayList.class,
                 TypeAdapterForCollection.class);
@@ -207,7 +200,7 @@ public class DefaultServiceTest extends
                     .get(i).getSize());
         }
     }
-    
+    @Test
     public void testSerializeWithMixinAndFilter() throws Exception {
         Rectangle filteredRectangle = new Rectangle(5, 10);
         filteredRectangle.setName("jim");
@@ -222,7 +215,7 @@ public class DefaultServiceTest extends
                 "{\"name\":\"jim\",\"width\":5}",
                 rectangle); 
     }
-    
+    @Test
     public void testSerializeWithOnlyFilter() throws Exception {
 
         // as gson adds we could not use multiple disjunct exclusion strategies
@@ -232,7 +225,7 @@ public class DefaultServiceTest extends
                 "{\"configurationName\":\"Config.xml\"}",
                 serJson);
     }
-    
+    @Test
     public void testSerializeWithOnlyFilter2() throws Exception {
 
         // as gson adds we could not use multiple disjunct exclusion strategies
@@ -243,7 +236,6 @@ public class DefaultServiceTest extends
                 "Ser filtered Rectangle failed ",
                 "{\"w\":5}",
                 rectangle);
-        
     }
 
 

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=1694505&r1=1694504&r2=1694505&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 Aug  6 14:10:31 2015
@@ -19,6 +19,8 @@ package org.apache.fulcrum.json.jackson;
  * under the License.
  */
 
+import static org.junit.Assert.*;
+
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -29,7 +31,10 @@ import java.util.Map;
 
 import org.apache.fulcrum.json.JsonService;
 import org.apache.fulcrum.json.TestClass;
+import org.apache.fulcrum.testcontainer.BaseUnit4Test;
 import org.apache.fulcrum.testcontainer.BaseUnitTest;
+import org.junit.Before;
+import org.junit.Test;
 
 
 /**
@@ -38,30 +43,20 @@ import org.apache.fulcrum.testcontainer.
  * @author gk
  * @version $Id$
  */
-public class DefaultServiceTest extends BaseUnitTest {
+public class DefaultServiceTest extends BaseUnit4Test {
     private JsonService sc = null;
     private final String preDefinedOutput = 
"{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}";
 
-    /**
-     * Constructor for test.
-     * 
-     * @param testName
-     *            name of the test being executed
-     */
-    public DefaultServiceTest(String testName) {
-        super(testName);
-    }
-
+    @Before
     public void setUp() throws Exception {
-        super.setUp();
         sc = (JsonService) this.lookup(JsonService.ROLE);
     }
-
+    @Test
     public void testSerialize() throws Exception {
         String serJson = sc.ser(new TestClass("mytest"));
         assertEquals("Serialization failed ", preDefinedOutput, serJson);
     }
-
+    @Test
     public void testSerializeExcludeNothing() throws Exception {
         String serJson = sc.ser(new TestClass("mytest"));
         assertEquals(
@@ -69,8 +64,7 @@ public class DefaultServiceTest extends
                 
"{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}",
                 serJson);
     }
-
-
+    @Test
     public void ignoreTestSerializeExcludeClass() throws Exception {
         // jackson 1 could yet not exclude classes 
     }
@@ -87,7 +81,7 @@ public class DefaultServiceTest extends
 
         // no deep ignore??
     }
-
+    @Test
     public void testSerializeDate() throws Exception {
         final SimpleDateFormat MMddyyyy = new SimpleDateFormat("MM/dd/yyyy");
         Map<String, Object> map = new HashMap<String, Object>();
@@ -99,7 +93,7 @@ public class DefaultServiceTest extends
         assertTrue("Serialize with Adapter failed ",
                 serJson.matches("\\{\"date\":\"\\d\\d/\\d\\d/\\d{4}\"\\}"));
     }
-
+    @Test
     // jackson serializes size too
     public void testSerializeCollection() throws Exception {
         List<org.apache.fulcrum.json.Rectangle> rectList = new 
ArrayList<org.apache.fulcrum.json.Rectangle>();
@@ -113,9 +107,8 @@ public class DefaultServiceTest extends
                 
"[{'w':0,'h':0,'name':'rect0','size':0},{'w':1,'h':1,'name':'rect1','size':1},{'w':2,'h':2,'name':'rect2','size':4},{'w':3,'h':3,'name':'rect3','size':9},{'w':4,'h':4,'name':'rect4','size':16},{'w':5,'h':5,'name':'rect5','size':25},{'w':6,'h':6,'name':'rect6','size':36},{'w':7,'h':7,'name':'rect7','size':49},{'w':8,'h':8,'name':'rect8','size':64},{'w':9,'h':9,'name':'rect9','size':81}]",
                 adapterSer.replace('"', '\''));
     }
-    
+    @Test
     public void testSerializationCollectioPrimitiveWrapper() throws Exception {
-
         List<Integer> intList = new ArrayList<Integer>();
         for (int i = 0; i < 10; i++) {
             Integer integer = new Integer(i*i);
@@ -153,14 +146,14 @@ public class DefaultServiceTest extends
 //        assertEquals("failed adapter serialization:",
 //                "{\"n\":\"mytest\",\"p\":\"Config.xml\",\"c\":[]}", 
adapterSer);
 //    }
-    
+    @Test
     public void testDeSerialize() throws Exception {
         String serJson = sc.ser(new TestClass("mytest"));
         Object deson = sc.deSer(serJson, TestClass.class);
         assertEquals("Serialization failed ", TestClass.class, 
deson.getClass());
     }
 
-    
+    @Test
     public void testDeserializationCollection() throws Exception {
         List<Rectangle> rectList = new ArrayList<Rectangle>(); 
         for (int i = 0; i < 10; i++) {
@@ -180,7 +173,7 @@ public class DefaultServiceTest extends
     public void testDeserializationTypeAdapterForCollection() throws Exception 
{
         // not implemented
     }
-    
+    @Test
     public void testSerializeWithMixinAndFilter() throws Exception {
         Bean filteredBean = new Bean();
         filteredBean.setName("joe");
@@ -194,7 +187,7 @@ public class DefaultServiceTest extends
                 "{}",
                 bean);
     }
-      
+    @Test
     public void testSerializeWithOnlyFilter() throws Exception {
         // no deep include ??
         Bean filteredBean = new Bean();

Modified: 
turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java?rev=1694505&r1=1694504&r2=1694505&view=diff
==============================================================================
--- 
turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
 (original)
+++ 
turbine/fulcrum/trunk/json/jackson/src/test/org/apache/fulcrum/json/jackson/JacksonMapperTest.java
 Thu Aug  6 14:10:31 2015
@@ -19,9 +19,11 @@ package org.apache.fulcrum.json.jackson;
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -32,9 +34,11 @@ import org.apache.avalon.framework.logge
 import org.apache.fulcrum.json.JsonService;
 import org.apache.fulcrum.json.Rectangle;
 import org.apache.fulcrum.json.TestClass;
-import org.apache.fulcrum.testcontainer.BaseUnitTest;
+import org.apache.fulcrum.testcontainer.BaseUnit4Test;
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonProperty;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Jackson1 JSON Test
@@ -42,33 +46,23 @@ import org.codehaus.jackson.annotate.Jso
  * @author gk
  * @version $Id$
  */
-public class JacksonMapperTest extends BaseUnitTest {
+public class JacksonMapperTest extends BaseUnit4Test {
     private JsonService sc = null;
+    private final String preDefinedOutput = 
"{\"container\":{\"cf\":\"Config.xml\"},\"configurationName\":\"Config.xml\",\"name\":\"mytest\"}";
     Logger logger;
 
-    /**
-     * Constructor for test.
-     * 
-     * @param testName
-     *            name of the test being executed
-     */
-    public JacksonMapperTest(String testName) {
-        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);
+        String serJson = sc.ser(new TestClass("mytest"));
+        assertEquals("Serialization failed ", preDefinedOutput, serJson);
     }
-
+    @Test
     public void testSerializeDateWithDefaultDateFormat() throws Exception {
-
         Map<String, Date> map = new HashMap<String, Date>();
         map.put("date", Calendar.getInstance().getTime());
         String serJson = sc.ser(map);
@@ -76,7 +70,7 @@ public class JacksonMapperTest extends B
                 serJson.matches("\\{\"date\":\"\\d\\d/\\d\\d/\\d{4}\"\\}"));
 
     }
-
+    @Test
     public void testDeSerialize1() throws Exception {
 
         Map<String, Integer> map = new HashMap<String, Integer>();
@@ -85,14 +79,14 @@ public class JacksonMapperTest extends B
         assertEquals("Integer DeSer failed ", 5001, deserMap.get("name"));
 
     }
-
+    @Test
     public void testSerializeSingleObjectExcludeWithMixins() throws Exception {
         sc.addAdapter("M4RMixin", Rectangle.class, Mixin.class);
         String serRect = sc.ser(new Rectangle(25, 3));
         assertEquals("DeSer failed ", "{\"width\":25}", serRect);
 
     }
-
+    @Test
     public void testSerializeTwoObjectsIncludeOnlyAnnotationCustomFilterId()
             throws Exception {
         Bean filteredBean = new Bean();
@@ -110,7 +104,7 @@ public class JacksonMapperTest extends B
         logger.debug("rectangle: " + rectangle);
 
     }
-
+    @Test
     public void testDeSerialize() throws Exception {
         String serJson = sc.ser(new TestClass("mytest"));
         Object deson = sc.deSer(serJson, TestClass.class);
@@ -134,7 +128,7 @@ public class JacksonMapperTest extends B
 //                    .get(i).getW());
 //        }
 //    }
-    
+    @Test
     public void testMixins() throws Exception {
 
         Rectangle filteredRectangle = new Rectangle(5, 10);
@@ -144,7 +138,7 @@ public class JacksonMapperTest extends B
                         filteredRectangle);
         assertEquals("Ser failed ", "{\"width\":5}", serRect);
     }
-
+    @Test
     public void testMixis2() throws Exception {
         Bean filteredBean = new Bean();
         filteredBean.setName("joe");
@@ -158,9 +152,8 @@ public class JacksonMapperTest extends B
         String bean = sc.serializeOnlyFilter(filteredBean, Bean.class, "name");
         assertEquals("Ser filtered Bean failed ", "{\"name\":\"joe\"}", bean);
     }
-
+    @Test
     public void testFilteredCollectionOfBeans() throws Exception {
-
         List<Bean> beanList = new ArrayList<Bean>();
         for (int i = 0; i < 10; i++) {
             Bean filteredBean = new Bean();
@@ -180,11 +173,9 @@ public class JacksonMapperTest extends B
             logger.debug("deser bean: " + bean.getName() + " is "
                     + bean.getAge());
         }
-
     }
-
+    @Test
     public void testMixinCollectionOfBeans() throws Exception {
-
         List<Bean> beanList = new ArrayList<Bean>();
         for (int i = 0; i < 10; i++) {
             Bean filteredBean = new Bean();
@@ -204,7 +195,6 @@ public class JacksonMapperTest extends B
             logger.debug("deser bean: " + bean.getName() + " is "
                     + bean.getAge());
         }
-
     }
 
     // @JsonFilter("myFilter")

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=1694505&r1=1694504&r2=1694505&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 Aug  6 14:10:31 2015
@@ -39,6 +39,8 @@ 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.SerializableString;
+import com.fasterxml.jackson.core.io.CharacterEscapes;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.AnnotationIntrospector;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -83,6 +85,8 @@ public class Jackson2MapperService exten
     private static final String DEFAULT_TYPING = "defaultTyping";
     private static final String CACHE_FILTERS = "cacheFilters";
     private static final String DATE_FORMAT = "dateFormat";
+    private static final String ESCAPE_CHARS = "escapeCharsGlobal";
+    private static final String ESCAPE_CHAR_CLASS = "escapeCharsClass";
     ObjectMapper mapper;
     AnnotationIntrospector primary; // support default
     AnnotationIntrospector secondary;
@@ -105,6 +109,8 @@ public class Jackson2MapperService exten
                                         // multiple serialization in one thread
     String[] defaultTypeDefs = null;
     private CacheService cacheService;
+    private boolean escapeCharsGlobal = false; // to be backward compatible, 
but should be true, then escaping to avoid XSS payload by default
+    private String escapeCharsClass = null;
 
     @Override
     public String ser(Object src) throws Exception {
@@ -503,6 +509,17 @@ public class Jackson2MapperService exten
         if (configuredKeepFilter != null) {
             this.cacheFilters = configuredKeepFilter.getValueAsBoolean();
         }
+        final Configuration configuredEscapeChars = conf.getChild(ESCAPE_CHARS,
+                false);
+        if (configuredEscapeChars != null) {
+            this.escapeCharsGlobal  = 
configuredEscapeChars.getValueAsBoolean();
+        }
+        final Configuration configuredEscapeCharClass = 
conf.getChild(ESCAPE_CHAR_CLASS,
+                false);
+        if (configuredEscapeCharClass != null) {
+            this.escapeCharsClass  = configuredEscapeCharClass.getValue();
+        }
+        
         final Configuration configuredDefaultType = conf.getChild(
                 DEFAULT_TYPING, false);
         if (configuredDefaultType != null) {
@@ -685,6 +702,20 @@ public class Jackson2MapperService exten
         }
 
         mapper.setDateFormat(new SimpleDateFormat(dateFormat));
+        
+        if (escapeCharsGlobal) {
+            mapper.getFactory().setCharacterEscapes(characterEscapes);
+        }
+        if (escapeCharsClass != null) {
+            try {
+                characterEscapes = (CharacterEscapes) 
Class.forName(escapeCharsClass).getConstructor()
+                        .newInstance();
+            } catch (Exception e) {
+                throw new Exception(
+                        "JsonMapperService: Error instantiating " + 
escapeCharsClass
+                                + " for " + ESCAPE_CHAR_CLASS );
+            }
+        }
 
         getLogger().debug("initialized mapper:" + mapper);
 
@@ -726,4 +757,31 @@ public class Jackson2MapperService exten
         if (!cacheFilters)
             mapper.configure(SerializationFeature.FLUSH_AFTER_WRITE_VALUE, 
true);
     }
+    
+    static CharacterEscapes characterEscapes = new CharacterEscapes() {
+        private static final long serialVersionUID = 1L;
+        private final int[] asciiEscapes;
+         { // instance init
+            int[] esc = standardAsciiEscapesForJSON();
+            // this avoids to get evaluated immediately
+            esc['<'] = CharacterEscapes.ESCAPE_STANDARD;
+            esc['>'] = CharacterEscapes.ESCAPE_STANDARD;
+            esc['&'] = CharacterEscapes.ESCAPE_STANDARD;
+            esc['\''] = CharacterEscapes.ESCAPE_STANDARD;
+            //esc['/'] = '/'; //CharacterEscapes.ESCAPE_CUSTOM;
+            asciiEscapes = esc;
+        }
+        @Override
+        public int[] getEscapeCodesForAscii() {
+            return asciiEscapes;
+        }
+        @Override
+        public SerializableString getEscapeSequence(final int ch) {
+//            if ( ch == '/') { 
+//                return new SerializedString("\\\\/");
+//            } else {
+                return null;
+//            }
+        }
+    };
 }

Modified: turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml?rev=1694505&r1=1694504&r2=1694505&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml 
(original)
+++ turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml Thu 
Aug  6 14:10:31 2015
@@ -35,7 +35,9 @@
         </features>
   </annotationInspectors>
    <dateFormat>MM/dd/yyyy</dateFormat>
+   <escapeCharsGlobal>true</escapeCharsGlobal>
         <!-- defaultTyping type="NON_FINAL" key="type"/--><!-- or 
OBJECT_AND_NON_CONCRETE -->
         <!-- cacheFilters>false</cacheFilters-->
+   <!--  escapeCharsClass>net.example.EscapeCharClass</escapeCharsClass -->
   </json>
 </componentConfig>

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=1694505&r1=1694504&r2=1694505&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 Aug  6 14:10:31 2015
@@ -30,6 +30,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.avalon.framework.logger.ConsoleLogger;
 import org.apache.fulcrum.json.JsonService;
 import org.apache.fulcrum.json.Rectangle;
 import org.apache.fulcrum.json.TestClass;
@@ -38,6 +39,7 @@ import org.apache.fulcrum.testcontainer.
 import org.junit.Before;
 import org.junit.Test;
 
+import com.fasterxml.jackson.core.io.CharacterEscapes;
 import com.fasterxml.jackson.core.type.TypeReference;
 
 /**
@@ -52,7 +54,7 @@ public class DefaultServiceTest extends
 
     @Before
     public void setUp() throws Exception {
-        //setLogLevel(ConsoleLogger.LEVEL_DEBUG);
+        setLogLevel(ConsoleLogger.LEVEL_DEBUG);
         sc = (JsonService) this.lookup(JsonService.ROLE);
     }
 
@@ -353,5 +355,17 @@ public class DefaultServiceTest extends
         TypeReference<List<TypedRectangle>> typeRef = new 
TypeReference<List<TypedRectangle>>(){};
         System.out.println("aa:" 
+((Jackson2MapperService)sc).serCollectionWithTypeReference(rectList,typeRef, 
false));
     }
+    @Test
+    // jackson dies not escape anything, except double quotes and backslash, 
you could provide 
+    public void testSerializeHTMLEscape() throws Exception {
+        Rectangle filteredRect = new Rectangle(2, 3, 
"rectÜber<strong>StockundStein 
&iuml;</strong></script><script>alert('xss')</script>" + 0);
+        String adapterSer = sc.ser(filteredRect);
+        System.out.println(adapterSer);
+        assertEquals("html entities ser",
+                
"{'w':2,'h':3,'name':'rectÜber\\u003Cstrong\\u003EStockundStein 
\\u0026iuml;\\u003C/strong\\u003E\\u003C/script\\u003E\\u003Cscript\\u003Ealert(\\u0027xss\\u0027)\\u003C/script\\u003E0','size':6}",
+                adapterSer.replace('"', '\''));
+        // you could set your own escapes here in class esc extending from 
CharacterEscapes. 
+        
//((Jackson2MapperService)sc).getMapper().getFactory().setCharacterEscapes(esc 
) );
+    }
 
 }

Modified: 
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java?rev=1694505&r1=1694504&r2=1694505&view=diff
==============================================================================
--- 
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java
 (original)
+++ 
turbine/fulcrum/trunk/json/jackson2/src/test/org/apache/fulcrum/json/jackson/JacksonMapperEnabledDefaultTypingTest.java
 Thu Aug  6 14:10:31 2015
@@ -78,13 +78,12 @@ public class JacksonMapperEnabledDefault
     }
     @Test
     public void testSerializeDateWithDefaultDateFormat() throws Exception {
-
         Map<String, Date> map = new HashMap<String, Date>();
         map.put("date", Calendar.getInstance().getTime());
         String serJson = sc.ser(map);
-        //System.out.println("serJson:" +serJson);
-        assertTrue(
-                "Serialize with Adapater failed ",
+        System.out.println("serJson:" +serJson);
+        assertEquals(
+                "Serialize with Adapater failed ",true,
                 
serJson.matches(".*\"java.util.Date\",\"\\d\\d/\\d\\d/\\d{4}\".*"));
     }
     @Test

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=1694505&r1=1694504&r2=1694505&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 Aug  6 14:10:31 2015
@@ -83,7 +83,7 @@ public class JacksonMapperEnabledDefault
         Map<String, Date> map = new HashMap<String, Date>();
         map.put("date", Calendar.getInstance().getTime());
         String serJson = sc.ser(map);
-        //System.out.println("serJson:" +serJson);
+        System.out.println("serJson:" +serJson);
         assertTrue(
                 "Serialize with Adapater failed ",
                 
serJson.matches(".*\"java.util.Date\",\"\\d\\d/\\d\\d/\\d{4}\".*"));

Modified: turbine/fulcrum/trunk/json/xdocs/index.xml
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/xdocs/index.xml?rev=1694505&r1=1694504&r2=1694505&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/xdocs/index.xml (original)
+++ turbine/fulcrum/trunk/json/xdocs/index.xml Thu Aug  6 14:10:31 2015
@@ -28,7 +28,7 @@
   <body>
 
   <section name="Overview">
-    <p>The intent of this  component is to provide a configurable and 
customized integration of JSON De-/Serializers using GSON, Jackson 1 and 
Jackson 2 APIs into Avalon/Turbine. 
+    <p>The intent of this  component is to provide a configurable and 
customized integration of JSON De-/Serializers using GSON, Jackson 1 and 
Jackson 2 APIs into Avalon/Turbine. It is a common pattern with client-side MVC 
applications to embed data for a base set of objects in a page instead of 
making a separate AJAX request to load them.
     
      It is written for use in Turbine but it can be used in any container 
compatible
       with Avalon's ECM container. There are three implementations


Reply via email to