commit 16c6984ab971f3f617713985a8b94ff8ed3f6525 Author: Karsten Loesing <karsten.loes...@gmx.net> Date: Tue May 22 15:23:57 2018 +0200
Replace Gson with Jackson. Implements #26159. --- CHANGELOG.md | 8 ++++ build.xml | 4 +- .../torproject/descriptor/index/DirectoryNode.java | 13 ++----- .../org/torproject/descriptor/index/FileNode.java | 8 +--- .../org/torproject/descriptor/index/IndexNode.java | 43 ++++++++++------------ .../torproject/descriptor/index/IndexNodeTest.java | 4 +- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e9069e..a1266e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# Changes in version 2.4.0 - 2018-05-?? + + * Medium changes + - Replace Gson with Jackson. Applications must provide Jackson + 2.8.6 or compatible as dependency and do not need to provide Gson + as dependency anymore. + + # Changes in version 2.3.0 - 2018-04-18 * Medium changes diff --git a/build.xml b/build.xml index 61cd45d..29db555 100644 --- a/build.xml +++ b/build.xml @@ -15,7 +15,9 @@ <patternset id="runtime" > <include name="commons-compress-1.13.jar"/> - <include name="gson-2.4.jar"/> + <include name="jackson-annotations-2.8.6.jar"/> + <include name="jackson-core-2.8.6.jar"/> + <include name="jackson-databind-2.8.6.jar"/> <include name="slf4j-api-1.7.22.jar" /> <include name="xz-1.6.jar"/> </patternset> diff --git a/src/main/java/org/torproject/descriptor/index/DirectoryNode.java b/src/main/java/org/torproject/descriptor/index/DirectoryNode.java index 859493b..9ed5784 100644 --- a/src/main/java/org/torproject/descriptor/index/DirectoryNode.java +++ b/src/main/java/org/torproject/descriptor/index/DirectoryNode.java @@ -3,8 +3,6 @@ package org.torproject.descriptor.index; -import com.google.gson.annotations.Expose; - import java.util.SortedSet; /** @@ -15,22 +13,19 @@ import java.util.SortedSet; public class DirectoryNode implements Comparable<DirectoryNode> { /** Path (i.e. directory name) is exposed in JSON. */ - @Expose public final String path; /** The file list is exposed in JSON. Sorted according to path. */ - @Expose public final SortedSet<FileNode> files; /** The directory list is exposed in JSON. Sorted according to path. */ - @Expose public final SortedSet<DirectoryNode> directories; - /* Added to satisfy Gson. */ + /* Added to satisfy Jackson. */ private DirectoryNode() { - path = null; - files = null; - directories = null; + this.path = null; + this.files = null; + this.directories = null; } /** A directory for the JSON structure. */ diff --git a/src/main/java/org/torproject/descriptor/index/FileNode.java b/src/main/java/org/torproject/descriptor/index/FileNode.java index eb34131..f505f16 100644 --- a/src/main/java/org/torproject/descriptor/index/FileNode.java +++ b/src/main/java/org/torproject/descriptor/index/FileNode.java @@ -3,8 +3,7 @@ package org.torproject.descriptor.index; -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,18 +24,15 @@ public class FileNode implements Comparable<FileNode> { private static Logger log = LoggerFactory.getLogger(FileNode.class); /** Path (i.e. file name) is exposed in JSON. */ - @Expose public final String path; /** The file size is exposed in JSON. */ - @Expose public final long size; /** The last modified date-time string is exposed in JSON. */ - @Expose - @SerializedName("last_modified") public final String lastModified; + @JsonIgnore private long lastModifiedMillis; /* Added to satisfy Gson. */ diff --git a/src/main/java/org/torproject/descriptor/index/IndexNode.java b/src/main/java/org/torproject/descriptor/index/IndexNode.java index 19a5aa4..02b5972 100644 --- a/src/main/java/org/torproject/descriptor/index/IndexNode.java +++ b/src/main/java/org/torproject/descriptor/index/IndexNode.java @@ -5,19 +5,20 @@ package org.torproject.descriptor.index; import org.torproject.descriptor.internal.FileType; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; -import java.io.Reader; import java.net.URL; import java.net.URLConnection; import java.nio.file.Files; @@ -34,6 +35,7 @@ import java.util.TreeSet; * * @since 1.4.0 */ +@JsonPropertyOrder({ "created", "revision", "path", "directories", "files" }) public class IndexNode { private static Logger log = LoggerFactory.getLogger(IndexNode.class); @@ -48,29 +50,30 @@ public class IndexNode { public static final IndexNode emptyNode = new IndexNode("", "", new TreeSet<FileNode>(), new TreeSet<DirectoryNode>()); + private static ObjectMapper objectMapper = new ObjectMapper() + .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) + .setSerializationInclusion(JsonInclude.Include.NON_EMPTY) + .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) + .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + /** The created date-time is exposed in JSON as 'index_created' field. */ - @Expose - @SerializedName("index_created") + @JsonProperty("index_created") public final String created; /** The software's build revision JSON as 'build_revision' field. */ - @Expose - @SerializedName("build_revision") + @JsonProperty("build_revision") public final String revision; /** Path (i.e. base url) is exposed in JSON. */ - @Expose public final String path; /** The directory list is exposed in JSON. Sorted according to path. */ - @Expose public final SortedSet<DirectoryNode> directories; /** The file list is exposed in JSON. Sorted according to path. */ - @Expose public final SortedSet<FileNode> files; - /* Added to satisfy Gson. */ + /* Added to satisfy Jackson. */ private IndexNode() { this.created = null; this.revision = null; @@ -119,11 +122,7 @@ public class IndexNode { * Returns an empty IndexNode in case of an error. */ public static IndexNode fetchIndex(InputStream is) throws IOException { - Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() - .create(); - try (Reader reader = new InputStreamReader(is)) { - return gson.fromJson(reader, IndexNode.class); - } + return objectMapper.readValue(is, IndexNode.class); } /** Return a map of file paths for the given directories. */ @@ -185,10 +184,8 @@ public class IndexNode { } /** Write JSON representation of the given index node to a string. */ - public static String makeJsonString(IndexNode indexNode) { - Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() - .create(); - return gson.toJson(indexNode); + public static String makeJsonString(IndexNode indexNode) throws IOException { + return objectMapper.writeValueAsString(indexNode); } /** For debugging purposes. */ diff --git a/src/test/java/org/torproject/descriptor/index/IndexNodeTest.java b/src/test/java/org/torproject/descriptor/index/IndexNodeTest.java index c733e47..b5c01e3 100644 --- a/src/test/java/org/torproject/descriptor/index/IndexNodeTest.java +++ b/src/test/java/org/torproject/descriptor/index/IndexNodeTest.java @@ -7,6 +7,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import com.fasterxml.jackson.core.JsonParseException; + import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -114,7 +116,7 @@ public class IndexNodeTest { IndexNode.fetchIndex(indexUrl.toString()); } - @Test(expected = com.google.gson.JsonSyntaxException.class) + @Test(expected = JsonParseException.class) public void testWrongJson() throws Exception { URL indexUrl = getClass().getClassLoader().getResource("index1.json.gz"); IndexNode.fetchIndex(indexUrl.openStream()); _______________________________________________ tor-commits mailing list tor-commits@lists.torproject.org https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits