|
|
|
@ -70,10 +70,8 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
protected static final String DATACITE_SCHEMA_KERNEL_4_SLASH = "http://datacite.org/schema/kernel-4/";
|
|
|
|
|
protected static final String DATACITE_SCHEMA_KERNEL_3 = "http://datacite.org/schema/kernel-3";
|
|
|
|
|
protected static final String DATACITE_SCHEMA_KERNEL_3_SLASH = "http://datacite.org/schema/kernel-3/";
|
|
|
|
|
protected static final Qualifier ORCID_PID_TYPE = qualifier(
|
|
|
|
|
"ORCID", "Open Researcher and Contributor ID", DNET_PID_TYPES, DNET_PID_TYPES);
|
|
|
|
|
protected static final Qualifier MAG_PID_TYPE = qualifier(
|
|
|
|
|
"MAGIdentifier", "Microsoft Academic Graph Identifier", DNET_PID_TYPES, DNET_PID_TYPES);
|
|
|
|
|
protected static final Qualifier ORCID_PID_TYPE = qualifier("ORCID", "Open Researcher and Contributor ID", DNET_PID_TYPES, DNET_PID_TYPES);
|
|
|
|
|
protected static final Qualifier MAG_PID_TYPE = qualifier("MAGIdentifier", "Microsoft Academic Graph Identifier", DNET_PID_TYPES, DNET_PID_TYPES);
|
|
|
|
|
|
|
|
|
|
protected static final Map<String, String> nsContext = new HashMap<>();
|
|
|
|
|
|
|
|
|
@ -87,8 +85,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
nsContext.put("datacite", DATACITE_SCHEMA_KERNEL_3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected static final Qualifier MAIN_TITLE_QUALIFIER = qualifier(
|
|
|
|
|
"main title", "main title", "dnet:dataCite_title", "dnet:dataCite_title");
|
|
|
|
|
protected static final Qualifier MAIN_TITLE_QUALIFIER = qualifier("main title", "main title", "dnet:dataCite_title", "dnet:dataCite_title");
|
|
|
|
|
|
|
|
|
|
protected AbstractMdRecordToOafMapper(final VocabularyGroup vocs, final boolean invisible) {
|
|
|
|
|
this.vocs = vocs;
|
|
|
|
@ -100,26 +97,20 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
DocumentFactory.getInstance().setXPathNamespaceURIs(nsContext);
|
|
|
|
|
|
|
|
|
|
final Document doc = DocumentHelper
|
|
|
|
|
.parseText(
|
|
|
|
|
xml
|
|
|
|
|
.replaceAll(DATACITE_SCHEMA_KERNEL_4, DATACITE_SCHEMA_KERNEL_3)
|
|
|
|
|
.replaceAll(DATACITE_SCHEMA_KERNEL_4_SLASH, DATACITE_SCHEMA_KERNEL_3)
|
|
|
|
|
.replaceAll(DATACITE_SCHEMA_KERNEL_3_SLASH, DATACITE_SCHEMA_KERNEL_3));
|
|
|
|
|
.parseText(xml
|
|
|
|
|
.replaceAll(DATACITE_SCHEMA_KERNEL_4, DATACITE_SCHEMA_KERNEL_3)
|
|
|
|
|
.replaceAll(DATACITE_SCHEMA_KERNEL_4_SLASH, DATACITE_SCHEMA_KERNEL_3)
|
|
|
|
|
.replaceAll(DATACITE_SCHEMA_KERNEL_3_SLASH, DATACITE_SCHEMA_KERNEL_3));
|
|
|
|
|
|
|
|
|
|
final KeyValue collectedFrom = getProvenanceDatasource(
|
|
|
|
|
doc, "//oaf:collectedFrom/@id", "//oaf:collectedFrom/@name");
|
|
|
|
|
final KeyValue collectedFrom = getProvenanceDatasource(doc, "//oaf:collectedFrom/@id", "//oaf:collectedFrom/@name");
|
|
|
|
|
|
|
|
|
|
if (collectedFrom == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (collectedFrom == null) { return null; }
|
|
|
|
|
|
|
|
|
|
final KeyValue hostedBy = StringUtils.isBlank(doc.valueOf("//oaf:hostedBy/@id"))
|
|
|
|
|
? collectedFrom
|
|
|
|
|
: getProvenanceDatasource(doc, "//oaf:hostedBy/@id", "//oaf:hostedBy/@name");
|
|
|
|
|
|
|
|
|
|
if (hostedBy == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (hostedBy == null) { return null; }
|
|
|
|
|
|
|
|
|
|
final DataInfo info = prepareDataInfo(doc, invisible);
|
|
|
|
|
final long lastUpdateTimestamp = new Date().getTime();
|
|
|
|
@ -161,9 +152,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
final String dsId = doc.valueOf(xpathId);
|
|
|
|
|
final String dsName = doc.valueOf(xpathName);
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isBlank(dsId) | StringUtils.isBlank(dsName)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isBlank(dsId) | StringUtils.isBlank(dsName)) { return null; }
|
|
|
|
|
|
|
|
|
|
return keyValue(createOpenaireId(10, dsId, true), dsName);
|
|
|
|
|
}
|
|
|
|
@ -179,47 +168,47 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
final List<Oaf> oafs = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
switch (type.toLowerCase()) {
|
|
|
|
|
case "publication":
|
|
|
|
|
final Publication p = new Publication();
|
|
|
|
|
populateResultFields(p, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
p.setResulttype(PUBLICATION_DEFAULT_RESULTTYPE);
|
|
|
|
|
p.setJournal(prepareJournal(doc, info));
|
|
|
|
|
oafs.add(p);
|
|
|
|
|
break;
|
|
|
|
|
case "dataset":
|
|
|
|
|
final Dataset d = new Dataset();
|
|
|
|
|
populateResultFields(d, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
d.setResulttype(DATASET_DEFAULT_RESULTTYPE);
|
|
|
|
|
d.setStoragedate(prepareDatasetStorageDate(doc, info));
|
|
|
|
|
d.setDevice(prepareDatasetDevice(doc, info));
|
|
|
|
|
d.setSize(prepareDatasetSize(doc, info));
|
|
|
|
|
d.setVersion(prepareDatasetVersion(doc, info));
|
|
|
|
|
d.setLastmetadataupdate(prepareDatasetLastMetadataUpdate(doc, info));
|
|
|
|
|
d.setMetadataversionnumber(prepareDatasetMetadataVersionNumber(doc, info));
|
|
|
|
|
d.setGeolocation(prepareDatasetGeoLocations(doc, info));
|
|
|
|
|
oafs.add(d);
|
|
|
|
|
break;
|
|
|
|
|
case "software":
|
|
|
|
|
final Software s = new Software();
|
|
|
|
|
populateResultFields(s, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
s.setResulttype(SOFTWARE_DEFAULT_RESULTTYPE);
|
|
|
|
|
s.setDocumentationUrl(prepareSoftwareDocumentationUrls(doc, info));
|
|
|
|
|
s.setLicense(prepareSoftwareLicenses(doc, info));
|
|
|
|
|
s.setCodeRepositoryUrl(prepareSoftwareCodeRepositoryUrl(doc, info));
|
|
|
|
|
s.setProgrammingLanguage(prepareSoftwareProgrammingLanguage(doc, info));
|
|
|
|
|
oafs.add(s);
|
|
|
|
|
break;
|
|
|
|
|
case "":
|
|
|
|
|
case "otherresearchproducts":
|
|
|
|
|
default:
|
|
|
|
|
final OtherResearchProduct o = new OtherResearchProduct();
|
|
|
|
|
populateResultFields(o, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
o.setResulttype(ORP_DEFAULT_RESULTTYPE);
|
|
|
|
|
o.setContactperson(prepareOtherResearchProductContactPersons(doc, info));
|
|
|
|
|
o.setContactgroup(prepareOtherResearchProductContactGroups(doc, info));
|
|
|
|
|
o.setTool(prepareOtherResearchProductTools(doc, info));
|
|
|
|
|
oafs.add(o);
|
|
|
|
|
break;
|
|
|
|
|
case "publication":
|
|
|
|
|
final Publication p = new Publication();
|
|
|
|
|
populateResultFields(p, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
p.setResulttype(PUBLICATION_DEFAULT_RESULTTYPE);
|
|
|
|
|
p.setJournal(prepareJournal(doc, info));
|
|
|
|
|
oafs.add(p);
|
|
|
|
|
break;
|
|
|
|
|
case "dataset":
|
|
|
|
|
final Dataset d = new Dataset();
|
|
|
|
|
populateResultFields(d, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
d.setResulttype(DATASET_DEFAULT_RESULTTYPE);
|
|
|
|
|
d.setStoragedate(prepareDatasetStorageDate(doc, info));
|
|
|
|
|
d.setDevice(prepareDatasetDevice(doc, info));
|
|
|
|
|
d.setSize(prepareDatasetSize(doc, info));
|
|
|
|
|
d.setVersion(prepareDatasetVersion(doc, info));
|
|
|
|
|
d.setLastmetadataupdate(prepareDatasetLastMetadataUpdate(doc, info));
|
|
|
|
|
d.setMetadataversionnumber(prepareDatasetMetadataVersionNumber(doc, info));
|
|
|
|
|
d.setGeolocation(prepareDatasetGeoLocations(doc, info));
|
|
|
|
|
oafs.add(d);
|
|
|
|
|
break;
|
|
|
|
|
case "software":
|
|
|
|
|
final Software s = new Software();
|
|
|
|
|
populateResultFields(s, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
s.setResulttype(SOFTWARE_DEFAULT_RESULTTYPE);
|
|
|
|
|
s.setDocumentationUrl(prepareSoftwareDocumentationUrls(doc, info));
|
|
|
|
|
s.setLicense(prepareSoftwareLicenses(doc, info));
|
|
|
|
|
s.setCodeRepositoryUrl(prepareSoftwareCodeRepositoryUrl(doc, info));
|
|
|
|
|
s.setProgrammingLanguage(prepareSoftwareProgrammingLanguage(doc, info));
|
|
|
|
|
oafs.add(s);
|
|
|
|
|
break;
|
|
|
|
|
case "":
|
|
|
|
|
case "otherresearchproducts":
|
|
|
|
|
default:
|
|
|
|
|
final OtherResearchProduct o = new OtherResearchProduct();
|
|
|
|
|
populateResultFields(o, doc, instances, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
o.setResulttype(ORP_DEFAULT_RESULTTYPE);
|
|
|
|
|
o.setContactperson(prepareOtherResearchProductContactPersons(doc, info));
|
|
|
|
|
o.setContactgroup(prepareOtherResearchProductContactGroups(doc, info));
|
|
|
|
|
o.setTool(prepareOtherResearchProductTools(doc, info));
|
|
|
|
|
oafs.add(o);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!oafs.isEmpty()) {
|
|
|
|
@ -244,25 +233,37 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
|
|
|
|
|
final String originalId = ((Node) o).getText();
|
|
|
|
|
|
|
|
|
|
final String validationdDate = ((Node) o).valueOf("@validationDate");
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(originalId)) {
|
|
|
|
|
final String projectId = createOpenaireId(40, originalId, true);
|
|
|
|
|
|
|
|
|
|
res
|
|
|
|
|
.add(
|
|
|
|
|
getRelation(
|
|
|
|
|
docId, projectId, RESULT_PROJECT, OUTCOME, IS_PRODUCED_BY, collectedFrom, info,
|
|
|
|
|
lastUpdateTimestamp));
|
|
|
|
|
.add(getRelationWithValidationDate(docId, projectId, RESULT_PROJECT, OUTCOME, IS_PRODUCED_BY, collectedFrom, info, lastUpdateTimestamp, validationdDate));
|
|
|
|
|
res
|
|
|
|
|
.add(
|
|
|
|
|
getRelation(
|
|
|
|
|
projectId, docId, RESULT_PROJECT, OUTCOME, PRODUCES, collectedFrom, info,
|
|
|
|
|
lastUpdateTimestamp));
|
|
|
|
|
.add(getRelationWithValidationDate(projectId, docId, RESULT_PROJECT, OUTCOME, PRODUCES, collectedFrom, info, lastUpdateTimestamp, validationdDate));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected Relation getRelationWithValidationDate(final String source,
|
|
|
|
|
final String target,
|
|
|
|
|
final String relType,
|
|
|
|
|
final String subRelType,
|
|
|
|
|
final String relClass,
|
|
|
|
|
final KeyValue collectedFrom,
|
|
|
|
|
final DataInfo info,
|
|
|
|
|
final long lastUpdateTimestamp,
|
|
|
|
|
final String validationDate) {
|
|
|
|
|
|
|
|
|
|
final Relation r = getRelation(source, target, relType, subRelType, relClass, collectedFrom, info, lastUpdateTimestamp);
|
|
|
|
|
r.setValidated(StringUtils.isNotBlank(validationDate));
|
|
|
|
|
r.setValidationDate(StringUtils.isNotBlank(validationDate) ? validationDate : null);
|
|
|
|
|
return r;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected Relation getRelation(final String source,
|
|
|
|
|
final String target,
|
|
|
|
|
final String relType,
|
|
|
|
@ -455,9 +456,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
final String sp = n.valueOf("@sp");
|
|
|
|
|
final String vol = n.valueOf("@vol");
|
|
|
|
|
final String edition = n.valueOf("@edition");
|
|
|
|
|
if (StringUtils.isNotBlank(name)) {
|
|
|
|
|
return journal(name, issnPrinted, issnOnline, issnLinking, ep, iss, sp, vol, edition, null, null, info);
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotBlank(name)) { return journal(name, issnPrinted, issnOnline, issnLinking, ep, iss, sp, vol, edition, null, null, info); }
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
@ -466,9 +465,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
final Node n = doc.selectSingleNode("//*[local-name()='provenance']/*[local-name()='originDescription']");
|
|
|
|
|
if (n != null) {
|
|
|
|
|
final String id = n.valueOf("./*[local-name()='identifier']");
|
|
|
|
|
if (StringUtils.isNotBlank(id)) {
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotBlank(id)) { return id; }
|
|
|
|
|
}
|
|
|
|
|
return doc.valueOf("//*[local-name()='header']/*[local-name()='identifier']");
|
|
|
|
|
|
|
|
|
@ -537,10 +534,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
for (final Object o : node.selectNodes(xpath)) {
|
|
|
|
|
final Node n = (Node) o;
|
|
|
|
|
res
|
|
|
|
|
.add(
|
|
|
|
|
structuredProperty(
|
|
|
|
|
n.getText(), n.valueOf("@classid"), n.valueOf("@classname"), n.valueOf("@schemeid"),
|
|
|
|
|
n.valueOf("@schemename"), info));
|
|
|
|
|
.add(structuredProperty(n.getText(), n.valueOf("@classid"), n.valueOf("@classname"), n.valueOf("@schemeid"), n.valueOf("@schemename"), info));
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
@ -548,9 +542,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
protected OAIProvenance prepareOAIprovenance(final Document doc) {
|
|
|
|
|
final Node n = doc.selectSingleNode("//*[local-name()='provenance']/*[local-name()='originDescription']");
|
|
|
|
|
|
|
|
|
|
if (n == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (n == null) { return null; }
|
|
|
|
|
|
|
|
|
|
final String identifier = n.valueOf("./*[local-name()='identifier']");
|
|
|
|
|
final String baseURL = n.valueOf("./*[local-name()='baseURL']");
|
|
|
|
@ -565,9 +557,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
protected DataInfo prepareDataInfo(final Document doc, final boolean invisible) {
|
|
|
|
|
final Node n = doc.selectSingleNode("//oaf:datainfo");
|
|
|
|
|
|
|
|
|
|
if (n == null) {
|
|
|
|
|
return dataInfo(false, null, false, invisible, REPOSITORY_PROVENANCE_ACTIONS, "0.9");
|
|
|
|
|
}
|
|
|
|
|
if (n == null) { return dataInfo(false, null, false, invisible, REPOSITORY_PROVENANCE_ACTIONS, "0.9"); }
|
|
|
|
|
|
|
|
|
|
final String paClassId = n.valueOf("./oaf:provenanceaction/@classid");
|
|
|
|
|
final String paClassName = n.valueOf("./oaf:provenanceaction/@classname");
|
|
|
|
@ -579,9 +569,7 @@ public abstract class AbstractMdRecordToOafMapper {
|
|
|
|
|
final Boolean inferred = Boolean.parseBoolean(n.valueOf("./oaf:inferred"));
|
|
|
|
|
final String trust = n.valueOf("./oaf:trust");
|
|
|
|
|
|
|
|
|
|
return dataInfo(
|
|
|
|
|
deletedbyinference, inferenceprovenance, inferred, invisible,
|
|
|
|
|
qualifier(paClassId, paClassName, paSchemeId, paSchemeName), trust);
|
|
|
|
|
return dataInfo(deletedbyinference, inferenceprovenance, inferred, invisible, qualifier(paClassId, paClassName, paSchemeId, paSchemeName), trust);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected Field<String> prepareField(final Node node, final String xpath, final DataInfo info) {
|
|
|
|
|