Author: gk
Date: Fri Nov 22 10:42:59 2013
New Revision: 1544476

URL: http://svn.apache.org/r1544476
Log:
Added collectionType Deserialization in JsonService API (finding an common 
interface for GSON and Jackson may be not possible).
Enhanced Feature reading for Jackson2 in Jackson2MapperService.java
Fix in synchronizing in SimpleNameIntrospector.java
Resorted Tests
Updated documentation
Deleted not needed configuration files

Removed:
    turbine/fulcrum/trunk/json/api/src/test/TestComponentConfig.xml
    turbine/fulcrum/trunk/json/api/src/test/TestRoleConfig.xml
Modified:
    
turbine/fulcrum/trunk/json/api/src/java/org/apache/fulcrum/json/JsonService.java
    
turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/Rectangle.java
    
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/src/java/org/apache/fulcrum/json/jackson/JacksonMapperService.java
    turbine/fulcrum/trunk/json/jackson/src/test/TestComponentConfig.xml
    
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/java/org/apache/fulcrum/json/jackson/SimpleNameIntrospector.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/JacksonMapperTest.java
    turbine/fulcrum/trunk/json/jackson2/xdocs/index.xml
    turbine/fulcrum/trunk/json/pom.xml
    turbine/fulcrum/trunk/json/xdocs/index.xml

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -20,6 +20,7 @@ package org.apache.fulcrum.json;
  */
 
 import java.text.DateFormat;
+import java.util.Collection;
 
 /**
  * JsonService defines methods needed to serialize and deserialize and hepler
@@ -68,7 +69,7 @@ public interface JsonService {
     <T> String ser(Object src, Class<T> type) throws Exception;
 
     /**
-     * Deserialzes a JSON string
+     * Deserializing a JSON string
      * 
      * @param src
      *            Tthe JSON string to be deserialized
@@ -81,6 +82,24 @@ public interface JsonService {
      *             if JSON deserialization fails
      */
     <T> T deSer(String src, Class<T> type) throws Exception;
+    
+    /**
+     * This is to deserialize collections. Depending on the implementation 
either both collectiontype and elementType is needed or 
+     * the elementType will be derived from the typed collectiontype.
+     * 
+     * @param json
+     *          The JSON string to be deserialized
+     * @param collectionType
+     *          A collection object, which will be used to derive the 
collection type. 
+     *          It could be just the collection or the typed collection. It 
may then be used to get the type for element type too.
+     *          Cft. implementation tests for more details (GSON). 
+     * @param elementType
+     *          The element type. This is need in any case to assure the 
generic checking.
+     * @return
+     * @throws Exception
+     */
+    <T> Collection<T> deSerCollection(String json, Object collectionType, 
Class<T> elementType) 
+            throws Exception;
 
     /**
      * @see #serializeOnlyFilter(Object, Class, boolean, String...).

Modified: 
turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/Rectangle.java
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/Rectangle.java?rev=1544476&r1=1544475&r2=1544476&view=diff
==============================================================================
--- 
turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/Rectangle.java 
(original)
+++ 
turbine/fulcrum/trunk/json/api/src/test/org/apache/fulcrum/json/Rectangle.java 
Fri Nov 22 10:42:59 2013
@@ -1,9 +1,13 @@
 package org.apache.fulcrum.json;
 
 public final class Rectangle {
-    final private int w, h;
+    private int w, h;
     private String name;
-
+ 
+    public Rectangle() {
+        // may be this is needed for deserialization, if not set otherwise
+    }
+    
     public Rectangle(int w, int h) {
         this.w = w;
         this.h = h;

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -22,6 +22,7 @@ package org.apache.fulcrum.json.gson;
 import java.lang.reflect.Type;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
@@ -90,6 +91,15 @@ public class GSONBuilderService extends 
         getLogger().debug("deser:" + json);
         return gson.create().fromJson(json, type);
     }
+    
+    @Override
+    public <T> Collection<T> deSerCollection(String json, Object 
collectionType,
+            Class<T> arg2) throws Exception {
+        getLogger().debug("deser:" + json);
+        getLogger().debug("collectionType:" + collectionType);
+        return  gson.create().fromJson(json, (Type)collectionType);
+    }
+    
 
     @Override
     public <T> String serializeOnlyFilter(Object src, Class<T> filterClass,

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -19,9 +19,11 @@ package org.apache.fulcrum.json.gson;
  * under the License.
  */
 
+import java.lang.reflect.Type;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +33,8 @@ import org.apache.fulcrum.json.Rectangle
 import org.apache.fulcrum.json.TestClass;
 import org.apache.fulcrum.testcontainer.BaseUnitTest;
 
