From de454d03b712d4de15fbd83bec7c6ab0f51e3e8a Mon Sep 17 00:00:00 2001 From: juancorr Date: Fri, 5 Dec 2025 15:07:54 +0100 Subject: [PATCH 1/2] Adding DCAT and Schema.org repository description to the Dataverse homepage --- .../harvard/iq/dataverse/DataversePage.java | 459 ++++++++++++++++++ .../settings/SettingsServiceBean.java | 24 +- src/main/webapp/dataverse.xhtml | 8 + .../resources/json/.well-known/api-catalog | 120 +++++ 4 files changed, 610 insertions(+), 1 deletion(-) create mode 100644 src/main/webapp/resources/json/.well-known/api-catalog diff --git a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java index 70a1d7b14bb..ba769b3ebe9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java @@ -4,6 +4,7 @@ import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.branding.BrandingUtil; import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.dataset.DatasetUtil; import edu.harvard.iq.dataverse.dataverse.DataverseUtil; @@ -56,6 +57,12 @@ import jakarta.ejb.EJBException; import jakarta.faces.event.ValueChangeEvent; import jakarta.faces.model.SelectItem; +import jakarta.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.primefaces.PrimeFaces; @@ -278,6 +285,458 @@ public void updateSelectedLinkingDV(ValueChangeEvent event) { linkingDataverseId = (Long) event.getNewValue(); } + public String getSchemaOrgDcatJson () { + String repositoryURL = SystemConfig.getDataverseSiteUrlStatic(); + String repositoryName = BrandingUtil.getInstallationBrandName(); + String repositoryContact= settingsWrapper.getSupportTeamEmail(); + String description = settingsWrapper.get(":dcat_repositoryDescription"); + String language = settingsWrapper.get(":dcat_repository_language"); + String country = settingsWrapper.get(":dcat_repository_country"); + String reserarchArea = settingsWrapper.get(":dcat_repository_research_area"); + String prev_policy = settingsWrapper.get(":dcat_repository_prev_policy"); + String terms = settingsWrapper.get(":dcat_repository_terms"); + String license = settingsWrapper.get(":dcat_repository_license"); + String orgName = settingsWrapper.get(":dcat_repository_org_name"); + String access_terms = settingsWrapper.get(":dcat_repository_access_terms"); + String certification = settingsWrapper.get(":dcat_repository_certification"); + JsonObject oaiSchJson = JsonObject.EMPTY_JSON_OBJECT; + JsonObject siteMapSchJson = JsonObject.EMPTY_JSON_OBJECT; + JsonObject oaiDcatJson = JsonObject.EMPTY_JSON_OBJECT; + JsonObject licenseDcatJson = JsonObject.EMPTY_JSON_OBJECT; + JsonObject termsDcatJson = JsonObject.EMPTY_JSON_OBJECT; + JsonObject preservDcatJson = JsonObject.EMPTY_JSON_OBJECT; + JsonObject siteMapDcatJson = JsonObject.EMPTY_JSON_OBJECT; + + + if (systemConfig.isOAIServerEnabled ()) { + JsonObjectBuilder oaiBuilder= Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/oai") + .add("schema:documentation", "https://www.openarchives.org/OAI/2.0/guidelines-static-repository.htm")); + oaiSchJson= oaiBuilder.build(); + } + try { + URL url = new URL(repositoryURL + "/sitemap/sitemap.xml"); + HttpURLConnection huc = (HttpURLConnection) url.openConnection(); + int responseCode = huc.getResponseCode(); + if (responseCode== 200) { + JsonObjectBuilder siteMapBuilder= Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/sitemap.xml") + .add("schema:documentation", "https://www.sitemaps.org/protocol.html")); + siteMapSchJson= siteMapBuilder.build(); + } + } catch (IOException iOException) { + // Nothing to do + } + + JsonObjectBuilder builder = Json.createObjectBuilder() + .add("@context", Json.createObjectBuilder() + .add("dcat", "http://www.w3.org/ns/dcat#") + .add("dct", "http://purl.org/dc/terms/") + .add("foaf", "http://xmlns.com/foaf/0.1/") + .add("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#") + .add("rdfs", "http://www.w3.org/2000/01/rdf-schema#") + .add("schema", "http://schema.org/") + .add("vcard", "http://www.w3.org/2006/vcard/ns#") + .add("xsd", "http://www.w3.org/2001/XMLSchema#") + .add("dqv", "http://www.w3.org/ns/dqv#") + .add("oa", "http://www.w3.org/ns/oa#") + .add("premis", "http://www.loc.gov/premis/rdf/v3/")) + .add("@type", Json.createArrayBuilder() + .add("dcat:Catalog") + .add("foaf:Project") + .add("schema:DataCatalog") + .add("schema:Project")); + if (!StringUtils.isEmpty(repositoryURL)) { + builder= builder + .add("@id",repositoryURL) + .add("foaf:homepage", repositoryURL) + .add("dct:identifier", repositoryURL) + .add("schema:url",repositoryURL); + } + if (!StringUtils.isEmpty(repositoryName)) { + builder= builder + .add("foaf:name", repositoryName) + .add("dct:title", repositoryName); + } + if (!StringUtils.isEmpty(description)) { + builder= builder + .add("dct:description", description); + } + if (!StringUtils.isEmpty(repositoryContact)) { + builder= builder + .add("dcat:contactPoint", repositoryContact); + } + if (!StringUtils.isEmpty(reserarchArea)) { + builder= builder + .add("dcat:theme", Json.createArrayBuilder() + .add(reserarchArea)); + } + if (!StringUtils.isEmpty(access_terms)) { + builder= builder + .add("dct:accessRights", access_terms); + } + if (!StringUtils.isEmpty(license)) { + builder= builder + .add("dct:license", license); + JsonObjectBuilder licBuilder= Json.createObjectBuilder() + .add("@type", "dct:Policy") + .add("@id", license); + licenseDcatJson= licBuilder.build(); + } + if (!StringUtils.isEmpty(certification) && !StringUtils.isEmpty(repositoryURL) ) { + String [] certificationParts= certification.split("\\|"); + if (certificationParts[0].equals("CoreTrustSeal")) { + builder= builder + .add("dqv:hasQualityAnnotation", Json.createObjectBuilder() + .add("@type", "dqv:QualityCertificate") + .add("oa:hasTarget", repositoryURL) + .add("oa:hasBody", "https://amt.coretrustseal.org/certificates") + .add("oa:motivatedBy", "dqv:qualityAssessment") + .add("dct:creator", "CoreTrustSeal")); + } + } + if (systemConfig.isOAIServerEnabled ()) { + JsonObjectBuilder oaiBuilder= Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "oai") + .add("dct:conformsTo", "https://www.openarchives.org/OAI/2.0/guidelines-static-repository.htm"); + oaiDcatJson= oaiBuilder.build(); + } + if (!StringUtils.isEmpty(terms)) { + JsonObjectBuilder termsBuilder= Json.createObjectBuilder() + .add("@type", "dct:accrualPolicy") + .add("@id", terms); + termsDcatJson= termsBuilder.build(); + } + if (!StringUtils.isEmpty(prev_policy)) { + JsonObjectBuilder preservBuilder= Json.createObjectBuilder() + .add("@type", "premis:PreservationPolicy") + .add("@id", prev_policy) + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-preservation-policy"); + preservDcatJson= preservBuilder.build(); + } + if (!StringUtils.isEmpty(repositoryName)) { + builder= builder + .add("schema:name",repositoryName); + } + if (!StringUtils.isEmpty(description)) { + builder= builder + .add("schema:description",description); + } + if (!StringUtils.isEmpty(repositoryContact)) { + builder= builder + .add("schema:contactPoint",repositoryContact); + } + if (!StringUtils.isEmpty(reserarchArea)) { + builder= builder + .add("schema:keywords", Json.createArrayBuilder() + .add(reserarchArea)); + } + if (!StringUtils.isEmpty(access_terms)) { + builder= builder + .add("schema:conditionsOfAccess", access_terms); + } + if (!StringUtils.isEmpty(license)) { + builder= builder + .add("schema:license", license); + } + if (!StringUtils.isEmpty(certification)) { + String [] certificationParts= certification.split("\\|"); + if (certificationParts.length== 3 && certificationParts[0].equals("CoreTrustSeal")) + builder= builder + .add("schema:hasCertification", Json.createObjectBuilder() + .add("@type", "schema:Certification") + .add("schema:url", "https://amt.coretrustseal.org/certificates") + .add("schema:certificationStatus", "schema:CertificationActive") + .add("schema:issuedBy", Json.createObjectBuilder() + .add("@type", "schema:Organization") + .add("schema:name", "CoreTrustSeal") + .add("schema:url", "https://www.coretrustseal.org")) + .add("schema:auditDate", "2023-04-18") + .add("schema:expires", "2026-04-17")); + } + if (!StringUtils.isEmpty(terms) && !StringUtils.isEmpty(prev_policy)) { + builder=builder + .add("schema:publishingPrinciples", Json.createArrayBuilder() + .add(Json.createObjectBuilder() + .add("@type", "schema:CreativeWork") + .add("schema:url", terms) + .add("schema:additionalType", "dct:Policy")) + .add(Json.createObjectBuilder() + .add("@type", "schema:CreativeWork") + .add("schema:url", prev_policy) + .add("schema:additionalType", "premis:PreservationPolicy"))); + } else if (!StringUtils.isEmpty(terms)) { + builder=builder + .add("schema:publishingPrinciples", Json.createArrayBuilder() + .add(Json.createObjectBuilder() + .add("@type", "schema:CreativeWork") + .add("schema:url", terms) + .add("schema:additionalType", "dct:Policy"))); + } else if (!StringUtils.isEmpty(prev_policy)) { + builder=builder + .add("schema:publishingPrinciples", Json.createArrayBuilder() + .add(Json.createObjectBuilder() + .add("@type", "schema:CreativeWork") + .add("schema:url", prev_policy) + .add("schema:additionalType", "premis:PreservationPolicy"))); + } + if (!StringUtils.isEmpty(orgName) && !StringUtils.isEmpty(country)) { + builder= builder + .add("schema:publisher", Json.createObjectBuilder() + .add("@type", "schema:Organization") + .add("schema:name", orgName) + .add("schema:address", Json.createObjectBuilder() + .add("@type", "schema:PostalAddress") + .add("schema:addressCountry", country))); + } + if (!StringUtils.isEmpty(language)) { + builder= builder + .add("schema:inLanguage", language); + } + builder= builder + .add("dct:conformsTo", Json.createArrayBuilder() + .add(termsDcatJson) + .add(licenseDcatJson) + .add(preservDcatJson) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "http://www.dcc.ac.uk/resources/metadata-standards/dcat-data-catalog-vocabulary") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://www.dcc.ac.uk/resources/metadata-standards/oai-ore-open-archives-initiative-object-reuse-and-exchange") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://www.dcc.ac.uk/resources/metadata-standards/datacite-metadata-schema") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://guidelines.openaire.eu/en/latest/data/use_of_datacite.html") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://json-ld.org") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://www.dcc.ac.uk/resources/metadata-standards/ddi-data-documentation-initiative") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://www.dublincore.org/specifications/dublin-core/dcmi-terms") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://ddialliance.org/Specification/DDI-Codebook/2.5/") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://www.json.org") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Metadata-schema")) + .add(Json.createObjectBuilder() + .add("@type", "dct:Standard") + .add("@id", "https://doi.datacite.org") + .add("rdfs:seeAlso", "https://w3id.org/fair/fip/latest/Identifier-service"))); + if (!StringUtils.isEmpty(orgName) && !StringUtils.isEmpty(country)) { + builder= builder + .add("dct:publisher", Json.createObjectBuilder() + .add("@type", Json.createArrayBuilder() + .add("foaf:Agent") + .add("vcard:Kind")) + .add("foaf:name", orgName) + .add("vcard:fn", orgName) + .add("vcard:country-name", country)); + } + if (!StringUtils.isEmpty(language)) { + builder= builder + .add("dct:language", language); + } + builder= builder + .add("dcat:service", Json.createArrayBuilder() + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/resources/json/.well-known/api-catalog") + .add("dct:conformsTo", "https://signposting.org/FAIRiCat")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/api/search.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/api/dataaccess.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/api/native-api.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/developers/dataset-semantic-metadata-api.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/developers/s3-direct-upload-api.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/developers/globus-api.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "https://guides.dataverse.org/en/latest/api/metrics.html")) + .add(Json.createObjectBuilder() + .add("@type", "dcat:DataService") + .add("dcat:endpointURL", repositoryURL + "/api") + .add("dct:conformsTo", "http://swordapp.org/")) + .add(oaiDcatJson) + .add(siteMapDcatJson)); + builder= builder + .add("schema:offers", Json.createArrayBuilder() + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/resources/json/.well-known/api-catalog") + .add("schema:documentation", "https://signposting.org/FAIRiCat"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/api/search.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/api/dataaccess.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/api/native-api.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/developers/dataset-semantic-metadata-api.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/developers/dataset-migration-api.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/developers/s3-direct-upload-api.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/developers/globus-api.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "https://guides.dataverse.org/en/latest/api/metrics.html"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:WebAPI") + .add("schema:url", repositoryURL + "/api") + .add("schema:documentation", "http://swordapp.org/"))) + .add(oaiSchJson) + .add(siteMapSchJson) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://doi.datacite.org")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Identifier-service"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "http://www.dcc.ac.uk/resources/metadata-standards/dcat-data-catalog-vocabulary")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://www.dcc.ac.uk/resources/metadata-standards/oai-ore-open-archives-initiative-object-reuse-and-exchange")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://www.dcc.ac.uk/resources/metadata-standards/datacite-metadata-schema")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://guidelines.openaire.eu/en/latest/data/use_of_datacite.html")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://json-ld.org")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://www.dcc.ac.uk/resources/metadata-standards/ddi-data-documentation-initiative")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://www.dublincore.org/specifications/dublin-core/dcmi-terms")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://ddialliance.org/Specification/DDI-Codebook/2.5/")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema"))) + .add(Json.createObjectBuilder() + .add("@type", "schema:Offer") + .add("schema:itemOffered", Json.createObjectBuilder() + .add("@type", "schema:Service") + .add("schema:serviceOutput", Json.createObjectBuilder() + .add("schema:identifier", "https://www.json.org")) + .add("schema:serviceType", "https://w3id.org/fair/fip/latest/Metadata-schema")))); + + return builder.build().toString(); + } + public Dataverse getDataverse() { return dataverse; } diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index ade961b3b92..0ee06abc3f5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -756,8 +756,30 @@ Whether Harvesting (OAI) service is enabled COARNotifyRelationshipAnnouncementTriggerFields, // JSON specification of the targets to send announcements to COARNotifyRelationshipAnnouncementTargets, - ; + // DCAT an json repository description entries + // The country in which the repository operates + dcat_repository_country, + // The native language of the user interface of the repository. + dcat_repository_language, + // The subject classification of datasets in a repository. If none, it could be generic + dcat_repository_research_area, + // Policies that explain the repository’s commitment and processes that ensure the long-term preservation, fitness, and availability of datasets. + dcat_repository_prev_policy, + // Policies that explain what datasets the repository will accept for deposit, from whom, and under what conditions, including costs. + dcat_repository_terms, + // The terms of reuse of datasets that are provided by a repository + dcat_repository_license, + // Evidence that a repository meets a formal standard and adheres to a set of best, professional practices. Format. Certification|Start date|End date + dcat_repository_certification, + // The organization responsible for the data repository + dcat_repository_org_name, + // Policies for who can view and access a dataset and under what conditions. + dcat_repository_access_terms, + // A general description of the data repository + dcat_repositoryDescription + ; + @Override public String toString() { return ":" + name(); diff --git a/src/main/webapp/dataverse.xhtml b/src/main/webapp/dataverse.xhtml index 4ffac1c24b3..597e82adfd9 100644 --- a/src/main/webapp/dataverse.xhtml +++ b/src/main/webapp/dataverse.xhtml @@ -49,6 +49,14 @@ + + + + + + diff --git a/src/main/webapp/resources/json/.well-known/api-catalog b/src/main/webapp/resources/json/.well-known/api-catalog new file mode 100644 index 00000000000..b82075b4457 --- /dev/null +++ b/src/main/webapp/resources/json/.well-known/api-catalog @@ -0,0 +1,120 @@ +{ + "linkset": [ + { + "anchor": "https://edatos.consorciomadrono.es/oai", + "service-doc": [ + { + "href": "https://www.openarchives.org/OAI/2.0/guidelines-static-repository.htm", + "type": "text/html", + "title": "Specification for an OAI Static Repository and an OAI Static Repository Gateway" + } + ], + "service-meta": [ + { + "href": "https://edatos.consorciomadrono.es/oai", + "type": "application/xml" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/api/search.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/api/dataaccess.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/api/native-api.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/developers/dataset-semantic-metadata-api.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/developers/dataset-migration-api.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/developers/s3-direct-upload-api.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/developers/globus-api.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "https://guides.dataverse.org/en/latest/api/metrics.html", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/api", + "service-doc": [ + { + "href": "http://swordapp.org/", + "type": "application/html" + "title": "API Rest" + } + ] + }, + { + "anchor": "https://edatos.consorciomadrono.es/sitemap.xml", + "service-doc": [ + { + "href": "https://www.sitemaps.org/protocol.html", + "type": "text/html", + "title": "sitemaps.org - Protocol" + } + ] + } + ] +} From 49867141225fc6bb66539618e21fb4884db89fde Mon Sep 17 00:00:00 2001 From: juancorr Date: Sat, 6 Dec 2025 09:06:52 +0100 Subject: [PATCH 2/2] Wrong comment for new DCAT and Schema.org entries --- .../edu/harvard/iq/dataverse/settings/SettingsServiceBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index 0ee06abc3f5..cb9fa0cadba 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -757,7 +757,7 @@ Whether Harvesting (OAI) service is enabled // JSON specification of the targets to send announcements to COARNotifyRelationshipAnnouncementTargets, - // DCAT an json repository description entries + // DCAT and Schema.org repository description entries // The country in which the repository operates dcat_repository_country, // The native language of the user interface of the repository.