diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java b/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java index ae234dd..e86035a 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java +++ b/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java @@ -30,6 +30,9 @@ public class ModelConstants { public static final String OPENOCITATIONS_NAME = "OpenCitations"; public static final String OPENOCITATIONS_ID = "10|openaire____::c06df618c5de1c786535ccf3f8b7b059"; + public static final String OPEN_APC_NAME = "OpenAPC Initiative"; + public static final String OPEN_APC_ID = "10|openaire____::96c67b8f18814e8428a958028cf5bcc1"; + // VOCABULARY VALUE public static final String ACCESS_RIGHT_OPEN = "OPEN"; public static final String ACCESS_RIGHT_EMBARGO = "EMBARGO"; diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java index 500ff24..071cf53 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java @@ -67,6 +67,18 @@ public class IdentifierFactory implements Serializable { DELEGATED_PID_AUTHORITY.get(PidType.doi).put(ZENODO_R3_ID, "zenodo"); } + /** + * Declares the associations PID_TYPE -> [DATASOURCE ID, NAME] whose records are considered enrichment for the graph. + * Their OpenAIRE ID is built from the declared PID type. Are merged with their corresponding record, identified by + * the same OpenAIRE id. + */ + public static final Map> ENRICHMENT_PROVIDER = Maps.newHashMap(); + + static { + ENRICHMENT_PROVIDER.put(PidType.doi, HashBiMap.create()); + ENRICHMENT_PROVIDER.get(PidType.doi).put(OPEN_APC_ID, OPEN_APC_NAME); + } + public static Set delegatedAuthorityDatasourceIds() { return DELEGATED_PID_AUTHORITY.values() .stream() @@ -184,23 +196,34 @@ public class IdentifierFactory implements Serializable { .stream() // filter away PIDs provided by a DS that is not considered an authority for the // given PID Type - .filter(p -> shouldFilterPidByAuthority(collectedFrom, p, mapHandles)) + .filter(p -> shouldFilterPidByCriteria(collectedFrom, p, mapHandles)) .map(CleaningFunctions::normalizePidValue) .filter(p -> isNotFromDelegatedAuthority(collectedFrom, p)) .filter(CleaningFunctions::pidFilter)) .orElse(Stream.empty()); } - private static boolean shouldFilterPidByAuthority(KeyValue collectedFrom, StructuredProperty p, boolean mapHandles) { + + private static boolean shouldFilterPidByCriteria(KeyValue collectedFrom, StructuredProperty p, boolean mapHandles) { final PidType pType = PidType.tryValueOf(p.getQualifier().getClassid()); - return (mapHandles && pType.equals(PidType.handle)) || Optional.ofNullable(collectedFrom).isPresent() && - Optional - .ofNullable(PID_AUTHORITY.get(pType)) - .map(authorities -> { - return authorities.containsKey(collectedFrom.getKey()) - || authorities.containsValue(collectedFrom.getValue()); - }) + + if (Objects.isNull(collectedFrom)) { + return false; + } + + boolean isEnrich = Optional + .ofNullable(ENRICHMENT_PROVIDER.get(pType)) + .map(enrich -> enrich.containsKey(collectedFrom.getKey()) + || enrich.containsValue(collectedFrom.getValue())) .orElse(false); + + boolean isAuthority = Optional + .ofNullable(PID_AUTHORITY.get(pType)) + .map(authorities -> authorities.containsKey(collectedFrom.getKey()) + || authorities.containsValue(collectedFrom.getValue())) + .orElse(false); + + return (mapHandles && pType.equals(PidType.handle)) || isEnrich || isAuthority; } private static boolean isNotFromDelegatedAuthority(KeyValue collectedFrom, StructuredProperty p) { diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java index 0a434a1..983ae6c 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java @@ -43,6 +43,9 @@ class IdentifierFactoryTest { verifyIdentifier( "publication_pmc2.json", "50|pmc_________::94e4cb08c93f8733b48e2445d04002ac", true); + verifyIdentifier( + "publication_openapc.json", "50|doi_________::79dbc7a2a56dc1532659f9038843256e", true); + final String defaultID = "50|DansKnawCris::0829b5191605bdbea36d6502b8c1ce1f"; verifyIdentifier("publication_3.json", defaultID, true); verifyIdentifier("publication_4.json", defaultID, true); diff --git a/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/publication_openapc.json b/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/publication_openapc.json new file mode 100644 index 0000000..abee510 --- /dev/null +++ b/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/publication_openapc.json @@ -0,0 +1,28 @@ +{ + "id": "50|openapc_____::000023f9cb6e3a247c764daec4273cbc", + "resuttype": { + "classid": "publication" + }, + "instance": [ + { + "collectedfrom": { + "key": "10|openaire____::96c67b8f18814e8428a958028cf5bcc1", + "value": "OpenAPC Initiative" + }, + "pid": [ + { + "qualifier": {"classid": "doi"}, + "value": "10.1016/j.cmet.2010.03.013" + }, + { + "qualifier": {"classid": "pmc"}, + "value": "21459329" + }, + { + "qualifier": {"classid": "pmid"}, + "value": "25811027" + } + ] + } + ] +} \ No newline at end of file