+import com.google.gson.reflect.TypeToken;
+
 /**
  * GSON JSON Test
  * 
@@ -62,12 +66,6 @@ public class DefaultServiceTest extends 
         assertEquals("Serialization failed ", preDefinedOutput, serJson);
     }
 
-    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());
-    }
-
     public void testSerializeExclude00() throws Exception {
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                 (Class) null, (String[]) null);
@@ -116,7 +114,7 @@ public class DefaultServiceTest extends 
                 serJson.matches("\\{\"date\":\"\\d\\d/\\d\\d/\\d{4}\"\\}"));
     }
 
-    public void testCollection() throws Exception {
+    public void testSerializeCollection() throws Exception {
         List<Rectangle> rectList = new ArrayList<Rectangle>();
         for (int i = 0; i < 10; i++) {
             Rectangle filteredRect = new Rectangle(i, i, "rect" + i);
@@ -156,7 +154,34 @@ public class DefaultServiceTest extends 
                 "collect ser",
                 
"{'rect0':0,'rect1':1,'rect2':4,'rect3':9,'rect4':16,'rect5':25,'rect6':36,'rect7':49,'rect8':64,'rect9':81}",
                 adapterSer.replace('"', '\''));
-
+    }
+    
+    public void testMixinAdapter() throws Exception {
+        sc.addAdapter("Test Adapter", TestClass.class, new 
TestJsonSerializer());
+        String adapterSer = sc.ser(new TestClass("mytest"));
+        assertEquals("failed adapter serialization:",
+                "{\"n\":\"mytest\",\"p\":\"Config.xml\",\"c\":[]}", 
adapterSer);
+    }
+    
+    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());
+    }
+   
+    public void testDeserializationCollection() throws Exception {
+        List<Rectangle> rectList = new ArrayList<Rectangle>();
+        for (int i = 0; i < 10; i++) {
+            Rectangle filteredRect = new Rectangle(i, i, "rect" + i);
+            rectList.add(filteredRect);
+        }
+        String serColl = sc.ser(rectList);
+        Type collectionType = new TypeToken<Collection<Rectangle>>() 
{}.getType();
+        List<Rectangle> resultList0 = (List<Rectangle>) 
((org.apache.fulcrum.json.gson.GSONBuilderService)sc).deSerCollection(serColl, 
collectionType,Rectangle.class);
+        for (int i = 0; i < 10; i++) {
+            assertEquals("deser reread size failed", (i * i), resultList0
+                    .get(i).getSize());
+        }
     }
 
     public void testDeserializationTypeAdapterForCollection() throws Exception 
{
@@ -176,11 +201,5 @@ public class DefaultServiceTest extends 
         }
     }
 
-    public void testMixinAdapter() throws Exception {
-        sc.addAdapter("Test Adapter", TestClass.class, new 
TestJsonSerializer());
-        String adapterSer = sc.ser(new TestClass("mytest"));
-        assertEquals("failed adapter serialization:",
-                "{\"n\":\"mytest\",\"p\":\"Config.xml\",\"c\":[]}", 
adapterSer);
-    }
 
 }

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -128,6 +128,13 @@ public class JacksonMapperService extend
         ObjectReader reader = mapper.reader(type);
         return reader.readValue(src);
     }
+    
+    @Override
+    public <T> Collection<T> deSerCollection(String json,
+            Object collectionType, Class<T> elementType) throws Exception {
+        return mapper.readValue(json, mapper.getTypeFactory()
+                
.constructCollectionType(((Collection<T>)collectionType).getClass(), 
elementType));
+    }
 
     public <T> T deSer(String json, Class<? extends Collection> collectionType,
             Class<T> type) throws Exception {

Modified: turbine/fulcrum/trunk/json/jackson/src/test/TestComponentConfig.xml
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson/src/test/TestComponentConfig.xml?rev=1544476&r1=1544475&r2=1544476&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/jackson/src/test/TestComponentConfig.xml 
(original)
+++ turbine/fulcrum/trunk/json/jackson/src/test/TestComponentConfig.xml Fri Nov 
22 10:42:59 2013
@@ -24,7 +24,8 @@
        <primary>org.apache.fulcrum.json.jackson.CustomIntrospector</primary>
         
<secondary>org.codehaus.jackson.xc.JaxbAnnotationIntrospector</secondary>
         <features>
-          <feature 
value="false">org.codehaus.jackson.map.SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS</feature>
+        <!--  support up to now only serializing features -->
+          <feature 
value="false">org.codehaus.jackson.map.SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS</feature>
 
           <!-- feature 
value="true">org.codehaus.jackson.map.SerializationConfig.Feature.INDENT_OUTPUT</feature-->
         </features>
   </annotationInspectors>

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -21,6 +21,7 @@ package org.apache.fulcrum.json.jackson;
 
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -116,6 +117,24 @@ public class JacksonMapperTest extends B
         assertEquals("DeSer failed ", TestClass.class, deson.getClass());
     }
 
+//    public void testDeserializationCollection() throws Exception {
+//        List<Rectangle> rectList = new ArrayList<Rectangle>(); 
+//        for (int i = 0; i < 10; i++) {
+//            Rectangle filteredRect = new Rectangle(i, i, "rect" + i);
+//            rectList.add(filteredRect);
+//        }
+//        String serColl = sc.ser(rectList);
+//
+//        List<Rectangle> typeRectList = new ArrayList<Rectangle>(); //empty
+//        System.out.println("serColl:" + serColl);
+//        Collection<Rectangle> resultList0 =   sc.deSerCollection(serColl, 
typeRectList, Rectangle.class);
+//        
+//        for (int i = 0; i < 10; i++) {
+//            assertEquals("deser reread size failed", i , 
((List<Rectangle>)resultList0)
+//                    .get(i).getW());
+//        }
+//    }
+    
     public void testMixins() throws Exception {
 
         Rectangle filteredRectangle = new Rectangle(5, 10);

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -39,6 +39,8 @@ import org.apache.fulcrum.json.jackson.f
 import org.apache.fulcrum.json.jackson.filters.FilterContext;
 
 import com.fasterxml.jackson.core.JsonGenerator;
+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.databind.AnnotationIntrospector;
@@ -72,8 +74,9 @@ import com.fasterxml.jackson.databind.se
  * object).
  * 
  * Note: If using {@link SimpleNameIntrospector}, filters are set by class id, 
which are cached by default. 
- * By setting {@link #cacheFilters} to <code>false</code> each filter will be 
unregistered and the cache cleaned.
- * On the other hand, by setting the refresh parameterin method calls using 
{@link #filter(Object, Class, FilterContext, boolean, String...)} class 
filtering is done only on class level.
+ * By setting {@link #cacheFilters} to <code>false</code> each filter will be 
unregistered and cache cleaed.
+ * By setting the refresh parameter {@link #filter(Object, Class, 
FilterContext, boolean, String...)} on per-filter method call
+ * you could filter a class providing different properties.
  * 
  * @author gk
  * @version $Id$
@@ -144,14 +147,12 @@ public class Jackson2MapperService exten
             getLogger().info("no serializable object:" + src);
             return serResult;
         } 
-        if (filters != null) {
-            getLogger().debug("ser class::" + src.getClass() + " with filters 
" + filters);
-            serResult = mapper.writer(filters).writeValueAsString(src);
-        } else {
+        if (filters == null) {
             getLogger().debug("ser class::" + src.getClass() + " without 
filters" +filters); 
-            serResult = ser(src);
-        }
-        return serResult;
+            return ser(src);
+        }    
+        getLogger().debug("ser class::" + src.getClass() + " with filters " + 
filters);
+        return mapper.writer(filters).writeValueAsString(src);
     }
 
     @Override
@@ -164,13 +165,18 @@ public class Jackson2MapperService exten
 
         return reader.readValue(json);
     }
-
-    @SuppressWarnings("rawtypes")
-    public <T> T deSerCollection(String json,
-            Class<? extends Collection> collectionType, Class<T> type)
+    
+    public <T> Collection<T> deSerCollection2(String json, Class<? extends 
Collection> collectionClass, Class<T> type)
+            throws Exception {
+        return mapper.readValue(json, mapper.getTypeFactory()
+                .constructCollectionType(collectionClass, type));
+    }
+    
+    @Override
+    public <T> Collection<T> deSerCollection(String json, Object 
collectionType, Class<T> type) 
             throws Exception {
         return mapper.readValue(json, mapper.getTypeFactory()
-                .constructCollectionType(collectionType, type));
+                
.constructCollectionType(((Collection<T>)collectionType).getClass(), type));
     }
 
     public void getJsonService() throws InstantiationException {
@@ -295,7 +301,10 @@ public class Jackson2MapperService exten
         } else {
             filter = (SimpleFilterProvider) this.filters.get(filterClass
                     .getName());
+            //setCustomIntrospectorWithExternalFilterId(filterClass); // filter
+            // class
         }
+        getLogger().debug("set filter:"+ filter);
         return filter;
     }
 
@@ -486,7 +495,7 @@ public class Jackson2MapperService exten
                 } catch (Exception e) {
                     throw new Exception(
                             "JsonMapperService: Error instantiating "
-                                    + featureType + " for " + featureKey);
+                                    + featureType + " for " + featureKey,e);
                 }
                 ConfigFeature feature = null;
                 if (featureKey != null && featureValue != null) {
@@ -541,6 +550,24 @@ public class Jackson2MapperService exten
                                             + mapper.getSerializationConfig()
                                                     .isEnabled(
                                                             (MapperFeature) 
feature));
+                        } else if (configFeature.equals(JsonParser.class)) {
+                            Feature parserFeature = 
JsonParser.Feature.valueOf(featureKey);
+                            getLogger()
+                            .info("initializing parser feature: "
+                                    + parserFeature
+                                    + " with "
+                                    + featureValue);
+                            mapper.configure(parserFeature,
+                                    featureValue);
+                        } else if (configFeature.equals(JsonGenerator.class)) {
+                            com.fasterxml.jackson.core.JsonGenerator.Feature 
genFeature = JsonGenerator.Feature.valueOf(featureKey);
+                            getLogger()
+                            .info("initializing parser feature: "
+                                    + genFeature
+                                    + " with "
+                                    + featureValue);
+                            mapper.configure(genFeature,
+                                    featureValue);
                         }
                     } catch (Exception e) {
                         throw new Exception(
@@ -595,7 +622,7 @@ public class Jackson2MapperService exten
         this.mapper = mapper;
     }
 
-    public final class MixinModule extends SimpleModule {
+    public static final class MixinModule extends SimpleModule {
         /**
          * 
          */
