commit 16c6984ab971f3f617713985a8b94ff8ed3f6525 Author: Karsten Loesing karsten.loesing@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@lists.torproject.org