From 418b21dda2ac0bf790f15905058dadda4cddcd19 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Fri, 28 Sep 2018 16:24:01 +0100 Subject: [PATCH] Jackson serialization for history classes --- .../com/google/refine/history/History.java | 4 +++ .../google/refine/history/HistoryEntry.java | 14 ++++++++ .../google/refine/history/HistoryProcess.java | 21 +++++++++++- .../google/refine/util/ParsingUtilities.java | 1 + .../refine/util/SerializationFilters.java | 32 ++++++++++++++++++- .../tests/history/HistoryEntryTests.java | 8 ++--- 6 files changed, 72 insertions(+), 8 deletions(-) diff --git a/main/src/com/google/refine/history/History.java b/main/src/com/google/refine/history/History.java index 8719eb2ee..f41ca0863 100644 --- a/main/src/com/google/refine/history/History.java +++ b/main/src/com/google/refine/history/History.java @@ -49,6 +49,8 @@ import java.util.Properties; import org.json.JSONException; import org.json.JSONWriter; +import com.fasterxml.jackson.annotation.JsonProperty; + import com.google.refine.Jsonizable; import com.google.refine.ProjectManager; import com.google.refine.RefineServlet; @@ -113,7 +115,9 @@ public class History implements Jsonizable { } protected long _projectID; + @JsonProperty("past") protected List _pastEntries; // done changes, can be undone + @JsonProperty("future") protected List _futureEntries; // undone changes, can be redone public History(Project project) { diff --git a/main/src/com/google/refine/history/HistoryEntry.java b/main/src/com/google/refine/history/HistoryEntry.java index e4e0f5961..8c56fb885 100644 --- a/main/src/com/google/refine/history/HistoryEntry.java +++ b/main/src/com/google/refine/history/HistoryEntry.java @@ -44,11 +44,16 @@ import org.json.JSONWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; + import com.google.refine.Jsonizable; import com.google.refine.ProjectManager; import com.google.refine.model.AbstractOperation; import com.google.refine.model.Project; import com.google.refine.operations.OperationRegistry; +import com.google.refine.util.JsonViews; import com.google.refine.util.ParsingUtilities; /** @@ -57,18 +62,26 @@ import com.google.refine.util.ParsingUtilities; */ public class HistoryEntry implements Jsonizable { final static Logger logger = LoggerFactory.getLogger("HistoryEntry"); + @JsonProperty("id") final public long id; + @JsonIgnore final public long projectID; + @JsonProperty("description") final public String description; + @JsonProperty("time") final public OffsetDateTime time; // the manager (deals with IO systems or databases etc.) + @JsonIgnore final public HistoryEntryManager _manager; // the abstract operation, if any, that results in the change + @JsonProperty("operation") + @JsonView(JsonViews.SaveMode.class) final public AbstractOperation operation; // the actual change, loaded on demand + @JsonIgnore private transient Change _change; private final static String OPERATION = "operation"; @@ -77,6 +90,7 @@ public class HistoryEntry implements Jsonizable { this._change = _change; } + @JsonIgnore public Change getChange() { return _change; } diff --git a/main/src/com/google/refine/history/HistoryProcess.java b/main/src/com/google/refine/history/HistoryProcess.java index 0004e2c86..19c8769cd 100644 --- a/main/src/com/google/refine/history/HistoryProcess.java +++ b/main/src/com/google/refine/history/HistoryProcess.java @@ -38,6 +38,9 @@ import java.util.Properties; import org.json.JSONException; import org.json.JSONWriter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + import com.google.refine.model.Project; import com.google.refine.process.Process; import com.google.refine.process.ProcessManager; @@ -67,6 +70,12 @@ public class HistoryProcess extends Process { } } + @Override + @JsonIgnore + public long getId() { + return super.getId(); + } + @Override public void cancel() { throw new RuntimeException(WARN); @@ -97,9 +106,19 @@ public class HistoryProcess extends Process { writer.object(); writer.key("description"); writer.value(_description); writer.key("immediate"); writer.value(true); - writer.key("status"); writer.value(_done ? "done" : "pending"); + writer.key("status"); writer.value(getStatus()); writer.endObject(); } + + @JsonProperty("status") + public String getStatus() { + return _done ? "done" : "pending"; + } + + @JsonProperty("description") + public String getDescription() { + return _description; + } @Override public boolean isDone() { diff --git a/main/src/com/google/refine/util/ParsingUtilities.java b/main/src/com/google/refine/util/ParsingUtilities.java index 3404b79af..8b51fcc04 100644 --- a/main/src/com/google/refine/util/ParsingUtilities.java +++ b/main/src/com/google/refine/util/ParsingUtilities.java @@ -72,6 +72,7 @@ public class ParsingUtilities { SimpleModule module = new SimpleModule(); module.addSerializer(Double.class, new SerializationFilters.DoubleSerializer()); module.addSerializer(double.class, new SerializationFilters.DoubleSerializer()); + module.addSerializer(OffsetDateTime.class, new SerializationFilters.DateSerializer()); mapper.registerModule(module); } diff --git a/main/src/com/google/refine/util/SerializationFilters.java b/main/src/com/google/refine/util/SerializationFilters.java index 646892b3e..984f2ca96 100644 --- a/main/src/com/google/refine/util/SerializationFilters.java +++ b/main/src/com/google/refine/util/SerializationFilters.java @@ -1,6 +1,7 @@ package com.google.refine.util; import java.io.IOException; +import java.time.OffsetDateTime; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; @@ -13,6 +14,10 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.google.refine.model.Recon; import com.google.refine.model.Recon.Judgment; +/** + * Series of classes which configure JSON serialization at application level. + * @author Antonin Delpeuch + */ public class SerializationFilters { static class BaseFilter extends SimpleBeanPropertyFilter { @Override @@ -37,6 +42,11 @@ public class SerializationFilters { } public static PropertyFilter noFilter = new BaseFilter(); + + /** + * Filter out reconciliation candidates when rendering a matched recon + * in view mode. (In save mode, render them all the time.) + */ public static PropertyFilter reconCandidateFilter = new BaseFilter() { @Override public void serializeAsField(Object obj, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) @@ -55,7 +65,10 @@ public class SerializationFilters { } } }; - + + /** + * Serialize double values as integers if they happen to round to an integer. + */ public static class DoubleSerializer extends StdSerializer { private static final long serialVersionUID = 132345L; @@ -73,4 +86,21 @@ public class SerializationFilters { } } } + + /** + * Serialize dates by ISO format. + */ + public static class DateSerializer extends StdSerializer { + private static final long serialVersionUID = 93872874L; + + public DateSerializer() { + super(OffsetDateTime.class); + } + + @Override + public void serialize(OffsetDateTime arg0, JsonGenerator gen, SerializerProvider s) + throws IOException { + gen.writeString(ParsingUtilities.dateToString(arg0)); + } + } } diff --git a/main/tests/server/src/com/google/refine/tests/history/HistoryEntryTests.java b/main/tests/server/src/com/google/refine/tests/history/HistoryEntryTests.java index 5d1123fbb..b7e60c907 100644 --- a/main/tests/server/src/com/google/refine/tests/history/HistoryEntryTests.java +++ b/main/tests/server/src/com/google/refine/tests/history/HistoryEntryTests.java @@ -2,8 +2,6 @@ package com.google.refine.tests.history; import static org.mockito.Mockito.mock; -import java.util.Properties; - import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -58,9 +56,7 @@ public class HistoryEntryTests extends RefineTest { + "\"time\":\"2018-08-07T09:06:37Z\"}"; HistoryEntry historyEntry = HistoryEntry.load(project, json); - TestUtils.isSerializedTo(historyEntry, jsonSimple); - Properties options = new Properties(); - options.setProperty("mode", "save"); - TestUtils.isSerializedTo(historyEntry, json, options); + TestUtils.isSerializedTo(historyEntry, jsonSimple, false); + TestUtils.isSerializedTo(historyEntry, json, true); } }