@@ -615,7 +642,7 @@ public class Jackson2MapperService exten
         }
     }
 
-    public final class CustomModule<T> extends SimpleModule {
+    public static final class CustomModule<T> extends SimpleModule {
 
         private static final long serialVersionUID = 1L;
 

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -98,8 +98,10 @@ public class SimpleNameIntrospector exte
     }
 
     public void removeExternalFilterClass(Class externalFilterClass) {
-        if (externalFilterClasses.contains(externalFilterClass.getName())) {
-            externalFilterClasses.remove(externalFilterClass.getName());
+        synchronized(externalFilterClasses) {
+            if (externalFilterClasses.contains(externalFilterClass.getName())) 
{
+                externalFilterClasses.remove(externalFilterClass.getName());
+            }
         }
     }
 

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=1544476&r1=1544475&r2=1544476&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml 
(original)
+++ turbine/fulcrum/trunk/json/jackson2/src/test/TestComponentConfig.xml Fri 
Nov 22 10:42:59 2013
@@ -26,7 +26,10 @@
         <features>
           <feature value="false" 
type="com.fasterxml.jackson.databind.SerializationFeature">FAIL_ON_EMPTY_BEANS</feature>
           <feature value="false" 
type="com.fasterxml.jackson.databind.DeserializationFeature">EAGER_DESERIALIZER_FETCH</feature>
+          <!--  do not fail of only getter is provided -->
+          <feature value="false" 
type="com.fasterxml.jackson.databind.DeserializationFeature">FAIL_ON_UNKNOWN_PROPERTIES</feature>
          
           <feature value="false" 
type="com.fasterxml.jackson.databind.MapperFeature">ALLOW_FINAL_FIELDS_AS_MUTATORS</feature>
+          <feature value="true"  
type="com.fasterxml.jackson.core.JsonParser">ALLOW_UNQUOTED_FIELD_NAMES</feature>
 
           <!-- feature 
value="true">com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT</feature-->
         </features>

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -22,6 +22,7 @@ package org.apache.fulcrum.json.jackson;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -29,7 +30,6 @@ import java.util.Map;
 import org.apache.fulcrum.json.JsonService;
 import org.apache.fulcrum.json.Rectangle;
 import org.apache.fulcrum.json.TestClass;
-import org.apache.fulcrum.json.jackson.JacksonMapperTest.Bean;
 import org.apache.fulcrum.json.jackson.filters.CustomModuleWrapper;
 import org.apache.fulcrum.testcontainer.BaseUnitTest;
 
@@ -56,7 +56,6 @@ public class DefaultServiceTest extends 
     public void setUp() throws Exception {
         super.setUp();
         sc = (JsonService) this.lookup(JsonService.ROLE);
-
     }
 
     public void testSerialize() throws Exception {
@@ -64,12 +63,6 @@ public class DefaultServiceTest extends 
         assertEquals("Serialization failed ", preDefinedOutput, serJson);
     }
 
-    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());
-    }
-
     public void testSerializeExclude00() throws Exception {
         String serJson = sc.serializeAllExceptFilter(new TestClass("mytest"),
                 (Class) null, (String[]) null);
@@ -121,7 +114,7 @@ public class DefaultServiceTest extends 
     }
 
     // jackson serializes size too
-    public void testCollection() throws Exception {
+    public void testSerializeCollection() throws Exception {
         List<Rectangle> rectList = new ArrayList<Rectangle>();
         for (int i = 0; i < 10; i++) {
             Rectangle filteredRect = new Rectangle(i, i, "rect" + i);
@@ -162,7 +155,40 @@ public class DefaultServiceTest extends 
                 "collect ser",
                 
"{'rect0':0,'rect1':1,'rect2':4,'rect3':9,'rect4':16,'rect5':25,'rect6':36,'rect7':49,'rect8':64,'rect9':81}",
                 adapterSer.replace('"', '\''));
+    }
+    
+    public void testMixinAdapter() throws Exception {
+        TestJsonSerializer tser = new TestJsonSerializer();
+        CustomModuleWrapper<TestClass> cmw = new 
CustomModuleWrapper<TestClass>(
+                tser, null);
+        sc.addAdapter("Collection Adapter", TestClass.class, cmw);
+        String adapterSer = sc.ser(new TestClass("mytest"));
+        assertEquals("failed adapter serialization:",
+                "{\"n\":\"mytest\",\"p\":\"Config.xml\",\"c\":[]}", 
adapterSer);
+    }
+    
+    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());
+    }
 
+    
+    public void testDeserializationCollection() throws Exception {
+        List<Rectangle> rectList = new ArrayList<Rectangle>(); 
+        for (int i = 0; i < 10; i++) {
+            Rectangle filteredRect = new Rectangle(i, i, "rect" + i);
+            rectList.add(filteredRect);
+        }
+        String serColl = sc.ser(rectList);
+
+        List typeRectList = new ArrayList(); //empty
+        Collection<Rectangle> resultList0 =  sc.deSerCollection(serColl, 
typeRectList, Rectangle.class);
+        
+        for (int i = 0; i < 10; i++) {
+            assertEquals("deser reread size failed", (i * i), 
((List<Rectangle>)resultList0)
+                    .get(i).getSize());
+        }
     }
 
     public void testDeserializationTypeAdapterForCollection() throws Exception 
{
@@ -184,14 +210,4 @@ public class DefaultServiceTest extends 
         }
     }
 
