diff --git a/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafMapperUtils.java b/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafMapperUtils.java index 462c6fb4c..59a04a26c 100644 --- a/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafMapperUtils.java +++ b/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafMapperUtils.java @@ -26,26 +26,21 @@ public class OafMapperUtils { if (ModelSupport.isSubClass(left, OafEntity.class)) { return mergeEntities((OafEntity) left, (OafEntity) right); } else if (ModelSupport.isSubClass(left, Relation.class)) { - ((Relation) left).mergeFrom((Relation) right); + return OafUtils.mergeOAF(left, right); } else { throw new IllegalArgumentException("invalid Oaf type:" + left.getClass().getCanonicalName()); } - return left; } public static OafEntity mergeEntities(OafEntity left, OafEntity right) { if (ModelSupport.isSubClass(left, Result.class)) { return mergeResults((Result) left, (Result) right); - } else if (ModelSupport.isSubClass(left, Datasource.class)) { - left.mergeFrom(right); - } else if (ModelSupport.isSubClass(left, Organization.class)) { - left.mergeFrom(right); - } else if (ModelSupport.isSubClass(left, Project.class)) { - left.mergeFrom(right); + } else if (ModelSupport.isSubClass(left, Datasource.class) || ModelSupport.isSubClass(left, Organization.class) || ModelSupport.isSubClass(left, Project.class)) + { + return OafUtils.mergeOAF(left, right); } else { throw new IllegalArgumentException("invalid OafEntity subtype:" + left.getClass().getCanonicalName()); } - return left; } public static Result mergeResults(Result left, Result right) { @@ -59,13 +54,11 @@ public class OafMapperUtils { if (!leftFromDelegatedAuthority && rightFromDelegatedAuthority) { return right; } - if (new ResultTypeComparator().compare(left, right) < 0) { - left.mergeFrom(right); - return left; + return OafUtils.mergeOAF(left, right); } else { - right.mergeFrom(left); - return right; + return OafUtils.mergeOAF(right, left); + } } @@ -419,7 +412,7 @@ public class OafMapperUtils { public static Measure newMeasureInstance(String id, String value, String key, DataInfo dataInfo) { Measure m = new Measure(); m.setId(id); - m.setUnit(Arrays.asList(newKeyValueInstance(key, value, dataInfo))); + m.setUnit(Collections.singletonList(newKeyValueInstance(key, value, dataInfo))); return m; } } diff --git a/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafUtils.java b/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafUtils.java index 1c96aa200..76bb4a715 100644 --- a/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafUtils.java +++ b/dhp-common/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/OafUtils.java @@ -240,7 +240,7 @@ public class OafUtils { * @param enrich second object * @return the merged object */ - public static Oaf mergeOAF(Oaf original, Oaf enrich) { + public static T mergeOAF(T original, T enrich) { if (original == null) return enrich; if (enrich == null) @@ -251,10 +251,7 @@ public class OafUtils { original.getClass().getCanonicalName(), enrich.getClass().getCanonicalName())); - Oaf result = null; - - - + Oaf result ; switch (original.getClass().getSimpleName().toLowerCase()) { case "relation": @@ -278,12 +275,11 @@ public class OafUtils { case "organization": result = mergeOAFOrganization((Organization) original, (Organization)enrich); break; + default: + throw new RuntimeException("Trying to merge an unsupported class"); } - checkArgument(Objects.nonNull(result), "Undefined type on merge, " + - "allowed: relation, publication,otherresearchproduct, software and dataset"); - result.setCollectedfrom( Stream .concat( @@ -304,7 +300,7 @@ public class OafUtils { Optional.ofNullable(original.getLastupdatetimestamp()).orElse(0L), Optional.ofNullable(enrich.getLastupdatetimestamp()).orElse(0L))); - return result; + return (T) result; } @@ -351,7 +347,7 @@ public class OafUtils { * @param titles the titles * @return the main title */ - private static StructuredProperty getMainTitle(List titles) { + private static StructuredProperty getMainTitle(final List titles) { // need to check if the list of titles contains more than 1 main title? (in that case, we should chose which // main title select in the list) for (StructuredProperty t : titles) { @@ -363,7 +359,7 @@ public class OafUtils { } - private static OafEntity mergeEntity(OafEntity original, OafEntity enrich) { + private static OafEntity mergeEntity(final OafEntity original,final OafEntity enrich) { final OafEntity mergedEntity = original; @@ -389,7 +385,7 @@ public class OafUtils { } - private static Result mergeOAFResult(Result original, Result enrich) { + private static Result mergeOAFResult(final Result original,final Result enrich) { final Result mergedResult = (Result) mergeEntity(original, enrich); @@ -491,7 +487,7 @@ public class OafUtils { return mergedResult; } - private static OtherResearchProduct mergeOAFOtherResearchProduct(OtherResearchProduct original, OtherResearchProduct enrich) { + private static OtherResearchProduct mergeOAFOtherResearchProduct(final OtherResearchProduct original,final OtherResearchProduct enrich) { final OtherResearchProduct mergedORP = (OtherResearchProduct) mergeOAFResult(original, enrich); @@ -503,7 +499,7 @@ public class OafUtils { return mergedORP; } - private static Software mergeOAFSoftware(Software original, Software enrich) { + private static Software mergeOAFSoftware(final Software original, final Software enrich) { final Software mergedSoftware = (Software) mergeOAFResult(original, enrich); mergedSoftware.setDocumentationUrl(mergeLists(mergedSoftware.getDocumentationUrl(), enrich.getDocumentationUrl())); diff --git a/dhp-common/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/MergeTest.java b/dhp-common/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/MergeTest.java index d5d1a5f61..49fb5c4e8 100644 --- a/dhp-common/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/MergeTest.java +++ b/dhp-common/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/MergeTest.java @@ -67,7 +67,7 @@ class MergeTest { a.setCollectedfrom(Arrays.asList(setKV("a", "open"), setKV("b", "closed"))); b.setCollectedfrom(Arrays.asList(setKV("A", "open"), setKV("b", "Open"))); - a = (Publication) OafUtils.mergeOAF(a, b); + a = OafUtils.mergeOAF(a, b); assertNotNull(a.getCollectedfrom()); @@ -83,7 +83,7 @@ class MergeTest { * @return the list * @throws Exception the exception */ - private List loadResourceResult(final String path, final Class clazz ) throws Exception { + private List loadResourceResult(final String path, final Class clazz ) throws Exception { final ObjectMapper mapper = new ObjectMapper(); final InputStream str = Objects.requireNonNull(getClass().getResourceAsStream(path)); // LOAD test publications @@ -104,7 +104,7 @@ class MergeTest { * @param enrichment the enrichment * @param overrideAlternateIdentifier the override alternate identifier */ - private void updatePidIntoPublicationInstance(final List source, final Listenrichment, final boolean overrideAlternateIdentifier) { + private void updatePidIntoPublicationInstance(final List source, final Listenrichment, final boolean overrideAlternateIdentifier) { for(int i = 0 ; i< source.size(); i++) { final Result currentPub = source.get(i); final Result currentEnrichment = enrichment.get(i); @@ -117,17 +117,17 @@ class MergeTest { } - private void applyAndVerifyEnrichment(final List l1, final List l2) { + private void applyAndVerifyEnrichment(final List l1, final List l2) { // Apply Merge and verify that enrichments works for(int i = 0 ; i< l1.size(); i++) { final Result currentPub = l2.get(i); final Result currentEnrichment = l1.get(i); - currentPub.mergeFrom(currentEnrichment); - assertEquals(1, currentPub.getInstance().size()); - final Instance currentInstance = Objects.requireNonNull(currentPub.getInstance()).get(0); + final Result result = OafUtils.mergeOAF(currentPub, currentEnrichment); + assertEquals(1, result.getInstance().size()); + final Instance currentInstance = Objects.requireNonNull(result.getInstance()).get(0); assertNotNull(currentInstance.getMeasures()); - assertNotNull(currentPub.getTitle()); - assertFalse(Result.isAnEnrichment(currentPub)); + assertNotNull(result.getTitle()); + assertFalse(OafUtils.isAnEnrichment(result)); } } @@ -140,7 +140,7 @@ class MergeTest { @Test void testAPCMerge() throws Exception { - List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publication_apc.json", Publication.class); + List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publication_apc.json", Publication.class); System.out.println(publications.size()); publications.forEach(p -> assertEquals(1, p.getInstance().size())); publications.forEach(p -> assertTrue(p.getProcessingchargeamount() != null )); @@ -161,7 +161,7 @@ class MergeTest { Result p1 = publications.get(0); Result p2 = publications.get(1); - p1.mergeFrom(p2); + p1 = OafUtils.mergeOAF(p1, p2); assertEquals("1721.47", p1.getProcessingchargeamount().getValue()); assertEquals("EUR", p1.getProcessingchargecurrency().getValue()); @@ -180,7 +180,7 @@ class MergeTest { } @Test void testAPCMerge2() throws Exception { - List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publication_apc2.json", Publication.class); + List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publication_apc2.json", Publication.class); System.out.println(publications.size()); publications.forEach(p -> assertEquals(1, p.getInstance().size())); assertTrue(publications.get(0).getProcessingchargeamount() != null ); @@ -242,7 +242,7 @@ class MergeTest { // 1 TEST UPDATING PID INSTANCE AND MERGE CURRENT PUBLICATION WITH ENRICHMENT // LOAD test publications - List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); + List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); // Assert that each publication has only one instance and inside that all the measure field is empty publications.forEach(p -> { assertEquals(1, p.getInstance().size()); @@ -251,7 +251,7 @@ class MergeTest { }); // LOAD test enrichments - List enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + List enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Publication.class); updatePidIntoPublicationInstance(publications, enrichment, false); applyAndVerifyEnrichment(publications, enrichment); @@ -259,20 +259,20 @@ class MergeTest { // 2 TEST UPDATING ALTERNATE ID INSTANCE AND MERGE CURRENT PUBLICATION WITH ENRICHMENT publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); - enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Publication.class); updatePidIntoPublicationInstance(publications, enrichment, true); applyAndVerifyEnrichment(publications, enrichment); // 3 TEST UPDATING PID INSTANCE AND MERGE ENRICHMENT WITH CURRENT PUBLICATION publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); - enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Publication.class); updatePidIntoPublicationInstance(publications, enrichment, false); applyAndVerifyEnrichment( enrichment, publications); // 4 TEST UPDATING ALTERNATE ID INSTANCE AND MERGE ENRICHMENT WITH CURRENT PUBLICATION publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); - enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Publication.class); updatePidIntoPublicationInstance(publications, enrichment, true); applyAndVerifyEnrichment( enrichment, publications); @@ -292,7 +292,7 @@ class MergeTest { a.setDateofacceptance(field("2021-06-18")); b.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-18", a.getDateofacceptance().getValue()); @@ -310,7 +310,7 @@ class MergeTest { a.setDateofacceptance(field("2021-06-18")); b.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -328,7 +328,7 @@ class MergeTest { a.setDateofacceptance(field("2021-06-18")); b.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-18", a.getDateofacceptance().getValue()); @@ -345,7 +345,7 @@ class MergeTest { b.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -362,7 +362,7 @@ class MergeTest { b.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -379,7 +379,7 @@ class MergeTest { b.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -396,7 +396,7 @@ class MergeTest { a.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -413,7 +413,7 @@ class MergeTest { a.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -430,7 +430,7 @@ class MergeTest { a.setDateofacceptance(field("2021-06-19")); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getDateofacceptance()); assertEquals("2021-06-19", a.getDateofacceptance().getValue()); @@ -448,7 +448,7 @@ class MergeTest { a.setSubject(Arrays.asList(setSP("a", "open", "classe"), setSP("b", "open", "classe"))); b.setSubject(Arrays.asList(setSP("A", "open", "classe"), setSP("c", "open", "classe"))); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertNotNull(a.getSubject()); assertEquals(3, a.getSubject().size()); @@ -462,37 +462,37 @@ class MergeTest { Relation a = createRel(null, null); Relation b = createRel(null, null); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals(a, b); a = createRel(true, null); b = createRel(null, null); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals(true, a.getValidated()); a = createRel(true, null); b = createRel(false, null); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals(true, a.getValidated()); a = createRel(true, null); b = createRel(true, "2016-04-05T12:41:19.202Z"); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals("2016-04-05T12:41:19.202Z", a.getValidationDate()); a = createRel(true, "2016-05-07T12:41:19.202Z"); b = createRel(true, "2016-04-05T12:41:19.202Z"); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals("2016-04-05T12:41:19.202Z", a.getValidationDate()); a = createRel(true, "2020-09-10 11:08:52"); b = createRel(true, "2021-09-10 11:08:52"); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals("2020-09-10 11:08:52", a.getValidationDate()); a = createRel(true, "2021-03-16T10:32:42Z"); b = createRel(true, "2020-03-16T10:32:42Z"); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); assertEquals("2020-03-16T10:32:42Z", a.getValidationDate()); @@ -506,7 +506,7 @@ class MergeTest { assertThrows(DateTimeParseException.class, () -> { Relation a = createRel(true, "Once upon a time ..."); Relation b = createRel(true, "... in a far away land"); - a.mergeFrom(b); + a = OafUtils.mergeOAF(a,b); }); }