You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by je...@apache.org on 2018/05/14 16:48:26 UTC

[sling-org-apache-sling-servlets-get] branch master updated (7b327f3 -> 5bded10)

This is an automated email from the ASF dual-hosted git repository.

jeb pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-get.git.


    from 7b327f3  SLING-7625 unit test fix with change in method name
     new fa6da77  SLING-7656 improvements to unit tests
     new 5bded10  SLING-7656 unit test improvements and ISO8601 support

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            |  25 ++--
 .../sling/servlets/get/impl/DefaultGetServlet.java |   8 +-
 .../servlets/get/impl/VersionInfoServlet.java      |  22 ++-
 .../servlets/get/impl/helpers/JsonRenderer.java    |   7 +-
 .../servlets/get/impl/helpers/XMLRenderer.java     |   4 +-
 .../servlets/get/impl/util/JsonObjectCreator.java  | 128 ++++++++---------
 .../servlets/get/impl/util/ResourceTraversor.java  |   7 +-
 .../servlets/get/impl/JsonRendererServletTest.java |  13 +-
 ...dererServletTest.java => HtmlRendererTest.java} |   6 +-
 .../get/impl/helpers/JsonRendererServletTest.java  | 112 ---------------
 .../get/impl/helpers/JsonRendererTest.java         | 152 +++++++++++++++++++++
 ...rerServletTest.java => StreamRendererTest.java} |   3 +-
 src/test/resources/data.json                       |  21 +++
 13 files changed, 299 insertions(+), 209 deletions(-)
 rename src/test/java/org/apache/sling/servlets/get/impl/helpers/{HtmlRendererServletTest.java => HtmlRendererTest.java} (94%)
 delete mode 100644 src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java
 create mode 100644 src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
 rename src/test/java/org/apache/sling/servlets/get/impl/helpers/{StreamRendererServletTest.java => StreamRendererTest.java} (98%)
 create mode 100644 src/test/resources/data.json

-- 
To stop receiving notification emails like this one, please contact
jeb@apache.org.

[sling-org-apache-sling-servlets-get] 02/02: SLING-7656 unit test improvements and ISO8601 support

Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jeb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-get.git

commit 5bded109eb764a528bbdc985730ca3dcc1f342be
Author: JE Bailey <je...@apache.org>
AuthorDate: Wed May 9 12:04:54 2018 -0400

    SLING-7656 unit test improvements and ISO8601 support
    
    added additional JSON responses to validate JSON is responding with
    correct values. Added ISO8601 date formatting and added test cases for
    both.
---
 pom.xml                                            |   4 +-
 .../sling/servlets/get/impl/DefaultGetServlet.java |   2 +-
 .../servlets/get/impl/VersionInfoServlet.java      |   2 +-
 .../servlets/get/impl/helpers/XMLRenderer.java     |   4 +-
 .../servlets/get/impl/util/JsonObjectCreator.java  | 102 +++++++++------------
 .../servlets/get/impl/JsonRendererServletTest.java |  13 +--
 .../get/impl/helpers/JsonRendererTest.java         |  38 +++++---
 src/test/resources/data.json                       |   2 +
 8 files changed, 82 insertions(+), 85 deletions(-)

diff --git a/pom.xml b/pom.xml
index b49ff5b..3a84a32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,7 +53,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
+                <extensions>true</extensions> 
                 <configuration>
                     <instructions>
                         <Import-Package>
@@ -156,7 +156,7 @@
                 	<artifactId>
                 		org.apache.sling.servlet-helpers
                 	</artifactId>
-                	<version>1.1.5-SNAPSHOT</version>
+                	<version>1.1.6</version>
                 	<type>bundle</type>
                 	<scope>test</scope>
                 </dependency>
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
index 50df111..778f763 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
@@ -129,7 +129,7 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
                   "200.")
         int json_maximumresults() default 200;
         
-        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        @AttributeDefinition(name = "ECMA date support", description="Enable deprecated ECMA formatting for JSON response")
         boolean ecmaSuport() default false;
     }
 
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
index 35b9fae..cdcfd67 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
@@ -81,7 +81,7 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
         @AttributeDefinition(name = "Selector", description="List of selectors this servlet handles to display the versions")
         String[] sling_servlet_selectors() default "V";
         