-    public void testMixinAdapter() throws Exception {
-        TestJsonSerializer tser = new TestJsonSerializer();
-        CustomModuleWrapper<TestClass> cmw = new 
CustomModuleWrapper<TestClass>(
-                tser, null);
-        sc.addAdapter("Collection Adapter", TestClass.class, cmw);
-        String adapterSer = sc.ser(new TestClass("mytest"));
-        assertEquals("failed adapter serialization:",
-                "{\"n\":\"mytest\",\"p\":\"Config.xml\",\"c\":[]}", 
adapterSer);
-    }
-
 }

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -149,7 +149,7 @@ public class JacksonMapperEnabledDefault
         String result = sc.serializeOnlyFilter(beanList, Bean.class, "name",
                 "age");
         List<Bean> beanList2 = (List<Bean>) ((Jackson2MapperService) sc)
-                .deSerCollection(result, List.class, Bean.class);
+                .deSerCollection(result, beanList, Bean.class);
         assertTrue("DeSer failed ", beanList2.size() == 10);
         for (Bean bean : beanList2) {
             assertEquals("DeSer failed ", Bean.class, bean.getClass());
@@ -235,7 +235,7 @@ public class JacksonMapperEnabledDefault
         String result = sc.addAdapter("M4RMixin", Bean.class, BeanMixin.class)
                 .ser(beanList);
         List<Bean> beanList2 = (List<Bean>) ((Jackson2MapperService) sc)
-                .deSerCollection(result, List.class, Bean.class);
+                .deSerCollection(result, beanList, Bean.class);
         assertTrue("DeSer failed ", beanList2.size() == 10);
         for (Bean bean : beanList2) {
             assertEquals("DeSer failed ", Bean.class, bean.getClass());
@@ -262,6 +262,7 @@ public class JacksonMapperEnabledDefault
                 serRect.replace('"', '\''));
 
     }
+    
 
     // @JsonFilter("myFilter")
     static class Bean {

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=1544476&r1=1544475&r2=1544476&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
 Fri Nov 22 10:42:59 2013
@@ -21,6 +21,7 @@ package org.apache.fulcrum.json.jackson;
 
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -134,7 +135,7 @@ public class JacksonMapperTest extends B
         String result = sc.serializeOnlyFilter(beanList, Bean.class, "name",
                 "age");
         List<Bean> beanList2 = (List<Bean>) ((Jackson2MapperService) sc)
-                .deSerCollection(result, List.class, Bean.class);
+                .deSerCollection2(result, List.class, Bean.class);
         assertTrue("DeSer failed ", beanList2.size() == 10);
         for (Bean bean : beanList2) {
             assertEquals("DeSer failed ", Bean.class, bean.getClass());
@@ -207,6 +208,27 @@ public class JacksonMapperTest extends B
                 result.replace('"', '\''));
     }
 
