Jackson serialization for history classes
This commit is contained in:
parent
aba8cd8430
commit
418b21dda2
@ -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<HistoryEntry> _pastEntries; // done changes, can be undone
|
||||
@JsonProperty("future")
|
||||
protected List<HistoryEntry> _futureEntries; // undone changes, can be redone
|
||||
|
||||
public History(Project project) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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<Double> {
|
||||
private static final long serialVersionUID = 132345L;
|
||||
|
||||
@ -73,4 +86,21 @@ public class SerializationFilters {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize dates by ISO format.
|
||||
*/
|
||||
public static class DateSerializer extends StdSerializer<OffsetDateTime> {
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user