diff --git a/.gitignore b/.gitignore index acea4bc..d16acb4 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,33 @@ buildNumber.properties # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +.DS_Store +.idea +*.iws +*.ipr +*.iml +*.ipr +*.iws +*~ +.vscode +.metals +.bloop +.classpath +/*/.classpath +/*/*/.classpath +.metadata +/*/.metadata +/*/*/.metadata +.project +.settings +/*/*/target +/*/target +/target +/*/*/build +/*/build +/build +spark-warehouse +/**/job-override.properties +/**/*.log +/**/.factorypath + diff --git a/README.md b/README.md index e9719f3..7431cda 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ -# Description of the project - -This project defines **object schemas** of the OpenAIRE Graph main entities and the relationships among them, both internal and public (dump) definitions. +Description of the project +-------------------------- +This project defines **object schemas** of the OpenAIRE main entities and the relationships that intercur among them. +Namely it defines the model for + +- **research product (result)** which subclasses in publication, dataset, other research product, software +- **data source** object describing the data provider (institutional repository, aggregators, cris systems) +- **organization** research bodies managing a data source or participating to a research project +- **project** research project -The serialization of such objects (data store files) are used to pass data between workflow nodes in the processing pipeline. - -Furthermore, the module defines the schema for the following subsystems -* ActionSet framework -* Metadata Records managed in the aggregation processes -* Scholexplorer Graph model classes +Te serialization of such objects (data store files) are used to pass data between workflow nodes in the processing pipeline. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d8b5022 --- /dev/null +++ b/pom.xml @@ -0,0 +1,343 @@ + + + 4.0.0 + + eu.dnetlib.dhp + dhp-schemas + jar + 2.2.4-SNAPSHOT + + + + GNU Affero General Public License v3.0 or later + https://spdx.org/licenses/AGPL-3.0-or-later.html#licenseText + repo + This program is free software: you can redistribute it and/or modify it under the terms of the + GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + + + + Redmine + https://issue.openaire.research-infrastructures.eu/projects/openaire + + + + jenkins + https://jenkins-dnet.d4science.org/ + + + + scm:git:gitea@code-repo.d4science.org:D-Net/dhp-schemas.git + scm:git:gitea@code-repo.d4science.org:D-Net/dhp-schemas.git + https://code-repo.d4science.org/D-Net/dhp-schemas/ + HEAD + + + This module contains common schema classes meant to be used across the dnet-hadoop submodules + + + + dnet45-releases + D-Net 45 releases + https://maven.d4science.org/nexus/content/repositories/dnet45-releases + default + + false + + + true + + + + dnet45-snapshots + D-Net 45 snapshots + https://maven.d4science.org/nexus/content/repositories/dnet45-snapshots + default + + false + + + false + + + + + + target + target/classes + ${project.artifactId}-${project.version} + target/test-classes + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-site-plugin + 3.7.1 + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + 1.8 + 1.8 + ${project.build.sourceEncoding} + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-sources + verify + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M4 + + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.2.0 + + true + none + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.0 + + + + + + org.apache.maven.plugins + maven-site-plugin + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + net.revelc.code + impsort-maven-plugin + 1.4.1 + + java.,javax.,org.,com. + java,* + + **/thrift/*.java + + + + + sort-imports + + sort + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + org.jacoco + jacoco-maven-plugin + 0.7.9 + + + **/schemas/* + **/com/cloudera/**/* + **/org/apache/avro/io/**/* + + + + + default-prepare-agent + + prepare-agent + + + + default-report + prepare-package + + report + + + + + + net.alchim31.maven + scala-maven-plugin + 4.0.1 + + + scala-compile-first + initialize + + add-source + compile + + + + scala-test-compile + process-test-resources + + testCompile + + + + + ${scala.version} + + + + + + + + + + + org.slf4j + jcl-over-slf4j + 1.7.25 + provided + + + + org.apache.commons + commons-lang3 + ${dhp.commons.lang.version} + + + + com.google.guava + guava + ${dhp.guava.version} + + + + commons-codec + commons-codec + 1.9 + + + + commons-io + commons-io + 2.4 + + + + com.fasterxml.jackson.core + jackson-databind + ${dhp.jackson.version} + provided + + + + + + + + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test + + + + org.mockito + mockito-core + ${mockito-core.version} + test + + + + org.mockito + mockito-junit-jupiter + ${mockito-core.version} + test + + + + commons-io + commons-io + + + + org.apache.commons + commons-lang3 + + + + com.fasterxml.jackson.core + jackson-databind + + + + com.google.guava + guava + + + + commons-codec + commons-codec + + + + + + UTF-8 + UTF-8 + 3.6.0 + 1.8 + 1.8 + 2.22.2 + 2.0.1 + 2.9.6 + 3.5 + 11.0.2 + 2.11.12 + 5.6.1 + 3.3.3 + + + + diff --git a/src/main/java/eu/dnetlib/dhp/schema/action/AtomicAction.java b/src/main/java/eu/dnetlib/dhp/schema/action/AtomicAction.java new file mode 100644 index 0000000..84b22c8 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/action/AtomicAction.java @@ -0,0 +1,40 @@ + +package eu.dnetlib.dhp.schema.action; + +import java.io.Serializable; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +import eu.dnetlib.dhp.schema.oaf.Oaf; + +@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/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java b/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java new file mode 100644 index 0000000..f30fb44 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java @@ -0,0 +1,31 @@ + +package eu.dnetlib.dhp.schema.action; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +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; + +public class AtomicActionDeserializer extends JsonDeserializer { + + @Override + public AtomicAction deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException { + 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/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java b/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java new file mode 100644 index 0000000..6116bc4 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java @@ -0,0 +1,70 @@ + +package eu.dnetlib.dhp.schema.common; + +import java.util.Comparator; + +import eu.dnetlib.dhp.schema.oaf.AccessRight; +import eu.dnetlib.dhp.schema.oaf.Qualifier; + +public class AccessRightComparator implements Comparator { + + @Override + public int compare(T left, T right) { + + if (left == null && right == null) + return 0; + if (left == null) + return 1; + if (right == null) + return -1; + + String lClass = left.getClassid(); + String rClass = right.getClassid(); + + if (lClass.equals(rClass)) + return 0; + + if (lClass.equals("OPEN SOURCE")) + return -1; + if (rClass.equals("OPEN SOURCE")) + return 1; + + if (lClass.equals("OPEN")) + return -1; + if (rClass.equals("OPEN")) + return 1; + + if (lClass.equals("6MONTHS")) + return -1; + if (rClass.equals("6MONTHS")) + return 1; + + if (lClass.equals("12MONTHS")) + return -1; + if (rClass.equals("12MONTHS")) + return 1; + + if (lClass.equals("EMBARGO")) + return -1; + if (rClass.equals("EMBARGO")) + return 1; + + if (lClass.equals("RESTRICTED")) + return -1; + if (rClass.equals("RESTRICTED")) + return 1; + + if (lClass.equals("CLOSED")) + return -1; + if (rClass.equals("CLOSED")) + return 1; + + if (lClass.equals("UNKNOWN")) + return -1; + if (rClass.equals("UNKNOWN")) + return 1; + + // Else (but unlikely), lexicographical ordering will do. + return lClass.compareTo(rClass); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/EntityType.java b/src/main/java/eu/dnetlib/dhp/schema/common/EntityType.java new file mode 100644 index 0000000..54f30cf --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/common/EntityType.java @@ -0,0 +1,21 @@ + +package eu.dnetlib.dhp.schema.common; + +import eu.dnetlib.dhp.schema.oaf.OafEntity; + +/** Actual entity types in the Graph */ +public enum EntityType { + publication, dataset, otherresearchproduct, software, datasource, organization, project; + + /** + * Resolves the EntityType, given the relative class name + * + * @param clazz the given class name + * @param actual OafEntity subclass + * @return the EntityType associated to the given class + */ + public static EntityType fromClass(Class clazz) { + + return EntityType.valueOf(clazz.getSimpleName().toLowerCase()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/MainEntityType.java b/src/main/java/eu/dnetlib/dhp/schema/common/MainEntityType.java new file mode 100644 index 0000000..cda8ba4 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/common/MainEntityType.java @@ -0,0 +1,7 @@ + +package eu.dnetlib.dhp.schema.common; + +/** Main entity types in the Graph */ +public enum MainEntityType { + result, datasource, organization, project +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java b/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java new file mode 100644 index 0000000..06781c4 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java @@ -0,0 +1,175 @@ + +package eu.dnetlib.dhp.schema.common; + +import eu.dnetlib.dhp.schema.oaf.*; + +public class ModelConstants { + + public static final String ORCID = "orcid"; + public static final String ORCID_PENDING = "orcid_pending"; + public static final String ORCID_CLASSNAME = "Open Researcher and Contributor ID"; + + public static final String CROSSREF_ID = "10|openaire____::081b82f96300b6a6e3d282bad31cb6e2"; + public static final String DATACITE_ID = "10|openaire____::9e3be59865b2c1c335d32dae2fe7b254"; + + public static final String EUROPE_PUBMED_CENTRAL_ID = "10|opendoar____::8b6dd7db9af49e67306feb59a8bdc52c"; + public static final String PUBMED_CENTRAL_ID = "10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357"; + public static final String ARXIV_ID = "10|opendoar____::6f4922f45568161a8cdf4ad2299f6d23"; + + public static final String OPENORGS_NAME = "OpenOrgs Database"; + + // VOCABULARY VALUE + public static final String ACCESS_RIGHT_OPEN = "OPEN"; + + public static final String DNET_SUBJECT_TYPOLOGIES = "dnet:subject_classification_typologies"; + public static final String DNET_RESULT_TYPOLOGIES = "dnet:result_typologies"; + public static final String DNET_PUBLICATION_RESOURCE = "dnet:publication_resource"; + public static final String DNET_ACCESS_MODES = "dnet:access_modes"; + public static final String DNET_LANGUAGES = "dnet:languages"; + public static final String DNET_PID_TYPES = "dnet:pid_types"; + public static final String DNET_DATACITE_DATE = "dnet:dataCite_date"; + public static final String DNET_DATACITE_TITLE = "dnet:dataCite_title"; + public static final String DNET_DATA_CITE_RESOURCE = "dnet:dataCite_resource"; + public static final String DNET_PROVENANCE_ACTIONS = "dnet:provenanceActions"; + public static final String DNET_COUNTRY_TYPE = "dnet:countries"; + public static final String DNET_REVIEW_LEVELS = "dnet:review_levels"; + public static final String DNET_PROGRAMMING_LANGUAGES = "dnet:programming_languages"; + public static final String DNET_EXTERNAL_REF_TYPES = "dnet:externalReference_typologies"; + + public static final String SYSIMPORT_CROSSWALK_REPOSITORY = "sysimport:crosswalk:repository"; + public static final String SYSIMPORT_CROSSWALK_ENTITYREGISTRY = "sysimport:crosswalk:entityregistry"; + public static final String SYSIMPORT_ACTIONSET = "sysimport:actionset"; + public static final String SYSIMPORT_ORCID_NO_DOI = "sysimport:actionset:orcidworks-no-doi"; + + public static final String USER_CLAIM = "user:claim"; + public static final String HARVESTED = "Harvested"; + + public static final String PROVENANCE_DEDUP = "sysimport:dedup"; + + public static final Qualifier PROVENANCE_ACTION_SET_QUALIFIER = qualifier( + SYSIMPORT_ACTIONSET, SYSIMPORT_ACTIONSET, DNET_PROVENANCE_ACTIONS, DNET_PROVENANCE_ACTIONS); + + public static final String DATASET_RESULTTYPE_CLASSID = "dataset"; + public static final String PUBLICATION_RESULTTYPE_CLASSID = "publication"; + public static final String SOFTWARE_RESULTTYPE_CLASSID = "software"; + public static final String ORP_RESULTTYPE_CLASSID = "other"; + + public static final String RESULT_RESULT = "resultResult"; + /** + * @deprecated Use {@link ModelConstants#RELATIONSHIP} instead. + */ + @Deprecated + public static final String PUBLICATION_DATASET = "publicationDataset"; + public static final String IS_RELATED_TO = "isRelatedTo"; + public static final String SUPPLEMENT = "supplement"; + public static final String IS_SUPPLEMENT_TO = "isSupplementTo"; + public static final String IS_SUPPLEMENTED_BY = "isSupplementedBy"; + public static final String PART = "part"; + public static final String IS_PART_OF = "isPartOf"; + public static final String HAS_PART = "hasPart"; + public static final String RELATIONSHIP = "relationship"; + public static final String CITATION = "citation"; + public static final String CITES = "cites"; + public static final String IS_CITED_BY = "isCitedBy"; + public static final String REVIEW = "review"; // subreltype + public static final String REVIEWS = "reviews"; + public static final String IS_REVIEWED_BY = "isReviewedBy"; + + public static final String RESULT_PROJECT = "resultProject"; + public static final String OUTCOME = "outcome"; + public static final String IS_PRODUCED_BY = "isProducedBy"; + public static final String PRODUCES = "produces"; + + public static final String DATASOURCE_ORGANIZATION = "datasourceOrganization"; + public static final String PROVISION = "provision"; + public static final String IS_PROVIDED_BY = "isProvidedBy"; + public static final String PROVIDES = "provides"; + + public static final String PROJECT_ORGANIZATION = "projectOrganization"; + public static final String PARTICIPATION = "participation"; + public static final String HAS_PARTICIPANT = "hasParticipant"; + public static final String IS_PARTICIPANT = "isParticipant"; + + public static final String RESULT_ORGANIZATION = "resultOrganization"; + public static final String AFFILIATION = "affiliation"; + public static final String IS_AUTHOR_INSTITUTION_OF = "isAuthorInstitutionOf"; + public static final String HAS_AUTHOR_INSTITUTION = "hasAuthorInstitution"; + + public static final String ORG_ORG_RELTYPE = "organizationOrganization"; + + public static final String DEDUP = "dedup"; + public static final String MERGES = "merges"; + public static final String IS_MERGED_IN = "isMergedIn"; + + public static final String SIMILARITY = "similarity"; + public static final String IS_SIMILAR_TO = "isSimilarTo"; + + public static final String IS_DIFFERENT_FROM = "isDifferentFrom"; + + public static final String UNKNOWN = "UNKNOWN"; + public static final String NOT_AVAILABLE = "not available"; + + public static final Qualifier PUBLICATION_DEFAULT_RESULTTYPE = qualifier( + PUBLICATION_RESULTTYPE_CLASSID, PUBLICATION_RESULTTYPE_CLASSID, + DNET_RESULT_TYPOLOGIES, DNET_RESULT_TYPOLOGIES); + + public static final Qualifier DATASET_DEFAULT_RESULTTYPE = qualifier( + DATASET_RESULTTYPE_CLASSID, DATASET_RESULTTYPE_CLASSID, + DNET_RESULT_TYPOLOGIES, DNET_RESULT_TYPOLOGIES); + + public static final Qualifier SOFTWARE_DEFAULT_RESULTTYPE = qualifier( + SOFTWARE_RESULTTYPE_CLASSID, SOFTWARE_RESULTTYPE_CLASSID, + DNET_RESULT_TYPOLOGIES, DNET_RESULT_TYPOLOGIES); + + public static final Qualifier ORP_DEFAULT_RESULTTYPE = qualifier( + ORP_RESULTTYPE_CLASSID, ORP_RESULTTYPE_CLASSID, + DNET_RESULT_TYPOLOGIES, DNET_RESULT_TYPOLOGIES); + + public static final Qualifier REPOSITORY_PROVENANCE_ACTIONS = qualifier( + SYSIMPORT_CROSSWALK_REPOSITORY, SYSIMPORT_CROSSWALK_REPOSITORY, + DNET_PROVENANCE_ACTIONS, DNET_PROVENANCE_ACTIONS); + + public static final Qualifier ENTITYREGISTRY_PROVENANCE_ACTION = qualifier( + SYSIMPORT_CROSSWALK_ENTITYREGISTRY, SYSIMPORT_CROSSWALK_ENTITYREGISTRY, + DNET_PROVENANCE_ACTIONS, DNET_PROVENANCE_ACTIONS); + + public static final String UNKNOWN_REPOSITORY_ORIGINALID = "openaire____::1256f046-bf1f-4afc-8b47-d0b147148b18"; + public static final KeyValue UNKNOWN_REPOSITORY = keyValue( + "10|openaire____::55045bd2a65019fd8e6741a755395c8c", "Unknown Repository"); + + public static final Qualifier UNKNOWN_COUNTRY = qualifier(UNKNOWN, "Unknown", DNET_COUNTRY_TYPE, DNET_COUNTRY_TYPE); + + public static final Qualifier MAIN_TITLE_QUALIFIER = qualifier( + "main title", "main title", DNET_DATACITE_TITLE, DNET_DATACITE_TITLE); + + public static final AccessRight OPEN_ACCESS_RIGHT() { + + final AccessRight result = new AccessRight(); + result.setClassid(ACCESS_RIGHT_OPEN); + result.setClassid(ACCESS_RIGHT_OPEN); + result.setSchemeid(ModelConstants.DNET_ACCESS_MODES); + result.setSchemename(ModelConstants.DNET_ACCESS_MODES); + return result; + } + + private static Qualifier qualifier( + final String classid, + final String classname, + final String schemeid, + final String schemename) { + final Qualifier q = new Qualifier(); + q.setClassid(classid); + q.setClassname(classname); + q.setSchemeid(schemeid); + q.setSchemename(schemename); + return q; + } + + private static KeyValue keyValue(String key, String value) { + KeyValue kv = new KeyValue(); + kv.setKey(key); + kv.setValue(value); + kv.setDataInfo(new DataInfo()); + return kv; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java b/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java new file mode 100644 index 0000000..cfe2165 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java @@ -0,0 +1,512 @@ + +package eu.dnetlib.dhp.schema.common; + +import static com.google.common.base.Preconditions.checkArgument; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.lang3.StringUtils; + +import com.google.common.collect.Maps; + +import eu.dnetlib.dhp.schema.oaf.*; + +/** Oaf model utility methods. */ +public class ModelSupport { + + /** Defines the mapping between the actual entity type and the main entity type */ + private static Map entityMapping = Maps.newHashMap(); + + static { + entityMapping.put(EntityType.publication, MainEntityType.result); + entityMapping.put(EntityType.dataset, MainEntityType.result); + entityMapping.put(EntityType.otherresearchproduct, MainEntityType.result); + entityMapping.put(EntityType.software, MainEntityType.result); + entityMapping.put(EntityType.datasource, MainEntityType.datasource); + entityMapping.put(EntityType.organization, MainEntityType.organization); + entityMapping.put(EntityType.project, MainEntityType.project); + } + + /** + * Defines the mapping between the actual entity types and the relative classes implementing them + */ + public static final Map> entityTypes = Maps.newHashMap(); + + static { + entityTypes.put(EntityType.datasource, Datasource.class); + entityTypes.put(EntityType.organization, Organization.class); + entityTypes.put(EntityType.project, Project.class); + entityTypes.put(EntityType.dataset, Dataset.class); + entityTypes.put(EntityType.otherresearchproduct, OtherResearchProduct.class); + entityTypes.put(EntityType.software, Software.class); + entityTypes.put(EntityType.publication, Publication.class); + } + + public static final Map oafTypes = Maps.newHashMap(); + + static { + oafTypes.put("datasource", Datasource.class); + oafTypes.put("organization", Organization.class); + oafTypes.put("project", Project.class); + oafTypes.put("dataset", Dataset.class); + oafTypes.put("otherresearchproduct", OtherResearchProduct.class); + oafTypes.put("software", Software.class); + oafTypes.put("publication", Publication.class); + oafTypes.put("relation", Relation.class); + } + + public static final Map idPrefixMap = Maps.newHashMap(); + + static { + idPrefixMap.put(Datasource.class, "10"); + idPrefixMap.put(Organization.class, "20"); + idPrefixMap.put(Project.class, "40"); + idPrefixMap.put(Dataset.class, "50"); + idPrefixMap.put(OtherResearchProduct.class, "50"); + idPrefixMap.put(Software.class, "50"); + idPrefixMap.put(Publication.class, "50"); + } + + public static final Map entityIdPrefix = Maps.newHashMap(); + + static { + entityIdPrefix.put("datasource", "10"); + entityIdPrefix.put("organization", "20"); + entityIdPrefix.put("project", "40"); + entityIdPrefix.put("result", "50"); + } + + public static final Map idPrefixEntity = Maps.newHashMap(); + + static { + idPrefixEntity.put("10", "datasource"); + idPrefixEntity.put("20", "organization"); + idPrefixEntity.put("40", "project"); + idPrefixEntity.put("50", "result"); + } + + public static final Map relationInverseMap = Maps.newHashMap(); + + static { + relationInverseMap + .put( + "personResult_authorship_isAuthorOf", new RelationInverse() + .setRelation("isAuthorOf") + .setInverse("hasAuthor") + .setRelType("personResult") + .setSubReltype("authorship")); + relationInverseMap + .put( + "personResult_authorship_hasAuthor", new RelationInverse() + .setInverse("isAuthorOf") + .setRelation("hasAuthor") + .setRelType("personResult") + .setSubReltype("authorship")); + relationInverseMap + .put( + "projectOrganization_participation_isParticipant", new RelationInverse() + .setRelation(ModelConstants.IS_PARTICIPANT) + .setInverse(ModelConstants.HAS_PARTICIPANT) + .setRelType(ModelConstants.PROJECT_ORGANIZATION) + .setSubReltype(ModelConstants.PARTICIPATION)); + relationInverseMap + .put( + "projectOrganization_participation_hasParticipant", new RelationInverse() + .setInverse(ModelConstants.IS_PARTICIPANT) + .setRelation(ModelConstants.HAS_PARTICIPANT) + .setRelType(ModelConstants.PROJECT_ORGANIZATION) + .setSubReltype(ModelConstants.PARTICIPATION)); + relationInverseMap + .put( + "resultOrganization_affiliation_hasAuthorInstitution", new RelationInverse() + .setRelation(ModelConstants.HAS_AUTHOR_INSTITUTION) + .setInverse(ModelConstants.IS_AUTHOR_INSTITUTION_OF) + .setRelType(ModelConstants.RESULT_ORGANIZATION) + .setSubReltype(ModelConstants.AFFILIATION)); + relationInverseMap + .put( + "resultOrganization_affiliation_isAuthorInstitutionOf", new RelationInverse() + .setInverse(ModelConstants.HAS_AUTHOR_INSTITUTION) + .setRelation(ModelConstants.IS_AUTHOR_INSTITUTION_OF) + .setRelType(ModelConstants.RESULT_ORGANIZATION) + .setSubReltype(ModelConstants.AFFILIATION)); + relationInverseMap + .put( + "organizationOrganization_dedup_merges", new RelationInverse() + .setRelation(ModelConstants.MERGES) + .setInverse(ModelConstants.IS_MERGED_IN) + .setRelType(ModelConstants.ORG_ORG_RELTYPE) + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "organizationOrganization_dedup_isMergedIn", new RelationInverse() + .setInverse(ModelConstants.MERGES) + .setRelation(ModelConstants.IS_MERGED_IN) + .setRelType(ModelConstants.ORG_ORG_RELTYPE) + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "organizationOrganization_dedupSimilarity_isSimilarTo", new RelationInverse() + .setInverse(ModelConstants.IS_SIMILAR_TO) + .setRelation(ModelConstants.IS_SIMILAR_TO) + .setRelType(ModelConstants.ORG_ORG_RELTYPE) + .setSubReltype(ModelConstants.DEDUP)); + + relationInverseMap + .put( + "resultProject_outcome_isProducedBy", new RelationInverse() + .setRelation(ModelConstants.IS_PRODUCED_BY) + .setInverse(ModelConstants.PRODUCES) + .setRelType(ModelConstants.RESULT_PROJECT) + .setSubReltype(ModelConstants.OUTCOME)); + relationInverseMap + .put( + "resultProject_outcome_produces", new RelationInverse() + .setInverse(ModelConstants.IS_PRODUCED_BY) + .setRelation(ModelConstants.PRODUCES) + .setRelType(ModelConstants.RESULT_PROJECT) + .setSubReltype(ModelConstants.OUTCOME)); + relationInverseMap + .put( + "projectPerson_contactPerson_isContact", new RelationInverse() + .setRelation("isContact") + .setInverse("hasContact") + .setRelType("projectPerson") + .setSubReltype("contactPerson")); + relationInverseMap + .put( + "projectPerson_contactPerson_hasContact", new RelationInverse() + .setInverse("isContact") + .setRelation("hasContact") + .setRelType("personPerson") + .setSubReltype("coAuthorship")); + relationInverseMap + .put( + "personPerson_coAuthorship_isCoauthorOf", new RelationInverse() + .setInverse("isCoAuthorOf") + .setRelation("isCoAuthorOf") + .setRelType("personPerson") + .setSubReltype("coAuthorship")); + relationInverseMap + .put( + "personPerson_dedup_merges", new RelationInverse() + .setInverse(ModelConstants.IS_MERGED_IN) + .setRelation(ModelConstants.MERGES) + .setRelType("personPerson") + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "personPerson_dedup_isMergedIn", new RelationInverse() + .setInverse(ModelConstants.MERGES) + .setRelation(ModelConstants.IS_MERGED_IN) + .setRelType("personPerson") + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "personPerson_dedupSimilarity_isSimilarTo", new RelationInverse() + .setInverse(ModelConstants.IS_SIMILAR_TO) + .setRelation(ModelConstants.IS_SIMILAR_TO) + .setRelType("personPerson") + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "datasourceOrganization_provision_isProvidedBy", new RelationInverse() + .setInverse(ModelConstants.PROVIDES) + .setRelation(ModelConstants.IS_PROVIDED_BY) + .setRelType(ModelConstants.DATASOURCE_ORGANIZATION) + .setSubReltype(ModelConstants.PROVISION)); + relationInverseMap + .put( + "datasourceOrganization_provision_provides", new RelationInverse() + .setInverse(ModelConstants.IS_PROVIDED_BY) + .setRelation(ModelConstants.PROVIDES) + .setRelType(ModelConstants.DATASOURCE_ORGANIZATION) + .setSubReltype(ModelConstants.PROVISION)); + relationInverseMap + .put( + "resultResult_similarity_hasAmongTopNSimilarDocuments", new RelationInverse() + .setInverse("isAmongTopNSimilarDocuments") + .setRelation("hasAmongTopNSimilarDocuments") + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.SIMILARITY)); + relationInverseMap + .put( + "resultResult_similarity_isAmongTopNSimilarDocuments", new RelationInverse() + .setInverse("hasAmongTopNSimilarDocuments") + .setRelation("isAmongTopNSimilarDocuments") + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.SIMILARITY)); + relationInverseMap + .put( + "resultResult_relationship_isRelatedTo", new RelationInverse() + .setInverse(ModelConstants.IS_RELATED_TO) + .setRelation(ModelConstants.IS_RELATED_TO) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.RELATIONSHIP)); + relationInverseMap + .put( + "resultResult_supplement_isSupplementTo", new RelationInverse() + .setInverse(ModelConstants.IS_SUPPLEMENTED_BY) + .setRelation(ModelConstants.IS_SUPPLEMENT_TO) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.SUPPLEMENT)); + relationInverseMap + .put( + "resultResult_supplement_isSupplementedBy", new RelationInverse() + .setInverse(ModelConstants.IS_SUPPLEMENT_TO) + .setRelation(ModelConstants.IS_SUPPLEMENTED_BY) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.SUPPLEMENT)); + relationInverseMap + .put( + "resultResult_part_isPartOf", new RelationInverse() + .setInverse(ModelConstants.HAS_PART) + .setRelation(ModelConstants.IS_PART_OF) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.PART)); + relationInverseMap + .put( + "resultResult_part_hasPart", new RelationInverse() + .setInverse(ModelConstants.IS_PART_OF) + .setRelation(ModelConstants.HAS_PART) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.PART)); + relationInverseMap + .put( + "resultResult_dedup_merges", new RelationInverse() + .setInverse(ModelConstants.IS_MERGED_IN) + .setRelation(ModelConstants.MERGES) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "resultResult_dedup_isMergedIn", new RelationInverse() + .setInverse(ModelConstants.MERGES) + .setRelation(ModelConstants.IS_MERGED_IN) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.DEDUP)); + relationInverseMap + .put( + "resultResult_dedupSimilarity_isSimilarTo", new RelationInverse() + .setInverse(ModelConstants.IS_SIMILAR_TO) + .setRelation(ModelConstants.IS_SIMILAR_TO) + .setRelType(ModelConstants.RESULT_RESULT) + .setSubReltype(ModelConstants.DEDUP)); + + } + + private static final String schemeTemplate = "dnet:%s_%s_relations"; + + private ModelSupport() { + } + + public static String getIdPrefix(Class clazz) { + return idPrefixMap.get(clazz); + } + + /** + * Checks subclass-superclass relationship. + * + * @param subClazzObject Subclass object instance + * @param superClazzObject Superclass object instance + * @param Subclass type + * @param Superclass type + * @return True if X is a subclass of Y + */ + public static Boolean isSubClass( + X subClazzObject, Y superClazzObject) { + return isSubClass(subClazzObject.getClass(), superClazzObject.getClass()); + } + + /** + * Checks subclass-superclass relationship. + * + * @param subClazzObject Subclass object instance + * @param superClazz Superclass class + * @param Subclass type + * @param Superclass type + * @return True if X is a subclass of Y + */ + public static Boolean isSubClass( + X subClazzObject, Class superClazz) { + return isSubClass(subClazzObject.getClass(), superClazz); + } + + /** + * Checks subclass-superclass relationship. + * + * @param subClazz Subclass class + * @param superClazz Superclass class + * @param Subclass type + * @param Superclass type + * @return True if X is a subclass of Y + */ + public static Boolean isSubClass( + Class subClazz, Class superClazz) { + return superClazz.isAssignableFrom(subClazz); + } + + /** + * Lists all the OAF model classes + * + * @param + * @return + */ + public static Class[] getOafModelClasses() { + return new Class[] { + Author.class, + Context.class, + Country.class, + DataInfo.class, + Dataset.class, + Datasource.class, + ExternalReference.class, + ExtraInfo.class, + Field.class, + GeoLocation.class, + Instance.class, + AccessRight.class, + OpenAccessRoute.class, + Journal.class, + KeyValue.class, + Oaf.class, + OafEntity.class, + OAIProvenance.class, + Organization.class, + OriginDescription.class, + OtherResearchProduct.class, + Project.class, + Publication.class, + Qualifier.class, + Relation.class, + Result.class, + Software.class, + StructuredProperty.class + }; + } + + public static String getMainType(final EntityType type) { + return entityMapping.get(type).name(); + } + + public static boolean isResult(EntityType type) { + return MainEntityType.result.name().equals(getMainType(type)); + } + + public static String getScheme(final String sourceType, final String targetType) { + return String + .format( + schemeTemplate, + entityMapping.get(EntityType.valueOf(sourceType)).name(), + entityMapping.get(EntityType.valueOf(targetType)).name()); + } + + public static String tableIdentifier(String dbName, String tableName) { + + checkArgument(StringUtils.isNotBlank(dbName), "DB name cannot be empty"); + checkArgument(StringUtils.isNotBlank(tableName), "table name cannot be empty"); + + return String.format("%s.%s", dbName, tableName); + } + + public static String tableIdentifier(String dbName, Class clazz) { + + checkArgument(Objects.nonNull(clazz), "clazz is needed to derive the table name, thus cannot be null"); + + return tableIdentifier(dbName, clazz.getSimpleName().toLowerCase()); + } + + public static Function idFn() { + return x -> { + if (isSubClass(x, Relation.class)) { + return idFnForRelation(x); + } + return idFnForOafEntity(x); + }; + } + + private static String idFnForRelation(T t) { + Relation r = (Relation) t; + return Optional + .ofNullable(r.getSource()) + .map( + source -> Optional + .ofNullable(r.getTarget()) + .map( + target -> Optional + .ofNullable(r.getRelType()) + .map( + relType -> Optional + .ofNullable(r.getSubRelType()) + .map( + subRelType -> Optional + .ofNullable(r.getRelClass()) + .map( + relClass -> String + .join( + source, + target, + relType, + subRelType, + relClass)) + .orElse( + String + .join( + source, + target, + relType, + subRelType))) + .orElse(String.join(source, target, relType))) + .orElse(String.join(source, target))) + .orElse(source)) + .orElse(null); + } + + private static String idFnForOafEntity(T t) { + return ((OafEntity) t).getId(); + } + + public static String md5(final String s) { + try { + final MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(s.getBytes(StandardCharsets.UTF_8)); + return new String(Hex.encodeHex(md.digest())); + } catch (final NoSuchAlgorithmException e) { + throw new IllegalStateException(e); + } + } + + public static String generateIdentifier(final String originalId, final String nsPrefix) { + return String.format("%s::%s", nsPrefix, md5(originalId)); + } + + public static String oldest(String dateA, String dateB) throws ParseException { + + if (StringUtils.isBlank(dateA)) { + return dateB; + } + if (StringUtils.isBlank(dateB)) { + return dateA; + } + if (StringUtils.isNotBlank(dateA) && StringUtils.isNotBlank(dateB)) { + + final Date a = Date.from(Instant.from(DateTimeFormatter.ISO_INSTANT.parse(dateA))); + final Date b = Date.from(Instant.from(DateTimeFormatter.ISO_INSTANT.parse(dateB))); + + return a.before(b) ? dateA : dateB; + } else { + return null; + } + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java b/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java new file mode 100644 index 0000000..4757c63 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java @@ -0,0 +1,46 @@ + +package eu.dnetlib.dhp.schema.common; + +public class RelationInverse { + private String relation; + private String inverse; + private String relType; + private String subReltype; + + public String getRelType() { + return relType; + } + + public RelationInverse setRelType(String relType) { + this.relType = relType; + return this; + } + + public String getSubReltype() { + return subReltype; + } + + public RelationInverse setSubReltype(String subReltype) { + this.subReltype = subReltype; + return this; + } + + public String getRelation() { + return relation; + } + + public RelationInverse setRelation(String relation) { + this.relation = relation; + return this; + } + + public String getInverse() { + return inverse; + } + + public RelationInverse setInverse(String inverse) { + this.inverse = inverse; + return this; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/APC.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/APC.java new file mode 100644 index 0000000..7f5dcb3 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/APC.java @@ -0,0 +1,29 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +/** + * Used to refer to the Article Processing Charge information. Not dumped in this release. It contains two parameters: - + * currency of type String to store the currency of the APC - amount of type String to stores the charged amount + */ +public class APC implements Serializable { + private String currency; + private String amount; + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java new file mode 100644 index 0000000..f28c544 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java @@ -0,0 +1,31 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +/** + * AccessRight. Used to represent the result access rights. It extends the eu.dnet.lib.dhp.schema.dump.oaf.Qualifier + * element with a parameter scheme of type String to store the scheme. Values for this element are found against the + * COAR access right scheme. The classid of the element accessright in eu.dnetlib.dhp.schema.oaf.Result is used to get + * the COAR corresponding code whose value will be used to set the code parameter. The COAR label corresponding to the + * COAR code will be used to set the label parameter. The scheme value will always be the one referring to the COAR + * access right scheme + */ +public class AccessRight extends Qualifier { + + private String scheme; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public static AccessRight newInstance(String code, String label, String scheme) { + AccessRight ar = new AccessRight(); + ar.setCode(code); + ar.setLabel(label); + ar.setScheme(scheme); + return ar; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java new file mode 100644 index 0000000..34920bc --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java @@ -0,0 +1,73 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; +import java.util.List; + +/** + * Used to represent the generic author of the result. It has six parameters: - name of type String to store the given + * name of the author. The value for this parameter corresponds to eu.dnetlib.dhp.schema.oaf.Author name - surname of + * type String to store the family name of the author. The value for this parameter corresponds to + * eu.dnetlib.dhp.schema.oaf.Author surname - fullname of type String to store the fullname of the author. The value for + * this parameter corresponds to eu.dnetlib.dhp.schema.oaf.Author fullname - rank of type Integer to store the rank on + * the author in the result's authors list. The value for this parameter corresponds to eu.dnetlib.dhp.schema.oaf.Author + * rank - pid of type eu.dnetlib.dhp.schema.dump.oaf.Pid to store the persistent identifier for the author. For the + * moment only ORCID identifiers will be dumped. - The id element is instantiated by using the following values in the + * eu.dnetlib.dhp.schema.oaf.Result pid: * Qualifier.classid for scheme * value for value - The provenance element is + * instantiated only if the dataInfo is set for the pid in the result to be dumped. The provenance element is + * instantiated by using the following values in the eu.dnetlib.dhp.schema.oaf.Result pid: * + * dataInfo.provenanceaction.classname for provenance * dataInfo.trust for trust + */ +public class Author implements Serializable { + + private String fullname; + + private String name; + + private String surname; + + private Integer rank; + + private Pid pid; + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public Integer getRank() { + return rank; + } + + public void setRank(Integer rank) { + this.rank = rank; + } + + public Pid getPid() { + return pid; + } + + public void setPid(Pid pid) { + this.pid = pid; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java new file mode 100644 index 0000000..8699528 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java @@ -0,0 +1,136 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; +import java.util.Objects; + +/** + * To store information about the conference or journal where the result has been presented or published. It contains + * eleven parameters: - name of type String to store the name of the journal or conference. It corresponds to the + * parameter name of eu.dnetlib.dhp.schema.oaf.Journal - issnPrinted ot type String to store the journal printed issn. + * It corresponds to the parameter issnPrinted of eu.dnetlib.dhp.schema.oaf.Journal - issnOnline of type String to store + * the journal online issn. It corresponds to the parameter issnOnline of eu.dnetlib.dhp.schema.oaf.Journal - + * issnLinking of type String to store the journal linking issn. It corresponds to the parameter issnLinking of + * eu.dnetlib.dhp.schema.oaf.Journal - ep of type String to store the end page. It corresponds to the parameter ep of + * eu.dnetlib.dhp.schema.oaf.Journal - iss of type String to store the journal issue. It corresponds to the parameter + * iss of eu.dnetlib.dhp.schema.oaf.Journal - sp of type String to store the start page. It corresponds to the parameter + * sp of eu.dnetlib.dhp.schema.oaf.Journal - vol of type String to store the Volume. It corresponds to the parameter vol + * of eu.dnetlib.dhp.schema.oaf.Journal - edition of type String to store the edition of the journal or conference + * proceeding. It corresponds to the parameter edition of eu.dnetlib.dhp.schema.oaf.Journal - conferenceplace of type + * String to store the place of the conference. It corresponds to the parameter conferenceplace of + * eu.dnetlib.dhp.schema.oaf.Journal - conferencedate of type String to store the date of the conference. It corresponds + * to the parameter conferencedate of eu.dnetlib.dhp.schema.oaf.Journal + */ +public class Container implements Serializable { + + private String name; + + private String issnPrinted; + + private String issnOnline; + + private String issnLinking; + + private String ep; + + private String iss; + + private String sp; + + private String vol; + + private String edition; + + private String conferenceplace; + + private String conferencedate; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIssnPrinted() { + return issnPrinted; + } + + public void setIssnPrinted(String issnPrinted) { + this.issnPrinted = issnPrinted; + } + + public String getIssnOnline() { + return issnOnline; + } + + public void setIssnOnline(String issnOnline) { + this.issnOnline = issnOnline; + } + + public String getIssnLinking() { + return issnLinking; + } + + public void setIssnLinking(String issnLinking) { + this.issnLinking = issnLinking; + } + + public String getEp() { + return ep; + } + + public void setEp(String ep) { + this.ep = ep; + } + + public String getIss() { + return iss; + } + + public void setIss(String iss) { + this.iss = iss; + } + + public String getSp() { + return sp; + } + + public void setSp(String sp) { + this.sp = sp; + } + + public String getVol() { + return vol; + } + + public void setVol(String vol) { + this.vol = vol; + } + + public String getEdition() { + return edition; + } + + public void setEdition(String edition) { + this.edition = edition; + } + + public String getConferenceplace() { + return conferenceplace; + } + + public void setConferenceplace(String conferenceplace) { + this.conferenceplace = conferenceplace; + } + + public String getConferencedate() { + return conferencedate; + } + + public void setConferencedate(String conferencedate) { + this.conferencedate = conferencedate; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ControlledField.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ControlledField.java new file mode 100644 index 0000000..cad7b8b --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ControlledField.java @@ -0,0 +1,38 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +/** + * To represent the information described by a scheme and a value in that scheme (i.e. pid). It has two parameters: - + * scheme of type String to store the scheme - value of type String to store the value in that scheme + */ +public class ControlledField implements Serializable { + private String scheme; + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static ControlledField newInstance(String scheme, String value) { + ControlledField cf = new ControlledField(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java new file mode 100644 index 0000000..3ab4d90 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java @@ -0,0 +1,37 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +/** + * Represents the country associated to this result. It extends eu.dnetlib.dhp.schema.dump.oaf.Qualifier with a + * provenance parameter of type eu.dnetlib.dhp.schema.dumo.oaf.Provenance. The country in not mapped if its value in the + * result reprensented in the internal format is Unknown. The value for this element correspond to: - code corresponds + * to the classid of eu.dnetlib.dhp.schema.oaf.Country - label corresponds to the classname of + * eu.dnetlib.dhp.schema.oaf.Country - provenance set only if the dataInfo associated to the Country of the result to be + * dumped is not null. In this case : - provenance corresponds to dataInfo.provenanceaction.classid (to be modified with + * datainfo.provenanceaction.classname) - trust corresponds to dataInfo.trust + */ +public class Country extends Qualifier { + + private Provenance provenance; + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + public static Country newInstance(String code, String label, Provenance provenance) { + Country c = new Country(); + c.setProvenance(provenance); + c.setCode(code); + c.setLabel(label); + return c; + } + + public static Country newInstance(String code, String label, String provenance, String trust) { + return newInstance(code, label, Provenance.newInstance(provenance, trust)); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java new file mode 100644 index 0000000..16cab22 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java @@ -0,0 +1,36 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +public class Funder implements Serializable { + private String shortName; + + private String name; + + private String jurisdiction; + + public String getJurisdiction() { + return jurisdiction; + } + + public void setJurisdiction(String jurisdiction) { + this.jurisdiction = jurisdiction; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/GeoLocation.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/GeoLocation.java new file mode 100644 index 0000000..6bd891b --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/GeoLocation.java @@ -0,0 +1,53 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Represents the geolocation information. It has three parameters: - point of type String to store the point + * information. It corresponds to eu.dnetlib.dhp.schema.oaf.GeoLocation point - box ot type String to store the box + * information. It corresponds to eu.dnetlib.dhp.schema.oaf.GeoLocation box - place of type String to store the place + * information. It corresponds to eu.dnetlib.dhp.schema.oaf.GeoLocation place + */ +public class GeoLocation implements Serializable { + + private String point; + + private String box; + + private String place; + + public String getPoint() { + return point; + } + + public void setPoint(String point) { + this.point = point; + } + + public String getBox() { + return box; + } + + public void setBox(String box) { + this.box = box; + } + + public String getPlace() { + return place; + } + + public void setPlace(String place) { + this.place = place; + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(point) && StringUtils.isBlank(box) && StringUtils.isBlank(place); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java new file mode 100644 index 0000000..edc6f28 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java @@ -0,0 +1,81 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; +import java.util.List; + +/** + * Represents the manifestations (i.e. different versions) of the result. For example: the pre-print and the published + * versions are two manifestations of the same research result. It has the following parameters: - license of type + * String to store the license applied to the instance. It corresponds to the value of the licence in the instance to be + * dumped - accessright of type eu.dnetlib.dhp.schema.dump.oaf.AccessRight to store the accessright of the instance. - + * type of type String to store the type of the instance as defined in the corresponding dnet vocabulary + * (dnet:pubication_resource). It corresponds to the instancetype.classname of the instance to be mapped - url of type + * List list of locations where the instance is accessible. It corresponds to url of the instance to be dumped - + * publicationdate of type String to store the publication date of the instance ;// dateofacceptance; - refereed of type + * String to store information abour tthe review status of the instance. Possible values are 'Unknown', + * 'nonPeerReviewed', 'peerReviewed'. It corresponds to refereed.classname of the instance to be dumped + */ +public class Instance implements Serializable { + + private String license; + + private AccessRight accessright; + + private String type; + + private List url; + + private String publicationdate;// dateofacceptance; + + private String refereed; // peer-review status + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public AccessRight getAccessright() { + return accessright; + } + + public void setAccessright(AccessRight accessright) { + this.accessright = accessright; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getUrl() { + return url; + } + + public void setUrl(List url) { + this.url = url; + } + + public String getPublicationdate() { + return publicationdate; + } + + public void setPublicationdate(String publicationdate) { + this.publicationdate = publicationdate; + } + + public String getRefereed() { + return refereed; + } + + public void setRefereed(String refereed) { + this.refereed = refereed; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/KeyValue.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/KeyValue.java new file mode 100644 index 0000000..849aa4d --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/KeyValue.java @@ -0,0 +1,48 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * To represent the information described by a key and a value. It has two parameters: - key to store the key (generally + * the OpenAIRE id for some entity) - value to store the value (generally the OpenAIRE name for the key) + */ +public class KeyValue implements Serializable { + + private String key; + + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static KeyValue newInstance(String key, String value) { + KeyValue inst = new KeyValue(); + inst.key = key; + inst.value = value; + return inst; + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(key) && StringUtils.isBlank(value); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Pid.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Pid.java new file mode 100644 index 0000000..786ddb1 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Pid.java @@ -0,0 +1,45 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +/** + * To represent the generic persistent identifier. It has two parameters: - id of type + * eu.dnetlib.dhp.schema.dump.oaf.ControlledField to store the scheme and value of the Persistent Identifier. - + * provenance of type eu.dnetlib.dhp.schema.dump.oaf.Provenance to store the provenance and trust of the information + */ +public class Pid implements Serializable { + private ControlledField id; + private Provenance provenance; + + public ControlledField getId() { + return id; + } + + public void setId(ControlledField pid) { + this.id = pid; + } + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + public static Pid newInstance(ControlledField pid, Provenance provenance) { + Pid p = new Pid(); + p.id = pid; + p.provenance = provenance; + + return p; + } + + public static Pid newInstance(ControlledField pid) { + Pid p = new Pid(); + p.id = pid; + + return p; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java new file mode 100644 index 0000000..00cd7a0 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java @@ -0,0 +1,51 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +/** + * This class to store the common information about the project that will be dumped for community and for the whole + * graph - private String id to store the id of the project (OpenAIRE id) - private String code to store the grant + * agreement of the project - private String acronym to store the acronym of the project - private String title to store + * the tile of the project + */ +public class Project implements Serializable { + protected String id;// OpenAIRE id + protected String code; + + protected String acronym; + + protected String title; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getAcronym() { + return acronym; + } + + public void setAcronym(String acronym) { + this.acronym = acronym; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java new file mode 100644 index 0000000..28fb3aa --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java @@ -0,0 +1,41 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +/** + * Indicates the process that produced (or provided) the information, and the trust associated to the information. It + * has two parameters: - provenance of type String to store the provenance of the information, - trust of type String to + * store the trust associated to the information + */ +public class Provenance implements Serializable { + private String provenance; + private String trust; + + public String getProvenance() { + return provenance; + } + + public void setProvenance(String provenance) { + this.provenance = provenance; + } + + public String getTrust() { + return trust; + } + + public void setTrust(String trust) { + this.trust = trust; + } + + public static Provenance newInstance(String provenance, String trust) { + Provenance p = new Provenance(); + p.provenance = provenance; + p.trust = trust; + return p; + } + + public String toString() { + return provenance + trust; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Qualifier.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Qualifier.java new file mode 100644 index 0000000..348c22b --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Qualifier.java @@ -0,0 +1,42 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * To represent the information described by a code and a value It has two parameters: - code to store the code + * (generally the classid of the eu.dnetlib.dhp.schema.oaf.Qualifier element) - label to store the label (generally the + * classname of the eu.dnetlib.dhp.schema.oaf.Qualifier element + */ +public class Qualifier implements Serializable { + + private String code; // the classid in the Qualifier + private String label; // the classname in the Qualifier + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public static Qualifier newInstance(String code, String value) { + Qualifier qualifier = new Qualifier(); + qualifier.setCode(code); + qualifier.setLabel(value); + return qualifier; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java new file mode 100644 index 0000000..88ab2c3 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java @@ -0,0 +1,379 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.dump.oaf.community.Project; + +/** + * To represent the dumped result. It will be extended in the dump for Research Communities - Research + * Initiative/Infrastructures. It has the following parameters: - author of type + * List to describe the authors of a result. For each author in the result + * represented in the internal model one author in the esternal model is produced. - type of type String to represent + * the category of the result. Possible values are publication, dataset, software, other. It corresponds to + * resulttype.classname of the dumped result - language of type eu.dnetlib.dhp.schema.dump.oaf.Qualifier to store + * information about the language of the result. It is dumped as - code corresponds to language.classid - value + * corresponds to language.classname - country of type List to store the country + * list to which the result is associated. For each country in the result respresented in the internal model one country + * in the external model is produces - subjects of type List to store the subjects for + * the result. For each subject in the result represented in the internal model one subject in the external model is + * produced - maintitle of type String to store the main title of the result. It corresponds to the value of the first + * title in the resul to be dumped having classid equals to "main title" - subtitle of type String to store the subtitle + * of the result. It corresponds to the value of the first title in the resul to be dumped having classid equals to + * "subtitle" - description of type List to store the description of the result. It corresponds to the list of + * description.value in the result represented in the internal model - publicationdate of type String to store the + * pubblication date. It corresponds to dateofacceptance.value in the result represented in the internal model - + * publisher of type String to store information about the publisher. It corresponds to publisher.value of the result + * represented in the intrenal model - embargoenddate of type String to store the embargo end date. It corresponds to + * embargoenddate.value of the result represented in the internal model - source of type List See definition of + * Dublin Core field dc:source. It corresponds to the list of source.value in the result represented in the internal + * model - format of type List It corresponds to the list of format.value in the result represented in the + * internal model - contributor of type List to represent contributors for this result. It corresponds to the + * list of contributor.value in the result represented in the internal model - coverage of type String. It corresponds + * to the list of coverage.value in the result represented in the internal model - bestaccessright of type + * eu.dnetlib.dhp.schema.dump.oaf.AccessRight to store informatin about the openest access right associated to the + * manifestations of this research results. It corresponds to the same parameter in the result represented in the + * internal model - container of type eu.dnetlib.dhp.schema/dump.oaf.Container (only for result of type publication). It + * corresponds to the parameter journal of the result represented in the internal model - documentationUrl of type + * List (only for results of type software) to store the URLs to the software documentation. It corresponds to + * the list of documentationUrl.value of the result represented in the internal model - codeRepositoryUrl of type String + * (only for results of type software) to store the URL to the repository with the source code. It corresponds to + * codeRepositoryUrl.value of the result represented in the internal model - programmingLanguage of type String (only + * for results of type software) to store the programming language. It corresponds to programmingLanguaga.classid of the + * result represented in the internal model - contactperson of type List (only for results of type other) to + * store the contact person for this result. It corresponds to the list of contactperson.value of the result represented + * in the internal model - contactgroup of type List (only for results of type other) to store the information + * for the contact group. It corresponds to the list of contactgroup.value of the result represented in the internal + * model - tool of type List (only fro results of type other) to store information about tool useful for the + * interpretation and/or re-used of the research product. It corresponds to the list of tool.value in the result + * represented in the internal modelt - size of type String (only for results of type dataset) to store the size of the + * dataset. It corresponds to size.value in the result represented in the internal model - version of type String (only + * for results of type dataset) to store the version. It corresponds to version.value of the result represented in the + * internal model - geolocation fo type List (only for results of type + * dataset) to store geolocation information. For each geolocation element in the result represented in the internal + * model a GeoLocation in the external model il produced - id of type String to store the OpenAIRE id of the result. It + * corresponds to the id of the result represented in the internal model - originalId of type List to store the + * original ids of the result. It corresponds to the originalId of the result represented in the internal model - pid of + * type List to store the persistent identifiers for the result. For + * each pid in the results represented in the internal model one pid in the external model is produced. The value + * correspondence is: - scheme corresponds to pid.qualifier.classid of the result represented in the internal model - + * value corresponds to the pid.value of the result represented in the internal model - dateofcollection of type String + * to store information about the time OpenAIRE collected the record. It corresponds to dateofcollection of the result + * represented in the internal model - lasteupdatetimestamp of type String to store the timestamp of the last update of + * the record. It corresponds to lastupdatetimestamp of the resord represented in the internal model + */ +public class Result implements Serializable { + + private List author; + + // resulttype allows subclassing results into publications | datasets | software + private String type; // resulttype + + // common fields + private Qualifier language; + + private List country; + + private List subjects; + + private String maintitle; + + private String subtitle; + + private List description; + + private String publicationdate; // dateofacceptance; + + private String publisher; + + private String embargoenddate; + + private List source; + + private List format; + + private List contributor; + + private List coverage; + + private AccessRight bestaccessright; + + private Container container;// Journal + + private List documentationUrl; // software + + private String codeRepositoryUrl; // software + + private String programmingLanguage; // software + + private List contactperson; // orp + + private List contactgroup; // orp + + private List tool; // orp + + private String size; // dataset + + private String version; // dataset + + private List geolocation; // dataset + + private String id; + + private List originalId; + + private List pid; + + private String dateofcollection; + + private Long lastupdatetimestamp; + + public Long getLastupdatetimestamp() { + return lastupdatetimestamp; + } + + public void setLastupdatetimestamp(Long lastupdatetimestamp) { + this.lastupdatetimestamp = lastupdatetimestamp; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getOriginalId() { + return originalId; + } + + public void setOriginalId(List originalId) { + this.originalId = originalId; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public String getDateofcollection() { + return dateofcollection; + } + + public void setDateofcollection(String dateofcollection) { + this.dateofcollection = dateofcollection; + } + + public List getAuthor() { + return author; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Container getContainer() { + return container; + } + + public void setContainer(Container container) { + this.container = container; + } + + public void setAuthor(List author) { + this.author = author; + } + + public Qualifier getLanguage() { + return language; + } + + public void setLanguage(Qualifier language) { + this.language = language; + } + + public List getCountry() { + return country; + } + + public void setCountry(List country) { + this.country = country; + } + + public List getSubjects() { + return subjects; + } + + public void setSubjects(List subjects) { + this.subjects = subjects; + } + + public String getMaintitle() { + return maintitle; + } + + public void setMaintitle(String maintitle) { + this.maintitle = maintitle; + } + + public String getSubtitle() { + return subtitle; + } + + public void setSubtitle(String subtitle) { + this.subtitle = subtitle; + } + + public List getDescription() { + return description; + } + + public void setDescription(List description) { + this.description = description; + } + + public String getPublicationdate() { + return publicationdate; + } + + public void setPublicationdate(String publicationdate) { + this.publicationdate = publicationdate; + } + + public String getPublisher() { + return publisher; + } + + public void setPublisher(String publisher) { + this.publisher = publisher; + } + + public String getEmbargoenddate() { + return embargoenddate; + } + + public void setEmbargoenddate(String embargoenddate) { + this.embargoenddate = embargoenddate; + } + + public List getSource() { + return source; + } + + public void setSource(List source) { + this.source = source; + } + + public List getFormat() { + return format; + } + + public void setFormat(List format) { + this.format = format; + } + + public List getContributor() { + return contributor; + } + + public void setContributor(List contributor) { + this.contributor = contributor; + } + + public List getCoverage() { + return coverage; + } + + public void setCoverage(List coverage) { + this.coverage = coverage; + } + + public AccessRight getBestaccessright() { + return bestaccessright; + } + + public void setBestaccessright(AccessRight bestaccessright) { + this.bestaccessright = bestaccessright; + } + + public List getDocumentationUrl() { + return documentationUrl; + } + + public void setDocumentationUrl(List documentationUrl) { + this.documentationUrl = documentationUrl; + } + + public String getCodeRepositoryUrl() { + return codeRepositoryUrl; + } + + public void setCodeRepositoryUrl(String codeRepositoryUrl) { + this.codeRepositoryUrl = codeRepositoryUrl; + } + + public String getProgrammingLanguage() { + return programmingLanguage; + } + + public void setProgrammingLanguage(String programmingLanguage) { + this.programmingLanguage = programmingLanguage; + } + + public List getContactperson() { + return contactperson; + } + + public void setContactperson(List contactperson) { + this.contactperson = contactperson; + } + + public List getContactgroup() { + return contactgroup; + } + + public void setContactgroup(List contactgroup) { + this.contactgroup = contactgroup; + } + + public List getTool() { + return tool; + } + + public void setTool(List tool) { + this.tool = tool; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public List getGeolocation() { + return geolocation; + } + + public void setGeolocation(List geolocation) { + this.geolocation = geolocation; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java new file mode 100644 index 0000000..5c4bbef --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java @@ -0,0 +1,34 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +/** + * To represent keywords associated to the result. It has two parameters: - subject of type + * eu.dnetlib.dhp.schema.dump.oaf.ControlledField to describe the subject. It mapped as: - schema it corresponds to + * qualifier.classid of the dumped subject - value it corresponds to the subject value - provenance of type + * eu.dnetlib.dhp.schema.dump.oaf.Provenance to represent the provenance of the subject. It is dumped only if dataInfo + * is not null. In this case: - provenance corresponds to dataInfo.provenanceaction.classname - trust corresponds to + * dataInfo.trust + */ +public class Subject implements Serializable { + private ControlledField subject; + private Provenance provenance; + + public ControlledField getSubject() { + return subject; + } + + public void setSubject(ControlledField subject) { + this.subject = subject; + } + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java new file mode 100644 index 0000000..6a605d7 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java @@ -0,0 +1,36 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import eu.dnetlib.dhp.schema.dump.oaf.Instance; +import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; + +/** + * It extends eu.dnetlib.dhp.dump.oaf.Instance with values related to the community dump. In the Result dump this + * information is not present because it is dumped as a set of relations between the result and the datasource. - + * hostedby of type eu.dnetlib.dhp.schema.dump.oaf.KeyValue to store the information about the source from which the + * instance can be viewed or downloaded. It is mapped against the hostedby parameter of the instance to be dumped and - + * key corresponds to hostedby.key - value corresponds to hostedby.value - collectedfrom of type + * eu.dnetlib.dhp.schema.dump.oaf.KeyValue to store the information about the source from which the instance has been + * collected. It is mapped against the collectedfrom parameter of the instance to be dumped and - key corresponds to + * collectedfrom.key - value corresponds to collectedfrom.value + */ +public class CommunityInstance extends Instance { + private KeyValue hostedby; + private KeyValue collectedfrom; + + public KeyValue getHostedby() { + return hostedby; + } + + public void setHostedby(KeyValue hostedby) { + this.hostedby = hostedby; + } + + public KeyValue getCollectedfrom() { + return collectedfrom; + } + + public void setCollectedfrom(KeyValue collectedfrom) { + this.collectedfrom = collectedfrom; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java new file mode 100644 index 0000000..690a537 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java @@ -0,0 +1,63 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import java.util.List; + +import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; +import eu.dnetlib.dhp.schema.dump.oaf.Result; + +/** + * extends eu.dnetlib.dhp.schema.dump.oaf.Result with the following parameters: - projects of type + * List to store the list of projects related to the result. The + * information is added after the result is mapped to the external model - context of type + * List to store information about the RC RI related to the result. + * For each context in the result represented in the internal model one context in the external model is produced - + * collectedfrom of type List to store information about the sources from which + * the record has been collected. For each collectedfrom in the result represented in the internal model one + * collectedfrom in the external model is produced - instance of type + * List to store all the instances associated to the result. + * It corresponds to the same parameter in the result represented in the internal model + */ +public class CommunityResult extends Result { + + private List projects; + + private List context; + + protected List collectedfrom; + + private List instance; + + public List getInstance() { + return instance; + } + + public void setInstance(List instance) { + this.instance = instance; + } + + public List getCollectedfrom() { + return collectedfrom; + } + + public void setCollectedfrom(List collectedfrom) { + this.collectedfrom = collectedfrom; + } + + public List getProjects() { + return projects; + } + + public void setProjects(List projects) { + this.projects = projects; + } + + public List getContext() { + return context; + } + + public void setContext(List context) { + this.context = context; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java new file mode 100644 index 0000000..3ad692b --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java @@ -0,0 +1,40 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import java.util.List; +import java.util.Objects; + +import eu.dnetlib.dhp.schema.dump.oaf.Provenance; +import eu.dnetlib.dhp.schema.dump.oaf.Qualifier; + +/** + * Reference to a relevant research infrastructure, initiative or community (RI/RC) among those collaborating with + * OpenAIRE. It extend eu.dnetlib.dhp.shema.dump.oaf.Qualifier with a parameter provenance of type + * List to store the provenances of the association between the result and + * the RC/RI. The values for this element correspond to: - code: it corresponds to the id of the context in the result + * to be mapped. If the context id refers to a RC/RI and contains '::' only the part of the id before the first "::" + * will be used as value for code - label it corresponds to the label associated to the id. The information id taken + * from the profile of the RC/RI - provenance it is set only if the dataInfo associated to the contenxt element of the + * result to be dumped is not null. For each dataInfo one instance of type eu.dnetlib.dhp.schema.dump.oaf.Provenance is + * instantiated if the element datainfo.provenanceaction is not null. In this case - provenance corresponds to + * dataInfo.provenanceaction.classname - trust corresponds to dataInfo.trust + */ +public class Context extends Qualifier { + private List provenance; + + public List getProvenance() { + return provenance; + } + + public void setProvenance(List provenance) { + this.provenance = provenance; + } + + @Override + public int hashCode() { + String provenance = new String(); + this.provenance.forEach(p -> provenance.concat(p.toString())); + return Objects.hash(getCode(), getLabel(), provenance); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java new file mode 100644 index 0000000..adb4163 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java @@ -0,0 +1,23 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import java.io.Serializable; + +/** + * To store information about the funder funding the project related to the result. It has the following parameters: - + * shortName of type String to store the funder short name (e.c. AKA). - name of type String to store the funder name + * (e.c. Akademy of Finland) - fundingStream of type String to store the funding stream - jurisdiction of type String to + * store the jurisdiction of the funder + */ +public class Funder extends eu.dnetlib.dhp.schema.dump.oaf.Funder { + + private String fundingStream; + + public String getFundingStream() { + return fundingStream; + } + + public void setFundingStream(String fundingStream) { + this.fundingStream = fundingStream; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java new file mode 100644 index 0000000..030b565 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java @@ -0,0 +1,47 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import java.io.Serializable; + +import eu.dnetlib.dhp.schema.dump.oaf.Provenance; + +/** + * To store information about the project related to the result. This information is not directly mapped from the result + * represented in the internal model because it is not there. The mapped result will be enriched with project + * information derived by relation between results and projects. Project extends eu.dnetlib.dhp.schema.dump.oaf.Project + * with the following parameters: - funder of type eu.dnetlib.dhp.schema.dump.oaf.community.Funder to store information + * about the funder funding the project - provenance of type eu.dnetlib.dhp.schema.dump.oaf.Provenance to store + * information about the. provenance of the association between the result and the project + */ +public class Project extends eu.dnetlib.dhp.schema.dump.oaf.Project { + + private Funder funder; + + private Provenance provenance; + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + public Funder getFunder() { + return funder; + } + + public void setFunder(Funder funders) { + this.funder = funders; + } + + public static Project newInstance(String id, String code, String acronym, String title, Funder funder) { + Project project = new Project(); + project.setAcronym(acronym); + project.setCode(code); + project.setFunder(funder); + project.setId(id); + project.setTitle(title); + return project; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Constants.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Constants.java new file mode 100644 index 0000000..35cc60c --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Constants.java @@ -0,0 +1,21 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +public class Constants implements Serializable { + // collectedFrom va con isProvidedBy -> becco da ModelSupport + + public static final String HOSTED_BY = "isHostedBy"; + public static final String HOSTS = "hosts"; + + // community result uso isrelatedto + + public static final String RESULT_ENTITY = "result"; + public static final String DATASOURCE_ENTITY = "datasource"; + public static final String CONTEXT_ENTITY = "context"; + + public static final String CONTEXT_ID = "60"; + public static final String CONTEXT_NS_PREFIX = "context____"; + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java new file mode 100644 index 0000000..6b2b7b1 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java @@ -0,0 +1,316 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.dump.oaf.Container; +import eu.dnetlib.dhp.schema.dump.oaf.ControlledField; +import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; + +/** + * To store information about the datasource OpenAIRE collects information from. It contains the following parameters: - + * id of type String to store the OpenAIRE id for the datasource. It corresponds to the parameter id of the datasource + * represented in the internal model - originalId of type List to store the list of original ids associated to + * the datasource. It corresponds to the parameter originalId of the datasource represented in the internal model. The + * null values are filtered out - pid of type List to store the + * persistent identifiers for the datasource. For each pid in the datasource represented in the internal model one pid + * in the external model is produced as : - schema corresponds to pid.qualifier.classid of the datasource represented in + * the internal model - value corresponds to pid.value of the datasource represented in the internal model - + * datasourceType of type eu.dnetlib.dhp.schema.dump.oaf.ControlledField to store the datasource type (e.g. + * pubsrepository::institutional, Institutional Repository) as in the dnet vocabulary dnet:datasource_typologies. It + * corresponds to datasourcetype of the datasource represented in the internal model and : - code corresponds to + * datasourcetype.classid - value corresponds to datasourcetype.classname - openairecompatibility of type String to + * store information about the OpenAIRE compatibility of the ingested results (which guidelines they are compliant to). + * It corresponds to openairecompatibility.classname of the datasource represented in the internal model - officialname + * of type Sgtring to store the official name of the datasource. It correspond to officialname.value of the datasource + * represented in the internal model - englishname of type String to store the English name of the datasource. It + * corresponds to englishname.value of the datasource represented in the internal model - websiteurl of type String to + * store the URL of the website of the datasource. It corresponds to websiteurl.value of the datasource represented in + * the internal model - logourl of type String to store the URL of the logo for the datasource. It corresponds to + * logourl.value of the datasource represented in the internal model - dateofvalidation of type String to store the data + * of validation against the guidelines for the datasource records. It corresponds to dateofvalidation.value of the + * datasource represented in the internal model - description of type String to store the description for the + * datasource. It corresponds to description.value of the datasource represented in the internal model + */ +public class Datasource implements Serializable { + + private String id; // string + + private List originalId; // list string + + private List pid; // list + + private ControlledField datasourcetype; // value + + private String openairecompatibility; // value + + private String officialname; // string + + private String englishname; // string + + private String websiteurl; // string + + private String logourl; // string + + private String dateofvalidation; // string + + private String description; // description + + private List subjects; // List + + // opendoar specific fields (od*) + + private List languages; // odlanguages List + + private List contenttypes; // odcontent types List + + // re3data fields + private String releasestartdate; // string + + private String releaseenddate; // string + + private String missionstatementurl; // string + + // {open, restricted or closed} + private String accessrights; // databaseaccesstype string + + // {open, restricted or closed} + private String uploadrights; // datauploadtype string + + // {feeRequired, registration, other} + private String databaseaccessrestriction; // string + + // {feeRequired, registration, other} + private String datauploadrestriction; // string + + private Boolean versioning; // boolean + + private String citationguidelineurl; // string + + // {yes, no, uknown} + + private String pidsystems; // string + + private String certificates; // string + + private List policies; // + + private Container journal; // issn etc del Journal + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getOriginalId() { + return originalId; + } + + public void setOriginalId(List originalId) { + this.originalId = originalId; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public ControlledField getDatasourcetype() { + return datasourcetype; + } + + public void setDatasourcetype(ControlledField datasourcetype) { + this.datasourcetype = datasourcetype; + } + + public String getOpenairecompatibility() { + return openairecompatibility; + } + + public void setOpenairecompatibility(String openairecompatibility) { + this.openairecompatibility = openairecompatibility; + } + + public String getOfficialname() { + return officialname; + } + + public void setOfficialname(String officialname) { + this.officialname = officialname; + } + + public String getEnglishname() { + return englishname; + } + + public void setEnglishname(String englishname) { + this.englishname = englishname; + } + + public String getWebsiteurl() { + return websiteurl; + } + + public void setWebsiteurl(String websiteurl) { + this.websiteurl = websiteurl; + } + + public String getLogourl() { + return logourl; + } + + public void setLogourl(String logourl) { + this.logourl = logourl; + } + + public String getDateofvalidation() { + return dateofvalidation; + } + + public void setDateofvalidation(String dateofvalidation) { + this.dateofvalidation = dateofvalidation; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getSubjects() { + return subjects; + } + + public void setSubjects(List subjects) { + this.subjects = subjects; + } + + public List getLanguages() { + return languages; + } + + public void setLanguages(List languages) { + this.languages = languages; + } + + public List getContenttypes() { + return contenttypes; + } + + public void setContenttypes(List contenttypes) { + this.contenttypes = contenttypes; + } + + public String getReleasestartdate() { + return releasestartdate; + } + + public void setReleasestartdate(String releasestartdate) { + this.releasestartdate = releasestartdate; + } + + public String getReleaseenddate() { + return releaseenddate; + } + + public void setReleaseenddate(String releaseenddate) { + this.releaseenddate = releaseenddate; + } + + public String getMissionstatementurl() { + return missionstatementurl; + } + + public void setMissionstatementurl(String missionstatementurl) { + this.missionstatementurl = missionstatementurl; + } + + public String getAccessrights() { + return accessrights; + } + + public void setAccessrights(String accessrights) { + this.accessrights = accessrights; + } + + public String getUploadrights() { + return uploadrights; + } + + public void setUploadrights(String uploadrights) { + this.uploadrights = uploadrights; + } + + public String getDatabaseaccessrestriction() { + return databaseaccessrestriction; + } + + public void setDatabaseaccessrestriction(String databaseaccessrestriction) { + this.databaseaccessrestriction = databaseaccessrestriction; + } + + public String getDatauploadrestriction() { + return datauploadrestriction; + } + + public void setDatauploadrestriction(String datauploadrestriction) { + this.datauploadrestriction = datauploadrestriction; + } + + public Boolean getVersioning() { + return versioning; + } + + public void setVersioning(Boolean versioning) { + this.versioning = versioning; + } + + public String getCitationguidelineurl() { + return citationguidelineurl; + } + + public void setCitationguidelineurl(String citationguidelineurl) { + this.citationguidelineurl = citationguidelineurl; + } + + public String getPidsystems() { + return pidsystems; + } + + public void setPidsystems(String pidsystems) { + this.pidsystems = pidsystems; + } + + public String getCertificates() { + return certificates; + } + + public void setCertificates(String certificates) { + this.certificates = certificates; + } + + public List getPolicies() { + return policies; + } + + public void setPolicies(List policiesr3) { + this.policies = policiesr3; + } + + public Container getJournal() { + return journal; + } + + public void setJournal(Container journal) { + this.journal = journal; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java new file mode 100644 index 0000000..3b298c8 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java @@ -0,0 +1,22 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To store information about the funder funding the project related to the result. It extends + * eu.dnetlib.dhp.schema.dump.oaf.Funder with the following parameter: - - private + * eu.dnetdlib.dhp.schema.dump.oaf.graph.Fundings funding_stream to store the fundingstream + */ +public class Funder extends eu.dnetlib.dhp.schema.dump.oaf.Funder { + + private Fundings funding_stream; + + public Fundings getFunding_stream() { + return funding_stream; + } + + public void setFunding_stream(Fundings funding_stream) { + this.funding_stream = funding_stream; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java new file mode 100644 index 0000000..a74c347 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java @@ -0,0 +1,35 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To store inforamtion about the funding stream. It has two parameters: - private String id to store the id of the + * fundings stream. The id is created by appending the shortname of the funder to the name of each level in the xml + * representing the fundng stream. For example: if the funder is the European Commission, the funding level 0 name is + * FP7, the funding level 1 name is SP3 and the funding level 2 name is PEOPLE then the id will be: EC::FP7::SP3::PEOPLE + * - private String description to describe the funding stream. It is created by concatenating the description of each + * funding level so for the example above the description would be: SEVENTH FRAMEWORK PROGRAMME - SP3-People - + * Marie-Curie Actions + */ +public class Fundings implements Serializable { + + private String id; + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java new file mode 100644 index 0000000..94ace55 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java @@ -0,0 +1,55 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; +import java.util.Optional; + +/** + * To describe the funded amount. It has the following parameters: - private String currency to store the currency of + * the fund - private float totalcost to store the total cost of the project - private float fundedamount to store the + * funded amount by the funder + */ +public class Granted implements Serializable { + private String currency; + private float totalcost; + private float fundedamount; + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public float getTotalcost() { + return totalcost; + } + + public void setTotalcost(float totalcost) { + this.totalcost = totalcost; + } + + public float getFundedamount() { + return fundedamount; + } + + public void setFundedamount(float fundedamount) { + this.fundedamount = fundedamount; + } + + public static Granted newInstance(String currency, float totalcost, float fundedamount) { + Granted granted = new Granted(); + granted.currency = currency; + granted.totalcost = totalcost; + granted.fundedamount = fundedamount; + return granted; + } + + public static Granted newInstance(String currency, float fundedamount) { + Granted granted = new Granted(); + granted.currency = currency; + granted.fundedamount = fundedamount; + return granted; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java new file mode 100644 index 0000000..1675f9e --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java @@ -0,0 +1,24 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.util.List; + +import eu.dnetlib.dhp.schema.dump.oaf.Instance; +import eu.dnetlib.dhp.schema.dump.oaf.Result; + +/** + * It extends the eu.dnetlib.dhp.schema.dump.oaf.Result with - instance of type + * List to store all the instances associated to the result. It corresponds to + * the same parameter in the result represented in the internal model + */ +public class GraphResult extends Result { + private List instance; + + public List getInstance() { + return instance; + } + + public void setInstance(List instance) { + this.instance = instance; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/H2020Classification.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/H2020Classification.java new file mode 100644 index 0000000..4a61663 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/H2020Classification.java @@ -0,0 +1,82 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To store information about the classification for the project. The classification depends on the programme. For example + * H2020-EU.3.4.5.3 can be classified as + * H2020-EU.3. => Societal Challenges (level1) + * H2020-EU.3.4. => Transport (level2) + * H2020-EU.3.4.5. => CLEANSKY2 (level3) + * H2020-EU.3.4.5.3. => IADP Fast Rotorcraft (level4) + * + * We decided to explicitly represent up to three levels in the classification. + * + * H2020Classification has the following parameters: + * - private Programme programme to store the information about the programme related to this classification + * - private String level1 to store the information about the level 1 of the classification (Priority or Pillar of the EC) + * - private String level2 to store the information about the level2 af the classification (Objectives (?)) + * - private String level3 to store the information about the level3 of the classification + * - private String classification to store the entire classification related to the programme + */ +public class H2020Classification implements Serializable { + private Programme programme; + + private String level1; + private String level2; + private String level3; + + private String classification; + + public Programme getProgramme() { + return programme; + } + + public void setProgramme(Programme programme) { + this.programme = programme; + } + + public String getLevel1() { + return level1; + } + + public void setLevel1(String level1) { + this.level1 = level1; + } + + public String getLevel2() { + return level2; + } + + public void setLevel2(String level2) { + this.level2 = level2; + } + + public String getLevel3() { + return level3; + } + + public void setLevel3(String level3) { + this.level3 = level3; + } + + public String getClassification() { + return classification; + } + + public void setClassification(String classification) { + this.classification = classification; + } + + public static H2020Classification newInstance(String programme_code, String programme_description, String level1, + String level2, String level3, String classification) { + H2020Classification h2020classification = new H2020Classification(); + h2020classification.programme = Programme.newInstance(programme_code, programme_description); + h2020classification.level1 = level1; + h2020classification.level2 = level2; + h2020classification.level3 = level3; + h2020classification.classification = classification; + return h2020classification; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java new file mode 100644 index 0000000..00f1a29 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java @@ -0,0 +1,38 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To represent the generic node in a relation. It has the following parameters: - private String id the openaire id of + * the entity in the relation - private String type the type of the entity in the relation. Consider the generic + * relation between a Result R and a Project P, the node representing R will have as id the id of R and as type result, + * while the node representing the project will have as id the id of the project and as type project + */ +public class Node implements Serializable { + private String id; + private String type; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public static Node newInstance(String id, String type) { + Node node = new Node(); + node.id = id; + node.type = type; + return node; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java new file mode 100644 index 0000000..2407c9c --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java @@ -0,0 +1,86 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.dump.oaf.ControlledField; +import eu.dnetlib.dhp.schema.dump.oaf.Country; +import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; +import eu.dnetlib.dhp.schema.dump.oaf.Qualifier; +import eu.dnetlib.dhp.schema.dump.oaf.community.Project; + +/** + * To represent the generic organizaiton. It has the following parameters: - private String legalshortname to store the + * legalshortname of the organizaiton - private String legalname to store the legal name of the organization - private + * String websiteurl to store the websiteurl of the organization - private List alternativenames to store the + * alternative names of the organization - private Qualifier country to store the country of the organization - private + * String id to store the id of the organization - private List pid to store the list of pids for the + * organization + */ +public class Organization implements Serializable { + private String legalshortname; + private String legalname; + private String websiteurl; + private List alternativenames; + private Qualifier country; + private String id; + private List pid; + + public String getLegalshortname() { + return legalshortname; + } + + public void setLegalshortname(String legalshortname) { + this.legalshortname = legalshortname; + } + + public String getLegalname() { + return legalname; + } + + public void setLegalname(String legalname) { + this.legalname = legalname; + } + + public String getWebsiteurl() { + return websiteurl; + } + + public void setWebsiteurl(String websiteurl) { + this.websiteurl = websiteurl; + } + + public List getAlternativenames() { + return alternativenames; + } + + public void setAlternativenames(List alternativenames) { + this.alternativenames = alternativenames; + } + + public Qualifier getCountry() { + return country; + } + + public void setCountry(Qualifier country) { + this.country = country; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java new file mode 100644 index 0000000..9892790 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java @@ -0,0 +1,36 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To store information about the ec programme for the project. It has the following parameters: - private String code + * to store the code of the programme - private String description to store the description of the programme + */ +public class Programme implements Serializable { + private String code; + private String description; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public static Programme newInstance(String code, String description) { + Programme p = new Programme(); + p.code = code; + p.description = description; + return p; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java new file mode 100644 index 0000000..612be9d --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java @@ -0,0 +1,192 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; +import java.util.List; + +/** + * This is the class representing the Project in the model used for the dumps of the whole graph. At the moment the dump + * of the Projects differs from the other dumps because we do not create relations between Funders (Organization) and + * Projects but we put the information about the Funder within the Project representation. We also removed the + * collected from element from the Project. No relation between the Project and the Datasource entity from which it is + * collected will be created. We will never create relations between Project and Datasource. In case some relation will + * be extracted from the Project they will refer the Funder and will be of type ( organization -> funds -> project, + * project -> isFundedBy -> organization) We also removed the duration parameter because the most of times it is set to + * 0. It has the following parameters: + * - private String id to store the id of the project (OpenAIRE id) + * - private String websiteurl to store the websiteurl of the project + * - private String code to store the grant agreement of the project + * - private String acronym to store the acronym of the project + * - private String title to store the tile of the project + * - private String startdate to store the start date + * - private String enddate to store the end date + * - private String callidentifier to store the call indentifier + * - private String keywords to store the keywords + * - private boolean openaccessmandateforpublications to store if the project must accomplish to the open access mandate + * for publications. This value will be set to true if one of the field in the project represented in the internal model + * is set to true + * - private boolean openaccessmandatefordataset to store if the project must accomplish to the open access mandate for + * dataset. It is set to the value in the corresponding filed of the project represented in the internal model + * - private List subject to store the list of subjects of the project + * - private List funding to store the list of funder of the project + * - private String summary to store the summary of the project + * - private Granted granted to store the granted amount + * - private List h2020programme to store the list of programmes the project is related to + */ + +public class Project implements Serializable { + private String id; + + private String websiteurl; + private String code; + private String acronym; + private String title; + private String startdate; + + private String enddate; + + private String callidentifier; + + private String keywords; + + private boolean openaccessmandateforpublications; + + private boolean openaccessmandatefordataset; + private List subject; + + private List funding; + + private String summary; + + private Granted granted; + + private List h2020programme; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getWebsiteurl() { + return websiteurl; + } + + public void setWebsiteurl(String websiteurl) { + this.websiteurl = websiteurl; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getAcronym() { + return acronym; + } + + public void setAcronym(String acronym) { + this.acronym = acronym; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getStartdate() { + return startdate; + } + + public void setStartdate(String startdate) { + this.startdate = startdate; + } + + public String getEnddate() { + return enddate; + } + + public void setEnddate(String enddate) { + this.enddate = enddate; + } + + public String getCallidentifier() { + return callidentifier; + } + + public void setCallidentifier(String callidentifier) { + this.callidentifier = callidentifier; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public boolean isOpenaccessmandateforpublications() { + return openaccessmandateforpublications; + } + + public void setOpenaccessmandateforpublications(boolean openaccessmandateforpublications) { + this.openaccessmandateforpublications = openaccessmandateforpublications; + } + + public boolean isOpenaccessmandatefordataset() { + return openaccessmandatefordataset; + } + + public void setOpenaccessmandatefordataset(boolean openaccessmandatefordataset) { + this.openaccessmandatefordataset = openaccessmandatefordataset; + } + + public List getSubject() { + return subject; + } + + public void setSubject(List subject) { + this.subject = subject; + } + + public List getFunding() { + return funding; + } + + public void setFunding(List funding) { + this.funding = funding; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public Granted getGranted() { + return granted; + } + + public void setGranted(Granted granted) { + this.granted = granted; + } + + public List getH2020programme() { + return h2020programme; + } + + public void setH2020programme(List h2020programme) { + this.h2020programme = h2020programme; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java new file mode 100644 index 0000000..629b30e --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java @@ -0,0 +1,39 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To represent the semantics of the generic relation between two entities. It has the following parameters: - private + * String name to store the semantics of the relation (i.e. isAuthorInstitutionOf). It corresponds to the relclass + * parameter in the relation represented in the internal model represented in the internal model - private String type + * to store the type of the relation (i.e. affiliation). It corresponds to the subreltype parameter of the relation + * represented in theinternal model + */ +public class RelType implements Serializable { + private String name; // relclass + private String type; // subreltype + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public static RelType newInstance(String name, String type) { + RelType rel = new RelType(); + rel.name = name; + rel.type = type; + return rel; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java new file mode 100644 index 0000000..e2b126e --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java @@ -0,0 +1,67 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; +import java.util.Objects; + +import eu.dnetlib.dhp.schema.dump.oaf.Provenance; + +/** + * To represent the gereric relation between two entities. It has the following parameters: - private Node source to + * represent the entity source of the relation - private Node target to represent the entity target of the relation - + * private RelType reltype to represent the semantics of the relation - private Provenance provenance to represent the + * provenance of the relation + */ +public class Relation implements Serializable { + private Node source; + private Node target; + private RelType reltype; + private Provenance provenance; + + public Node getSource() { + return source; + } + + public void setSource(Node source) { + this.source = source; + } + + public Node getTarget() { + return target; + } + + public void setTarget(Node target) { + this.target = target; + } + + public RelType getReltype() { + return reltype; + } + + public void setReltype(RelType reltype) { + this.reltype = reltype; + } + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + @Override + public int hashCode() { + + return Objects.hash(source.getId(), target.getId(), reltype.getType() + ":" + reltype.getName()); + } + + public static Relation newInstance(Node source, Node target, RelType reltype, Provenance provenance) { + Relation relation = new Relation(); + relation.source = source; + relation.target = target; + relation.reltype = reltype; + relation.provenance = provenance; + return relation; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java new file mode 100644 index 0000000..026042c --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java @@ -0,0 +1,20 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.util.List; + +/** + * To represent RC entities. It extends eu.dnetlib.dhp.dump.oaf.grap.ResearchInitiative by adding the parameter subject + * to store the list of subjects related to the community + */ +public class ResearchCommunity extends ResearchInitiative { + private List subject; + + public List getSubject() { + return subject; + } + + public void setSubject(List subject) { + this.subject = subject; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java new file mode 100644 index 0000000..ad4ad88 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java @@ -0,0 +1,75 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +/** + * To represent entity of type RC/RI. It has the following parameters, which are mostly derived by the profile + * - private + * String id to store the openaire id for the entity. Is has as code 00 and will be created as + * 00|context_____::md5(originalId) private + * String originalId to store the id of the context as provided in the profile + * (i.e. mes) + * - private String name to store the name of the context (got from the label attribute in the context + * definition) + * - private String type to store the type of the context (i.e.: research initiative or research community) + * - private String description to store the description of the context as given in the profile + * -private String + * zenodo_community to store the zenodo community associated to the context (main zenodo community) + */ +public class ResearchInitiative implements Serializable { + private String id; // openaireId + private String originalId; // context id + private String name; // context name + private String type; // context type: research initiative or research community + private String description; + private String zenodo_community; + + public String getZenodo_community() { + return zenodo_community; + } + + public void setZenodo_community(String zenodo_community) { + this.zenodo_community = zenodo_community; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String label) { + this.name = label; + } + + public String getOriginalId() { + return originalId; + } + + public void setOriginalId(String originalId) { + this.originalId = originalId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/mdstore/MetadataRecord.java b/src/main/java/eu/dnetlib/dhp/schema/mdstore/MetadataRecord.java new file mode 100644 index 0000000..8277e14 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/mdstore/MetadataRecord.java @@ -0,0 +1,123 @@ + +package eu.dnetlib.dhp.schema.mdstore; + +import java.io.Serializable; + +import eu.dnetlib.dhp.schema.common.ModelSupport; + +/** + * This class models a record in a Metadata store collection on HDFS + */ +public class MetadataRecord implements Serializable { + + /** The D-Net Identifier associated to the record */ + private String id; + + /** The original Identifier of the record */ + private String originalId; + + /** The encoding of the record, should be JSON or XML */ + private String encoding; + + /** + * The information about the provenance of the record see @{@link Provenance} for the model of this information + */ + private Provenance provenance; + + /** The content of the metadata */ + private String body; + + /** the date when the record has been stored */ + private Long dateOfCollection; + + /** the date when the record has been stored */ + private Long dateOfTransformation; + + public MetadataRecord() { + + } + + public MetadataRecord( + String originalId, + String encoding, + Provenance provenance, + String body, + Long dateOfCollection) { + + this.originalId = originalId; + this.encoding = encoding; + this.provenance = provenance; + this.body = body; + this.dateOfCollection = dateOfCollection; + this.id = ModelSupport.generateIdentifier(originalId, this.provenance.getNsPrefix()); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOriginalId() { + return originalId; + } + + public void setOriginalId(String originalId) { + this.originalId = originalId; + } + + public String getEncoding() { + return encoding; + } + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Long getDateOfCollection() { + return dateOfCollection; + } + + public void setDateOfCollection(Long dateOfCollection) { + this.dateOfCollection = dateOfCollection; + } + + public Long getDateOfTransformation() { + return dateOfTransformation; + } + + public void setDateOfTransformation(Long dateOfTransformation) { + this.dateOfTransformation = dateOfTransformation; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof MetadataRecord)) { + return false; + } + return ((MetadataRecord) o).getId().equalsIgnoreCase(id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/mdstore/Provenance.java b/src/main/java/eu/dnetlib/dhp/schema/mdstore/Provenance.java new file mode 100644 index 0000000..8af58f6 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/mdstore/Provenance.java @@ -0,0 +1,52 @@ + +package eu.dnetlib.dhp.schema.mdstore; + +import java.io.Serializable; + +/** + * @author Sandro La Bruzzo + *