+    public void testDeSerUnQuotedObject() throws Exception {
+        String jsonString = "{name:\"joe\"}";
+        Bean result = sc.deSer(jsonString, Bean.class);
+        assertTrue("expected bean object!", result instanceof Bean);
+    }
+    
+    public void testDeserializationCollection2() throws Exception {
+        List<Rectangle> rectList = new ArrayList<Rectangle>(); 
+        for (int i = 0; i < 10; i++) {
+            Rectangle filteredRect = new Rectangle(i, i, "rect" + i);
+            rectList.add(filteredRect);
+        }
+        String serColl = sc.ser(rectList);
+        Collection<Rectangle> resultList0 =  ((Jackson2MapperService) sc) 
.deSerCollection2(serColl, ArrayList.class, Rectangle.class);
+        
+        for (int i = 0; i < 10; i++) {
+            assertEquals("deser reread size failed", (i * i), 
((List<Rectangle>)resultList0)
+                    .get(i).getSize());
+        }
+    }
+    
     public void testDeSerializationCollectionWithMixin() throws Exception {
 
         List<Bean> beanList = new ArrayList<Bean>();
@@ -218,7 +240,7 @@ public class JacksonMapperTest extends B
         }
         String result = sc.addAdapter("M4RMixin", Bean.class, BeanMixin.class)
                 .ser(beanList);
