Author: pauls Date: Tue Mar 28 13:02:05 2017 New Revision: 1789112 URL: http://svn.apache.org/viewvc?rev=1789112&view=rev Log: SLING-6681: Replace commons.json usage in org.apache.sling.servlets.post
Modified: sling/trunk/bundles/servlets/post/pom.xml sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/JSONResponse.java sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java Modified: sling/trunk/bundles/servlets/post/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/pom.xml?rev=1789112&r1=1789111&r2=1789112&view=diff ============================================================================== --- sling/trunk/bundles/servlets/post/pom.xml (original) +++ sling/trunk/bundles/servlets/post/pom.xml Tue Mar 28 13:02:05 2017 @@ -22,7 +22,7 @@ <parent> <groupId>org.apache.sling</groupId> <artifactId>sling</artifactId> - <version>30</version> + <version>29</version> <relativePath /> </parent> @@ -150,12 +150,6 @@ </dependency> <dependency> <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.commons.json</artifactId> - <version>2.0.2-incubator</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.jcr.contentloader</artifactId> <version>2.1.10</version> <scope>provided</scope> @@ -167,6 +161,12 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.commons.johnzon</artifactId> + <version>0.1.0-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.commons.testing</artifactId> <version>2.0.10</version> Modified: sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/JSONResponse.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/JSONResponse.java?rev=1789112&r1=1789111&r2=1789112&view=diff ============================================================================== --- sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/JSONResponse.java (original) +++ sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/JSONResponse.java Tue Mar 28 13:02:05 2017 @@ -18,12 +18,17 @@ */ package org.apache.sling.servlets.post; -import org.apache.sling.commons.json.JSONArray; -import org.apache.sling.commons.json.JSONException; -import org.apache.sling.commons.json.JSONObject; - +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * The <code>JSONResponse</code> is an {@link AbstractPostResponse} preparing @@ -44,47 +49,28 @@ public class JSONResponse extends Abstra private static final String PROP_CHANGES = "changes"; - private JSONObject json = new JSONObject(); + private Map<String, Object> json = new HashMap<>(); - private JSONArray changes = new JSONArray(); + private List<Map<String, Object>> changes = new ArrayList<>(); private Throwable error; - public JSONResponse() throws JSONResponseException { - try { - json = new JSONObject(); - changes = new JSONArray(); - json.put(PROP_CHANGES, changes); - } catch (Throwable e) { - throw new JSONResponseException(e); + public void onChange(String type, String... arguments) { + Map<String,Object> change = new HashMap<>(); + change.put(PROP_TYPE, type); + + if (arguments.length > 1) { + change.put(PROP_ARGUMENT, Arrays.asList(arguments)); } - } - - public void onChange(String type, String... arguments) - throws JSONResponseException { - try { - JSONObject change = new JSONObject(); - change.put(PROP_TYPE, type); - for (String argument : arguments) { - change.accumulate(PROP_ARGUMENT, argument); - } - changes.put(change); - } catch (JSONException e) { - throw new JSONResponseException(e); + else if (arguments.length == 1) { + change.put(PROP_ARGUMENT, arguments[0]); } + changes.add(change); } @Override public void setError(Throwable error) { - try { - this.error = error; - JSONObject jsonError = new JSONObject(); - jsonError.put("class", error.getClass().getName()); - jsonError.put("message", error.getMessage()); - json.put("error", jsonError); - } catch (JSONException e) { - throw new JSONResponseException(e); - } + this.error = error; } @Override @@ -94,26 +80,13 @@ public class JSONResponse extends Abstra @Override public void setProperty(String name, Object value) { - try { - this.json.put(name, value); - } catch (Throwable e) { - throw new JSONResponseException("Error setting JSON property '" - + name + "' to '" + value + "'", e); - } + json.put(name, value); } @Override - public Object getProperty(String name) throws JSONResponseException { - try { - if (json.has(name)) { - return json.get(name); - } else { - return null; - } - } catch (JSONException e) { - throw new JSONResponseException("Error getting JSON property '" - + name + "'", e); - } + public Object getProperty(String name) { + return PROP_CHANGES.equals(name) ? getJson().getJsonArray(PROP_CHANGES) : + "error".equals(name) && this.error != null ? getJson().get("error") : json.get(name); } @SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" }) @@ -123,27 +96,59 @@ public class JSONResponse extends Abstra response.setContentType(RESPONSE_CONTENT_TYPE); response.setCharacterEncoding(RESPONSE_CHARSET); - try { - json.write(response.getWriter()); - } catch (JSONException e) { - IOException ioe = new IOException("Error creating JSON response"); - ioe.initCause(e); - throw ioe; - } + Json.createGenerator(response.getWriter()).write(getJson()).close(); } - JSONObject getJson() { - return json; + JsonObject getJson() { + JsonObjectBuilder jsonBuilder = Json.createObjectBuilder(); + for (Map.Entry<String, Object> entry : json.entrySet()) { + if (entry.getValue() != null) { + jsonBuilder.add(entry.getKey(), entry.getValue().toString()); + } + else { + jsonBuilder.addNull(entry.getKey()); + } + } + if (this.error != null) { + jsonBuilder + .add("error", Json.createObjectBuilder() + .add("class", error.getClass().getName()) + .add("message", error.getMessage())); + } + JsonArrayBuilder changesBuilder = Json.createArrayBuilder(); + for (Map<String, Object> entry : changes) { + JsonObjectBuilder entryBuilder = Json.createObjectBuilder(); + entryBuilder.add(PROP_TYPE, (String) entry.get(PROP_TYPE)); + + Object arguments = entry.get(PROP_ARGUMENT); + + if (arguments != null) { + if (arguments instanceof List) { + JsonArrayBuilder argumentsBuilder = Json.createArrayBuilder(); + + for (String argument : ((List<String>) arguments)) + { + argumentsBuilder.add(argument); + } + + entryBuilder.add(PROP_ARGUMENT, argumentsBuilder); + } + else { + entryBuilder.add(PROP_ARGUMENT, (String) arguments); + } + } + changesBuilder.add(entryBuilder); + } + jsonBuilder.add(PROP_CHANGES, changesBuilder); + return jsonBuilder.build(); } - + public class JSONResponseException extends RuntimeException { - public JSONResponseException(String message, Throwable exception) { - super(message, exception); + super(message, exception); } - public JSONResponseException(Throwable e) { - super("Error building JSON response", e); + super("Error building JSON response", e); } } } Modified: sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java?rev=1789112&r1=1789111&r2=1789112&view=diff ============================================================================== --- sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java (original) +++ sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java Tue Mar 28 13:02:05 2017 @@ -18,16 +18,19 @@ package org.apache.sling.servlets.post; import java.io.IOException; +import java.io.StringReader; import java.util.HashMap; import java.util.Map; +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonString; +import javax.json.JsonValue; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; -import org.apache.sling.commons.json.JSONArray; -import org.apache.sling.commons.json.JSONException; -import org.apache.sling.commons.json.JSONObject; import org.apache.sling.commons.testing.sling.MockSlingHttpServletResponse; public class JsonResponseTest extends TestCase { @@ -41,38 +44,38 @@ public class JsonResponseTest extends Te public void testOnChange() throws Exception { res.onChange("modified", "argument1", "argument2"); Object prop = res.getProperty("changes"); - JSONArray changes = assertInstanceOf(prop, JSONArray.class); - assertEquals(1, changes.length()); - Object obj = changes.get(0); - JSONObject change = assertInstanceOf(obj, JSONObject.class); - assertEquals("modified", assertProperty(change, JSONResponse.PROP_TYPE, String.class)); - JSONArray arguments = assertProperty(change, JSONResponse.PROP_ARGUMENT, JSONArray.class); - assertEquals(2, arguments.length()); + JsonArray changes = assertInstanceOf(prop, JsonArray.class); + assertEquals(1, changes.size()); + Object obj = changes.getJsonObject(0); + JsonObject change = assertInstanceOf(obj, JsonObject.class); + assertProperty(change, JSONResponse.PROP_TYPE, "modified"); + JsonArray arguments = change.getJsonArray(JSONResponse.PROP_ARGUMENT); + assertEquals(2, arguments.size()); } public void testSetProperty() throws Exception { res.setProperty("prop", "value"); - assertProperty(res.getJson(), "prop", String.class); + assertProperty(res.getJson(), "prop", "value"); } @SuppressWarnings({"ThrowableInstanceNeverThrown"}) - public void testSetError() throws IOException, JSONException { + public void testSetError() throws IOException { String errMsg = "Dummy error"; res.setError(new Error(errMsg)); MockSlingHttpServletResponse resp = new MockSlingHttpServletResponse(); res.send(resp, true); - JSONObject json = res.getJson(); - JSONObject error = assertProperty(json, "error", JSONObject.class); - assertProperty(error, "class", Error.class.getName()); - assertProperty(error, "message", errMsg); + JsonObject json = res.getJson(); + JsonValue error = assertProperty(json, "error"); + assertProperty((JsonObject) error, "class", Error.class.getName()); + assertProperty((JsonObject) error, "message", errMsg); } public void testSend() throws Exception { res.onChange("modified", "argument1"); MockSlingHttpServletResponse response = new MockSlingHttpServletResponse(); res.send(response, true); - JSONObject result = new JSONObject(response.getOutput().toString()); - assertProperty(result, HtmlResponse.PN_STATUS_CODE, HttpServletResponse.SC_OK); + JsonObject result = Json.createReader(new StringReader(response.getOutput().toString())).readObject(); + assertProperty(result, HtmlResponse.PN_STATUS_CODE, Integer.toString(HttpServletResponse.SC_OK)); assertEquals(JSONResponse.RESPONSE_CONTENT_TYPE, response.getContentType()); assertEquals(JSONResponse.RESPONSE_CHARSET, response.getCharacterEncoding()); } @@ -84,8 +87,8 @@ public class JsonResponseTest extends Te res.setLocation(location); MockResponseWithHeader response = new MockResponseWithHeader(); res.send(response, true); - JSONObject result = new JSONObject(response.getOutput().toString()); - assertProperty(result, HtmlResponse.PN_STATUS_CODE, HttpServletResponse.SC_CREATED); + JsonObject result = Json.createReader(new StringReader(response.getOutput().toString())).readObject(); + assertProperty(result, HtmlResponse.PN_STATUS_CODE, Integer.toString(HttpServletResponse.SC_CREATED)); assertEquals(location, response.getHeader("Location")); } @@ -98,21 +101,21 @@ public class JsonResponseTest extends Te res.setLocation(location); MockResponseWithHeader response = new MockResponseWithHeader(); res.send(response, true); - JSONObject result = new JSONObject(response.getOutput().toString()); - assertProperty(result, HtmlResponse.PN_STATUS_CODE, status); + JsonObject result = Json.createReader(new StringReader(response.getOutput().toString())).readObject(); + assertProperty(result, HtmlResponse.PN_STATUS_CODE, Integer.toString(status)); assertEquals(location, response.getHeader("Location")); } } - private static <T> T assertProperty(JSONObject obj, String key, Class<T> clazz) throws JSONException { - assertTrue("JSON object does not have property " + key, obj.has(key)); - return assertInstanceOf(obj.get(key), clazz); + private static JsonValue assertProperty(JsonObject obj, String key) { + assertTrue("JSON object does not have property " + key, obj.containsKey(key)); + return obj.get(key); } @SuppressWarnings({"unchecked"}) - private static <T> T assertProperty(JSONObject obj, String key, T expected) throws JSONException { - T res = (T) assertProperty(obj, key, expected.getClass()); - assertEquals(expected, res); + private static JsonString assertProperty(JsonObject obj, String key, String expected) { + JsonString res = (JsonString) assertProperty(obj, key); + assertEquals(expected, res.getString()); return res; }