diff --git a/dhp-schemas/pom.xml b/dhp-schemas/pom.xml
index 89e52858b..8338f69e4 100644
--- a/dhp-schemas/pom.xml
+++ b/dhp-schemas/pom.xml
@@ -30,7 +30,12 @@
com.fasterxml.jackson.core
jackson-databind
-
+
+
+ com.google.guava
+ guava
+
+
junit
junit
diff --git a/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/action/AtomicAction.java b/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/action/AtomicAction.java
new file mode 100644
index 000000000..0f9aa3adb
--- /dev/null
+++ b/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/action/AtomicAction.java
@@ -0,0 +1,38 @@
+package eu.dnetlib.dhp.schema.action;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import eu.dnetlib.dhp.schema.oaf.Oaf;
+
+import java.io.Serializable;
+
+@JsonDeserialize(using = AtomicActionDeserializer.class)
+public class AtomicAction implements Serializable {
+
+ private Class clazz;
+
+ private T payload;
+
+ public AtomicAction() {
+ }
+
+ public AtomicAction(Class clazz, T payload) {
+ this.clazz = clazz;
+ this.payload = payload;
+ }
+
+ public Class getClazz() {
+ return clazz;
+ }
+
+ public void setClazz(Class clazz) {
+ this.clazz = clazz;
+ }
+
+ public T getPayload() {
+ return payload;
+ }
+
+ public void setPayload(T payload) {
+ this.payload = payload;
+ }
+}
diff --git a/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java b/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java
new file mode 100644
index 000000000..e6017288f
--- /dev/null
+++ b/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java
@@ -0,0 +1,29 @@
+package eu.dnetlib.dhp.schema.action;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import eu.dnetlib.dhp.schema.oaf.Oaf;
+
+import java.io.IOException;
+
+public class AtomicActionDeserializer extends JsonDeserializer {
+
+ @Override
+ public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+ JsonNode node = jp.getCodec().readTree(jp);
+ String classTag = node.get("clazz").asText();
+ JsonNode payload = node.get("payload");
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ final Class> clazz = Class.forName(classTag);
+ return new AtomicAction(clazz, (Oaf) mapper.readValue(payload.toString(), clazz));
+ } catch (ClassNotFoundException e) {
+ throw new IOException(e);
+ }
+ }
+}
diff --git a/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java b/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java
index 24a363bec..6738b8693 100644
--- a/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java
+++ b/dhp-schemas/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java
@@ -2,10 +2,11 @@ package eu.dnetlib.dhp.schema.oaf;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.junit.Assert;
+import static com.google.common.base.Preconditions.checkArgument;
public class Relation extends Oaf {
@@ -70,14 +71,34 @@ public class Relation extends Oaf {
}
public void mergeFrom(final Relation r) {
- Assert.assertEquals("source ids must be equal", getSource(), r.getSource());
- Assert.assertEquals("target ids must be equal", getTarget(), r.getTarget());
- Assert.assertEquals("relType(s) must be equal", getRelType(), r.getRelType());
- Assert.assertEquals("subRelType(s) must be equal", getSubRelType(), r.getSubRelType());
- Assert.assertEquals("relClass(es) must be equal", getRelClass(), r.getRelClass());
+
+ checkArgument(Objects.equals(getSource(), r.getSource()),"source ids must be equal");
+ checkArgument(Objects.equals(getTarget(), r.getTarget()),"target ids must be equal");
+ checkArgument(Objects.equals(getRelType(), r.getRelType()),"relType(s) must be equal");
+ checkArgument(Objects.equals(getSubRelType(), r.getSubRelType()),"subRelType(s) must be equal");
+ checkArgument(Objects.equals(getRelClass(), r.getRelClass()),"relClass(es) must be equal");
+
setCollectedFrom(Stream.concat(getCollectedFrom().stream(), r.getCollectedFrom().stream())
.distinct() // relies on KeyValue.equals
.collect(Collectors.toList()));
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Relation relation = (Relation) o;
+ return relType.equals(relation.relType) &&
+ subRelType.equals(relation.subRelType) &&
+ relClass.equals(relation.relClass) &&
+ source.equals(relation.source) &&
+ target.equals(relation.target) &&
+ Objects.equals(collectedFrom, relation.collectedFrom);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(relType, subRelType, relClass, source, target, collectedFrom);
+ }
+
}
diff --git a/dhp-schemas/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java b/dhp-schemas/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java
new file mode 100644
index 000000000..dcf20e342
--- /dev/null
+++ b/dhp-schemas/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java
@@ -0,0 +1,37 @@
+package eu.dnetlib.dhp.schema.action;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import eu.dnetlib.dhp.schema.oaf.Relation;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class AtomicActionTest {
+
+ @Test
+ public void serializationTest() throws IOException {
+
+ Relation rel = new Relation();
+ rel.setSource("1");
+ rel.setTarget("2");
+ rel.setRelType("resultResult");
+ rel.setSubRelType("dedup");
+ rel.setRelClass("merges");
+
+ AtomicAction aa1 = new AtomicAction(Relation.class, rel);
+
+ final ObjectMapper mapper = new ObjectMapper();
+ String json = mapper.writeValueAsString(aa1);
+
+ Assert.assertTrue(StringUtils.isNotBlank(json));
+
+ AtomicAction aa2 = mapper.readValue(json, AtomicAction.class);
+
+ Assert.assertEquals(aa1.getClazz(), aa2.getClazz());
+ Assert.assertEquals(aa1.getPayload(), aa2.getPayload());
+
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 0310a3f44..85a545eb0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -148,6 +148,13 @@
${dhp.commons.lang.version}
+
+ com.google.guava
+ guava
+ ${dhp.guava.version}
+
+
+
commons-codec
commons-codec
@@ -496,6 +503,7 @@
2.4.0.cloudera2
2.9.6
3.5
+ 28.2-jre
2.11.12
4.12
3.4.2