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.
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 @@
"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 @@
@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 @@
} 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 @@
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 @@
this.valueMap = resource.getValueMap();
this.ecmaSupport = ecmaSupport;
}
+
+ 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;
+ }
- public JsonObjectBuilder create() {
+ final Iterator<Map.Entry<String, Object>> props = valueMap.entrySet().iterator();
- final JsonObjectBuilder obj = Json.createObjectBuilder();
+ while (props.hasNext()) {
+ final Map.Entry<String, Object> prop = props.next();
+ if (prop.getValue() != null) {
+ createProperty(obj, prop.getKey(), prop.getValue());
+ }
+ }
- 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;
-
+ return obj;
+ }
public static String formatEcma(final Calendar date) {
DateFormat formatter = new SimpleDateFormat(ECMA_DATE_FORMAT, DATE_FORMAT_LOCALE);
@@ -121,8 +113,6 @@
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 @@
// (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 @@
} 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 @@
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 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 @@
@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"