-        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        @AttributeDefinition(name = "ECMA date support", description="Enable deprecated ECMA formatting for JSON response")
         boolean ecmaSuport() default false;
     }
     
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java b/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java
index cda2b78..4c94161 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java
@@ -83,9 +83,7 @@ public class XMLRenderer implements Renderer {
                     } else {
                         resp.sendError(HttpServletResponse.SC_NO_CONTENT); // NO Content
                     }
-                } catch (RepositoryException e) {
-                    throw new ServletException("Unable to export resource as xml: " + r, e);
-                } catch (SAXException e) {
+                } catch (RepositoryException|SAXException e) {
                     throw new ServletException("Unable to export resource as xml: " + r, e);
                 }
             } else {
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
index 6f587cd..5cf4d0a 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
@@ -39,6 +39,12 @@ import org.apache.sling.api.resource.ValueMap;
 
 public class JsonObjectCreator {
 	
+    /** Used to format date values */
+    private static final String ECMA_DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z";
+
+    /** The Locale used to format date values */
+    static final Locale DATE_FORMAT_LOCALE = Locale.US;
+	
 	private Resource resource;
 	
 	private ValueMap valueMap;
@@ -50,53 +56,39 @@ public class JsonObjectCreator {
 		this.valueMap = resource.getValueMap();
 		this.ecmaSupport = ecmaSupport;
 	}
-
-    public JsonObjectBuilder create() {
-
-        final JsonObjectBuilder obj = Json.createObjectBuilder();
-
-        if (valueMap.isEmpty()) {
-
-            // no map available, try string
-            final String value = resource.adaptTo(String.class);
-            if (value != null) {
-                obj.add(resource.getName(), value.toString());
-            } else {
-                // Try multi-value "property"
-                final String[] values = resource.adaptTo(String[].class);
-                if (values != null) {
-                    JsonArrayBuilder builder = Json.createArrayBuilder();
-                    for (String v : values)
-                    {
-                        builder.add(v);
-                    }
-                    obj.add(resource.getName(), builder);
-                }
-
-            }
-
-        } else {
-
-            final Iterator<Map.Entry<String,Object>> props = valueMap.entrySet().iterator();
-
-            // the node's actual properties
-            while (props.hasNext()) {
-                final Map.Entry<String,Object> prop = props.next();
-                if ( prop.getValue() != null ) {
-                    createProperty(obj, prop.getKey(), prop.getValue());
-                }
-            }
-        }
-
-        return obj;
-    }
-
-    /** Used to format date values */
-    private static final String ECMA_DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z";
-
-    /** The Locale used to format date values */
-    static final Locale DATE_FORMAT_LOCALE = Locale.US;
-
+	
+	public JsonObjectBuilder create() {
+		final JsonObjectBuilder obj = Json.createObjectBuilder();
+		
+		ValueMap valueMap = resource.getValueMap();
+		if (valueMap.isEmpty()) {
+			final String value = resource.adaptTo(String.class);
+			if (value != null) {
+				obj.add(resource.getName(), value.toString());
+			}  else {
+				final String[] values = resource.adaptTo(String[].class);
+				if (values != null) {
+					JsonArrayBuilder builder = Json.createArrayBuilder();
+					for (String v : values) {
+						builder.add(v);
+					}
+					obj.add(resource.getName(), builder);
+				}
+			}
+			return obj;
+		} 
+
+		final Iterator<Map.Entry<String, Object>> props = valueMap.entrySet().iterator();
+
+		while (props.hasNext()) {
+			final Map.Entry<String, Object> prop = props.next();
+			if (prop.getValue() != null) {
+				createProperty(obj, prop.getKey(), prop.getValue());
+			}
+		}
+
+		return obj;
+	}
     
     public static String formatEcma(final Calendar date) {
         DateFormat formatter = new SimpleDateFormat(ECMA_DATE_FORMAT, DATE_FORMAT_LOCALE);
@@ -121,8 +113,6 @@ public class JsonObjectCreator {
             builder.add("entry", (Boolean) value);
         } else if ( value instanceof Long ) {
             builder.add("entry", (Long) value);
-        } else if ( value instanceof Integer ) {
-            builder.add("entry", (Integer) value);
         } else if ( value instanceof Double ) {
             builder.add("entry", (Double) value);
         } else if ( value != null ) {
@@ -161,7 +151,7 @@ public class JsonObjectCreator {
             // (colon is not allowed as a JCR property name)
             // in the name, and the value should be the size of the binary data
             if (values == null) {
-                obj.add(":" + key, getLength(-1, key, (InputStream)value));
+                obj.add(":" + key, getLength(0, key, (InputStream)value));
             } else {
                 final JsonArrayBuilder result = Json.createArrayBuilder();
                 for (int i = 0; i < values.length; i++) {
@@ -191,14 +181,10 @@ public class JsonObjectCreator {
         } catch (IOException ignore) {}
         long length = -1;
         if ( valueMap != null ) {
-            if ( index == -1 ) {
-                length = valueMap.get(key, length);
-            } else {
-                Long[] lengths = valueMap.get(key, Long[].class);
-                if ( lengths != null && lengths.length > index ) {
-                    length = lengths[index];
-                }
-            }
+        	 Long[] lengths = valueMap.get(key, Long[].class);
+             if ( lengths != null && lengths.length > index ) {
+                 length = lengths[index];
+             }
         }
         return length;
     }
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
index a86cee0..99b7fa5 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
@@ -18,17 +18,14 @@
  */
 package org.apache.sling.servlets.get.impl;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
+import static org.junit.Assert.assertEquals;
+
 import org.apache.sling.commons.testing.sling.MockResource;
 import org.apache.sling.commons.testing.sling.MockResourceResolver;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletResponse;
 import org.apache.sling.servlets.get.impl.helpers.JsonRenderer;
 
-import static org.junit.Assert.assertEquals;
-import junitx.util.PrivateAccessor;
-
 public class JsonRendererServletTest {
 
 	private static MockResourceResolver resolver;
@@ -79,10 +76,8 @@ public class JsonRendererServletTest {
 		request.setResource(resolver.getResource(path));
 
 		MockSlingHttpServletResponse response = new MockSlingHttpServletResponse();
-		JsonRenderer servlet = new JsonRenderer(1000,true);
-		PrivateAccessor.invoke(servlet, "render",
-				new Class[]{SlingHttpServletRequest.class, SlingHttpServletResponse.class},
-				new Object[]{request, response});
+		JsonRenderer renderer = new JsonRenderer(1000,true);
+		renderer.render(request, response);
 		return response.getOutput().toString();
 	}
 }
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
index e6d971d..b28db92 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
@@ -28,7 +28,6 @@ import java.util.Calendar;
 
 import javax.json.Json;
 import javax.json.JsonObject;
-import javax.json.JsonReader;
 
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
@@ -110,27 +109,44 @@ public class JsonRendererTest {
     @Test
     public void testISO8601() throws IOException {
     	context.requestPathInfo().setSelectorString("1");
-        jrs.render(request, response);
-        StringReader reader = new StringReader(response.getOutputAsString());
-        JsonObject job = Json.createReader(reader).readObject();
-        String created = job.getString("created");
+        String created = responseToJSON().getString("created");
         Calendar cal = ISO8601.parse(created);
         // at the time of the test the offset it not preserved
-        // if we did direct string comparison the time would be different based on the testers
-        // time zone
-        assertTrue(ISO8601.getYear(cal) == 2016);
+        // if we did direct string comparison the time would be different
+        // based on the testing environments time zone
+        assertTrue(cal != null && ISO8601.getYear(cal) == 2016);
     }
     
     @Test
     public void testECMA() throws IOException {
     	context.requestPathInfo().setSelectorString("1");
-    	jrs = new JsonRenderer(42,true);
-        jrs.render(request, response);
-        String out = response.getOutputAsString();
+    	JsonRenderer ecmajrs = new JsonRenderer(42,true);
+    	ecmajrs.render(request, response);
+    	String out = response.getOutputAsString();
         JsonObject job = Json.createReader(new StringReader(out)).readObject();
         String created = job.getString("created");
         assertTrue(created.startsWith("Mon Jan"));
     }
     
+    @Test
+    public void testBoolean() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+        assertTrue(responseToJSON().getBoolean("active"));
+    }
+    
+    @Test
+     // JSON impl only support Integers, JCR only supports Long values.  
+    public void testNumber() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+        assertTrue(responseToJSON().getInt("number") == 2);
+    }
+    
+    private JsonObject responseToJSON() throws IOException {
+        jrs.render(request, response);
+        String out = response.getOutputAsString();
+        JsonObject job = Json.createReader(new StringReader(out)).readObject();
+        return job;
+    }
+    
     
 }
\ No newline at end of file
diff --git a/src/test/resources/data.json b/src/test/resources/data.json
index 7619a4f..8f2baea 100644
--- a/src/test/resources/data.json
+++ b/src/test/resources/data.json
@@ -1,6 +1,8 @@
 {
   "resourceType":"page",
   "created" : "Mon Jan 18 2016 16:30:00 GMT+0200",
+  "active" : true,
+  "number" : 2,
   "one":
   {
     "resourceType":"one"

-- 
To stop receiving notification emails like this one, please contact
jeb@apache.org.

[sling-org-apache-sling-servlets-get] 01/02: SLING-7656 improvements to unit tests

Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jeb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-get.git

commit fa6da778a3cc9075c79d6a4c60480c6d879fbdf3
Author: JE Bailey <je...@apache.org>
AuthorDate: Mon May 7 08:51:01 2018 -0400

    SLING-7656 improvements to unit tests
---
 pom.xml                                            |  23 ++--
 .../sling/servlets/get/impl/DefaultGetServlet.java |   8 +-
 .../servlets/get/impl/VersionInfoServlet.java      |  22 +++-
 .../servlets/get/impl/helpers/JsonRenderer.java    |   7 +-
 .../servlets/get/impl/util/JsonObjectCreator.java  |  42 ++++---
 .../servlets/get/impl/util/ResourceTraversor.java  |   7 +-
 .../servlets/get/impl/JsonRendererServletTest.java |   2 +-
 ...dererServletTest.java => HtmlRendererTest.java} |   6 +-
 .../get/impl/helpers/JsonRendererServletTest.java  | 112 -----------------
 .../get/impl/helpers/JsonRendererTest.java         | 136 +++++++++++++++++++++
 ...rerServletTest.java => StreamRendererTest.java} |   3 +-
 src/test/resources/data.json                       |  19 +++
 12 files changed, 240 insertions(+), 147 deletions(-)

diff --git a/pom.xml b/pom.xml
index bc8133d..b49ff5b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -97,12 +97,6 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-json_1.0_spec</artifactId>
-            <version>1.0-alpha-1</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
             <groupId>org.apache.jackrabbit</groupId>
             <artifactId>jackrabbit-jcr-commons</artifactId>
             <version>2.2.9</version>
@@ -149,7 +143,22 @@
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.johnzon</artifactId>
             <version>1.0.0</version>
-            <scope>test</scope>
+            <scope>provided</scope>
+        </dependency>
+                <dependency>
+        	<groupId>org.apache.sling</groupId>
+        	<artifactId>org.apache.sling.testing.sling-mock</artifactId>
+        	<version>2.2.10</version>
+        	<scope>test</scope>
         </dependency>
+                        <dependency>
+                	<groupId>org.apache.sling</groupId>
+                	<artifactId>
+                		org.apache.sling.servlet-helpers
+                	</artifactId>
+                	<version>1.1.5-SNAPSHOT</version>
+                	<type>bundle</type>
+                	<scope>test</scope>
+                </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
index 05d6015..50df111 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
@@ -128,6 +128,9 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
                   "this basically means the number of Objects to return. Default value is " +
                   "200.")
         int json_maximumresults() default 200;
+        
+        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        boolean ecmaSuport() default false;
     }
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -155,6 +158,8 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
 
     @Reference(policyOption = ReferencePolicyOption.GREEDY)
     private XSSAPI xssApi;
+
+	private boolean enableEcmaSupport;
     
     public static final String EXT_HTML = "html";
 
@@ -180,6 +185,7 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
         this.enableJson = cfg.enable_json();
         this.enableXml = cfg.enable_xml();
         this.jsonMaximumResults = cfg.json_maximumresults();
+        this.enableEcmaSupport = cfg.ecmaSuport();
     }
 
     @Deactivate
@@ -198,7 +204,7 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
         } else if ( EXT_TXT.equals(type) ) {
             renderer = new PlainTextRenderer();
         } else if (EXT_JSON.equals(type) ) {
-            renderer = new JsonRenderer(jsonMaximumResults);
+            renderer = new JsonRenderer(jsonMaximumResults, enableEcmaSupport);
         } else if ( EXT_XML.equals(type) ) {
             renderer = new XMLRenderer();
         }
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
index 31b786c..35b9fae 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
@@ -21,6 +21,7 @@ package org.apache.sling.servlets.get.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.List;
 