-        Object beanList2 = ((Jackson2MapperService) sc).deSer(result,
+        Object beanList2 = sc.deSer(result,
                 List.class);
         assertTrue("DeSer failed ", beanList2 instanceof List);
         assertTrue("DeSer failed ", ((List) beanList2).size() == 10);

Modified: turbine/fulcrum/trunk/json/jackson2/xdocs/index.xml
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/jackson2/xdocs/index.xml?rev=1544476&r1=1544475&r2=1544476&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/jackson2/xdocs/index.xml (original)
+++ turbine/fulcrum/trunk/json/jackson2/xdocs/index.xml Fri Nov 22 10:42:59 2013
@@ -29,7 +29,7 @@
 
   <section name="Overview">
     <p>
-      This Service serves as a JSON serializer or deserializer using <a 
href="http://jackson.codehaus.org/";>Jackson</a>.
+      This Service serves as a JSON serializer or deserializer using <a 
href="http://jackson.codehaus.org/";>Jackson</a>. 
     </p>
 
     <p>
@@ -63,7 +63,7 @@
           <td>Complex</td>
           <td>[0|1]</td>
           <td>
-            If not set only one 
<code>com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector</code>
 is set as annotation introspector. Otherwise you could provide a primary and 
optionally an secondary inspector. Setting the inspector
+            If empty just 
<code>com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector</code>
 is set as annotation introspector. Otherwise you could provide a primary and 
(optionally) a secondary introspector. Setting the special introspector
             
<code>org.apache.fulcrum.json.jackson.SimpleNameIntrospector</code> yields 
property and class name based filtering. See the configuration example below 
and in <a href="#velocity">section</a>. Features could be set to 
<code>false</code> or <code>true</code> by setting the attribute <b>value</b> 
of the sub element feature. The feature attribute <b>type</b> should be the 
class name of any sub interface of 
<code>com.fasterxml.jackson.databind.cfg.ConfigFeature</code>. The element 
content itself defines any feature (enum value) for this feature. Cft. the 
configuration example below.
           </td>
         </tr>
@@ -133,12 +133,14 @@ JsonService jsonService = (JsonService)T
     </p>
 
   </section>
-  
-  <section name="Velocity" id="velocity">
+ 
+ <section name="Velocity-Template-Integration" id="velocity">
 
     <subsection name="Usage in Velocity Template">
     <p>
-     Some methods are explicitely provided to be used in a velocity context. 
You could provide it via the Turbine Pull service: 
+    A lot of client data is nowadays provided by javascript and usage of 
Model-View-View Model (MVVM) frameworks is very popular. Having the required 
data in JSON format would be of some help.
+    Velocity provides the integration of Java objects into templates (HTML). 
To generate in this context
+    the data which should be exposed into Javascript you could integrate the 
provided serialization methods here, in the velocity context. As an example, 
you could provide it via the Turbine Pull service: 
     </p>   
     <source><![CDATA[
     public Object getJson(Object src, String className, boolean refresh, 
String... props ) {
@@ -163,14 +165,44 @@ JsonService jsonService = (JsonService)T
     
     ## parse json in javascript ....
 ]]></source>
-    
+     What you get is the JSON data populated with all the fields you need 
(depending on serialization parameters the format may vary).
     </subsection>
+    
     <subsection name="Configuration Requirements">
     <p>
     Add <code>org.apache.fulcrum.json.jackson.SimpleNameIntrospector</code> to 
the annotation inspectors as primary or secondary inspector. Of course 
annotations are still valid, as the Introspector extends 
JacksonAnnotationIntrospector and additionally calls the super class methods in 
its overwritten methods.
     </p>
+    </subsection>
+</section>
+  <section name="Integration of JSON to Object Deserialization" id="deser">
+    <subsection name="Usage in Velocity Template">
     <p>
-<source>
+    This could be done just by providing the JSON data as client parameter to 
a JSON-RPC-Service function (cft. services->JSON-RPC-Service). As an example 
for the function:
+    </p>   
+    <source><![CDATA[
+      // class is registered in screen
+      public <T> void deSerJsonItem(String src ) {
+            JsonService jsonService = (JsonService)TurbineServices
+            .getInstance().getService(JsonService.ROLE);
+            try
+            {
+                Item result = jsonService.deSer( src, Item.class );
+                // do something with result
+            }
+            catch ( Exception e )
+            {
+                log.error(e.getMessage(),e );
+            }       
+        }       
+      }
+]]></source>
+     You could then call the JSON method in Javascript like this:
+     <source><![CDATA[
+       jsonrpc.myFunctions.deSerJsonUser( JSON.stringify(jsonuser) );
+]]></source>
+
+    </subsection>
+</section>
 
 </body>
 </document>

Modified: turbine/fulcrum/trunk/json/pom.xml
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/pom.xml?rev=1544476&r1=1544475&r2=1544476&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/pom.xml (original)
+++ turbine/fulcrum/trunk/json/pom.xml Fri Nov 22 10:42:59 2013
@@ -30,7 +30,7 @@
     <artifactId>fulcrum-json-parent</artifactId>
     <version>1.0.0-SNAPSHOT</version>
     <packaging>pom</packaging>
-    <name>Fulcrum Json Master Build</name>
+    <name>Fulcrum JSON Master Build</name>
     <url>http://turbine.apache.org/fulcrum/fulcrum-json/</url>
     <scm>
       
<connection>scm:svn:http://svn.apache.org/repos/asf/turbine/fulcrum/trunk/json/</connection>

Modified: turbine/fulcrum/trunk/json/xdocs/index.xml
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/json/xdocs/index.xml?rev=1544476&r1=1544475&r2=1544476&view=diff
==============================================================================
--- turbine/fulcrum/trunk/json/xdocs/index.xml (original)
+++ turbine/fulcrum/trunk/json/xdocs/index.xml Fri Nov 22 10:42:59 2013
@@ -42,8 +42,173 @@
       for generic applications.
     </p>
   </section>
+  
+  <section name="JSON Service with Jackson 2 API">
+    <subsection name="Overview">
+    <p>
+      This Service serves as a JSON serializer or deserializer using <a 
href="http://jackson.codehaus.org/";>Jackson</a>. 
+    </p>
+
+    <p>
+      It is written
+      for use in Turbine but it can be used in any container compatible
+      with Avalon's ECM container.
+    </p>
+     </subsection>
+      <subsection name="Role Configuration">
+      <source><![CDATA[
+  <role
+        name="org.apache.fulcrum.json.JsonService"
+        shorthand="json"
+        default-class="org.apache.fulcrum.json.jackson.Jackson2MapperService"/>
+]]></source>
+    </subsection>
+     <subsection name="Component Configuration">
+      <table>
+        <tr>
+          <th>Item</th>
+          <th>Datatype</th>
+          <th>Cardinality</th>
+          <th>Description</th>
+        </tr>
+        <tr>
+          <td>annotationInspectors</td>
+          <td>Complex</td>
+          <td>[0|1]</td>
+          <td>
+            If empty just 
<code>com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector</code>
 is set as annotation introspector. Otherwise you could provide a primary and 
(optionally) a secondary introspector. Setting the special introspector
+            
<code>org.apache.fulcrum.json.jackson.SimpleNameIntrospector</code> yields 
property and class name based filtering. See the configuration example below 
and in <a href="#velocity">section</a>. Features could be set to 
<code>false</code> or <code>true</code> by setting the attribute <b>value</b> 
of the sub element feature. The feature attribute <b>type</b> should be the 
class name of any sub interface of 
<code>com.fasterxml.jackson.databind.cfg.ConfigFeature</code>. The element 
content itself defines any feature (enum value) for this feature. Cft. the 
configuration example below.
+          </td>
+        </tr>
+        <tr>
+          <td>dateFormat</td>
+          <td>String</td>
+          <td>[0|*]</td>
+          <td>
+            If set changes the date format. The provided string should be in a 
format acceptable to the class 
<code>java.text.SimpleDateFormat.SimpleDateFormat(String)</code>. The default 
value is
+            <code>MM/dd/yyyy</code>. 
+          </td>
+        </tr>
+        <tr>
+          <td>defaultTyping</td>
+          <td>String</td>
+          <td>[0|*]</td>
+          <td>
+            The default is no defaultTyping. Otherwise set it to a Jackson 2 
enum value in class 
<code>com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping</code>.
+          </td>
+        </tr>
+        <tr>
+          <td>cacheFilters</td>
+          <td>boolean</td>
+          <td>[0|*]</td>
+          <td>
+            If set to <code>true</code>, caching is not enabled. Each filter 
applied remains valid and is not removed.
+            This implicits, that you cannot retrieve for the same class/Bean 
other properties in another call.
+            You could then invalidate (refresh) the cache per class. Cft. the 
<code>filter*(t)</code> methods with <code>refreshfilter</code> property. The 
default value is <code>true</code>. 
+          </td>
+        </tr>
+      </table>
+    </subsection>
+    <subsection name="Component Configuration Example">
+      <source><![CDATA[
+<json>
+  <annotationInspectors>
+       <primary>org.apache.fulcrum.json.jackson.CustomIntrospector</primary>
+        
<secondary>com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector</secondary>
+        <features>
+          <feature value="false" 
type="com.fasterxml.jackson.databind.SerializationFeature">FAIL_ON_EMPTY_BEANS</feature>
+          <feature value="false" 
type="com.fasterxml.jackson.databind.DeserializationFeature">EAGER_DESERIALIZER_FETCH</feature>
+          <feature value="false" 
type="com.fasterxml.jackson.databind.MapperFeature">ALLOW_FINAL_FIELDS_AS_MUTATORS</feature>
+
+          <!-- feature 
value="true">com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT</feature-->
+        </features>
+  </annotationInspectors>
+   <dateFormat>MM/dd/yyyy</dateFormat>
+   <defaultTyping type="NON_FINAL" key="type"/><!-- or e.g.  
OBJECT_AND_NON_CONCRETE -->
+   <!-- cacheFilters>false</cacheFilters>
+  </json>
+]]></source>
+    </subsection>
+    <subsection name="Usage">
+    <p>
+    You get a JSON service from the service like this:
+    </p>
+
+    <source><![CDATA[
+JsonService jsonService = (JsonService)TurbineServices
+        .getInstance().getService(JsonService.ROLE);
+]]></source>
+
+    <p>
+    </p>
+  </subsection>
+  <subsection name="Usage in Velocity Template" id="velocity">
+    <p>
+    A lot of client data is nowadays provided by javascript and usage of 
Model-View-View Model (MVVM) frameworks is very popular. Having the required 
data in JSON format would be of some help.
+    Velocity provides the integration of Java objects into templates (HTML). 
To generate in this context
+    the data which should be exposed into Javascript you could integrate the 
provided serialization methods here, in the velocity context. As an example, 
you could provide it via the Turbine Pull service: 
+    </p>   
+    <source><![CDATA[
+    public Object getJson(Object src, String className, boolean refresh, 
String... props ) {
+        String result= null;
+        jsonService = 
(JsonService)TurbineServices.getInstance().getService(JsonService.ROLE);
+        try
+        {
+            Class clazz = Class.forName(className);
+            result = jsonService.serializeOnlyFilter( src, clazz, refresh, 
props );
+        }
+        catch ( Exception e )
+        {
+            log.error(e.getMessage(),e );
+        }
+        return result;        
+    }
+]]></source>
+     You could then call the json method from this tool in a velocity template 
like this:
+     
+     <source><![CDATA[
+    #set ($json =   $!pullTool.getJson($items, "x.y.z.Item", true, "prop1", 
"prop2", "prop3" ) )
+    
+    ## parse json in javascript ....
+]]></source>
+     What you get is the JSON data populated with all the fields you need 
(depending on serialization parameters the format may vary).
+    
+    <h4>Configuration Requirements</h4>
+    <p>
+    Add <code>org.apache.fulcrum.json.jackson.SimpleNameIntrospector</code> to 
the annotation inspectors as primary or secondary inspector. Of course 
annotations are still valid, as the Introspector extends 
JacksonAnnotationIntrospector and additionally calls the super class methods in 
its overwritten methods.
+    </p>
+   </subsection>
+
+    <subsection name="Integration of JSON to Object Deserialization" 
id="deser">
+    <p>
+    This could be done just by providing the JSON data as client parameter to 
a JSON-RPC-Service function (cft. services->JSON-RPC-Service). As an example 
for the function:
+    </p>   
+    <source><![CDATA[
+      // class is registered in screen
+      public <T> void deSerJsonItem(String src ) {
+            JsonService jsonService = (JsonService)TurbineServices
+            .getInstance().getService(JsonService.ROLE);
+            try
+            {
+                Item result = jsonService.deSer( src, Item.class );
+                // do something with result
+            }
+            catch ( Exception e )
+            {
+                log.error(e.getMessage(),e );
+            }       
+        }       
+      }
+]]></source>
+     You could then call the JSON method in Javascript like this:
+     <source><![CDATA[
+       jsonrpc.myFunctions.deSerJsonUser( JSON.stringify(jsonuser) );
+]]></source>
+    </subsection>
+ 
+  </section>
 
-  <section name="GSONBuilderService">
+  <section name="JSON Service with GSO API">
     <subsection name="Role Configuration">
       <source><![CDATA[
     <role
@@ -53,7 +218,10 @@
       ]]></source>
     </subsection>
 
+      <subsection name="jackson2">
+      </subsection>
   </section>
+  
 
 </body>
 </document>


Reply via email to