From aa6b66ee19a400b8ec524394ce827fe15678a4d0 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 11 Sep 2020 15:28:32 +0200 Subject: [PATCH] Refactor util.JsonUtil pretty printing to use no GSON and deduplicate code. #6810 --- .../iq/dataverse/util/json/JsonUtil.java | 48 +++++++------------ .../iq/dataverse/util/json/JsonUtilTest.java | 37 +++++++++----- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java index ae6935945e8..0c59ff4d020 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java @@ -1,57 +1,43 @@ package edu.harvard.iq.dataverse.util.json; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; +import java.io.StringReader; import java.io.StringWriter; -import java.util.HashMap; -import java.util.Map; +import java.util.Collections; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonWriter; -import javax.json.JsonWriterFactory; +import javax.json.*; import javax.json.stream.JsonGenerator; public class JsonUtil { private static final Logger logger = Logger.getLogger(JsonUtil.class.getCanonicalName()); + private static JsonWriterFactory jsonWriterFactory = Json.createWriterFactory(Collections.singletonMap(JsonGenerator.PRETTY_PRINTING, true)); /** * Make an attempt at pretty printing a String but will return the original * string if it isn't JSON or if there is any exception. + * Null- and empty-safe. */ public static String prettyPrint(String jsonString) { + if (jsonString == null || "".equals(jsonString)) return jsonString; try { - com.google.gson.JsonParser jsonParser = new com.google.gson.JsonParser(); - JsonObject jsonObject = jsonParser.parse(jsonString).getAsJsonObject(); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - String prettyJson = gson.toJson(jsonObject); - return prettyJson; + JsonReader reader = Json.createReader(new StringReader(jsonString)); + JsonStructure struct = reader.read(); + return prettyPrint(struct); } catch (Exception ex) { logger.info("Returning original string due to exception: " + ex); return jsonString; } } - - public static String prettyPrint(JsonArray jsonArray) { - Map config = new HashMap<>(); - config.put(JsonGenerator.PRETTY_PRINTING, true); - JsonWriterFactory jsonWriterFactory = Json.createWriterFactory(config); - StringWriter stringWriter = new StringWriter(); - try (JsonWriter jsonWriter = jsonWriterFactory.createWriter(stringWriter)) { - jsonWriter.writeArray(jsonArray); - } - return stringWriter.toString(); - } - - public static String prettyPrint(javax.json.JsonObject jsonObject) { - Map config = new HashMap<>(); - config.put(JsonGenerator.PRETTY_PRINTING, true); - JsonWriterFactory jsonWriterFactory = Json.createWriterFactory(config); + + /** + * Prettyprint any Jakarta EE JSON-P structure (object, array, value, ...). + * @param jsonStructure + * @return Pretty JSON string + */ + public static String prettyPrint(JsonStructure jsonStructure) { StringWriter stringWriter = new StringWriter(); try (JsonWriter jsonWriter = jsonWriterFactory.createWriter(stringWriter)) { - jsonWriter.writeObject(jsonObject); + jsonWriter.write(jsonStructure); } return stringWriter.toString(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java index 847fbfc9cba..9be12325c1e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java @@ -1,19 +1,32 @@ package edu.harvard.iq.dataverse.util.json; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EmptySource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; -public class JsonUtilTest { +import java.util.Optional; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; - @Test - public void testPrettyPrint() { - JsonUtil jsonUtil = new JsonUtil(); - String nullString = null; - assertEquals(null, JsonUtil.prettyPrint(nullString)); - assertEquals("", JsonUtil.prettyPrint("")); - assertEquals("junk", JsonUtil.prettyPrint("junk")); - assertEquals("{}", JsonUtil.prettyPrint("{}")); - assertEquals("{\n" + " \"foo\": \"bar\"\n" + "}", JsonUtil.prettyPrint("{\"foo\": \"bar\"}")); +public class JsonUtilTest { + + private static Stream testArgs() { + return Stream.of( + Arguments.of(null, null), + Arguments.of("", ""), + Arguments.of("junk", "junk"), + Arguments.of("{}", "\n{\n}"), + Arguments.of("{\"foo\": \"bar\"}", "\n{\n" + " \"foo\": \"bar\"\n" + "}")); + } + + + @ParameterizedTest + @MethodSource("testArgs") + public void testPrettyPrint(String input, String expected) { + assertEquals(expected, JsonUtil.prettyPrint(input)); } }