@@ -39,12 +40,14 @@ import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
 import org.apache.sling.servlets.get.impl.util.JsonObjectCreator;
 import org.apache.sling.servlets.get.impl.util.JsonToText;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.ConfigurationPolicy;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
@@ -77,8 +80,14 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
 
         @AttributeDefinition(name = "Selector", description="List of selectors this servlet handles to display the versions")
         String[] sling_servlet_selectors() default "V";
+        
+        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        boolean ecmaSuport() default false;
     }
+    
     private static final long serialVersionUID = 1656887064561951302L;
+    
+    private boolean ecmaSupport;
 
     /** Selector that means "pretty-print the output */
     public static final String TIDY = "tidy";
@@ -93,6 +102,11 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
     public static final int INDENT_SPACES = 2;
     
     private final JsonToText renderer = new JsonToText();
+    
+    @Activate
+    private void activate(Config config) {
+    	this.ecmaSupport = config.ecmaSuport();
+    }
 
     @Override
     public void doGet(SlingHttpServletRequest req, SlingHttpServletResponse resp) throws ServletException,
@@ -176,8 +190,12 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
         return false;
     }
 
-    private static String createdDate(Node node) throws RepositoryException {
-        return JsonObjectCreator.format(node.getProperty(JcrConstants.JCR_CREATED).getDate());
+    private String createdDate(Node node) throws RepositoryException {
+    	Calendar cal = node.getProperty(JcrConstants.JCR_CREATED).getDate();
+    	if (ecmaSupport) {
+            return JsonObjectCreator.formatEcma(cal);
+    	}
+    	return ISO8601.format(cal);
     }
 
 }
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java b/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java
index f8fbbed..dbfbcf2 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java
@@ -61,8 +61,11 @@ public class JsonRenderer implements Renderer {
 
     private final JsonToText renderer = new JsonToText();
 
-    public JsonRenderer(long maximumResults) {
+	private boolean ecmaSupport;
+
+    public JsonRenderer(long maximumResults, boolean ecmaSupport) {
         this.maximumResults = maximumResults;
+        this.ecmaSupport = ecmaSupport;
     }
 
     public void render(SlingHttpServletRequest req,
@@ -91,7 +94,7 @@ public class JsonRenderer implements Renderer {
         final boolean harray = hasSelector(req, HARRAY);
         ResourceTraversor traversor = null;
         try {
-            traversor = new ResourceTraversor(maxRecursionLevels, maximumResults, r);
+            traversor = new ResourceTraversor(maxRecursionLevels, maximumResults, r, ecmaSupport);
             allowedLevel = traversor.collectResources();
             if ( allowedLevel != -1 ) {
                 allowDump = false;
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
index 49d8caf..6f587cd 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
@@ -33,13 +33,25 @@ import javax.json.JsonArrayBuilder;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonValue;
 
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
 
-public abstract class JsonObjectCreator {
+public class JsonObjectCreator {
+	
+	private Resource resource;
+	
+	private ValueMap valueMap;
 
-    public static JsonObjectBuilder create(final Resource resource) {
-        final ValueMap valueMap = resource.getValueMap();
+	private boolean ecmaSupport;
+
+	public JsonObjectCreator(Resource resource, boolean ecmaSupport) {
+		this.resource = resource;
+		this.valueMap = resource.getValueMap();
+		this.ecmaSupport = ecmaSupport;
+	}
+
+    public JsonObjectBuilder create() {
 
         final JsonObjectBuilder obj = Json.createObjectBuilder();
 
@@ -71,7 +83,7 @@ public abstract class JsonObjectCreator {
             while (props.hasNext()) {
                 final Map.Entry<String,Object> prop = props.next();
                 if ( prop.getValue() != null ) {
-                    createProperty(obj, valueMap, prop.getKey(), prop.getValue());
+                    createProperty(obj, prop.getKey(), prop.getValue());
                 }
             }
         }
@@ -85,22 +97,26 @@ public abstract class JsonObjectCreator {
     /** The Locale used to format date values */
     static final Locale DATE_FORMAT_LOCALE = Locale.US;
 
-
-    public static String format(final Calendar date) {
+    
+    public static String formatEcma(final Calendar date) {
         DateFormat formatter = new SimpleDateFormat(ECMA_DATE_FORMAT, DATE_FORMAT_LOCALE);
         formatter.setTimeZone(date.getTimeZone());
         return formatter.format(date.getTime());
     }
 
     /** Dump only a value in the correct format */
-    private static JsonValue getValue(final Object value) {
+    private JsonValue getValue(final Object value ) {
         JsonObjectBuilder builder = Json.createObjectBuilder();
 
         if ( value instanceof InputStream ) {
             // input stream is already handled
             builder.add("entry", 0);
         } else if ( value instanceof Calendar ) {
-            builder.add("entry", format((Calendar)value));
+        	if (ecmaSupport) {
+        		builder.add("entry", JsonObjectCreator.formatEcma((Calendar)value));
+        	} else {
+        		builder.add("entry", ISO8601.format(((Calendar)value)));
+        	}
         } else if ( value instanceof Boolean ) {
             builder.add("entry", (Boolean) value);
         } else if ( value instanceof Long ) {
@@ -120,8 +136,7 @@ public abstract class JsonObjectCreator {
     /**
      * Write a single property
      */
-    private static void createProperty(final JsonObjectBuilder obj,
-                                 final ValueMap valueMap,
+    private void createProperty(final JsonObjectBuilder obj,
                                  final String key,
                                  final Object value) {
         Object[] values = null;
@@ -146,11 +161,11 @@ public abstract class JsonObjectCreator {
             // (colon is not allowed as a JCR property name)
             // in the name, and the value should be the size of the binary data
             if (values == null) {
-                obj.add(":" + key, getLength(valueMap, -1, key, (InputStream)value));
+                obj.add(":" + key, getLength(-1, key, (InputStream)value));
             } else {
                 final JsonArrayBuilder result = Json.createArrayBuilder();
                 for (int i = 0; i < values.length; i++) {
-                    result.add(getLength(valueMap, i, key, (InputStream)values[i]));
+                    result.add(getLength(i, key, (InputStream)values[i]));
                 }
                 obj.add(":" + key, result);
             }
@@ -168,8 +183,7 @@ public abstract class JsonObjectCreator {
         }
     }
 
-    private static long getLength(final ValueMap    valueMap,
-                           final int         index,
+    private long getLength(final int         index,
                            final String      key,
                            final InputStream stream) {
         try {
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java b/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java
index c42df33..d93aa2d 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java
@@ -49,6 +49,8 @@ public class ResourceTraversor
 
     private final Resource startResource;
 
+	private boolean ecmaSupport;
+
     /** Create a ResourceTraversor, optionally limiting recursion and total number of resources
      * @param levels recursion levels limit, -1 means no limit
      * @param maxResources maximum number of resources to collect, ignored if levels == 1
@@ -56,12 +58,13 @@ public class ResourceTraversor
      * @param tidy not used
      * @throws JSONException
      */
-    public ResourceTraversor(final int levels, final long maxResources, final Resource resource) {
+    public ResourceTraversor(final int levels, final long maxResources, final Resource resource, boolean ecmaSupport) {
         this.maxResources = maxResources;
         this.maxRecursionLevels = levels;
         this.startResource = resource;
         currentQueue = new LinkedList<>();
         nextQueue = new LinkedList<>();
+        this.ecmaSupport = ecmaSupport;
         this.startObject = this.adapt(resource);
     }
 
@@ -135,7 +138,7 @@ public class ResourceTraversor
      * @throws JSONException
      */
     private JsonObjectBuilder adapt(final Resource resource) {
-        return JsonObjectCreator.create(resource);
+        return new JsonObjectCreator(resource,ecmaSupport).create();
     }
 
     public JsonObject getJSONObject() {
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
index 6c5ee91..a86cee0 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
@@ -79,7 +79,7 @@ public class JsonRendererServletTest {
 		request.setResource(resolver.getResource(path));
 
 		MockSlingHttpServletResponse response = new MockSlingHttpServletResponse();
-		JsonRenderer servlet = new JsonRenderer(1000);
+		JsonRenderer servlet = new JsonRenderer(1000,true);
 		PrivateAccessor.invoke(servlet, "render",
 				new Class[]{SlingHttpServletRequest.class, SlingHttpServletResponse.class},
 				new Object[]{request, response});
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererTest.java
similarity index 94%
rename from src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererServletTest.java
rename to src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererTest.java
index b7feaf8..72a3a1b 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererTest.java
@@ -35,7 +35,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-public class HtmlRendererServletTest {
+public class HtmlRendererTest {
 
     private SlingHttpServletRequest request;
     private SlingHttpServletResponse response;
@@ -64,9 +64,7 @@ public class HtmlRendererServletTest {
     public void testEscaping() throws ServletException, IOException {
         XSSAPI xss = Mockito.mock(XSSAPI.class);
 
-        final HtmlRenderer servlet = new HtmlRenderer(xss);
-
-        servlet.render(request, response);
+        new HtmlRenderer(xss).render(request, response);
 
         Mockito.verify(xss).encodeForHTML("<script>alert(1);</script>");
     }
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java
deleted file mode 100644
index b2c5cd3..0000000
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sling.servlets.get.impl.helpers;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.request.RequestPathInfo;
-import org.apache.sling.api.resource.Resource;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Matchers;
-import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class JsonRendererServletTest {
-    
-    private SlingHttpServletRequest request;
-    private SlingHttpServletResponse response;
-    private String [] selectors;
-    private JsonRenderer jrs;
-    
-    @Before
-    public void setup() {
-        request = Mockito.mock(SlingHttpServletRequest.class);
-        
-        final RequestPathInfo rpi = Mockito.mock(RequestPathInfo.class);
-        Mockito.when(request.getRequestPathInfo()).thenReturn(rpi);
-        Mockito.when(rpi.getSelectors()).thenAnswer(new Answer<String[]>(){
-            public String [] answer(InvocationOnMock invocation) {
-                return selectors;
-            }
-        });
-        
-        final Resource resource = Mockito.mock(Resource.class);
-        Mockito.when(request.getResource()).thenReturn(resource);
-        
-        response = Mockito.mock(SlingHttpServletResponse.class);
-        
-        jrs = new JsonRenderer(42);
-    }
-    
-    @Test
-    public void testRecursionLevelA() {
-        selectors = new String[] { "12" };
-        assertEquals(12, jrs.getMaxRecursionLevel(request));
-        assertFalse(jrs.isTidy(request));
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void testRecursionLevelB() {
-        selectors = new String[] { "42", "more" };
-        jrs.getMaxRecursionLevel(request);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void testRecursionLevelC() {
-        selectors = new String[] { "more" };
-        jrs.getMaxRecursionLevel(request);
-    }
-    
-    @Test
-    public void testRecursionLevelD() {
-        selectors = new String[] { "tidy" };
-        assertEquals(0, jrs.getMaxRecursionLevel(request));
-    }
-
-    @Test
-    public void testRecursionLevelE() {
-        // Level must be the last selector but
-        // if the last selector is "tidy" there's
-        // no error. "for historical reasons"
-        selectors = new String[] { "46", "tidy" };
-        assertEquals(0, jrs.getMaxRecursionLevel(request));
-    }
-
-    @Test
-    public void testRecursionLevelF() {
-        selectors = new String[] { "tidy", "45" };
-        assertEquals(45, jrs.getMaxRecursionLevel(request));
-        assertTrue(jrs.isTidy(request));
-    }
-    
-    @Test
-    public void testBadRequest() throws IOException {
-        selectors = new String[] { "bad", "selectors" };
-        jrs.render(request, response);
-        Mockito.verify(response, Mockito.times(1)).sendError(Matchers.anyInt(), Matchers.anyString());
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
new file mode 100644
index 0000000..e6d971d
--- /dev/null
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.servlets.get.impl.helpers;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Calendar;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+
+import org.apache.jackrabbit.util.ISO8601;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest;
+import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class JsonRendererTest {
+    
+	@Rule
+	public final SlingContext context = new SlingContext();
+	
+    private MockSlingHttpServletRequest request;
+    private MockSlingHttpServletResponse response;
+
+    private JsonRenderer jrs;
+    
+    @Before
+    public void setup() {
+    	context.load().json("/data.json", "/content");
+        request = context.request();
+        response = context.response();
+        
+        context.currentResource("/content");
+        
+        jrs = new JsonRenderer(42,false);
+    }
+    
+    @Test
+    public void testRecursionLevelA() {
+    	context.requestPathInfo().setSelectorString("12");
+        assertEquals(12, jrs.getMaxRecursionLevel(request));
+        assertFalse(jrs.isTidy(request));
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testRecursionLevelB() {
+    	context.requestPathInfo().setSelectorString("42.more");
+        jrs.getMaxRecursionLevel(request);
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testRecursionLevelC() {
+    	context.requestPathInfo().setSelectorString("more");
+        jrs.getMaxRecursionLevel(request);
+    }
+    
+    @Test
+    public void testRecursionLevelD() {
+    	context.requestPathInfo().setSelectorString("tidy");
+        assertEquals(0, jrs.getMaxRecursionLevel(request));
+    }
+
+    @Test
+    public void testRecursionLevelE() {
+        // Level must be the last selector but
+        // if the last selector is "tidy" there's
+        // no error. "for historical reasons"
+    	context.requestPathInfo().setSelectorString("46.tidy");
+        assertEquals(0, jrs.getMaxRecursionLevel(request));
+    }
+
+    @Test
+    public void testRecursionLevelF() {
+    	context.requestPathInfo().setSelectorString("tidy.45");
+        assertEquals(45, jrs.getMaxRecursionLevel(request));
+        assertTrue(jrs.isTidy(request));
+    }
+    
+    @Test
+    public void testBadRequest() throws IOException {
+    	context.requestPathInfo().setSelectorString("bad.selectors");
+        jrs.render(request, response);
+        assertTrue(response.getStatus() == 400);
+    }
+    
+    @Test
+    public void testISO8601() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+        jrs.render(request, response);
+        StringReader reader = new StringReader(response.getOutputAsString());
+        JsonObject job = Json.createReader(reader).readObject();
+        String created = job.getString("created");
+        Calendar cal = ISO8601.parse(created);
+        // at the time of the test the offset it not preserved
+        // if we did direct string comparison the time would be different based on the testers
+        // time zone
+        assertTrue(ISO8601.getYear(cal) == 2016);
+    }
+    
+    @Test
+    public void testECMA() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+    	jrs = new JsonRenderer(42,true);
+        jrs.render(request, response);
+        String out = response.getOutputAsString();
+        JsonObject job = Json.createReader(new StringReader(out)).readObject();
+        String created = job.getString("created");
+        assertTrue(created.startsWith("Mon Jan"));
+    }
+    
+    
+}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererTest.java
similarity index 98%
rename from src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererServletTest.java
rename to src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererTest.java
index 2423ecb..8318196 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererTest.java
@@ -34,7 +34,7 @@ import org.apache.sling.api.resource.ResourceMetadata;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-public class StreamRendererServletTest {
+public class StreamRendererTest {
 
     @Test
     public void testCopyRange() throws IOException {
@@ -135,7 +135,6 @@ public class StreamRendererServletTest {
         final ResourceMetadata meta = Mockito.mock(ResourceMetadata.class);
         final ServletContext sc = Mockito.mock(ServletContext.class);
         
-        @SuppressWarnings("serial")
 		StreamRenderer streamRendererServlet = new StreamRenderer(true,new String []{"/"},sc);       
 
         Mockito.when(resource.getResourceMetadata()).thenReturn(meta);
diff --git a/src/test/resources/data.json b/src/test/resources/data.json
new file mode 100644
index 0000000..7619a4f
--- /dev/null
+++ b/src/test/resources/data.json
@@ -0,0 +1,19 @@
+{
+  "resourceType":"page",
+  "created" : "Mon Jan 18 2016 16:30:00 GMT+0200",
+  "one":
+  {
+    "resourceType":"one"
+  },
+  "two":
+  {
+    "resourceType":"two"
+  },
+  "etc":
+  {
+    "resourceType":"etc",
+    "tags" : {
+        "resourceType" : "tags"
+    }
+  }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
jeb@apache.org.