+ * Provenace class models the provenance of the record in the metadataStore It contains the identifier and the + * name of the datasource that gives the record + */ +public class Provenance implements Serializable { + + private String datasourceId; + + private String datasourceName; + + private String nsPrefix; + + public Provenance() { + } + + public Provenance(String datasourceId, String datasourceName, String nsPrefix) { + this.datasourceId = datasourceId; + this.datasourceName = datasourceName; + this.nsPrefix = nsPrefix; + } + + public String getDatasourceId() { + return datasourceId; + } + + public void setDatasourceId(String datasourceId) { + this.datasourceId = datasourceId; + } + + public String getDatasourceName() { + return datasourceName; + } + + public void setDatasourceName(String datasourceName) { + this.datasourceName = datasourceName; + } + + public String getNsPrefix() { + return nsPrefix; + } + + public void setNsPrefix(String nsPrefix) { + this.nsPrefix = nsPrefix; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java new file mode 100644 index 0000000..47de365 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java @@ -0,0 +1,48 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.util.Optional; + +/** + * This class models the access rights of research products. + */ +public class AccessRight extends Qualifier { + + private OpenAccessRoute openAccessRoute; + + public OpenAccessRoute getOpenAccessRoute() { + return openAccessRoute; + } + + public void setOpenAccessRoute(OpenAccessRoute openAccessRoute) { + this.openAccessRoute = openAccessRoute; + } + + public String toComparableString() { + String s = super.toComparableString(); + return Optional + .ofNullable(getOpenAccessRoute()) + .map(x -> s + "::" + x.toString()) + .orElse(s); + } + + @Override + public int hashCode() { + return toComparableString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + Qualifier other = (Qualifier) obj; + + return toComparableString().equals(other.toComparableString()); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Author.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Author.java new file mode 100644 index 0000000..b2f757d --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Author.java @@ -0,0 +1,90 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.*; + +public class Author implements Serializable { + + private String fullname; + + private String name; + + private String surname; + + // START WITH 1 + private Integer rank; + + private List pid; + + private List> affiliation; + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public Integer getRank() { + return rank; + } + + public void setRank(Integer rank) { + this.rank = rank; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public List> getAffiliation() { + return affiliation; + } + + public void setAffiliation(List> affiliation) { + this.affiliation = affiliation; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Author author = (Author) o; + return Objects.equals(fullname, author.fullname) + && Objects.equals(name, author.name) + && Objects.equals(surname, author.surname) + && Objects.equals(rank, author.rank) + && Objects.equals(pid, author.pid) + && Objects.equals(affiliation, author.affiliation); + } + + @Override + public int hashCode() { + return Objects.hash(fullname, name, surname, rank, pid, affiliation); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Context.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Context.java new file mode 100644 index 0000000..57912c4 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Context.java @@ -0,0 +1,46 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +public class Context implements Serializable { + private String id; + + private List dataInfo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getDataInfo() { + return dataInfo; + } + + public void setDataInfo(List dataInfo) { + this.dataInfo = dataInfo; + } + + @Override + public int hashCode() { + return id == null ? 0 : id.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + Context other = (Context) obj; + + return id.equals(other.getId()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Country.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Country.java new file mode 100644 index 0000000..e25fdca --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Country.java @@ -0,0 +1,34 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.util.Objects; + +public class Country extends Qualifier { + + private DataInfo dataInfo; + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + if (!super.equals(o)) + return false; + Country country = (Country) o; + return Objects.equals(dataInfo, country.dataInfo); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), dataInfo); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/DataInfo.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/DataInfo.java new file mode 100644 index 0000000..9d572ee --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/DataInfo.java @@ -0,0 +1,85 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +public class DataInfo implements Serializable { + + private Boolean invisible = false; + private Boolean inferred; + private Boolean deletedbyinference = false; + private String trust; + private String inferenceprovenance; + private Qualifier provenanceaction; + + public Boolean getInvisible() { + return invisible; + } + + public void setInvisible(Boolean invisible) { + this.invisible = invisible; + } + + public Boolean getInferred() { + return inferred; + } + + public void setInferred(Boolean inferred) { + this.inferred = inferred; + } + + public Boolean getDeletedbyinference() { + return deletedbyinference; + } + + public void setDeletedbyinference(Boolean deletedbyinference) { + this.deletedbyinference = deletedbyinference; + } + + public String getTrust() { + return trust; + } + + public void setTrust(String trust) { + this.trust = trust; + } + + public String getInferenceprovenance() { + return inferenceprovenance; + } + + public void setInferenceprovenance(String inferenceprovenance) { + this.inferenceprovenance = inferenceprovenance; + } + + public Qualifier getProvenanceaction() { + return provenanceaction; + } + + public void setProvenanceaction(Qualifier provenanceaction) { + this.provenanceaction = provenanceaction; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + DataInfo dataInfo = (DataInfo) o; + return Objects.equals(invisible, dataInfo.invisible) + && Objects.equals(inferred, dataInfo.inferred) + && Objects.equals(deletedbyinference, dataInfo.deletedbyinference) + && Objects.equals(trust, dataInfo.trust) + && Objects.equals(inferenceprovenance, dataInfo.inferenceprovenance) + && Objects.equals(provenanceaction, dataInfo.provenanceaction); + } + + @Override + public int hashCode() { + return Objects + .hash( + invisible, inferred, deletedbyinference, trust, inferenceprovenance, provenanceaction); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Dataset.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Dataset.java new file mode 100644 index 0000000..b5587c6 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Dataset.java @@ -0,0 +1,116 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.common.ModelConstants; + +public class Dataset extends Result implements Serializable { + + private Field storagedate; + + // candidate for removal + private Field device; + + private Field size; + + private Field version; + + private Field lastmetadataupdate; + + private Field metadataversionnumber; + + private List geolocation; + + public Dataset() { + setResulttype(ModelConstants.DATASET_DEFAULT_RESULTTYPE); + } + + public Field getStoragedate() { + return storagedate; + } + + public void setStoragedate(Field storagedate) { + this.storagedate = storagedate; + } + + public Field getDevice() { + return device; + } + + public void setDevice(Field device) { + this.device = device; + } + + public Field getSize() { + return size; + } + + public void setSize(Field size) { + this.size = size; + } + + public Field getVersion() { + return version; + } + + public void setVersion(Field version) { + this.version = version; + } + + public Field getLastmetadataupdate() { + return lastmetadataupdate; + } + + public void setLastmetadataupdate(Field lastmetadataupdate) { + this.lastmetadataupdate = lastmetadataupdate; + } + + public Field getMetadataversionnumber() { + return metadataversionnumber; + } + + public void setMetadataversionnumber(Field metadataversionnumber) { + this.metadataversionnumber = metadataversionnumber; + } + + public List getGeolocation() { + return geolocation; + } + + public void setGeolocation(List geolocation) { + this.geolocation = geolocation; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Dataset.class.isAssignableFrom(e.getClass())) { + return; + } + + final Dataset d = (Dataset) e; + + storagedate = d.getStoragedate() != null && compareTrust(this, e) < 0 ? d.getStoragedate() : storagedate; + + device = d.getDevice() != null && compareTrust(this, e) < 0 ? d.getDevice() : device; + + size = d.getSize() != null && compareTrust(this, e) < 0 ? d.getSize() : size; + + version = d.getVersion() != null && compareTrust(this, e) < 0 ? d.getVersion() : version; + + lastmetadataupdate = d.getLastmetadataupdate() != null && compareTrust(this, e) < 0 + ? d.getLastmetadataupdate() + : lastmetadataupdate; + + metadataversionnumber = d.getMetadataversionnumber() != null && compareTrust(this, e) < 0 + ? d.getMetadataversionnumber() + : metadataversionnumber; + + geolocation = mergeLists(geolocation, d.getGeolocation()); + + mergeOAFDataInfo(d); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java new file mode 100644 index 0000000..7217982 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java @@ -0,0 +1,472 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +public class Datasource extends OafEntity implements Serializable { + + private Qualifier datasourcetype; + + private Qualifier openairecompatibility; + + private Field officialname; + + private Field englishname; + + private Field websiteurl; + + private Field logourl; + + private Field contactemail; + + private Field namespaceprefix; + + private Field latitude; + + private Field longitude; + + private Field dateofvalidation; + + private Field description; + + private List subjects; + + // opendoar specific fields (od*) + private Field odnumberofitems; + + private Field odnumberofitemsdate; + + private Field odpolicies; + + private List> odlanguages; + + private List> odcontenttypes; + + private List> accessinfopackage; + + // re3data fields + private Field releasestartdate; + + private Field releaseenddate; + + private Field missionstatementurl; + + private Field dataprovider; + + private Field serviceprovider; + + // {open, restricted or closed} + private Field databaseaccesstype; + + // {open, restricted or closed} + private Field datauploadtype; + + // {feeRequired, registration, other} + private Field databaseaccessrestriction; + + // {feeRequired, registration, other} + private Field datauploadrestriction; + + private Field versioning; + + private Field citationguidelineurl; + + // {yes, no, uknown} + private Field qualitymanagementkind; + + private Field pidsystems; + + private Field certificates; + + private List policies; + + private Journal journal; + + public Qualifier getDatasourcetype() { + return datasourcetype; + } + + public void setDatasourcetype(Qualifier datasourcetype) { + this.datasourcetype = datasourcetype; + } + + public Qualifier getOpenairecompatibility() { + return openairecompatibility; + } + + public void setOpenairecompatibility(Qualifier openairecompatibility) { + this.openairecompatibility = openairecompatibility; + } + + public Field getOfficialname() { + return officialname; + } + + public void setOfficialname(Field officialname) { + this.officialname = officialname; + } + + public Field getEnglishname() { + return englishname; + } + + public void setEnglishname(Field englishname) { + this.englishname = englishname; + } + + public Field getWebsiteurl() { + return websiteurl; + } + + public void setWebsiteurl(Field websiteurl) { + this.websiteurl = websiteurl; + } + + public Field getLogourl() { + return logourl; + } + + public void setLogourl(Field logourl) { + this.logourl = logourl; + } + + public Field getContactemail() { + return contactemail; + } + + public void setContactemail(Field contactemail) { + this.contactemail = contactemail; + } + + public Field getNamespaceprefix() { + return namespaceprefix; + } + + public void setNamespaceprefix(Field namespaceprefix) { + this.namespaceprefix = namespaceprefix; + } + + public Field getLatitude() { + return latitude; + } + + public void setLatitude(Field latitude) { + this.latitude = latitude; + } + + public Field getLongitude() { + return longitude; + } + + public void setLongitude(Field longitude) { + this.longitude = longitude; + } + + public Field getDateofvalidation() { + return dateofvalidation; + } + + public void setDateofvalidation(Field dateofvalidation) { + this.dateofvalidation = dateofvalidation; + } + + public Field getDescription() { + return description; + } + + public void setDescription(Field description) { + this.description = description; + } + + public List getSubjects() { + return subjects; + } + + public void setSubjects(List subjects) { + this.subjects = subjects; + } + + public Field getOdnumberofitems() { + return odnumberofitems; + } + + public void setOdnumberofitems(Field odnumberofitems) { + this.odnumberofitems = odnumberofitems; + } + + public Field getOdnumberofitemsdate() { + return odnumberofitemsdate; + } + + public void setOdnumberofitemsdate(Field odnumberofitemsdate) { + this.odnumberofitemsdate = odnumberofitemsdate; + } + + public Field getOdpolicies() { + return odpolicies; + } + + public void setOdpolicies(Field odpolicies) { + this.odpolicies = odpolicies; + } + + public List> getOdlanguages() { + return odlanguages; + } + + public void setOdlanguages(List> odlanguages) { + this.odlanguages = odlanguages; + } + + public List> getOdcontenttypes() { + return odcontenttypes; + } + + public void setOdcontenttypes(List> odcontenttypes) { + this.odcontenttypes = odcontenttypes; + } + + public List> getAccessinfopackage() { + return accessinfopackage; + } + + public void setAccessinfopackage(List> accessinfopackage) { + this.accessinfopackage = accessinfopackage; + } + + public Field getReleasestartdate() { + return releasestartdate; + } + + public void setReleasestartdate(Field releasestartdate) { + this.releasestartdate = releasestartdate; + } + + public Field getReleaseenddate() { + return releaseenddate; + } + + public void setReleaseenddate(Field releaseenddate) { + this.releaseenddate = releaseenddate; + } + + public Field getMissionstatementurl() { + return missionstatementurl; + } + + public void setMissionstatementurl(Field missionstatementurl) { + this.missionstatementurl = missionstatementurl; + } + + public Field getDataprovider() { + return dataprovider; + } + + public void setDataprovider(Field dataprovider) { + this.dataprovider = dataprovider; + } + + public Field getServiceprovider() { + return serviceprovider; + } + + public void setServiceprovider(Field serviceprovider) { + this.serviceprovider = serviceprovider; + } + + public Field getDatabaseaccesstype() { + return databaseaccesstype; + } + + public void setDatabaseaccesstype(Field databaseaccesstype) { + this.databaseaccesstype = databaseaccesstype; + } + + public Field getDatauploadtype() { + return datauploadtype; + } + + public void setDatauploadtype(Field datauploadtype) { + this.datauploadtype = datauploadtype; + } + + public Field getDatabaseaccessrestriction() { + return databaseaccessrestriction; + } + + public void setDatabaseaccessrestriction(Field databaseaccessrestriction) { + this.databaseaccessrestriction = databaseaccessrestriction; + } + + public Field getDatauploadrestriction() { + return datauploadrestriction; + } + + public void setDatauploadrestriction(Field datauploadrestriction) { + this.datauploadrestriction = datauploadrestriction; + } + + public Field getVersioning() { + return versioning; + } + + public void setVersioning(Field versioning) { + this.versioning = versioning; + } + + public Field getCitationguidelineurl() { + return citationguidelineurl; + } + + public void setCitationguidelineurl(Field citationguidelineurl) { + this.citationguidelineurl = citationguidelineurl; + } + + public Field getQualitymanagementkind() { + return qualitymanagementkind; + } + + public void setQualitymanagementkind(Field qualitymanagementkind) { + this.qualitymanagementkind = qualitymanagementkind; + } + + public Field getPidsystems() { + return pidsystems; + } + + public void setPidsystems(Field pidsystems) { + this.pidsystems = pidsystems; + } + + public Field getCertificates() { + return certificates; + } + + public void setCertificates(Field certificates) { + this.certificates = certificates; + } + + public List getPolicies() { + return policies; + } + + public void setPolicies(List policies) { + this.policies = policies; + } + + public Journal getJournal() { + return journal; + } + + public void setJournal(Journal journal) { + this.journal = journal; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Datasource.class.isAssignableFrom(e.getClass())) { + return; + } + + Datasource d = (Datasource) e; + + datasourcetype = d.getDatasourcetype() != null && compareTrust(this, e) < 0 + ? d.getDatasourcetype() + : datasourcetype; + openairecompatibility = d.getOpenairecompatibility() != null && compareTrust(this, e) < 0 + ? d.getOpenairecompatibility() + : openairecompatibility; + officialname = d.getOfficialname() != null && compareTrust(this, e) < 0 + ? d.getOfficialname() + : officialname; + englishname = d.getEnglishname() != null && compareTrust(this, e) < 0 ? d.getEnglishname() : officialname; + websiteurl = d.getWebsiteurl() != null && compareTrust(this, e) < 0 ? d.getWebsiteurl() : websiteurl; + logourl = d.getLogourl() != null && compareTrust(this, e) < 0 ? d.getLogourl() : getLogourl(); + contactemail = d.getContactemail() != null && compareTrust(this, e) < 0 + ? d.getContactemail() + : contactemail; + namespaceprefix = d.getNamespaceprefix() != null && compareTrust(this, e) < 0 + ? d.getNamespaceprefix() + : namespaceprefix; + latitude = d.getLatitude() != null && compareTrust(this, e) < 0 ? d.getLatitude() : latitude; + longitude = d.getLongitude() != null && compareTrust(this, e) < 0 ? d.getLongitude() : longitude; + dateofvalidation = d.getDateofvalidation() != null && compareTrust(this, e) < 0 + ? d.getDateofvalidation() + : dateofvalidation; + description = d.getDescription() != null && compareTrust(this, e) < 0 ? d.getDescription() : description; + subjects = mergeLists(subjects, d.getSubjects()); + + // opendoar specific fields (od*) + odnumberofitems = d.getOdnumberofitems() != null && compareTrust(this, e) < 0 + ? d.getOdnumberofitems() + : odnumberofitems; + odnumberofitemsdate = d.getOdnumberofitemsdate() != null && compareTrust(this, e) < 0 + ? d.getOdnumberofitemsdate() + : odnumberofitemsdate; + odpolicies = d.getOdpolicies() != null && compareTrust(this, e) < 0 ? d.getOdpolicies() : odpolicies; + odlanguages = mergeLists(odlanguages, d.getOdlanguages()); + odcontenttypes = mergeLists(odcontenttypes, d.getOdcontenttypes()); + accessinfopackage = mergeLists(accessinfopackage, d.getAccessinfopackage()); + + // re3data fields + releasestartdate = d.getReleasestartdate() != null && compareTrust(this, e) < 0 + ? d.getReleasestartdate() + : releasestartdate; + releaseenddate = d.getReleaseenddate() != null && compareTrust(this, e) < 0 + ? d.getReleaseenddate() + : releaseenddate; + missionstatementurl = d.getMissionstatementurl() != null && compareTrust(this, e) < 0 + ? d.getMissionstatementurl() + : missionstatementurl; + dataprovider = d.getDataprovider() != null && compareTrust(this, e) < 0 + ? d.getDataprovider() + : dataprovider; + serviceprovider = d.getServiceprovider() != null && compareTrust(this, e) < 0 + ? d.getServiceprovider() + : serviceprovider; + + // {open, restricted or closed} + databaseaccesstype = d.getDatabaseaccesstype() != null && compareTrust(this, e) < 0 + ? d.getDatabaseaccesstype() + : databaseaccesstype; + + // {open, restricted or closed} + datauploadtype = d.getDatauploadtype() != null && compareTrust(this, e) < 0 + ? d.getDatauploadtype() + : datauploadtype; + + // {feeRequired, registration, other} + databaseaccessrestriction = d.getDatabaseaccessrestriction() != null && compareTrust(this, e) < 0 + ? d.getDatabaseaccessrestriction() + : databaseaccessrestriction; + + // {feeRequired, registration, other} + datauploadrestriction = d.getDatauploadrestriction() != null && compareTrust(this, e) < 0 + ? d.getDatauploadrestriction() + : datauploadrestriction; + + versioning = d.getVersioning() != null && compareTrust(this, e) < 0 ? d.getVersioning() : versioning; + citationguidelineurl = d.getCitationguidelineurl() != null && compareTrust(this, e) < 0 + ? d.getCitationguidelineurl() + : citationguidelineurl; + + // {yes, no, unknown} + qualitymanagementkind = d.getQualitymanagementkind() != null && compareTrust(this, e) < 0 + ? d.getQualitymanagementkind() + : qualitymanagementkind; + pidsystems = d.getPidsystems() != null && compareTrust(this, e) < 0 ? d.getPidsystems() : pidsystems; + + certificates = d.getCertificates() != null && compareTrust(this, e) < 0 + ? d.getCertificates() + : certificates; + + policies = mergeLists(policies, d.getPolicies()); + + journal = d.getJournal() != null && compareTrust(this, e) < 0 ? d.getJournal() : journal; + + mergeOAFDataInfo(e); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/ExternalReference.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/ExternalReference.java new file mode 100644 index 0000000..0689b44 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/ExternalReference.java @@ -0,0 +1,120 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; +import java.util.Objects; + +public class ExternalReference implements Serializable { + // source + private String sitename; + + // title + private String label; + + // alternative labels + private List alternateLabel; + + // text() + private String url; + + // type + private Qualifier qualifier; + + // site internal identifier + private String refidentifier; + + // maps the oaf:reference/@query attribute + private String query; + + // ExternalReferences might be also inferred + private DataInfo dataInfo; + + public String getSitename() { + return sitename; + } + + public void setSitename(String sitename) { + this.sitename = sitename; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public List getAlternateLabel() { + return alternateLabel; + } + + public void setAlternateLabel(List alternateLabel) { + this.alternateLabel = alternateLabel; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Qualifier getQualifier() { + return qualifier; + } + + public void setQualifier(Qualifier qualifier) { + this.qualifier = qualifier; + } + + public String getRefidentifier() { + return refidentifier; + } + + public void setRefidentifier(String refidentifier) { + this.refidentifier = refidentifier; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ExternalReference that = (ExternalReference) o; + return Objects.equals(sitename, that.sitename) + && Objects.equals(label, that.label) + && Objects.equals(url, that.url) + && Objects.equals(qualifier, that.qualifier) + && Objects.equals(refidentifier, that.refidentifier) + && Objects.equals(query, that.query) + && Objects.equals(dataInfo, that.dataInfo); + } + + @Override + public int hashCode() { + return Objects + .hash( + sitename, label, url, qualifier, refidentifier, query, dataInfo); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/ExtraInfo.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/ExtraInfo.java new file mode 100644 index 0000000..3682cc2 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/ExtraInfo.java @@ -0,0 +1,77 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +public class ExtraInfo implements Serializable { + private String name; + + private String typology; + + private String provenance; + + private String trust; + + // json containing a Citation or Statistics + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTypology() { + return typology; + } + + public void setTypology(String typology) { + this.typology = typology; + } + + public String getProvenance() { + return provenance; + } + + public void setProvenance(String provenance) { + this.provenance = provenance; + } + + public String getTrust() { + return trust; + } + + public void setTrust(String trust) { + this.trust = trust; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ExtraInfo extraInfo = (ExtraInfo) o; + return Objects.equals(name, extraInfo.name) + && Objects.equals(typology, extraInfo.typology) + && Objects.equals(provenance, extraInfo.provenance) + && Objects.equals(trust, extraInfo.trust) + && Objects.equals(value, extraInfo.value); + } + + @Override + public int hashCode() { + return Objects.hash(name, typology, provenance, trust, value); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Field.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Field.java new file mode 100644 index 0000000..8358bc4 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Field.java @@ -0,0 +1,45 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +public class Field implements Serializable { + + private T value; + + private DataInfo dataInfo; + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + @Override + public int hashCode() { + return getValue() == null ? 0 : getValue().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Field other = (Field) obj; + return Objects.equals(getValue(), other.getValue()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/GeoLocation.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/GeoLocation.java new file mode 100644 index 0000000..7ed313a --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/GeoLocation.java @@ -0,0 +1,76 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class GeoLocation implements Serializable { + + private String point; + + private String box; + + private String place; + + public String getPoint() { + return point; + } + + public void setPoint(String point) { + this.point = point; + } + + public String getBox() { + return box; + } + + public void setBox(String box) { + this.box = box; + } + + public String getPlace() { + return place; + } + + public void setPlace(String place) { + this.place = place; + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(point) && StringUtils.isBlank(box) && StringUtils.isBlank(place); + } + + public String toComparableString() { + return isBlank() + ? "" + : String + .format( + "%s::%s%s", + point != null ? point.toLowerCase() : "", + box != null ? box.toLowerCase() : "", + place != null ? place.toLowerCase() : ""); + } + + @Override + public int hashCode() { + return toComparableString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + GeoLocation other = (GeoLocation) obj; + + return toComparableString().equals(other.toComparableString()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/H2020Classification.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/H2020Classification.java new file mode 100644 index 0000000..219bdc0 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/H2020Classification.java @@ -0,0 +1,88 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +/** + * To store information about the classification for the project. The classification depends on the programme. For example + * H2020-EU.3.4.5.3 can be classified as + * H2020-EU.3. => Societal Challenges (level1) + * H2020-EU.3.4. => Transport (level2) + * H2020-EU.3.4.5. => CLEANSKY2 (level3) + * H2020-EU.3.4.5.3. => IADP Fast Rotorcraft (level4) + * + * We decided to explicitly represent up to three levels in the classification. + * + * H2020Classification has the following parameters: + * - private Programme programme to store the information about the programme related to this classification + * - private String level1 to store the information about the level 1 of the classification (Priority or Pillar of the EC) + * - private String level2 to store the information about the level2 af the classification (Objectives (?)) + * - private String level3 to store the information about the level3 of the classification + * - private String classification to store the entire classification related to the programme + */ + +public class H2020Classification implements Serializable { + private H2020Programme h2020Programme; + private String level1; + private String level2; + private String level3; + + private String classification; + + public H2020Programme getH2020Programme() { + return h2020Programme; + } + + public void setH2020Programme(H2020Programme h2020Programme) { + this.h2020Programme = h2020Programme; + } + + public String getLevel1() { + return level1; + } + + public void setLevel1(String level1) { + this.level1 = level1; + } + + public String getLevel2() { + return level2; + } + + public void setLevel2(String level2) { + this.level2 = level2; + } + + public String getLevel3() { + return level3; + } + + public void setLevel3(String level3) { + this.level3 = level3; + } + + public String getClassification() { + return classification; + } + + public void setClassification(String classification) { + this.classification = classification; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + H2020Classification h2020classification = (H2020Classification) o; + + return Objects.equals(level1, h2020classification.level1) && + Objects.equals(level2, h2020classification.level2) && + Objects.equals(level3, h2020classification.level3) && + Objects.equals(classification, h2020classification.classification) && + h2020Programme.equals(h2020classification.h2020Programme); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/H2020Programme.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/H2020Programme.java new file mode 100644 index 0000000..101d46d --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/H2020Programme.java @@ -0,0 +1,44 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +/** + * To store information about the ec programme for the project. It has the following parameters: + * - private String code to store the code of the programme + * - private String description to store the description of the programme + */ + +public class H2020Programme implements Serializable { + private String code; + private String description; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + H2020Programme h2020Programme = (H2020Programme) o; + return Objects.equals(code, h2020Programme.code); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java new file mode 100644 index 0000000..c4cde0c --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java @@ -0,0 +1,173 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +public class Instance implements Serializable { + + private Field license; + + private AccessRight accessright; + + private Qualifier instancetype; + + private KeyValue hostedby; + + private List url; + + // other research products specifc + private String distributionlocation; + + private KeyValue collectedfrom; + + private List pid; + + private List alternateIdentifier; + + private Field dateofacceptance; + + // ( article | book ) processing charges. Defined here to cope with possible wrongly typed + // results + private Field processingchargeamount; + + // currency - alphabetic code describe in ISO-4217. Defined here to cope with possible wrongly + // typed results + private Field processingchargecurrency; + + private Qualifier refereed; // peer-review status + + public Field getLicense() { + return license; + } + + public void setLicense(Field license) { + this.license = license; + } + + public AccessRight getAccessright() { + return accessright; + } + + public void setAccessright(AccessRight accessright) { + this.accessright = accessright; + } + + public Qualifier getInstancetype() { + return instancetype; + } + + public void setInstancetype(Qualifier instancetype) { + this.instancetype = instancetype; + } + + public KeyValue getHostedby() { + return hostedby; + } + + public void setHostedby(KeyValue hostedby) { + this.hostedby = hostedby; + } + + public List getUrl() { + return url; + } + + public void setUrl(List url) { + this.url = url; + } + + public String getDistributionlocation() { + return distributionlocation; + } + + public void setDistributionlocation(String distributionlocation) { + this.distributionlocation = distributionlocation; + } + + public KeyValue getCollectedfrom() { + return collectedfrom; + } + + public void setCollectedfrom(KeyValue collectedfrom) { + this.collectedfrom = collectedfrom; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public Field getDateofacceptance() { + return dateofacceptance; + } + + public void setDateofacceptance(Field dateofacceptance) { + this.dateofacceptance = dateofacceptance; + } + + public List getAlternateIdentifier() { + return alternateIdentifier; + } + + public void setAlternateIdentifier(List alternateIdentifier) { + this.alternateIdentifier = alternateIdentifier; + } + + public Field getProcessingchargeamount() { + return processingchargeamount; + } + + public void setProcessingchargeamount(Field processingchargeamount) { + this.processingchargeamount = processingchargeamount; + } + + public Field getProcessingchargecurrency() { + return processingchargecurrency; + } + + public void setProcessingchargecurrency(Field processingchargecurrency) { + this.processingchargecurrency = processingchargecurrency; + } + + public Qualifier getRefereed() { + return refereed; + } + + public void setRefereed(Qualifier refereed) { + this.refereed = refereed; + } + + public String toComparableString() { + return String + .format( + "%s::%s::%s::%s", + hostedby != null && hostedby.getKey() != null ? hostedby.getKey().toLowerCase() : "", + accessright != null && accessright.getClassid() != null ? accessright.getClassid() : "", + instancetype != null && instancetype.getClassid() != null ? instancetype.getClassid() : "", + url != null ? url : ""); + } + + @Override + public int hashCode() { + return toComparableString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + Instance other = (Instance) obj; + + return toComparableString().equals(other.toComparableString()); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Journal.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Journal.java new file mode 100644 index 0000000..7a375e2 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Journal.java @@ -0,0 +1,167 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +public class Journal implements Serializable { + + private String name; + + private String issnPrinted; + + private String issnOnline; + + private String issnLinking; + + private String ep; + + private String iss; + + private String sp; + + private String vol; + + private String edition; + + private String conferenceplace; + + private String conferencedate; + + private DataInfo dataInfo; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIssnPrinted() { + return issnPrinted; + } + + public void setIssnPrinted(String issnPrinted) { + this.issnPrinted = issnPrinted; + } + + public String getIssnOnline() { + return issnOnline; + } + + public void setIssnOnline(String issnOnline) { + this.issnOnline = issnOnline; + } + + public String getIssnLinking() { + return issnLinking; + } + + public void setIssnLinking(String issnLinking) { + this.issnLinking = issnLinking; + } + + public String getEp() { + return ep; + } + + public void setEp(String ep) { + this.ep = ep; + } + + public String getIss() { + return iss; + } + + public void setIss(String iss) { + this.iss = iss; + } + + public String getSp() { + return sp; + } + + public void setSp(String sp) { + this.sp = sp; + } + + public String getVol() { + return vol; + } + + public void setVol(String vol) { + this.vol = vol; + } + + public String getEdition() { + return edition; + } + + public void setEdition(String edition) { + this.edition = edition; + } + + public String getConferenceplace() { + return conferenceplace; + } + + public void setConferenceplace(String conferenceplace) { + this.conferenceplace = conferenceplace; + } + + public String getConferencedate() { + return conferencedate; + } + + public void setConferencedate(String conferencedate) { + this.conferencedate = conferencedate; + } + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Journal journal = (Journal) o; + return Objects.equals(name, journal.name) + && Objects.equals(issnPrinted, journal.issnPrinted) + && Objects.equals(issnOnline, journal.issnOnline) + && Objects.equals(issnLinking, journal.issnLinking) + && Objects.equals(ep, journal.ep) + && Objects.equals(iss, journal.iss) + && Objects.equals(sp, journal.sp) + && Objects.equals(vol, journal.vol) + && Objects.equals(edition, journal.edition) + && Objects.equals(conferenceplace, journal.conferenceplace) + && Objects.equals(conferencedate, journal.conferencedate) + && Objects.equals(dataInfo, journal.dataInfo); + } + + @Override + public int hashCode() { + return Objects + .hash( + name, + issnPrinted, + issnOnline, + issnLinking, + ep, + iss, + sp, + vol, + edition, + conferenceplace, + conferencedate, + dataInfo); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/KeyValue.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/KeyValue.java new file mode 100644 index 0000000..4e2d601 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/KeyValue.java @@ -0,0 +1,74 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class KeyValue implements Serializable { + + private String key; + + private String value; + + private DataInfo dataInfo; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + public String toComparableString() { + return isBlank() + ? "" + : String + .format( + "%s::%s", + key != null ? key.toLowerCase() : "", value != null ? value.toLowerCase() : ""); + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(key) && StringUtils.isBlank(value); + } + + @Override + public int hashCode() { + return toComparableString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + KeyValue other = (KeyValue) obj; + + return toComparableString().equals(other.toComparableString()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java new file mode 100644 index 0000000..c0c14d1 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java @@ -0,0 +1,59 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.util.List; + +import com.google.common.base.Objects; + +/** + * Represent a measure, must be further described by a system available resource providing name and descriptions. + */ +public class Measure { + + /** + * Unique measure identifier. + */ + private String id; + + /** + * List of units associated with this measure. KeyValue provides a pair to store the laber (key) and the value, plus + * common provenance information. + */ + private List unit; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getUnit() { + return unit; + } + + public void setUnit(List unit) { + this.unit = unit; + } + + public void mergeFrom(Measure m) { + // TODO + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Measure measure = (Measure) o; + return Objects.equal(id, measure.id) && + Objects.equal(unit, measure.unit); + } + + @Override + public int hashCode() { + return Objects.hashCode(id, unit); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/OAIProvenance.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/OAIProvenance.java new file mode 100644 index 0000000..88d74af --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/OAIProvenance.java @@ -0,0 +1,33 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +public class OAIProvenance implements Serializable { + + private OriginDescription originDescription; + + public OriginDescription getOriginDescription() { + return originDescription; + } + + public void setOriginDescription(OriginDescription originDescription) { + this.originDescription = originDescription; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + OAIProvenance that = (OAIProvenance) o; + return Objects.equals(originDescription, that.originDescription); + } + + @Override + public int hashCode() { + return Objects.hash(originDescription); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Oaf.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Oaf.java new file mode 100644 index 0000000..494123f --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Oaf.java @@ -0,0 +1,102 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public abstract class Oaf implements Serializable { + + /** + * The list of datasource id/name pairs providing this relationship. + */ + protected List collectedfrom; + + private DataInfo dataInfo; + + private Long lastupdatetimestamp; + + public List getCollectedfrom() { + return collectedfrom; + } + + public void setCollectedfrom(List collectedfrom) { + this.collectedfrom = collectedfrom; + } + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + public Long getLastupdatetimestamp() { + return lastupdatetimestamp; + } + + public void setLastupdatetimestamp(Long lastupdatetimestamp) { + this.lastupdatetimestamp = lastupdatetimestamp; + } + + public void mergeFrom(Oaf o) { + if (Objects.isNull(o)) { + return; + } + setCollectedfrom( + Stream + .concat( + Optional + .ofNullable(getCollectedfrom()) + .map(Collection::stream) + .orElse(Stream.empty()), + Optional + .ofNullable(o.getCollectedfrom()) + .map(Collection::stream) + .orElse(Stream.empty())) + .distinct() // relies on KeyValue.equals + .collect(Collectors.toList())); + + setLastupdatetimestamp( + Math + .max( + Optional.ofNullable(getLastupdatetimestamp()).orElse(0L), + Optional.ofNullable(o.getLastupdatetimestamp()).orElse(0L))); + } + + public void mergeOAFDataInfo(Oaf o) { + if (o.getDataInfo() != null && compareTrust(this, o) < 0) + dataInfo = o.getDataInfo(); + } + + protected String extractTrust(Oaf e) { + if (e == null || e.getDataInfo() == null || e.getDataInfo().getTrust() == null) + return "0.0"; + return e.getDataInfo().getTrust(); + } + + protected int compareTrust(Oaf a, Oaf b) { + return extractTrust(a).compareTo(extractTrust(b)); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Oaf oaf = (Oaf) o; + return Objects.equals(getDataInfo(), oaf.getDataInfo()) + && Objects.equals(lastupdatetimestamp, oaf.lastupdatetimestamp); + } + + @Override + public int hashCode() { + return Objects.hash(dataInfo, lastupdatetimestamp); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java new file mode 100644 index 0000000..17c3e6b --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java @@ -0,0 +1,126 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.*; +import java.util.stream.Collectors; + +public abstract class OafEntity extends Oaf implements Serializable { + + private String id; + + private List originalId; + + private List pid; + + private String dateofcollection; + + private String dateoftransformation; + + private List extraInfo; + + private OAIProvenance oaiprovenance; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getOriginalId() { + return originalId; + } + + public void setOriginalId(List originalId) { + this.originalId = originalId; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public String getDateofcollection() { + return dateofcollection; + } + + public void setDateofcollection(String dateofcollection) { + this.dateofcollection = dateofcollection; + } + + public String getDateoftransformation() { + return dateoftransformation; + } + + public void setDateoftransformation(String dateoftransformation) { + this.dateoftransformation = dateoftransformation; + } + + public List getExtraInfo() { + return extraInfo; + } + + public void setExtraInfo(List extraInfo) { + this.extraInfo = extraInfo; + } + + public OAIProvenance getOaiprovenance() { + return oaiprovenance; + } + + public void setOaiprovenance(OAIProvenance oaiprovenance) { + this.oaiprovenance = oaiprovenance; + } + + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + originalId = mergeLists(originalId, e.getOriginalId()); + + pid = mergeLists(pid, e.getPid()); + + if (e.getDateofcollection() != null && compareTrust(this, e) < 0) + dateofcollection = e.getDateofcollection(); + + if (e.getDateoftransformation() != null && compareTrust(this, e) < 0) + dateoftransformation = e.getDateoftransformation(); + + extraInfo = mergeLists(extraInfo, e.getExtraInfo()); + + if (e.getOaiprovenance() != null && compareTrust(this, e) < 0) + oaiprovenance = e.getOaiprovenance(); + } + + protected List mergeLists(final List... lists) { + + return Arrays + .stream(lists) + .filter(Objects::nonNull) + .flatMap(List::stream) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + if (!super.equals(o)) + return false; + OafEntity oafEntity = (OafEntity) o; + return Objects.equals(id, oafEntity.id); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), id); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/OpenAccessRoute.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/OpenAccessRoute.java new file mode 100644 index 0000000..bec5504 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/OpenAccessRoute.java @@ -0,0 +1,13 @@ + +package eu.dnetlib.dhp.schema.oaf; + +/** + * This Enum models the OpenAccess status, currently including only the values from Unpaywall + * + * https://support.unpaywall.org/support/solutions/articles/44001777288-what-do-the-types-of-oa-status-green-gold-hybrid-and-bronze-mean- + */ +public enum OpenAccessRoute { + + gold, green, hybrid, bronze + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Organization.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Organization.java new file mode 100644 index 0000000..a5f9bce --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Organization.java @@ -0,0 +1,214 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +public class Organization extends OafEntity implements Serializable { + + private Field legalshortname; + + private Field legalname; + + private List> alternativeNames; + + private Field websiteurl; + + private Field logourl; + + private Field eclegalbody; + + private Field eclegalperson; + + private Field ecnonprofit; + + private Field ecresearchorganization; + + private Field echighereducation; + + private Field ecinternationalorganizationeurinterests; + + private Field ecinternationalorganization; + + private Field ecenterprise; + + private Field ecsmevalidated; + + private Field ecnutscode; + + private Qualifier country; + + public Field getLegalshortname() { + return legalshortname; + } + + public void setLegalshortname(Field legalshortname) { + this.legalshortname = legalshortname; + } + + public Field getLegalname() { + return legalname; + } + + public void setLegalname(Field legalname) { + this.legalname = legalname; + } + + public List> getAlternativeNames() { + return alternativeNames; + } + + public void setAlternativeNames(List> alternativeNames) { + this.alternativeNames = alternativeNames; + } + + public Field getWebsiteurl() { + return websiteurl; + } + + public void setWebsiteurl(Field websiteurl) { + this.websiteurl = websiteurl; + } + + public Field getLogourl() { + return logourl; + } + + public void setLogourl(Field logourl) { + this.logourl = logourl; + } + + public Field getEclegalbody() { + return eclegalbody; + } + + public void setEclegalbody(Field eclegalbody) { + this.eclegalbody = eclegalbody; + } + + public Field getEclegalperson() { + return eclegalperson; + } + + public void setEclegalperson(Field eclegalperson) { + this.eclegalperson = eclegalperson; + } + + public Field getEcnonprofit() { + return ecnonprofit; + } + + public void setEcnonprofit(Field ecnonprofit) { + this.ecnonprofit = ecnonprofit; + } + + public Field getEcresearchorganization() { + return ecresearchorganization; + } + + public void setEcresearchorganization(Field ecresearchorganization) { + this.ecresearchorganization = ecresearchorganization; + } + + public Field getEchighereducation() { + return echighereducation; + } + + public void setEchighereducation(Field echighereducation) { + this.echighereducation = echighereducation; + } + + public Field getEcinternationalorganizationeurinterests() { + return ecinternationalorganizationeurinterests; + } + + public void setEcinternationalorganizationeurinterests( + Field ecinternationalorganizationeurinterests) { + this.ecinternationalorganizationeurinterests = ecinternationalorganizationeurinterests; + } + + public Field getEcinternationalorganization() { + return ecinternationalorganization; + } + + public void setEcinternationalorganization(Field ecinternationalorganization) { + this.ecinternationalorganization = ecinternationalorganization; + } + + public Field getEcenterprise() { + return ecenterprise; + } + + public void setEcenterprise(Field ecenterprise) { + this.ecenterprise = ecenterprise; + } + + public Field getEcsmevalidated() { + return ecsmevalidated; + } + + public void setEcsmevalidated(Field ecsmevalidated) { + this.ecsmevalidated = ecsmevalidated; + } + + public Field getEcnutscode() { + return ecnutscode; + } + + public void setEcnutscode(Field ecnutscode) { + this.ecnutscode = ecnutscode; + } + + public Qualifier getCountry() { + return country; + } + + public void setCountry(Qualifier country) { + this.country = country; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Organization.class.isAssignableFrom(e.getClass())) { + return; + } + + final Organization o = (Organization) e; + legalshortname = o.getLegalshortname() != null && compareTrust(this, e) < 0 + ? o.getLegalshortname() + : legalshortname; + legalname = o.getLegalname() != null && compareTrust(this, e) < 0 ? o.getLegalname() : legalname; + alternativeNames = mergeLists(o.getAlternativeNames(), alternativeNames); + websiteurl = o.getWebsiteurl() != null && compareTrust(this, e) < 0 ? o.getWebsiteurl() : websiteurl; + logourl = o.getLogourl() != null && compareTrust(this, e) < 0 ? o.getLogourl() : logourl; + eclegalbody = o.getEclegalbody() != null && compareTrust(this, e) < 0 ? o.getEclegalbody() : eclegalbody; + eclegalperson = o.getEclegalperson() != null && compareTrust(this, e) < 0 + ? o.getEclegalperson() + : eclegalperson; + ecnonprofit = o.getEcnonprofit() != null && compareTrust(this, e) < 0 ? o.getEcnonprofit() : ecnonprofit; + ecresearchorganization = o.getEcresearchorganization() != null && compareTrust(this, e) < 0 + ? o.getEcresearchorganization() + : ecresearchorganization; + echighereducation = o.getEchighereducation() != null && compareTrust(this, e) < 0 + ? o.getEchighereducation() + : echighereducation; + ecinternationalorganizationeurinterests = o.getEcinternationalorganizationeurinterests() != null + && compareTrust(this, e) < 0 + ? o.getEcinternationalorganizationeurinterests() + : ecinternationalorganizationeurinterests; + ecinternationalorganization = o.getEcinternationalorganization() != null && compareTrust(this, e) < 0 + ? o.getEcinternationalorganization() + : ecinternationalorganization; + ecenterprise = o.getEcenterprise() != null && compareTrust(this, e) < 0 + ? o.getEcenterprise() + : ecenterprise; + ecsmevalidated = o.getEcsmevalidated() != null && compareTrust(this, e) < 0 + ? o.getEcsmevalidated() + : ecsmevalidated; + ecnutscode = o.getEcnutscode() != null && compareTrust(this, e) < 0 ? o.getEcnutscode() : ecnutscode; + country = o.getCountry() != null && compareTrust(this, e) < 0 ? o.getCountry() : country; + mergeOAFDataInfo(o); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/OriginDescription.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/OriginDescription.java new file mode 100644 index 0000000..a275fc1 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/OriginDescription.java @@ -0,0 +1,88 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Objects; + +public class OriginDescription implements Serializable { + + private String harvestDate; + + private Boolean altered = true; + + private String baseURL; + + private String identifier; + + private String datestamp; + + private String metadataNamespace; + + public String getHarvestDate() { + return harvestDate; + } + + public void setHarvestDate(String harvestDate) { + this.harvestDate = harvestDate; + } + + public Boolean getAltered() { + return altered; + } + + public void setAltered(Boolean altered) { + this.altered = altered; + } + + public String getBaseURL() { + return baseURL; + } + + public void setBaseURL(String baseURL) { + this.baseURL = baseURL; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getDatestamp() { + return datestamp; + } + + public void setDatestamp(String datestamp) { + this.datestamp = datestamp; + } + + public String getMetadataNamespace() { + return metadataNamespace; + } + + public void setMetadataNamespace(String metadataNamespace) { + this.metadataNamespace = metadataNamespace; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + OriginDescription that = (OriginDescription) o; + return Objects.equals(harvestDate, that.harvestDate) + && Objects.equals(altered, that.altered) + && Objects.equals(baseURL, that.baseURL) + && Objects.equals(identifier, that.identifier) + && Objects.equals(datestamp, that.datestamp) + && Objects.equals(metadataNamespace, that.metadataNamespace); + } + + @Override + public int hashCode() { + return Objects.hash(harvestDate, altered, baseURL, identifier, datestamp, metadataNamespace); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/OtherResearchProduct.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/OtherResearchProduct.java new file mode 100644 index 0000000..b04934c --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/OtherResearchProduct.java @@ -0,0 +1,60 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.common.ModelConstants; + +public class OtherResearchProduct extends Result implements Serializable { + + private List> contactperson; + + private List> contactgroup; + + private List> tool; + + public OtherResearchProduct() { + setResulttype(ModelConstants.ORP_DEFAULT_RESULTTYPE); + } + + public List> getContactperson() { + return contactperson; + } + + public void setContactperson(List> contactperson) { + this.contactperson = contactperson; + } + + public List> getContactgroup() { + return contactgroup; + } + + public void setContactgroup(List> contactgroup) { + this.contactgroup = contactgroup; + } + + public List> getTool() { + return tool; + } + + public void setTool(List> tool) { + this.tool = tool; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!OtherResearchProduct.class.isAssignableFrom(e.getClass())) { + return; + } + + OtherResearchProduct o = (OtherResearchProduct) e; + + contactperson = mergeLists(contactperson, o.getContactperson()); + contactgroup = mergeLists(contactgroup, o.getContactgroup()); + tool = mergeLists(tool, o.getTool()); + mergeOAFDataInfo(e); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java new file mode 100644 index 0000000..4be4d5d --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java @@ -0,0 +1,358 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +public class Project extends OafEntity implements Serializable { + + private Field websiteurl; + + private Field code; + + private Field acronym; + + private Field title; + + private Field startdate; + + private Field enddate; + + private Field callidentifier; + + private Field keywords; + + private Field duration; + + private Field ecsc39; + + private Field oamandatepublications; + + private Field ecarticle29_3; + + private List subjects; + + private List> fundingtree; + + private Qualifier contracttype; + + private Field optional1; + + private Field optional2; + + private Field jsonextrainfo; + + private Field contactfullname; + + private Field contactfax; + + private Field contactphone; + + private Field contactemail; + + private Field summary; + + private Field currency; + + private Float totalcost; + + private Float fundedamount; + + private String h2020topiccode; + + private String h2020topicdescription; + + private List h2020classification; + + public String getH2020topicdescription() { + return h2020topicdescription; + } + + public void setH2020topicdescription(String h2020topicdescription) { + this.h2020topicdescription = h2020topicdescription; + } + + public String getH2020topiccode() { + return h2020topiccode; + } + + public void setH2020topiccode(String h2020topiccode) { + this.h2020topiccode = h2020topiccode; + } + + public List getH2020classification() { + return h2020classification; + } + + public void setH2020classification(List h2020classification) { + this.h2020classification = h2020classification; + } + + public Field getWebsiteurl() { + return websiteurl; + } + + public void setWebsiteurl(Field websiteurl) { + this.websiteurl = websiteurl; + } + + public Field getCode() { + return code; + } + + public void setCode(Field code) { + this.code = code; + } + + public Field getAcronym() { + return acronym; + } + + public void setAcronym(Field acronym) { + this.acronym = acronym; + } + + public Field getTitle() { + return title; + } + + public void setTitle(Field title) { + this.title = title; + } + + public Field getStartdate() { + return startdate; + } + + public void setStartdate(Field startdate) { + this.startdate = startdate; + } + + public Field getEnddate() { + return enddate; + } + + public void setEnddate(Field enddate) { + this.enddate = enddate; + } + + public Field getCallidentifier() { + return callidentifier; + } + + public void setCallidentifier(Field callidentifier) { + this.callidentifier = callidentifier; + } + + public Field getKeywords() { + return keywords; + } + + public void setKeywords(Field keywords) { + this.keywords = keywords; + } + + public Field getDuration() { + return duration; + } + + public void setDuration(Field duration) { + this.duration = duration; + } + + public Field getEcsc39() { + return ecsc39; + } + + public void setEcsc39(Field ecsc39) { + this.ecsc39 = ecsc39; + } + + public Field getOamandatepublications() { + return oamandatepublications; + } + + public void setOamandatepublications(Field oamandatepublications) { + this.oamandatepublications = oamandatepublications; + } + + public Field getEcarticle29_3() { + return ecarticle29_3; + } + + public void setEcarticle29_3(Field ecarticle29_3) { + this.ecarticle29_3 = ecarticle29_3; + } + + public List getSubjects() { + return subjects; + } + + public void setSubjects(List subjects) { + this.subjects = subjects; + } + + public List> getFundingtree() { + return fundingtree; + } + + public void setFundingtree(List> fundingtree) { + this.fundingtree = fundingtree; + } + + public Qualifier getContracttype() { + return contracttype; + } + + public void setContracttype(Qualifier contracttype) { + this.contracttype = contracttype; + } + + public Field getOptional1() { + return optional1; + } + + public void setOptional1(Field optional1) { + this.optional1 = optional1; + } + + public Field getOptional2() { + return optional2; + } + + public void setOptional2(Field optional2) { + this.optional2 = optional2; + } + + public Field getJsonextrainfo() { + return jsonextrainfo; + } + + public void setJsonextrainfo(Field jsonextrainfo) { + this.jsonextrainfo = jsonextrainfo; + } + + public Field getContactfullname() { + return contactfullname; + } + + public void setContactfullname(Field contactfullname) { + this.contactfullname = contactfullname; + } + + public Field getContactfax() { + return contactfax; + } + + public void setContactfax(Field contactfax) { + this.contactfax = contactfax; + } + + public Field getContactphone() { + return contactphone; + } + + public void setContactphone(Field contactphone) { + this.contactphone = contactphone; + } + + public Field getContactemail() { + return contactemail; + } + + public void setContactemail(Field contactemail) { + this.contactemail = contactemail; + } + + public Field getSummary() { + return summary; + } + + public void setSummary(Field summary) { + this.summary = summary; + } + + public Field getCurrency() { + return currency; + } + + public void setCurrency(Field currency) { + this.currency = currency; + } + + public Float getTotalcost() { + return totalcost; + } + + public void setTotalcost(Float totalcost) { + this.totalcost = totalcost; + } + + public Float getFundedamount() { + return fundedamount; + } + + public void setFundedamount(Float fundedamount) { + this.fundedamount = fundedamount; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Project.class.isAssignableFrom(e.getClass())) { + return; + } + + Project p = (Project) e; + + websiteurl = p.getWebsiteurl() != null && compareTrust(this, e) < 0 ? p.getWebsiteurl() : websiteurl; + code = p.getCode() != null && compareTrust(this, e) < 0 ? p.getCode() : code; + acronym = p.getAcronym() != null && compareTrust(this, e) < 0 ? p.getAcronym() : acronym; + title = p.getTitle() != null && compareTrust(this, e) < 0 ? p.getTitle() : title; + startdate = p.getStartdate() != null && compareTrust(this, e) < 0 ? p.getStartdate() : startdate; + enddate = p.getEnddate() != null && compareTrust(this, e) < 0 ? p.getEnddate() : enddate; + callidentifier = p.getCallidentifier() != null && compareTrust(this, e) < 0 + ? p.getCallidentifier() + : callidentifier; + keywords = p.getKeywords() != null && compareTrust(this, e) < 0 ? p.getKeywords() : keywords; + duration = p.getDuration() != null && compareTrust(this, e) < 0 ? p.getDuration() : duration; + ecsc39 = p.getEcsc39() != null && compareTrust(this, e) < 0 ? p.getEcsc39() : ecsc39; + oamandatepublications = p.getOamandatepublications() != null && compareTrust(this, e) < 0 + ? p.getOamandatepublications() + : oamandatepublications; + ecarticle29_3 = p.getEcarticle29_3() != null && compareTrust(this, e) < 0 + ? p.getEcarticle29_3() + : ecarticle29_3; + subjects = mergeLists(subjects, p.getSubjects()); + fundingtree = mergeLists(fundingtree, p.getFundingtree()); + contracttype = p.getContracttype() != null && compareTrust(this, e) < 0 + ? p.getContracttype() + : contracttype; + optional1 = p.getOptional1() != null && compareTrust(this, e) < 0 ? p.getOptional1() : optional1; + optional2 = p.getOptional2() != null && compareTrust(this, e) < 0 ? p.getOptional2() : optional2; + jsonextrainfo = p.getJsonextrainfo() != null && compareTrust(this, e) < 0 + ? p.getJsonextrainfo() + : jsonextrainfo; + contactfullname = p.getContactfullname() != null && compareTrust(this, e) < 0 + ? p.getContactfullname() + : contactfullname; + contactfax = p.getContactfax() != null && compareTrust(this, e) < 0 ? p.getContactfax() : contactfax; + contactphone = p.getContactphone() != null && compareTrust(this, e) < 0 + ? p.getContactphone() + : contactphone; + contactemail = p.getContactemail() != null && compareTrust(this, e) < 0 + ? p.getContactemail() + : contactemail; + summary = p.getSummary() != null && compareTrust(this, e) < 0 ? p.getSummary() : summary; + currency = p.getCurrency() != null && compareTrust(this, e) < 0 ? p.getCurrency() : currency; + totalcost = p.getTotalcost() != null && compareTrust(this, e) < 0 ? p.getTotalcost() : totalcost; + fundedamount = p.getFundedamount() != null && compareTrust(this, e) < 0 + ? p.getFundedamount() + : fundedamount; + + h2020classification = mergeLists(h2020classification, p.getH2020classification()); + + mergeOAFDataInfo(e); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Publication.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Publication.java new file mode 100644 index 0000000..3058c26 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Publication.java @@ -0,0 +1,39 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; + +import eu.dnetlib.dhp.schema.common.ModelConstants; + +public class Publication extends Result implements Serializable { + + // publication specific + private Journal journal; + + public Publication() { + setResulttype(ModelConstants.PUBLICATION_DEFAULT_RESULTTYPE); + } + + public Journal getJournal() { + return journal; + } + + public void setJournal(Journal journal) { + this.journal = journal; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Publication.class.isAssignableFrom(e.getClass())) { + return; + } + + Publication p = (Publication) e; + + if (p.getJournal() != null && compareTrust(this, e) < 0) + journal = p.getJournal(); + mergeOAFDataInfo(e); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Qualifier.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Qualifier.java new file mode 100644 index 0000000..87ecb55 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Qualifier.java @@ -0,0 +1,87 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class Qualifier implements Serializable { + + private String classid; + private String classname; + private String schemeid; + private String schemename; + + public String getClassid() { + return classid; + } + + public void setClassid(String classid) { + this.classid = classid; + } + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + } + + public String getSchemeid() { + return schemeid; + } + + public void setSchemeid(String schemeid) { + this.schemeid = schemeid; + } + + public String getSchemename() { + return schemename; + } + + public void setSchemename(String schemename) { + this.schemename = schemename; + } + + public String toComparableString() { + return isBlank() + ? "" + : String + .format( + "%s::%s::%s::%s", + classid != null ? classid : "", + classname != null ? classname : "", + schemeid != null ? schemeid : "", + schemename != null ? schemename : ""); + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(classid) + && StringUtils.isBlank(classname) + && StringUtils.isBlank(schemeid) + && StringUtils.isBlank(schemename); + } + + @Override + public int hashCode() { + return toComparableString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + Qualifier other = (Qualifier) obj; + + return toComparableString().equals(other.toComparableString()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java new file mode 100644 index 0000000..adfc6af --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java @@ -0,0 +1,168 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import static com.google.common.base.Preconditions.checkArgument; + +import java.text.ParseException; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import eu.dnetlib.dhp.schema.common.ModelSupport; + +/** + * Relation models any edge between two nodes in the OpenAIRE graph. It has a source id and a target id pointing to + * graph node identifiers and it is further characterised by the semantic of the link through the fields relType, + * subRelType and relClass. Provenance information is modeled according to the dataInfo element and collectedFrom, while + * individual relationship types can provide extra information via the properties field. + */ +public class Relation extends Oaf { + + /** + * Main relationship classifier, values include 'resultResult', 'resultProject', 'resultOrganization', etc. + */ + private String relType; + + /** + * Further classifies a relationship, values include 'affiliation', 'similarity', 'supplement', etc. + */ + private String subRelType; + + /** + * Indicates the direction of the relationship, values include 'isSupplementTo', 'isSupplementedBy', 'merges, + * 'isMergedIn'. + */ + private String relClass; + + /** + * The source entity id. + */ + private String source; + + /** + * The target entity id. + */ + private String target; + + /** + * Was this relationship authoritatively validated? + */ + private Boolean validated; + + /** + * When was this relationship authoritatively validated. + */ + private String validationDate; + + /** + * List of relation specific properties. Values include 'similarityLevel', indicating the similarity score between a + * pair of publications. + */ + private List properties = new ArrayList<>(); + + public String getRelType() { + return relType; + } + + public void setRelType(final String relType) { + this.relType = relType; + } + + public String getSubRelType() { + return subRelType; + } + + public void setSubRelType(final String subRelType) { + this.subRelType = subRelType; + } + + public String getRelClass() { + return relClass; + } + + public void setRelClass(final String relClass) { + this.relClass = relClass; + } + + public String getSource() { + return source; + } + + public void setSource(final String source) { + this.source = source; + } + + public String getTarget() { + return target; + } + + public void setTarget(final String target) { + this.target = target; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public Boolean getValidated() { + return Objects.nonNull(validated) && validated; + } + + public void setValidated(Boolean validated) { + this.validated = validated; + } + + public String getValidationDate() { + return validationDate; + } + + public void setValidationDate(String validationDate) { + this.validationDate = validationDate; + } + + public void mergeFrom(final Relation r) { + + 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"); + + setValidated(getValidated() || r.getValidated()); + try { + setValidationDate(ModelSupport.oldest(getValidationDate(), r.getValidationDate())); + } catch (ParseException e) { + throw new IllegalArgumentException(String + .format( + "invalid validation date format in relation [s:%s, t:%s]: %s", getSource(), getTarget(), + getValidationDate())); + } + + super.mergeFrom(r); + } + + @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); + } + + @Override + public int hashCode() { + return Objects.hash(relType, subRelType, relClass, source, target, collectedfrom); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java new file mode 100644 index 0000000..945ebad --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java @@ -0,0 +1,350 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import eu.dnetlib.dhp.schema.common.AccessRightComparator; + +public class Result extends OafEntity implements Serializable { + + private List measures; + + private List author; + + // resulttype allows subclassing results into publications | datasets | software + private Qualifier resulttype; + + // common fields + private Qualifier language; + + private List country; + + private List subject; + + private List title; + + private List relevantdate; + + private List> description; + + private Field dateofacceptance; + + private Field publisher; + + private Field embargoenddate; + + private List> source; + + private List> fulltext; // remove candidate + + private List> format; + + private List> contributor; + + private Qualifier resourcetype; + + private List> coverage; + + private Qualifier bestaccessright; + + private List context; + + private List externalReference; + + private List instance; + + public List getMeasures() { + return measures; + } + + public void setMeasures(List measures) { + this.measures = measures; + } + + public List getAuthor() { + return author; + } + + public void setAuthor(List author) { + this.author = author; + } + + public Qualifier getResulttype() { + return resulttype; + } + + public void setResulttype(Qualifier resulttype) { + this.resulttype = resulttype; + } + + public Qualifier getLanguage() { + return language; + } + + public void setLanguage(Qualifier language) { + this.language = language; + } + + public List getCountry() { + return country; + } + + public void setCountry(List country) { + this.country = country; + } + + public List getSubject() { + return subject; + } + + public void setSubject(List subject) { + this.subject = subject; + } + + public List getTitle() { + return title; + } + + public void setTitle(List title) { + this.title = title; + } + + public List getRelevantdate() { + return relevantdate; + } + + public void setRelevantdate(List relevantdate) { + this.relevantdate = relevantdate; + } + + public List> getDescription() { + return description; + } + + public void setDescription(List> description) { + this.description = description; + } + + public Field getDateofacceptance() { + return dateofacceptance; + } + + public void setDateofacceptance(Field dateofacceptance) { + this.dateofacceptance = dateofacceptance; + } + + public Field getPublisher() { + return publisher; + } + + public void setPublisher(Field publisher) { + this.publisher = publisher; + } + + public Field getEmbargoenddate() { + return embargoenddate; + } + + public void setEmbargoenddate(Field embargoenddate) { + this.embargoenddate = embargoenddate; + } + + public List> getSource() { + return source; + } + + public void setSource(List> source) { + this.source = source; + } + + public List> getFulltext() { + return fulltext; + } + + public void setFulltext(List> fulltext) { + this.fulltext = fulltext; + } + + public List> getFormat() { + return format; + } + + public void setFormat(List> format) { + this.format = format; + } + + public List> getContributor() { + return contributor; + } + + public void setContributor(List> contributor) { + this.contributor = contributor; + } + + public Qualifier getResourcetype() { + return resourcetype; + } + + public void setResourcetype(Qualifier resourcetype) { + this.resourcetype = resourcetype; + } + + public List> getCoverage() { + return coverage; + } + + public void setCoverage(List> coverage) { + this.coverage = coverage; + } + + public Qualifier getBestaccessright() { + return bestaccessright; + } + + public void setBestaccessright(Qualifier bestaccessright) { + this.bestaccessright = bestaccessright; + } + + public List getContext() { + return context; + } + + public void setContext(List context) { + this.context = context; + } + + public List getExternalReference() { + return externalReference; + } + + public void setExternalReference(List externalReference) { + this.externalReference = externalReference; + } + + public List getInstance() { + return instance; + } + + public void setInstance(List instance) { + this.instance = instance; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Result.class.isAssignableFrom(e.getClass())) { + return; + } + + Result r = (Result) e; + + measures = mergeLists(measures, r.getMeasures()); + + instance = mergeLists(instance, r.getInstance()); + + if (r.getBestaccessright() != null + && new AccessRightComparator().compare(r.getBestaccessright(), bestaccessright) < 0) + bestaccessright = r.getBestaccessright(); + + if (r.getResulttype() != null && compareTrust(this, r) < 0) + resulttype = r.getResulttype(); + + if (r.getLanguage() != null && compareTrust(this, r) < 0) + language = r.getLanguage(); + + country = mergeLists(country, r.getCountry()); + + subject = mergeLists(subject, r.getSubject()); + + // merge title lists: main title with higher trust and distinct between the others + StructuredProperty baseMainTitle = null; + if (title != null) { + baseMainTitle = getMainTitle(title); + if (baseMainTitle != null) { + final StructuredProperty p = baseMainTitle; + title = title.stream().filter(t -> t != p).collect(Collectors.toList()); + } + } + + StructuredProperty newMainTitle = null; + if (r.getTitle() != null) { + newMainTitle = getMainTitle(r.getTitle()); + if (newMainTitle != null) { + final StructuredProperty p = newMainTitle; + r.setTitle(r.getTitle().stream().filter(t -> t != p).collect(Collectors.toList())); + } + } + + if (newMainTitle != null && compareTrust(this, r) < 0) { + baseMainTitle = newMainTitle; + } + + title = mergeLists(title, r.getTitle()); + if (title != null && baseMainTitle != null) { + title.add(baseMainTitle); + } + + relevantdate = mergeLists(relevantdate, r.getRelevantdate()); + + description = longestLists(description, r.getDescription()); + + if (r.getPublisher() != null && compareTrust(this, r) < 0) + publisher = r.getPublisher(); + + if (r.getEmbargoenddate() != null && compareTrust(this, r) < 0) + embargoenddate = r.getEmbargoenddate(); + + source = mergeLists(source, r.getSource()); + + fulltext = mergeLists(fulltext, r.getFulltext()); + + format = mergeLists(format, r.getFormat()); + + contributor = mergeLists(contributor, r.getContributor()); + + if (r.getResourcetype() != null) + resourcetype = r.getResourcetype(); + + coverage = mergeLists(coverage, r.getCoverage()); + + context = mergeLists(context, r.getContext()); + + externalReference = mergeLists(externalReference, r.getExternalReference()); + } + + private List> longestLists(List> a, List> b) { + if (a == null || b == null) + return a == null ? b : a; + if (a.size() == b.size()) { + int msa = a + .stream() + .filter(i -> i != null && i.getValue() != null) + .map(i -> i.getValue().length()) + .max(Comparator.naturalOrder()) + .orElse(0); + int msb = b + .stream() + .filter(i -> i != null && i.getValue() != null) + .map(i -> i.getValue().length()) + .max(Comparator.naturalOrder()) + .orElse(0); + return msa > msb ? a : b; + } + return a.size() > b.size() ? a : b; + } + + private StructuredProperty getMainTitle(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 title : titles) { + if (title.getQualifier() != null && title.getQualifier().getClassid() != null) + if (title.getQualifier().getClassid().equals("main title")) + return title; + } + return null; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Software.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Software.java new file mode 100644 index 0000000..d25b5c9 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Software.java @@ -0,0 +1,80 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.common.ModelConstants; + +public class Software extends Result implements Serializable { + + private List> documentationUrl; + + // candidate for removal + private List license; + + // candidate for removal + private Field codeRepositoryUrl; + + private Qualifier programmingLanguage; + + public Software() { + setResulttype(ModelConstants.SOFTWARE_DEFAULT_RESULTTYPE); + } + + public List> getDocumentationUrl() { + return documentationUrl; + } + + public void setDocumentationUrl(List> documentationUrl) { + this.documentationUrl = documentationUrl; + } + + public List getLicense() { + return license; + } + + public void setLicense(List license) { + this.license = license; + } + + public Field getCodeRepositoryUrl() { + return codeRepositoryUrl; + } + + public void setCodeRepositoryUrl(Field codeRepositoryUrl) { + this.codeRepositoryUrl = codeRepositoryUrl; + } + + public Qualifier getProgrammingLanguage() { + return programmingLanguage; + } + + public void setProgrammingLanguage(Qualifier programmingLanguage) { + this.programmingLanguage = programmingLanguage; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + + if (!Software.class.isAssignableFrom(e.getClass())) { + return; + } + + final Software s = (Software) e; + documentationUrl = mergeLists(documentationUrl, s.getDocumentationUrl()); + + license = mergeLists(license, s.getLicense()); + + codeRepositoryUrl = s.getCodeRepositoryUrl() != null && compareTrust(this, s) < 0 + ? s.getCodeRepositoryUrl() + : codeRepositoryUrl; + + programmingLanguage = s.getProgrammingLanguage() != null && compareTrust(this, s) < 0 + ? s.getProgrammingLanguage() + : programmingLanguage; + + mergeOAFDataInfo(e); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java new file mode 100644 index 0000000..024b915 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java @@ -0,0 +1,72 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.Serializable; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; + +import com.google.common.base.Joiner; + +public class StructuredProperty implements Serializable { + + private String value; + + private Qualifier qualifier; + + private DataInfo dataInfo; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Qualifier getQualifier() { + return qualifier; + } + + public void setQualifier(Qualifier qualifier) { + this.qualifier = qualifier; + } + + public DataInfo getDataInfo() { + return dataInfo; + } + + public void setDataInfo(DataInfo dataInfo) { + this.dataInfo = dataInfo; + } + + public String toComparableString() { + return Stream + .of( + getQualifier().toComparableString(), + Optional.ofNullable(getValue()).map(String::toLowerCase).orElse("")) + .filter(StringUtils::isNotBlank) + .collect(Collectors.joining("||")); + } + + @Override + public int hashCode() { + return toComparableString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + StructuredProperty other = (StructuredProperty) obj; + + return toComparableString().equals(other.toComparableString()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorData.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorData.java new file mode 100644 index 0000000..6c94cdb --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorData.java @@ -0,0 +1,72 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; +import java.util.List; + +import com.google.common.collect.Lists; + +/** + * This class models the data that are retrieved from orcid publication + */ + +public class AuthorData implements Serializable { + + private String oid; + private String name; + private String surname; + private String creditName; + private String errorCode; + private List otherNames; + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public String getCreditName() { + return creditName; + } + + public void setCreditName(String creditName) { + this.creditName = creditName; + } + + public String getOid() { + return oid; + } + + public void setOid(String oid) { + this.oid = oid; + } + + public List getOtherNames() { + return otherNames; + } + + public void setOtherNames(List otherNames) { + if (this.otherNames == null) { + this.otherNames = Lists.newArrayList(); + } + this.otherNames = otherNames; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorHistory.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorHistory.java new file mode 100644 index 0000000..554aae8 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorHistory.java @@ -0,0 +1,79 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +public class AuthorHistory implements Serializable { + private String creationMethod; + private String completionDate; + private String submissionDate; + private String lastModifiedDate; + private boolean claimed; + private String deactivationDate; + private boolean verifiedEmail; + private boolean verifiedPrimaryEmail; + + public String getCreationMethod() { + return creationMethod; + } + + public void setCreationMethod(String creationMethod) { + this.creationMethod = creationMethod; + } + + public String getCompletionDate() { + return completionDate; + } + + public void setCompletionDate(String completionDate) { + this.completionDate = completionDate; + } + + public String getSubmissionDate() { + return submissionDate; + } + + public void setSubmissionDate(String submissionDate) { + this.submissionDate = submissionDate; + } + + public String getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(String lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public boolean isClaimed() { + return claimed; + } + + public void setClaimed(boolean claimed) { + this.claimed = claimed; + } + + public String getDeactivationDate() { + return deactivationDate; + } + + public void setDeactivationDate(String deactivationDate) { + this.deactivationDate = deactivationDate; + } + + public boolean isVerifiedEmail() { + return verifiedEmail; + } + + public void setVerifiedEmail(boolean verifiedEmail) { + this.verifiedEmail = verifiedEmail; + } + + public boolean isVerifiedPrimaryEmail() { + return verifiedPrimaryEmail; + } + + public void setVerifiedPrimaryEmail(boolean verifiedPrimaryEmail) { + this.verifiedPrimaryEmail = verifiedPrimaryEmail; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorSummary.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorSummary.java new file mode 100644 index 0000000..7945766 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/AuthorSummary.java @@ -0,0 +1,25 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +public class AuthorSummary extends OrcidData implements Serializable { + private AuthorData authorData; + private AuthorHistory authorHistory; + + public AuthorData getAuthorData() { + return authorData; + } + + public void setAuthorData(AuthorData authorData) { + this.authorData = authorData; + } + + public AuthorHistory getAuthorHistory() { + return authorHistory; + } + + public void setAuthorHistory(AuthorHistory authorHistory) { + this.authorHistory = authorHistory; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java new file mode 100644 index 0000000..3b543db --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java @@ -0,0 +1,58 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +import eu.dnetlib.dhp.schema.orcid.AuthorData; + +/** + * This class models the data related to a contributor, that are retrieved from an orcid publication + */ + +public class Contributor extends AuthorData implements Serializable { + private String sequence; + private String role; + private transient boolean simpleMatch; + private transient Double score; + private transient boolean bestMatch; + + public String getSequence() { + return sequence; + } + + public void setSequence(String sequence) { + this.sequence = sequence; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public boolean isSimpleMatch() { + return simpleMatch; + } + + public void setSimpleMatch(boolean simpleMatch) { + this.simpleMatch = simpleMatch; + } + + public Double getScore() { + return score; + } + + public void setScore(Double score) { + this.score = score; + } + + public boolean isBestMatch() { + return bestMatch; + } + + public void setBestMatch(boolean bestMatch) { + this.bestMatch = bestMatch; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/ExternalId.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/ExternalId.java new file mode 100644 index 0000000..d8f001a --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/ExternalId.java @@ -0,0 +1,38 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +/** + * This class models the data related to external id, that are retrieved from an orcid publication + */ + +public class ExternalId implements Serializable { + private String type; + private String value; + private String relationShip; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getRelationShip() { + return relationShip; + } + + public void setRelationShip(String relationShip) { + this.relationShip = relationShip; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/OrcidDOI.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/OrcidDOI.java new file mode 100644 index 0000000..cf372c1 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/OrcidDOI.java @@ -0,0 +1,25 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.util.List; + +public class OrcidDOI { + private String doi; + private List authors; + + public String getDoi() { + return doi; + } + + public void setDoi(String doi) { + this.doi = doi; + } + + public List getAuthors() { + return authors; + } + + public void setAuthors(List authors) { + this.authors = authors; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/OrcidData.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/OrcidData.java new file mode 100644 index 0000000..606eea6 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/OrcidData.java @@ -0,0 +1,34 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +public class OrcidData implements Serializable { + protected String base64CompressData; + protected String statusCode; + protected String downloadDate; + + public String getBase64CompressData() { + return base64CompressData; + } + + public void setBase64CompressData(String base64CompressData) { + this.base64CompressData = base64CompressData; + } + + public String getStatusCode() { + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public String getDownloadDate() { + return downloadDate; + } + + public void setDownloadDate(String downloadDate) { + this.downloadDate = downloadDate; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/PublicationDate.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/PublicationDate.java new file mode 100644 index 0000000..01972ce --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/PublicationDate.java @@ -0,0 +1,38 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +/** + * This class models the data related to a publication date, that are retrieved from an orcid publication + */ + +public class PublicationDate implements Serializable { + private String year; + private String month; + private String day; + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getMonth() { + return month; + } + + public void setMonth(String month) { + this.month = month; + } + + public String getDay() { + return day; + } + + public void setDay(String day) { + this.day = day; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/Summary.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/Summary.java new file mode 100644 index 0000000..ffebf50 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/Summary.java @@ -0,0 +1,79 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +public class Summary implements Serializable { + private String creationMethod; + private String completionDate; + private String submissionDate; + private String lastModifiedDate; + private boolean claimed; + private String deactivationDate; + private boolean verifiedEmail; + private boolean verifiedPrimaryEmail; + + public String getCreationMethod() { + return creationMethod; + } + + public void setCreationMethod(String creationMethod) { + this.creationMethod = creationMethod; + } + + public String getCompletionDate() { + return completionDate; + } + + public void setCompletionDate(String completionDate) { + this.completionDate = completionDate; + } + + public String getSubmissionDate() { + return submissionDate; + } + + public void setSubmissionDate(String submissionDate) { + this.submissionDate = submissionDate; + } + + public String getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(String lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public boolean isClaimed() { + return claimed; + } + + public void setClaimed(boolean claimed) { + this.claimed = claimed; + } + + public String getDeactivationDate() { + return deactivationDate; + } + + public void setDeactivationDate(String deactivationDate) { + this.deactivationDate = deactivationDate; + } + + public boolean isVerifiedEmail() { + return verifiedEmail; + } + + public void setVerifiedEmail(boolean verifiedEmail) { + this.verifiedEmail = verifiedEmail; + } + + public boolean isVerifiedPrimaryEmail() { + return verifiedPrimaryEmail; + } + + public void setVerifiedPrimaryEmail(boolean verifiedPrimaryEmail) { + this.verifiedPrimaryEmail = verifiedPrimaryEmail; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/Work.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/Work.java new file mode 100644 index 0000000..c557eb5 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/Work.java @@ -0,0 +1,16 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; + +public class Work extends OrcidData implements Serializable { + WorkDetail workDetail; + + public WorkDetail getWorkDetail() { + return workDetail; + } + + public void setWorkDetail(WorkDetail workDetail) { + this.workDetail = workDetail; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java new file mode 100644 index 0000000..614d415 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java @@ -0,0 +1,109 @@ + +package eu.dnetlib.dhp.schema.orcid; + +import java.io.Serializable; +import java.util.List; + +import eu.dnetlib.dhp.schema.orcid.Contributor; +import eu.dnetlib.dhp.schema.orcid.ExternalId; +import eu.dnetlib.dhp.schema.orcid.OrcidData; +import eu.dnetlib.dhp.schema.orcid.PublicationDate; + +/** + * This class models the data that are retrieved from orcid publication + */ + +public class WorkDetail implements Serializable { + + private String oid; + private String id; + private String sourceName; + private String type; + private List titles; + private List urls; + List extIds; + List publicationDates; + List contributors; + + public String getOid() { + return oid; + } + + public void setOid(String oid) { + this.oid = oid; + } + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + private String errorCode; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getTitles() { + return titles; + } + + public void setTitles(List titles) { + this.titles = titles; + } + + public String getSourceName() { + return sourceName; + } + + public void setSourceName(String sourceName) { + this.sourceName = sourceName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public List getExtIds() { + return extIds; + } + + public void setExtIds(List extIds) { + this.extIds = extIds; + } + + public List getPublicationDates() { + return publicationDates; + } + + public void setPublicationDates(List publicationDates) { + this.publicationDates = publicationDates; + } + + public List getContributors() { + return contributors; + } + + public void setContributors(List contributors) { + this.contributors = contributors; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIDataset.java b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIDataset.java new file mode 100644 index 0000000..421b4ec --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIDataset.java @@ -0,0 +1,89 @@ + +package eu.dnetlib.dhp.schema.scholexplorer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; + +import eu.dnetlib.dhp.schema.oaf.Dataset; +import eu.dnetlib.dhp.schema.oaf.OafEntity; + +public class DLIDataset extends Dataset { + + private String originalObjIdentifier; + + private List dlicollectedfrom; + + private String completionStatus; + + public String getCompletionStatus() { + return completionStatus; + } + + public void setCompletionStatus(String completionStatus) { + this.completionStatus = completionStatus; + } + + public List getDlicollectedfrom() { + return dlicollectedfrom; + } + + public void setDlicollectedfrom(List dlicollectedfrom) { + this.dlicollectedfrom = dlicollectedfrom; + } + + public String getOriginalObjIdentifier() { + return originalObjIdentifier; + } + + public void setOriginalObjIdentifier(String originalObjIdentifier) { + this.originalObjIdentifier = originalObjIdentifier; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + DLIDataset p = (DLIDataset) e; + if (StringUtils.isBlank(completionStatus) && StringUtils.isNotBlank(p.completionStatus)) + completionStatus = p.completionStatus; + if ("complete".equalsIgnoreCase(p.completionStatus)) + completionStatus = "complete"; + dlicollectedfrom = mergeProvenance(dlicollectedfrom, p.getDlicollectedfrom()); + } + + private List mergeProvenance( + final List a, final List b) { + Map result = new HashMap<>(); + if (a != null) + a + .forEach( + p -> { + if (p != null && StringUtils.isNotBlank(p.getId()) && result.containsKey(p.getId())) { + if ("incomplete".equalsIgnoreCase(result.get(p.getId()).getCompletionStatus()) + && StringUtils.isNotBlank(p.getCompletionStatus())) { + result.put(p.getId(), p); + } + + } else if (p != null && p.getId() != null && !result.containsKey(p.getId())) + result.put(p.getId(), p); + }); + if (b != null) + b + .forEach( + p -> { + if (p != null && StringUtils.isNotBlank(p.getId()) && result.containsKey(p.getId())) { + if ("incomplete".equalsIgnoreCase(result.get(p.getId()).getCompletionStatus()) + && StringUtils.isNotBlank(p.getCompletionStatus())) { + result.put(p.getId(), p); + } + + } else if (p != null && p.getId() != null && !result.containsKey(p.getId())) + result.put(p.getId(), p); + }); + + return new ArrayList<>(result.values()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIPublication.java b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIPublication.java new file mode 100644 index 0000000..c899a89 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIPublication.java @@ -0,0 +1,87 @@ + +package eu.dnetlib.dhp.schema.scholexplorer; + +import java.io.Serializable; +import java.util.*; + +import org.apache.commons.lang3.StringUtils; + +import eu.dnetlib.dhp.schema.oaf.OafEntity; +import eu.dnetlib.dhp.schema.oaf.Publication; + +public class DLIPublication extends Publication implements Serializable { + + private String originalObjIdentifier; + + private List dlicollectedfrom; + + private String completionStatus; + + public String getCompletionStatus() { + return completionStatus; + } + + public void setCompletionStatus(String completionStatus) { + this.completionStatus = completionStatus; + } + + public List getDlicollectedfrom() { + return dlicollectedfrom; + } + + public void setDlicollectedfrom(List dlicollectedfrom) { + this.dlicollectedfrom = dlicollectedfrom; + } + + public String getOriginalObjIdentifier() { + return originalObjIdentifier; + } + + public void setOriginalObjIdentifier(String originalObjIdentifier) { + this.originalObjIdentifier = originalObjIdentifier; + } + + @Override + public void mergeFrom(OafEntity e) { + super.mergeFrom(e); + DLIPublication p = (DLIPublication) e; + if (StringUtils.isBlank(completionStatus) && StringUtils.isNotBlank(p.completionStatus)) + completionStatus = p.completionStatus; + if ("complete".equalsIgnoreCase(p.completionStatus)) + completionStatus = "complete"; + dlicollectedfrom = mergeProvenance(dlicollectedfrom, p.getDlicollectedfrom()); + } + + private List mergeProvenance( + final List a, final List b) { + Map result = new HashMap<>(); + if (a != null) + a + .forEach( + p -> { + if (p != null && StringUtils.isNotBlank(p.getId()) && result.containsKey(p.getId())) { + if ("incomplete".equalsIgnoreCase(result.get(p.getId()).getCompletionStatus()) + && StringUtils.isNotBlank(p.getCompletionStatus())) { + result.put(p.getId(), p); + } + + } else if (p != null && p.getId() != null && !result.containsKey(p.getId())) + result.put(p.getId(), p); + }); + if (b != null) + b + .forEach( + p -> { + if (p != null && StringUtils.isNotBlank(p.getId()) && result.containsKey(p.getId())) { + if ("incomplete".equalsIgnoreCase(result.get(p.getId()).getCompletionStatus()) + && StringUtils.isNotBlank(p.getCompletionStatus())) { + result.put(p.getId(), p); + } + + } else if (p != null && p.getId() != null && !result.containsKey(p.getId())) + result.put(p.getId(), p); + }); + + return new ArrayList<>(result.values()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIUnknown.java b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIUnknown.java new file mode 100644 index 0000000..5da5994 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/DLIUnknown.java @@ -0,0 +1,132 @@ + +package eu.dnetlib.dhp.schema.scholexplorer; + +import java.io.Serializable; +import java.util.*; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; + +import eu.dnetlib.dhp.schema.oaf.Oaf; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; + +public class DLIUnknown extends Oaf implements Serializable { + + private String id; + + private List pid; + + private String dateofcollection; + + private String dateoftransformation; + + private List dlicollectedfrom; + + private String completionStatus = "incomplete"; + + public String getCompletionStatus() { + return completionStatus; + } + + public void setCompletionStatus(String completionStatus) { + this.completionStatus = completionStatus; + } + + public List getDlicollectedfrom() { + return dlicollectedfrom; + } + + public void setDlicollectedfrom(List dlicollectedfrom) { + this.dlicollectedfrom = dlicollectedfrom; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public String getDateofcollection() { + return dateofcollection; + } + + public void setDateofcollection(String dateofcollection) { + this.dateofcollection = dateofcollection; + } + + public String getDateoftransformation() { + return dateoftransformation; + } + + public void setDateoftransformation(String dateoftransformation) { + this.dateoftransformation = dateoftransformation; + } + + public void mergeFrom(DLIUnknown p) { + if ("complete".equalsIgnoreCase(p.completionStatus)) + completionStatus = "complete"; + dlicollectedfrom = mergeProvenance(dlicollectedfrom, p.getDlicollectedfrom()); + if (StringUtils.isEmpty(id) && StringUtils.isNoneEmpty(p.getId())) + id = p.getId(); + if (StringUtils.isEmpty(dateofcollection) && StringUtils.isNoneEmpty(p.getDateofcollection())) + dateofcollection = p.getDateofcollection(); + + if (StringUtils.isEmpty(dateoftransformation) && StringUtils.isNoneEmpty(p.getDateoftransformation())) + dateofcollection = p.getDateoftransformation(); + pid = mergeLists(pid, p.getPid()); + } + + protected List mergeLists(final List... lists) { + + return Arrays + .stream(lists) + .filter(Objects::nonNull) + .flatMap(List::stream) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + private List mergeProvenance( + final List a, final List b) { + Map result = new HashMap<>(); + if (a != null) + a + .forEach( + p -> { + if (p != null && StringUtils.isNotBlank(p.getId()) && result.containsKey(p.getId())) { + if ("incomplete".equalsIgnoreCase(result.get(p.getId()).getCompletionStatus()) + && StringUtils.isNotBlank(p.getCompletionStatus())) { + result.put(p.getId(), p); + } + + } else if (p != null && p.getId() != null && !result.containsKey(p.getId())) + result.put(p.getId(), p); + }); + if (b != null) + b + .forEach( + p -> { + if (p != null && StringUtils.isNotBlank(p.getId()) && result.containsKey(p.getId())) { + if ("incomplete".equalsIgnoreCase(result.get(p.getId()).getCompletionStatus()) + && StringUtils.isNotBlank(p.getCompletionStatus())) { + result.put(p.getId(), p); + } + + } else if (p != null && p.getId() != null && !result.containsKey(p.getId())) + result.put(p.getId(), p); + }); + + return new ArrayList<>(result.values()); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/OafUtils.scala b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/OafUtils.scala new file mode 100644 index 0000000..b0cd344 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/OafUtils.scala @@ -0,0 +1,100 @@ +package eu.dnetlib.dhp.schema.scholexplorer + +import eu.dnetlib.dhp.schema.common.ModelConstants +import eu.dnetlib.dhp.schema.oaf.{AccessRight, DataInfo, Field, KeyValue, Qualifier, StructuredProperty} + +object OafUtils { + + + + def generateKeyValue(key: String, value: String): KeyValue = { + val kv: KeyValue = new KeyValue() + kv.setKey(key) + kv.setValue(value) + kv.setDataInfo(generateDataInfo("0.9")) + kv + } + + + def generateDataInfo(trust: String = "0.9", invisible: Boolean = false): DataInfo = { + val di = new DataInfo + di.setDeletedbyinference(false) + di.setInferred(false) + di.setInvisible(invisible) + di.setTrust(trust) + di.setProvenanceaction(createQualifier(ModelConstants.SYSIMPORT_ACTIONSET, ModelConstants.DNET_PROVENANCE_ACTIONS)) + di + } + + def createQualifier(cls: String, sch: String): Qualifier = { + createQualifier(cls, cls, sch, sch) + } + + + def createQualifier(classId: String, className: String, schemeId: String, schemeName: String): Qualifier = { + val q: Qualifier = new Qualifier + q.setClassid(classId) + q.setClassname(className) + q.setSchemeid(schemeId) + q.setSchemename(schemeName) + q + } + + def createAccessRight(classId: String, className: String, schemeId: String, schemeName: String): AccessRight = { + val accessRight: AccessRight = new AccessRight + accessRight.setClassid(classId) + accessRight.setClassname(className) + accessRight.setSchemeid(schemeId) + accessRight.setSchemename(schemeName) + accessRight + } + + + def asField[T](value: T): Field[T] = { + val tmp = new Field[T] + tmp.setValue(value) + tmp + + + } + + def createSP(value: String, classId: String,className:String, schemeId: String, schemeName:String): StructuredProperty = { + val sp = new StructuredProperty + sp.setQualifier(createQualifier(classId,className, schemeId, schemeName)) + sp.setValue(value) + sp + + } + + + + def createSP(value: String, classId: String,className:String, schemeId: String, schemeName:String, dataInfo: DataInfo): StructuredProperty = { + val sp = new StructuredProperty + sp.setQualifier(createQualifier(classId,className, schemeId, schemeName)) + sp.setValue(value) + sp.setDataInfo(dataInfo) + sp + + } + + def createSP(value: String, classId: String, schemeId: String): StructuredProperty = { + val sp = new StructuredProperty + sp.setQualifier(createQualifier(classId, schemeId)) + sp.setValue(value) + sp + + } + + + + def createSP(value: String, classId: String, schemeId: String, dataInfo: DataInfo): StructuredProperty = { + val sp = new StructuredProperty + sp.setQualifier(createQualifier(classId, schemeId)) + sp.setValue(value) + sp.setDataInfo(dataInfo) + sp + + } + + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/ProvenaceInfo.java b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/ProvenaceInfo.java new file mode 100644 index 0000000..b1188f0 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/scholexplorer/ProvenaceInfo.java @@ -0,0 +1,47 @@ + +package eu.dnetlib.dhp.schema.scholexplorer; + +import java.io.Serializable; + +public class ProvenaceInfo implements Serializable { + + private String id; + + private String name; + + private String completionStatus; + + private String collectionMode = "collected"; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCompletionStatus() { + return completionStatus; + } + + public void setCompletionStatus(String completionStatus) { + this.completionStatus = completionStatus; + } + + public String getCollectionMode() { + return collectionMode; + } + + public void setCollectionMode(String collectionMode) { + this.collectionMode = collectionMode; + } +} diff --git a/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java b/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java new file mode 100644 index 0000000..9818d03 --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java @@ -0,0 +1,41 @@ + +package eu.dnetlib.dhp.schema.action; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.IOException; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import eu.dnetlib.dhp.schema.common.ModelConstants; +import eu.dnetlib.dhp.schema.oaf.Relation; + +/** @author claudio.atzori */ +public class AtomicActionTest { + + @Test + public void serializationTest() throws IOException { + + Relation rel = new Relation(); + rel.setSource("1"); + rel.setTarget("2"); + rel.setRelType(ModelConstants.RESULT_RESULT); + rel.setSubRelType(ModelConstants.DEDUP); + rel.setRelClass(ModelConstants.MERGES); + + AtomicAction aa1 = new AtomicAction(Relation.class, rel); + + final ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(aa1); + + assertTrue(StringUtils.isNotBlank(json)); + + AtomicAction aa2 = mapper.readValue(json, AtomicAction.class); + + assertEquals(aa1.getClazz(), aa2.getClazz()); + assertEquals(aa1.getPayload(), aa2.getPayload()); + } +} diff --git a/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java b/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java new file mode 100644 index 0000000..73e8c47 --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java @@ -0,0 +1,37 @@ + +package eu.dnetlib.dhp.schema.common; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import eu.dnetlib.dhp.schema.oaf.OafEntity; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.dhp.schema.oaf.Result; + +public class ModelSupportTest { + + @Nested + class IsSubClass { + + @Test + public void shouldReturnFalseWhenSubClassDoesNotExtendSuperClass() { + // when + Boolean result = ModelSupport.isSubClass(Relation.class, OafEntity.class); + + // then + assertFalse(result); + } + + @Test + public void shouldReturnTrueWhenSubClassExtendsSuperClass() { + // when + Boolean result = ModelSupport.isSubClass(Result.class, OafEntity.class); + + // then + assertTrue(result); + } + } +} diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java new file mode 100644 index 0000000..26b4407 --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java @@ -0,0 +1,57 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import java.io.IOException; +import java.util.List; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; + +public class MeasureTest { + + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() + .setSerializationInclusion(JsonInclude.Include.NON_NULL); + + @Test + public void testMeasureSerialization() throws IOException { + + Measure popularity = new Measure(); + popularity.setId("popularity"); + popularity + .setUnit( + Lists + .newArrayList( + unit("score", "0.5"))); + + Measure influence = new Measure(); + influence.setId("influence"); + influence + .setUnit( + Lists + .newArrayList( + unit("score", "0.3"))); + + List m = Lists.newArrayList(popularity, influence); + + String s = OBJECT_MAPPER.writeValueAsString(m); + System.out.println(s); + + List mm = OBJECT_MAPPER.readValue(s, new TypeReference>() { + }); + + Assertions.assertNotNull(mm); + } + + private KeyValue unit(String key, String value) { + KeyValue unit = new KeyValue(); + unit.setKey(key); + unit.setValue(value); + return unit; + } + +} diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java new file mode 100644 index 0000000..98baa1e --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java @@ -0,0 +1,139 @@ + +package eu.dnetlib.dhp.schema.oaf; + +import static org.junit.jupiter.api.Assertions.*; + +import java.time.format.DateTimeParseException; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class MergeTest { + + OafEntity oaf; + + @BeforeEach + public void setUp() { + oaf = new Publication(); + } + + @Test + public void mergeListsTest() { + + // string list merge test + List a = Arrays.asList("a", "b", "c", "e"); + List b = Arrays.asList("a", "b", "c", "d"); + List c = null; + + System.out.println("merge result 1 = " + oaf.mergeLists(a, b)); + + System.out.println("merge result 2 = " + oaf.mergeLists(a, c)); + + System.out.println("merge result 3 = " + oaf.mergeLists(c, c)); + } + + @Test + public void mergePublicationCollectedFromTest() { + + Publication a = new Publication(); + Publication b = new Publication(); + + a.setCollectedfrom(Arrays.asList(setKV("a", "open"), setKV("b", "closed"))); + b.setCollectedfrom(Arrays.asList(setKV("A", "open"), setKV("b", "Open"))); + + a.mergeFrom(b); + + assertNotNull(a.getCollectedfrom()); + assertEquals(3, a.getCollectedfrom().size()); + } + + @Test + public void mergePublicationSubjectTest() { + + Publication a = new Publication(); + Publication b = new Publication(); + + 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); + + assertNotNull(a.getSubject()); + assertEquals(3, a.getSubject().size()); + } + + @Test + public void mergeRelationTest() { + + Relation a = createRel(null, null); + Relation b = createRel(null, null); + a.mergeFrom(b); + assertEquals(a, b); + + a = createRel(true, null); + b = createRel(null, null); + a.mergeFrom(b); + assertEquals(true, a.getValidated()); + + a = createRel(true, null); + b = createRel(false, null); + a.mergeFrom(b); + assertEquals(true, a.getValidated()); + + a = createRel(true, null); + b = createRel(true, "2016-04-05T12:41:19.202Z"); + a.mergeFrom(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); + assertEquals("2016-04-05T12:41:19.202Z", a.getValidationDate()); + } + + @Test + public void mergeRelationTestParseException() { + assertThrows(DateTimeParseException.class, () -> { + Relation a = createRel(true, "2016-04-05"); + Relation b = createRel(true, "2016-04-05"); + a.mergeFrom(b); + }); + } + + private Relation createRel(Boolean validated, String validationDate) { + Relation rel = new Relation(); + rel.setSource("1"); + rel.setTarget("2"); + rel.setRelType("reltype"); + rel.setSubRelType("subreltype"); + rel.setRelClass("relclass"); + rel.setValidated(validated); + rel.setValidationDate(validationDate); + return rel; + } + + private KeyValue setKV(final String key, final String value) { + + KeyValue k = new KeyValue(); + + k.setKey(key); + k.setValue(value); + + return k; + } + + private StructuredProperty setSP( + final String value, final String schema, final String classname) { + StructuredProperty s = new StructuredProperty(); + s.setValue(value); + Qualifier q = new Qualifier(); + q.setClassname(classname); + q.setClassid(classname); + q.setSchemename(schema); + q.setSchemeid(schema); + s.setQualifier(q); + return s; + } +} diff --git a/src/test/java/eu/dnetlib/dhp/schema/scholexplorer/DLItest.java b/src/test/java/eu/dnetlib/dhp/schema/scholexplorer/DLItest.java new file mode 100644 index 0000000..16ce152 --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/scholexplorer/DLItest.java @@ -0,0 +1,84 @@ + +package eu.dnetlib.dhp.schema.scholexplorer; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +import eu.dnetlib.dhp.schema.common.ModelConstants; +import eu.dnetlib.dhp.schema.oaf.Qualifier; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; + +public class DLItest { + + @Test + public void testMergePublication() throws JsonProcessingException { + DLIPublication a1 = new DLIPublication(); + a1.setPid(Arrays.asList(createSP("123456", "pdb", ModelConstants.DNET_PID_TYPES))); + a1.setTitle(Collections.singletonList(createSP("Un Titolo", "title", "dnetTitle"))); + a1.setDlicollectedfrom(Arrays.asList(createCollectedFrom("znd", "Zenodo", "complete"))); + a1.setCompletionStatus("complete"); + + DLIPublication a = new DLIPublication(); + a + .setPid( + Arrays + .asList( + createSP("10.11", "doi", ModelConstants.DNET_PID_TYPES), + createSP("123456", "pdb", ModelConstants.DNET_PID_TYPES))); + a.setTitle(Collections.singletonList(createSP("A Title", "title", "dnetTitle"))); + a + .setDlicollectedfrom( + Arrays + .asList( + createCollectedFrom("dct", "datacite", "complete"), + createCollectedFrom("dct", "datacite", "incomplete"))); + a.setCompletionStatus("incomplete"); + + a.mergeFrom(a1); + + ObjectMapper mapper = new ObjectMapper(); + System.out.println(mapper.writeValueAsString(a)); + } + + @Test + public void testDeserialization() throws IOException { + + final String json = "{\"dataInfo\":{\"invisible\":false,\"inferred\":null,\"deletedbyinference\":false,\"trust\":\"0.9\",\"inferenceprovenance\":null,\"provenanceaction\":null},\"lastupdatetimestamp\":null,\"id\":\"60|bd9352547098929a394655ad1a44a479\",\"originalId\":[\"bd9352547098929a394655ad1a44a479\"],\"collectedfrom\":[{\"key\":\"dli_________::datacite\",\"value\":\"Datasets in Datacite\",\"dataInfo\":null,\"blank\":false}],\"pid\":[{\"value\":\"10.7925/DRS1.DUCHAS_5078760\",\"qualifier\":{\"classid\":\"doi\",\"classname\":\"doi\",\"schemeid\":\"dnet:pid_types\",\"schemename\":\"dnet:pid_types\",\"blank\":false},\"dataInfo\":null}],\"dateofcollection\":\"2020-01-09T08:29:31.885Z\",\"dateoftransformation\":null,\"extraInfo\":null,\"oaiprovenance\":null,\"author\":[{\"fullname\":\"Cathail, S. Ó\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null},{\"fullname\":\"Donnell, Breda Mc\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null},{\"fullname\":\"Ireland. Department of Arts, Culture, and the Gaeltacht\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null},{\"fullname\":\"University College Dublin\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null},{\"fullname\":\"National Folklore Foundation\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null},{\"fullname\":\"Cathail, S. Ó\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null},{\"fullname\":\"Donnell, Breda Mc\",\"name\":null,\"surname\":null,\"rank\":null,\"pid\":null,\"affiliation\":null}],\"resulttype\":null,\"language\":null,\"country\":null,\"subject\":[{\"value\":\"Recreation\",\"qualifier\":{\"classid\":\"dnet:subject\",\"classname\":\"dnet:subject\",\"schemeid\":\"unknown\",\"schemename\":\"unknown\",\"blank\":false},\"dataInfo\":null},{\"value\":\"Entertainments and recreational activities\",\"qualifier\":{\"classid\":\"dnet:subject\",\"classname\":\"dnet:subject\",\"schemeid\":\"unknown\",\"schemename\":\"unknown\",\"blank\":false},\"dataInfo\":null},{\"value\":\"Siamsaíocht agus caitheamh aimsire\",\"qualifier\":{\"classid\":\"dnet:subject\",\"classname\":\"dnet:subject\",\"schemeid\":\"unknown\",\"schemename\":\"unknown\",\"blank\":false},\"dataInfo\":null}],\"title\":[{\"value\":\"Games We Play\",\"qualifier\":null,\"dataInfo\":null}],\"relevantdate\":[{\"value\":\"1938-09-28\",\"qualifier\":{\"classid\":\"date\",\"classname\":\"date\",\"schemeid\":\"dnet::date\",\"schemename\":\"dnet::date\",\"blank\":false},\"dataInfo\":null}],\"description\":[{\"value\":\"Story collected by Breda Mc Donnell, a student at Tenure school (Tinure, Co. Louth) (no informant identified).\",\"dataInfo\":null}],\"dateofacceptance\":null,\"publisher\":{\"value\":\"University College Dublin\",\"dataInfo\":null},\"embargoenddate\":null,\"source\":null,\"fulltext\":null,\"format\":null,\"contributor\":null,\"resourcetype\":null,\"coverage\":null,\"refereed\":null,\"context\":null,\"processingchargeamount\":null,\"processingchargecurrency\":null,\"externalReference\":null,\"instance\":[],\"storagedate\":null,\"device\":null,\"size\":null,\"version\":null,\"lastmetadataupdate\":null,\"metadataversionnumber\":null,\"geolocation\":null,\"dlicollectedfrom\":[{\"id\":\"dli_________::datacite\",\"name\":\"Datasets in Datacite\",\"completionStatus\":\"complete\",\"collectionMode\":\"resolved\"}],\"completionStatus\":\"complete\"}"; + + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + DLIDataset dliDataset = mapper.readValue(json, DLIDataset.class); + mapper.enable(SerializationFeature.INDENT_OUTPUT); + System.out.println(mapper.writeValueAsString(dliDataset)); + } + + private ProvenaceInfo createCollectedFrom( + final String id, final String name, final String completionStatus) { + ProvenaceInfo p = new ProvenaceInfo(); + p.setId(id); + p.setName(name); + p.setCompletionStatus(completionStatus); + return p; + } + + private StructuredProperty createSP( + final String value, final String className, final String schemeName) { + StructuredProperty p = new StructuredProperty(); + p.setValue(value); + Qualifier schema = new Qualifier(); + schema.setClassname(className); + schema.setClassid(className); + schema.setSchemename(schemeName); + schema.setSchemeid(schemeName); + p.setQualifier(schema); + return p; + } +}