From 4c63865fea9e23745d9071ab6188751e1df51087 Mon Sep 17 00:00:00 2001 From: wangf1122 <74916635+wangf1122@users.noreply.github.com> Date: Tue, 25 Jun 2024 07:00:11 -0400 Subject: [PATCH 01/97] Add info logs to make transaction of working copy merge more traceable (#8178) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add info logs to make transaction of working copy merge more traceable * build fix * Update listeners/src/main/java/org/fao/geonet/listener/metadata/draft/DraftUtilities.java Co-authored-by: Jose García * Update listeners/src/main/java/org/fao/geonet/listener/metadata/draft/DraftUtilities.java Co-authored-by: Jose García * Update datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java Co-authored-by: Jose García * Update datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java Co-authored-by: Jose García * add more logs for delete folder * build fix * build fix * Update core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java Co-authored-by: Jose García --------- Co-authored-by: Jose García Co-authored-by: Ian --- .../fao/geonet/api/records/attachments/FilesystemStore.java | 1 + .../org/fao/geonet/api/records/attachments/CMISStore.java | 5 +++++ .../org/fao/geonet/api/records/attachments/JCloudStore.java | 1 + .../java/org/fao/geonet/api/records/attachments/S3Store.java | 4 ++++ .../fao/geonet/listener/metadata/draft/DraftUtilities.java | 2 ++ 5 files changed, 13 insertions(+) diff --git a/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java b/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java index 4fc31b3f7a2..fb0577bc8bd 100644 --- a/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java +++ b/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java @@ -232,6 +232,7 @@ private Path getPath(ServiceContext context, int metadataId, MetadataResourceVis public String delResources(ServiceContext context, int metadataId) throws Exception { Path metadataDir = Lib.resource.getMetadataDir(getDataDirectory(context), metadataId); try { + Log.info(Geonet.RESOURCES, String.format("Deleting all files from metadataId '%d'", metadataId)); IO.deleteFileOrDirectory(metadataDir, true); return String.format("Metadata '%s' directory removed.", metadataId); } catch (Exception e) { diff --git a/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java b/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java index cc39c8d2d78..de258b3a711 100644 --- a/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java +++ b/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java @@ -391,6 +391,7 @@ public String delResources(final ServiceContext context, final int metadataId) t folderKey = getMetadataDir(context, metadataId); final Folder folder = cmisUtils.getFolderCache(folderKey, true); + Log.info(Geonet.RESOURCES, String.format("Deleting the folder of '%s' and the files within the folder", folderKey)); folder.deleteTree(true, UnfileObject.DELETE, true); cmisUtils.invalidateFolderCache(folderKey); @@ -508,7 +509,9 @@ public MetadataResourceContainer getResourceContainerDescription(final ServiceCo @Override public void copyResources(ServiceContext context, String sourceUuid, String targetUuid, MetadataResourceVisibility metadataResourceVisibility, boolean sourceApproved, boolean targetApproved) throws Exception { final int sourceMetadataId = canEdit(context, sourceUuid, metadataResourceVisibility, sourceApproved); + final int targetMetadataId = canEdit(context, sourceUuid, metadataResourceVisibility, targetApproved); final String sourceResourceTypeDir = getMetadataDir(context, sourceMetadataId) + cmisConfiguration.getFolderDelimiter() + metadataResourceVisibility.toString(); + final String targetResourceTypeDir = getMetadataDir(context, targetMetadataId) + cmisConfiguration.getFolderDelimiter() + metadataResourceVisibility.toString(); try { Folder sourceParentFolder = cmisUtils.getFolderCache(sourceResourceTypeDir, true); @@ -522,6 +525,8 @@ public void copyResources(ServiceContext context, String sourceUuid, String targ for (Map.Entry sourceEntry : sourceDocumentMap.entrySet()) { Document sourceDocument = sourceEntry.getValue(); + + Log.info(Geonet.RESOURCES, String.format("Copying %s to %s" , sourceResourceTypeDir+cmisConfiguration.getFolderDelimiter()+sourceDocument.getName(), targetResourceTypeDir)); // Get cmis properties from the source document Map sourceProperties = getProperties(sourceDocument); putResource(context, targetUuid, sourceDocument.getName(), sourceDocument.getContentStream().getStream(), null, metadataResourceVisibility, targetApproved, sourceProperties); diff --git a/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java b/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java index ac9f80d243d..067809526d1 100644 --- a/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java +++ b/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java @@ -243,6 +243,7 @@ public String delResources(final ServiceContext context, final int metadataId) t ListContainerOptions opts = new ListContainerOptions(); opts.prefix(getMetadataDir(context, metadataId) + jCloudConfiguration.getFolderDelimiter()).recursive(); + Log.info(Geonet.RESOURCES, String.format("Deleting all files from metadataId '%s'", metadataId)); // Page through the data String marker = null; do { diff --git a/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java b/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java index aa59182c9b6..27df07a4532 100644 --- a/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java +++ b/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java @@ -34,11 +34,13 @@ import com.amazonaws.services.s3.model.S3ObjectSummary; import jeeves.server.context.ServiceContext; import org.fao.geonet.api.exception.ResourceNotFoundException; +import org.fao.geonet.constants.Geonet; import org.fao.geonet.domain.MetadataResource; import org.fao.geonet.domain.MetadataResourceContainer; import org.fao.geonet.domain.MetadataResourceVisibility; import org.fao.geonet.kernel.setting.SettingManager; import org.fao.geonet.resources.S3Credentials; +import org.fao.geonet.utils.Log; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; @@ -186,6 +188,8 @@ public String delResources(final ServiceContext context, final int metadataId) t try { final ListObjectsV2Result objects = s3.getClient().listObjectsV2( s3.getBucket(), getMetadataDir(metadataId)); + + Log.info(Geonet.RESOURCES, String.format("Deleting all files from metadataId '%s'", metadataId)); for (S3ObjectSummary object: objects.getObjectSummaries()) { s3.getClient().deleteObject(s3.getBucket(), object.getKey()); } diff --git a/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/DraftUtilities.java b/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/DraftUtilities.java index c3f6cf7704c..ce418b4062f 100644 --- a/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/DraftUtilities.java +++ b/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/DraftUtilities.java @@ -87,6 +87,7 @@ public AbstractMetadata replaceMetadataWithDraft(AbstractMetadata md) { * @return */ public AbstractMetadata replaceMetadataWithDraft(AbstractMetadata md, AbstractMetadata draft) { + Log.info(Geonet.DATA_MANAGER, String.format("Replacing metadata approved record (%d) with draft record (%d)", md.getId(), draft.getId())); Log.trace(Geonet.DATA_MANAGER, "Found approved record with id " + md.getId()); Log.trace(Geonet.DATA_MANAGER, "Found draft with id " + draft.getId()); // Reassign metadata validations @@ -131,6 +132,7 @@ public AbstractMetadata replaceMetadataWithDraft(AbstractMetadata md, AbstractMe } // Reassign file uploads + Log.info(Geonet.DATA_MANAGER, String.format("Copying draft record '%d' resources to approved record '%d'", draft.getId(), md.getId())); draftMetadataUtils.replaceFiles(draft, md); metadataFileUploadRepository.deleteAll(MetadataFileUploadSpecs.hasMetadataId(md.getId())); From f0debae33f4ca6bbd4214f5921fa38a1924dfb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= Date: Fri, 28 Jun 2024 16:21:19 +0200 Subject: [PATCH 02/97] Editor / Polygon not saved (#8230) Related to JQuery update. --- .../components/edit/bounding/partials/boundingpolygon.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/bounding/partials/boundingpolygon.html b/web-ui/src/main/resources/catalog/components/edit/bounding/partials/boundingpolygon.html index 6d6d612364b..7ca025f75a9 100644 --- a/web-ui/src/main/resources/catalog/components/edit/bounding/partials/boundingpolygon.html +++ b/web-ui/src/main/resources/catalog/components/edit/bounding/partials/boundingpolygon.html @@ -90,7 +90,7 @@ placeholder="{{'inputGeometryText' | translate}}" ng-change="ctrl.handleInputChange()" ng-readonly="ctrl.readOnly" - /> + > {{ 'inputGeometryIsInvalid' | translate}} {{ctrl.parseError}} From e22bce74f42ac1b3ad5945f6daf4cedfcb17a946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= Date: Mon, 1 Jul 2024 07:56:36 +0200 Subject: [PATCH 03/97] Fix wrong HTML self closing tags (#8232) --- .../directives/partials/facet-temporalrange.html | 6 +++--- .../ng-skos/templates/skos-concept-thesaurus.html | 2 +- .../resources/catalog/templates/admin/usergroup/users.html | 2 +- .../main/resources/catalog/templates/formatter-viewer.html | 2 +- .../views/default/directives/partials/attributetable.html | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html b/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html index 02cf7c2e574..8029f53fbf8 100644 --- a/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html +++ b/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html @@ -15,7 +15,7 @@ name="start" /> - + - + diff --git a/web-ui/src/main/resources/catalog/components/ng-skos/templates/skos-concept-thesaurus.html b/web-ui/src/main/resources/catalog/components/ng-skos/templates/skos-concept-thesaurus.html index 0dae7eea07c..f8407b708ec 100644 --- a/web-ui/src/main/resources/catalog/components/ng-skos/templates/skos-concept-thesaurus.html +++ b/web-ui/src/main/resources/catalog/components/ng-skos/templates/skos-concept-thesaurus.html @@ -44,7 +44,7 @@ Related Terms:
  • - +
diff --git a/web-ui/src/main/resources/catalog/templates/admin/usergroup/users.html b/web-ui/src/main/resources/catalog/templates/admin/usergroup/users.html index 3c7271c9d70..39a7163574e 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/usergroup/users.html +++ b/web-ui/src/main/resources/catalog/templates/admin/usergroup/users.html @@ -614,7 +614,7 @@

UserAdmin

data-gn-saved-selections="" data-ng-if="userSelected.id > 0" data-gn-saved-selections-panel="userSelected" - /> + > diff --git a/web-ui/src/main/resources/catalog/templates/formatter-viewer.html b/web-ui/src/main/resources/catalog/templates/formatter-viewer.html index e0a7427ae43..7a04c8b83b4 100644 --- a/web-ui/src/main/resources/catalog/templates/formatter-viewer.html +++ b/web-ui/src/main/resources/catalog/templates/formatter-viewer.html @@ -3,7 +3,7 @@
+ >
{{attribute.definition}} - + From cddac34e74d78fd65ab5664dd8e784ad37c23e20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= Date: Wed, 3 Jul 2024 08:07:56 +0200 Subject: [PATCH 04/97] Standard / ISO19139 / Formatter / Do not display extent if none available (#8229) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Standard / ISO19139 / Formatter / Do not display extent if none available * Update schemas/iso19139/src/main/plugin/iso19139/formatter/xsl-view/view.xsl Co-authored-by: Jose García --------- Co-authored-by: Jose García --- .../iso19139/formatter/xsl-view/view.xsl | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/xsl-view/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/xsl-view/view.xsl index 65dc278704e..4f5f259dc21 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/formatter/xsl-view/view.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/xsl-view/view.xsl @@ -193,23 +193,25 @@ -
-

- - - - -

- - - - - - - - - -
+ +
+

+ + + + +

+ + + + + + + + + +
+
From b5c29b8a4c17bffc297b2fe16c03cd8d539e3568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= Date: Wed, 3 Jul 2024 10:22:09 +0200 Subject: [PATCH 05/97] ISO19115-3.2018 / Remove duplicated fields for metadata identifier and uuid in CSV export (#8238) --- .../src/main/plugin/iso19115-3.2018/layout/tpl-csv.xsl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/tpl-csv.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/tpl-csv.xsl index 0ab5bd3adad..d5ae0576c7d 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/tpl-csv.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/tpl-csv.xsl @@ -29,12 +29,6 @@ priority="2"> - - - - - - <xsl:apply-templates mode="localised" select="mdb:identificationInfo/*/mri:citation/*/cit:title"> From 4b9864ad3fe4da33d93497f79ee5bd3e28bd6b9d Mon Sep 17 00:00:00 2001 From: wangf1122 <74916635+wangf1122@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:16:22 -0400 Subject: [PATCH 06/97] Broadcasting error when delete record (#8212) Show a warning to the user when an error happens while deleting one or more metadata records. --- .../components/metadataactions/MetadataActionService.js | 4 ++++ .../main/resources/catalog/js/edit/EditorBoardController.js | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js index 84a9d9a2492..100ebfca458 100644 --- a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js +++ b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js @@ -286,6 +286,10 @@ deferred.resolve(data); }, function (data) { + gnAlertService.addAlert({ + msg: data.data.message || data.data.description, + type: "danger" + }); deferred.reject(data); } ); diff --git a/web-ui/src/main/resources/catalog/js/edit/EditorBoardController.js b/web-ui/src/main/resources/catalog/js/edit/EditorBoardController.js index bb5c459b0a8..15ed806c00a 100644 --- a/web-ui/src/main/resources/catalog/js/edit/EditorBoardController.js +++ b/web-ui/src/main/resources/catalog/js/edit/EditorBoardController.js @@ -135,7 +135,8 @@ }, function (reason) { $rootScope.$broadcast("StatusUpdated", { - title: reason.data.description, //returned error JSON obj + title: reason.data.message, //returned error JSON obj + error: reason.data.description, timeout: 0, type: "danger" }); From 46188341d243ec2858a6d3f147d2b23d50e51ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Rodr=C3=ADguez=20Ponce?= <juanluisrp@geocat.net> Date: Wed, 10 Jul 2024 08:16:12 +0200 Subject: [PATCH 07/97] Fix infinite "Please wait" message on error (#8249) If an error happens while using the delete, validate or other option of the editor dashboard metadata actions menu then remove the text "Please wait" and the spinner from the button to allow to perform a new action. --- .../metadataactions/MetadataActionService.js | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js index 100ebfca458..77429954b58 100644 --- a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js +++ b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js @@ -275,24 +275,28 @@ ); } else { $rootScope.$broadcast("operationOnSelectionStart"); - $http.delete("../api/records?" + "bucket=" + bucket).then( - function (data) { - $rootScope.$broadcast("mdSelectNone"); - $rootScope.$broadcast("operationOnSelectionStop"); - $rootScope.$broadcast("search"); - $timeout(function () { + $http + .delete("../api/records?" + "bucket=" + bucket) + .then( + function (data) { + $rootScope.$broadcast("mdSelectNone"); $rootScope.$broadcast("search"); - }, 5000); - deferred.resolve(data); - }, - function (data) { - gnAlertService.addAlert({ - msg: data.data.message || data.data.description, - type: "danger" - }); - deferred.reject(data); - } - ); + $timeout(function () { + $rootScope.$broadcast("search"); + }, 5000); + deferred.resolve(data); + }, + function (data) { + gnAlertService.addAlert({ + msg: data.data.message || data.data.description, + type: "danger" + }); + deferred.reject(data); + } + ) + .finally(function () { + $rootScope.$broadcast("operationOnSelectionStop"); + }); } return deferred.promise; }; @@ -644,8 +648,10 @@ }) .then(function (data) { $rootScope.$broadcast("inspireMdValidationStop"); - $rootScope.$broadcast("operationOnSelectionStop"); $rootScope.$broadcast("search"); + }) + .finally(function () { + $rootScope.$broadcast("operationOnSelectionStop"); }); }; @@ -657,8 +663,10 @@ method: "DELETE" }) .then(function (data) { - $rootScope.$broadcast("operationOnSelectionStop"); $rootScope.$broadcast("search"); + }) + .finally(function () { + $rootScope.$broadcast("operationOnSelectionStop"); }); }; From 9b19b580af85953cbaeb0b3ea9c36601491e5e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Wed, 10 Jul 2024 09:05:30 +0200 Subject: [PATCH 08/97] Editor / Configuration / Improve deletion in forEach section (#8244) Improve documentation and properly target node to delete in case the forEach loop element is not the one to remove. eg. ```xml <section name="Axe - Time" forEach="/mdb:MD_Metadata/mdb:spatialRepresentationInfo/*/msr:axisDimensionProperties/*[msr:dimensionName/*/@codeListValue = 'time']" del="ancestor::msr:axisDimensionProperties"> <field xpath="msr:dimensionSize"/> <field xpath="msr:resolution"/> </section> ``` Before the change, the remove button was not displayed. Most of the time the loop element is the one to delete and this case was fine. --- schemas/config-editor.xsd | 16 +++++++++------- .../xslt/ui-metadata/form-configurator.xsl | 6 +++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/schemas/config-editor.xsd b/schemas/config-editor.xsd index ac697476f41..31455f489a3 100644 --- a/schemas/config-editor.xsd +++ b/schemas/config-editor.xsd @@ -906,7 +906,7 @@ Define if this tab is the default one for the view. Only one tab should be the d <xs:annotation> <xs:documentation><![CDATA[ The tab key used in URL parameter to activate that tab. The key is also use for the tab label as defined in ``{schema}/loc/{lang}/strings.xml``. -It has to be unique for all views. A good practice is to use same prefix for all tabs in the same view. +It has to be unique for all views. A good practice is to use same prefix for all tabs in the same view. ]]></xs:documentation> </xs:annotation> </xs:attribute> @@ -1128,9 +1128,11 @@ Note: Only sections with forEach support del attribute. <section forEach="/gmd:MD_Metadata/gmd:distributionInfo"> <text><h2>Distribution</h2></text> - <section forEach="*/gmd:transferOptions/*/gmd:onLine/gmd:CI_OnlineResource" name="A link"> - <field xpath="gmd:linkage"/> - <field xpath="gmd:name" or="name" in="."/> + <section forEach="*/gmd:transferOptions/*/gmd:onLine" + name="A link" + del="."> + <field xpath="*/gmd:linkage"/> + <field xpath="*/gmd:name" or="name" in="."/> </section> <text><hr/></text> </section> @@ -2111,9 +2113,9 @@ An autocompletion list based on a thesaurus. This field facilitates users in selecting a `subtemplate` (also known as xml-snippet) from the catalogue. Subtemplates are mostly used to store contact details, but can also be used to store snippets of xml having Quality reports, Access constraints, CRS definitions, etc. - -`data-insert-modes` can be `text` and/or `xlink` depending on how the subtemplate is encoded. -Contact can be forced to be `xlink` but some other type of subtemplates (eg. DQ report) are usually just simple default values + +`data-insert-modes` can be `text` and/or `xlink` depending on how the subtemplate is encoded. +Contact can be forced to be `xlink` but some other type of subtemplates (eg. DQ report) are usually just simple default values that need to be detailed by editors and in that case `text` mode is recommended. For `xlink`, the XLink resolver needs to be enabled in the admin settings. diff --git a/web/src/main/webapp/xslt/ui-metadata/form-configurator.xsl b/web/src/main/webapp/xslt/ui-metadata/form-configurator.xsl index ce17645dc19..2e423b7ea75 100644 --- a/web/src/main/webapp/xslt/ui-metadata/form-configurator.xsl +++ b/web/src/main/webapp/xslt/ui-metadata/form-configurator.xsl @@ -151,7 +151,7 @@ <xsl:variable name="originalNode" select="gn-fn-metadata:getOriginalNode($metadata, .)"/> - <xsl:variable name="refToDelete"> + <xsl:variable name="refToDelete" as="node()?"> <xsl:call-template name="get-ref-element-to-delete"> <xsl:with-param name="node" select="$originalNode"/> <xsl:with-param name="delXpath" select="$del"/> @@ -159,7 +159,7 @@ </xsl:variable> <xsl:call-template name="render-form-field-control-remove"> - <xsl:with-param name="editInfo" select="gn:element"/> + <xsl:with-param name="editInfo" select="$refToDelete"/> </xsl:call-template> </xsl:if> </legend> @@ -329,7 +329,7 @@ select="gn-fn-metadata:check-elementandsession-visibility( $schema, $base, $serviceInfo, @if, @displayIfServiceInfo)"/> - <!-- + <!-- <xsl:message> Field: <xsl:value-of select="@name"/></xsl:message> <xsl:message>Xpath: <xsl:copy-of select="@xpath"/></xsl:message> <xsl:message>TemplateModeOnly: <xsl:value-of select="@templateModeOnly"/></xsl:message> From 427eae7fb084d49c15f1b8f857855a22381f6da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 11 Jul 2024 09:05:31 +0200 Subject: [PATCH 09/97] Standard / ISO19115-3 / Formatter / Fix namespace declaration (#8223) `xmlns:srv` was declared 2 times. Fixes https://github.com/geonetwork/core-geonetwork/issues/8221 Related to https://github.com/geonetwork/core-geonetwork/commit/27a69dfa7c0214b4e3c9971b2e652dbba9742d36#diff-1f83f3131214c0592eea4a9f65ed3a58a889689a64e9f07bc0753544c0427b29 --- .../src/main/plugin/iso19115-3.2018/formatter/iso19139/view.xsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/iso19139/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/iso19139/view.xsl index d388bbff7f2..95c9643d53f 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/iso19139/view.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/iso19139/view.xsl @@ -39,7 +39,7 @@ xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" - xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.0" + xmlns:srv2="http://standards.iso.org/iso/19115/-3/srv/2.0" xmlns:mac="http://standards.iso.org/iso/19115/-3/mac/2.0" xmlns:mas="http://standards.iso.org/iso/19115/-3/mas/1.0" xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" From 111a1d7f79fe23b5663e727aeaf126277576fe89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 11 Jul 2024 09:14:32 +0200 Subject: [PATCH 10/97] Standard / ISO19115-3 / Formatters / ISO19139 / Fix scope code (#8224) Fixes "md:scope will be gmd:MD_Scope when it should be gmd:DQ_Scope" See https://github.com/geonetwork/core-geonetwork/issues/8220 --- .../convert/ISO19139/toISO19139.xsl | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl index 66500e82d1f..4955ec576ca 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl @@ -553,24 +553,30 @@ <xsl:template match="mdb:resourceLineage[not(../mdb:dataQualityInfo)]"> <gmd:dataQualityInfo> <gmd:DQ_DataQuality> - <xsl:apply-templates select="mrl:LI_Lineage/mrl:scope"/> - <gmd:lineage> - <gmd:LI_Lineage> - <xsl:call-template name="writeCharacterStringElement"> - <xsl:with-param name="elementName" - select="'gmd:statement'"/> - <xsl:with-param name="nodeWithStringToWrite" - select="mrl:LI_Lineage/mrl:statement"/> - </xsl:call-template> - <xsl:apply-templates select="mrl:LI_Lineage/mrl:processStep"/> - <xsl:apply-templates select="mrl:LI_Lineage/mrl:source"/> - </gmd:LI_Lineage> - </gmd:lineage> + <xsl:if test="mrl:LI_Lineage/mrl:scope"> + <gmd:scope> + <gmd:DQ_Scope> + <xsl:apply-templates select="mrl:LI_Lineage/mrl:scope/@*"/> + <xsl:apply-templates select="mrl:LI_Lineage/mrl:scope/mcc:MD_Scope/*"/> + </gmd:DQ_Scope> + </gmd:scope> + </xsl:if> + <gmd:lineage> + <gmd:LI_Lineage> + <xsl:call-template name="writeCharacterStringElement"> + <xsl:with-param name="elementName" + select="'gmd:statement'"/> + <xsl:with-param name="nodeWithStringToWrite" + select="mrl:LI_Lineage/mrl:statement"/> + </xsl:call-template> + <xsl:apply-templates select="mrl:LI_Lineage/mrl:processStep"/> + <xsl:apply-templates select="mrl:LI_Lineage/mrl:source"/> + </gmd:LI_Lineage> + </gmd:lineage> </gmd:DQ_DataQuality> </gmd:dataQualityInfo> </xsl:template> - <xsl:template match="mmi:maintenanceDate"> <gmd:dateOfNextUpdate> <xsl:apply-templates select="cit:CI_Date/cit:date/*"/> From 564771f40c24ca1e5756428127aff17cebfcd0e1 Mon Sep 17 00:00:00 2001 From: Ian <ianwallen@hotmail.com> Date: Fri, 19 Jul 2024 12:00:20 -0300 Subject: [PATCH 11/97] Fixed issue with working copy not being returned from getRecordAS api (#8265) --- .../src/main/java/org/fao/geonet/api/records/MetadataApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataApi.java index 64bb64c4200..c62a7c4a76c 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataApi.java @@ -366,7 +366,7 @@ private Object getRecordAs( throws Exception { AbstractMetadata metadata; try { - metadata = ApiUtils.canViewRecord(metadataUuid, request); + metadata = ApiUtils.canViewRecord(metadataUuid, approved, request); } catch (ResourceNotFoundException e) { Log.debug(API.LOG_MODULE_NAME, e.getMessage(), e); throw e; From fb966e37c43615be218de532842449992a8a09ea Mon Sep 17 00:00:00 2001 From: Ian <ianwallen@hotmail.com> Date: Mon, 22 Jul 2024 03:05:06 -0300 Subject: [PATCH 12/97] Fixed issue with working copy not being returned from /api/records/{metadataUuid}/formatters/{formatterId:.+} (#8269) This affect PDF exports on working copies. --- .../org/fao/geonet/api/records/formatters/FormatterApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java b/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java index 1a9830c3ef6..068c63f60c7 100644 --- a/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java @@ -252,7 +252,7 @@ public void getRecordFormattedBy( language = isoLanguagesMapper.iso639_2T_to_iso639_2B(locale.getISO3Language()); } - AbstractMetadata metadata = ApiUtils.canViewRecord(metadataUuid, servletRequest); + AbstractMetadata metadata = ApiUtils.canViewRecord(metadataUuid, approved, servletRequest); if (approved) { metadata = ApplicationContextHolder.get().getBean(MetadataRepository.class).findOneByUuid(metadataUuid); From f78fda51b89480ea2705e2902a92dce571a9719c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Tue, 23 Jul 2024 14:01:47 +0200 Subject: [PATCH 13/97] Use UI language for metadata selection export to CSV / PDF. Fixes #7969 (#8262) Use the UI language for the metadata information, when exporting a metadata selection to CSV / PDF. The API for these services accept a new optional parameter language that defaults to English as previously. Fixes #7969. --- .../fao/geonet/api/records/CatalogApi.java | 85 ++++++++++++------- .../guiapi/search/XsltResponseWriter.java | 19 ++--- .../metadataactions/MetadataActionService.js | 12 ++- 3 files changed, 69 insertions(+), 47 deletions(-) diff --git a/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java b/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java index e7547678245..e6751f8e3ef 100644 --- a/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2023 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -125,8 +125,8 @@ public class CatalogApi { .add("geom") .add(SOURCE_CATALOGUE) .add(Geonet.IndexFieldNames.DATABASE_CHANGE_DATE) - .add("resourceTitleObject.default") // TODOES multilingual - .add("resourceAbstractObject.default").build(); + .add(Geonet.IndexFieldNames.RESOURCETITLE + "Object") + .add(Geonet.IndexFieldNames.RESOURCEABSTRACT + "Object").build(); } @Autowired @@ -167,7 +167,7 @@ private static String paramsAsString(Map<String, String> requestParams) { StringBuilder paramNonPaging = new StringBuilder(); for (Entry<String, String> pair : requestParams.entrySet()) { if (!pair.getKey().equals("from") && !pair.getKey().equals("to")) { - paramNonPaging.append(paramNonPaging.toString().equals("") ? "" : "&").append(pair.getKey()).append("=").append(pair.getValue()); + paramNonPaging.append(paramNonPaging.toString().isEmpty() ? "" : "&").append(pair.getKey()).append("=").append(pair.getValue()); } } return paramNonPaging.toString(); @@ -364,6 +364,11 @@ public void exportAsPdf( required = false ) String bucket, + @RequestParam( + required = false, + defaultValue = "eng" + ) + String language, @Parameter(hidden = true) @RequestParam Map<String, String> allRequestParams, @@ -392,68 +397,74 @@ public void exportAsPdf( Map<String, Object> params = new HashMap<>(); Element request = new Element("request"); - allRequestParams.entrySet().forEach(e -> { - Element n = new Element(e.getKey()); - n.setText(e.getValue()); + allRequestParams.forEach((key, value) -> { + Element n = new Element(key); + n.setText(value); request.addContent(n); }); + if (!languageUtils.getUiLanguages().contains(language)) { + language = languageUtils.getDefaultUiLanguage(); + } + + String langCode = "lang" + language; + Element response = new Element("response"); ObjectMapper objectMapper = new ObjectMapper(); searchResponse.hits().hits().forEach(h1 -> { Hit h = (Hit) h1; Element r = new Element("metadata"); final Map<String, Object> source = objectMapper.convertValue(h.source(), Map.class); - source.entrySet().forEach(e -> { - Object v = e.getValue(); + source.forEach((key, v) -> { if (v instanceof String) { - Element t = new Element(e.getKey()); + Element t = new Element(key); t.setText((String) v); r.addContent(t); - } else if (v instanceof HashMap && e.getKey().endsWith("Object")) { - Element t = new Element(e.getKey()); - Map<String, String> textFields = (HashMap) e.getValue(); - t.setText(textFields.get("default")); + } else if (v instanceof HashMap && key.endsWith("Object")) { + Element t = new Element(key); + Map<String, String> textFields = (HashMap) v; + String textValue = textFields.get(langCode) != null ? textFields.get(langCode) : textFields.get("default"); + t.setText(textValue); r.addContent(t); - } else if (v instanceof ArrayList && e.getKey().equals("link")) { + } else if (v instanceof ArrayList && key.equals("link")) { //landform|Physiography of North and Central Eurasia Landform|http://geonetwork3.fao.org/ows/7386_landf|OGC:WMS-1.1.1-http-get-map|application/vnd.ogc.wms_xml ((ArrayList) v).forEach(i -> { - Element t = new Element(e.getKey()); + Element t = new Element(key); Map<String, String> linkProperties = (HashMap) i; t.setText(linkProperties.get("description") + "|" + linkProperties.get("name") + "|" + linkProperties.get("url") + "|" + linkProperties.get("protocol")); r.addContent(t); }); - } else if (v instanceof HashMap && e.getKey().equals("overview")) { - Element t = new Element(e.getKey()); + } else if (v instanceof HashMap && key.equals("overview")) { + Element t = new Element(key); Map<String, String> overviewProperties = (HashMap) v; t.setText(overviewProperties.get("url") + "|" + overviewProperties.get("name")); r.addContent(t); } else if (v instanceof ArrayList) { ((ArrayList) v).forEach(i -> { - if (i instanceof HashMap && e.getKey().equals("overview")) { - Element t = new Element(e.getKey()); + if (i instanceof HashMap && key.equals("overview")) { + Element t = new Element(key); Map<String, String> overviewProperties = (HashMap) i; t.setText(overviewProperties.get("url") + "|" + overviewProperties.get("name")); r.addContent(t); } else if (i instanceof HashMap) { - Element t = new Element(e.getKey()); + Element t = new Element(key); Map<String, String> tags = (HashMap) i; t.setText(tags.get("default")); // TODOES: Multilingual support r.addContent(t); } else { - Element t = new Element(e.getKey()); + Element t = new Element(key); t.setText((String) i); r.addContent(t); } }); - } else if (v instanceof HashMap && e.getKey().equals("geom")) { - Element t = new Element(e.getKey()); + } else if (v instanceof HashMap && key.equals("geom")) { + Element t = new Element(key); t.setText(((HashMap) v).get("coordinates").toString()); r.addContent(t); } else if (v instanceof HashMap) { // Skip. } else { - Element t = new Element(e.getKey()); + Element t = new Element(key); t.setText(v.toString()); r.addContent(t); } @@ -461,14 +472,13 @@ public void exportAsPdf( response.addContent(r); }); - Locale locale = languageUtils.parseAcceptLanguage(httpRequest.getLocales()); - String language = IsoLanguagesMapper.iso639_2T_to_iso639_2B(locale.getISO3Language()); - language = XslUtil.twoCharLangCode(language, "eng").toLowerCase(); - new XsltResponseWriter("env", "search") - .withJson(String.format("catalog/locales/%s-v4.json", language)) - .withJson(String.format("catalog/locales/%s-core.json", language)) - .withJson(String.format("catalog/locales/%s-search.json", language)) + String language2Code = XslUtil.twoCharLangCode(language, "eng").toLowerCase(); + + new XsltResponseWriter("env", "search", language) + .withJson(String.format("catalog/locales/%s-v4.json", language2Code)) + .withJson(String.format("catalog/locales/%s-core.json", language2Code)) + .withJson(String.format("catalog/locales/%s-search.json", language2Code)) .withXml(response) .withParams(params) .withXsl("xslt/services/pdf/portal-present-fop.xsl") @@ -504,6 +514,11 @@ public void exportAsCsv( required = false ) String bucket, + @RequestParam( + required = false, + defaultValue = "eng" + ) + String language, @Parameter(description = "XPath pointing to the XML element to loop on.", required = false, example = "Use . for the metadata, " + @@ -575,7 +590,11 @@ public void exportAsCsv( } }); - Element r = new XsltResponseWriter(null, "search") + if (!languageUtils.getUiLanguages().contains(language)) { + language = languageUtils.getDefaultUiLanguage(); + } + + Element r = new XsltResponseWriter(null, "search", language) .withParams(allRequestParams.entrySet().stream() .collect(Collectors.toMap( Entry::getKey, diff --git a/services/src/main/java/org/fao/geonet/guiapi/search/XsltResponseWriter.java b/services/src/main/java/org/fao/geonet/guiapi/search/XsltResponseWriter.java index 3623a242f02..fd6a7c78bd5 100644 --- a/services/src/main/java/org/fao/geonet/guiapi/search/XsltResponseWriter.java +++ b/services/src/main/java/org/fao/geonet/guiapi/search/XsltResponseWriter.java @@ -1,6 +1,6 @@ /* * ============================================================================= - * === Copyright (C) 2001-2023 Food and Agriculture Organization of the + * === Copyright (C) 2001-2024 Food and Agriculture Organization of the * === United Nations (FAO-UN), United Nations World Food Programme (WFP) * === and United Nations Environment Programme (UNEP) * === @@ -36,9 +36,7 @@ import org.fao.geonet.utils.Log; import org.fao.geonet.utils.Xml; import org.jdom.Element; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -50,16 +48,17 @@ /** * Utility to mimic what Jeeves was doing */ -@Component public class XsltResponseWriter { public static final String TRANSLATIONS = "translations"; - @Autowired - GeonetworkDataDirectory dataDirectory; Element xml; Path xsl; Map<String, Object> xslParams = new HashMap<>(); public XsltResponseWriter(String envTagName, String serviceName) { + this(envTagName, serviceName, "eng"); + } + + public XsltResponseWriter(String envTagName, String serviceName, String lang) { SettingManager settingManager = ApplicationContextHolder.get().getBean(SettingManager.class); String url = settingManager.getBaseURL(); Element gui = new Element("gui"); @@ -70,8 +69,7 @@ public XsltResponseWriter(String envTagName, String serviceName) { gui.addContent(new Element("baseUrl").setText(settingManager.getBaseURL())); gui.addContent(new Element("serverUrl").setText(settingManager.getServerURL())); gui.addContent(new Element("nodeId").setText(settingManager.getNodeId())); - // TODO: set language based on header - gui.addContent(new Element("language").setText("eng")); + gui.addContent(new Element("language").setText(lang)); Element settings = settingManager.getAllAsXML(true); @@ -94,8 +92,7 @@ public XsltResponseWriter withXml(Element xml) { public XsltResponseWriter withXsl(String xsl) { ApplicationContext applicationContext = ApplicationContextHolder.get(); GeonetworkDataDirectory dataDirectory = applicationContext.getBean(GeonetworkDataDirectory.class); - Path xslt = dataDirectory.getWebappDir().resolve(xsl); - this.xsl = xslt; + this.xsl = dataDirectory.getWebappDir().resolve(xsl); return this; } @@ -153,7 +150,7 @@ public XsltResponseWriter withJson(String json) { }); } catch (IOException e) { Log.warning(Geonet.GEONETWORK, String.format( - "Can't find JSON file '%s'.", jsonPath.toString() + "Can't find JSON file '%s'.", jsonPath )); } diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js index 77429954b58..98d4793b3ca 100644 --- a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js +++ b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js @@ -51,6 +51,7 @@ "$q", "$http", "gnConfig", + "gnLangs", function ( $rootScope, $timeout, @@ -67,7 +68,8 @@ $translate, $q, $http, - gnConfig + gnConfig, + gnLangs ) { var windowName = "geonetwork"; var windowOption = ""; @@ -154,7 +156,7 @@ if (params.sortOrder) { url += "&sortOrder=" + params.sortOrder; } - url += "&bucket=" + bucket; + url += "&bucket=" + bucket + "&language=" + gnLangs.current; location.replace(url); } else if (angular.isString(params)) { gnMdFormatter.getFormatterUrl(null, null, params).then(function (url) { @@ -194,7 +196,11 @@ }; this.exportCSV = function (bucket) { - window.open("../api/records/csv" + "?bucket=" + bucket, windowName, windowOption); + window.open( + "../api/records/csv" + "?bucket=" + bucket + "&language=" + gnLangs.current, + windowName, + windowOption + ); }; this.validateMdLinks = function (bucket) { $rootScope.$broadcast("operationOnSelectionStart"); From f9d8f0dd533d4d51c137d2acea0e8d5bea07a484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 25 Jul 2024 08:28:33 +0200 Subject: [PATCH 14/97] Zoom to map popup remains active on non-map pages. (#8267) * Zoom to map popup remains active on non-map pages. Fixes #8260 Fixes also wrong values for add alert delay, provided in some pages in milliseconds, but the method expects seconds. * Zoom to map popup remains active on non-map pages - remove alerts only when switching from the map * Increase timeout to hide layer added popup to 15 seconds --- .../components/common/alert/AlertDirective.js | 6 ++++++ .../catalog/components/common/map/mapService.js | 10 +++++----- .../search/resultsview/SelectionDirective.js | 2 +- .../search/searchmanager/LocationService.js | 10 ++++++---- .../catalog/components/viewer/ViewerDirective.js | 4 ++-- .../viewer/wmsimport/WmsImportDirective.js | 2 +- .../catalog/js/edit/DirectoryController.js | 2 +- .../main/resources/catalog/views/default/module.js | 13 +++++++++++-- 8 files changed, 33 insertions(+), 16 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/common/alert/AlertDirective.js b/web-ui/src/main/resources/catalog/components/common/alert/AlertDirective.js index 449f8563f6d..f1406c99c4f 100644 --- a/web-ui/src/main/resources/catalog/components/common/alert/AlertDirective.js +++ b/web-ui/src/main/resources/catalog/components/common/alert/AlertDirective.js @@ -69,6 +69,12 @@ } } }; + + this.closeAlerts = function () { + if (gnAlertValue.length) { + gnAlertValue.splice(0, gnAlertValue.length); + } + }; } ]); diff --git a/web-ui/src/main/resources/catalog/components/common/map/mapService.js b/web-ui/src/main/resources/catalog/components/common/map/mapService.js index 9c6ebc03599..a2af666d1f6 100644 --- a/web-ui/src/main/resources/catalog/components/common/map/mapService.js +++ b/web-ui/src/main/resources/catalog/components/common/map/mapService.js @@ -1390,7 +1390,7 @@ } else { gnAlertService.addAlert({ msg: $translate.instant("layerCRSNotFound"), - delay: 5000, + delay: 5, type: "warning" }); } @@ -1400,7 +1400,7 @@ msg: $translate.instant("layerNotAvailableInMapProj", { proj: mapProjection }), - delay: 5000, + delay: 5, type: "warning" }); } @@ -1981,7 +1981,7 @@ type: "wmts", url: encodeURIComponent(url) }), - delay: 20000, + delay: 20, type: "warning" }); var o = { @@ -2079,7 +2079,7 @@ type: "wfs", url: encodeURIComponent(url) }), - delay: 20000, + delay: 20, type: "warning" }); var o = { @@ -2159,7 +2159,7 @@ } catch (e) { gnAlertService.addAlert({ msg: $translate.instant("wmtsLayerNoUsableMatrixSet"), - delay: 5000, + delay: 5, type: "danger" }); return; diff --git a/web-ui/src/main/resources/catalog/components/search/resultsview/SelectionDirective.js b/web-ui/src/main/resources/catalog/components/search/resultsview/SelectionDirective.js index 500ece65fd0..ae8fedf50bb 100644 --- a/web-ui/src/main/resources/catalog/components/search/resultsview/SelectionDirective.js +++ b/web-ui/src/main/resources/catalog/components/search/resultsview/SelectionDirective.js @@ -99,7 +99,7 @@ function (r) { gnAlertService.addAlert({ msg: r.data.message || r.data.description, - delay: 20000, + delay: 20, type: "danger" }); if (r.id) { diff --git a/web-ui/src/main/resources/catalog/components/search/searchmanager/LocationService.js b/web-ui/src/main/resources/catalog/components/search/searchmanager/LocationService.js index c04e9b9ff4b..7d1a9c252e4 100644 --- a/web-ui/src/main/resources/catalog/components/search/searchmanager/LocationService.js +++ b/web-ui/src/main/resources/catalog/components/search/searchmanager/LocationService.js @@ -77,12 +77,14 @@ return p.indexOf(this.METADATA) == 0 || p.indexOf(this.DRAFT) == 0; }; - this.isMap = function () { - return $location.path() == this.MAP; + this.isMap = function (path) { + var p = path || $location.path(); + return p == this.MAP; }; - this.isHome = function () { - return $location.path() == this.HOME; + this.isHome = function (path) { + var p = path || $location.path(); + return p == this.HOME; }; this.isUndefined = function () { diff --git a/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js b/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js index cb6f63ed0fe..150d12bf1a4 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js +++ b/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js @@ -255,7 +255,7 @@ }), type: "success" }, - 5000 + 5 ); } }, @@ -293,7 +293,7 @@ url: config.url, extent: extent ? extent.join(",") : "" }), - delay: 5000, + delay: 5, type: "warning" }); // TODO: You may want to add more than one time diff --git a/web-ui/src/main/resources/catalog/components/viewer/wmsimport/WmsImportDirective.js b/web-ui/src/main/resources/catalog/components/viewer/wmsimport/WmsImportDirective.js index bdc1eb1f285..9d4dec15053 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/wmsimport/WmsImportDirective.js +++ b/web-ui/src/main/resources/catalog/components/viewer/wmsimport/WmsImportDirective.js @@ -105,7 +105,7 @@ }), type: "success" }, - 4 + 15 ); gnMap.feedLayerMd(layer); return layer; diff --git a/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js b/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js index 280d0e27e36..3baa7a89bd0 100644 --- a/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js +++ b/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js @@ -455,7 +455,7 @@ .then(refreshEntriesInfo, function (e) { gnAlertService.addAlert({ msg: $translate.instant("directoryEntry-removeError-referenced"), - delay: 5000, + delay: 5, type: "danger" }); }); diff --git a/web-ui/src/main/resources/catalog/views/default/module.js b/web-ui/src/main/resources/catalog/views/default/module.js index a3e72354245..74a74fc1c7a 100644 --- a/web-ui/src/main/resources/catalog/views/default/module.js +++ b/web-ui/src/main/resources/catalog/views/default/module.js @@ -412,7 +412,7 @@ msg: $translate.instant("layerProtocolNotSupported", { type: link.protocol }), - delay: 20000, + delay: 20, type: "warning" }); return; @@ -536,7 +536,7 @@ setActiveTab(); $scope.$on("$locationChangeSuccess", setActiveTab); - $scope.$on("$locationChangeSuccess", function (next, current) { + $scope.$on("$locationChangeSuccess", function (event, next, current) { if ( gnSearchLocation.isSearch() && (!angular.isArray(searchMap.getSize()) || searchMap.getSize()[0] < 0) @@ -545,6 +545,15 @@ searchMap.updateSize(); }, 0); } + + // Changing from the map to search pages, hide alerts + var currentUrlHash = + current.indexOf("#") > -1 ? current.slice(current.indexOf("#") + 1) : ""; + if (gnSearchLocation.isMap(currentUrlHash)) { + setTimeout(function () { + gnAlertService.closeAlerts(); + }, 0); + } }); var sortConfig = gnSearchSettings.sortBy.split("#"); From aa525736c20055ed8d0a102f1e4ed20068753a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Rodr=C3=ADguez=20Ponce?= <juanluisrp@geocat.net> Date: Tue, 30 Jul 2024 15:55:17 +0200 Subject: [PATCH 15/97] Fix a problem with recaptcha not shown sometimes (#8285) In the register user, metadata feedback and user feedback forms, sometimes the settings with the recaptcha keys takes a bit longer to load making the recaptcha widget not to load. This commit fixes that updating the values of the recaptcha settings when the settings have finished loading. It also resets the recaptcha widget if there is any problem returned by the server after sending the form. --- .../userfeedback/GnUserfeedbackDirective.js | 14 +++++--- .../userfeedback/GnmdFeedbackDirective.js | 3 ++ .../resources/catalog/js/LoginController.js | 35 ++++++++++++------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/userfeedback/GnUserfeedbackDirective.js b/web-ui/src/main/resources/catalog/components/userfeedback/GnUserfeedbackDirective.js index de197b907ac..80d6c7964e6 100644 --- a/web-ui/src/main/resources/catalog/components/userfeedback/GnUserfeedbackDirective.js +++ b/web-ui/src/main/resources/catalog/components/userfeedback/GnUserfeedbackDirective.js @@ -303,6 +303,7 @@ "Metadata", "vcRecaptchaService", "gnConfig", + "gnConfigService", function ( $http, gnUserfeedbackService, @@ -311,7 +312,8 @@ $rootScope, Metadata, vcRecaptchaService, - gnConfig + gnConfig, + gnConfigService ) { return { restrict: "AEC", @@ -322,10 +324,12 @@ templateUrl: "../../catalog/components/" + "userfeedback/partials/userfeedbacknew.html", link: function (scope) { - scope.recaptchaEnabled = - gnConfig["system.userSelfRegistration.recaptcha.enable"]; - scope.recaptchaKey = - gnConfig["system.userSelfRegistration.recaptcha.publickey"]; + gnConfigService.loadPromise.then(function () { + scope.recaptchaEnabled = + gnConfig["system.userSelfRegistration.recaptcha.enable"]; + scope.recaptchaKey = + gnConfig["system.userSelfRegistration.recaptcha.publickey"]; + }); scope.resolveRecaptcha = false; scope.userName = null; diff --git a/web-ui/src/main/resources/catalog/components/userfeedback/GnmdFeedbackDirective.js b/web-ui/src/main/resources/catalog/components/userfeedback/GnmdFeedbackDirective.js index 9405de99f71..f693181de2a 100644 --- a/web-ui/src/main/resources/catalog/components/userfeedback/GnmdFeedbackDirective.js +++ b/web-ui/src/main/resources/catalog/components/userfeedback/GnmdFeedbackDirective.js @@ -139,6 +139,9 @@ scope.mdFeedbackOpen = false; } else { scope.success = false; + if (scope.recaptchaEnabled) { + vcRecaptchaService.reload(); + } } }); } diff --git a/web-ui/src/main/resources/catalog/js/LoginController.js b/web-ui/src/main/resources/catalog/js/LoginController.js index 9a6a5de8f80..42097136212 100644 --- a/web-ui/src/main/resources/catalog/js/LoginController.js +++ b/web-ui/src/main/resources/catalog/js/LoginController.js @@ -45,6 +45,7 @@ "$window", "$timeout", "gnUtilityService", + "gnConfigService", "gnConfig", "gnGlobalSettings", "vcRecaptchaService", @@ -59,6 +60,7 @@ $window, $timeout, gnUtilityService, + gnConfigService, gnConfig, gnGlobalSettings, vcRecaptchaService, @@ -73,8 +75,23 @@ $scope.userToRemind = null; $scope.changeKey = null; - $scope.recaptchaEnabled = gnConfig["system.userSelfRegistration.recaptcha.enable"]; - $scope.recaptchaKey = gnConfig["system.userSelfRegistration.recaptcha.publickey"]; + gnConfigService.loadPromise.then(function () { + $scope.recaptchaEnabled = + gnConfig["system.userSelfRegistration.recaptcha.enable"]; + $scope.recaptchaKey = gnConfig["system.userSelfRegistration.recaptcha.publickey"]; + + // take the bigger of the two values + $scope.passwordMinLength = Math.max( + gnConfig["system.security.passwordEnforcement.minLength"], + 6 + ); + $scope.passwordMaxLength = Math.max( + gnConfig["system.security.passwordEnforcement.maxLength"], + 6 + ); + $scope.passwordPattern = gnConfig["system.security.passwordEnforcement.pattern"]; + }); + $scope.resolveRecaptcha = false; $scope.redirectUrl = gnUtilityService.getUrlParameter("redirect"); @@ -84,17 +101,6 @@ $scope.isShowLoginAsLink = gnGlobalSettings.isShowLoginAsLink; $scope.isUserProfileUpdateEnabled = gnGlobalSettings.isUserProfileUpdateEnabled; - // take the bigger of the two values - $scope.passwordMinLength = Math.max( - gnConfig["system.security.passwordEnforcement.minLength"], - 6 - ); - $scope.passwordMaxLength = Math.max( - gnConfig["system.security.passwordEnforcement.maxLength"], - 6 - ); - $scope.passwordPattern = gnConfig["system.security.passwordEnforcement.pattern"]; - function initForm() { if ($window.location.pathname.indexOf("new.password") !== -1) { // Retrieve username from URL parameter @@ -196,6 +202,9 @@ timeout: 0, type: "danger" }); + if ($scope.recaptchaEnabled) { + vcRecaptchaService.reload(); + } } ); }; From 4b0e20d3ffc53b354cc86a78c24a0f351853559b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Fri, 9 Aug 2024 06:47:44 +0200 Subject: [PATCH 16/97] Standard / ISO19139 / Fix removal of online source when multiple transfer options block are used. (#8281) * Standard / ISO19139 / Fix removal of online source when multiple transfer options block are used. Follow up of https://github.com/geonetwork/core-geonetwork/pull/7431 * Fix online resource update/delete so that it supports multiple gmd:MD_DigitalTransferOptions blocks. --------- Co-authored-by: Ian Allen <ianwallen@hotmail.com> --- .../plugin/iso19139/extract-relations.xsl | 5 ++-- .../plugin/iso19139/index-fields/index.xsl | 6 ++-- .../plugin/iso19139/process/onlinesrc-add.xsl | 28 +++++++++++++------ .../iso19139/process/onlinesrc-remove.xsl | 22 +++++++++++---- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/schemas/iso19139/src/main/plugin/iso19139/extract-relations.xsl b/schemas/iso19139/src/main/plugin/iso19139/extract-relations.xsl index 10e10352ab8..7aa2b12d7a1 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/extract-relations.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/extract-relations.xsl @@ -35,7 +35,6 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:util="java:org.fao.geonet.util.XslUtil" xmlns:digestUtils="java:org.apache.commons.codec.digest.DigestUtils" - xmlns:exslt="http://exslt.org/common" xmlns:gn-fn-rel="http://geonetwork-opensource.org/xsl/functions/relations" version="2.0" exclude-result-prefixes="#all"> @@ -110,7 +109,7 @@ <xsl:value-of select="position()"/> </idx> <hash> - <xsl:value-of select="digestUtils:md5Hex(string(exslt:node-set(normalize-space(.))))"/> + <xsl:value-of select="digestUtils:md5Hex(normalize-space(.))"/> </hash> <url> <xsl:apply-templates mode="get-iso19139-localized-string" @@ -142,7 +141,7 @@ <xsl:value-of select="position()"/> </idx> <hash> - <xsl:value-of select="digestUtils:md5Hex(string(exslt:node-set(normalize-space(.))))"/> + <xsl:value-of select="digestUtils:md5Hex(normalize-space(.))"/> </hash> <title> <xsl:apply-templates mode="get-iso19139-localized-string" diff --git a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl index d2fdc3f4a78..15f081abb99 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl @@ -34,7 +34,6 @@ xmlns:gn-fn-index="http://geonetwork-opensource.org/xsl/functions/index" xmlns:index="java:org.fao.geonet.kernel.search.EsSearchManager" xmlns:digestUtils="java:org.apache.commons.codec.digest.DigestUtils" - xmlns:exslt="http://exslt.org/common" xmlns:util="java:org.fao.geonet.util.XslUtil" xmlns:date-util="java:org.fao.geonet.utils.DateUtil" xmlns:daobs="http://daobs.org" @@ -1122,8 +1121,7 @@ <xsl:copy-of select="gn-fn-index:add-multilingual-field('orderingInstructions', ., $allLanguages)"/> </xsl:for-each> - <xsl:for-each select="gmd:transferOptions/*/ - gmd:onLine/*[gmd:linkage/gmd:URL != '']"> + <xsl:for-each select=".//gmd:onLine/*[gmd:linkage/gmd:URL != '']"> <xsl:variable name="transferGroup" select="count(ancestor::gmd:transferOptions/preceding-sibling::gmd:transferOptions)"/> @@ -1147,7 +1145,7 @@ <atomfeed><xsl:value-of select="gmd:linkage/gmd:URL"/></atomfeed> </xsl:if> <link type="object">{ - "hash": "<xsl:value-of select="digestUtils:md5Hex(string(exslt:node-set(normalize-space(.))))"/>", + "hash": "<xsl:value-of select="digestUtils:md5Hex(normalize-space(.))"/>", "idx": <xsl:value-of select="position()"/>, "protocol":"<xsl:value-of select="util:escapeForJson((gmd:protocol/*/text())[1])"/>", "mimeType":"<xsl:value-of select="if (*/gmx:MimeFileType) diff --git a/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-add.xsl b/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-add.xsl index 0afe80eaa3d..e9c86757ca4 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-add.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-add.xsl @@ -187,19 +187,29 @@ Note: It assumes that it will be adding new items in <!-- Updating the gmd:onLine based on update parameters --> <!-- Note: first part of the match needs to match the xsl:for-each select from extract-relations.xsl in order to get the position() to match --> <!-- The unique identifier is marked with resourceIdx which is the position index and resourceHash which is hash code of the current node (combination of url, resource name, and description) --> - <xsl:template - match="*//gmd:MD_DigitalTransferOptions/gmd:onLine - [gmd:CI_OnlineResource[gmd:linkage/gmd:URL!=''] and ($resourceIdx = '' or position() = xs:integer($resourceIdx))] - [($resourceHash != '' or ($updateKey != '' and normalize-space($updateKey) = concat( + <!-- Template to match all gmd:onLine elements --> + <xsl:template match="//gmd:MD_DigitalTransferOptions/gmd:onLine" priority="2"> + <!-- Calculate the global position of the current gmd:onLine element --> + <xsl:variable name="position" select="count(//gmd:MD_DigitalTransferOptions/gmd:onLine[current() >> .]) + 1" /> + + <xsl:choose> + <xsl:when test="gmd:CI_OnlineResource[gmd:linkage/gmd:URL != ''] and + ($resourceIdx = '' or $position = xs:integer($resourceIdx)) and + ($resourceHash != '' or ($updateKey != '' and normalize-space($updateKey) = concat( gmd:CI_OnlineResource/gmd:linkage/gmd:URL, gmd:CI_OnlineResource/gmd:protocol/*, gmd:CI_OnlineResource/gmd:name/gco:CharacterString))) - and ($resourceHash = '' or digestUtils:md5Hex(string(exslt:node-set(normalize-space(.)))) = $resourceHash)]" - priority="2"> - <xsl:call-template name="createOnlineSrc"/> + and ($resourceHash = '' or digestUtils:md5Hex(normalize-space(.)) = $resourceHash)"> + <xsl:call-template name="createOnlineSrc"/> + </xsl:when> + <xsl:otherwise> + <xsl:copy> + <xsl:apply-templates select="@*|node()"/> + </xsl:copy> + </xsl:otherwise> + </xsl:choose> </xsl:template> - <xsl:template name="createOnlineSrc"> <!-- Add all online source from the target metadata to the current one --> @@ -243,7 +253,7 @@ Note: It assumes that it will be adding new items in </gmd:URL> </gmd:linkage> <gmd:protocol> - <xsl:call-template name="setProtocol"/> + <xsl:call-template name="setProtocol"/> </gmd:protocol> <xsl:if test="$applicationProfile != ''"> diff --git a/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-remove.xsl b/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-remove.xsl index 718f483eced..5ea7b210773 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-remove.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/process/onlinesrc-remove.xsl @@ -53,15 +53,25 @@ Stylesheet used to remove a reference to a online resource. <!-- Remove the gmd:onLine define in url parameter --> <!-- Note: first part of the match needs to match the xsl:for-each select from extract-relations.xsl in order to get the position() to match --> <!-- The unique identifier is marked with resourceIdx which is the position index and resourceHash which is hash code of the current node (combination of url, resource name, and description) --> - <xsl:template - match="*//gmd:MD_DigitalTransferOptions/gmd:onLine - [gmd:CI_OnlineResource[gmd:linkage/gmd:URL!=''] and ($resourceIdx = '' or (count(preceding::gmd:onLine) + 1) = xs:integer($resourceIdx))] - [($resourceHash != '' or ($url != null and (normalize-space(gmd:CI_OnlineResource/gmd:linkage/gmd:URL) = $url and normalize-space(gmd:CI_OnlineResource/gmd:name/gco:CharacterString) = normalize-space($name) + <xsl:template match="//gmd:MD_DigitalTransferOptions/gmd:onLine" priority="2"> + + <!-- Calculate the global position of the current gmd:onLine element --> + <xsl:variable name="position" select="count(//gmd:MD_DigitalTransferOptions/gmd:onLine[current() >> .]) + 1" /> + + <xsl:if test="not( + gmd:CI_OnlineResource[gmd:linkage/gmd:URL != ''] and + ($resourceIdx = '' or $position = xs:integer($resourceIdx)) and + ($resourceHash != '' or ($url != null and (normalize-space(gmd:CI_OnlineResource/gmd:linkage/gmd:URL) = $url and normalize-space(gmd:CI_OnlineResource/gmd:name/gco:CharacterString) = normalize-space($name) or normalize-space(gmd:CI_OnlineResource/gmd:linkage/gmd:URL) = $url and count(gmd:CI_OnlineResource/gmd:name/gmd:PT_FreeText/gmd:textGroup[gmd:LocalisedCharacterString = $name]) > 0 or normalize-space(gmd:CI_OnlineResource/gmd:linkage/gmd:URL) = $url and normalize-space(gmd:CI_OnlineResource/gmd:protocol/*) = 'WWW:DOWNLOAD-1.0-http--download')) ) - and ($resourceHash = '' or digestUtils:md5Hex(string(exslt:node-set(normalize-space(.)))) = $resourceHash)]" - priority="2"/> + and ($resourceHash = '' or digestUtils:md5Hex(normalize-space(.)) = $resourceHash) + )"> + <xsl:copy> + <xsl:apply-templates select="@*|node()"/> + </xsl:copy> + </xsl:if> + </xsl:template> <!-- Do a copy of every node and attribute --> <xsl:template match="@*|node()"> From 79c57690ea604da26c3ea97db7adb4bad7867ed9 Mon Sep 17 00:00:00 2001 From: tylerjmchugh <163562062+tylerjmchugh@users.noreply.github.com> Date: Wed, 14 Aug 2024 06:02:51 -0400 Subject: [PATCH 17/97] Update batch PDF export to skip working copies (#8292) * Update batch PDF export to skip working copies * Capitalize boolean operators in lucene query --- .../src/main/java/org/fao/geonet/api/records/CatalogApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java b/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java index e6751f8e3ef..08d060e3ca5 100644 --- a/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/CatalogApi.java @@ -389,8 +389,8 @@ public void exportAsPdf( final SearchResponse searchResponse = searchManager.query( String.format( - "uuid:(\"%s\")", - String.join("\" or \"", uuidList)), + "uuid:(\"%s\") AND NOT draft:\"y\"", // Skip working copies as duplicate UUIDs cause the PDF xslt to fail + String.join("\" OR \"", uuidList)), EsFilterBuilder.buildPermissionsFilter(ApiUtils.createServiceContext(httpRequest)), searchFieldsForPdf, 0, maxhits); From 57bc1d5541bf03c8bdf6c452b4654fe06fb9895a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 8 Aug 2024 12:48:15 +0200 Subject: [PATCH 18/97] Record view / Improve layout of table (eg. quality measures) Related to https://github.com/geonetwork/core-geonetwork/pull/5879#issuecomment-2269506779 --- web-ui/src/main/resources/catalog/style/gn_metadata.less | 2 -- 1 file changed, 2 deletions(-) diff --git a/web-ui/src/main/resources/catalog/style/gn_metadata.less b/web-ui/src/main/resources/catalog/style/gn_metadata.less index 33ac3d63140..a830b0fe0fe 100644 --- a/web-ui/src/main/resources/catalog/style/gn_metadata.less +++ b/web-ui/src/main/resources/catalog/style/gn_metadata.less @@ -551,8 +551,6 @@ ul.container-list { margin-bottom: 0.5em; } td { - padding-left: 40px; - word-break: break-word; ul { padding-left: 0; } From b874f86e6e53a8c09d31154216174148addae4dd Mon Sep 17 00:00:00 2001 From: Francois Prunayre <fx.prunayre@gmail.com> Date: Mon, 5 Aug 2024 18:18:57 +0200 Subject: [PATCH 19/97] Index / Add maintenance details. Before only maintenance frequency was displayed but more information may be provided about the maintenance (eg. custom frequency, next update date, note). --- .../geonet/kernel/search/EsSearchManager.java | 1 + .../iso19115-3.2018/index-fields/index.xsl | 16 ++++++++ .../plugin/iso19139/index-fields/index.xsl | 16 ++++++++ .../main/resources/catalog/locales/en-v4.json | 3 ++ .../templates/recordView/maintenance.html | 38 +++++++++++++++++++ .../templates/recordView/technical.html | 17 +-------- 6 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 web-ui/src/main/resources/catalog/views/default/templates/recordView/maintenance.html diff --git a/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java b/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java index bfd783bc5f4..122e7e2930a 100644 --- a/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java @@ -573,6 +573,7 @@ private void checkIndexResponse(BulkResponse bulkItemResponses, .add("status_text") .add("coordinateSystem") .add("identifier") + .add("maintenance") .add("responsibleParty") .add("mdLanguage") .add("otherLanguage") diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl index fb86b5a225a..35ed82ac5bf 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl @@ -712,6 +712,22 @@ </spatialRepresentationType> </xsl:for-each> + <xsl:for-each select="*:resourceMaintenance/*"> + <maintenance type="object">{ + "frequency": "<xsl:value-of select="*:maintenanceAndUpdateFrequency/*/@codeListValue"/>" + <xsl:for-each select="*:dateOfNextUpdate[*/text() != '']"> + ,"nextUpdateDate": "<xsl:value-of select="*/text()"/>" + </xsl:for-each> + <xsl:for-each select="*:userDefinedMaintenanceFrequency[*/text() != '']"> + ,"userDefinedFrequency": "<xsl:value-of select="*/text()"/>" + </xsl:for-each> + <xsl:for-each select="*:maintenanceNote[*/text() != '']"> + ,"noteObject": + <xsl:value-of select="gn-fn-index:add-multilingual-field('maintenanceNote', ., $allLanguages, true())"/> + </xsl:for-each> + }</maintenance> + </xsl:for-each> + <xsl:for-each select="mri:resourceConstraints/*"> <xsl:variable name="fieldPrefix" select="local-name()"/> diff --git a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl index 15f081abb99..c2a7ee33ec8 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl @@ -656,6 +656,22 @@ </xsl:for-each> + <xsl:for-each select="gmd:resourceMaintenance/*"> + <maintenance type="object">{ + "frequency": "<xsl:value-of select="*:maintenanceAndUpdateFrequency/*/@codeListValue"/>" + <xsl:for-each select="gmd:dateOfNextUpdate[*/text() != '']"> + ,"nextUpdateDate": "<xsl:value-of select="*/text()"/>" + </xsl:for-each> + <xsl:for-each select="gmd:userDefinedMaintenanceFrequency[*/text() != '']"> + ,"userDefinedFrequency": "<xsl:value-of select="*/text()"/>" + </xsl:for-each> + <xsl:for-each select="gmd:maintenanceNote[*/text() != '']"> + ,"noteObject": + <xsl:value-of select="gn-fn-index:add-multilingual-field('maintenanceNote', ., $allLanguages, true())"/> + </xsl:for-each> + }</maintenance> + </xsl:for-each> + <xsl:for-each select="gmd:resourceConstraints/*"> <xsl:variable name="fieldPrefix" select="local-name()"/> <xsl:for-each select="gmd:otherConstraints"> diff --git a/web-ui/src/main/resources/catalog/locales/en-v4.json b/web-ui/src/main/resources/catalog/locales/en-v4.json index e412c79f700..266f5e5bf43 100644 --- a/web-ui/src/main/resources/catalog/locales/en-v4.json +++ b/web-ui/src/main/resources/catalog/locales/en-v4.json @@ -405,6 +405,9 @@ "measureDescription": "Description", "measureValue": "Value", "measureDate": "Date", + "nextUpdateDate": "Next update", + "userDefinedFrequency": "Update frequency", + "maintenanceNote": "Maintenance note", "switchPortals": "Switch to another Portal", "dataPreview": "Discover data", "tableOfContents": "Table of Contents", diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/maintenance.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/maintenance.html new file mode 100644 index 00000000000..a2672e5df09 --- /dev/null +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/maintenance.html @@ -0,0 +1,38 @@ +<div data-ng-repeat="maintenance in mdView.current.record.maintenance"> + <div data-ng-if="maintenance.frequency" class="gn-margin-bottom flex-row"> + <span class="badge badge-rounded" title="{{'updateFrequency' | translate}}"> + <i class="fa fa-fw fa-rotate"></i> + </span> + <div> + <h3 data-translate="">updateFrequency</h3> + <p>{{maintenance.frequency | translate}}</p> + </div> + </div> + <div data-ng-if="maintenance.noteObject.default" class="gn-margin-bottom flex-row"> + <span class="badge badge-rounded" title="{{'maintenanceNote' | translate}}"> + <i class="fa fa-fw fa-rotate"></i> + </span> + <div> + <h3 data-translate="">maintenanceNote</h3> + <p>{{maintenance.noteObject.default}}</p> + </div> + </div> + <div data-ng-if="maintenance.nextUpdateDate" class="gn-margin-bottom flex-row"> + <span class="badge badge-rounded" title="{{'nextUpdateDate' | translate}}"> + <i class="fa fa-fw fa-calendar-plus"></i> + </span> + <div> + <h3 data-translate="">nextUpdateDate</h3> + <p>{{maintenance.nextUpdateDate}}</p> + </div> + </div> + <div data-ng-if="maintenance.userDefinedFrequency" class="gn-margin-bottom flex-row"> + <span class="badge badge-rounded" title="{{'userDefinedFrequency' | translate}}"> + <i class="fa fa-fw fa-rotate"></i> + </span> + <div> + <h3 data-translate="">userDefinedFrequency</h3> + <p data-gn-field-duration-div="{{maintenance.userDefinedFrequency}}"></p> + </div> + </div> +</div> diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html index a6bfc157cba..5c68e76a547 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html @@ -22,6 +22,8 @@ <h3>{{date.type | translate}}</h3> </ul> </section> + <div ng-include="'../../catalog/views/default/templates/recordView/maintenance.html'"></div> + <div data-ng-if="mdView.current.record.serviceType" class="gn-margin-bottom flex-row"> <span class="badge badge-rounded" title="{{'serviceType' | translate}}"> <i class="fa fa-fw fa-cloud"></i> @@ -49,21 +51,6 @@ <h3 data-translate="">cl_couplingType</h3> <p data-ng-repeat="c in mdView.current.record.cl_couplingType">{{c.default}}</p> </div> </div> - - <div - data-ng-if="mdView.current.record.cl_maintenanceAndUpdateFrequency.length > 0" - class="gn-margin-bottom flex-row" - > - <span class="badge badge-rounded" title="{{'updateFrequency' | translate}}"> - <i class="fa fa-fw fa-language"></i> - </span> - <div> - <h3 data-translate="">updateFrequency</h3> - <p data-ng-repeat="c in mdView.current.record.cl_maintenanceAndUpdateFrequency"> - {{c.default}} - </p> - </div> - </div> </div> <div> From 0331328b2bdacb00e2b2edc17caa8e5cca6932a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 22 Aug 2024 08:40:14 +0200 Subject: [PATCH 20/97] Standard / ISO19139 / i18n / Missing french translation (#8298) On application startup, the translation pack may report an error like the following ``` org.fao.geonet.api.exception.ResourceNotFoundException at org.fao.geonet.api.standards.StandardsUtils.getCodelistOrLabel(StandardsUtils.java:72) at org.fao.geonet.api.standards.StandardsUtils.getLabel(StandardsUtils.java:55) at org.fao.geonet.api.tools.i18n.TranslationPackBuilder.getStandardLabel(TranslationPackBuilder.java:217) ``` due to a missing french translation for element `DQ_EvaluationMethodTypeCode` Follow up of https://github.com/geonetwork/core-geonetwork/pull/7180 --- schemas/iso19139/src/main/plugin/iso19139/loc/fre/labels.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schemas/iso19139/src/main/plugin/iso19139/loc/fre/labels.xml b/schemas/iso19139/src/main/plugin/iso19139/loc/fre/labels.xml index b2e388944d9..ff12a90122d 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/loc/fre/labels.xml +++ b/schemas/iso19139/src/main/plugin/iso19139/loc/fre/labels.xml @@ -359,7 +359,10 @@ n’est pas respectée. </help> <condition/> - + </element> + <element name="gmd:DQ_EvaluationMethodTypeCode"> + <label>Code du type de méthode d'évaluation</label> + <description>Type de méthode d'évaluation d'une mesure de qualité de données identifiée</description> </element> <element name="gmd:DQ_FormatConsistency" id="114.0"> <label>Cohérence du format</label> From 4a57a0278ff9b109555cb23c4751491e993aacab Mon Sep 17 00:00:00 2001 From: "mel-rie (CONET ISB / LGL)" <56172653+rime1014@users.noreply.github.com> Date: Thu, 22 Aug 2024 08:54:20 +0200 Subject: [PATCH 21/97] harvesting CSW: changed loglevel for invalid metadata to info (#8303) - other harvester have same or higher loglevel as well - helps to identify invalid metadata --- .../org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java index 8ba9e1e31af..88942e4ec86 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java @@ -539,7 +539,7 @@ private Element retrieveMetadata(String uuid) { params.getValidate().validate(dataMan, context, response, groupIdVal); } catch (Exception e) { - log.debug("Ignoring invalid metadata with uuid " + uuid); + log.info("Ignoring invalid metadata with uuid " + uuid); result.doesNotValidate++; return null; } From 347dc96f123dc30b9ab4685ea64ebd90c8d14ef7 Mon Sep 17 00:00:00 2001 From: tylerjmchugh <Tyler.McHugh@dfo-mpo.gc.ca> Date: Thu, 22 Aug 2024 14:43:32 -0400 Subject: [PATCH 22/97] Modify GnMdViewController to set recordIdentifierRequested using the getUuid function --- .../resources/catalog/components/search/mdview/mdviewModule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/components/search/mdview/mdviewModule.js b/web-ui/src/main/resources/catalog/components/search/mdview/mdviewModule.js index 1310e4a4810..a58b4ae60f3 100644 --- a/web-ui/src/main/resources/catalog/components/search/mdview/mdviewModule.js +++ b/web-ui/src/main/resources/catalog/components/search/mdview/mdviewModule.js @@ -85,7 +85,7 @@ $scope.gnMetadataActions = gnMetadataActions; $scope.url = location.href; $scope.compileScope = $scope.$new(); - $scope.recordIdentifierRequested = gnSearchLocation.uuid; + $scope.recordIdentifierRequested = gnSearchLocation.getUuid(); $scope.isUserFeedbackEnabled = false; $scope.isRatingEnabled = false; $scope.showCitation = false; From 22a87f68d2ec74ddbed86a83e0208fc2a8ce262d Mon Sep 17 00:00:00 2001 From: tylerjmchugh <163562062+tylerjmchugh@users.noreply.github.com> Date: Tue, 27 Aug 2024 05:49:22 -0400 Subject: [PATCH 23/97] Modify record not found message to only link to signin if user is not logged in (#8312) --- .../resources/catalog/locales/en-search.json | 4 ++-- .../default/templates/recordView/recordView.html | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/web-ui/src/main/resources/catalog/locales/en-search.json b/web-ui/src/main/resources/catalog/locales/en-search.json index 65a4d70eba6..9a2a2be6837 100644 --- a/web-ui/src/main/resources/catalog/locales/en-search.json +++ b/web-ui/src/main/resources/catalog/locales/en-search.json @@ -366,8 +366,8 @@ "shareOnLinkedIn": "Share on LinkedIn", "shareByEmail": "Share by email", "zoomto": "Zoom To", - "recordNotFound": "The record with identifier <strong>{{uuid}}</strong> was not found or is not shared with you. Try to <a href=\"catalog.signin?redirect={{url}}\">sign in</a> if you've an account.", - "intersectWith": "Intersects with", + "recordNotFound": "The record with identifier <strong>{{uuid}}</strong> was not found or is not shared with you.", + "trySignIn": "Try to <a href=\"catalog.signin?redirect={{url}}\">sign in</a> if you've an account.", "intersectWith": "Intersects with", "fullyOutsideOf": "Fully outside of", "encloses": "Enclosing", "within": "Within", diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/recordView.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/recordView.html index 846ef56531a..9d6ec37f733 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/recordView.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/recordView.html @@ -35,10 +35,20 @@ <div class="alert alert-warning" data-ng-hide="!mdView.loadDetailsFinished || mdView.current.record" - data-translate="" - data-translate-values="{uuid: '{{recordIdentifierRequested | htmlToPlaintext}}', url: '{{url | encodeURIComponent}}'}" > - recordNotFound + <span + data-translate="" + data-translate-values="{uuid: '{{recordIdentifierRequested | htmlToPlaintext}}'}" + > + recordNotFound + </span> + <span + data-ng-hide="user" + data-translate="" + data-translate-values="{url: '{{url | encodeURIComponent}}'}" + > + trySignIn + </span> </div> <div class="row" data-ng-show="!mdView.loadDetailsFinished"> <i class="fa fa-spinner fa-spin fa-3x fa-fw"></i> From 36951d179d5b63b2e9134cf84987dc402acda86b Mon Sep 17 00:00:00 2001 From: Jody Garnett <jody.garnett@gmail.com> Date: Thu, 29 Aug 2024 03:10:34 -0700 Subject: [PATCH 24/97] Repository Citation.cff metadata for DOI registration with Zenodo (#8317) * Repository Citation.cff metadata for DUI regestration with zenodo * Update CITATION.cff Minor updates, additions and clean up * Update CITATION.cff Simplified the list to only include active PSC members --------- Co-authored-by: Jeroen Ticheler <Jeroen.Ticheler@GeoCat.net> --- CITATION.cff | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 00000000000..1cdaa3768cf --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,88 @@ +# This CITATION.cff file was generated with cffinit. +# Visit https://bit.ly/cffinit to generate yours today! + +cff-version: 1.2.0 +title: GeoNetwork opensource +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: François + family-names: Prunayre + affiliation: Titellus + - given-names: Jose + family-names: García + affiliation: GeoCat BV + - given-names: Jeroen + family-names: Ticheler + affiliation: GeoCat BV + orcid: 'https://orcid.org/0009-0003-3896-0437' + email: jeroen.ticheler@geocat.net + - given-names: Florent + family-names: Gravin + affiliation: CamptoCamp + - given-names: Simon + family-names: Pigot + affiliation: CSIRO Australia + - name: GeoCat BV + address: Veenderweg 13 + city: Bennekom + country: NL + post-code: 6721 WD + tel: +31 (0) 318 416 664 + website: 'https://www.geocat.net/' + email: info@geocat.net + - name: Titellus + address: 321 Route de la Mollière + city: Saint Pierre de Genebroz + country: FR + post-code: 73360 + website: 'https://titellus.net/' + email: fx.prunayre@titellus.net + - name: CamptoCamp + address: QG Center Rte de la Chaux 4 + city: Bussigny + country: CH + post-code: 1030 + tel: +41 (21) 619 10 10 + website: 'https://camptocamp.com/' + email: info@camptocamp.com + - name: Open Source Geospatial Foundation - OSGeo + address: '9450 SW Gemini Dr. #42523' + location: Beaverton + region: Oregon + post-code: '97008' + country: US + email: info@osgeo.org + website: 'https://www.osgeo.org/' +repository-code: 'http://github.com/geonetwork/core-geonetwork' +url: 'https://geonetwork-opensource.org' +repository-artifact: >- + https://sourceforge.net/projects/geonetwork/files/GeoNetwork_opensource/ +abstract: >- + GeoNetwork is a catalog application to manage spatial and + non-spatial resources. It is compliant with critical + international standards from ISO, OGC and INSPIRE. It + provides powerful metadata editing and search functions as + well as an interactive web map viewer. +keywords: + - catalog + - gis + - sdi + - spatial data infrastructure + - dataspace + - search + - open data + - standards + - spatial + - CSW + - OGCAPI Records + - DCAT + - GeoDCAT-AP + - Catalog Service + - OGC + - open geospatial consortium + - osgeo + - open source geospatial foundation +license: GPL-2.0 From 849619b5574301d2af69440ca9943e8dcc76dce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 29 Aug 2024 16:46:59 +0200 Subject: [PATCH 25/97] Social links in metadata page doesn't have the metadata page permalink. Fixes #8322 --- .../search/mdview/mdviewDirective.js | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js b/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js index 4f9f2e6546c..f91c671e018 100644 --- a/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js +++ b/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js @@ -588,15 +588,20 @@ }, link: function (scope, element, attrs) { scope.mdService = gnUtilityService; - scope.$watch(scope.md, function (newVal, oldVal) { - if (newVal !== null && newVal !== oldVal) { - $http - .get("../api/records/" + scope.md.getUuid() + "/permalink") - .then(function (r) { - scope.socialMediaLink = r.data; - }); - } - }); + + scope.$watch( + "md", + function (newVal, oldVal) { + if (newVal !== null && newVal !== oldVal) { + $http + .get("../api/records/" + scope.md.getUuid() + "/permalink") + .then(function (r) { + scope.socialMediaLink = r.data; + }); + } + }, + true + ); } }; } From a9a9b5bb2c1b0314af73c8c449078e8b46f56cab Mon Sep 17 00:00:00 2001 From: Tobias Hotz <tobias.hotz@conet-isb.de> Date: Mon, 26 Aug 2024 08:34:03 +0200 Subject: [PATCH 26/97] Do not try to request clipboard permissions Clipboard permissions are only implemented in Chromium-based browsers. See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard for more details Instead, check if the browser supports the writeText/readText clipboard functions (some mobile browsers and older firefox versions do not). With these change, both Chromium-based browsers and other browsers such as firefox work correctly --- .../components/utility/UtilityDirective.js | 56 ++++++++----------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js b/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js index 80834e2d4ec..425ce230238 100644 --- a/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js +++ b/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js @@ -1143,45 +1143,35 @@ return { copy: function (toCopy) { var deferred = $q.defer(); - navigator.permissions.query({ name: "clipboard-write" }).then( - function (result) { - if (result.state == "granted" || result.state == "prompt") { - navigator.clipboard.writeText(toCopy).then( - function () { - deferred.resolve(); - }, - function (r) { - console.warn(r); - deferred.reject(); - } - ); + if (navigator.clipboard?.writeText) { + navigator.clipboard.writeText(toCopy).then( + function () { + deferred.resolve(); + }, + function (r) { + console.warn(r); + deferred.reject(); } - }, - function () { - deferred.reject(); - } - ); + ); + } else { + deferred.reject(); + } return deferred.promise; }, paste: function () { var deferred = $q.defer(); - navigator.permissions.query({ name: "clipboard-read" }).then( - function (result) { - if (result.state == "granted" || result.state == "prompt") { - navigator.clipboard.readText().then( - function (text) { - deferred.resolve(text); - }, - function () { - deferred.reject(); - } - ); + if (navigator.clipboard?.readText) { + navigator.clipboard.readText().then( + function (text) { + deferred.resolve(text); + }, + function () { + deferred.reject(); } - }, - function () { - deferred.reject(); - } - ); + ); + } else { + deferred.reject(); + } return deferred.promise; } }; From 568c4d723f79378a9dc9c3511464e1721cdabc76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Fri, 23 Aug 2024 08:58:35 +0200 Subject: [PATCH 27/97] Special characters in the cookie causing 400 bad requests from Spring Security. Fixes #8275 --- .../web/GeoNetworkStrictHttpFirewall.java | 47 +++++++++++++++++++ .../config-security/config-security-core.xml | 6 +++ 2 files changed, 53 insertions(+) create mode 100644 core/src/main/java/org/fao/geonet/web/GeoNetworkStrictHttpFirewall.java diff --git a/core/src/main/java/org/fao/geonet/web/GeoNetworkStrictHttpFirewall.java b/core/src/main/java/org/fao/geonet/web/GeoNetworkStrictHttpFirewall.java new file mode 100644 index 00000000000..cdf34c45f18 --- /dev/null +++ b/core/src/main/java/org/fao/geonet/web/GeoNetworkStrictHttpFirewall.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.web; + +import org.springframework.security.web.firewall.StrictHttpFirewall; + +import java.util.regex.Pattern; + +import static java.nio.charset.StandardCharsets.ISO_8859_1; +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Spring Security HttpFirewall that allows parsing UTF8 header values. + */ +public class GeoNetworkStrictHttpFirewall extends StrictHttpFirewall { + private static final Pattern ALLOWED_HEADER_VALUE_PATTERN = Pattern.compile("[\\p{IsAssigned}&&[^\\p{IsControl}]]*"); + + public GeoNetworkStrictHttpFirewall() { + super(); + + this.setAllowedHeaderValues(header -> { + String parsed = new String(header.getBytes(ISO_8859_1), UTF_8); + return ALLOWED_HEADER_VALUE_PATTERN.matcher(parsed).matches(); + }); + } +} diff --git a/web/src/main/webapp/WEB-INF/config-security/config-security-core.xml b/web/src/main/webapp/WEB-INF/config-security/config-security-core.xml index f83fa3e0bc9..c769833cefa 100644 --- a/web/src/main/webapp/WEB-INF/config-security/config-security-core.xml +++ b/web/src/main/webapp/WEB-INF/config-security/config-security-core.xml @@ -65,8 +65,14 @@ <ref bean="coreFilterChain"/> </list> </constructor-arg> + + <property name="firewall" ref="httpFirewall"/> </bean> + <!-- HttpFirewall that parses UTF8 header values --> + <bean id="httpFirewall" + class="org.fao.geonet.web.GeoNetworkStrictHttpFirewall"> + </bean> <bean id="coreFilterChain" class="org.springframework.security.web.DefaultSecurityFilterChain"> From 60d54f0d1bf82aa35790d7fb38ededae202aed28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Wed, 5 Jun 2024 11:17:32 +0200 Subject: [PATCH 28/97] INSPIRE Atom harvester / process only public datasets by resource identifier --- .../fao/geonet/inspireatom/util/InspireAtomUtil.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/inspire-atom/src/main/java/org/fao/geonet/inspireatom/util/InspireAtomUtil.java b/inspire-atom/src/main/java/org/fao/geonet/inspireatom/util/InspireAtomUtil.java index a452d0733d0..622f8fe4ca3 100644 --- a/inspire-atom/src/main/java/org/fao/geonet/inspireatom/util/InspireAtomUtil.java +++ b/inspire-atom/src/main/java/org/fao/geonet/inspireatom/util/InspireAtomUtil.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2023 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -63,7 +63,7 @@ * @author Jose García */ public class InspireAtomUtil { - private final static String EXTRACT_DATASETS_FROM_SERVICE_XSLT = "extract-datasetinfo-from-service-feed.xsl"; + private static final String EXTRACT_DATASETS_FROM_SERVICE_XSLT = "extract-datasetinfo-from-service-feed.xsl"; /** * Xslt process to get the related datasets in service metadata. @@ -395,7 +395,15 @@ public static String retrieveDatasetUuidFromIdentifier(EsSearchManager searchMan " \"value\": \"%s\"" + " }" + " }" + + " }," + + " {" + + " \"term\": {" + + " \"isPublishedToAll\": {" + + " \"value\": \"true\"" + + " }" + + " }" + " }" + + " ]" + " }" + "}"; From 2615fa7eea71bdfd2b599b3a992c8ea241fc0559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Mon, 2 Sep 2024 10:45:41 +0200 Subject: [PATCH 29/97] Workflow / update notification level based on user profile when cancelling a submission (#8264) * Workflow / update notification level based on user profile when cancelling a submission: - cancel working copy (from editor) --> should be notified the reviewer. - rejection (from reviewer) --> should be notified the editor. * Update core/src/main/java/org/fao/geonet/kernel/metadata/DefaultStatusActions.java Co-authored-by: Ian <ianwallen@hotmail.com> * Fix code suggestion missing bracket --------- Co-authored-by: Ian <ianwallen@hotmail.com> --- .../kernel/metadata/DefaultStatusActions.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/fao/geonet/kernel/metadata/DefaultStatusActions.java b/core/src/main/java/org/fao/geonet/kernel/metadata/DefaultStatusActions.java index cdb7a8bf8f7..58cc82a4459 100644 --- a/core/src/main/java/org/fao/geonet/kernel/metadata/DefaultStatusActions.java +++ b/core/src/main/java/org/fao/geonet/kernel/metadata/DefaultStatusActions.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2023 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -369,6 +369,25 @@ protected List<User> getUserToNotify(MetadataStatus status) { return new ArrayList<>(); } + // If status is DRAFT and previous status is SUBMITTED, which means either: + // - a cancel working copy (from editor) --> should be notified the reviewer. + // - rejection (from reviewer) --> should be notified the editor. + // and the notification level is recordUserAuthor or recordProfileReviewer, + // then adjust the notification level, depending on the user role + if ((status.getStatusValue().getId() == Integer.parseInt(StatusValue.Status.DRAFT)) && + (!StringUtils.isEmpty(status.getPreviousState()) && + (status.getPreviousState().equals(StatusValue.Status.SUBMITTED))) && + (notificationLevel.equals(StatusValueNotificationLevel.recordUserAuthor) || (notificationLevel.equals(StatusValueNotificationLevel.recordProfileReviewer)))) { + UserRepository userRepository = ApplicationContextHolder.get().getBean(UserRepository.class); + Optional<User> user = userRepository.findById(status.getUserId()); + if (user.isPresent()) { + if (user.get().getProfile() == Profile.Editor) { + notificationLevel = StatusValueNotificationLevel.recordProfileReviewer; + } else { + notificationLevel = StatusValueNotificationLevel.recordUserAuthor; + } + } + } // TODO: Status does not provide batch update // So taking care of one record at a time. // Currently the code could notify a mix of reviewers From 10c99f6eb832cf26fca415267417839d557b7229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Mon, 2 Sep 2024 10:47:01 +0200 Subject: [PATCH 30/97] Editor / Dublin core / Fix extent coordinates (#8258) Fixes https://github.com/geonetwork/core-geonetwork/issues/8255 Co-authored-by: ByronCinNZ <cochranes4@eml.cc> --- .../resources/catalog/components/common/map/mapService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/common/map/mapService.js b/web-ui/src/main/resources/catalog/components/common/map/mapService.js index a2af666d1f6..ab9420fb2a6 100644 --- a/web-ui/src/main/resources/catalog/components/common/map/mapService.js +++ b/web-ui/src/main/resources/catalog/components/common/map/mapService.js @@ -747,10 +747,10 @@ extent[1] + ", " + "East " + - extent[0] + + extent[2] + ", " + "West " + - extent[2]; + extent[0]; if (location) { dc += ". " + location; } From 1e643bd49404315f390bd19054c9f8edff5dd32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Mon, 2 Sep 2024 10:48:01 +0200 Subject: [PATCH 31/97] Indexing / Draft field MUST not be an array (#8242) In case of XSL error, index document was containing an array instead of single value ``` "draft": [ "n", "n" ], ``` Draft field is added by the database info so no need to add it again on XSL error. Properly set it in case of indexing error. not causing issue in current app (but will be more strict in index document model). --- .../geonet/kernel/search/EsSearchManager.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java b/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java index 122e7e2930a..978ab63a750 100644 --- a/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/search/EsSearchManager.java @@ -29,8 +29,8 @@ import co.elastic.clients.elasticsearch.core.bulk.BulkOperation; import co.elastic.clients.elasticsearch.core.bulk.UpdateOperation; import co.elastic.clients.elasticsearch.core.search.Hit; -import co.elastic.clients.elasticsearch.indices.*; import co.elastic.clients.elasticsearch.indices.ExistsRequest; +import co.elastic.clients.elasticsearch.indices.*; import co.elastic.clients.transport.endpoints.BooleanResponse; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -73,8 +73,7 @@ import java.util.*; import static org.fao.geonet.constants.Geonet.IndexFieldNames.IS_TEMPLATE; -import static org.fao.geonet.kernel.search.IndexFields.INDEXING_ERROR_FIELD; -import static org.fao.geonet.kernel.search.IndexFields.INDEXING_ERROR_MSG; +import static org.fao.geonet.kernel.search.IndexFields.*; public class EsSearchManager implements ISearchManager { @@ -216,7 +215,6 @@ private void addMDFields(Element doc, Path schemaDir, doc.addContent(new Element(INDEXING_ERROR_FIELD).setText("true")); doc.addContent(createIndexingErrorMsgElement("indexingErrorMsg-indexingStyleSheetError", "error", Map.of("message", e.getMessage()))); - doc.addContent(new Element(IndexFields.DRAFT).setText("n")); } } @@ -225,7 +223,7 @@ private void addMoreFields(Element doc, Multimap<String, Object> fields) { fields.entries().forEach(e -> { Element newElement = new Element(e.getKey()) .setText(String.valueOf(e.getValue())); - if(objectFields.contains(e.getKey())) { + if (objectFields.contains(e.getKey())) { newElement.setAttribute("type", "object"); } doc.addContent(newElement); @@ -349,6 +347,7 @@ public BulkResponse updateFields(String id, Multimap<String, Object> fields, Set fields.asMap().forEach((e, v) -> fieldMap.put(e, v.toArray())); return updateFields(id, fieldMap, fieldsToRemove); } + public BulkResponse updateFields(String id, Map<String, Object> fieldMap, Set<String> fieldsToRemove) throws IOException { fieldMap.put(Geonet.IndexFieldNames.INDEXING_DATE, new Date()); @@ -404,7 +403,7 @@ public void updateFieldsAsynch(String id, Map<String, Object> fields) { if (exception != null) { LOGGER.error("Failed to index {}", exception); } else { - LOGGER.info("Updated fields for document {}", id); + LOGGER.info("Updated fields for document {}", id); } }); } @@ -479,7 +478,7 @@ private void sendDocumentsToIndex() { } catch (Exception e) { LOGGER.error( "An error occurred while indexing {} documents in current indexing list. Error is {}.", - listOfDocumentsToIndex.size(), e.getMessage()); + listOfDocumentsToIndex.size(), e.getMessage()); } finally { // TODO: Trigger this async ? documents.keySet().forEach(uuid -> overviewFieldUpdater.process(uuid)); @@ -502,6 +501,7 @@ private void checkIndexResponse(BulkResponse bulkItemResponses, String id = ""; String uuid = ""; String isTemplate = ""; + String isDraft = ""; String failureDoc = documents.get(e.id()); try { @@ -510,13 +510,14 @@ private void checkIndexResponse(BulkResponse bulkItemResponses, id = node.get(IndexFields.DBID).asText(); uuid = node.get("uuid").asText(); isTemplate = node.get(IS_TEMPLATE).asText(); + isDraft = node.get(DRAFT).asText(); } catch (Exception ignoredException) { } docWithErrorInfo.put(IndexFields.DBID, id); docWithErrorInfo.put("uuid", uuid); docWithErrorInfo.put(IndexFields.RESOURCE_TITLE, resourceTitle); docWithErrorInfo.put(IS_TEMPLATE, isTemplate); - docWithErrorInfo.put(IndexFields.DRAFT, "n"); + docWithErrorInfo.put(IndexFields.DRAFT, isDraft); docWithErrorInfo.put(INDEXING_ERROR_FIELD, true); ArrayNode errors = docWithErrorInfo.putArray(INDEXING_ERROR_MSG); errors.add(createIndexingErrorMsgObject(e.error().reason(), "error", Map.of())); @@ -539,7 +540,7 @@ private void checkIndexResponse(BulkResponse bulkItemResponses, BulkResponse response = client.bulkRequest(defaultIndex, listErrorOfDocumentsToIndex); if (response.errors()) { LOGGER.error("Failed to save error documents {}.", - Arrays.toString(errorDocumentIds.toArray())); + Arrays.toString(errorDocumentIds.toArray())); } } } @@ -675,7 +676,7 @@ public ObjectNode documentToJson(Element xml) { mapper.readTree(node.getTextNormalize())); } catch (IOException e) { LOGGER.error("Parsing invalid JSON node {} for property {}. Error is: {}", - node.getTextNormalize(), propertyName, e.getMessage()); + node.getTextNormalize(), propertyName, e.getMessage()); } } else { arrayNode.add( @@ -694,7 +695,7 @@ public ObjectNode documentToJson(Element xml) { )); } catch (IOException e) { LOGGER.error("Parsing invalid JSON node {} for property {}. Error is: {}", - nodeElements.get(0).getTextNormalize(), propertyName, e.getMessage()); + nodeElements.get(0).getTextNormalize(), propertyName, e.getMessage()); } } else { doc.put(propertyName, @@ -707,7 +708,8 @@ public ObjectNode documentToJson(Element xml) { } - /** Field starting with _ not supported in Kibana + /** + * Field starting with _ not supported in Kibana * Those are usually GN internal fields */ private String getPropertyName(String name) { @@ -935,12 +937,12 @@ public boolean isIndexWritable(String indexName) throws IOException, Elasticsear String indexBlockRead = "index.blocks.read_only_allow_delete"; GetIndicesSettingsRequest request = GetIndicesSettingsRequest.of( - b -> b.index(indexName) - .name(indexBlockRead) + b -> b.index(indexName) + .name(indexBlockRead) ); GetIndicesSettingsResponse settings = this.client.getClient() - .indices().getSettings(request); + .indices().getSettings(request); IndexState indexState = settings.get(indexBlockRead); @@ -951,7 +953,7 @@ public boolean isIndexWritable(String indexName) throws IOException, Elasticsear /** * Make a JSON Object that properly represents an indexingErrorMsg, to be used in the index. * - * @param type either 'error' or 'warning' + * @param type either 'error' or 'warning' * @param string a string that is translatable (see, e.g., en-search.json) * @param values values that replace the placeholders in the `string` parameter * @return a json object that represents an indexingErrorMsg @@ -962,7 +964,7 @@ public ObjectNode createIndexingErrorMsgObject(String string, String type, Map<S indexingErrorMsg.put("string", string); indexingErrorMsg.put("type", type); ObjectNode valuesObject = objectMapper.createObjectNode(); - values.forEach((k,v) -> valuesObject.put(k, String.valueOf(v))); + values.forEach((k, v) -> valuesObject.put(k, String.valueOf(v))); indexingErrorMsg.set("values", valuesObject); return indexingErrorMsg; } @@ -970,7 +972,7 @@ public ObjectNode createIndexingErrorMsgObject(String string, String type, Map<S /** * Create an Element that represents an indexingErrorMsg object, to be used in the index. * - * @param type either 'error' or 'warning' + * @param type either 'error' or 'warning' * @param string a string that is translatable (see, e.g., en-search.json) * @param values values that replace the placeholders in the `string` parameter * @return an Element that represents an indexingErrorMsg From 1094237d90dde96f233e4199af89907ba442fc1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Mon, 2 Sep 2024 13:56:40 +0200 Subject: [PATCH 32/97] Fix Clipboard copy/paste on Firefox - use ES5 (#8332) Follow up of #8320, that causes issues in 4.2.x. Added the change to main branch to avoid issues in future backports of changes in this file. --- .../resources/catalog/components/utility/UtilityDirective.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js b/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js index 425ce230238..493c85a99f6 100644 --- a/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js +++ b/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js @@ -1143,7 +1143,7 @@ return { copy: function (toCopy) { var deferred = $q.defer(); - if (navigator.clipboard?.writeText) { + if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(toCopy).then( function () { deferred.resolve(); @@ -1160,7 +1160,7 @@ }, paste: function () { var deferred = $q.defer(); - if (navigator.clipboard?.readText) { + if (navigator.clipboard && navigator.clipboard.readText) { navigator.clipboard.readText().then( function (text) { deferred.resolve(text); From dc0f78a585934e5cdfbfb082eeb9c6d2864127c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Mon, 2 Sep 2024 14:47:40 +0200 Subject: [PATCH 33/97] Standard / ISO19115-3 / Formatters / ISO19139 / Ignore mcc linkage for overview (#8225) Overview file name is stored in `mcc:fileName` --- .../plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl index 4955ec576ca..764011f4819 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/toISO19139.xsl @@ -1115,5 +1115,6 @@ mcc:MD_Identifier/mcc:description| mrl:LI_Source/mrl:scope| mrl:sourceSpatialResolution| - mdq:derivedElement" priority="2"/> + mdq:derivedElement| + mri:graphicOverview/mcc:MD_BrowseGraphic/mcc:linkage" priority="2"/> </xsl:stylesheet> From 6f4e79ae4f59a4e80c2cfd08c40aabdc1c44dd12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Mon, 2 Sep 2024 16:48:57 +0200 Subject: [PATCH 34/97] Admin / Source / Improve dirty state (#8222) * Admin / Source / Improve dirty state Due to wrong `form` tag placement, dirty state was only set when changing portal id and filter - not UI config, service or logo. Reorganize the form to improve this, so that save action is enabled when changing the form. Also keep the logo form upload not nested (because it would not work) * Update SourcesController.js * Admin / Source / Hide logo if not available. --- .../catalog/js/admin/SourcesController.js | 2 +- .../templates/admin/settings/sources.html | 221 +++++++++--------- 2 files changed, 112 insertions(+), 111 deletions(-) diff --git a/web-ui/src/main/resources/catalog/js/admin/SourcesController.js b/web-ui/src/main/resources/catalog/js/admin/SourcesController.js index 2a6c5e86e62..c83ff220c7c 100644 --- a/web-ui/src/main/resources/catalog/js/admin/SourcesController.js +++ b/web-ui/src/main/resources/catalog/js/admin/SourcesController.js @@ -211,7 +211,7 @@ $scope.deleteSourceLogo = function () { $scope.source.logo = null; - // $scope.updateSource(); + $scope.gnSourceForm.$setDirty(); }; // upload directive options diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/sources.html b/web-ui/src/main/resources/catalog/templates/admin/settings/sources.html index a0315d50b0f..56edf2a2bb6 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/settings/sources.html +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/sources.html @@ -50,6 +50,7 @@ {{::s.name}} <img class="gn-source-logo" + onerror="this.style.display='none'" data-ng-src="{{'../../images/' + (s.type === 'subportal' ? 'harvesting/' + s.logo : 'logos/' + s.uuid + '.png')}}" /> </a> @@ -169,6 +170,20 @@ </p> </div> + <table class="table table-striped"> + <tr data-ng-repeat="(key, value) in source.label"> + <td>{{key | translate}}</td> + <td> + <input + type="text" + class="form-control" + value="{{value}}" + data-ng-model="source.label[key]" + /> + </td> + </tr> + </table> + <label data-translate="">sourceFilter</label> <input type="text" class="form-control" data-ng-model="source.filter" /> <p class="help-block" data-translate="">sourceFilter-help</p> @@ -177,130 +192,116 @@ <span data-translate="">displayInHeaderSwitcher</span> </label> <p class="help-block" data-translate="">displayInHeaderSwitcher-help</p> - </form> - <div> - <label data-translate="">sourceLogo</label> + <label data-translate="">sourceUiConfig</label> + <select + id="uiConfigurationList" + class="form-control" + data-ng-options="c.id as c.id for (key, c) in uiConfigurations | orderBy: 'id'" + data-ng-model="source.uiConfig" + ></select> + <p class="help-block" data-translate="">sourceUiConfig-help</p> - <div class="row" data-ng-show="source.logo"> - <div class="col-md-6 gn-nopadding-left"> - <img - data-ng-show="source.logo" - src="../../images/harvesting/{{ source.logo }}" - class="img-thumbnail form-group" - data-ng-attr-title="{{ source.logo }}" - /> - </div> - <div class="col-md-6 gn-nopadding-left"> - <a href="" data-ng-click="deleteSourceLogo()" class="text-danger"> - <i data-ng-show="source.logo" class="fa fa-times delete"></i> - </a> - </div> + <div> + <label for="serviceList" + >{{'system/csw/capabilityRecordUuid' | translate}}</label + > + + <div + data-gn-suggest="serviceRecordSearchObj" + data-gn-suggest-model="source.serviceRecord" + data-gn-suggest-property="_id" + data-gn-suggest-display-title="span" + ></div> + + <p class="help-block"> + {{'system/csw/capabilityRecordUuid-help' | translate}} + </p> </div> - <!--Display logo picker from harvester logos--> - <div class="row" data-ng-show="queue.length == 0"> - <div class="col-md-12 gn-nopadding-left gn-margin-bottom" translate> - selectExistingLogo - </div> - <div class="col-md-12 gn-nopadding-left gn-margin-bottom"> - <div class="form-group" gn-logo-picker="source.logo"></div> - </div> + <div data-ng-show="groups.length"> + <label class="control-label" data-translate="">subPortalGroupOwner</label> + <div + data-groups-combo="" + data-owner-group="source.groupOwner" + data-set-default-value="false" + data-optional="{{::$parent.user.isAdministrator()}}" + lang="lang" + groups="groups" + data-exclude-special-groups="true" + ></div> + + <p class="help-block" data-translate="">subPortalGroupOwnerHelp</p> </div> - <!--Display logo upload input--> - <form - id="gn-group-edit" - name="gnGroupEdit" - method="POST" - data-file-upload="logoUploadOptions" - role="form" - > - <input type="hidden" name="_csrf" value="{{csrf}}" /> - <div class="row" data-ng-show="!source.logo" id="group-logo-upload"> - <div class="col-md-12 gn-nopadding-left gn-margin-bottom" translate> - addNewLogo + <div> + <label data-translate="">sourceLogo</label> + + <div class="row" data-ng-show="source.logo"> + <div class="col-md-6 gn-nopadding-left"> + <img + data-ng-show="source.logo" + src="../../images/harvesting/{{ source.logo }}" + class="img-thumbnail form-group" + data-ng-attr-title="{{ source.logo }}" + /> </div> - <div class="col-md-12 gn-nopadding-left gn-nopadding-right"> - <div class="panel panel-default"> - <div class="panel-heading" data-translate="">upload</div> - <div class="panel-body"> - <span class="btn btn-success btn-block fileinput-button"> - <i class="fa fa-plus fa-white"></i> - <span data-translate="">chooseLogos</span> - <input type="file" id="source-logo" name="file" /> - </span> - <ul style="list-style: none"> - <li data-ng-repeat="file in queue"> - <div class="preview" data-file-upload-preview="file"></div> - {{file.name}} ({{file.type}} / {{file.size | formatFileSize}}) - <i class="fa fa-trash-o" data-ng-click="clear(file)"></i> - </li> - </ul> - </div> - </div> + <div class="col-md-6 gn-nopadding-left"> + <a href="" data-ng-click="deleteSourceLogo()" class="text-danger"> + <i data-ng-show="source.logo" class="fa fa-times delete"></i> + </a> </div> </div> - </form> - - <p class="help-block" data-translate="">sourceLogo-help</p> - </div> - - <label data-translate="">sourceUiConfig</label> - <select - id="uiConfigurationList" - class="form-control" - data-ng-options="c.id as c.id for (key, c) in uiConfigurations | orderBy: 'id'" - data-ng-model="source.uiConfig" - ></select> - <p class="help-block" data-translate="">sourceUiConfig-help</p> - - <div> - <label for="serviceList" - >{{'system/csw/capabilityRecordUuid' | translate}}</label - > - - <div - data-gn-suggest="serviceRecordSearchObj" - data-gn-suggest-model="source.serviceRecord" - data-gn-suggest-property="_id" - data-gn-suggest-display-title="span" - ></div> + </div> + </form> - <p class="help-block"> - {{'system/csw/capabilityRecordUuid-help' | translate}} - </p> + <!--Display logo picker from harvester logos--> + <div class="row" data-ng-show="queue.length == 0"> + <div class="col-md-12 gn-nopadding-left gn-margin-bottom" translate> + selectExistingLogo + </div> + <div class="col-md-12 gn-nopadding-left gn-margin-bottom"> + <div class="form-group" gn-logo-picker="source.logo"></div> + </div> </div> - <div data-ng-show="groups.length"> - <label class="control-label" data-translate="">subPortalGroupOwner</label> - <div - data-groups-combo="" - data-owner-group="source.groupOwner" - data-set-default-value="false" - data-optional="{{::$parent.user.isAdministrator()}}" - lang="lang" - groups="groups" - data-exclude-special-groups="true" - ></div> + <!--Display logo upload input--> + <form + id="gn-group-edit" + name="gnGroupEdit" + method="POST" + data-file-upload="logoUploadOptions" + role="form" + > + <input type="hidden" name="_csrf" value="{{csrf}}" /> + <div class="row" data-ng-show="!source.logo" id="group-logo-upload"> + <div class="col-md-12 gn-nopadding-left gn-margin-bottom" translate> + addNewLogo + </div> + <div class="col-md-12 gn-nopadding-left gn-nopadding-right"> + <div class="panel panel-default"> + <div class="panel-heading" data-translate="">upload</div> + <div class="panel-body"> + <span class="btn btn-success btn-block fileinput-button"> + <i class="fa fa-plus fa-white"></i> + <span data-translate="">chooseLogos</span> + <input type="file" id="source-logo" name="file" /> + </span> + <ul style="list-style: none"> + <li data-ng-repeat="file in queue"> + <div class="preview" data-file-upload-preview="file"></div> + {{file.name}} ({{file.type}} / {{file.size | formatFileSize}}) + <i class="fa fa-trash-o" data-ng-click="clear(file)"></i> + </li> + </ul> + </div> + </div> + </div> + </div> + </form> - <p class="help-block" data-translate="">subPortalGroupOwnerHelp</p> - </div> + <p class="help-block" data-translate="">sourceLogo-help</p> </div> - - <table class="table table-striped"> - <tr data-ng-repeat="(key, value) in source.label"> - <td>{{key | translate}}</td> - <td> - <input - type="text" - class="form-control" - value="{{value}}" - data-ng-model="source.label[key]" - /> - </td> - </tr> - </table> </div> </div> </div> From c9164d0e1f1106f5a9d26dca81962b954508a533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Mon, 2 Sep 2024 16:50:27 +0200 Subject: [PATCH 35/97] API / Improve parameter check for XSL conversion. (#8201) --- .../kernel/GeonetworkDataDirectory.java | 13 +++++++++ .../AbstractGeonetworkDataDirectoryTest.java | 27 ++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/fao/geonet/kernel/GeonetworkDataDirectory.java b/core/src/main/java/org/fao/geonet/kernel/GeonetworkDataDirectory.java index 86a0cdca444..cc5296232bd 100644 --- a/core/src/main/java/org/fao/geonet/kernel/GeonetworkDataDirectory.java +++ b/core/src/main/java/org/fao/geonet/kernel/GeonetworkDataDirectory.java @@ -27,8 +27,11 @@ import jeeves.server.sources.http.JeevesServlet; import org.fao.geonet.ApplicationContextHolder; import org.fao.geonet.constants.Geonet; +import org.fao.geonet.exceptions.BadParameterEx; +import org.fao.geonet.utils.FilePathChecker; import org.fao.geonet.utils.IO; import org.fao.geonet.utils.Log; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.ConfigurableApplicationContext; @@ -63,6 +66,9 @@ public class GeonetworkDataDirectory { */ public static final String GEONETWORK_BEAN_KEY = "GeonetworkDataDirectory"; + @Autowired + SchemaManager schemaManager; + private Path webappDir; private Path systemDataDir; private Path indexConfigDir; @@ -797,11 +803,18 @@ public Path getXsltConversion(String conversionId) { if (conversionId.startsWith(IMPORT_STYLESHEETS_SCHEMA_PREFIX)) { String[] pathToken = conversionId.split(":"); if (pathToken.length == 3) { + String schema = pathToken[1]; + if (!schemaManager.existsSchema(schema)) { + throw new BadParameterEx(String.format( + "Conversion not found. Schema '%s' is not registered in this catalog.", schema)); + } + FilePathChecker.verify(pathToken[2]); return this.getSchemaPluginsDir() .resolve(pathToken[1]) .resolve(pathToken[2] + ".xsl"); } } else { + FilePathChecker.verify(conversionId); return this.getWebappDir().resolve(Geonet.Path.IMPORT_STYLESHEETS). resolve(conversionId + ".xsl"); } diff --git a/core/src/test/java/org/fao/geonet/kernel/AbstractGeonetworkDataDirectoryTest.java b/core/src/test/java/org/fao/geonet/kernel/AbstractGeonetworkDataDirectoryTest.java index 7f7f4b26b4a..63624516b09 100644 --- a/core/src/test/java/org/fao/geonet/kernel/AbstractGeonetworkDataDirectoryTest.java +++ b/core/src/test/java/org/fao/geonet/kernel/AbstractGeonetworkDataDirectoryTest.java @@ -26,6 +26,8 @@ import jeeves.server.ServiceConfig; import org.fao.geonet.AbstractCoreIntegrationTest; +import org.fao.geonet.constants.Geonet; +import org.fao.geonet.exceptions.BadParameterEx; import org.jdom.Element; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -34,7 +36,7 @@ import java.nio.file.Path; import java.util.ArrayList; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; /** * Abstract class for GeonetworkDataDirectory tests where the data directory layout is a default @@ -76,6 +78,29 @@ public void testInit() throws Exception { assertSystemDirSubFolders(expectedDataDir); } + @Test + public void testGetXsltConversion() { + Path xsltConversion = dataDirectory.getXsltConversion("conversion"); + assertEquals(dataDirectory.getWebappDir().resolve(Geonet.Path.IMPORT_STYLESHEETS).resolve("conversion.xsl"), xsltConversion); + try { + dataDirectory.getXsltConversion("../conversion"); + } catch (BadParameterEx e) { + assertEquals("../conversion is not a valid value for: Invalid character found in path.", e.getMessage()); + } + + xsltConversion = dataDirectory.getXsltConversion("schema:iso19115-3.2018:convert/fromISO19115-3.2014"); + assertNotNull(xsltConversion); + try { + dataDirectory.getXsltConversion("schema:notExistingSchema:convert/fromISO19115-3.2014"); + } catch (BadParameterEx e) { + assertEquals("Conversion not found. Schema 'notExistingSchema' is not registered in this catalog.", e.getMessage()); + } + try { + dataDirectory.getXsltConversion("schema:iso19115-3.2018:../../custom/path"); + } catch (BadParameterEx e) { + assertEquals("../../custom/path is not a valid value for: Invalid character found in path.", e.getMessage()); + } + } private void assertSystemDirSubFolders(Path expectedDataDir) { final Path expectedConfigDir = expectedDataDir.resolve("config"); assertEquals(expectedConfigDir, dataDirectory.getConfigDir()); From debb6ac31609f2def88dfe2e82967f285bc75590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Tue, 3 Sep 2024 15:40:54 +0200 Subject: [PATCH 36/97] Editor / DOI search / Improve label (#8338) --- web-ui/src/main/resources/catalog/locales/en-v4.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/locales/en-v4.json b/web-ui/src/main/resources/catalog/locales/en-v4.json index 266f5e5bf43..dc8e786767d 100644 --- a/web-ui/src/main/resources/catalog/locales/en-v4.json +++ b/web-ui/src/main/resources/catalog/locales/en-v4.json @@ -435,7 +435,7 @@ "overviewUrl": "Overview URL", "restApiUrl": "REST API URL", "filterHelp": "Please click on one of the buttons below to activate the filter", - "selectDOIResource": "Choose a DOI resource", + "selectDOIResource": "Search for a DOI", "httpStatus--200": "Invalid status", "httpStatus-200": "200: Valid status", "httpStatus-404": "404: Not found", From 304d90cfbb510b59224717c2bddbeb1b3c50a738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Tue, 3 Sep 2024 16:05:14 +0200 Subject: [PATCH 37/97] Editor / Associated resource / Avoid empty label (#8339) When adding a source for example, the button label may be empty. Add a default one. --- .../catalog/components/edit/onlinesrc/partials/linkToMd.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html index d4cd3f89131..698421f1769 100644 --- a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html +++ b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html @@ -62,7 +62,7 @@ ng-disabled="!canEnableLinkButton(selectRecords)" > <i class="fa gn-icon-{{mode}}"></i> - <i class="icon-external-link"></i>  {{btn.label}} + <i class="icon-external-link"></i>  {{btn.label || ('saveLinkToSibling' | translate)}} </button> <div data-gn-need-help="linking-records" class="pull-right"></div> </div> From b5bc47436b34b08ff244edc2bae445bdfa161d0b Mon Sep 17 00:00:00 2001 From: wangf1122 <74916635+wangf1122@users.noreply.github.com> Date: Wed, 4 Sep 2024 03:48:00 -0400 Subject: [PATCH 38/97] publish status not refreshing fix (#8344) --- .../geonet/listener/metadata/draft/ApprovePublishedRecord.java | 2 +- .../catalog/components/metadataactions/MetadataActionService.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/ApprovePublishedRecord.java b/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/ApprovePublishedRecord.java index b335fc9cdec..546571cec96 100644 --- a/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/ApprovePublishedRecord.java +++ b/listeners/src/main/java/org/fao/geonet/listener/metadata/draft/ApprovePublishedRecord.java @@ -121,7 +121,7 @@ private void changeToApproved(AbstractMetadata md, MetadataStatus previousStatus status.setChangeDate(new ISODate()); status.setUserId(ServiceContext.get().getUserSession().getUserIdAsInt()); - metadataStatus.setStatusExt(status, false); + metadataStatus.setStatusExt(status, true); Log.trace(Geonet.DATA_MANAGER, "Metadata with id " + md.getId() + " automatically approved due to publishing."); } diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js index 98d4793b3ca..51d51978d82 100644 --- a/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js +++ b/web-ui/src/main/resources/catalog/components/metadataactions/MetadataActionService.js @@ -537,6 +537,7 @@ } if (md) { + gnMetadataManager.updateMdObj(md); md.publish(publicationType); } }, From ee23e5430ef839c90ab6d08890e1176481465741 Mon Sep 17 00:00:00 2001 From: Ian <ianwallen@hotmail.com> Date: Thu, 5 Sep 2024 06:11:43 -0300 Subject: [PATCH 39/97] iso19139 - Update thumbnail add/update and remove to support index update/removal (#8348) --- .../plugin/iso19139/process/thumbnail-add.xsl | 48 +++++++++++++------ .../iso19139/process/thumbnail-remove.xsl | 36 ++++++++++++-- 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-add.xsl b/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-add.xsl index 16b975a837c..4c173556039 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-add.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-add.xsl @@ -27,7 +27,9 @@ xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:geonet="http://www.fao.org/geonetwork" - exclude-result-prefixes="#all" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:digestUtils="java:org.apache.commons.codec.digest.DigestUtils" + exclude-result-prefixes="#all" version="2.0"> <!-- @@ -41,11 +43,22 @@ <xsl:param name="thumbnail_desc" select="''"/> <xsl:param name="thumbnail_type" select="''"/> - <!-- Target element to update. The key is based on the concatenation - of URL+Name --> - <xsl:param name="updateKey"/> - - <xsl:template match="gmd:identificationInfo/*"> + <!-- Target element to update. + updateKey is used to identify the resource name to be updated - it is for backwards compatibility. Will not be used if resourceHash is set. + The key is based on the concatenation of URL+Name + resourceHash is hash value of the object to be removed which will ensure the correct value is removed. It will override the usage of updateKey + resourceIdx is the index location of the object to be removed - can be used when duplicate entries exists to ensure the correct one is removed. +--> + <xsl:param name="updateKey" select="''"/> + <xsl:param name="resourceHash" select="''"/> + <xsl:param name="resourceIdx" select="''"/> + + <xsl:variable name="update_flag"> + <xsl:value-of select="boolean($updateKey != '' or $resourceHash != '' or $resourceIdx != '')"/> + </xsl:variable> + + <!-- Add new gmd:graphicOverview --> + <xsl:template match="gmd:identificationInfo/*[$update_flag = false()]"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="gmd:citation"/> @@ -56,9 +69,7 @@ <xsl:apply-templates select="gmd:pointOfContact"/> <xsl:apply-templates select="gmd:resourceMaintenance"/> - <xsl:if test="$updateKey = ''"> - <xsl:call-template name="fill"/> - </xsl:if> + <xsl:call-template name="fill"/> <xsl:apply-templates select="gmd:graphicOverview"/> @@ -83,12 +94,19 @@ </xsl:copy> </xsl:template> - - <xsl:template match="gmd:graphicOverview[concat( - */gmd:fileName/gco:CharacterString, - */gmd:fileName/gmd:PT_FreeText/gmd:textGroup/gmd:LocalisedCharacterString[@locale = '#DE'], - */gmd:fileDescription/gmd:PT_FreeText/gmd:textGroup/gmd:LocalisedCharacterString[@locale = '#DE'], - */gmd:fileDescription/gco:CharacterString) = normalize-space($updateKey)]"> + <!-- Updating the gmd:graphicOverview based on update parameters --> + <!-- Note: first part of the match needs to match the xsl:for-each select from extract-relations.xsl in order to get the position() to match --> + <!-- The unique identifier is marked with resourceIdx which is the position index and resourceHash which is hash code of the current node (combination of url, resource name, and description) --> + <xsl:template + priority="2" + match="*//gmd:graphicOverview + [$resourceIdx = '' or position() = xs:integer($resourceIdx)] + [ ($resourceHash != '' or ($updateKey != '' and normalize-space($updateKey) = concat( + */gmd:fileName/gco:CharacterString, + */gmd:fileName/gmd:PT_FreeText/gmd:textGroup/gmd:LocalisedCharacterString[@locale = '#DE'], + */gmd:fileDescription/gmd:PT_FreeText/gmd:textGroup/gmd:LocalisedCharacterString[@locale = '#DE'], + */gmd:fileDescription/gco:CharacterString))) + and ($resourceHash = '' or digestUtils:md5Hex(normalize-space(.)) = $resourceHash)]"> <xsl:call-template name="fill"/> </xsl:template> diff --git a/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl b/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl index a856ed23dd1..de77616984c 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl @@ -25,22 +25,48 @@ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" + xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:geonet="http://www.fao.org/geonetwork" exclude-result-prefixes="#all" + xmlns:digestUtils="java:org.apache.commons.codec.digest.DigestUtils" version="2.0"> <!-- Usage: + thumbnail_url is the url to be removed - it is for backwards compatibility. Will not be used if resourceHash is set. + resourceHash is hash value of the object to be removed which will ensure the correct value is removed. It will override the usage of thumbnail_url + resourceIdx is the index location of the object to be removed - can be used when duplicate entries exists to ensure the correct one is removed. + + example: thumbnail-from-url-remove?thumbnail_url=http://geonetwork.org/thumbnails/image.png --> - <xsl:param name="thumbnail_url"/> + <xsl:param name="thumbnail_url" select="''"/> + <xsl:param name="resourceHash" select="''"/> + <xsl:param name="resourceIdx" select="''"/> <!-- Remove the thumbnail define in thumbnail_url parameter --> - <xsl:template - priority="2" - match="gmd:graphicOverview[normalize-space(gmd:MD_BrowseGraphic/gmd:fileName/gco:CharacterString) = normalize-space($thumbnail_url)]"/> + <!-- Note: first part of the match needs to match the xsl:for-each select from extract-relations.xsl in order to get the position() to match --> + <!-- The unique identifier is marked with resourceIdx which is the position index and resourceHash which is hash code of the current node (combination of url, resource name, and description) --> + + <xsl:template match="//gmd:graphicOverview" priority="2"> + + <!-- Calculate the global position of the current gmd:onLine element --> + <xsl:variable name="position" select="count(//gmd:graphicOverview[current() >> .]) + 1" /> + + <xsl:if test="not( + gmd:MD_BrowseGraphic[gmd:fileName/gco:CharacterString != ''] and + ($resourceIdx = '' or $position = xs:integer($resourceIdx)) and + ($resourceHash != '' or ($thumbnail_url != null and (normalize-space(gmd:MD_BrowseGraphic/gmd:fileName/gco:CharacterString) = normalize-space($thumbnail_url)))) + and ($resourceHash = '' or digestUtils:md5Hex(normalize-space(.)) = $resourceHash) + )"> + <xsl:copy> + <xsl:apply-templates select="@*|node()"/> + </xsl:copy> + </xsl:if> + </xsl:template> + - <!-- Do a copy of every nodes and attributes --> + <!-- Do a copy of every node and attribute --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> From 05b2e43dd5ce5a340081269461560af480b85af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 5 Sep 2024 15:40:44 +0200 Subject: [PATCH 40/97] CSW Harvester / Avoid increment 2 metrics for a single metadata in certain conditions (#8069) * CSW Harvester / Avoid increment 2 metrics for a single metadata in certain conditions. Retrieve metadata method increments metrics under certain conditions and returns null. Methods calling the retrieve metadata method increments additionally the unretrievable metric if null is returned. Sonarlint fixeas are already applied. Fixes #8039 * CSW Harvester / Use primitive boolean for 'force' parameter --- .../kernel/harvest/harvester/csw/Aligner.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java index 88942e4ec86..5097d9a600c 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -232,7 +232,7 @@ private void insertOrUpdate(Collection<RecordInfo> records, Collection<HarvestEr } result.totalMetadata++; - } catch (Throwable t) { + } catch (Exception t) { errors.add(new HarvestError(this.context, t)); log.error("Unable to process record from csw (" + this.params.getName() + ")"); log.error(" Record failed: " + ri.uuid + ". Error is: " + t.getMessage()); @@ -285,7 +285,6 @@ private void addMetadata(RecordInfo ri, String uuidToAssign) throws Exception { Element md = retrieveMetadata(ri.uuid); if (md == null) { - result.unretrievable++; return; } @@ -404,7 +403,7 @@ public static void applyBatchEdits( if (StringUtils.isNotEmpty(batchEditParameter.getCondition())) { applyEdit = false; final Object node = Xml.selectSingle(md, batchEditParameter.getCondition(), metadataSchema.getNamespaces()); - if (node != null && node instanceof Boolean && (Boolean)node == true) { + if (node instanceof Boolean && Boolean.TRUE.equals(node)) { applyEdit = true; } } @@ -424,7 +423,7 @@ public static void applyBatchEdits( } } } - private void updateMetadata(RecordInfo ri, String id, Boolean force) throws Exception { + private void updateMetadata(RecordInfo ri, String id, boolean force) throws Exception { String date = localUuids.getChangeDate(ri.uuid); if (date == null && !force) { @@ -443,11 +442,10 @@ private void updateMetadata(RecordInfo ri, String id, Boolean force) throws Exce } } @Transactional(value = TxType.REQUIRES_NEW) - boolean updatingLocalMetadata(RecordInfo ri, String id, Boolean force) throws Exception { + boolean updatingLocalMetadata(RecordInfo ri, String id, boolean force) throws Exception { Element md = retrieveMetadata(ri.uuid); if (md == null) { - result.unchangedMetadata++; return false; } @@ -500,8 +498,11 @@ boolean updatingLocalMetadata(RecordInfo ri, String id, Boolean force) throws Ex } /** - * Does CSW GetRecordById request. If validation is requested and the metadata does not - * validate, null is returned. + * Does CSW GetRecordById request. Returns null on error conditions: + * - If validation is requested and the metadata does not validate. + * - No metadata is retrieved. + * - If metadata resource is duplicated. + * - An exception occurs retrieving the metadata. * * @param uuid uuid of metadata to request * @return metadata the metadata @@ -524,6 +525,7 @@ private Element retrieveMetadata(String uuid) { //--- maybe the metadata has been removed if (list.isEmpty()) { + result.unretrievable++; return null; } @@ -544,11 +546,10 @@ private Element retrieveMetadata(String uuid) { return null; } - if (params.rejectDuplicateResource) { - if (foundDuplicateForResource(uuid, response)) { + if (params.rejectDuplicateResource && (foundDuplicateForResource(uuid, response))) { result.unchangedMetadata++; return null; - } + } return response; @@ -612,7 +613,7 @@ private boolean foundDuplicateForResource(String uuid, Element response) { } } } - } catch (Throwable e) { + } catch (Exception e) { log.warning(" - Error when searching for resource duplicate " + uuid + ". Error is: " + e.getMessage()); } } From d560b2a9aef3a6d1ab0d18bda96cd9b604882b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Gabri=C3=ABl?= <michel.gabriel@geocat.net> Date: Mon, 9 Sep 2024 08:21:35 +0200 Subject: [PATCH 41/97] Put the image name in the `alt` attribute in the thumbnail on the metadata page. (#8290) This commit adds the `<img>` in the `alt` attribute when there is a name, otherwise a default string is used. The image name used to be the caption underneath the thumbnail, but is now removed Extra: the `max-height` is increased in order to have the full width of the image. --- .../views/default/less/gn_result_default.less | 2 +- .../default/templates/recordView/thumbnails.html | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less b/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less index 4e26b7506c4..09867678db0 100644 --- a/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less +++ b/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less @@ -147,7 +147,7 @@ .img-thumbnail { padding: 0; border: none; - max-height: 300px; + max-height: 500px; min-height: 150px; max-width: 100%; } diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/thumbnails.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/thumbnails.html index 87fab96123f..6338bf0f4d5 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/thumbnails.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/thumbnails.html @@ -1,13 +1,22 @@ <ul class="gn-thumbnails" data-ng-if="mdView.current.record.overview.length > 0"> <li data-ng-repeat="img in mdView.current.record.overview"> <img + data-ng-if="img.name" data-gn-img-modal="img" class="img-thumbnail" - alt="{{'overview' | translate}}" + alt="{{img.name}}" title="{{img.name}}" data-ng-src="{{mdView.current.record.draft === 'y'? img.url + (img.url.indexOf('?') > 0 ? '&' : '?') + 'approved=false' : img.url}}" onerror="this.onerror=null; this.parentElement.style.display='none';" /> - <p class="text-center" data-ng-if="img.name != ''">{{img.name}}</p> + <img + data-ng-if="!img.name" + data-gn-img-modal="img" + class="img-thumbnail" + alt="{{'overview' | translate}}" + title="{{'overview' | translate}}" + data-ng-src="{{mdView.current.record.draft === 'y'? img.url + (img.url.indexOf('?') > 0 ? '&' : '?') + 'approved=false' : img.url}}" + onerror="this.onerror=null; this.parentElement.style.display='none';" + /> </li> </ul> From 39838a9d5b2995d39dfadc20ec9009f6c30c0538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Mon, 9 Sep 2024 14:21:26 +0200 Subject: [PATCH 42/97] Don't add file content to the exception when requesting XML documents, if the content is not XML (#8360) --- common/src/main/java/org/fao/geonet/utils/XmlRequest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/org/fao/geonet/utils/XmlRequest.java b/common/src/main/java/org/fao/geonet/utils/XmlRequest.java index 7b6a3b69c59..cba8608a556 100644 --- a/common/src/main/java/org/fao/geonet/utils/XmlRequest.java +++ b/common/src/main/java/org/fao/geonet/utils/XmlRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -124,13 +124,13 @@ protected final Element executeAndReadResponse(HttpRequestBase httpMethod) throw " -- Response Code: " + httpResponse.getRawStatusCode()); } - byte[] data = null; + byte[] data; try { data = IOUtils.toByteArray(httpResponse.getBody()); return Xml.loadStream(new ByteArrayInputStream(data)); } catch (JDOMException e) { - throw new BadXmlResponseEx("Response: '" + new String(data, "UTF8") + "' (from URI " + httpMethod.getURI() + ")"); + throw new BadXmlResponseEx("Invalid XML document from URI: " + httpMethod.getURI()); } finally { httpMethod.releaseConnection(); From c2a3f5fd6295676e1e523e7bed233907df3b5680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Wed, 5 Jul 2023 13:15:53 +0200 Subject: [PATCH 43/97] Harvester / Simple URL / ODS / Improve mapping Follow up of https://github.com/geonetwork/core-geonetwork/pull/7059 * Add elements taking into account the API version 1 or 2 * Do not put free text in an ISO field which is an enumeration (which avoids to mix facet icons and translations for topic category) * Provide a mapping based on default ODS values for french and english * Add a dedicated keyword block with the free text values --- .../convert/fromJsonOpenDataSoft.xsl | 84 +++++++----- .../convert/odstheme-mapping.xsl | 43 ++++++ .../convert/protocol-mapping.xsl | 123 +++++++++--------- 3 files changed, 155 insertions(+), 95 deletions(-) create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl index a14cd81ca4a..04e69e18483 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl @@ -45,7 +45,8 @@ xmlns:java-xsl-util="java:org.fao.geonet.util.XslUtil" exclude-result-prefixes="#all"> - <xsl:import href="protocol-mapping.xsl"></xsl:import> + <xsl:import href="protocol-mapping.xsl"/> + <xsl:import href="odstheme-mapping.xsl"/> <xsl:output method="xml" indent="yes"/> @@ -130,26 +131,30 @@ </cit:CI_Responsibility> </mdb:contact> - <mdb:dateInfo> - <cit:CI_Date> - <cit:date> - <gco:DateTime><xsl:value-of select="(metas/modified|dataset/metas/default/metadata_processed)[1]"/></gco:DateTime> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="publication"/> - </cit:dateType> - </cit:CI_Date> - </mdb:dateInfo> - <mdb:dateInfo> - <cit:CI_Date> - <cit:date> - <gco:DateTime><xsl:value-of select="metas/metadata_processed"/></gco:DateTime> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="revision"/> - </cit:dateType> - </cit:CI_Date> - </mdb:dateInfo> + <xsl:for-each select="metas/modified"> + <mdb:dateInfo> + <cit:CI_Date> + <cit:date> + <gco:DateTime><xsl:value-of select="."/></gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="publication"/> + </cit:dateType> + </cit:CI_Date> + </mdb:dateInfo> + </xsl:for-each> + <xsl:for-each select="metas/metadata_processed|dataset/metas/default/metadata_processed"> + <mdb:dateInfo> + <cit:CI_Date> + <cit:date> + <gco:DateTime><xsl:value-of select="."/></gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="revision"/> + </cit:dateType> + </cit:CI_Date> + </mdb:dateInfo> + </xsl:for-each> <mdb:metadataStandard> <cit:CI_Citation> <cit:title> @@ -264,15 +269,33 @@ </mri:pointOfContact> </xsl:for-each> - <!-- ODS themes copied as topicCategory --> - <xsl:if test="metas/theme"> - <xsl:for-each select="metas/theme"> - <mri:topicCategory> - <mri:MD_TopicCategoryCode> - <xsl:value-of select="."/> - </mri:MD_TopicCategoryCode> - </mri:topicCategory> - </xsl:for-each> + + <xsl:variable name="odsThemes" + select="metas/theme|dataset/metas/default/theme"/> + <xsl:if test="count($odsThemes) > 0"> + <xsl:for-each select="distinct-values($odsThemeToIsoTopic[theme = $odsThemes]/name())"> + <mri:topicCategory> + <mri:MD_TopicCategoryCode> + <xsl:value-of select="."/> + </mri:MD_TopicCategoryCode> + </mri:topicCategory> + </xsl:for-each> + + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <xsl:for-each select="$odsThemes"> + <mri:keyword> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mri:keyword> + </xsl:for-each> + <mri:type> + <mri:MD_KeywordTypeCode codeListValue="theme" + codeList="./resources/codeList.xml#MD_KeywordTypeCode"/> + </mri:type> + </mri:MD_Keywords> + </mri:descriptiveKeywords> </xsl:if> <!-- ODS keywords copied without type --> @@ -292,6 +315,7 @@ </mri:descriptiveKeywords> </xsl:if> + <!-- license_url: "http://opendatacommons.org/licenses/odbl/", --> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl new file mode 100644 index 00000000000..c5046e099cf --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl @@ -0,0 +1,43 @@ +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + exclude-result-prefixes="#all"> + + <xsl:variable name="odsThemeToIsoTopic" as="node()*"> + <health> + <theme>Santé</theme> + <theme>Health</theme> + </health> + <environment> + <theme>Environnement</theme> + <theme>Environment</theme> + </environment> + <transportation> + <theme>Transports, Déplacements</theme> + <theme>Transport, Movements</theme> + </transportation> + <structure> + <theme>Aménagement du territoire, Urbanisme, Bâtiments, Equipements, Habitat</theme> + <theme>Spatial planning, Town planning, Buildings, Equipment, Housing</theme> + </structure> + <economy> + <theme>Economie, Entreprise, PME, Développement économique, Emploi</theme> + <theme>Economy, Business, SME, Economic development, Employment</theme> + </economy> + <society> + <theme>Patrimoine culturel</theme> + <theme>Culture, Heritage</theme> + <theme>Education, Formation, Recherche, Enseignement</theme> + <theme>Education, Training, Research, Teaching</theme> + <theme>Administration, Gouvernement, Finances publiques, Citoyenneté</theme> + <theme>Administration, Government, Public finances, Citizenship</theme> + <theme>Justice, Sécurité, Police, Criminalité</theme> + <theme>Justice, Safety, Police, Crime</theme> + <theme>Sports, Loisirs</theme> + <theme>Sports, Leisure</theme> + <theme>Hébergement, industrie hôtelière</theme> + <theme>Accommodation, Hospitality Industry</theme> + <theme>Services sociaux</theme> + <theme>Services, Social</theme> + </society> + </xsl:variable> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/protocol-mapping.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/protocol-mapping.xsl index 81062b32791..a3429faa6dd 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/protocol-mapping.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/protocol-mapping.xsl @@ -1,71 +1,64 @@ <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:dct="http://purl.org/dc/terms/" - xmlns:dcat="http://www.w3.org/ns/dcat#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" exclude-result-prefixes="#all"> - <xsl:output method="xml" indent="yes"/> - <xsl:strip-space elements="*"/> - - <xsl:variable name="format-protocol-mapping"> - <entry> - <format>csv</format> - <protocol>WWW:DOWNLOAD:text/csv</protocol> - </entry> - <entry> - <format>geojson</format> - <protocol>WWW:DOWNLOAD:application/vnd.geo+json</protocol> - </entry> - <entry> - <format>kml</format> - <protocol>WWW:DOWNLOAD:application/vnd.google-earth.kml+xml</protocol> - </entry> - <entry> - <format>zip</format> - <protocol>WWW:DOWNLOAD:application/zip</protocol> - </entry> - <entry> - <format>shapefile</format> - <format>shp</format> - <protocol>WWW:DOWNLOAD:x-gis/x-shapefile</protocol> - </entry> - <entry> - <format>json</format> - <protocol>WWW:DOWNLOAD:application/json</protocol> - </entry> - <entry> - <format>pdf</format> - <protocol>WWW:DOWNLOAD:application/pdf</protocol> - </entry> - <entry> - <format>xls</format> - <protocol>WWW:DOWNLOAD:application/vnd.ms-excel</protocol> - </entry> - <entry> - <format>xlsx</format> - <format>excel</format> - <protocol>WWW:DOWNLOAD:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</protocol> - </entry> - <entry> - <format>rtf</format> - <protocol>WWW:DOWNLOAD:application/rtf</protocol> - </entry> - <entry> - <format>web page</format> - <format>html</format> - <format>arcgis</format> - <protocol>WWW:LINK-1.0-http--link</protocol> - </entry> - <entry> - <format>wms</format> - <protocol>OGC:WMS</protocol> - </entry> - <entry> - <format>wfs</format> - <protocol>OGC:WFS</protocol> - </entry> - </xsl:variable> + <xsl:variable name="format-protocol-mapping"> + <entry> + <format>csv</format> + <protocol>WWW:DOWNLOAD:text/csv</protocol> + </entry> + <entry> + <format>geojson</format> + <protocol>WWW:DOWNLOAD:application/vnd.geo+json</protocol> + </entry> + <entry> + <format>kml</format> + <protocol>WWW:DOWNLOAD:application/vnd.google-earth.kml+xml</protocol> + </entry> + <entry> + <format>zip</format> + <protocol>WWW:DOWNLOAD:application/zip</protocol> + </entry> + <entry> + <format>shapefile</format> + <format>shp</format> + <protocol>WWW:DOWNLOAD:x-gis/x-shapefile</protocol> + </entry> + <entry> + <format>json</format> + <protocol>WWW:DOWNLOAD:application/json</protocol> + </entry> + <entry> + <format>pdf</format> + <protocol>WWW:DOWNLOAD:application/pdf</protocol> + </entry> + <entry> + <format>xls</format> + <protocol>WWW:DOWNLOAD:application/vnd.ms-excel</protocol> + </entry> + <entry> + <format>xlsx</format> + <format>excel</format> + <protocol>WWW:DOWNLOAD:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</protocol> + </entry> + <entry> + <format>rtf</format> + <protocol>WWW:DOWNLOAD:application/rtf</protocol> + </entry> + <entry> + <format>web page</format> + <format>html</format> + <format>arcgis</format> + <protocol>WWW:LINK-1.0-http--link</protocol> + </entry> + <entry> + <format>wms</format> + <protocol>OGC:WMS</protocol> + </entry> + <entry> + <format>wfs</format> + <protocol>OGC:WFS</protocol> + </entry> + </xsl:variable> </xsl:stylesheet> From 3f3a196a81cfb30d76620106e59eb726fe9e3d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Fri, 13 Sep 2024 08:10:24 +0200 Subject: [PATCH 44/97] Standard / ISO19115-3 / Label improvement. (#8364) --- .../src/main/plugin/iso19115-3.2018/loc/eng/labels.xml | 4 ++++ .../src/main/plugin/iso19115-3.2018/loc/fre/labels.xml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/eng/labels.xml b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/eng/labels.xml index d24c02eb5c8..d4b329e3acb 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/eng/labels.xml +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/eng/labels.xml @@ -1323,6 +1323,10 @@ <label>Metadata language</label> <description iso="true">Designation of the locale language</description> </element> + <element name="lan:language" id="448.0" context="/mdb:MD_Metadata/mdb:identificationInfo/mri:MD_DataIdentification/mri:defaultLocale/lan:PT_Locale/lan:language"> + <label>Dataset language</label> + <description iso="true">ISO 3 letters code.</description> + </element> <element name="lan:language" id="448.0" context="/mdb:MD_Metadata/mdb:otherLocale/lan:PT_Locale/lan:language"> <label>Other language</label> <description iso="true">Additional metadata language</description> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/fre/labels.xml b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/fre/labels.xml index b17c9b295b2..1ac962c2539 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/fre/labels.xml +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/loc/fre/labels.xml @@ -1396,6 +1396,10 @@ <label>Langue de la fiche</label> <description iso="true">Langue principale de la fiche. Code ISO de la langue à 3 caractères.</description> </element> + <element name="lan:language" id="448.0" context="/mdb:MD_Metadata/mdb:identificationInfo/mri:MD_DataIdentification/mri:defaultLocale/lan:PT_Locale/lan:language"> + <label>Langue de la donnée</label> + <description iso="true">Langue de la donnée. Code ISO de la langue à 3 caractères.</description> + </element> <element name="lan:language" id="448.0" context="/mdb:MD_Metadata/mdb:otherLocale/lan:PT_Locale/lan:language"> <label>Autres langues</label> <description iso="true">Langue additionnelle. Code ISO de la langue à 3 caractères.</description> From 796385c6e04ba0dbf6b8da1ca0691e2ec420a571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Fri, 13 Sep 2024 08:19:17 +0200 Subject: [PATCH 45/97] Editor / Associated resource / DOI search. (#8363) * Add tooltip with API query to inform user which fields are used for the search. * Ignore https://doi.org prefix as most of the time user search using the DOI URL but the API https://support.datacite.org/docs/api-queries search is only based on prefix/id --- .../edit/onlinesrc/OnlineSrcService.js | 24 ++++++++++++------- .../onlinesrc/partials/doisearchpanel.html | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js index 0d9a1fe8329..94ee49c926e 100644 --- a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js +++ b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js @@ -265,9 +265,9 @@ linksAndRelatedPromises.push( $http.get( apiPrefix + - "/related?type=" + - relatedTypes.join("&type=") + - (!isApproved ? "&approved=false" : ""), + "/related?type=" + + relatedTypes.join("&type=") + + (!isApproved ? "&approved=false" : ""), { headers: { Accept: "application/json" @@ -281,9 +281,9 @@ linksAndRelatedPromises.push( $http.get( apiPrefix + - "/associated?type=" + - associatedTypes.join(",") + - (!isApproved ? "&approved=false" : ""), + "/associated?type=" + + associatedTypes.join(",") + + (!isApproved ? "&approved=false" : ""), { headers: { Accept: "application/json" @@ -610,8 +610,8 @@ scopedName: params.remote ? "" : params.name === qParams.name - ? "" - : qParams.name, + ? "" + : qParams.name, uuidref: qParams.uuidDS, uuid: qParams.uuidSrv, url: qParams.remote ? qParams.url : "", @@ -932,7 +932,13 @@ function ($http) { return { search: function (url, prefix, query) { - return $http.get(url + "?prefix=" + prefix + "&query=" + query); + return $http.get( + url + + "?prefix=" + + prefix + + "&query=" + + query.replaceAll("https://doi.org/", "") + ); } }; } diff --git a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/doisearchpanel.html b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/doisearchpanel.html index 71799b9652e..35e33c568f9 100644 --- a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/doisearchpanel.html +++ b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/doisearchpanel.html @@ -17,6 +17,7 @@ data-ng-model-options="{ debounce: 1000 }" data-ng-readonly="isSearching" type="text" + title="{{'selectDOIResource' | translate}} - {{doiQueryPattern}}" autocomplete="off" placeholder="{{'anyPlaceHolder' | translate}}" aria-label="{{'anyPlaceHolder' | translate}}" From a66662c17f00b4baaba714c892ba574e12896e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 25 Jul 2024 17:59:46 +0200 Subject: [PATCH 46/97] Add build profile for MacOS ARM --- pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pom.xml b/pom.xml index 4c491177d3f..8e6770b471a 100644 --- a/pom.xml +++ b/pom.xml @@ -1451,6 +1451,21 @@ <kb.platform>darwin-x86</kb.platform> <kb.installer.extension>tar.gz</kb.installer.extension> </properties> + </profile> + <profile> + <id>macOS_aarch64</id> + <activation> + <os> + <family>mac</family> + <arch>aarch64</arch> + </os> + </activation> + <properties> + <es.platform>darwin-aarch64</es.platform> + <kb.executable>kibana.sh</kb.executable> + <kb.platform>darwin-aarch64</kb.platform> + <kb.installer.extension>tar.gz</kb.installer.extension> + </properties> </profile> <profile> <id>windows</id> From 8e92e94301005e6d420c81f3c37460908dd42376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Tue, 17 Sep 2024 10:02:12 +0200 Subject: [PATCH 47/97] Map viewer / WMS GetFeatureInfo support for application/json info format (#8372) --- .../resources/catalog/components/viewer/gfi/FeaturesLoader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/components/viewer/gfi/FeaturesLoader.js b/web-ui/src/main/resources/catalog/components/viewer/gfi/FeaturesLoader.js index c9ca61926cf..62d6fbdde68 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/gfi/FeaturesLoader.js +++ b/web-ui/src/main/resources/catalog/components/viewer/gfi/FeaturesLoader.js @@ -151,7 +151,7 @@ }) .then( function (response) { - if (infoFormat && infoFormat.match(/application\/(geo|geo\+)json/i) != null) { + if (infoFormat && infoFormat.match(/application\/(geo|geo\+)?json/i) != null) { var jsonf = new ol.format.GeoJSON(); var features = []; response.data.features.forEach(function (f) { From 74cdf4ab36536e052bccff064d2b97915e302f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Tue, 17 Sep 2024 10:31:04 +0200 Subject: [PATCH 48/97] GIT / .gitignore Ignore all schemas plugins. --- .gitignore | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index cbd4fe33eaa..84f282d0af7 100644 --- a/.gitignore +++ b/.gitignore @@ -64,11 +64,7 @@ web/src/main/webapp/META-INF/MANIFEST.MF web/src/main/webapp/WEB-INF/data/0* web/src/main/webapp/WEB-INF/data/config/encryptor.properties web/src/main/webapp/WEB-INF/data/config/index/records.json -web/src/main/webapp/WEB-INF/data/config/schema_plugins/*/schematron/schematron*.xsl -web/src/main/webapp/WEB-INF/data/config/schema_plugins/csw-record -web/src/main/webapp/WEB-INF/data/config/schema_plugins/dublin-core -web/src/main/webapp/WEB-INF/data/config/schema_plugins/iso19* -web/src/main/webapp/WEB-INF/data/config/schema_plugins/schemaplugin-uri-catalog.xml +web/src/main/webapp/WEB-INF/data/config/schema_plugins/* web/src/main/webapp/WEB-INF/data/config/schemaplugin-uri-catalog.xml web/src/main/webapp/WEB-INF/data/data/backup web/src/main/webapp/WEB-INF/data/data/metadata_data From e77f9d61f31affc4badec4c2fff754e3a4305d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 19 Sep 2024 13:58:50 +0200 Subject: [PATCH 49/97] Xsl utility / Add a function to retrieve thesaurus title with its key (#8378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Xsl utility / Add a function to retrieve thesaurus title with its key Some schema (eg. DCAT) does not contain thesaurus name in the metadata record. While indexing we add the thesaurus title in the index. This utility function allows to retrieve it with the thesaurus key (eg. external.theme.publisher-type). * Update core/src/main/java/org/fao/geonet/util/XslUtil.java Co-authored-by: Jose García <josegar74@gmail.com> --------- Co-authored-by: Jose García <josegar74@gmail.com> --- core/src/main/java/org/fao/geonet/util/XslUtil.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/src/main/java/org/fao/geonet/util/XslUtil.java b/core/src/main/java/org/fao/geonet/util/XslUtil.java index d6514ffd045..34b9ae272ee 100644 --- a/core/src/main/java/org/fao/geonet/util/XslUtil.java +++ b/core/src/main/java/org/fao/geonet/util/XslUtil.java @@ -1440,6 +1440,19 @@ public static String getThesaurusIdByTitle(String title) { return thesaurus == null ? "" : "geonetwork.thesaurus." + thesaurus.getKey(); } + + /** + * Retrieve the thesaurus title using the thesaurus key. + * + * @param id the thesaurus key + * @return the thesaurus title or empty string if the thesaurus doesn't exist. + */ + public static String getThesaurusTitleByKey(String id) { + ApplicationContext applicationContext = ApplicationContextHolder.get(); + ThesaurusManager thesaurusManager = applicationContext.getBean(ThesaurusManager.class); + Thesaurus thesaurus = thesaurusManager.getThesaurusByName(id); + return thesaurus == null ? "" : thesaurus.getTitle(); + } /** From 1a780ac0d09f1a1df0cdbe23e513e8440c994227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 19 Sep 2024 14:59:23 +0200 Subject: [PATCH 50/97] Indexing / DCAT multilingual support (#8377) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Indexing / DCAT multilingual support * Use 3 letter code for field ID like in ISO * Fix position to properly index a set of multilingual elements ```xml <dct:title xml:lang="nl">NL</dct:title> <dct:title xml:lang="en">EN</dct:title> ``` Related to https://github.com/metadata101/dcat-ap.vl/pull/5 * Update web/src/main/webapp/xslt/common/index-utils.xsl Co-authored-by: Jose García <josegar74@gmail.com> --------- Co-authored-by: Jose García <josegar74@gmail.com> --- .../main/webapp/xslt/common/index-utils.xsl | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/web/src/main/webapp/xslt/common/index-utils.xsl b/web/src/main/webapp/xslt/common/index-utils.xsl index 41f73c406f7..100389f8936 100644 --- a/web/src/main/webapp/xslt/common/index-utils.xsl +++ b/web/src/main/webapp/xslt/common/index-utils.xsl @@ -244,24 +244,30 @@ <!--<xsl:message>gn-fn-index:add-field <xsl:value-of select="$fieldName"/></xsl:message> <xsl:message>gn-fn-index:add-field elements <xsl:copy-of select="$elements"/></xsl:message> - <xsl:message>gn-fn-index:add-field languages <xsl:copy-of select="$languages"/></xsl:message>--> + <xsl:message>gn-fn-index:add-field languages <xsl:copy-of select="$languages"/></xsl:message> + <xsl:message>gn-fn-index:add-field mainLanguage <xsl:copy-of select="$mainLanguage"/></xsl:message>--> <xsl:variable name="isArray" select="count($elements[not(@xml:lang)]) > 1"/> - <xsl:for-each select="$elements"> + + + <!-- Select the items to be processed depending on whether they are ISO multilingual or not ISO, but multilingual eg. DC or DCAT --> + <xsl:for-each select="if($languages and count($elements//(*:CharacterString|*:Anchor|*:LocalisedCharacterString)) = 0 ) then $elements[1] else $elements"> <xsl:variable name="element" select="."/> <xsl:variable name="textObject" as="node()*"> <xsl:choose> <!-- Not ISO but multilingual eg. DC or DCAT --> <xsl:when test="$languages and count($element//(*:CharacterString|*:Anchor|*:LocalisedCharacterString)) = 0"> - <xsl:if test="position() = 1"> <value><xsl:value-of select="concat($doubleQuote, 'default', $doubleQuote, ':', $doubleQuote, util:escapeForJson(.), $doubleQuote)"/></value> <xsl:for-each select="$elements"> - <value><xsl:value-of select="concat($doubleQuote, 'lang', @xml:lang, $doubleQuote, ':', + <xsl:variable name="elementLangAttribute" + select="@xml:lang"/> + <xsl:variable name="elementLangCode" + select="$languages/lang[@value = $elementLangAttribute]/@code"/> + <value><xsl:value-of select="concat($doubleQuote, 'lang', $elementLangCode, $doubleQuote, ':', $doubleQuote, util:escapeForJson(.), $doubleQuote)"/></value> </xsl:for-each> - </xsl:if> </xsl:when> <xsl:when test="$languages"> <!-- The default language --> @@ -707,10 +713,10 @@ <xsl:function name="gn-fn-index:json-escape" as="xs:string?"> <!-- This function is deprecated. Please update your code to define the following namespace: xmlns:util="java:org.fao.geonet.util.XslUtil" - - and use util:escapeForJson function + + and use util:escapeForJson function --> - + <xsl:param name="v" as="xs:string?" /> <xsl:choose> <xsl:when test="normalize-space($v) = ''"></xsl:when> From 51ee3df035ff322729eb016a118eecd430f9499c Mon Sep 17 00:00:00 2001 From: Francois Prunayre <fx.prunayre@gmail.com> Date: Wed, 4 Sep 2024 17:43:04 +0200 Subject: [PATCH 51/97] OpenAPI / Operation returning no content should not advertised a schema. --- .../services/inspireatom/AtomDescribe.java | 4 +++- .../geonet/services/inspireatom/AtomGetData.java | 4 +++- .../services/inspireatom/AtomHarvester.java | 4 +++- .../geonet/services/inspireatom/AtomSearch.java | 3 ++- .../inspireatom/AtomServiceDescription.java | 4 +++- .../org/fao/geonet/api/categories/TagsApi.java | 6 ++++-- .../org/fao/geonet/api/groups/GroupsApi.java | 6 ++++-- .../fao/geonet/api/harvesting/HarvestersApi.java | 4 +++- .../geonet/api/identifiers/IdentifiersApi.java | 6 ++++-- .../fao/geonet/api/languages/LanguagesApi.java | 4 +++- .../fao/geonet/api/mapservers/MapServersApi.java | 8 +++++--- .../fao/geonet/api/processing/ProcessApi.java | 4 +++- .../java/org/fao/geonet/api/records/DoiApi.java | 4 +++- .../api/records/MetadataInsertDeleteApi.java | 4 +++- .../geonet/api/records/MetadataSharingApi.java | 16 +++++++++------- .../fao/geonet/api/records/MetadataTagApi.java | 4 +++- .../geonet/api/records/MetadataWorkflowApi.java | 8 +++++--- .../api/records/attachments/AttachmentsApi.java | 4 ++-- .../api/records/editing/MetadataEditingApi.java | 8 +++++--- .../geonet/api/records/formatters/CacheApi.java | 4 +++- .../geonet/api/selections/UserSelectionsApi.java | 8 +++++--- .../java/org/fao/geonet/api/site/LogosApi.java | 4 +++- .../java/org/fao/geonet/api/site/SiteApi.java | 8 +++++--- .../org/fao/geonet/api/sources/SourcesApi.java | 4 ++-- .../org/fao/geonet/api/status/StatusApi.java | 4 +++- .../fao/geonet/api/uisetting/UiSettingApi.java | 6 ++++-- .../geonet/api/userfeedback/UserFeedbackAPI.java | 6 ++++-- .../java/org/fao/geonet/api/users/MeApi.java | 4 +++- .../geonet/api/usersearches/UserSearchesApi.java | 4 +++- 29 files changed, 105 insertions(+), 52 deletions(-) diff --git a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomDescribe.java b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomDescribe.java index 97091e008e1..95871555b1d 100644 --- a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomDescribe.java +++ b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomDescribe.java @@ -24,6 +24,8 @@ import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -107,7 +109,7 @@ public class AtomDescribe { ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Feeds."), - @ApiResponse(responseCode = "204", description = "Not authenticated.") + @ApiResponse(responseCode = "204", description = "Not authenticated.", content = {@Content(schema = @Schema(hidden = true))}) }) @ResponseStatus(OK) @ResponseBody diff --git a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomGetData.java b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomGetData.java index a9133fe38a7..33d0ace6128 100644 --- a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomGetData.java +++ b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomGetData.java @@ -23,6 +23,8 @@ package org.fao.geonet.services.inspireatom; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -84,7 +86,7 @@ public class AtomGetData { ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Get a data file related to dataset"), - @ApiResponse(responseCode = "204", description = "Not authenticated.") + @ApiResponse(responseCode = "204", description = "Not authenticated.", content = {@Content(schema = @Schema(hidden = true))}) }) @ResponseStatus(OK) @ResponseBody diff --git a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomHarvester.java b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomHarvester.java index 94eeb33e4ce..a30dcbb0331 100644 --- a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomHarvester.java +++ b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomHarvester.java @@ -23,6 +23,8 @@ package org.fao.geonet.services.inspireatom; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -61,7 +63,7 @@ public class AtomHarvester { @PreAuthorize("hasAuthority('Administrator')") @ApiResponses(value = { @ApiResponse(responseCode = "201", description = "Scan completed."), - @ApiResponse(responseCode = "204", description = "Not authenticated.") + @ApiResponse(responseCode = "204", description = "Not authenticated.", content = {@Content(schema = @Schema(hidden = true))}) }) @ResponseStatus(CREATED) @ResponseBody diff --git a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomSearch.java b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomSearch.java index 0e27e9c8763..5253d3146ac 100644 --- a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomSearch.java +++ b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomSearch.java @@ -27,6 +27,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -114,7 +115,7 @@ public class AtomSearch { ) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Get a list of feeds."), - @ApiResponse(responseCode = "204", description = "Not authenticated.") + @ApiResponse(responseCode = "204", description = "Not authenticated.", content = {@io.swagger.v3.oas.annotations.media.Content(schema = @Schema(hidden = true))}) }) @ResponseStatus(OK) public Object feeds( diff --git a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomServiceDescription.java b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomServiceDescription.java index 87a255411b2..6c7b99ffbc2 100644 --- a/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomServiceDescription.java +++ b/inspire-atom/src/main/java/org/fao/geonet/services/inspireatom/AtomServiceDescription.java @@ -23,6 +23,8 @@ package org.fao.geonet.services.inspireatom; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -91,7 +93,7 @@ public class AtomServiceDescription { produces = MediaType.APPLICATION_XML_VALUE) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Feeds."), - @ApiResponse(responseCode = "204", description = "Not authenticated.") + @ApiResponse(responseCode = "204", description = "Not authenticated.", content = {@Content(schema = @Schema(hidden = true))}) }) @ResponseStatus(OK) @ResponseBody diff --git a/services/src/main/java/org/fao/geonet/api/categories/TagsApi.java b/services/src/main/java/org/fao/geonet/api/categories/TagsApi.java index d87bab7908a..3447a171fac 100644 --- a/services/src/main/java/org/fao/geonet/api/categories/TagsApi.java +++ b/services/src/main/java/org/fao/geonet/api/categories/TagsApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.categories; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -180,7 +182,7 @@ public org.fao.geonet.domain.MetadataCategory getTag( @PreAuthorize("hasAuthority('UserAdmin')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Tag updated."), + @ApiResponse(responseCode = "204", description = "Tag updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @ResponseBody @@ -239,7 +241,7 @@ private void updateCategory( method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Tag removed."), + @ApiResponse(responseCode = "204", description = "Tag removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @PreAuthorize("hasAuthority('UserAdmin')") diff --git a/services/src/main/java/org/fao/geonet/api/groups/GroupsApi.java b/services/src/main/java/org/fao/geonet/api/groups/GroupsApi.java index 0b0fb4980d2..12479f28e49 100644 --- a/services/src/main/java/org/fao/geonet/api/groups/GroupsApi.java +++ b/services/src/main/java/org/fao/geonet/api/groups/GroupsApi.java @@ -26,6 +26,8 @@ import com.google.common.base.Functions; import com.google.common.collect.Lists; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -430,7 +432,7 @@ public List<User> getGroupUsers( @ResponseStatus(value = HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('UserAdmin')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Group updated."), + @ApiResponse(responseCode = "204", description = "Group updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @@ -485,7 +487,7 @@ public void updateGroup( @ResponseStatus(value = HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('Administrator')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Group removed."), + @ApiResponse(responseCode = "204", description = "Group removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) diff --git a/services/src/main/java/org/fao/geonet/api/harvesting/HarvestersApi.java b/services/src/main/java/org/fao/geonet/api/harvesting/HarvestersApi.java index ca2b45d30f7..1e6973dde27 100644 --- a/services/src/main/java/org/fao/geonet/api/harvesting/HarvestersApi.java +++ b/services/src/main/java/org/fao/geonet/api/harvesting/HarvestersApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.harvesting; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -98,7 +100,7 @@ public class HarvestersApi { @ResponseStatus(value = HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('UserAdmin')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Harvester records transfered to new source."), + @ApiResponse(responseCode = "204", description = "Harvester records transfered to new source.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) diff --git a/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java b/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java index ddf0c3be357..9f9f30e5b8e 100644 --- a/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java +++ b/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.identifiers; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -153,7 +155,7 @@ public ResponseEntity<Integer> addIdentifier( ) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Identifier template updated."), + @ApiResponse(responseCode = "204", description = "Identifier template updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Resource not found."), @ApiResponse(responseCode = "403", description = "Operation not allowed. Only Editor can access it.") }) @@ -198,7 +200,7 @@ public void updateIdentifier( ) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Template identifier removed."), + @ApiResponse(responseCode = "204", description = "Template identifier removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Resource not found."), @ApiResponse(responseCode = "403", description = "Operation not allowed. Only Editor can access it.") }) diff --git a/services/src/main/java/org/fao/geonet/api/languages/LanguagesApi.java b/services/src/main/java/org/fao/geonet/api/languages/LanguagesApi.java index e62541f05a4..c9cbcc7d59d 100644 --- a/services/src/main/java/org/fao/geonet/api/languages/LanguagesApi.java +++ b/services/src/main/java/org/fao/geonet/api/languages/LanguagesApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.languages; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -185,7 +187,7 @@ public void addLanguages( @PreAuthorize("hasAuthority('Administrator')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Language translations removed."), + @ApiResponse(responseCode = "204", description = "Language translations removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Resource not found."), @ApiResponse(responseCode = "403", description = "Operation not allowed. Only Administrator can access it.") }) diff --git a/services/src/main/java/org/fao/geonet/api/mapservers/MapServersApi.java b/services/src/main/java/org/fao/geonet/api/mapservers/MapServersApi.java index f6a86262247..db1f0814de1 100644 --- a/services/src/main/java/org/fao/geonet/api/mapservers/MapServersApi.java +++ b/services/src/main/java/org/fao/geonet/api/mapservers/MapServersApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.mapservers; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -209,7 +211,7 @@ public ResponseEntity<Integer> addMapserver( }) @PreAuthorize("hasAuthority('Reviewer')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Mapserver updated."), + @ApiResponse(responseCode = "204", description = "Mapserver updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_REVIEWER) }) @@ -253,7 +255,7 @@ public void updateMapserver( }) @PreAuthorize("hasAuthority('Reviewer')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Mapserver updated."), + @ApiResponse(responseCode = "204", description = "Mapserver updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_REVIEWER) }) @@ -323,7 +325,7 @@ private void updateMapserver( }) @PreAuthorize("hasAuthority('Reviewer')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Mapserver removed."), + @ApiResponse(responseCode = "204", description = "Mapserver removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_REVIEWER) }) diff --git a/services/src/main/java/org/fao/geonet/api/processing/ProcessApi.java b/services/src/main/java/org/fao/geonet/api/processing/ProcessApi.java index 775874d572d..94a7ed8ca86 100644 --- a/services/src/main/java/org/fao/geonet/api/processing/ProcessApi.java +++ b/services/src/main/java/org/fao/geonet/api/processing/ProcessApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.processing; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -99,7 +101,7 @@ public List<ProcessingReport> getProcessReport() throws Exception { MediaType.APPLICATION_JSON_VALUE }) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Report registry cleared."), + @ApiResponse(responseCode = "204", description = "Report registry cleared.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_AUTHENTICATED) }) @ResponseBody diff --git a/services/src/main/java/org/fao/geonet/api/records/DoiApi.java b/services/src/main/java/org/fao/geonet/api/records/DoiApi.java index ce59aa1d8e4..97dbd5b10e5 100644 --- a/services/src/main/java/org/fao/geonet/api/records/DoiApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/DoiApi.java @@ -23,6 +23,8 @@ package org.fao.geonet.api.records; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -182,7 +184,7 @@ ResponseEntity<Map<String, String>> createDoi( ) @PreAuthorize("hasAuthority('Administrator')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "DOI unregistered."), + @ApiResponse(responseCode = "204", description = "DOI unregistered.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Metadata or DOI not found."), @ApiResponse(responseCode = "500", description = "Service unavailable."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java index 0dfb298d2c3..8204995874d 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java @@ -27,6 +27,8 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -206,7 +208,7 @@ public class MetadataInsertDeleteApi { + "from the index and then from the database.") @RequestMapping(value = "/{metadataUuid}", method = RequestMethod.DELETE) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Record deleted."), + @ApiResponse(responseCode = "204", description = "Record deleted.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "401", description = "This template is referenced"), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataSharingApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataSharingApi.java index e7d9da4e0a9..5967992f740 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataSharingApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataSharingApi.java @@ -25,6 +25,8 @@ import com.google.common.base.Optional; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -215,7 +217,7 @@ public List<PublicationOption> getPublicationOptions() { method = RequestMethod.PUT ) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Settings updated."), + @ApiResponse(responseCode = "204", description = "Settings updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) @PreAuthorize("hasAuthority('Reviewer')") @@ -260,7 +262,7 @@ public void publish( method = RequestMethod.PUT ) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Settings updated."), + @ApiResponse(responseCode = "204", description = "Settings updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) @PreAuthorize("hasAuthority('Reviewer')") @@ -314,7 +316,7 @@ public void unpublish( method = RequestMethod.PUT ) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Settings updated."), + @ApiResponse(responseCode = "204", description = "Settings updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) @PreAuthorize("hasAuthority('Editor')") @@ -775,7 +777,7 @@ public SharingResponse getRecordSharingSettings( method = RequestMethod.PUT ) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Record group updated."), + @ApiResponse(responseCode = "204", description = "Record group updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) @PreAuthorize("hasAuthority('Editor')") @@ -818,9 +820,9 @@ public void setRecordGroup( metadataManager.save(metadata); dataManager.indexMetadata(String.valueOf(metadata.getId()), true); - new RecordGroupOwnerChangeEvent(metadata.getId(), - ApiUtils.getUserSession(request.getSession()).getUserIdAsInt(), - ObjectJSONUtils.convertObjectInJsonObject(oldGroup, RecordGroupOwnerChangeEvent.FIELD), + new RecordGroupOwnerChangeEvent(metadata.getId(), + ApiUtils.getUserSession(request.getSession()).getUserIdAsInt(), + ObjectJSONUtils.convertObjectInJsonObject(oldGroup, RecordGroupOwnerChangeEvent.FIELD), ObjectJSONUtils.convertObjectInJsonObject(group.get(), RecordGroupOwnerChangeEvent.FIELD)).publish(appContext); } diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java index 0e326143429..f13a0b66e3d 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java @@ -25,6 +25,8 @@ import com.google.common.collect.Sets; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -212,7 +214,7 @@ private void indexTags(AbstractMetadata metadata) throws Exception { @DeleteMapping(value = "/{metadataUuid}/tags") @ResponseStatus(value = HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Record tags removed."), + @ApiResponse(responseCode = "204", description = "Record tags removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) @PreAuthorize("hasAuthority('Editor')") diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataWorkflowApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataWorkflowApi.java index 054a72b0d86..dd72b20e8fe 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataWorkflowApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataWorkflowApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.records; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -576,7 +578,7 @@ public Map<Integer, StatusChangeType> setStatus(@Parameter(description = API_PAR method = RequestMethod.PUT ) @PreAuthorize("hasAuthority('Editor')") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Task closed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Task closed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Status not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) @ResponseStatus(HttpStatus.NO_CONTENT) @@ -604,7 +606,7 @@ public void closeTask(@Parameter(description = API_PARAM_RECORD_UUID, required = @io.swagger.v3.oas.annotations.Operation(summary = "Delete a record status", description = "") @RequestMapping(value = "/{metadataUuid}/status/{statusId:[0-9]+}.{userId:[0-9]+}.{changeDate}", method = RequestMethod.DELETE) @PreAuthorize("hasAuthority('Administrator')") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Status removed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Status removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Status not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN)}) @ResponseStatus(HttpStatus.NO_CONTENT) @@ -631,7 +633,7 @@ public void deleteRecordStatus( @io.swagger.v3.oas.annotations.Operation(summary = "Delete all record status", description = "") @RequestMapping(value = "/{metadataUuid}/status", method = RequestMethod.DELETE) @PreAuthorize("hasAuthority('Administrator')") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Status removed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Status removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Status not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN)}) @ResponseStatus(HttpStatus.NO_CONTENT) diff --git a/services/src/main/java/org/fao/geonet/api/records/attachments/AttachmentsApi.java b/services/src/main/java/org/fao/geonet/api/records/attachments/AttachmentsApi.java index b1b27ecfa30..e30deec309a 100644 --- a/services/src/main/java/org/fao/geonet/api/records/attachments/AttachmentsApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/attachments/AttachmentsApi.java @@ -178,7 +178,7 @@ public List<MetadataResource> getAllResources( @io.swagger.v3.oas.annotations.Operation(summary = "Delete all uploaded metadata resources") @RequestMapping(method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasAuthority('Editor')") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Attachment added."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Attachment added.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) @ResponseStatus(value = HttpStatus.NO_CONTENT) public void delResources( @@ -316,7 +316,7 @@ public MetadataResource patchResource( @io.swagger.v3.oas.annotations.Operation(summary = "Delete a metadata resource") @PreAuthorize("hasAuthority('Editor')") @RequestMapping(value = "/{resourceId:.+}", method = RequestMethod.DELETE) - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Attachment visibility removed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Attachment visibility removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) @ResponseStatus(value = HttpStatus.NO_CONTENT) public void delResource( diff --git a/services/src/main/java/org/fao/geonet/api/records/editing/MetadataEditingApi.java b/services/src/main/java/org/fao/geonet/api/records/editing/MetadataEditingApi.java index 3899f9e1967..16aaee8d1d5 100644 --- a/services/src/main/java/org/fao/geonet/api/records/editing/MetadataEditingApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/editing/MetadataEditingApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.records.editing; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -532,7 +534,7 @@ public void saveEdits( MediaType.ALL_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE}) @PreAuthorize("hasAuthority('Editor')") @ResponseStatus(HttpStatus.NO_CONTENT) - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Editing session cancelled."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Editing session cancelled.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) @ResponseBody public void cancelEdits(@Parameter(description = API_PARAM_RECORD_UUID, required = true) @PathVariable String metadataUuid, @@ -614,7 +616,7 @@ public void reorderElement(@Parameter(description = API_PARAM_RECORD_UUID, requi MediaType.ALL_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE}) @PreAuthorize("hasAuthority('Editor')") @ResponseStatus(HttpStatus.NO_CONTENT) - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Element removed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Element removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) @ResponseBody public void deleteElement( @@ -638,7 +640,7 @@ public void deleteElement( MediaType.ALL_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE}) @PreAuthorize("hasAuthority('Editor')") @ResponseStatus(HttpStatus.NO_CONTENT) - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Attribute removed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Attribute removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) @ResponseBody public void deleteAttribute( diff --git a/services/src/main/java/org/fao/geonet/api/records/formatters/CacheApi.java b/services/src/main/java/org/fao/geonet/api/records/formatters/CacheApi.java index d90ea166d70..eb9b39200b3 100644 --- a/services/src/main/java/org/fao/geonet/api/records/formatters/CacheApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/formatters/CacheApi.java @@ -23,6 +23,8 @@ package org.fao.geonet.api.records.formatters; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import static org.fao.geonet.api.ApiParams.API_CLASS_FORMATTERS_OPS; import static org.fao.geonet.api.ApiParams.API_CLASS_FORMATTERS_TAG; @@ -67,7 +69,7 @@ public class CacheApi { @ResponseStatus(HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('Administrator')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Cache cleared."), + @ApiResponse(responseCode = "204", description = "Cache cleared.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = "Operation not allowed. Only Administrator can access it.") }) public void clearFormatterCache() throws Exception { diff --git a/services/src/main/java/org/fao/geonet/api/selections/UserSelectionsApi.java b/services/src/main/java/org/fao/geonet/api/selections/UserSelectionsApi.java index f4d501f7d90..595ec851698 100644 --- a/services/src/main/java/org/fao/geonet/api/selections/UserSelectionsApi.java +++ b/services/src/main/java/org/fao/geonet/api/selections/UserSelectionsApi.java @@ -23,6 +23,8 @@ package org.fao.geonet.api.selections; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -160,7 +162,7 @@ public ResponseEntity createPersistentSelectionType( method = RequestMethod.PUT) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Selection updated."), + @ApiResponse(responseCode = "204", description = "Selection updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Selection not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @@ -209,7 +211,7 @@ public ResponseEntity updateUserSelection( method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Selection removed."), + @ApiResponse(responseCode = "204", description = "Selection removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Selection not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @@ -348,7 +350,7 @@ ResponseEntity<String> addToUserSelection( public @ResponseBody @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Items removed from a set."), + @ApiResponse(responseCode = "204", description = "Items removed from a set.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Selection or user not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) diff --git a/services/src/main/java/org/fao/geonet/api/site/LogosApi.java b/services/src/main/java/org/fao/geonet/api/site/LogosApi.java index b448bfe4530..a0dc037a1a3 100644 --- a/services/src/main/java/org/fao/geonet/api/site/LogosApi.java +++ b/services/src/main/java/org/fao/geonet/api/site/LogosApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.site; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -240,7 +242,7 @@ public void getLogo( @ResponseStatus(value = HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('UserAdmin')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Logo removed."), + @ApiResponse(responseCode = "204", description = "Logo removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) diff --git a/services/src/main/java/org/fao/geonet/api/site/SiteApi.java b/services/src/main/java/org/fao/geonet/api/site/SiteApi.java index a2bd724fa59..5668d6429e5 100644 --- a/services/src/main/java/org/fao/geonet/api/site/SiteApi.java +++ b/services/src/main/java/org/fao/geonet/api/site/SiteApi.java @@ -26,6 +26,8 @@ import co.elastic.clients.elasticsearch.core.CountRequest; import co.elastic.clients.elasticsearch.core.CountResponse; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -397,7 +399,7 @@ public List<Setting> getSettingsDetails( @PreAuthorize("hasAuthority('Administrator')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Settings saved."), + @ApiResponse(responseCode = "204", description = "Settings saved.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) }) public void saveSettings( @@ -516,7 +518,7 @@ public boolean isCasEnabled( method = RequestMethod.PUT) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Staging profile saved."), + @ApiResponse(responseCode = "204", description = "Staging profile saved.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) }) @PreAuthorize("hasAuthority('Administrator')") @@ -761,7 +763,7 @@ public ProxyConfiguration getProxyConfiguration( @PreAuthorize("hasAuthority('Administrator')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Logo set."), + @ApiResponse(responseCode = "204", description = "Logo set.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) public void setLogo( diff --git a/services/src/main/java/org/fao/geonet/api/sources/SourcesApi.java b/services/src/main/java/org/fao/geonet/api/sources/SourcesApi.java index 5b50c543e5c..da0f179a4fc 100644 --- a/services/src/main/java/org/fao/geonet/api/sources/SourcesApi.java +++ b/services/src/main/java/org/fao/geonet/api/sources/SourcesApi.java @@ -227,7 +227,7 @@ private void copySourceLogo(Source source, HttpServletRequest request) { @PreAuthorize("hasAuthority('UserAdmin')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Source updated."), + @ApiResponse(responseCode = "204", description = "Source updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "Source not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @@ -278,7 +278,7 @@ public ResponseEntity updateSource( @PreAuthorize("hasAuthority('Administrator')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Source deleted."), + @ApiResponse(responseCode = "204", description = "Source deleted.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) }) @ResponseBody diff --git a/services/src/main/java/org/fao/geonet/api/status/StatusApi.java b/services/src/main/java/org/fao/geonet/api/status/StatusApi.java index df46dfe0bed..fa3715dca08 100644 --- a/services/src/main/java/org/fao/geonet/api/status/StatusApi.java +++ b/services/src/main/java/org/fao/geonet/api/status/StatusApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.status; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -79,7 +81,7 @@ public List<StatusValue> getStatusByType( @RequestMapping(method = RequestMethod.DELETE) @PreAuthorize("hasAuthority('Administrator')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "Status removed."), + @ApiResponse(responseCode = "204", description = "Status removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) }) @ResponseStatus(HttpStatus.NO_CONTENT) diff --git a/services/src/main/java/org/fao/geonet/api/uisetting/UiSettingApi.java b/services/src/main/java/org/fao/geonet/api/uisetting/UiSettingApi.java index 8fa7193367d..1696eca05a9 100644 --- a/services/src/main/java/org/fao/geonet/api/uisetting/UiSettingApi.java +++ b/services/src/main/java/org/fao/geonet/api/uisetting/UiSettingApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.uisetting; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -178,7 +180,7 @@ public UiSetting getUiConfiguration( @PreAuthorize("hasAuthority('UserAdmin')") @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "UI configuration updated."), + @ApiResponse(responseCode = "204", description = "UI configuration updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) @ResponseBody @@ -232,7 +234,7 @@ public ResponseEntity updateUiConfiguration( method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "UI Configuration removed."), + @ApiResponse(responseCode = "204", description = "UI Configuration removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = "UI Configuration not found."), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_USER_ADMIN) }) diff --git a/services/src/main/java/org/fao/geonet/api/userfeedback/UserFeedbackAPI.java b/services/src/main/java/org/fao/geonet/api/userfeedback/UserFeedbackAPI.java index a782fb814f1..9f66a220817 100644 --- a/services/src/main/java/org/fao/geonet/api/userfeedback/UserFeedbackAPI.java +++ b/services/src/main/java/org/fao/geonet/api/userfeedback/UserFeedbackAPI.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.userfeedback; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -146,7 +148,7 @@ public List<RatingCriteria> getRatingCriteria( @RequestMapping(value = "/userfeedback/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('Reviewer')") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "User feedback removed."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "User feedback removed.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_REVIEWER)}) @ResponseBody public ResponseEntity deleteUserFeedback( @@ -719,7 +721,7 @@ private void printOutputMessage(final HttpServletResponse response, final HttpSt @RequestMapping(value = "/userfeedback/{uuid}/publish", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET) @ResponseStatus(value = HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('Reviewer')") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "User feedback published."), + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "User feedback published.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_REVIEWER), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND)}) @ResponseBody diff --git a/services/src/main/java/org/fao/geonet/api/users/MeApi.java b/services/src/main/java/org/fao/geonet/api/users/MeApi.java index 955f9e4f392..ee5e882dc20 100644 --- a/services/src/main/java/org/fao/geonet/api/users/MeApi.java +++ b/services/src/main/java/org/fao/geonet/api/users/MeApi.java @@ -25,6 +25,8 @@ import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -66,7 +68,7 @@ public class MeApi { @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Authenticated. Return user details."), - @ApiResponse(responseCode = "204", description = "Not authenticated.") + @ApiResponse(responseCode = "204", description = "Not authenticated.", content = {@Content(schema = @Schema(hidden = true))}) }) @ResponseStatus(OK) @ResponseBody diff --git a/services/src/main/java/org/fao/geonet/api/usersearches/UserSearchesApi.java b/services/src/main/java/org/fao/geonet/api/usersearches/UserSearchesApi.java index 517744f9ce7..23a4a148a85 100644 --- a/services/src/main/java/org/fao/geonet/api/usersearches/UserSearchesApi.java +++ b/services/src/main/java/org/fao/geonet/api/usersearches/UserSearchesApi.java @@ -24,6 +24,8 @@ package org.fao.geonet.api.usersearches; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -350,7 +352,7 @@ public ResponseEntity<Integer> createUserCustomSearch( @ResponseStatus(value = HttpStatus.NO_CONTENT) @PreAuthorize("hasAuthority('UserAdmin')") @ApiResponses(value = { - @ApiResponse(responseCode = "204", description = "User search updated."), + @ApiResponse(responseCode = "204", description = "User search updated.", content = {@Content(schema = @Schema(hidden = true))}), @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND) }) @ResponseBody From aa125f5f1a53f1acf4b80f9f861ae8141cf67f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Fri, 20 Sep 2024 15:52:15 +0200 Subject: [PATCH 52/97] Aggregations / Temporal range / Avoid browser autocomplete on calendar field When using temporal range for aggregations ``` resourceTemporalDateRange: { gnBuildFilterForRange: { field: "resourceTemporalDateRange", buckets: 2024 - 1970, dateFormat: "YYYY", dateSelectMode: "years", vegaDateFormat: "%Y", from: 1970, to: 2024, mark: "area" }, meta: { vega: "timeline", collapsed: true } }, ``` browser autocomplete may overlap with calendar --- .../elasticsearch/directives/partials/facet-temporalrange.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html b/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html index 8029f53fbf8..0bcc837be43 100644 --- a/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html +++ b/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet-temporalrange.html @@ -12,6 +12,7 @@ class="input-sm form-control" data-ng-model="range.from" data-ng-model-options="{debounce: 500}" + autocomplete="off" name="start" /> <span class="input-group-addon"> @@ -22,6 +23,7 @@ class="input-sm form-control" data-ng-model="range.to" data-ng-model-options="{debounce: 500}" + autocomplete="off" name="end" /> <span class="input-group-btn"> From a5a1b49ad20a58ebce1c56be2b558fc45fff1ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Gabri=C3=ABl?= <michel.gabriel@geocat.net> Date: Mon, 23 Sep 2024 16:11:55 +0200 Subject: [PATCH 53/97] Update configuring-faceted-search.md --- .../docs/customizing-application/configuring-faceted-search.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/docs/customizing-application/configuring-faceted-search.md b/docs/manual/docs/customizing-application/configuring-faceted-search.md index 7af888bdc0f..292739175bc 100644 --- a/docs/manual/docs/customizing-application/configuring-faceted-search.md +++ b/docs/manual/docs/customizing-application/configuring-faceted-search.md @@ -467,7 +467,7 @@ A date range field: "resourceTemporalDateRange": { "gnBuildFilterForRange": { "field": "resourceTemporalDateRange", - "buckets": "2021 - 1970", + "buckets": 51, //"2021 - 1970", "dateFormat": "YYYY", "vegaDateFormat": "%Y", "from": "1970", From 94c0586506d0f119e9db238a5a673ccf9de1430d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Tue, 17 Sep 2024 13:41:50 +0200 Subject: [PATCH 54/97] Fix the schema artifact name in add schema script --- add-schema.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/add-schema.sh b/add-schema.sh index 2a268428530..4f1ecc8c92d 100755 --- a/add-schema.sh +++ b/add-schema.sh @@ -83,7 +83,7 @@ then ${insertLine} a\\ \ <dependency>\\ \ <groupId>org.geonetwork-opensource.schemas</groupId>\\ -\ <artifactId>schema-${schema}</artifactId>\\ +\ <artifactId>gn-schema-${schema}</artifactId>\\ \ <version>${gnSchemasVersion}</version>\\ \ </dependency> SED_SCRIPT @@ -103,7 +103,7 @@ SED_SCRIPT \ <dependencies>\\ \ <dependency>\\ \ <groupId>org.geonetwork-opensource.schemas</groupId>\\ -\ <artifactId>schema-${schema}</artifactId>\\ +\ <artifactId>gn-schema-${schema}</artifactId>\\ \ <version>${gnSchemasVersion}</version>\\ \ </dependency>\\ \ </dependencies>\\ @@ -121,7 +121,7 @@ SED_SCRIPT \ <artifactItems>\\ \ <artifactItem>\\ \ <groupId>org.geonetwork-opensource.schemas</groupId>\\ -\ <artifactId>schema-${schema}</artifactId>\\ +\ <artifactId>gn-schema-${schema}</artifactId>\\ \ <type>zip</type>\\ \ <overWrite>false</overWrite>\\ \ <outputDirectory>\$\{schema-plugins.dir\}</outputDirectory>\\ @@ -138,7 +138,7 @@ SED_SCRIPT fi # Add schema resources in service/pom.xml with test scope for unit tests -line=$(grep -n "<artifactId>schema-${schema}</artifactId>" services/pom.xml | cut -d: -f1) +line=$(grep -n "<artifactId>gn-schema-${schema}</artifactId>" services/pom.xml | cut -d: -f1) if [ ! $line ] then @@ -154,7 +154,7 @@ then ${finalLine} a\\ \ <dependency>\\ \ <groupId>${projectGroupId}</groupId>\\ -\ <artifactId>schema-${schema}</artifactId>\\ +\ <artifactId>gn-schema-${schema}</artifactId>\\ \ <version>${gnSchemasVersion}</version>\\ \ <scope>test</scope>\\ \ </dependency> From 8436990a78485522b8712b5aba4b26abb5ca6805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 12 Sep 2024 14:35:55 +0200 Subject: [PATCH 55/97] ISO19139 / ISO19115.3 / Index resource date fields as defined in the metadata. Previously the values were converted to UTC. If the timezone defined in the server is Europe/Madrid and the metadata has a creation date '2023-01-01T00:00:00', the index field creationYearForResource had the value 2022 --- .../main/plugin/iso19115-3.2018/index-fields/index.xsl | 8 +++++--- .../src/main/plugin/iso19139/index-fields/index.xsl | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl index 35ed82ac5bf..207439102c6 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl @@ -327,14 +327,16 @@ </xsl:variable> <xsl:choose> <xsl:when test="$zuluDateTime != ''"> + <!-- Store original date information for the resource, instead of $zuluDateTime, + to avoid timezone shifts when used for facet filters --> <xsl:element name="{$dateType}DateForResource"> - <xsl:value-of select="$zuluDateTime"/> + <xsl:value-of select="$date"/> </xsl:element> <xsl:element name="{$dateType}YearForResource"> - <xsl:value-of select="substring($zuluDateTime, 0, 5)"/> + <xsl:value-of select="substring($date, 0, 5)"/> </xsl:element> <xsl:element name="{$dateType}MonthForResource"> - <xsl:value-of select="substring($zuluDateTime, 0, 8)"/> + <xsl:value-of select="substring($date, 0, 8)"/> </xsl:element> </xsl:when> <xsl:otherwise> diff --git a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl index c2a7ee33ec8..06c47aa519b 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl @@ -287,14 +287,16 @@ <xsl:choose> <xsl:when test="$zuluDateTime != ''"> + <!-- Store original date information for the resource, instead of $zuluDateTime, + to avoid timezone shifts when used for facet filters --> <xsl:element name="{$dateType}DateForResource"> - <xsl:value-of select="$zuluDateTime"/> + <xsl:value-of select="$date"/> </xsl:element> <xsl:element name="{$dateType}YearForResource"> - <xsl:value-of select="substring($zuluDateTime, 0, 5)"/> + <xsl:value-of select="substring($date, 0, 5)"/> </xsl:element> <xsl:element name="{$dateType}MonthForResource"> - <xsl:value-of select="substring($zuluDateTime, 0, 8)"/> + <xsl:value-of select="substring($date, 0, 8)"/> </xsl:element> </xsl:when> <xsl:otherwise> From 0d73e4f798d823849a12eb7180c22cd080878746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Gabri=C3=ABl?= <michel.gabriel@geocat.net> Date: Mon, 23 Sep 2024 21:00:30 +0200 Subject: [PATCH 56/97] Fix the overlapping filter settings and the customize options (#8316) * These changes fix the overlapping filter settings and the customize options dropdown on the `User Interface` page. The 2 buttons (save and delete) got an improvement alignment. Further improvements: - spacing between title and UI config name - fix paddings on smaller screens - whitespace between buttons and inputs * Fix for a few cases where the layout was still wrong and too small. Every width now displays the buttons below the 2 inputs * Remove commented style --- .../admin/uiconfig/partials/uiconfig.html | 14 ++++++------- .../catalog/templates/admin/settings/ui.html | 20 +++++++++++------- .../views/default/less/gn_admin_default.less | 21 ++++++++++++++++++- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/admin/uiconfig/partials/uiconfig.html b/web-ui/src/main/resources/catalog/components/admin/uiconfig/partials/uiconfig.html index e4c6199680b..132fc2c5b36 100644 --- a/web-ui/src/main/resources/catalog/components/admin/uiconfig/partials/uiconfig.html +++ b/web-ui/src/main/resources/catalog/components/admin/uiconfig/partials/uiconfig.html @@ -3,14 +3,12 @@ id="gn-uiconfig-customize" class="col-lg-6 col-lg-offset-6 gn-nopadding-right height-70-px" > - <div class="pull-right"> - <label class="d-block" data-translate="">chooseOptionsToCustomize</label> - <select - class="form-control" - data-ng-options="o.label group by o.group for o in configOptions" - data-ng-model="optionsToAdd" - ></select> - </div> + <label class="d-block" data-translate="">chooseOptionsToCustomize</label> + <select + class="form-control" + data-ng-options="o.label group by o.group for o in configOptions" + data-ng-model="optionsToAdd" + ></select> </div> <p class="help-block" data-translate="">ui/config-help</p> diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html b/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html index 80dd7408aec..fab8d3a89e6 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html @@ -25,7 +25,7 @@ id="gn-uiconfig-toolbar" > <div class="row"> - <div class="col-md-4 gn-nopadding-left"> + <div class="col-md-6 gn-nopadding-left"> <label for="uiConfigurationList" title="{{'uiConfiguration-help' | translate}}" @@ -40,12 +40,12 @@ ></select> </div> - <div class="col-md-8 gn-nopadding-left gn-nopadding-right"> + <div class="col-md-6 gn-nopadding-left gn-nopadding-right"> <label for="addUiSettings" data-translate="">addUiSettings</label> <div class="row"> <!-- add UI config --> - <div class="col-md-6 gn-nopadding-left"> + <div class="col-md-12 gn-nopadding-left"> <div class="input-group"> <input class="form-control" @@ -69,8 +69,9 @@ </div> </div> + <!-- delete and save--> - <div class="col-md-6 gn-nopadding-left gn-nopadding-right"> + <div class="col-md-12 gn-nopadding-left gn-nopadding-right"> <div class="btn-toolbar pull-right"> <button type="submit" @@ -78,8 +79,9 @@ id="gn-btn-settings-delete" data-ng-disabled="!uiConfiguration" data-ng-click="deleteUiConfig()" + title="{{'deleteUiSettings'|translate}}" > - <span class="fa fa-times"></span> + <span class="fa fa-fw fa-times"></span> {{"deleteUiSettings"|translate}} </button> <button @@ -88,8 +90,9 @@ id="gn-btn-settings-save" data-ng-disabled="!gnSettings.$valid" data-ng-click="updateUiConfig()" + title="{{'saveSettings'|translate}}" > - <span class="fa fa-save"></span> + <span class="fa fa-fw fa-save"></span> {{"saveSettings"|translate}} </button> </div> @@ -104,7 +107,10 @@ data-ng-show="uiConfiguration.configuration !== undefined" > <div class="panel-heading"> - <h1><span data-translate="">ui</span> <strong>{{uiConfiguration.id}}</strong></h1> + <h1> + <span data-translate="" class="gn-margin-right-sm">ui</span> + <strong>{{uiConfiguration.id}}</strong> + </h1> <div data-gn-need-help="user-interface-configuration" class="pull-right"></div> </div> diff --git a/web-ui/src/main/resources/catalog/views/default/less/gn_admin_default.less b/web-ui/src/main/resources/catalog/views/default/less/gn_admin_default.less index 461ec2fa5c1..c9b868d0b27 100644 --- a/web-ui/src/main/resources/catalog/views/default/less/gn_admin_default.less +++ b/web-ui/src/main/resources/catalog/views/default/less/gn_admin_default.less @@ -515,6 +515,16 @@ ul.gn-resultview li.list-group-item { margin-bottom: 10px; border-color: #ccc; } + .col-lg-4, .col-md-6 { + @media (max-width: @screen-sm-max) { + padding-right: 0 !important; + } + } + .col-md-12, #gn-uiconfig-customize { + padding-right: 0 !important; + margin-bottom: @gn-spacing; + } + // checkbox (Bootstrap 5.2) input[type="checkbox"], input[type="radio"] { @@ -656,7 +666,16 @@ ul.gn-resultview li.list-group-item { z-index: 901; } #gn-uiconfig-customize { - margin-top: -85px; + + @media (max-width: @screen-md-max) { + padding-left: 0 !important; + } + + @media (min-width: @screen-lg-min) { + margin-top: -85px; + } + + .dropdown-menu { padding: 0 !important; li { From 2629a902249ed404c0a346fb45a12cc75a25038f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Mon, 16 Sep 2024 13:30:44 +0200 Subject: [PATCH 57/97] Metadata detail page - hide history types selector when tasks (DOI) and workflow are disabled --- .../catalog/components/history/GnHistoryDirective.js | 9 ++++++++- .../components/history/partials/recordHistory.html | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/history/GnHistoryDirective.js b/web-ui/src/main/resources/catalog/components/history/GnHistoryDirective.js index df5c81d2dbc..dbd0f27688b 100644 --- a/web-ui/src/main/resources/catalog/components/history/GnHistoryDirective.js +++ b/web-ui/src/main/resources/catalog/components/history/GnHistoryDirective.js @@ -58,7 +58,10 @@ if (gnConfig["metadata.workflow.enable"]) { types.workflow = true; } - types.task = true; + // Currently the only task is DOI + if (gnConfig["system.publication.doi.doienabled"]) { + types.task = true; + } types.event = true; scope.filter = { @@ -69,6 +72,10 @@ }; }); + scope.getNumberOfTypes = function () { + return Object.keys(scope.filter.types).length; + }; + // Wait for metatada to be available scope.$watch("md", function (n, o) { if (angular.isDefined(n)) { diff --git a/web-ui/src/main/resources/catalog/components/history/partials/recordHistory.html b/web-ui/src/main/resources/catalog/components/history/partials/recordHistory.html index 7bd26fc6311..09bcd634bc7 100644 --- a/web-ui/src/main/resources/catalog/components/history/partials/recordHistory.html +++ b/web-ui/src/main/resources/catalog/components/history/partials/recordHistory.html @@ -4,7 +4,7 @@ <span data-translate="">recordHistory</span> </div> <div class="panel-body"> - <div class="btn-group"> + <div class="btn-group" data-ng-if="getNumberOfTypes() > 1"> <label data-ng-repeat="(k, v) in filter.types" class="btn btn-default" From 835a29394b967b09a81f49ba0aa3dd64aeadcc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Gabri=C3=ABl?= <michel.gabriel@geocat.net> Date: Tue, 24 Sep 2024 09:59:24 +0200 Subject: [PATCH 58/97] Visual and UX changes for WFS previews (#8284) * Visual and UX improvements to the WFS preview: - added whitespace - remove border for the selection lists - re-order buttons - toolbar positioned on the right of the table - larger buttons in the metadata page and map * Visual and UX improvements to the WFS preview: - pushed missing changes * Visual and UX improvements to the WFS preview: - fix the removal of borders in all map panels * Fix for the missing variables: they have been replaced by actual values --- .../search/mdview/partials/datapreview.html | 4 +- .../viewer/gfi/partials/featurestables.html | 11 +- .../wfsfilter/partials/wfsfilterfacet.html | 120 +++++++++--------- .../src/main/resources/catalog/style/gn.less | 3 + .../resources/catalog/style/gn_viewer.less | 85 ++++++++++++- 5 files changed, 151 insertions(+), 72 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/search/mdview/partials/datapreview.html b/web-ui/src/main/resources/catalog/components/search/mdview/partials/datapreview.html index dca4cf4e11e..e49c707a527 100644 --- a/web-ui/src/main/resources/catalog/components/search/mdview/partials/datapreview.html +++ b/web-ui/src/main/resources/catalog/components/search/mdview/partials/datapreview.html @@ -1,7 +1,7 @@ <div data-ng-if="hasExtent" ol-map="map"></div> <div class="row"> - <div class="col-md-3"> + <div class="col-md-3 gn-nopadding-left gn-padding-top-lg"> <div data-gn-wfs-filter-facets="" data-layer="currentLayer" @@ -9,7 +9,7 @@ data-boot-mode="index" ></div> </div> - <div class="col-md-9"> + <div class="col-md-9 gn-nopadding-right gn-padding-top-lg"> <gn-features-tables gn-features-tables-map="map" data-show-close="false" diff --git a/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html b/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html index 2e04c189d49..59a2726ae30 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html +++ b/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html @@ -63,12 +63,11 @@ data-ng-show="ctrl.currentTable == table" ng-repeat="table in ctrl.tables" > - <div class="pull-left"> - <strong> - <span>{{table.name}}</span>  {{table.loader.getCount()}} - <span data-translate="">features</span> - </strong> - </div> +<!-- <div class="pull-left">--> + <h4> + <span>{{table.name}}</span> + </h4> +<!-- </div>--> <gn-features-table gn-features-table-loader="table.loader" gn-features-table-loader-map="ctrl.map" diff --git a/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html b/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html index 8c75135b90d..98915cc5eb6 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html +++ b/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html @@ -17,21 +17,19 @@ <div data-ng-show="isWfsAvailable"> <!--admin buttons--> + <!--Facet count--> + <h4 + data-ng-if="isFeaturesIndexed" + class="count" + data-ng-if="showCount" + > + {{count | number}} / {{countTotal | number}} <span translate="" + >features</span + > + </h4> <div class="btn-group dropup wfs-filter-group"> - <!--Facet count--> - <div - class="btn btn-default btn-xs disabled" - data-ng-if="isFeaturesIndexed" - class="count text-center" - data-ng-if="showCount" - > - {{count | number}} / {{countTotal | number}} <span translate="" - >features</span - > - </div> - <button - class="btn btn-default btn-xs" + class="btn btn-default" data-ng-if="!managerOnly && isFeaturesIndexed && displayTableOnLoad != 'true'" @@ -41,7 +39,7 @@ <i class="fa fa-table"></i> </button> <button - class="btn btn-default btn-xs" + class="btn btn-default" data-ng-disabled="!indexObject.isPointOnly" data-ng-if="!managerOnly && isFeaturesIndexed" @@ -52,7 +50,7 @@ <i class="fa fa-th-large"></i> </button> <button - class="btn btn-default btn-xs" + class="btn btn-default" ng-class="{ disabled: !filtersChanged }" data-ng-if="!managerOnly && isFeaturesIndexed" title="{{::'applyFilter' | translate}}" @@ -62,7 +60,7 @@ <i class="fa fa-filter"></i> </button> <button - class="btn btn-default btn-xs" + class="btn btn-default" title="{{::'refresh' | translate}}" data-ng-if="(user.canEditRecord(md) || (user.isAdministrator() && md.isHarvested == 'true'))" @@ -74,7 +72,7 @@ data-ng-if="(user.canEditRecord(md) || (user.isAdministrator() && md.isHarvested == 'true'))" type="button" - class="btn btn-default btn-xs dropdown-toggle" + class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" @@ -105,7 +103,7 @@ data-ng-if="managerOnly" title="{{'addToMap' | translate}}" data-ng-href="catalog.search#/map?add={{mapAddCmd | encodeURIComponent}}" - class="btn btn-default btn-xs" + class="btn btn-default" > <i class="fa fa-globe"></i> </a> @@ -133,43 +131,49 @@ ></gn-heatmap> <!-- Search --> - <div - data-ng-if="!managerOnly && isFeaturesIndexed" - class="input-group input-group-sm" - > - <input - class="form-control input-xs" - data-ng-keyup="$event.keyCode == 13 && filterFacets()" - type="text" - placeholder="{{::'anyPlaceHolder' | translate}}" - data-ng-model="ctrl.filter.fullTextSearch" - /> - <span class="input-group-btn"> - <button - data-ng-if="!managerOnly && isFeaturesIndexed" - data-gn-click-and-spin="resetFacets(false).then(filterWMS)" - title="{{'reset' | translate}}" - class="btn btn-default btn-xs gn-reset-facets" - > - <i class="fa fa-fw fa-times"></i> - </button> - <button - data-ng-if="!managerOnly && isFeaturesIndexed" - title="{{'featuresInMapExtent' | translate}}" - data-ng-click="setFeaturesInMapExtent()" - data-ng-class="{'active': featuresInMapExtent}" - class="btn btn-default btn-xs" - > - <i class="fa fa-pencil-square-o fa-fw"></i> - </button> - <button - class="btn btn-default btn-xs" - title="{{'search' | translate}}" - data-ng-click="filterFacets()" - > - <i class="fa fa-fw fa-search"></i> - </button> - </span> + <div class="flex-row flex-align-center gn-margin-bottom"> + <div + data-ng-if="!managerOnly && isFeaturesIndexed" + class="input-group flex-grow gn-margin-right-sm" + > + <input + class="form-control" + data-ng-keyup="$event.keyCode == 13 && filterFacets()" + type="text" + placeholder="{{::'anyPlaceHolder' | translate}}" + data-ng-model="ctrl.filter.fullTextSearch" + /> + <div class="input-group-btn"> + + <button + data-ng-if="!managerOnly && isFeaturesIndexed" + data-gn-click-and-spin="resetFacets(false).then(filterWMS)" + title="{{'reset' | translate}}" + class="btn btn-default gn-reset-facets" + > + <i class="fa fa-fw fa-times"></i> + </button> + + <button + class="btn btn-default" + title="{{'search' | translate}}" + data-ng-click="filterFacets()" + > + <i class="fa fa-fw fa-search"></i> + </button> + + </div> + + </div> + <button + data-ng-if="!managerOnly && isFeaturesIndexed" + title="{{'featuresInMapExtent' | translate}}" + data-ng-click="setFeaturesInMapExtent()" + data-ng-class="{'active': featuresInMapExtent}" + class="btn btn-default" + > + <i class="fa fa-pencil-square-o fa-fw"></i> + </button> </div> <!-- Facets --> @@ -185,7 +189,7 @@ data-ng-class="{'text-primary': isFilterActive(field.name, field)}" > <span - class="fa fa-arrow-circle-right" + class="fa fa-chevron-right" data-ng-class="{ 'fa-rotate-90': field.expanded, 'gn-field-empty': !isFilterActive(field.name, field) @@ -208,7 +212,7 @@ ></span> <input type="text" - class="form-control input-sm layerfilter" + class="form-control layerfilter" placeholder="{{ 'filter' | translate }}" ng-model="facetFilters[field.name]" ng-model-options="{debounce: 300}" @@ -266,7 +270,7 @@ data-ng-class="{'text-primary': isFilterActive('geometry')}" > <span - class="fa fa-arrow-circle-right" + class="fa fa-chevron-right" data-ng-class="{ 'fa-rotate-90': indexObject.geomField.expanded, 'gn-field-empty': !isFilterActive('geometry') diff --git a/web-ui/src/main/resources/catalog/style/gn.less b/web-ui/src/main/resources/catalog/style/gn.less index c0f4782dfb6..9262198a246 100644 --- a/web-ui/src/main/resources/catalog/style/gn.less +++ b/web-ui/src/main/resources/catalog/style/gn.less @@ -1604,6 +1604,9 @@ gn-indexing-task-status { .text-large { font-size: 30px; } +.width-auto { + width: auto; +} .width-100 { width: 100%; } diff --git a/web-ui/src/main/resources/catalog/style/gn_viewer.less b/web-ui/src/main/resources/catalog/style/gn_viewer.less index c346e805fef..b9198d23921 100644 --- a/web-ui/src/main/resources/catalog/style/gn_viewer.less +++ b/web-ui/src/main/resources/catalog/style/gn_viewer.less @@ -341,7 +341,6 @@ .list-group-item { transition: max-height @transition-params; padding: 5px 15px; - min-height: 42px; &:hover, &:focus { .fa-arrows-alt, @@ -360,6 +359,11 @@ } } } + .gn-facet-container { + .list-group-item { + border: 0; + } + } .gn-baselayer-switcher-menu { list-style: none; .list-group-item { @@ -418,10 +422,11 @@ } } h4 { - margin: 1em 0 0.5em 0; + margin: 1em 0 0 0; + font-size: 16px; } h5 { - margin: 0.2em 0; + margin: 0.7em 0; } [data-gn-layer-dimensions] { overflow: unset !important; @@ -841,11 +846,48 @@ gn-features-tables, .tab-content { background: white; min-height: 5em; - padding: 1em; + padding: 0 15px; } .gn-features-table { - padding: 0.25em; - box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.1); + .bootstrap-table { + display: grid; + grid-template-columns: auto 0fr; + grid-template-rows: auto; + grid-template-areas: + "main toolbar" + "footer toolbar"; + .fixed-table-toolbar { + grid-area: toolbar; + .columns-right { + margin: 0 0 0 10px; + display: inline-block; + vertical-align: middle; + .btn, + .btn-group { + display: block; + float: none; + width: 100%; + max-width: 100%; + margin-top: -1px; + margin-left: 0; + border-radius: 0; + } + .btn:first-child:not(:last-child) { + border-radius: 4px 4px 0 0; + } + .btn-group:last-child:not(:first-child) > .btn:first-child { + border-radius: 0 0 4px 4px; + } + } + } + .fixed-table-container { + grid-area: main; + } + .fixed-table-pagination { + grid-area: footer; + } + } } .layername { display: inline-block; @@ -878,6 +920,11 @@ gn-features-tables, } .gn-md-view { + .tab-content { + background: white; + min-height: 5em; + padding: 0 0 15px 0; + } gn-features-tables { position: unset; .gn-features-table { @@ -891,6 +938,32 @@ gn-features-tables, [data-gn-wfs-filter-facets] .gn-facet-container { overflow: auto; max-height: 550px; + .list-group { + margin-bottom: 0; + .list-group-item { + border: 0; + padding: 8px 15px; + } + } + } +} +.gn-editor-sidebar { + .gn-related-resources { + p { + margin-top: 5px; + } + } + .gn-related-item { + h4 { + font-size: 14px; + } + } + .wfs-filter-group { + margin-top: 10px; + margin-bottom: 0; + .btn { + .btn-xs(); + } } } From c932372349a6d918a5da2671630252f3dc66962a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 26 Sep 2024 11:02:48 +0200 Subject: [PATCH 59/97] Fix harvester execution logs added to previous logs (#8387) --- core/src/main/java/org/fao/geonet/util/LogUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/fao/geonet/util/LogUtil.java b/core/src/main/java/org/fao/geonet/util/LogUtil.java index aa1d0d437f4..93f3c023f7d 100644 --- a/core/src/main/java/org/fao/geonet/util/LogUtil.java +++ b/core/src/main/java/org/fao/geonet/util/LogUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2023 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -57,7 +57,7 @@ public static String initializeHarvesterLog(String type, String name) { // Filename safe representation of harvester name (using '_' as needed). final String harvesterName = name.replaceAll("\\W+", "_"); final String harvesterType = type.replaceAll("\\W+", "_"); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String logfile = "harvester_" + harvesterType @@ -71,7 +71,7 @@ public static String initializeHarvesterLog(String type, String name) { } ThreadContext.put("harvest", harvesterName); - ThreadContext.putIfNull("logfile", logfile); + ThreadContext.put("logfile", logfile); ThreadContext.put("timeZone", timeZoneSetting); return logfile; From cfcd829615063742849fbe1bde11261098dd3713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 26 Sep 2024 12:10:19 +0200 Subject: [PATCH 60/97] GeoNetwork harvester - avoid double counting of updated metadata. (#8389) This happens with existing metadata managed by another harvester if the uuid collision policy is set to override --- .../fao/geonet/kernel/harvest/harvester/geonet/Aligner.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java index f07e05055aa..4f6418d5ddf 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2023 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -216,7 +216,6 @@ public HarvestResult align(SortedSet<RecordInfo> records, List<HarvestError> err params.useChangeDateForUpdate(), localUuids.getChangeDate(ri.uuid), true); log.info("Overriding record with uuid " + ri.uuid); - result.updatedMetadata++; if (params.isIfRecordExistAppendPrivileges()) { addPrivileges(id, params.getPrivileges(), localGroups, context); From 8fb647b21305e61460193225866e3ad31c7fca35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Mon, 7 Oct 2024 10:30:49 +0200 Subject: [PATCH 61/97] Thesaurus / Date improvements. (#8392) * Thesaurus / Date parsing fix. https://github.com/geonetwork/core-geonetwork/pull/6972/files#diff-c7548d94bdb4268915f50f66df5a90f1f7868e4fb1de2f3d2938397e202aaf2fR1057 added month and year format support. This was resolving thesaurus date to the last matching format ie. 1st January for the default date. This can be tested using regions thesaurus which will contains 2 dates for the thesaurus block. * Thesaurus / Avoid having multiple dates with same type code https://github.com/geonetwork/core-geonetwork/pull/6972 adds retrieval of `dct:issued|modified|created` dates but multiple dates could be added more than one time with same date type code. Improve the mapping. * Thesaurus / INSPIRE registry / Only keep one date to avoid validation errors * Thesaurus / LD registry registry / Only keep one date No need for duplicated date --- .../java/org/fao/geonet/kernel/Thesaurus.java | 11 +- .../convert/thesaurus-transformation.xsl | 135 ++++-------------- .../convert/thesaurus-transformation.xsl | 102 +++---------- .../services/thesaurus/ldregistry-to-skos.xsl | 1 - .../services/thesaurus/registry-to-skos.xsl | 1 - 5 files changed, 52 insertions(+), 198 deletions(-) diff --git a/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java b/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java index efaeaf60a89..91a506b57ab 100644 --- a/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java +++ b/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java @@ -1064,12 +1064,11 @@ private Date parseThesaurusDate(Element dateEl) { StringBuffer errorMsg = new StringBuffer("Error parsing the thesaurus date value: "); errorMsg.append(dateVal); - boolean success = false; for (SimpleDateFormat df : dfList) { try { thesaurusDate = df.parse(dateVal); - success = true; + return thesaurusDate; } catch (Exception ex) { // Ignore the exception and try next format errorMsg.append("\n * with format: "); @@ -1079,11 +1078,9 @@ private Date parseThesaurusDate(Element dateEl) { } } // Report error if no success - if (!success) { - errorMsg.append("\nCheck thesaurus date in "); - errorMsg.append(this.fname); - Log.error(Geonet.THESAURUS_MAN, errorMsg.toString()); - } + errorMsg.append("\nCheck thesaurus date in "); + errorMsg.append(this.fname); + Log.error(Geonet.THESAURUS_MAN, errorMsg.toString()); return thesaurusDate; } diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/thesaurus-transformation.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/thesaurus-transformation.xsl index 40e13cd3e65..59a02c55f4d 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/thesaurus-transformation.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/thesaurus-transformation.xsl @@ -82,6 +82,12 @@ <xsl:param name="withThesaurusAnchor"/> <mri:descriptiveKeywords> + <xsl:namespace name="mri" select="'http://standards.iso.org/iso/19115/-3/mri/1.0'"/> + <xsl:namespace name="mcc" select="'http://standards.iso.org/iso/19115/-3/mcc/1.0'"/> + <xsl:namespace name="cit" select="'http://standards.iso.org/iso/19115/-3/cit/2.0'"/> + <xsl:namespace name="gco" select="'http://standards.iso.org/iso/19115/-3/gco/1.0'"/> + <xsl:namespace name="gcx" select="'http://standards.iso.org/iso/19115/-3/gcx/1.0'"/> + <xsl:namespace name="xlink" select="'http://www.w3.org/1999/xlink'"/> <xsl:choose> <xsl:when test="$withXlink"> <xsl:variable name="multiple" @@ -257,20 +263,22 @@ codeListValue="{$thesauri/thesaurus[key = $currentThesaurus]/dname}" /> </mri:type> <xsl:if test="$thesaurusInfo"> + <xsl:variable name="thesaurus" + select="$thesauri/thesaurus[key = $currentThesaurus]"/> + <xsl:variable name="thesaurusInMainLanguage" - select="$thesauri/thesaurus[key = $currentThesaurus] - /multilingualTitles/multilingualTitle[ + select="$thesaurus/multilingualTitles/multilingualTitle[ lang = util:twoCharLangCode($mainLanguage, '')]/title"/> <xsl:variable name="thesaurusTitle" select="if ($thesaurusInMainLanguage != '') then $thesaurusInMainLanguage - else $thesauri/thesaurus[key = $currentThesaurus]/title"/> + else $thesaurus/title"/> <mri:thesaurusName> <cit:CI_Citation> <cit:title> <xsl:choose> <xsl:when test="$withThesaurusAnchor = true()"> - <gcx:Anchor xlink:href="{$thesauri/thesaurus[key = $currentThesaurus]/defaultNamespace}"> + <gcx:Anchor xlink:href="{$thesaurus/defaultNamespace}"> <xsl:value-of select="$thesaurusTitle"/> </gcx:Anchor> </xsl:when> @@ -282,121 +290,30 @@ </xsl:choose> </cit:title> - <xsl:variable name="thesaurusDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/date)" /> - <xsl:variable name="thesaurusCreatedDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/createdDate)"/> - <xsl:variable name="thesaurusIssuedDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/issuedDate)"/> - <xsl:variable name="thesaurusModifiedDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/modifiedDate)"/> + <xsl:variable name="thesaurusDates" as="node()*"> + <publication date="{normalize-space($thesaurus/date)}"/> + <creation date="{normalize-space($thesaurus/createdDate)}"/> + <publication date="{normalize-space($thesaurus/issuedDate)}"/> + <publication date="{normalize-space($thesaurus/modifiedDate)}"/> + </xsl:variable> - <xsl:if test="$thesaurusDate != ''"> + <xsl:for-each-group select="$thesaurusDates[@date != '']" group-by="@date"> + <xsl:sort select="@date" order="descending"/> <cit:date> <cit:CI_Date> <cit:date> - <xsl:choose> - <xsl:when test="contains($thesaurusDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusDate" /> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusDate" /> - </gco:Date> - </xsl:otherwise> - </xsl:choose> + <xsl:element name="{if (contains(current-grouping-key(), 'T')) then 'gco:DateTime' else 'gco:Date'}"> + <xsl:value-of select="current-grouping-key()" /> + </xsl:element> </cit:date> <cit:dateType> <cit:CI_DateTypeCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="publication" /> + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" + codeListValue="{name(current-group()[1])}"/> </cit:dateType> </cit:CI_Date> </cit:date> - </xsl:if> - - <!-- Publication Date--> - <xsl:choose> - <xsl:when test="$thesaurusIssuedDate != ''"> - <cit:date> - <cit:CI_Date> - <cit:date> - <xsl:choose> - <xsl:when test="contains($thesaurusIssuedDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusIssuedDate" /> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusIssuedDate" /> - </gco:Date> - </xsl:otherwise> - </xsl:choose> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="publication" /> - </cit:dateType> - </cit:CI_Date> - </cit:date> - </xsl:when> - <xsl:otherwise> - <cit:date> - <cit:CI_Date> - <cit:date> - <xsl:choose> - <xsl:when test="contains($thesaurusDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusDate" /> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusDate" /> - </gco:Date> - </xsl:otherwise> - </xsl:choose> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="publication" /> - </cit:dateType> - </cit:CI_Date> - </cit:date> - </xsl:otherwise> - </xsl:choose> - - <!--Creation Date--> - <xsl:if test="$thesaurusCreatedDate != ''"> - <cit:date> - <cit:CI_Date> - <cit:date> - <xsl:choose> - <xsl:when test="contains($thesaurusCreatedDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusCreatedDate" /> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusCreatedDate" /> - </gco:Date> - </xsl:otherwise> - </xsl:choose> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="creation" /> - </cit:dateType> - </cit:CI_Date> - </cit:date> - </xsl:if> + </xsl:for-each-group> <xsl:if test="$withThesaurusAnchor"> <cit:identifier> diff --git a/schemas/iso19139/src/main/plugin/iso19139/convert/thesaurus-transformation.xsl b/schemas/iso19139/src/main/plugin/iso19139/convert/thesaurus-transformation.xsl index a27b85bcb18..9e3103d71c4 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/convert/thesaurus-transformation.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/convert/thesaurus-transformation.xsl @@ -136,6 +136,10 @@ <xsl:param name="withThesaurusAnchor"/> <gmd:descriptiveKeywords> + <xsl:namespace name="gmd" select="'http://www.isotc211.org/2005/gmd'"/> + <xsl:namespace name="gco" select="'http://www.isotc211.org/2005/gco'"/> + <xsl:namespace name="gmx" select="'http://www.isotc211.org/2005/gmx'"/> + <xsl:namespace name="xlink" select="'http://www.w3.org/1999/xlink'"/> <xsl:choose> <xsl:when test="$withXlink"> <xsl:variable name="isLocalXlink" @@ -314,22 +318,24 @@ codeListValue="{$thesauri/thesaurus[key = $currentThesaurus]/dname}"/> </gmd:type> <xsl:if test="$thesaurusInfo"> + <xsl:variable name="thesaurus" + select="$thesauri/thesaurus[key = $currentThesaurus]"/> <xsl:variable name="thesaurusInMainLanguage" - select="$thesauri/thesaurus[key = $currentThesaurus] + select="$thesaurus /multilingualTitles/multilingualTitle[ lang = util:twoCharLangCode($mainLanguage, '')]/title"/> <xsl:variable name="thesaurusTitle" select="if ($thesaurusInMainLanguage != '') then $thesaurusInMainLanguage - else $thesauri/thesaurus[key = $currentThesaurus]/title"/> + else $thesaurus/title"/> <gmd:thesaurusName> <gmd:CI_Citation> <gmd:title> <xsl:choose> <xsl:when test="$withTitleAnchor = true()"> - <gmx:Anchor xlink:href="{$thesauri/thesaurus[key = $currentThesaurus]/defaultNamespace}"> + <gmx:Anchor xlink:href="{$thesaurus/defaultNamespace}"> <xsl:value-of select="$thesaurusTitle"/> </gmx:Anchor> </xsl:when> @@ -341,95 +347,31 @@ </xsl:choose> </gmd:title> - <xsl:variable name="thesaurusDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/date)"/> - <xsl:variable name="thesaurusCreatedDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/createdDate)"/> - <xsl:variable name="thesaurusIssuedDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/issuedDate)"/> - <xsl:variable name="thesaurusModifiedDate" - select="normalize-space($thesauri/thesaurus[key = $currentThesaurus]/modifiedDate)"/> - <!-- Publication Date--> - <xsl:choose> - <xsl:when test="$thesaurusIssuedDate != ''"> - <gmd:date> - <gmd:CI_Date> - <gmd:date> - <xsl:choose> - <xsl:when test="contains($thesaurusIssuedDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusIssuedDate"/> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusIssuedDate"/> - </gco:Date> - </xsl:otherwise> - </xsl:choose> - </gmd:date> - <gmd:dateType> - <gmd:CI_DateTypeCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="publication"/> - </gmd:dateType> - </gmd:CI_Date> - </gmd:date> - </xsl:when> - <xsl:otherwise> - <gmd:date> - <gmd:CI_Date> - <gmd:date> - <xsl:choose> - <xsl:when test="contains($thesaurusDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusDate"/> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusDate"/> - </gco:Date> - </xsl:otherwise> - </xsl:choose> - </gmd:date> - <gmd:dateType> - <gmd:CI_DateTypeCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="publication"/> - </gmd:dateType> - </gmd:CI_Date> - </gmd:date> - </xsl:otherwise> - </xsl:choose> + <xsl:variable name="thesaurusDates" as="node()*"> + <publication date="{normalize-space($thesaurus/date)}"/> + <creation date="{normalize-space($thesaurus/createdDate)}"/> + <publication date="{normalize-space($thesaurus/issuedDate)}"/> + <publication date="{normalize-space($thesaurus/modifiedDate)}"/> + </xsl:variable> - <!--Creation Date--> - <xsl:if test="$thesaurusCreatedDate != ''"> + <xsl:for-each-group select="$thesaurusDates[@date != '']" group-by="@date"> + <xsl:sort select="@date" order="descending"/> <gmd:date> <gmd:CI_Date> <gmd:date> - <xsl:choose> - <xsl:when test="contains($thesaurusCreatedDate, 'T')"> - <gco:DateTime> - <xsl:value-of select="$thesaurusCreatedDate"/> - </gco:DateTime> - </xsl:when> - <xsl:otherwise> - <gco:Date> - <xsl:value-of select="$thesaurusCreatedDate"/> - </gco:Date> - </xsl:otherwise> - </xsl:choose> + <xsl:element name="{if (contains(current-grouping-key(), 'T')) then 'gco:DateTime' else 'gco:Date'}"> + <xsl:value-of select="current-grouping-key()" /> + </xsl:element> </gmd:date> <gmd:dateType> <gmd:CI_DateTypeCode codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode" - codeListValue="creation"/> + codeListValue="{name(current-group()[1])}"/> </gmd:dateType> </gmd:CI_Date> </gmd:date> - </xsl:if> + </xsl:for-each-group> <!-- You can pull in the publisher from the Thesaurus XML. See Metadata101/iso19139.ca.HNAP diff --git a/web/src/main/webapp/xslt/services/thesaurus/ldregistry-to-skos.xsl b/web/src/main/webapp/xslt/services/thesaurus/ldregistry-to-skos.xsl index 1cec16ae730..02cdb7aa395 100644 --- a/web/src/main/webapp/xslt/services/thesaurus/ldregistry-to-skos.xsl +++ b/web/src/main/webapp/xslt/services/thesaurus/ldregistry-to-skos.xsl @@ -71,7 +71,6 @@ <dcterms:issued><xsl:value-of select="if ($thesaurusDate != '') then $thesaurusDate else $now"/></dcterms:issued> - <dcterms:modified><xsl:value-of select="if ($thesaurusDate != '') then $thesaurusDate else $now"/></dcterms:modified> <xsl:for-each select="distinct-values($concepts/*[skos:narrower and not(skos:broader)]/@rdf:about)"> <skos:hasTopConcept rdf:resource="{.}"/> diff --git a/web/src/main/webapp/xslt/services/thesaurus/registry-to-skos.xsl b/web/src/main/webapp/xslt/services/thesaurus/registry-to-skos.xsl index 10ee275efd3..8f12f4bedbc 100644 --- a/web/src/main/webapp/xslt/services/thesaurus/registry-to-skos.xsl +++ b/web/src/main/webapp/xslt/services/thesaurus/registry-to-skos.xsl @@ -126,7 +126,6 @@ <dcterms:issued><xsl:value-of select="if ($thesaurusDate != '') then $thesaurusDate else $now"/></dcterms:issued> - <dcterms:modified><xsl:value-of select="if ($thesaurusDate != '') then $thesaurusDate else $now"/></dcterms:modified> <!-- Add top concepts for all items with no parent --> <xsl:if test="$hasBroaderNarrowerLinks"> From ac2c1eb6fc12f641daeec2a03f65da797adc8bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Mon, 7 Oct 2024 10:31:25 +0200 Subject: [PATCH 62/97] Support multiple DOI servers (#8098) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Support multiple DOI servers * Admin / DOI configuration / Add common API endpoints * Prettier * Admin / DOI / Only create directive for doiCreationTask Avoid calling doiserver API on each steps. * Formatter / Datacite / Update schemalocation to HTTPs URL. * Add DoiServerRepository unit tests * Add DoiServersApi integration tests and fix add a DOI server response * Admin / DOI icon menu * Admin / Add translations for DOI url values and trigger form dirty property when selecting a value from the list * DoiServersApi / Sort servers that can be used with a metadata alphabetically * Admin / set the public url when selecting a server from the servers dropdown * Admin / DOI / Move username to main form so that reset password only takes care of password. * Update web/src/main/webapp/WEB-INF/classes/setup/sql/migrate/v445/DoiServerDatabaseMigration.java Co-authored-by: François Prunayre <fx.prunayre@gmail.com> --------- Co-authored-by: François Prunayre <fx.prunayre@gmail.com> --- .../org/fao/geonet/api/Messages.properties | 4 + .../fao/geonet/api/Messages_fre.properties | 4 + .../user-guide/associating-resources/doi.md | 16 +- .../img/doi-create-server.png | Bin 0 -> 172959 bytes .../org/fao/geonet/doi/client/DoiManager.java | 301 +++++------ .../java/org/fao/geonet/domain/DoiServer.java | 284 ++++++++++ .../DoiServerEntityListenerManager.java | 65 +++ .../repository/DoiServerRepository.java | 36 ++ .../repository/DoiServerRepositoryTest.java | 142 +++++ .../formatter/datacite/view.xsl | 2 +- .../iso19139/formatter/datacite/view.xsl | 2 +- .../geonet/api/doiservers/DoiServersApi.java | 327 ++++++++++++ .../doiservers/model/AnonymousDoiServer.java | 47 ++ .../api/doiservers/model/DoiServerDto.java | 196 +++++++ .../org/fao/geonet/api/records/DoiApi.java | 89 +++- .../java/org/fao/geonet/api/site/SiteApi.java | 3 - .../api/doiservers/DoiServersApiTest.java | 281 ++++++++++ .../catalog/components/doi/DoiDirective.js | 18 +- .../catalog/components/doi/DoiService.js | 39 +- .../components/doi/partials/doiwidget.html | 10 + .../history/partials/historyStep.html | 2 +- .../partials/relatedDistribution.html | 2 +- .../catalog/js/admin/DoiServerController.js | 215 ++++++++ .../catalog/js/admin/SettingsController.js | 10 +- .../resources/catalog/locales/en-admin.json | 43 +- .../resources/catalog/style/gn_admin.less | 3 +- .../templates/admin/settings/doiservers.html | 488 ++++++++++++++++++ .../views/default/directives/directive.js | 14 +- .../WEB-INF/config-db/database_migration.xml | 1 + .../org/fao/geonet/api/Messages.properties | 6 +- .../fao/geonet/api/Messages_fre.properties | 22 +- .../setup/sql/data/data-db-default.sql | 7 - .../v445/DoiServerDatabaseMigration.java | 150 ++++++ 33 files changed, 2585 insertions(+), 244 deletions(-) create mode 100644 docs/manual/docs/user-guide/associating-resources/img/doi-create-server.png create mode 100644 domain/src/main/java/org/fao/geonet/domain/DoiServer.java create mode 100644 domain/src/main/java/org/fao/geonet/entitylistener/DoiServerEntityListenerManager.java create mode 100644 domain/src/main/java/org/fao/geonet/repository/DoiServerRepository.java create mode 100644 domain/src/test/java/org/fao/geonet/repository/DoiServerRepositoryTest.java create mode 100644 services/src/main/java/org/fao/geonet/api/doiservers/DoiServersApi.java create mode 100644 services/src/main/java/org/fao/geonet/api/doiservers/model/AnonymousDoiServer.java create mode 100644 services/src/main/java/org/fao/geonet/api/doiservers/model/DoiServerDto.java create mode 100644 services/src/test/java/org/fao/geonet/api/doiservers/DoiServersApiTest.java create mode 100644 web-ui/src/main/resources/catalog/js/admin/DoiServerController.js create mode 100644 web-ui/src/main/resources/catalog/templates/admin/settings/doiservers.html create mode 100644 web/src/main/webapp/WEB-INF/classes/setup/sql/migrate/v445/DoiServerDatabaseMigration.java diff --git a/core/src/test/resources/org/fao/geonet/api/Messages.properties b/core/src/test/resources/org/fao/geonet/api/Messages.properties index 33b48c12df8..4db47277a6b 100644 --- a/core/src/test/resources/org/fao/geonet/api/Messages.properties +++ b/core/src/test/resources/org/fao/geonet/api/Messages.properties @@ -211,6 +211,10 @@ exception.doi.serverErrorDelete=Error deleting DOI exception.doi.serverErrorDelete.description=Error deleting DOI: {0} exception.doi.serverErrorUnregister=Error unregistering DOI exception.doi.serverErrorUnregister.description=Error unregistering DOI: {0} +exception.doi.serverCanNotHandleRecord=DOI server can not handle the metadata +exception.doi.serverCanNotHandleRecord.description=DOI server ''{0}'' can not handle the metadata with UUID ''{1}'' +exception.doi.configurationMissing=DOI server configuration is not complete +exception.doi.configurationMissing.description=DOI server configuration is not complete. Check the DOI server configuration to complete it exception.doi.notSupportedOperationError=Operation not supported exception.doi.notSupportedOperationError.description={0} api.metadata.import.importedWithId=Metadata imported with ID '%s' diff --git a/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties b/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties index 178db7cba12..fa2455ebbf2 100644 --- a/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties +++ b/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties @@ -203,6 +203,10 @@ exception.doi.serverErrorDelete=Erreur lors de la suppression du DOI exception.doi.serverErrorDelete.description=Erreur lors de la suppression du DOI : {0} exception.doi.serverErrorUnregister=Erreur lors de la d\u00E9sinscription du DOI exception.doi.serverErrorUnregister.description=Erreur lors de la d\u00E9sinscription du DOI {0} +exception.doi.serverCanNotHandleRecord=DOI server can not handle the metadata +exception.doi.serverCanNotHandleRecord.description=DOI server ''{0}'' can not handle the metadata with UUID ''{1}'' +exception.doi.configurationMissing=DOI server configuration is not complete +exception.doi.configurationMissing.description=DOI server configuration is not complete. Check the DOI server configuration to complete it exception.doi.notSupportedOperationError=Op\u00E9ration non prise en charge exception.doi.notSupportedOperationError.description={0} api.metadata.import.importedWithId=Fiche import\u00E9e avec l'ID '%s' diff --git a/docs/manual/docs/user-guide/associating-resources/doi.md b/docs/manual/docs/user-guide/associating-resources/doi.md index cabc05ecba5..cb57e8f9589 100644 --- a/docs/manual/docs/user-guide/associating-resources/doi.md +++ b/docs/manual/docs/user-guide/associating-resources/doi.md @@ -7,9 +7,21 @@ The catalogue support DOI creation using: - [DataCite API](https://support.datacite.org/docs/mds-api-guide). - EU publication office API <https://ra.publications.europa.eu/servlet/ws/doidata?api=medra.org> -Configure the API access point in the `admin console --> settings`: +Configure the DOI API access point to publish the metadata in the `Admin console --> Settings --> Doi servers`: -![](img/doi-admin-console.png) +![](img/doi-create-server.png) + +Providing the following information: + +- `Name`: A descriptive name for the server. +- `Description`: (Optional) A verbose description of the server. +- `DataCite API endpoint`: The API url, usually https://mds.datacite.org or https://mds.test.datacite.org for testing. +- `DataCite username` / `DataCite password`: Credentials required to publish the DOI resources. +- `Landing page URL template`: The URL to use to register the DOI. A good default for GeoNetwork is http://localhost:8080/geonetwork/srv/resources/records/{{uuid}}. The landing page URL MUST contains the UUID of the record. +- `Final DOI URL prefix`: (Optional) Keep it empty to use the default https://doi.org prefix. Use https://mds.test.datacite.org/doi when using the test API. +- `DOI pattern`: Default is `{{uuid}}` but the DOI structure can be customized with database id and/or record group eg. `example-{{groupOwner}}-{{id}}`. +- `DataCite prefix`: Usually looks like `10.xxxx`. You will be allowed to register DOI names only under the prefixes that have been assigned to you. +- `Publication groups`: (Optional) Select the groups which metadata should be published to the DOI server. If no groups are selected, the server will be provided to publish the metadata that has no other DOI servers related to the metadata owner group. A record can be downloaded using the DataCite format from the API using: <http://localhost:8080/geonetwork/srv/api/records/da165110-88fd-11da-a88f-000d939bc5d8/formatters/datacite?output=xml> diff --git a/docs/manual/docs/user-guide/associating-resources/img/doi-create-server.png b/docs/manual/docs/user-guide/associating-resources/img/doi-create-server.png new file mode 100644 index 0000000000000000000000000000000000000000..efccf6030657e7bdfcfe30707ba673d694c1483a GIT binary patch literal 172959 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%0DykPzOX4 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%0DvkbroV)M%Hj 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 literal 0 HcmV?d00001 diff --git a/doi/src/main/java/org/fao/geonet/doi/client/DoiManager.java b/doi/src/main/java/org/fao/geonet/doi/client/DoiManager.java index c21d0f3c4a0..012c710585e 100644 --- a/doi/src/main/java/org/fao/geonet/doi/client/DoiManager.java +++ b/doi/src/main/java/org/fao/geonet/doi/client/DoiManager.java @@ -32,8 +32,8 @@ import org.fao.geonet.domain.*; import org.fao.geonet.kernel.AccessManager; import org.fao.geonet.kernel.ApplicableSchematron; -import org.fao.geonet.kernel.DataManager; import org.fao.geonet.kernel.SchematronValidator; +import org.fao.geonet.kernel.datamanager.base.BaseMetadataManager; import org.fao.geonet.kernel.datamanager.base.BaseMetadataSchemaUtils; import org.fao.geonet.kernel.datamanager.base.BaseMetadataUtils; import org.fao.geonet.kernel.schema.MetadataSchema; @@ -41,12 +41,10 @@ import org.fao.geonet.kernel.search.IndexingMode; import org.fao.geonet.kernel.setting.SettingManager; import org.fao.geonet.repository.SchematronRepository; -import org.fao.geonet.utils.Log; import org.fao.geonet.utils.Xml; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.Namespace; -import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import java.nio.file.Files; @@ -60,11 +58,9 @@ /** * Class to register/unregister DOIs using the Datacite Metadata Store (MDS) API. + * <p> + * See <a href="https://support.datacite.org/docs/mds-api-guide">...</a> * - * See https://support.datacite.org/docs/mds-api-guide - * - * @author Jose García - * @author Francois Prunayre */ public class DoiManager { private static final String DOI_ADD_XSL_PROCESS = "process/doi-add.xsl"; @@ -75,112 +71,52 @@ public class DoiManager { public static final String DOI_DEFAULT_URL = "https://doi.org/"; public static final String DOI_DEFAULT_PATTERN = "{{uuid}}"; - private IDoiClient client; - private String doiPrefix; - private String doiPattern; - private String landingPageTemplate; - private boolean initialised = false; - private boolean isMedra = false; - - DataManager dm; - SettingManager sm; - BaseMetadataSchemaUtils schemaUtils; - - @Autowired - BaseMetadataUtils metadataUtils; - - @Autowired - SchematronValidator validator; - - @Autowired - DoiBuilder doiBuilder; + private final SettingManager sm; + private final BaseMetadataSchemaUtils schemaUtils; + private final BaseMetadataManager metadataManager; + private final BaseMetadataUtils metadataUtils; + private final SchematronValidator validator; + private final DoiBuilder doiBuilder; + private final SchematronRepository schematronRepository; + + + public DoiManager(final SettingManager sm, final BaseMetadataSchemaUtils schemaUtils, + final BaseMetadataManager metadataManager, final BaseMetadataUtils metadataUtils, + final SchematronValidator validator, final DoiBuilder doiBuilder, + final SchematronRepository schematronRepository) { + this.sm = sm; + this.schemaUtils = schemaUtils; + this.metadataManager = metadataManager; + this.metadataUtils = metadataUtils; + this.validator = validator; + this.doiBuilder = doiBuilder; + this.schematronRepository = schematronRepository; - @Autowired - SchematronRepository schematronRepository; - - - public DoiManager() { - sm = ApplicationContextHolder.get().getBean(SettingManager.class); - dm = ApplicationContextHolder.get().getBean(DataManager.class); - schemaUtils = ApplicationContextHolder.get().getBean(BaseMetadataSchemaUtils.class); - - loadConfig(); } - public boolean isInitialised() { - return initialised; + private IDoiClient createDoiClient(DoiServer doiServer) { + boolean isMedra = isMedraServer(doiServer); + return isMedra ? + new DoiMedraClient(doiServer.getUrl(), doiServer.getUsername(), doiServer.getPassword(), doiServer.getPublicUrl()) : + new DoiDataciteClient(doiServer.getUrl(), doiServer.getUsername(), doiServer.getPassword(), doiServer.getPublicUrl()); } - /** - * Check parameters and build the client. - * - */ - public void loadConfig() { - initialised = false; - if (sm != null) { - - String serverUrl = sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_DOIURL); - String doiPublicUrl = StringUtils.defaultIfEmpty( - sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_DOIPUBLICURL), - DOI_DEFAULT_URL); - String username = sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_DOIUSERNAME); - String password = sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_DOIPASSWORD); - - doiPrefix = sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_DOIKEY); - doiPattern = StringUtils.defaultIfEmpty( - sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_DOIPATTERN), - DOI_DEFAULT_PATTERN - ); - - landingPageTemplate = sm.getValue(DoiSettings.SETTING_PUBLICATION_DOI_LANDING_PAGE_TEMPLATE); - - final boolean emptyUrl = StringUtils.isEmpty(serverUrl); - final boolean emptyUsername = StringUtils.isEmpty(username); - final boolean emptyPassword = StringUtils.isEmpty(password); - final boolean emptyPrefix = StringUtils.isEmpty(doiPrefix); - if (emptyUrl || - emptyUsername || - emptyPassword || - emptyPrefix) { - StringBuilder report = new StringBuilder("DOI configuration is not complete. Check in System Configuration to fill the DOI configuration."); - if (emptyUrl) { - report.append("\n* URL MUST be set"); - } - if (emptyUsername) { - report.append("\n* Username MUST be set"); - } - if (emptyPassword) { - report.append("\n* Password MUST be set"); - } - if (emptyPrefix) { - report.append("\n* Prefix MUST be set"); - } - Log.warning(DoiSettings.LOGGER_NAME, - report.toString()); - } else { - Log.debug(DoiSettings.LOGGER_NAME, - "DOI configuration looks perfect."); - isMedra = serverUrl.contains(MEDRA_SEARCH_KEY); - this.client = - isMedra ? - new DoiMedraClient(serverUrl, username, password, doiPublicUrl) : - new DoiDataciteClient(serverUrl, username, password, doiPublicUrl); - initialised = true; - } - } - } + public String checkDoiUrl(DoiServer doiServer, AbstractMetadata metadata) throws DoiClientException { + checkInitialised(doiServer); + checkCanHandleMetadata(doiServer, metadata); - public String checkDoiUrl(AbstractMetadata metadata) { - return doiBuilder.create(doiPattern, doiPrefix, metadata); + return doiBuilder.create(doiServer.getPattern(), doiServer.getPrefix(), metadata); } - public Map<String, Boolean> check(ServiceContext serviceContext, AbstractMetadata metadata, Element dataciteMetadata) throws Exception { + public Map<String, Boolean> check(ServiceContext serviceContext, DoiServer doiServer, AbstractMetadata metadata, Element dataciteMetadata) throws Exception { Map<String, Boolean> conditions = new HashMap<>(); - checkInitialised(); + checkInitialised(doiServer); + checkCanHandleMetadata(doiServer, metadata); conditions.put(DoiConditions.API_CONFIGURED, true); - String doi = doiBuilder.create(doiPattern, doiPrefix, metadata); - checkPreConditions(metadata, doi); + IDoiClient doiClient = createDoiClient(doiServer); + String doi = doiBuilder.create(doiServer.getPattern(), doiServer.getPrefix(), metadata); + checkPreConditions(doiClient, metadata, doi); conditions.put(DoiConditions.RECORD_IS_PUBLIC, true); conditions.put(DoiConditions.STANDARD_SUPPORT, true); @@ -188,26 +124,26 @@ public Map<String, Boolean> check(ServiceContext serviceContext, AbstractMetadat // ** Convert to DataCite format Element dataciteFormatMetadata = dataciteMetadata == null ? - convertXmlToDataCiteFormat(metadata.getDataInfo().getSchemaId(), - metadata.getXmlData(false), doi) : dataciteMetadata; - checkPreConditionsOnDataCite(metadata, doi, dataciteFormatMetadata, serviceContext.getLanguage()); + convertXmlToDataCiteFormat(doiServer, metadata.getDataInfo().getSchemaId(), + metadata.getXmlData(false), doi) : dataciteMetadata; + checkPreConditionsOnDataCite(doiClient, metadata, doi, dataciteFormatMetadata, serviceContext.getLanguage()); conditions.put(DoiConditions.DATACITE_FORMAT_IS_VALID, true); return conditions; } - public Map<String, String> register(ServiceContext context, AbstractMetadata metadata) throws Exception { + public Map<String, String> register(ServiceContext context, DoiServer doiServer, AbstractMetadata metadata) throws Exception { Map<String, String> doiInfo = new HashMap<>(3); // The new DOI for this record - String doi = doiBuilder.create(doiPattern, doiPrefix, metadata); + String doi = doiBuilder.create(doiServer.getPattern(), doiServer.getPrefix(), metadata); doiInfo.put("doi", doi); // The record in datacite format Element dataciteFormatMetadata = - convertXmlToDataCiteFormat(metadata.getDataInfo().getSchemaId(), - metadata.getXmlData(false), doi); + convertXmlToDataCiteFormat(doiServer, metadata.getDataInfo().getSchemaId(), + metadata.getXmlData(false), doi); try { - check(context, metadata, dataciteFormatMetadata); + check(context, doiServer, metadata, dataciteFormatMetadata); } catch (ResourceAlreadyExistException ignore) { // Update DOI doiInfo.put("update", "true"); @@ -215,7 +151,8 @@ public Map<String, String> register(ServiceContext context, AbstractMetadata met throw e; } - createDoi(context, metadata, doiInfo, dataciteFormatMetadata); + IDoiClient doiClient = createDoiClient(doiServer); + createDoi(context, doiClient, doiServer, metadata, doiInfo, dataciteFormatMetadata); checkDoiCreation(metadata, doiInfo); return doiInfo; @@ -230,7 +167,7 @@ public Map<String, String> register(ServiceContext context, AbstractMetadata met * @throws IOException * @throws JDOMException */ - private void checkPreConditions(AbstractMetadata metadata, String doi) throws DoiClientException, IOException, JDOMException, ResourceAlreadyExistException { + private void checkPreConditions(IDoiClient doiClient, AbstractMetadata metadata, String doi) throws DoiClientException, IOException, JDOMException, ResourceAlreadyExistException { // Record MUST be public AccessManager am = ApplicationContextHolder.get().getBean(AccessManager.class); boolean visibleToAll = false; @@ -239,11 +176,11 @@ private void checkPreConditions(AbstractMetadata metadata, String doi) throws Do } catch (Exception e) { throw new DoiClientException(String.format( "Failed to check if record '%s' is visible to all for DOI creation." + - " Error is %s.", + " Error is %s.", metadata.getUuid(), e.getMessage())) .withMessageKey("exception.doi.failedVisibilityCheck") .withDescriptionKey("exception.doi.failedVisibilityCheck.description", - new String[]{ metadata.getUuid(), e.getMessage() }); + new String[]{metadata.getUuid(), e.getMessage()}); } if (!visibleToAll) { @@ -251,7 +188,7 @@ private void checkPreConditions(AbstractMetadata metadata, String doi) throws Do "Record '%s' is not public and we cannot request a DOI for such a record. Publish this record first.", metadata.getUuid())) .withMessageKey("exception.doi.recordNotPublic") - .withDescriptionKey("exception.doi.recordNotPublic.description", new String[]{ metadata.getUuid() }); + .withDescriptionKey("exception.doi.recordNotPublic.description", new String[]{metadata.getUuid()}); } // Record MUST not contains a DOI @@ -259,7 +196,7 @@ private void checkPreConditions(AbstractMetadata metadata, String doi) throws Do String currentDoi = metadataUtils.getDoi(metadata.getUuid()); if (StringUtils.isNotEmpty(currentDoi)) { // Current doi does not match the one going to be inserted. This is odd - String newDoi = client.createPublicUrl(doi); + String newDoi = doiClient.createPublicUrl(doi); if (!currentDoi.equals(newDoi)) { throw new DoiClientException(String.format( "Record '%s' already contains a DOI <a href='%s'>%s</a> which is not equal " + @@ -269,7 +206,7 @@ private void checkPreConditions(AbstractMetadata metadata, String doi) throws Do "an existing DOI.", metadata.getUuid(), currentDoi, currentDoi, newDoi)) .withMessageKey("exception.doi.resourcesContainsDoiNotEqual") - .withDescriptionKey("exception.doi.resourcesContainsDoiNotEqual.description", new String[]{ metadata.getUuid(), currentDoi, currentDoi, newDoi }); + .withDescriptionKey("exception.doi.resourcesContainsDoiNotEqual.description", new String[]{metadata.getUuid(), currentDoi, currentDoi, newDoi}); } throw new ResourceAlreadyExistException(String.format( @@ -279,7 +216,7 @@ private void checkPreConditions(AbstractMetadata metadata, String doi) throws Do metadata.getUuid(), currentDoi, currentDoi)) .withMessageKey("exception.doi.resourceContainsDoi") .withDescriptionKey("exception.doi.resourceContainsDoi.description", - new String[]{ metadata.getUuid(), currentDoi, currentDoi }); + new String[]{metadata.getUuid(), currentDoi, currentDoi}); } } catch (ResourceNotFoundException e) { final MetadataSchema schema = schemaUtils.getSchema(metadata.getDataInfo().getSchemaId()); @@ -299,24 +236,23 @@ private void checkPreConditions(AbstractMetadata metadata, String doi) throws Do schema.getName())) .withMessageKey("exception.doi.missingSavedquery") .withDescriptionKey("exception.doi.missingSavedquery.description", - new String[]{ metadata.getUuid(), schema.getName(), - SavedQuery.DOI_GET, e.getMessage(), - schema.getName() }); + new String[]{metadata.getUuid(), schema.getName(), + SavedQuery.DOI_GET, e.getMessage(), + schema.getName()}); } } /** * Check conditions on DataCite side. + * * @param metadata * @param doi * @param dataciteMetadata * @param language */ - private void checkPreConditionsOnDataCite(AbstractMetadata metadata, String doi, Element dataciteMetadata, String language) throws DoiClientException, ResourceAlreadyExistException { + private void checkPreConditionsOnDataCite(IDoiClient doiClient, AbstractMetadata metadata, String doi, Element dataciteMetadata, String language) throws DoiClientException, ResourceAlreadyExistException { // * DataCite API is up an running ? - - try { List<MetadataValidation> validations = new ArrayList<>(); List<ApplicableSchematron> applicableSchematron = Lists.newArrayList(); @@ -341,7 +277,7 @@ private void checkPreConditionsOnDataCite(AbstractMetadata metadata, String doi, StringBuilder message = new StringBuilder(); if (!failures.isEmpty()) { message.append("<ul>"); - failures.forEach(f -> message.append("<li>").append(((Element)f).getTextNormalize()).append("</li>")); + failures.forEach(f -> message.append("<li>").append(((Element) f).getTextNormalize()).append("</li>")); message.append("</ul>"); throw new DoiClientException(String.format( @@ -349,9 +285,9 @@ private void checkPreConditionsOnDataCite(AbstractMetadata metadata, String doi, metadata.getUuid(), failures.size(), message)) .withMessageKey("exception.doi.recordNotConformantMissingInfo") .withDescriptionKey("exception.doi.recordNotConformantMissingInfo.description", - new String[]{ metadata.getUuid(), String.valueOf(failures.size()), message.toString() }); + new String[]{metadata.getUuid(), String.valueOf(failures.size()), message.toString()}); } - } catch (IOException|JDOMException e) { + } catch (IOException | JDOMException e) { throw new DoiClientException(String.format( "Record '%s' is not conform with DataCite validation rules for mandatory fields. Error is: %s. " + "Required fields in DataCite are: identifier, creators, titles, publisher, publicationYear, resourceType. " + @@ -360,7 +296,7 @@ private void checkPreConditionsOnDataCite(AbstractMetadata metadata, String doi, metadata.getUuid(), e.getMessage(), sm.getNodeURL(), metadata.getUuid())) .withMessageKey("exception.doi.recordNotConformantMissingMandatory") .withDescriptionKey("exception.doi.recordNotConformantMissingMandatory.description", - new String[]{ metadata.getUuid(), e.getMessage(), sm.getNodeURL(), metadata.getUuid() }); + new String[]{metadata.getUuid(), e.getMessage(), sm.getNodeURL(), metadata.getUuid()}); } // XSD validation @@ -375,24 +311,24 @@ private void checkPreConditionsOnDataCite(AbstractMetadata metadata, String doi, metadata.getUuid(), e.getMessage(), sm.getNodeURL(), metadata.getUuid())) .withMessageKey("exception.doi.recordInvalid") .withDescriptionKey("exception.doi.recordInvalid.description", - new String[]{ metadata.getUuid(), e.getMessage(), sm.getNodeURL(), metadata.getUuid() }); + new String[]{metadata.getUuid(), e.getMessage(), sm.getNodeURL(), metadata.getUuid()}); } // * MDS / DOI does not exist already // curl -i --user username:password https://mds.test.datacite.org/doi/10.5072/GN // Return 404 - final String doiResponse = client.retrieveDoi(doi); + final String doiResponse = doiClient.retrieveDoi(doi); if (doiResponse != null) { throw new ResourceAlreadyExistException(String.format( "Record '%s' looks to be already published on DataCite with DOI <a href='%s'>'%s'</a>. DOI on Datacite point to: <a href='%s'>%s</a>. " + "If the DOI is not correct, remove it from the record and ask for a new one.", metadata.getUuid(), - client.createUrl("doi") + "/" + doi, + doiClient.createUrl("doi") + "/" + doi, doi, doi, doiResponse)) .withMessageKey("exception.doi.resourceAlreadyPublished") - .withDescriptionKey("exception.doi.resourceAlreadyPublished.description", new String[]{ metadata.getUuid(), - client.createUrl("doi") + "/" + doi, - doi, doi, doiResponse }); + .withDescriptionKey("exception.doi.resourceAlreadyPublished.description", new String[]{metadata.getUuid(), + doiClient.createUrl("doi") + "/" + doi, + doi, doi, doiResponse}); } // TODO: Could be relevant at some point to return states (draft/findable) @@ -404,10 +340,12 @@ private void checkPreConditionsOnDataCite(AbstractMetadata metadata, String doi, /** * Use the DataCite API to register the new DOI. + * * @param context * @param metadata */ - private void createDoi(ServiceContext context, AbstractMetadata metadata, Map<String, String> doiInfo, Element dataciteMetadata) throws Exception { + private void createDoi(ServiceContext context, IDoiClient doiClient, DoiServer doiServer, + AbstractMetadata metadata, Map<String, String> doiInfo, Element dataciteMetadata) throws Exception { // * Now, let's create the DOI // picking a DOI name, @@ -418,29 +356,30 @@ private void createDoi(ServiceContext context, AbstractMetadata metadata, Map<St // ** POST metadata // 201 Created: operation successful for Datacite, // 200 Ok: operation successful for Medra, - client.createDoiMetadata(doiInfo.get("doi"), Xml.getString(dataciteMetadata)); + doiClient.createDoiMetadata(doiInfo.get("doi"), Xml.getString(dataciteMetadata)); // Register the URL for Datacite - String landingPage = landingPageTemplate.replace( - "{{uuid}}", metadata.getUuid()); + String landingPage = doiServer.getLandingPageTemplate().replace( + DOI_DEFAULT_PATTERN, metadata.getUuid()); doiInfo.put("doiLandingPage", landingPage); doiInfo.put("doiUrl", - client.createPublicUrl(doiInfo.get("doi"))); - client.createDoi(doiInfo.get("doi"), landingPage); + doiClient.createPublicUrl(doiInfo.get("doi"))); + doiClient.createDoi(doiInfo.get("doi"), landingPage); // Add the DOI in the record - Element recordWithDoi = setDOIValue(doiInfo.get("doi"), metadata.getDataInfo().getSchemaId(), metadata.getXmlData(false)); + Element recordWithDoi = setDOIValue(doiClient, doiInfo.get("doi"), metadata.getDataInfo().getSchemaId(), metadata.getXmlData(false)); // Update the published copy //--- needed to detach md from the document - dm.updateMetadata(context, metadata.getId() + "", recordWithDoi, false, true, + metadataManager.updateMetadata(context, metadata.getId() + "", recordWithDoi, false, true, context.getLanguage(), new ISODate().toString(), true, IndexingMode.full); } /** - * Check that the DOI is properly created. + * TODO: Check that the DOI is properly created. + * * @param metadata * @param doi */ @@ -451,11 +390,13 @@ private void checkDoiCreation(AbstractMetadata metadata, Map<String, String> doi } - public void unregisterDoi(AbstractMetadata metadata, ServiceContext context) throws DoiClientException, ResourceNotFoundException { - checkInitialised(); + public void unregisterDoi(DoiServer doiServer, AbstractMetadata metadata, ServiceContext context) throws DoiClientException, ResourceNotFoundException { + checkInitialised(doiServer); + checkCanHandleMetadata(doiServer, metadata); - final String doi = doiBuilder.create(doiPattern, doiPrefix, metadata); - final String doiResponse = client.retrieveDoi(doi); + IDoiClient doiClient = createDoiClient(doiServer); + final String doi = doiBuilder.create(doiServer.getPattern(), doiServer.getPrefix(), metadata); + final String doiResponse = doiClient.retrieveDoi(doi); if (doiResponse == null) { throw new ResourceNotFoundException(String.format( "Record '%s' is not available on DataCite. DOI '%s' does not exist.", @@ -467,12 +408,12 @@ public void unregisterDoi(AbstractMetadata metadata, ServiceContext context) thr Element md = metadata.getXmlData(false); String doiUrl = metadataUtils.getDoi(metadata.getUuid()); - client.deleteDoiMetadata(doi); - client.deleteDoi(doi); + doiClient.deleteDoiMetadata(doi); + doiClient.deleteDoi(doi); Element recordWithoutDoi = removeDOIValue(doiUrl, metadata.getDataInfo().getSchemaId(), md); - dm.updateMetadata(context, metadata.getId() + "", recordWithoutDoi, false, true, + metadataManager.updateMetadata(context, metadata.getId() + "", recordWithoutDoi, false, true, context.getLanguage(), new ISODate().toString(), true, IndexingMode.full); } catch (Exception ex) { throw new DoiClientException(String.format( @@ -485,10 +426,9 @@ public void unregisterDoi(AbstractMetadata metadata, ServiceContext context) thr /** * Sets the DOI URL value in the metadata record using the process DOI_ADD_XSL_PROCESS. - * */ - public Element setDOIValue(String doi, String schema, Element md) throws Exception { - Path styleSheet = dm.getSchemaDir(schema).resolve(DOI_ADD_XSL_PROCESS); + public Element setDOIValue(IDoiClient doiClient, String doi, String schema, Element md) throws Exception { + Path styleSheet = schemaUtils.getSchemaDir(schema).resolve(DOI_ADD_XSL_PROCESS); boolean exists = Files.exists(styleSheet); if (!exists) { String message = String.format("To create a DOI, the schema has to defined how to insert a DOI in the record. The schema_plugins/%s/process/%s was not found. Create the XSL transformation.", @@ -501,7 +441,7 @@ public Element setDOIValue(String doi, String schema, Element md) throws Excepti .withDescriptionKey("exception.doi.serverErrorCreate.description", new String[]{message}); } - String doiPublicUrl = client.createPublicUrl(""); + String doiPublicUrl = doiClient.createPublicUrl(""); Map<String, Object> params = new HashMap<>(1); params.put("doi", doi); @@ -511,10 +451,9 @@ public Element setDOIValue(String doi, String schema, Element md) throws Excepti /** * Sets the DOI URL value in the metadata record using the process DOI_ADD_XSL_PROCESS. - * */ public Element removeDOIValue(String doi, String schema, Element md) throws Exception { - Path styleSheet = dm.getSchemaDir(schema).resolve(DOI_REMOVE_XSL_PROCESS); + Path styleSheet = schemaUtils.getSchemaDir(schema).resolve(DOI_REMOVE_XSL_PROCESS); boolean exists = Files.exists(styleSheet); if (!exists) { String message = String.format("To remove a DOI, the schema has to defined how to remove a DOI in the record. The schema_plugins/%s/process/%s was not found. Create the XSL transformation.", @@ -540,9 +479,9 @@ public Element removeDOIValue(String doi, String schema, Element md) throws Exce * @return The record converted into the DataCite format. * @throws Exception if there is no conversion available. */ - private Element convertXmlToDataCiteFormat(String schema, Element md, String doi) throws Exception { - final Path styleSheet = dm.getSchemaDir(schema).resolve( - isMedra ? DATACITE_MEDRA_XSL_CONVERSION_FILE : DATACITE_XSL_CONVERSION_FILE); + private Element convertXmlToDataCiteFormat(DoiServer doiServer, String schema, Element md, String doi) throws Exception { + final Path styleSheet = schemaUtils.getSchemaDir(schema).resolve( + isMedraServer(doiServer) ? DATACITE_MEDRA_XSL_CONVERSION_FILE : DATACITE_XSL_CONVERSION_FILE); final boolean exists = Files.exists(styleSheet); if (!exists) { String message = String.format("To create a DOI, the record needs to be converted to the DataCite format (https://schema.datacite.org/). You need to create a formatter for this in schema_plugins/%s/%s. If the standard is a profile of ISO19139, you can simply point to the ISO19139 formatter.", @@ -555,17 +494,53 @@ private Element convertXmlToDataCiteFormat(String schema, Element md, String doi .withDescriptionKey("exception.doi.serverErrorCreate.description", new String[]{message}); } - Map<String,Object> params = new HashMap<>(); + Map<String, Object> params = new HashMap<>(); params.put(DOI_ID_PARAMETER, doi); return Xml.transform(md, styleSheet, params); } - private void checkInitialised() throws DoiClientException { - if (!initialised) { - throw new DoiClientException("DOI configuration is not complete. Check System Configuration and set the DOI configuration.") + private void checkInitialised(DoiServer doiServer) throws DoiClientException { + final boolean emptyUrl = StringUtils.isEmpty(doiServer.getUrl()); + final boolean emptyUsername = StringUtils.isEmpty(doiServer.getUsername()); + final boolean emptyPassword = StringUtils.isEmpty(doiServer.getPassword()); + final boolean emptyPrefix = StringUtils.isEmpty(doiServer.getPrefix()); + + if (emptyUrl || + emptyUsername || + emptyPassword || + emptyPrefix) { + throw new DoiClientException("DOI server configuration is not complete. Check the DOI server configuration to complete it.") .withMessageKey("exception.doi.configurationMissing") .withDescriptionKey("exception.doi.configurationMissing.description", new String[]{}); + + } + } + + /** + * Checks if the DOI server can handle the metadata: + * - The DOI server is not publishing metadata for certain metadata group(s) or + * - it publishes metadata from the metadata group owner. + * + * @param doiServer The DOI server. + * @param metadata The metadata to process. + * @throws DoiClientException + */ + private void checkCanHandleMetadata(DoiServer doiServer, AbstractMetadata metadata) throws DoiClientException { + if (!doiServer.getPublicationGroups().isEmpty()) { + Integer groupOwner = metadata.getSourceInfo().getGroupOwner(); + + if (doiServer.getPublicationGroups().stream().noneMatch(g -> g.getId() == groupOwner)) { + throw new DoiClientException( + String.format("DOI server '%s' can not handle the metadata with UUID '%s'.", + doiServer.getName(), metadata.getUuid())) + .withMessageKey("exception.doi.serverCanNotHandleRecord") + .withDescriptionKey("exception.doi.serverCanNotHandleRecord.description", new String[]{doiServer.getName(), metadata.getUuid()}); + } } + } + private boolean isMedraServer(DoiServer doiServer) { + return doiServer.getUrl().contains(MEDRA_SEARCH_KEY); + } } diff --git a/domain/src/main/java/org/fao/geonet/domain/DoiServer.java b/domain/src/main/java/org/fao/geonet/domain/DoiServer.java new file mode 100644 index 00000000000..90c93c31c6d --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/domain/DoiServer.java @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.domain; + +import org.fao.geonet.entitylistener.DoiServerEntityListenerManager; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "Doiservers") +@Cacheable +@Access(AccessType.PROPERTY) +@EntityListeners(DoiServerEntityListenerManager.class) +@SequenceGenerator(name = DoiServer.ID_SEQ_NAME, initialValue = 100, allocationSize = 1) +public class DoiServer extends GeonetEntity { + static final String ID_SEQ_NAME = "doiserver_id_seq"; + + private int id; + private String name; + private String description; + private String url; + private String username; + private String password; + private String landingPageTemplate; + private String publicUrl; + private String pattern = "{{uuid}}"; + private String prefix; + private Set<Group> publicationGroups = new HashSet<>(); + + /** + * Get the id of the DOI server. <p> This is autogenerated and when a new DOI server is created + * the DOI server will be assigned a new value. </p> + * + * @return the id of the DOI server. + */ + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_SEQ_NAME) + @Column(nullable = false) + public int getId() { + return id; + } + + /** + * Set the id of the DOI server. <p> If you want to update an existing DOI server then you should + * set this id to the DOI server you want to update and set the other values to the desired + * values. </p> + * + * @param id the id of the group. + * @return this DOI server object + */ + public DoiServer setId(int id) { + this.id = id; + return this; + } + + /** + * Get the basic/default name of the DOI server. This is non-translated and can be used to look + * up the DOI server like an id can. <p> This is a required property. <p> There is a max length + * to the name allowed. See the annotation for the length value. </p> + * + * @return DOI server name + */ + @Column(nullable = false, length = 32) + public String getName() { + return name; + } + + /** + * Set the basic/default name of the DOI server. This is non-translated and can be used to look + * up the DOI server like an id can. <p> This is a required property. <p> There is a max length + * to the name allowed. See the annotation on {@link #getName()} for the length value. </p> + */ + public DoiServer setName(String name) { + this.name = name; + return this; + } + + /** + * Get a description of the DOI server. + * + * @return the description. + */ + @Column(length = 255) + public String getDescription() { + return description; + } + + /** + * Set the DOI server description. + * + * @param description the description. + * @return this DOI server object. + */ + public DoiServer setDescription(String description) { + this.description = description; + return this; + } + + + /** + * Get the API URL for the DOI server. + * + * @return the DOI server API URL. + */ + @Column(nullable = false, length = 255) + public String getUrl() { + return url; + } + + /** + * Set the REST API configuration URL for the DOI server. + * + * @param url the server URL. + * @return this DOI server object. + */ + public DoiServer setUrl(String url) { + this.url = url; + return this; + } + + /** + * Get the username to use for connecting to the DOI server. + * + * @return the username. + */ + @Column(length = 128) + public String getUsername() { + return username; + } + + public DoiServer setUsername(String username) { + this.username = username; + return this; + } + + /** + * Get the password to use for connecting to the DOI server. + * + * @return the password. + */ + @Column(length = 128) + @Type(type="encryptedString") + public String getPassword() { + return password; + } + + public DoiServer setPassword(String password) { + this.password = password; + return this; + } + + /** + * Set the DOI landing page URL template. + * + * @param landingPageTemplate the landing page URL template. + * @return this DOI server object. + */ + public DoiServer setLandingPageTemplate(String landingPageTemplate) { + this.landingPageTemplate = landingPageTemplate; + return this; + } + + /** + * Get the DOI landing page URL template. + * + * @return the landing page URL template. + */ + @Column(nullable = false, length = 255) + public String getLandingPageTemplate() { + return landingPageTemplate; + } + + /** + * Set the DOI URL prefix. + * + * @param publicUrl the URL prefix. + * @return this DOI server object. + */ + public DoiServer setPublicUrl(String publicUrl) { + this.publicUrl = publicUrl; + return this; + } + + /** + * Get the DOI URL prefix. + * + * @return the URL prefix. + */ + @Column(nullable = false, length = 255) + public String getPublicUrl() { + return publicUrl; + } + + /** + * Set the DOI identifier pattern. + * + * @param pattern the identifier pattern. + * @return this DOI server object. + */ + public DoiServer setPattern(String pattern) { + this.pattern = pattern; + return this; + } + + /** + * Get the DOI identifier pattern. + * + * @return the identifier pattern. + */ + @Column(nullable = false, length = 255) + public String getPattern() { + return pattern; + } + + + /** + * Set the DOI prefix. + * + * @param prefix the DOI prefix. + * @return this DOI server object. + */ + public DoiServer setPrefix(String prefix) { + this.prefix = prefix; + return this; + } + + /** + * Get the DOI prefix. + * + * @return the DOI prefix. + */ + @Column(nullable = false, length = 15) + public String getPrefix() { + return prefix; + } + + /** + * Sets the groups which metadata should be published to the DOI server. + * + * @param publicationGroups Publication groups. + * @return + */ + public void setPublicationGroups(Set<Group> publicationGroups) { + this.publicationGroups = publicationGroups; + } + + /** + * Get the groups which metadata is published to the DOI server. + * + * @return Publication groups. + */ + @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) + @JoinTable( + name = "doiservers_group", + joinColumns = @JoinColumn(name = "doiserver_id"), + inverseJoinColumns = @JoinColumn(name = "group_id")) + public Set<Group> getPublicationGroups() { + return publicationGroups; + } +} diff --git a/domain/src/main/java/org/fao/geonet/entitylistener/DoiServerEntityListenerManager.java b/domain/src/main/java/org/fao/geonet/entitylistener/DoiServerEntityListenerManager.java new file mode 100644 index 00000000000..8d4af1bdf92 --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/entitylistener/DoiServerEntityListenerManager.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.entitylistener; + +import org.fao.geonet.domain.DoiServer; + +import javax.persistence.*; + +public class DoiServerEntityListenerManager extends AbstractEntityListenerManager<DoiServer> { + @PrePersist + public void prePresist(final DoiServer entity) { + handleEvent(PersistentEventType.PrePersist, entity); + } + + @PreRemove + public void preRemove(final DoiServer entity) { + handleEvent(PersistentEventType.PreRemove, entity); + } + + @PostPersist + public void postPersist(final DoiServer entity) { + handleEvent(PersistentEventType.PostPersist, entity); + } + + @PostRemove + public void postRemove(final DoiServer entity) { + handleEvent(PersistentEventType.PostRemove, entity); + } + + @PreUpdate + public void preUpdate(final DoiServer entity) { + handleEvent(PersistentEventType.PreUpdate, entity); + } + + @PostUpdate + public void postUpdate(final DoiServer entity) { + handleEvent(PersistentEventType.PostUpdate, entity); + } + + @PostLoad + public void postLoad(final DoiServer entity) { + handleEvent(PersistentEventType.PostLoad, entity); + } +} diff --git a/domain/src/main/java/org/fao/geonet/repository/DoiServerRepository.java b/domain/src/main/java/org/fao/geonet/repository/DoiServerRepository.java new file mode 100644 index 00000000000..25ca32429ce --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/repository/DoiServerRepository.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.repository; + +import org.fao.geonet.domain.DoiServer; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.Optional; + +public interface DoiServerRepository extends + GeonetRepository<DoiServer, Integer>, + JpaSpecificationExecutor<DoiServer> { + + Optional<DoiServer> findOneById(int id); +} diff --git a/domain/src/test/java/org/fao/geonet/repository/DoiServerRepositoryTest.java b/domain/src/test/java/org/fao/geonet/repository/DoiServerRepositoryTest.java new file mode 100644 index 00000000000..bc8daaf4bb6 --- /dev/null +++ b/domain/src/test/java/org/fao/geonet/repository/DoiServerRepositoryTest.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.repository; + +import org.fao.geonet.domain.DoiServer; +import org.fao.geonet.domain.Group; +import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; +import org.jasypt.hibernate5.encryptor.HibernatePBEEncryptorRegistry; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.Assert.assertEquals; + +public class DoiServerRepositoryTest extends AbstractSpringDataTest { + + @Autowired + private DoiServerRepository doiServerRepository; + + @Autowired + private GroupRepository groupRepository; + + @PersistenceContext + EntityManager entityManager; + + @BeforeClass + public static void init() { + StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor(); + strongEncryptor.setPassword("testpassword"); + + HibernatePBEEncryptorRegistry registry = + HibernatePBEEncryptorRegistry.getInstance(); + registry.registerPBEStringEncryptor("STRING_ENCRYPTOR", strongEncryptor); + } + + public static DoiServer newDoiServer(AtomicInteger nextId) { + int id = nextId.incrementAndGet(); + return new DoiServer() + .setName("Name " + id) + .setDescription("Desc " + id) + .setUrl("http://server" + id) + .setUsername("username" + id) + .setPassword("password" + id) + .setLandingPageTemplate("http://landingpage" + id) + .setPublicUrl("http://publicurl" + id) + .setPattern("pattern" + id) + .setPrefix("prefix" + id); + } + + @Test + public void test_Save_Count_FindOnly_DeleteAll() throws Exception { + assertEquals(0, doiServerRepository.count()); + DoiServer doiServer = newDoiServer(); + DoiServer savedDoiServer = doiServerRepository.save(doiServer); + + doiServerRepository.flush(); + entityManager.flush(); + entityManager.clear(); + + doiServer.setId(savedDoiServer.getId()); + assertEquals(1, doiServerRepository.count()); + Optional<DoiServer> retrievedDoiServerByIdOpt = doiServerRepository.findOneById(doiServer.getId()); + assertEquals(true, retrievedDoiServerByIdOpt.isPresent()); + assertSameContents(doiServer, retrievedDoiServerByIdOpt.get()); + + doiServerRepository.deleteAll(); + + doiServerRepository.flush(); + entityManager.flush(); + entityManager.clear(); + + assertEquals(0, doiServerRepository.count()); + } + + @Test + public void testUpdate() throws Exception { + Group group1 = groupRepository.save(GroupRepositoryTest.newGroup(_inc)); + Group group2 = groupRepository.save(GroupRepositoryTest.newGroup(_inc)); + + assertEquals(0, doiServerRepository.count()); + DoiServer doiServer = newDoiServer(); + doiServer.getPublicationGroups().add(group1); + + DoiServer savedDoiServer = doiServerRepository.save(doiServer); + + doiServerRepository.flush(); + entityManager.flush(); + entityManager.clear(); + + doiServer.setId(savedDoiServer.getId()); + + assertEquals(1, doiServerRepository.count()); + Optional<DoiServer> retrievedDoiServerByIdOpt = doiServerRepository.findOneById(doiServer.getId()); + assertEquals(true, retrievedDoiServerByIdOpt.isPresent()); + assertSameContents(doiServer, retrievedDoiServerByIdOpt.get()); + + doiServer.setName("New Name"); + doiServer.getPublicationGroups().add(group2); + DoiServer savedDoiServer2 = doiServerRepository.save(doiServer); + + doiServerRepository.flush(); + entityManager.flush(); + entityManager.clear(); + + assertSameContents(savedDoiServer, savedDoiServer2); + + assertEquals(1, doiServerRepository.count()); + retrievedDoiServerByIdOpt = doiServerRepository.findOneById(doiServer.getId()); + assertSameContents(doiServer, retrievedDoiServerByIdOpt.get()); + } + + + private DoiServer newDoiServer() { + return newDoiServer(_inc); + } +} diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl index 82ddac2f0c7..52bd4fb71f8 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl @@ -133,7 +133,7 @@ <xsl:template match="/"> <datacite:resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.1/metadata.xsd"> + xsi:schemaLocation="http://datacite.org/schema/kernel-4 https://schema.datacite.org/meta/kernel-4.1/metadata.xsd"> <xsl:apply-templates select="$metadata" mode="toDatacite"/> </datacite:resource> diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl index ed2ffd074eb..7465bc4b58f 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl @@ -109,7 +109,7 @@ <xsl:template match="/"> <datacite:resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.1/metadata.xsd"> + xsi:schemaLocation="http://datacite.org/schema/kernel-4 https://schema.datacite.org/meta/kernel-4.1/metadata.xsd"> <xsl:apply-templates select="$metadata" mode="toDatacite"/> </datacite:resource> diff --git a/services/src/main/java/org/fao/geonet/api/doiservers/DoiServersApi.java b/services/src/main/java/org/fao/geonet/api/doiservers/DoiServersApi.java new file mode 100644 index 00000000000..68f248c0ffa --- /dev/null +++ b/services/src/main/java/org/fao/geonet/api/doiservers/DoiServersApi.java @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.api.doiservers; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.fao.geonet.api.ApiParams; +import org.fao.geonet.api.doiservers.model.AnonymousDoiServer; +import org.fao.geonet.api.doiservers.model.DoiServerDto; +import org.fao.geonet.api.exception.ResourceNotFoundException; +import org.fao.geonet.domain.AbstractMetadata; +import org.fao.geonet.domain.DoiServer; +import org.fao.geonet.kernel.datamanager.IMetadataUtils; +import org.fao.geonet.repository.DoiServerRepository; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +@RequestMapping(value = { + "/{portal}/api/doiservers" +}) +@Tag(name = "doiservers", + description = "DOI servers related operations") +@RestController("doiservers") +public class DoiServersApi { + private static final String API_PARAM_DOISERVER_IDENTIFIER = "DOI server identifier"; + + private static final String API_PARAM_DOISERVER_DETAILS = "DOI server details"; + + public static final String MSG_DOISERVER_WITH_ID_NOT_FOUND = "DOI server with id '%s' not found."; + + + private final DoiServerRepository doiServerRepository; + + private final IMetadataUtils metadataUtils; + + DoiServersApi(final DoiServerRepository doiServerRepository, final IMetadataUtils metadataUtils) { + this.doiServerRepository = doiServerRepository; + this.metadataUtils = metadataUtils; + + } + + @io.swagger.v3.oas.annotations.Operation( + summary = "Get DOI servers" + ) + @GetMapping( + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + public + @ResponseStatus(HttpStatus.OK) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "List of all DOI servers."), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) + }) + List<AnonymousDoiServer> getDoiServers() { + List<DoiServer> doiServers = doiServerRepository.findAll(); + List<AnonymousDoiServer> list = new ArrayList<>(doiServers.size()); + doiServers.stream().forEach(e -> list.add(new AnonymousDoiServer(DoiServerDto.from(e)))); + return list; + } + + + @io.swagger.v3.oas.annotations.Operation( + summary = "Get DOI servers that can be used with a metadata" + ) + @GetMapping(value = "metadata/{metadataId}", + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + public + @ResponseStatus(HttpStatus.OK) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "List of all DOI servers where a metadata can be published."), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) + }) + List<AnonymousDoiServer> getDoiServers( + @Parameter(description = "Metadata UUID", + required = true, + example = "") + @PathVariable Integer metadataId) { + + List<DoiServer> doiServers = doiServerRepository.findAll(); + List<AnonymousDoiServer> list = new ArrayList<>(doiServers.size()); + + AbstractMetadata metadata = metadataUtils.findOne(metadataId); + Integer groupOwner = metadata.getSourceInfo().getGroupOwner(); + + // Find servers related to the metadata groups owner + List<DoiServer> doiServersForMetadata = doiServers.stream().filter( + s -> s.getPublicationGroups().stream().anyMatch(g -> g.getId() == groupOwner)).collect(Collectors.toList()); + + if (doiServersForMetadata.isEmpty()) { + // If no servers related to the metadata groups owner, + // find the servers that are not related to any metadata group + doiServersForMetadata = doiServers.stream() + .filter(s -> s.getPublicationGroups().isEmpty()) + .collect(Collectors.toList()); + } + + doiServersForMetadata.forEach(s -> { + DoiServerDto doiServerDto = DoiServerDto.from(s); + list.add(new AnonymousDoiServer(doiServerDto)); + }); + + Collections.sort(list, Comparator.comparing(DoiServerDto::getName)); + + return list; + } + + @io.swagger.v3.oas.annotations.Operation( + summary = "Get a DOI Server" + ) + @GetMapping(value = "/{doiServerId}", + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_EDITOR) + }) + public AnonymousDoiServer getDoiServer( + @Parameter(description = API_PARAM_DOISERVER_IDENTIFIER, + required = true, + example = "") + @PathVariable String doiServerId + ) throws ResourceNotFoundException { + Optional<DoiServer> doiServerOpt = doiServerRepository.findOneById(Integer.parseInt(doiServerId)); + if (doiServerOpt.isEmpty()) { + throw new ResourceNotFoundException(String.format( + MSG_DOISERVER_WITH_ID_NOT_FOUND, + doiServerId + )); + } else { + return new AnonymousDoiServer(DoiServerDto.from(doiServerOpt.get())); + } + } + + @io.swagger.v3.oas.annotations.Operation( + summary = "Add a DOI server", + description = "Return the id of the newly created DOI server." + ) + @PutMapping( + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "DOI server created."), + @ApiResponse(responseCode = "400", description = "Bad parameters."), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) + }) + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity<Integer> addDoiServer( + @Parameter( + description = API_PARAM_DOISERVER_DETAILS, + required = true + ) + @RequestBody + DoiServerDto doiServerDto + ) { + Optional<DoiServer> existingDoiServerOpt = doiServerRepository.findOneById(doiServerDto.getId()); + if (existingDoiServerOpt.isPresent()) { + throw new IllegalArgumentException(String.format( + "DOI server with id '%d' already exists.", + doiServerDto.getId() + )); + } else { + DoiServer doiServer = doiServerDto.asDoiServer(); + doiServerRepository.save(doiServer); + + return new ResponseEntity<>(doiServer.getId(), HttpStatus.CREATED); + } + } + + @io.swagger.v3.oas.annotations.Operation( + summary = "Update a DOI server" + ) + @PutMapping( + value = "/{doiServerId}", + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "DOI server updated."), + @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) + }) + @ResponseStatus(HttpStatus.NO_CONTENT) + public void updateDoiServer( + @Parameter(description = API_PARAM_DOISERVER_IDENTIFIER, + required = true, + example = "") + @PathVariable Integer doiServerId, + @Parameter(description = API_PARAM_DOISERVER_DETAILS, + required = true) + @RequestBody + DoiServerDto doiServerDto + ) throws ResourceNotFoundException { + Optional<DoiServer> existingMapserverOpt = doiServerRepository.findOneById(doiServerId); + if (existingMapserverOpt.isPresent()) { + DoiServer doiServer = doiServerDto.asDoiServer(); + + doiServerRepository.update(doiServerId, entity -> { + entity.setName(doiServer.getName()); + entity.setDescription(doiServer.getDescription()); + entity.setUrl(doiServer.getUrl()); + entity.setUsername(doiServer.getUsername()); + entity.setPublicUrl(doiServer.getPublicUrl()); + entity.setLandingPageTemplate(doiServer.getLandingPageTemplate()); + entity.setPattern(doiServer.getPattern()); + entity.setPrefix(doiServer.getPrefix()); + entity.setPublicationGroups(doiServer.getPublicationGroups()); + }); + } else { + throw new ResourceNotFoundException(String.format( + MSG_DOISERVER_WITH_ID_NOT_FOUND, + doiServerId + )); + } + } + + @io.swagger.v3.oas.annotations.Operation( + summary = "Remove a DOI server" + ) + @DeleteMapping( + value = "/{doiServerId}", + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "DOI server removed."), + @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) + }) + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteMapserver( + @Parameter(description = API_PARAM_DOISERVER_IDENTIFIER, + required = true + ) + @PathVariable Integer doiServerId + ) throws ResourceNotFoundException { + Optional<DoiServer> existingMapserverOpt = doiServerRepository.findOneById(doiServerId); + if (existingMapserverOpt.isPresent()) { + doiServerRepository.delete(existingMapserverOpt.get()); + } else { + throw new ResourceNotFoundException(String.format( + MSG_DOISERVER_WITH_ID_NOT_FOUND, + doiServerId + )); + } + } + + + @io.swagger.v3.oas.annotations.Operation( + summary = "Update a DOI server authentication" + ) + @PostMapping( + value = "/{doiServerId}/auth", + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + @PreAuthorize("hasAuthority('Administrator')") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "DOI server updated."), + @ApiResponse(responseCode = "404", description = ApiParams.API_RESPONSE_RESOURCE_NOT_FOUND), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) + }) + @ResponseStatus(HttpStatus.NO_CONTENT) + public void updateDoiServerAuth( + @Parameter( + description = API_PARAM_DOISERVER_IDENTIFIER, + required = true, + example = "") + @PathVariable Integer doiServerId, + @Parameter( + description = "Password", + required = true) + @RequestParam + String password + ) throws ResourceNotFoundException { + Optional<DoiServer> existingMapserverOpt = doiServerRepository.findOneById(doiServerId); + if (existingMapserverOpt.isPresent()) { + doiServerRepository.update(doiServerId, entity -> { + entity.setPassword(password); + }); + } else { + throw new ResourceNotFoundException(String.format( + MSG_DOISERVER_WITH_ID_NOT_FOUND, + doiServerId + )); + } + } +} diff --git a/services/src/main/java/org/fao/geonet/api/doiservers/model/AnonymousDoiServer.java b/services/src/main/java/org/fao/geonet/api/doiservers/model/AnonymousDoiServer.java new file mode 100644 index 00000000000..7760a19b932 --- /dev/null +++ b/services/src/main/java/org/fao/geonet/api/doiservers/model/AnonymousDoiServer.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.api.doiservers.model; + +public class AnonymousDoiServer extends DoiServerDto { + + public AnonymousDoiServer(DoiServerDto doiServer) { + super(); + this + .setId(doiServer.getId()) + .setName(doiServer.getName()) + .setUsername(doiServer.getUsername()) + .setDescription(doiServer.getDescription()) + .setUrl(doiServer.getUrl()) + .setLandingPageTemplate(doiServer.getLandingPageTemplate()) + .setPattern(doiServer.getPattern()) + .setPublicUrl(doiServer.getPublicUrl()) + .setPrefix(doiServer.getPrefix()) + .setPublicationGroups(doiServer.getPublicationGroups()); + } + + @Override + public String getPassword() { + return "***"; + } +} diff --git a/services/src/main/java/org/fao/geonet/api/doiservers/model/DoiServerDto.java b/services/src/main/java/org/fao/geonet/api/doiservers/model/DoiServerDto.java new file mode 100644 index 00000000000..f20514181c1 --- /dev/null +++ b/services/src/main/java/org/fao/geonet/api/doiservers/model/DoiServerDto.java @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.api.doiservers.model; + +import org.fao.geonet.ApplicationContextHolder; +import org.fao.geonet.domain.DoiServer; +import org.fao.geonet.domain.Group; +import org.fao.geonet.repository.GroupRepository; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public class DoiServerDto { + private int id; + private String name; + private String description; + private String url; + private String username; + private String password; + private String landingPageTemplate; + private String publicUrl; + private String pattern = "{{uuid}}"; + private String prefix; + private Set<Integer> publicationGroups = new HashSet<>(); + + + public int getId() { + return id; + } + + public DoiServerDto setId(int id) { + this.id = id; + return this; + } + + public String getName() { + return name; + } + + public DoiServerDto setName(String name) { + this.name = name; + return this; + } + + public String getDescription() { + return description; + } + + public DoiServerDto setDescription(String description) { + this.description = description; + return this; + } + + public String getUrl() { + return url; + } + + public DoiServerDto setUrl(String url) { + this.url = url; + return this; + } + + public String getUsername() { + return username; + } + + public DoiServerDto setUsername(String username) { + this.username = username; + return this; + } + + public String getPassword() { + return password; + } + + public DoiServerDto setPassword(String password) { + this.password = password; + return this; + } + + public String getLandingPageTemplate() { + return landingPageTemplate; + } + + public DoiServerDto setLandingPageTemplate(String landingPageTemplate) { + this.landingPageTemplate = landingPageTemplate; + return this; + } + + public String getPublicUrl() { + return publicUrl; + } + + public DoiServerDto setPublicUrl(String publicUrl) { + this.publicUrl = publicUrl; + return this; + } + + public String getPattern() { + return pattern; + } + + public DoiServerDto setPattern(String pattern) { + this.pattern = pattern; + return this; + } + + public String getPrefix() { + return prefix; + } + + public DoiServerDto setPrefix(String prefix) { + this.prefix = prefix; + return this; + } + + public Set<Integer> getPublicationGroups() { + return publicationGroups; + } + + public DoiServerDto setPublicationGroups(Set<Integer> publicationGroups) { + this.publicationGroups = publicationGroups; + return this; + } + + public static DoiServerDto from(DoiServer doiServer) { + DoiServerDto doiServerDto = new DoiServerDto(); + + doiServerDto.setId(doiServer.getId()); + doiServerDto.setName(doiServer.getName()); + doiServerDto.setDescription(doiServer.getDescription()); + doiServerDto.setUrl(doiServer.getUrl()); + doiServerDto.setUsername(doiServer.getUsername()); + doiServerDto.setPassword(doiServer.getPassword()); + doiServerDto.setPattern(doiServer.getPattern()); + doiServerDto.setLandingPageTemplate(doiServer.getLandingPageTemplate()); + doiServerDto.setPublicUrl(doiServer.getPublicUrl()); + doiServerDto.setPrefix(doiServer.getPrefix()); + doiServerDto.setPublicationGroups(doiServer.getPublicationGroups().stream().map(Group::getId).collect(Collectors.toSet())); + + return doiServerDto; + } + + public DoiServer asDoiServer() { + DoiServer doiServer = new DoiServer(); + + doiServer.setId(getId()); + doiServer.setName(getName()); + doiServer.setDescription(getDescription()); + doiServer.setUrl(getUrl()); + doiServer.setUsername(getUsername()); + doiServer.setPassword(getPassword()); + doiServer.setPattern(getPattern()); + doiServer.setLandingPageTemplate(getLandingPageTemplate()); + doiServer.setPublicUrl(getPublicUrl()); + doiServer.setPrefix(getPrefix()); + + GroupRepository groupRepository = ApplicationContextHolder.get().getBean(GroupRepository.class); + Set<Group> groups = new HashSet<>(); + getPublicationGroups().forEach(groupId -> { + if (groupId != null) { + Optional<Group> g = groupRepository.findById(groupId); + + if (g.isPresent()) { + groups.add(g.get()); + } + } + }); + doiServer.setPublicationGroups(groups); + + return doiServer; + } +} diff --git a/services/src/main/java/org/fao/geonet/api/records/DoiApi.java b/services/src/main/java/org/fao/geonet/api/records/DoiApi.java index 97dbd5b10e5..f786642641a 100644 --- a/services/src/main/java/org/fao/geonet/api/records/DoiApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/DoiApi.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -30,29 +30,28 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jeeves.server.context.ServiceContext; import jeeves.services.ReadWriteController; -import org.fao.geonet.api.API; import org.fao.geonet.api.ApiParams; import org.fao.geonet.api.ApiUtils; +import org.fao.geonet.api.exception.ResourceNotFoundException; import org.fao.geonet.doi.client.DoiManager; import org.fao.geonet.domain.AbstractMetadata; -import org.springframework.beans.factory.annotation.Autowired; +import org.fao.geonet.domain.DoiServer; +import org.fao.geonet.repository.DoiServerRepository; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.Map; +import java.util.Optional; import static org.fao.geonet.api.ApiParams.API_CLASS_RECORD_OPS; import static org.fao.geonet.api.ApiParams.API_CLASS_RECORD_TAG; import static org.fao.geonet.api.ApiParams.API_PARAM_RECORD_UUID; +import static org.fao.geonet.api.doiservers.DoiServersApi.MSG_DOISERVER_WITH_ID_NOT_FOUND; /** * Handle DOI creation. @@ -62,19 +61,24 @@ }) @Tag(name = API_CLASS_RECORD_TAG, description = API_CLASS_RECORD_OPS) -@Controller("doi") +@RestController("doi") @PreAuthorize("hasAuthority('Editor')") @ReadWriteController public class DoiApi { - @Autowired - private DoiManager doiManager; + private final DoiManager doiManager; + + private final DoiServerRepository doiServerRepository; + + DoiApi(final DoiManager doiManager, final DoiServerRepository doiServerRepository) { + this.doiManager = doiManager; + this.doiServerRepository = doiServerRepository; + } @io.swagger.v3.oas.annotations.Operation( summary = "Check that a record can be submitted to DataCite for DOI creation. " + "DataCite requires some fields to be populated.") - @RequestMapping(value = "/{metadataUuid}/doi/checkPreConditions", - method = RequestMethod.GET, + @GetMapping(value = "/{metadataUuid}/doi/{doiServerId}/checkPreConditions", produces = { MediaType.APPLICATION_JSON_VALUE } @@ -88,27 +92,31 @@ public class DoiApi { @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) public - @ResponseBody ResponseEntity<Map<String, Boolean>> checkDoiStatus( @Parameter( description = API_PARAM_RECORD_UUID, required = true) @PathVariable String metadataUuid, + @Parameter( + description = "DOI server identifier", + required = true) + @PathVariable + Integer doiServerId, @Parameter(hidden = true) HttpServletRequest request ) throws Exception { AbstractMetadata metadata = ApiUtils.canEditRecord(metadataUuid, request); ServiceContext serviceContext = ApiUtils.createServiceContext(request); - final Map<String, Boolean> reportStatus = doiManager.check(serviceContext, metadata, null); + DoiServer doiServer = retrieveDoiServer(doiServerId); + final Map<String, Boolean> reportStatus = doiManager.check(serviceContext, doiServer, metadata, null); return new ResponseEntity<>(reportStatus, HttpStatus.OK); } @io.swagger.v3.oas.annotations.Operation( summary = "Check the DOI URL created based on current configuration and pattern.") - @RequestMapping(value = "/{metadataUuid}/doi/checkDoiUrl", - method = RequestMethod.GET, + @GetMapping(value = "/{metadataUuid}/doi/{doiServerId}/checkDoiUrl", produces = { MediaType.TEXT_PLAIN_VALUE } @@ -121,26 +129,30 @@ ResponseEntity<Map<String, Boolean>> checkDoiStatus( @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) public - @ResponseBody ResponseEntity<String> checkDoiUrl( @Parameter( description = API_PARAM_RECORD_UUID, required = true) @PathVariable String metadataUuid, + @Parameter( + description = "DOI server identifier", + required = true) + @PathVariable + Integer doiServerId, @Parameter(hidden = true) HttpServletRequest request ) throws Exception { AbstractMetadata metadata = ApiUtils.canEditRecord(metadataUuid, request); - return new ResponseEntity<>(doiManager.checkDoiUrl(metadata), HttpStatus.OK); + DoiServer doiServer = retrieveDoiServer(doiServerId); + return new ResponseEntity<>(doiManager.checkDoiUrl(doiServer, metadata), HttpStatus.OK); } @io.swagger.v3.oas.annotations.Operation( summary = "Submit a record to the Datacite metadata store in order to create a DOI.") - @RequestMapping(value = "/{metadataUuid}/doi", - method = RequestMethod.PUT, + @PutMapping(value = "/{metadataUuid}/doi/{doiServerId}", produces = { MediaType.APPLICATION_JSON_VALUE } @@ -153,13 +165,17 @@ ResponseEntity<String> checkDoiUrl( @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT) }) public - @ResponseBody ResponseEntity<Map<String, String>> createDoi( @Parameter( description = API_PARAM_RECORD_UUID, required = true) @PathVariable String metadataUuid, + @Parameter( + description = "DOI server identifier", + required = true) + @PathVariable + Integer doiServerId, @Parameter(hidden = true) HttpServletRequest request, @Parameter(hidden = true) @@ -168,7 +184,8 @@ ResponseEntity<Map<String, String>> createDoi( AbstractMetadata metadata = ApiUtils.canEditRecord(metadataUuid, request); ServiceContext serviceContext = ApiUtils.createServiceContext(request); - Map<String, String> doiInfo = doiManager.register(serviceContext, metadata); + DoiServer doiServer = retrieveDoiServer(doiServerId); + Map<String, String> doiInfo = doiManager.register(serviceContext, doiServer, metadata); return new ResponseEntity<>(doiInfo, HttpStatus.CREATED); } @@ -176,8 +193,7 @@ ResponseEntity<Map<String, String>> createDoi( @io.swagger.v3.oas.annotations.Operation( summary = "Remove a DOI (this is not recommended, DOI are supposed to be persistent once created. This is mainly here for testing).") - @RequestMapping(value = "/{metadataUuid}/doi", - method = RequestMethod.DELETE, + @DeleteMapping(value = "/{metadataUuid}/doi/{doiServerId}", produces = { MediaType.APPLICATION_JSON_VALUE } @@ -190,8 +206,7 @@ ResponseEntity<Map<String, String>> createDoi( @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_ONLY_ADMIN) }) public - @ResponseBody - ResponseEntity unregisterDoi( + ResponseEntity<Void> unregisterDoi( @Parameter( description = API_PARAM_RECORD_UUID, required = true) @@ -199,16 +214,34 @@ ResponseEntity unregisterDoi( String metadataUuid, @Parameter(hidden = true) HttpServletRequest request, + @Parameter( + description = "DOI server identifier", + required = true) + @PathVariable + Integer doiServerId, @Parameter(hidden = true) HttpSession session ) throws Exception { AbstractMetadata metadata = ApiUtils.canEditRecord(metadataUuid, request); ServiceContext serviceContext = ApiUtils.createServiceContext(request); - doiManager.unregisterDoi(metadata, serviceContext); + DoiServer doiServer = retrieveDoiServer(doiServerId); + doiManager.unregisterDoi(doiServer, metadata, serviceContext); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + private DoiServer retrieveDoiServer(Integer doiServerId) throws ResourceNotFoundException { + Optional<DoiServer> doiServerOpt = doiServerRepository.findOneById(doiServerId); + if (doiServerOpt.isEmpty()) { + throw new ResourceNotFoundException(String.format( + MSG_DOISERVER_WITH_ID_NOT_FOUND, + doiServerId + )); + } + + return doiServerOpt.get(); + } + // TODO: At some point we may add support for DOI States management // https://support.datacite.org/docs/mds-api-guide#section-doi-states } diff --git a/services/src/main/java/org/fao/geonet/api/site/SiteApi.java b/services/src/main/java/org/fao/geonet/api/site/SiteApi.java index 5668d6429e5..01882b580ed 100644 --- a/services/src/main/java/org/fao/geonet/api/site/SiteApi.java +++ b/services/src/main/java/org/fao/geonet/api/site/SiteApi.java @@ -49,7 +49,6 @@ import org.fao.geonet.api.tools.i18n.LanguageUtils; import org.fao.geonet.api.users.recaptcha.RecaptchaChecker; import org.fao.geonet.constants.Geonet; -import org.fao.geonet.doi.client.DoiManager; import org.fao.geonet.domain.*; import org.fao.geonet.exceptions.OperationAbortedEx; import org.fao.geonet.index.Status; @@ -171,8 +170,6 @@ public static void reloadServices(ServiceContext context) throws Exception { context.error(e); throw new OperationAbortedEx("Parameters saved but cannot set proxy information: " + e.getMessage()); } - DoiManager doiManager = gc.getBean(DoiManager.class); - doiManager.loadConfig(); HarvestManager harvestManager = context.getBean(HarvestManager.class); harvestManager.rescheduleActiveHarvesters(); diff --git a/services/src/test/java/org/fao/geonet/api/doiservers/DoiServersApiTest.java b/services/src/test/java/org/fao/geonet/api/doiservers/DoiServersApiTest.java new file mode 100644 index 00000000000..d91e6924cfc --- /dev/null +++ b/services/src/test/java/org/fao/geonet/api/doiservers/DoiServersApiTest.java @@ -0,0 +1,281 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.api.doiservers; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import junit.framework.Assert; +import org.fao.geonet.api.JsonFieldNamingStrategy; +import org.fao.geonet.api.doiservers.model.DoiServerDto; +import org.fao.geonet.domain.*; +import org.fao.geonet.repository.DoiServerRepository; +import org.fao.geonet.repository.DoiServerRepositoryTest; +import org.fao.geonet.repository.GroupRepository; +import org.fao.geonet.repository.GroupRepositoryTest; +import org.fao.geonet.services.AbstractServiceIntegrationTest; +import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; +import org.jasypt.hibernate5.encryptor.HibernatePBEEncryptorRegistry; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +public class DoiServersApiTest extends AbstractServiceIntegrationTest { + @Autowired + private WebApplicationContext wac; + + @Autowired + private DoiServerRepository doiServerRepository; + + @Autowired + private GroupRepository groupRepository; + + private MockMvc mockMvc; + + private MockHttpSession mockHttpSession; + + private AtomicInteger inc = new AtomicInteger(); + + @BeforeClass + public static void init() { + StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor(); + strongEncryptor.setPassword("testpassword"); + + HibernatePBEEncryptorRegistry registry = + HibernatePBEEncryptorRegistry.getInstance(); + registry.registerPBEStringEncryptor("STRING_ENCRYPTOR", strongEncryptor); + } + + @Before + public void setUp() { + createTestData(); + } + + @Test + public void getDoiServers() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(get("/srv/api/doiservers") + .session(this.mockHttpSession) + .accept(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(2))) + .andExpect(content().contentType(API_JSON_EXPECTED_ENCODING)); + } + + @Test + public void getDoiServer() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + List<DoiServer> doiServers = doiServerRepository.findAll(); + assertEquals(2, doiServers.size()); + DoiServer doiServerToRetrieve = doiServers.get(0); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(get("/srv/api/doiservers/" + doiServerToRetrieve.getId()) + .session(this.mockHttpSession) + .accept(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.name", is(doiServerToRetrieve.getName()))) + .andExpect(content().contentType(API_JSON_EXPECTED_ENCODING)); + } + + @Test + public void deleteDoiServer() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + List<DoiServer> doiServers = doiServerRepository.findAll(); + assertEquals(2, doiServers.size()); + DoiServer doiServerToDelete = doiServers.get(0); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(delete("/srv/api/doiservers/" + doiServerToDelete.getId()) + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().isNoContent()); + + this.mockMvc.perform(get("/srv/api/doiservers/" + doiServerToDelete.getId()) + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().isNotFound()); + + Optional<DoiServer> doiServerOpt = doiServerRepository.findOneById(doiServerToDelete.getId()); + Assert.assertTrue(doiServerOpt.isEmpty()); + } + + @Test + public void deleteNonExistingDoiServer() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + Optional<DoiServer> doiServerToDelete = doiServerRepository.findOneById(222); + Assert.assertFalse(doiServerToDelete.isPresent()); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(delete("/srv/api/doiservers/222") + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().isNotFound()) + .andExpect(content().contentType(API_JSON_EXPECTED_ENCODING)); + } + + @Test + public void updateDoiServer() throws Exception { + List<DoiServer> doiServers = doiServerRepository.findAll(); + assertEquals(2, doiServers.size()); + DoiServer doiServerToUpdate = doiServers.get(0); + + DoiServerDto doiServerDto = DoiServerDto.from(doiServerToUpdate); + doiServerDto.setName("New name"); + doiServerDto.setDescription("New description"); + doiServerDto.setUrl("http://newurl"); + + Gson gson = new GsonBuilder() + .setFieldNamingStrategy(new JsonFieldNamingStrategy()) + .create(); + String json = gson.toJson(doiServerDto); + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(put("/srv/api/doiservers/" + doiServerToUpdate.getId()) + .content(json) + .contentType(API_JSON_EXPECTED_ENCODING) + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().isNoContent()); + + Optional<DoiServer> doiServerUpdatedOpt = doiServerRepository.findOneById(doiServerToUpdate.getId()); + assertTrue(doiServerUpdatedOpt.isPresent()); + assertEquals(doiServerDto.getName(), doiServerUpdatedOpt.get().getName()); + assertEquals(doiServerDto.getDescription(), doiServerUpdatedOpt.get().getDescription()); + assertEquals(doiServerDto.getUrl(), doiServerUpdatedOpt.get().getUrl()); + } + + @Test + public void updateNonExistingDoiServer() throws Exception { + Optional<DoiServer> doiServerToUpdateOptional = doiServerRepository.findOneById(222); + Assert.assertFalse(doiServerToUpdateOptional.isPresent()); + + DoiServer doiServerToUpdate = DoiServerRepositoryTest.newDoiServer(inc); + doiServerToUpdate.setId(222); + DoiServerDto doiServerToUpdateDto = DoiServerDto.from(doiServerToUpdate); + + Gson gson = new GsonBuilder() + .setFieldNamingStrategy(new JsonFieldNamingStrategy()) + .create(); + String json = gson.toJson(doiServerToUpdateDto); + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(put("/srv/api/doiservers/" + doiServerToUpdate.getId()) + .content(json) + .contentType(API_JSON_EXPECTED_ENCODING) + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().isNotFound()); + } + + @Test + public void updateDoiServerAuth() throws Exception { + List<DoiServer> doiServers = doiServerRepository.findAll(); + assertEquals(2, doiServers.size()); + DoiServer doiServerToUpdate = doiServers.get(0); + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + this.mockHttpSession = loginAsAdmin(); + + this.mockMvc.perform(post("/srv/api/doiservers/" + doiServerToUpdate.getId() + "/auth") + .param("username", "newusername") + .param("password", "newpassword") + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().isNoContent()); + } + + @Test + public void addDoiServer() throws Exception { + DoiServer doiServerToAdd = DoiServerRepositoryTest.newDoiServer(inc); + DoiServerDto doiServerToAddDto = DoiServerDto.from(doiServerToAdd); + + Gson gson = new GsonBuilder() + .setFieldNamingStrategy(new JsonFieldNamingStrategy()) + .create(); + String json = gson.toJson(doiServerToAddDto); + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + this.mockHttpSession = loginAsAdmin(); + + MvcResult result = this.mockMvc.perform(put("/srv/api/doiservers") + .content(json) + .contentType(API_JSON_EXPECTED_ENCODING) + .session(this.mockHttpSession) + .accept(MediaType.parseMediaType("application/json"))) + .andExpect(status().is(201)) + .andReturn(); + + int createdDoiServerId = Integer.parseInt(result.getResponse().getContentAsString()); + Optional<DoiServer> doiServerAdded = doiServerRepository.findOneById(createdDoiServerId); + Assert.assertTrue(doiServerAdded.isPresent()); + } + + private void createTestData() { + Group group1 = GroupRepositoryTest.newGroup(_inc); + groupRepository.save(group1); + + DoiServer doiServer1 = DoiServerRepositoryTest.newDoiServer(inc); + doiServer1.getPublicationGroups().add(group1); + doiServerRepository.save(doiServer1); + + DoiServer doiServer2 = DoiServerRepositoryTest.newDoiServer(inc); + doiServerRepository.save(doiServer2); + } +} diff --git a/web-ui/src/main/resources/catalog/components/doi/DoiDirective.js b/web-ui/src/main/resources/catalog/components/doi/DoiDirective.js index 14a49dad048..364218dd450 100644 --- a/web-ui/src/main/resources/catalog/components/doi/DoiDirective.js +++ b/web-ui/src/main/resources/catalog/components/doi/DoiDirective.js @@ -44,10 +44,24 @@ scope.response = {}; scope.isUpdate = angular.isDefined(scope.doiUrl); + scope.doiServers = []; + scope.selectedDoiServer = null; + + gnDoiService.getDoiServersForMetadata(scope.uuid).then(function (response) { + scope.doiServers = response.data; + if (scope.doiServers.length > 0) { + scope.selectedDoiServer = scope.doiServers[0].id; + } + }); + + scope.updateDoiServer = function () { + scope.response = {}; + }; + scope.check = function () { scope.response = {}; scope.response["check"] = null; - return gnDoiService.check(scope.uuid).then( + return gnDoiService.check(scope.uuid, scope.selectedDoiServer).then( function (r) { scope.response["check"] = r; scope.isUpdate = angular.isDefined(scope.doiUrl); @@ -60,7 +74,7 @@ }; scope.create = function () { - return gnDoiService.create(scope.uuid).then( + return gnDoiService.create(scope.uuid, scope.selectedDoiServer).then( function (r) { scope.response["create"] = r; delete scope.response["check"]; diff --git a/web-ui/src/main/resources/catalog/components/doi/DoiService.js b/web-ui/src/main/resources/catalog/components/doi/DoiService.js index e21427f8c31..cee4d27b3ff 100644 --- a/web-ui/src/main/resources/catalog/components/doi/DoiService.js +++ b/web-ui/src/main/resources/catalog/components/doi/DoiService.js @@ -33,11 +33,39 @@ "$http", "gnConfig", function ($http, gnConfig) { - function check(id) { - return $http.get("../api/records/" + id + "/doi/checkPreConditions"); + /** + * Returns a promise to validate a metadata to be published on a DOI server. + * + * @param id + * @param doiServerId + * @returns {*} + */ + function check(id, doiServerId) { + return $http.get( + "../api/records/" + id + "/doi/" + doiServerId + "/checkPreConditions" + ); } - function create(id) { - return $http.put("../api/records/" + id + "/doi"); + + /** + * Returns a promise to publish a metadata on a DOI server. + * + * @param id + * @param doiServerId + * @returns {*} + */ + function create(id, doiServerId) { + return $http.put("../api/records/" + id + "/doi/" + doiServerId); + } + + /** + * Returns a promise to retrieve the list of DOI servers + * where a metadata can be published. + * + * @param metadataId + * @returns {*} + */ + function getDoiServersForMetadata(metadataId) { + return $http.get("../api/doiservers/metadata/" + metadataId); } function isDoiApplicableForMetadata(md) { @@ -73,7 +101,8 @@ check: check, create: create, isDoiApplicableForMetadata: isDoiApplicableForMetadata, - canPublishDoiForResource: canPublishDoiForResource + canPublishDoiForResource: canPublishDoiForResource, + getDoiServersForMetadata: getDoiServersForMetadata }; } ]); diff --git a/web-ui/src/main/resources/catalog/components/doi/partials/doiwidget.html b/web-ui/src/main/resources/catalog/components/doi/partials/doiwidget.html index c1a6a8dc3bc..2edf7718127 100644 --- a/web-ui/src/main/resources/catalog/components/doi/partials/doiwidget.html +++ b/web-ui/src/main/resources/catalog/components/doi/partials/doiwidget.html @@ -5,6 +5,16 @@ <h2 data-translate="" data-ng-hide="xsMode">createDoiForRecord</h2> </div> <div class="btn-group" data-ng-class="{'btn-group-xs': xsMode}" role="group"> + <select + class="form-control" + data-ng-change="updateDoiServer()" + data-ng-show="doiServers.length > 1" + data-ng-model="selectedDoiServer" + data-ng-options="s.id as s.name for s in doiServers" + > + > + </select> + <button class="btn btn-default" data-gn-click-and-spin="check()" diff --git a/web-ui/src/main/resources/catalog/components/history/partials/historyStep.html b/web-ui/src/main/resources/catalog/components/history/partials/historyStep.html index 305b795d3e9..ff458cfb0cd 100644 --- a/web-ui/src/main/resources/catalog/components/history/partials/historyStep.html +++ b/web-ui/src/main/resources/catalog/components/history/partials/historyStep.html @@ -109,7 +109,7 @@ data-ng-init="key = h.metadataId + '-' + h.statusId" > <div - data-ng-show="h.statusValue.name == 'doiCreationTask'" + data-ng-if="h.statusValue.name == 'doiCreationTask'" data-gn-doi-wizard="h.metadataId" ></div> diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html b/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html index 900d7f03508..7f05a72904c 100644 --- a/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html +++ b/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html @@ -204,7 +204,7 @@ <h3 class="flex-grow"> </p> <div - data-ng-if="canPublishDoiForResource(md, linkForEdit)" + data-ng-if="canPublishDoiForResource(md, linkForEdit, doiServers)" data-gn-doi-wizard="md.uuid" data-gn-doi-url="r.locUrl" data-xs-mode="true" diff --git a/web-ui/src/main/resources/catalog/js/admin/DoiServerController.js b/web-ui/src/main/resources/catalog/js/admin/DoiServerController.js new file mode 100644 index 00000000000..eb773b5fc15 --- /dev/null +++ b/web-ui/src/main/resources/catalog/js/admin/DoiServerController.js @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +(function () { + goog.provide("gn_doiserver_controller"); + + var module = angular.module("gn_doiserver_controller", []); + + /** + * GnDoiServerController provides management interface + * for DOI server configuration used for DOI publication. + * + */ + module.controller("GnDoiServerController", [ + "$scope", + "$http", + "$rootScope", + "$translate", + function ($scope, $http, $rootScope, $translate) { + $scope.doiServers = []; + $scope.doiServerSelected = null; + $scope.doiServerUpdated = false; + $scope.doiServerSearch = ""; + $scope.isUpdate = null; + $scope.selectedPublicationGroups = []; + $scope.groupsForPublication = []; + + // Load groups + function loadGroups() { + $http.get("../api/groups").then( + function (response) { + $scope.groupsForPublication = response.data; + + var getLabel = function (g) { + return g.label[$scope.lang] || g.name; + }; + + angular.forEach($scope.groupsForPublication, function (u) { + u.langlabel = getLabel(u); + }); + }, + function (response) { + // TODO + } + ); + } + + loadGroups(); + + function loadDoiServers() { + $scope.doiServerSelected = null; + if ($scope.gnDoiServerEdit) { + $scope.gnDoiServerEdit.$setPristine(); + } + + $http.get("../api/doiservers").then(function (response) { + $scope.doiServers = response.data; + }); + } + + $scope.updateDoiServerUrl = function (newUrl, urlPrefix) { + $scope.doiServerSelected.url = newUrl; + $scope.doiServerSelected.publicUrl = urlPrefix; + + $scope.gnDoiServerEdit.$setDirty(); + }; + + $scope.updatingDoiServer = function () { + $scope.doiServerUpdated = true; + }; + + $scope.selectDoiServer = function (v) { + if ($scope.gnDoiServerEdit.$dirty) { + if (!confirm($translate.instant("formConfirmExit"))) { + return; + } + } + + $scope.isUpdate = true; + $scope.doiServerUpdated = false; + $scope.doiServerSelected = v; + $scope.selectedPublicationGroups = []; + + for (var i = 0; i < v.publicationGroups.length; i++) { + var group = _.find($scope.groupsForPublication, { id: v.publicationGroups[i] }); + if (group !== undefined) { + $scope.selectedPublicationGroups.push(group); + } + } + + $scope.gnDoiServerEdit.$setPristine(); + }; + + $scope.addDoiServer = function () { + $scope.isUpdate = false; + $scope.selectedPublicationGroups = []; + $scope.doiServerSelected = { + id: "", + name: "", + description: "", + url: "", + username: "", + password: "", + landingPageTemplate: + "http://localhost:8080/geonetwork/srv/resources/records/{{uuid}}", + publicUrl: "", + pattern: "{{uuid}}", + prefix: "", + publicationGroups: [] + }; + }; + $scope.saveDoiServer = function () { + $scope.doiServerSelected.publicationGroups = _.map( + $scope.selectedPublicationGroups, + "id" + ); + + $http + .put( + "../api/doiservers" + + ($scope.isUpdate ? "/" + $scope.doiServerSelected.id : ""), + $scope.doiServerSelected + ) + .then( + function (response) { + loadDoiServers(); + $rootScope.$broadcast("StatusUpdated", { + msg: $translate.instant("doiServerUpdated"), + timeout: 2, + type: "success" + }); + }, + function (response) { + $rootScope.$broadcast("StatusUpdated", { + title: $translate.instant("doiServerUpdateError"), + error: response.data, + timeout: 0, + type: "danger" + }); + } + ); + }; + + $scope.resetPassword = null; + $scope.resetUsername = null; + $scope.resetDoiServerPassword = function () { + $scope.resetPassword = null; + $scope.resetUsername = null; + $("#passwordResetModal").modal(); + }; + + $scope.saveNewPassword = function () { + var data = $.param({ + username: $scope.resetUsername, + password: $scope.resetPassword + }); + + $http + .post("../api/doiservers/" + $scope.doiServerSelected.id + "/auth", data, { + headers: { "Content-Type": "application/x-www-form-urlencoded" } + }) + .then( + function (response) { + $scope.resetPassword = null; + $("#passwordResetModal").modal("hide"); + }, + function (response) { + // TODO + } + ); + }; + + $scope.deleteDoiServerConfig = function () { + $("#gn-confirm-remove-doiserver").modal("show"); + }; + + $scope.confirmDeleteDoiServerConfig = function () { + $http.delete("../api/doiservers/" + $scope.doiServerSelected.id).then( + function (response) { + loadDoiServers(); + }, + function (response) { + $rootScope.$broadcast("StatusUpdated", { + title: $translate.instant("doiServerDeleteError"), + error: response.data, + timeout: 0, + type: "danger" + }); + } + ); + }; + loadDoiServers(); + } + ]); +})(); diff --git a/web-ui/src/main/resources/catalog/js/admin/SettingsController.js b/web-ui/src/main/resources/catalog/js/admin/SettingsController.js index c3bafb3ada8..e094b0f4513 100644 --- a/web-ui/src/main/resources/catalog/js/admin/SettingsController.js +++ b/web-ui/src/main/resources/catalog/js/admin/SettingsController.js @@ -35,6 +35,7 @@ goog.require("gn_system_settings_controller"); goog.require("gn_languages_controller"); goog.require("gn_static_pages_controller"); + goog.require("gn_doiserver_controller"); var module = angular.module("gn_settings_controller", [ "gn_system_settings_controller", @@ -47,7 +48,8 @@ "gn_metadata_identifier_templates_controller", "gn_cssstyle_settings_controller", "gn_scroll_spy", - "gn_static_pages_controller" + "gn_static_pages_controller", + "gn_doiserver_controller" ]); module.controller("GnSettingsController", [ @@ -126,6 +128,12 @@ label: "manageMapServers", href: "#/settings/mapservers" }, + { + type: "doiservers", + icon: "gn-icon-doi", + label: "manageDoiServers", + href: "#/settings/doiservers" + }, { type: "static-pages", icon: "fa-link", diff --git a/web-ui/src/main/resources/catalog/locales/en-admin.json b/web-ui/src/main/resources/catalog/locales/en-admin.json index ea30bfd3131..1a711de4150 100644 --- a/web-ui/src/main/resources/catalog/locales/en-admin.json +++ b/web-ui/src/main/resources/catalog/locales/en-admin.json @@ -633,22 +633,6 @@ "system/documentation": "Documentation configuration", "system/documentation/url": "Base manual url", "system/documentation/url-help": "Base application manual url. Defaults to the official manual page (https://docs.geonetwork-opensource.org/{version}/{lang}) and can be customised to use a self hosted documentation with a custom branding. The url can contain \\{\\{lang\\}\\} placeholder, to display the manual in different languages when available, and \\{\\{version\\}\\} placeholder to use the application version.", - "system/publication": "Publication", - "system/publication/doi/doienabled": "Allow creation of Digital Object Identifier (DOI)", - "system/publication/doi/doipattern": "DOI pattern", - "system/publication/doi/doipattern-help": "Default is '\\{\\{uuid\\}\\}' but the DOI structure can be customized with database id and/or record group eg. 'example-\\{\\{groupOwner\\}\\}-\\{\\{id\\}\\}'", - "system/publication/doi/doienabled-help": "A Digital Object Identifier (DOI) is an alphanumeric string assigned to uniquely identify an object. It is tied to a metadata description of the object as well as to a digital location, such as a URL, where all the details about the object are accessible. More information available on <a href='https://www.datacite.org/dois.html'>DataCite website</a>.", - "system/publication/doi/doipublicurl": "The final DOI URL prefix", - "system/publication/doi/doipublicurl-help": "Keep it empty to use the default https://doi.org prefix. Use https://mds.test.datacite.org/doi when using the test API.", - "system/publication/doi/doiurl": "The DataCite API endpoint", - "system/publication/doi/doiurl-help": "Usually https://mds.datacite.org or https://mds.test.datacite.org for testing.", - "system/publication/doi/doiusername": "Your DataCite username", - "system/publication/doi/doipassword": "Your DataCite password", - "system/publication/doi/doipassword-help": "All requests to the MDS API require authentication. For this reason, only traffic via a secure connection (HTTPS) is supported. The DataCite Metadata Store (MDS) uses HTTP Basic authentication. You can obtain an account <a href='https://support.datacite.org/docs/obtain-test-account'>here</a>.", - "system/publication/doi/doikey": "Your DataCite prefix", - "system/publication/doi/doikey-help": "Usually looks like 10.xxxx. You will be allowed to register DOI names only under the prefixes that have been assigned to you.", - "system/publication/doi/doilandingpagetemplate": "DOI landing page URL template", - "system/publication/doi/doilandingpagetemplate-help": "The URL to use to register the DOI. A good default for GeoNetwork is http://localhost:8080/geonetwork/srv/resources/records/\\{\\{uuid\\}\\}. The landing page URL MUST contains the UUID of the record.", "system/csw": "Catalog Service for the Web (CSW)", "system/csw/capabilityRecordUuid": "Record to use for GetCapabilities", "system/csw/capabilityRecordUuid-help": "Choose the record to be used to build custom GetCapabilities document. If none exist, create a service metadata record (using ISO19139 or 19115-3 standards). To have a capabilities document with the main information required, set title, abstract, point of contact, keywords, constraints. If you need INSPIRE support also set properly the record main language and additional languages, INSPIRE themes and INSPIRE conformity.", @@ -1512,6 +1496,33 @@ "fieldTooShort": "The value is too short", "fieldEmailNotValid": "A valid email address is required", "formConfirmExit": "The form has changes, if you exit the changes will be lost. Do you want to exit on the page?", + "manageDoiServers": "DOI servers", + "doiservers": "DOI servers", + "doiservers-description": "A Digital Object Identifier (DOI) is an alphanumeric string assigned to uniquely identify an object. It is tied to a metadata description of the object as well as to a digital location, such as a URL, where all the details about the object are accessible. More information available on <a href='https://www.datacite.org/dois.html'>DataCite website</a>.", + "newDoiServer": "New server", + "updateDoiServer": "Update server", + "doiserver-name": "Server name", + "doiserver-description": "Description", + "doiserver-url": "DataCite API endpoint", + "doiserver-url-help": "Usually https://mds.datacite.org or https://mds.test.datacite.org for testing.", + "doiserver-apiKey": "API Key", + "doiserver-landingPageTemplate": "Landing page URL template", + "doiserver-landingPageTemplate-help": "The URL to use to register the DOI. A good default for GeoNetwork is http://localhost:8080/geonetwork/srv/resources/records/\\{\\{uuid\\}\\}. The landing page URL MUST contains the UUID of the record.", + "doiserver-publicUrl": "Final DOI URL prefix", + "doiserver-publicUrl-help": "Keep it empty to use the default https://doi.org prefix. Use https://mds.test.datacite.org/doi when using the test API.", + "doiserver-username": "DataCite username", + "doiserver-password": "DataCite password", + "doiserver-password-help": "All requests to the MDS API require authentication. For this reason, only traffic via a secure connection (HTTPS) is supported. The DataCite Metadata Store (MDS) uses HTTP Basic authentication. You can obtain an account <a href='https://support.datacite.org/docs/obtain-test-account'>here</a>.", + "doiserver-pattern": "DOI pattern", + "doiserver-pattern-help": "Default is '\\{\\{uuid\\}\\}' but the DOI structure can be customized with database id and/or record group eg. 'example-\\{\\{groupOwner\\}\\}-\\{\\{id\\}\\}'", + "doiserver-prefix": "DataCite prefix", + "doiserver-prefix-help": "Usually looks like 10.xxxx. You will be allowed to register DOI names only under the prefixes that have been assigned to you.", + "doiserver-publicationGroups": "Publication groups", + "doiserver-publicationGroups-help": "Select the groups which metadata should be published to the DOI server. If no groups are selected, the server will be provided to publish the metadata that has no other DOI servers related to the metadata owner group.", + "doiserver-defaultApiText": "DataCite API", + "doiserver-testApiText": "DataCite API test", + "doiserver-euApiText": "Publication Office of the European Union", + "confirmDoiServerDelete": "Are you sure you want to delete this DOI server?", "NoTranslationProvider": "No translation provider", "LibreTranslate": "Libretranslate" } diff --git a/web-ui/src/main/resources/catalog/style/gn_admin.less b/web-ui/src/main/resources/catalog/style/gn_admin.less index bdb3df8caeb..df08bc00014 100644 --- a/web-ui/src/main/resources/catalog/style/gn_admin.less +++ b/web-ui/src/main/resources/catalog/style/gn_admin.less @@ -219,7 +219,8 @@ ul.pager { #gn-mapservers-container, #gn-sources-container, #gn-metadatatemplates-container, -#gn-static-pages-container { +#gn-static-pages-container, +#gn-doiservers-container { // Fixes gn-modal windows; TODO: fix this globally in gn-popup style [gn-modal] { max-width: none; diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/doiservers.html b/web-ui/src/main/resources/catalog/templates/admin/settings/doiservers.html new file mode 100644 index 00000000000..dfb2ca9ba0c --- /dev/null +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/doiservers.html @@ -0,0 +1,488 @@ +<div class="row" data-ng-controller="GnDoiServerController" id="gn-doiservers-container"> + <div class="col-lg-4"> + <div class="panel panel-default"> + <div class="panel-heading" data-translate="">doiservers</div> + <div class="panel-body"> + <input + class="form-control" + data-ng-model="doiServersSearch.$" + autofocus="" + placeholder="{{'filter' | translate}}" + /> + <input type="hidden" data-ng-model="doiServerSelected.id" /> + + <div class="list-group"> + <a + href="" + class="list-group-item" + data-ng-repeat="v in doiServers | filter:doiServersSearch | orderBy:'name'" + data-ng-click="selectDoiServer(v)" + title="{{v.description}}" + > + {{v.name}} + </a> + </div> + + <button + type="button" + class="btn btn-primary btn-block" + data-ng-click="addDoiServer()" + > + <i class="fa fa-plus"></i> + <span data-translate="">newDoiServer</span> + </button> + </div> + </div> + + <div data-gn-need-help="doi-server-configuration"></div> + </div> + + <div class="col-lg-8" data-ng-hide="doiServerSelected == null"> + <div class="panel panel-default"> + <div class="panel-heading"> + <span data-ng-hide="doiServerSelected.id == ''" data-translate="" + >updateDoiServer</span + > + <span data-ng-hide="doiServerSelected.id != ''" data-translate="" + >newDoiServer</span + > + <strong>{{doiServerSelected.name}}</strong> + <div class="btn-toolbar pull-right"> + <button + data-ng-hide="doiServerSelected.id == ''" + type="button" + class="btn btn-default" + data-ng-click="resetDoiServerPassword(doiServerSelected.id)" + > + <i class="fa fa-lock"></i>  + <span data-translate="">resetPassword</span> + </button> + <button + type="button" + class="btn btn-primary" + data-ng-disabled="!gnDoiServerEdit.$valid || !gnDoiServerEdit.$dirty" + data-ng-click="saveDoiServer('#gn-doiserver-edit')" + > + <i class="fa fa-save"></i>  + <span data-translate="">save</span> + </button> + <button + type="button" + class="btn btn-primary btn-danger" + data-ng-hide="doiServerSelected.id == ''" + data-ng-click="deleteDoiServerConfig()" + > + <i class="fa fa-times"></i>  + <span data-translate="">delete</span> + </button> + </div> + </div> + <div class="panel-body"> + <form + id="gn-doiserver-edit" + name="gnDoiServerEdit" + class="form-horizontal" + data-ng-keypress="updatingDoiServer()" + data-confirm-message="{{ 'formConfirmExit' | translate}}" + data-confirm-on-exit="" + novalidate="" + > + <input type="hidden" name="_csrf" value="{{csrf}}" /> + <input + type="hidden" + name="id" + data-ng-model="doiServerSelected.id" + value="{{doiServerSelected.id}}" + /> + + <div + class="form-group" + data-ng-class="gnDoiServerEdit.name.$error.required || + (gnDoiServerEdit.name.$touched && gnDoiServerEdit.name.$invalid) ? 'has-error' : ''" + > + <label class="control-label col-sm-3" data-translate="" for="name" + >doiserver-name</label + > + + <div class="col-sm-9"> + <input + type="text" + id="name" + name="name" + class="form-control" + required="" + data-ng-model="doiServerSelected.name" + /> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.name.$error" + data-ng-if="gnDoiServerEdit.name.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-3" data-translate="" + >doiserver-description</label + > + + <div class="col-sm-9"> + <textarea + name="description" + class="form-control" + data-ng-model="doiServerSelected.description" + ></textarea> + </div> + </div> + + <div + class="form-group" + data-ng-class="gnDoiServerEdit.url.$error.required || + (gnDoiServerEdit.url.$touched && gnDoiServerEdit.url.$invalid) ? 'has-error' : ''" + > + <label class="control-label col-sm-3" data-translate="" for="url" + >doiserver-url</label + > + + <div class="col-sm-9"> + <div class="input-group"> + <input + type="url" + name="url" + id="url" + class="form-control" + required="" + data-ng-model="doiServerSelected.url" + placeholder="http://" + /> + <div class="input-group-btn"> + <button + type="button" + class="btn btn-default dropdown-toggle" + data-toggle="dropdown" + aria-haspopup="true" + aria-expanded="false" + > + <i class="fa fa-fw fa-th-list"></i> + <span class="caret"></span> + </button> + <ul class="dropdown-menu dropdown-menu-right"> + <li> + <a + data-ng-click="updateDoiServerUrl('https://mds.datacite.org', '')" + title="{{'doiserver-defaultApiText' | translate}}" + data-translate="" + >doiserver-defaultApiText</a + > + </li> + <li> + <a + data-ng-click="updateDoiServerUrl('https://mds.test.datacite.org', 'https://mds.test.datacite.org/doi')" + title="{{'doiserver-testApiText' | translate}}" + data-translate="" + >doiserver-testApiText</a + > + </li> + <li> + <a + data-ng-click="updateDoiServerUrl('https://ra.publications.europa.eu/servlet/ws/doidata?api=medra.org', '')" + title="{{'doiserver-euApiText' | translate}}" + data-translate="" + >doiserver-euApiText</a + > + </li> + </ul> + </div> + </div> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.url.$error" + data-ng-if="gnDoiServerEdit.url.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate="">doiserver-url-help</p> + </div> + </div> + + <div + class="form-group" + data-ng-class="gnDoiServerEdit.username.$error.required || + (gnDoiServerEdit.username.$touched && gnDoiServerEdit.username.$invalid) ? 'has-error' : ''" + > + <label class="control-label col-sm-3" data-translate="" for="username" + >doiserver-username</label + > + + <div class="col-sm-9"> + <input + type="text" + class="form-control" + required="" + id="username" + name="username" + data-ng-model="doiServerSelected.username" + /> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.username.$error" + data-ng-if="gnDoiServerEdit.username.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + </div> + + <div data-ng-show="!isUpdate"> + <div + class="form-group" + data-ng-class="gnDoiServerEdit.password.$error.required || + (gnDoiServerEdit.password.$touched && gnDoiServerEdit.password.$invalid) ? 'has-error' : ''" + > + <label class="control-label col-sm-3" data-translate="" for="password" + >doiserver-password</label + > + + <div class="col-sm-9"> + <input + type="password" + class="form-control" + id="password" + name="password" + required="required" + autocomplete="new-password" + data-ng-model="doiServerSelected.password" + /> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.password.$error" + data-ng-if="gnDoiServerEdit.password.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate="">doiserver-password-help</p> + </div> + </div> + </div> + + <div + class="form-group" + data-ng-class="gnDoiServerEdit.landingPageTemplate.$error.required || + (gnDoiServerEdit.landingPageTemplate.$touched && gnDoiServerEdit.landingPageTemplate.$invalid) ? 'has-error' : ''" + > + <label + class="control-label col-sm-3" + data-translate="" + for="landingPageTemplate" + >doiserver-landingPageTemplate</label + > + + <div class="col-sm-9"> + <input + type="text" + id="landingPageTemplate" + name="landingPageTemplate" + class="form-control" + required="" + data-ng-model="doiServerSelected.landingPageTemplate" + placeholder="" + /> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.landingPageTemplate.$error" + data-ng-if="gnDoiServerEdit.landingPageTemplate.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate=""> + doiserver-landingPageTemplate-help + </p> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-3" data-translate="" for="publicUrl" + >doiserver-publicUrl</label + > + + <div class="col-sm-9"> + <input + type="text" + id="publicUrl" + class="form-control" + data-ng-model="doiServerSelected.publicUrl" + placeholder="" + /> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate="">doiserver-publicUrl-help</p> + </div> + </div> + + <div + class="form-group" + data-ng-class="gnDoiServerEdit.pattern.$error.required || + (gnDoiServerEdit.pattern.$touched && gnDoiServerEdit.pattern.$invalid) ? 'has-error' : ''" + > + <label class="control-label col-sm-3" data-translate="" for="pattern" + >doiserver-pattern</label + > + + <div class="col-sm-9"> + <input + type="text" + id="pattern" + name="pattern" + class="form-control" + required="" + data-ng-model="doiServerSelected.pattern" + placeholder="" + /> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.pattern.$error" + data-ng-if="gnDoiServerEdit.pattern.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate="">doiserver-pattern-help</p> + </div> + </div> + + <div + class="form-group" + data-ng-class="gnDoiServerEdit.prefix.$error.required || + (gnDoiServerEdit.prefix.$touched && gnDoiServerEdit.pattern.$invalid) ? 'has-error' : ''" + > + <label class="control-label col-sm-3" data-translate="" for="prefix" + >doiserver-prefix</label + > + + <div class="col-sm-9"> + <input + type="text" + id="prefix" + name="prefix" + class="form-control" + required="" + data-ng-model="doiServerSelected.prefix" + placeholder="" + /> + + <div + class="help-block" + data-ng-messages="gnDoiServerEdit.prefix.$error" + data-ng-if="gnDoiServerEdit.prefix.$touched" + > + <p data-ng-message="required" data-translate="">fieldRequired</p> + </div> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate="">doiserver-prefix-help</p> + </div> + </div> + + <div class="form-group"> + <label class="control-label col-sm-3" data-translate="" + >doiserver-publicationGroups</label + > + <div class="col-sm-9"> + <div + data-gn-multiselect="selectedPublicationGroups" + data-choices="groupsForPublication" + ></div> + </div> + + <div class="col-sm-9 col-sm-offset-3"> + <p class="help-block" data-translate="">doiserver-publicationGroups-help</p> + </div> + </div> + </form> + </div> + </div> + </div> + + <div + class="modal fade" + id="passwordResetModal" + tabindex="-1" + role="dialog" + aria-labelledby="{{'passwordReset' | translate}}" + aria-hidden="true" + > + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"> + × + </button> + <h4 + class="modal-title" + data-translate="" + data-translate-values="{ user: '{{doiServerSelected.name}}'}" + > + resetPasswordTitle + </h4> + </div> + <div class="modal-body"> + <form id="gn-password-reset" class="form-horizontal" name="gnPasswordReset"> + <div class="form-group"> + <input type="hidden" name="_csrf" value="{{csrf}}" /> + <label class="control-label col-sm-3" data-translate="">password</label> + + <div class="col-sm-9"> + <input + type="password" + class="form-control" + required="required" + autocomplete="off" + data-ng-model="resetPassword" + /> + </div> + </div> + </form> + </div> + <div class="modal-footer"> + <button type="button" class="btn" data-dismiss="modal"> + <i class="fa fa-ban-circle"></i>  <span data-translate="">cancel</span> + </button> + <button type="button" class="btn btn-primary" data-ng-click="saveNewPassword()"> + <i class="fa fa-lock"></i>  + <span data-translate="">resetPassword</span> + </button> + </div> + </div> + </div> + </div> + + <div + gn-modal + class="gn-confirm-delete" + gn-popup-options="{title: 'confirmDialogTitle', confirmCallback: confirmDeleteDoiServerConfig}" + id="gn-confirm-remove-doiserver" + > + <p translate>confirmDoiServerDelete</p> + </div> +</div> diff --git a/web-ui/src/main/resources/catalog/views/default/directives/directive.js b/web-ui/src/main/resources/catalog/views/default/directives/directive.js index 3cb6d257501..91dcba20883 100644 --- a/web-ui/src/main/resources/catalog/views/default/directives/directive.js +++ b/web-ui/src/main/resources/catalog/views/default/directives/directive.js @@ -98,6 +98,7 @@ module.directive("gnMdActionsMenu", [ "gnMetadataActions", "$http", + "$q", "gnConfig", "gnConfigService", "gnGlobalSettings", @@ -105,6 +106,7 @@ function ( gnMetadataActions, $http, + $q, gnConfig, gnConfigService, gnGlobalSettings, @@ -122,6 +124,8 @@ scope.tasks = []; scope.hasVisibletasks = false; + scope.doiServers = []; + gnConfigService.load().then(function (c) { scope.isMdWorkflowEnable = gnConfig["metadata.workflow.enable"]; @@ -224,7 +228,7 @@ scope.taskConfiguration = { doiCreationTask: { isVisible: function (md) { - return gnConfig["system.publication.doi.doienabled"]; + return scope.doiServers.length > 0; }, isApplicable: function (md) { // TODO: Would be good to return why a task is not applicable as tooltip @@ -265,6 +269,14 @@ scope.$watch(attrs.gnMdActionsMenu, function (a) { scope.md = a; + + if (scope.md) { + $http + .get("../api/doiservers/metadata/" + scope.md.id) + .then(function (response) { + scope.doiServers = response.data; + }); + } }); scope.getScope = function () { diff --git a/web/src/main/webResources/WEB-INF/config-db/database_migration.xml b/web/src/main/webResources/WEB-INF/config-db/database_migration.xml index 0352f3a4983..38de48bb7c0 100644 --- a/web/src/main/webResources/WEB-INF/config-db/database_migration.xml +++ b/web/src/main/webResources/WEB-INF/config-db/database_migration.xml @@ -391,6 +391,7 @@ </entry> <entry key="4.4.5"> <list> + <value>java:v445.DoiServerDatabaseMigration</value> <value>WEB-INF/classes/setup/sql/migrate/v445/migrate-</value> </list> </entry> diff --git a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties index 10b43f9b225..6d945f9df7f 100644 --- a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties +++ b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties @@ -218,8 +218,10 @@ exception.doi.serverErrorDelete=Error deleting DOI exception.doi.serverErrorDelete.description=Error deleting DOI: {0} exception.doi.serverErrorUnregister=Error unregistering DOI exception.doi.serverErrorUnregister.description=Error unregistering DOI: {0} -exception.doi.configurationMissing=DOI configuration is not complete -exception.doi.configurationMissing.description=DOI configuration is not complete. Check System Configuration and set the DOI configuration. +exception.doi.serverCanNotHandleRecord=DOI server can not handle the metadata +exception.doi.serverCanNotHandleRecord.description=DOI server ''{0}'' can not handle the metadata with UUID ''{1}'' +exception.doi.configurationMissing=DOI server configuration is not complete +exception.doi.configurationMissing.description=DOI server configuration is not complete. Check the DOI server configuration to complete it exception.doi.notSupportedOperationError=Operation not supported exception.doi.notSupportedOperationError.description={0} api.metadata.import.importedWithId=Metadata imported with ID '%s' diff --git a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties index d78c5cb26ec..bcbb4d011b4 100644 --- a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties +++ b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties @@ -202,15 +202,19 @@ exception.doi.recordNotConformantMissingMandatory=La fiche n''est pas conforme a exception.doi.recordNotConformantMissingMandatory.description=La fiche ''{0}'' n''est pas conforme aux r\u00E8gles de validation DataCite pour les champs obligatoires. L''erreur est: {1}. Les champs obligatoires dans DataCite sont : identifiant, cr\u00E9ateurs, titres, \u00E9diteur, publicationYear, resourceType. <a href=''{2}api/records/{3}/formatters/datacite?output=xml''>V\u00E9rifiez la sortie au format DataCite</a> et adaptez le contenu de la fiche pour ajouter les informations manquantes. exception.doi.recordInvalid=Le fiche converti n''est pas conforme au format DataCite exception.doi.recordInvalid.description=Le fiche ''{0}'' converti n''est pas conforme au format DataCite. L''erreur est: {1}. Les champs obligatoires dans DataCite sont : identifiant, cr\u00E9ateurs, titres, \u00E9diteur, ann\u00E9e de publication, type de ressource. <a href=''{2}api/records/{3}/formatters/datacite?output=xml''>V\u00E9rifier la sortie au format DataCite</a> et adapter le contenu de la fiche pour ajouter les informations manquantes. -exception.doi.serverErrorCreate=Error creating DOI -exception.doi.serverErrorCreate.description=Error creating DOI: {0} -exception.doi.serverErrorRetrieve=Error retrieving DOI -exception.doi.serverErrorRetrieve.description=Error retrieving DOI: {0} -exception.doi.serverErrorDelete=Error deleting DOI -exception.doi.serverErrorDelete.description=Error deleting DOI: {0} -exception.doi.serverErrorUnregister=Error unregistering DOI -exception.doi.serverErrorUnregister.description=Error unregistering DOI: {0} -exception.doi.notSupportedOperationError=Operation not supported +exception.doi.serverErrorCreate=Erreur lors de la cr\u00E9ation du DOI +exception.doi.serverErrorCreate.description=Erreur lors de la cr\u00E9ation du DOI : {0} +exception.doi.serverErrorRetrieve=Erreur lors de la r\u00E9cup\u00E9ration du DOI +exception.doi.serverErrorRetrieve.description=Erreur lors de la r\u00E9cup\u00E9ration du DOI : {0} +exception.doi.serverErrorDelete=Erreur lors de la suppression du DOI +exception.doi.serverErrorDelete.description=Erreur lors de la suppression du DOI : {0} +exception.doi.serverErrorUnregister=Erreur lors de la d\u00E9sinscription du DOI +exception.doi.serverErrorUnregister.description=Erreur lors de la d\u00E9sinscription du DOI {0} +exception.doi.serverCanNotHandleRecord=DOI server can not handle the metadata +exception.doi.serverCanNotHandleRecord.description=DOI server ''{0}'' can not handle the metadata with UUID ''{1}'' +exception.doi.configurationMissing=DOI server configuration is not complete +exception.doi.configurationMissing.description=DOI server configuration is not complete. Check the DOI server configuration to complete it +exception.doi.notSupportedOperationError=Op\u00E9ration non prise en charge exception.doi.notSupportedOperationError.description={0} api.metadata.import.importedWithId=Fiche import\u00E9e avec l'ID '%s' api.metadata.import.importedWithUuid=Fiche import\u00E9e avec l'UUID '%s' diff --git a/web/src/main/webapp/WEB-INF/classes/setup/sql/data/data-db-default.sql b/web/src/main/webapp/WEB-INF/classes/setup/sql/data/data-db-default.sql index 1545d0e57e4..487e6a8e384 100644 --- a/web/src/main/webapp/WEB-INF/classes/setup/sql/data/data-db-default.sql +++ b/web/src/main/webapp/WEB-INF/classes/setup/sql/data/data-db-default.sql @@ -735,13 +735,6 @@ INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/userSelfRegistration/domainsAllowed', '', 0, 1911, 'y'); INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doienabled', 'false', 2, 100191, 'n'); -INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doiurl', '', 0, 100192, 'n'); -INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doiusername', '', 0, 100193, 'n'); -INSERT INTO Settings (name, value, datatype, position, internal, encrypted) VALUES ('system/publication/doi/doipassword', '', 0, 100194, 'y', 'y'); -INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doikey', '', 0, 110095, 'n'); -INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doilandingpagetemplate', 'http://localhost:8080/geonetwork/srv/resources/records/{{uuid}}', 0, 100195, 'n'); -INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doipublicurl', '', 0, 100196, 'n'); -INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/publication/doi/doipattern', '{{uuid}}', 0, 100197, 'n'); INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/security/passwordEnforcement/minLength', '6', 1, 12000, 'n'); INSERT INTO Settings (name, value, datatype, position, internal) VALUES ('system/security/passwordEnforcement/maxLength', '20', 1, 12001, 'n'); diff --git a/web/src/main/webapp/WEB-INF/classes/setup/sql/migrate/v445/DoiServerDatabaseMigration.java b/web/src/main/webapp/WEB-INF/classes/setup/sql/migrate/v445/DoiServerDatabaseMigration.java new file mode 100644 index 00000000000..b2a80efedc4 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/classes/setup/sql/migrate/v445/DoiServerDatabaseMigration.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package v445; + +import org.fao.geonet.DatabaseMigrationTask; +import org.fao.geonet.constants.Geonet; +import org.fao.geonet.migration.DatabaseMigrationException; +import org.fao.geonet.utils.Log; +import org.springframework.util.StringUtils; + + +import java.sql.*; + +public class DoiServerDatabaseMigration extends DatabaseMigrationTask { + @Override + public void update(Connection connection) throws SQLException, DatabaseMigrationException { + Log.debug(Geonet.DB, "DoiServerDatabaseMigration"); + + boolean doiEnabled = false; + String doiUrl = ""; + String doiUsername = ""; + String doiPassword = ""; + String doiKey = ""; + String doiLandingPageTemplate = ""; + String doiPublicUrl = ""; + String doiPattern = ""; + + try (Statement statement = connection.createStatement()) { + final String selectDoiSerttingsSQL = "SELECT name, value FROM Settings WHERE name LIKE 'system/publication/doi%'"; + + String columnForName = "name"; + String columnForValue = "value"; + + final ResultSet resultSet = statement.executeQuery(selectDoiSerttingsSQL); + while (resultSet.next()) { + if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doienabled")) { + doiEnabled = resultSet.getString(columnForValue).equalsIgnoreCase("true"); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doiurl")) { + doiUrl = resultSet.getString(columnForValue); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doiusername")) { + doiUsername = resultSet.getString(columnForValue); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doipassword")) { + doiPassword = resultSet.getString(columnForValue); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doikey")) { + doiKey = resultSet.getString(columnForValue); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doilandingpagetemplate")) { + doiLandingPageTemplate = resultSet.getString(columnForValue); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doipublicurl")) { + doiPublicUrl = resultSet.getString(columnForValue); + } else if (resultSet.getString(columnForName).equalsIgnoreCase("system/publication/doi/doipattern")) { + doiPattern = resultSet.getString(columnForValue); + } + + } + } + + if (doiEnabled) { + + // Check the information is filled + boolean createDoiServer = StringUtils.hasLength(doiUrl) && + StringUtils.hasLength(doiUsername) && + StringUtils.hasLength(doiPassword) && + StringUtils.hasLength(doiKey) && + StringUtils.hasLength(doiPattern); + + if (createDoiServer) { + try (PreparedStatement update = connection.prepareStatement( + "INSERT INTO doiservers " + + "(id, isdefault, landingpagetemplate, name, url, username, password, pattern, prefix, publicurl) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") + ) { + + update.setInt(1, 1); + update.setString(2, "y"); + update.setString(3, doiLandingPageTemplate); + update.setString(4, "Default DOI server"); + update.setString(5, doiUrl); + update.setString(6, doiUsername); + update.setString(7, doiPassword); + update.setString(8, doiPattern); + update.setString(9, doiKey); + update.setString(10, doiPublicUrl); + + update.execute(); + + } catch (java.sql.BatchUpdateException e) { + connection.rollback(); + Log.error(Geonet.GEONETWORK, "Error occurred while creating the DOI server:" + e.getMessage(), e); + SQLException next = e.getNextException(); + while (next != null) { + Log.error(Geonet.GEONETWORK, "Next error: " + next.getMessage(), next); + next = e.getNextException(); + } + + throw new RuntimeException(e); + } catch (Exception e) { + connection.rollback(); + + throw new Error(e); + } + + + try (PreparedStatement delete = connection.prepareStatement( + "DELETE FROM Settings WHERE name LIKE 'system/publication/doi%' and name != 'system/publication/doi/doienabled'") + ) { + delete.execute(); + } catch (java.sql.BatchUpdateException e) { + connection.rollback(); + Log.error(Geonet.GEONETWORK, "Error occurred while creating the DOI server:" + e.getMessage(), e); + SQLException next = e.getNextException(); + while (next != null) { + Log.error(Geonet.GEONETWORK, "Next error: " + next.getMessage(), next); + next = e.getNextException(); + } + + throw new RuntimeException(e); + } catch (Exception e) { + connection.rollback(); + + throw new Error(e); + } + + connection.commit(); + + Log.info(Geonet.DB, "Migration: migrated DOI server"); + } + } + } +} From e030fce5ecfd1ec8dc562964858b84097034f792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Mon, 7 Oct 2024 12:24:04 +0200 Subject: [PATCH 63/97] Don't capitalize the labels for the facet filter values (#8133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't capitalize the labels for the facet filter values * Record view / Do not capitalize keywords (#104) Display the label as defined in the vocabulary. Some are lower case (eg. GEMET), some capitalized (eg. INSPIRE themes) and some others are case sensitive (eg. Unit of measures). --------- Co-authored-by: François Prunayre <fx.prunayre@gmail.com> --- .../components/elasticsearch/directives/partials/facet.html | 2 +- .../components/search/mdview/partials/keywordBadges.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet.html b/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet.html index fc81d1c4878..51963f2f847 100644 --- a/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet.html +++ b/web-ui/src/main/resources/catalog/components/elasticsearch/directives/partials/facet.html @@ -33,7 +33,7 @@ ></span> <span class="gn-facet-label flex-shrink text-ellipsis"> {{::ctrl.item.value | facetTranslator: (ctrl.facet.meta && ctrl.facet.meta.field) - || ctrl.facet.key | capitalize}} + || ctrl.facet.key}} </span> <span ng-if="ctrl.item.count" diff --git a/web-ui/src/main/resources/catalog/components/search/mdview/partials/keywordBadges.html b/web-ui/src/main/resources/catalog/components/search/mdview/partials/keywordBadges.html index cf41dc05e76..f27b4b445bf 100644 --- a/web-ui/src/main/resources/catalog/components/search/mdview/partials/keywordBadges.html +++ b/web-ui/src/main/resources/catalog/components/search/mdview/partials/keywordBadges.html @@ -17,7 +17,7 @@ class="pull-left" > <button gn-popover-anchor="" class="btn btn-default btn-xs"> - {{::k.default | capitalize}} + {{::k.default}} </button> <div gn-popover-content=""> <a data-ng-href="{{::k.link}}" data-ng-if="::!!k.link"> From bb9c8613015b20f42454ebf63eb4bb3195fce0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Tue, 8 Oct 2024 07:48:59 +0200 Subject: [PATCH 64/97] Metadata editor / validation report improvements (#8395) * Metadata editor / validation report improvements: - Update buttons to display success and errors to use text instead of an icon. - Add style to display the display buttons greyed when the related rules are not displayed. - Show separate messages for success and errors. - If not success or errors reported don't show the expander to show the results in the validation rules. - Group the success and error messages. * Metadata editor / validation report improvements: - Fix the display of the expander. - Improve the a bit the layout of the error / success messages. - Improve the tooltips for the buttons to hide / show the messages. --- .../partials/validationreport.html | 108 ++++++++++++++++-- .../resources/catalog/locales/en-editor.json | 4 +- .../resources/catalog/style/gn_editor.less | 6 + 3 files changed, 106 insertions(+), 12 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/validationreport/partials/validationreport.html b/web-ui/src/main/resources/catalog/components/edit/validationreport/partials/validationreport.html index cd08f145494..5b144314137 100644 --- a/web-ui/src/main/resources/catalog/components/edit/validationreport/partials/validationreport.html +++ b/web-ui/src/main/resources/catalog/components/edit/validationreport/partials/validationreport.html @@ -23,26 +23,30 @@ <button type="button" class="btn btn-default btn-xs" - data-ng-class="showSuccess ? 'active' : ''" + data-ng-class="showSuccess ? 'active' : 'inactive'" data-ng-click="toggleShowSuccess();$event.stopPropagation();" data-ng-show="hasSuccess" data-toggle="tooltip" data-placement="top" - title="{{'showHideSuccess' | translate}}" + data-ng-attr-title="{{showSuccess ? ('hideSuccess' | translate): ('showSuccess' | translate)}}" > - <span class="fa fa-thumbs-up text-success" aria-hidden="true"></span> + <span class="text-success" aria-hidden="true" + >{{'validationSuccessLabel' | translate}}</span + > </button> <button type="button" class="btn btn-default btn-xs" - data-ng-class="showErrors ? 'active' : ''" + data-ng-class="showErrors ? 'active' : 'inactive'" data-ng-click="toggleShowErrors();$event.stopPropagation();" data-ng-show="hasErrors" data-toggle="tooltip" data-placement="top" - title="{{'showHideErrors' | translate}}" + data-ng-attr-title="{{showErrors ? ('hideErrors' | translate): ('showErrors' | translate)}}" > - <span class="fa fa-thumbs-down text-danger" aria-hidden="true"></span> + <span class="text-danger" aria-hidden="true" + >{{'validationErrorLabel' | translate}}</span + > </button> </div> </div> @@ -54,7 +58,67 @@ data-ng-repeat="type in ruleTypes" data-ng-class="'schematron-result-list-' + labelImportanceClass(type)" > + <!-- No success or failed validation rules to display --> + <div + data-ng-if="(type.error == 0 || type.error === '?') && (type.success == 0 || type.success === '?')" + class="panel-heading clearfix" + > + <div class="col-md-9"> + <h2 class="gn-schematron-title"> + <span data-ng-if="type.schematronVerificationError"> + <i class="fa fa-exclamation-triangle fa-fw text-danger"></i> </span + >{{(type.label || type.id) | translate}} + </h2> + </div> + + <div + class="col-md-3 gn-nopadding-right" + data-ng-if="!type.schematronVerificationError" + > + <span + class="label pull-right col-md-12" + data-ng-class="labelImportanceClass(type)" + data-ng-if="type.total === '?'" + > + <ng-pluralize + count="type.error" + when="{'0': '0 ' + ('error' | translate), + '1': '1 ' + ('error' | translate), + 'other': '{} ' + ('errors' | translate)}" + > + </ng-pluralize> + </span> + <span + class="label pull-right label-success gn-margin-bottom-sm col-md-12" + data-ng-if="type.total !== '?' && type.success !== '?'" + > + <ng-pluralize + count="type.success" + when="{'0': '0 ' + ('success' | translate), + '1': '1 ' + ('success' | translate), + 'other': '{} ' + ('successes' | translate)}" + > + </ng-pluralize> + </span> + <span + class="label pull-right gn-margin-bottom-sm col-md-12" + data-ng-class="labelImportanceClass(type)" + data-ng-if="type.total !== '?' && type.error !== '?'" + > + <ng-pluralize + count="type.error" + when="{'0': '0 ' + ('error' | translate), + '1': '1 ' + ('error' | translate), + 'other': '{} ' + ('errors' | translate)}" + > + </ng-pluralize> + </span> + </div> + </div> + + <!-- Success or failed validation rules to display --> <div + data-ng-if="(type.error != 0 && type.error !== '?') || (type.success != 0 && type.success !== '?')" data-gn-slide-toggle="{{initialSectionsClosed}}" class="panel-heading clearfix" > @@ -70,7 +134,7 @@ <h2 class="gn-schematron-title"> data-ng-if="!type.schematronVerificationError" > <span - class="label pull-right" + class="label pull-right col-md-12" data-ng-class="labelImportanceClass(type)" data-ng-if="type.total === '?'" > @@ -83,11 +147,30 @@ <h2 class="gn-schematron-title"> </ng-pluralize> </span> <span - class="label pull-right" + class="label pull-right label-success gn-margin-bottom-sm col-md-12" + data-ng-if="type.total !== '?' && type.success !== '?'" + > + <ng-pluralize + count="type.success" + when="{'0': '0 ' + ('success' | translate), + '1': '1 ' + ('success' | translate), + 'other': '{} ' + ('successes' | translate)}" + > + </ng-pluralize> + </span> + <span + class="label pull-right gn-margin-bottom-sm col-md-12" data-ng-class="labelImportanceClass(type)" - data-ng-if="type.total !== '?'" - >{{type.success}} / {{type.total}}</span + data-ng-if="type.total !== '?' && type.error !== '?'" > + <ng-pluralize + count="type.error" + when="{'0': '0 ' + ('error' | translate), + '1': '1 ' + ('error' | translate), + 'other': '{} ' + ('errors' | translate)}" + > + </ng-pluralize> + </span> </div> <div class="col-md-3 gn-nopadding-right" @@ -107,7 +190,10 @@ <h2 class="gn-schematron-title"> </ul> </div> <div class="panel-body" data-ng-if="!type.schematronVerificationError"> - <ul class="list-group" data-ng-repeat="pattern in type.patterns.pattern"> + <ul + class="list-group" + data-ng-repeat="pattern in type.patterns.pattern | orderBy: 'type'" + > <li class="list-group-item" data-ng-repeat="rule in pattern.rules.rule" diff --git a/web-ui/src/main/resources/catalog/locales/en-editor.json b/web-ui/src/main/resources/catalog/locales/en-editor.json index dd6dc4a1fd8..a9eb126f92f 100644 --- a/web-ui/src/main/resources/catalog/locales/en-editor.json +++ b/web-ui/src/main/resources/catalog/locales/en-editor.json @@ -454,5 +454,7 @@ "associated-fcats": "Feature catalog", "associated-siblings": "Associated resources", "associated-hasfeaturecats": "Using this feature catalog", - "associatedResourcesPanel": "Associated resources" + "associatedResourcesPanel": "Associated resources", + "validationSuccessLabel": "success", + "validationErrorLabel": "errors" } diff --git a/web-ui/src/main/resources/catalog/style/gn_editor.less b/web-ui/src/main/resources/catalog/style/gn_editor.less index 64920135207..b32bd5b872b 100644 --- a/web-ui/src/main/resources/catalog/style/gn_editor.less +++ b/web-ui/src/main/resources/catalog/style/gn_editor.less @@ -1024,3 +1024,9 @@ gn-bounding-polygon { border-radius: 50% !important; } } + +#gn-editor-validation-panel { + button.inactive { + opacity: 0.65; + } +} From d4d2a312f0627f4213efc74363f4648d9eafab0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Gabri=C3=ABl?= <michel.gabriel@geocat.net> Date: Tue, 8 Oct 2024 10:21:17 +0200 Subject: [PATCH 65/97] Fix the width of the projection switcher (#8399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix the width of the projection switcher The map projection switcher on the map is too small. This change fixes it. The change can be seen by adding a second projection for the map in the admin * Update web-ui/src/main/resources/catalog/views/default/less/gn_map_default.less Co-authored-by: Jose García <josegar74@gmail.com> --------- Co-authored-by: Jose García <josegar74@gmail.com> --- .../resources/catalog/views/default/less/gn_map_default.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/views/default/less/gn_map_default.less b/web-ui/src/main/resources/catalog/views/default/less/gn_map_default.less index 3fff351c769..0b44f6fcd49 100644 --- a/web-ui/src/main/resources/catalog/views/default/less/gn_map_default.less +++ b/web-ui/src/main/resources/catalog/views/default/less/gn_map_default.less @@ -97,7 +97,7 @@ margin: 0; padding: 0; position: absolute; - width: 16.5em; + width: 24.5em; // value = maptools panel width - label width - panel tools opener button width (34em - 7em - 2.5em) border-radius: 0; li { width: calc(~"100% -30px"); From 51c0b01ae3720595e9b71db11442bc79cfbe4eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 3 Oct 2024 12:04:16 +0200 Subject: [PATCH 66/97] Metadata editor / Add required indicator support to the keyword selector directive and fix its display for the field duration directive --- .../components/edit/fieldduration/partials/fieldduration.html | 2 +- .../catalog/components/thesaurus/ThesaurusDirective.js | 3 ++- .../catalog/components/thesaurus/partials/keywordselector.html | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/fieldduration/partials/fieldduration.html b/web-ui/src/main/resources/catalog/components/edit/fieldduration/partials/fieldduration.html index e7d5985610e..de4e89fce8a 100644 --- a/web-ui/src/main/resources/catalog/components/edit/fieldduration/partials/fieldduration.html +++ b/web-ui/src/main/resources/catalog/components/edit/fieldduration/partials/fieldduration.html @@ -1,4 +1,4 @@ -<span data-ng-class="required ? 'gn-required' : ''"> +<span data-ng-class="required == 'true' ? 'gn-required' : ''"> <div class="" data-ng-show="isDisabled"> <span data-ng-show="sign">- </span> <span data-ng-show="years != 0">{{years}} {{'year(s)' | translate}} </span> diff --git a/web-ui/src/main/resources/catalog/components/thesaurus/ThesaurusDirective.js b/web-ui/src/main/resources/catalog/components/thesaurus/ThesaurusDirective.js index 203b3b546ed..14567e0696a 100644 --- a/web-ui/src/main/resources/catalog/components/thesaurus/ThesaurusDirective.js +++ b/web-ui/src/main/resources/catalog/components/thesaurus/ThesaurusDirective.js @@ -256,7 +256,8 @@ // on keyword. maxTags: "@", thesaurusTitle: "@", - browsable: "@" + browsable: "@", + required: "@" }, templateUrl: "../../catalog/components/thesaurus/" + "partials/keywordselector.html", diff --git a/web-ui/src/main/resources/catalog/components/thesaurus/partials/keywordselector.html b/web-ui/src/main/resources/catalog/components/thesaurus/partials/keywordselector.html index 4144fa182c0..ab309a23859 100644 --- a/web-ui/src/main/resources/catalog/components/thesaurus/partials/keywordselector.html +++ b/web-ui/src/main/resources/catalog/components/thesaurus/partials/keywordselector.html @@ -17,7 +17,7 @@ </div> <span data-ng-show="!invalidKeywordMatch"> - <div class="row"> + <div class="row" data-ng-class="required == 'true' ? 'gn-required' : ''"> <label class="col-sm-2 control-label"> {{thesaurusTitle}} </label> <div class="col-sm-9" From f65ae30906235eeedaaa28114102e8a437a35cdd Mon Sep 17 00:00:00 2001 From: joachimnielandt <joachim.nielandt@vlaanderen.be> Date: Tue, 8 Oct 2024 12:35:06 +0200 Subject: [PATCH 67/97] Fixed spurious whitespace for gn-comma-list (#8398) * Fixed spurious whitespace for gn-comma-list * fixed issue when translate occurs on label --- .../catalog/views/default/less/gn_result_default.less | 6 ++++++ .../views/default/templates/recordView/metadata.html | 4 +++- .../views/default/templates/recordView/spatial.html | 6 ++++-- .../views/default/templates/recordView/technical.html | 7 ++----- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less b/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less index 09867678db0..53c83cc4b6d 100644 --- a/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less +++ b/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less @@ -258,14 +258,20 @@ display: inline; line-break: auto; word-break: break-word; + letter-spacing: -1em; + * { + letter-spacing: normal; + } a { line-break: normal; } &:after { content: ", "; + letter-spacing: normal; } &:last-child:after { content: ""; + letter-spacing: normal; } } } diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/metadata.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/metadata.html index 2823fdaf407..92c79a4dd8a 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/metadata.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/metadata.html @@ -20,7 +20,9 @@ <h3 data-translate="">updatedOn</h3> <div> <h3 data-translate="">metadataLanguage</h3> <ul class="gn-comma-list"> - <li data-ng-repeat="l in mdLanguages">{{l | translate}}</li> + <li data-ng-repeat="l in mdLanguages"> + <span> {{l | translate}} </span> + </li> </ul> </div> </div> diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/spatial.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/spatial.html index b99638e5c76..8f75ae1d8d5 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/spatial.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/spatial.html @@ -35,7 +35,7 @@ <h3 data-translate="">scale</h3> data-ng-repeat="d in mdView.current.record.resolutionScaleDenominator" class="gn-scale" > - {{d}} + <span> {{d}} </span> </li> </ul> </div> @@ -51,7 +51,9 @@ <h3 data-translate="">scale</h3> <div> <h3 data-translate="">resolution</h3> <ul class="gn-comma-list"> - <li data-ng-repeat="r in mdView.current.record.resolutionDistance">{{r}}</li> + <li data-ng-repeat="r in mdView.current.record.resolutionDistance"> + <span>{{r}}</span> + </li> </ul> </div> </div> diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html index 5c68e76a547..3df446c6aee 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html @@ -120,11 +120,8 @@ <h3 data-translate="">resourceEdition</h3> <div> <h3 data-translate="">language</h3> <ul class="gn-comma-list"> - <li - data-ng-repeat="l in mdView.current.record.resourceLanguage" - data-translate="" - > - {{l}} + <li data-ng-repeat="l in mdView.current.record.resourceLanguage"> + <span data-translate=""> {{l}} </span> </li> </ul> </div> From 78f8bfc2ed22607ceabf6709d229138e84616e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Wed, 9 Oct 2024 13:03:36 +0200 Subject: [PATCH 68/97] Metadata indexing / ISO19139 / ISO19115-3.2018 / Escape graphic overview file name for JSON (#8412) --- .../src/main/plugin/iso19115-3.2018/index-fields/index.xsl | 2 +- .../iso19139/src/main/plugin/iso19139/index-fields/index.xsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl index 207439102c6..9d67f38bac0 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl @@ -434,7 +434,7 @@ <xsl:for-each select="$overviews"> <overview type="object">{ - "url": "<xsl:value-of select="if (local-name() = 'FileName') then @src else normalize-space(.)"/>" + "url": "<xsl:value-of select="if (local-name() = 'FileName') then util:escapeForJson(@src) else util:escapeForJson(normalize-space(.))"/>" <xsl:if test="normalize-space(../../mcc:fileDescription) != ''">, "nameObject": <xsl:value-of select="gn-fn-index:add-multilingual-field('name', ../../mcc:fileDescription, $allLanguages, true())"/> diff --git a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl index 06c47aa519b..b38d4b12a0d 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl @@ -385,7 +385,7 @@ <xsl:for-each select="$overviews"> <!-- TODO can be multilingual desc and name --> <overview type="object">{ - "url": "<xsl:value-of select="normalize-space(.)"/>" + "url": "<xsl:value-of select="util:escapeForJson(normalize-space(.))"/>" <xsl:if test="normalize-space(../../gmd:fileDescription) != ''">, "nameObject": <xsl:value-of select="gn-fn-index:add-multilingual-field('name', ../../gmd:fileDescription, $allLanguages, true())"/> </xsl:if> From a0465e3776901135c195082947d44c57f0473333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 6 Jun 2024 10:06:22 +0200 Subject: [PATCH 69/97] Harvester / ISO19115-3 / Better support missing metadata date info While harvesting, `extract-date-modified.xsl` is used to retrieve last update of the record. If empty, harvester will fail with: ``` [geonetwork.harvester] - Invalid ISO date: java.lang.IllegalArgumentException: Invalid ISO date: at org.fao.geonet.domain.ISODate.parseDate(ISODate.java:426) ~[gn-domain-4.4.5-SNAPSHOT.jar:?] at org.fao.geonet.domain.ISODate.setDateAndTime(ISODate.java:239) ~[gn-domain-4.4.5-SNAPSHOT.jar:?] at org.fao.geonet.domain.ISODate.<init>(ISODate.java:117) ~[gn-domain-4.4.5-SNAPSHOT.jar:?] at org.fao.geonet.kernel.harvest.harvester.simpleurl.Aligner.addMetadata(Aligner.java:237) ~[gn-harvesters-4.4.5-SNAPSHOT.jar:?] at org.fao.geonet.kernel.harvest.harvester.simpleurl.Aligner.lambda$insertOrUpdate$0(Aligner.java:126) ~[gn-harvesters-4.4.5-SNAPSHOT.jar:?] ``` Fallback to now. --- .../iso19115-3.2018/extract-date-modified.xsl | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/extract-date-modified.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/extract-date-modified.xsl index a6546241b0a..73d8bf5ff4b 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/extract-date-modified.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/extract-date-modified.xsl @@ -3,27 +3,21 @@ version="2.0" xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xsl:variable name="dateFormat" + as="xs:string" + select="'[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01][ZN]'"/> <xsl:template match="mdb:MD_Metadata"> - <xsl:variable name="revisionDate" - select="(mdb:dateInfo/cit:CI_Date - [cit:dateType/cit:CI_DateTypeCode/@codeListValue='revision'] - /cit:date/*)[1]"/> <dateStamp> - <xsl:choose> - <xsl:when test="normalize-space($revisionDate)"> - <xsl:value-of select="$revisionDate"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="mdb:dateInfo/cit:CI_Date - [cit:dateType/cit:CI_DateTypeCode/@codeListValue='creation'] - /cit:date/*"/> - <!-- TODO: Should we handle when no creation nor revision date - defined ? --> - </xsl:otherwise> - </xsl:choose> + <xsl:value-of select="( + mdb:dateInfo/*[cit:dateType/*/@codeListValue = 'revision']/cit:date/*[. != ''], + mdb:dateInfo/*[cit:dateType/*/@codeListValue = 'creation']/cit:date/*[. != ''], + format-dateTime(current-dateTime(), $dateFormat) + )[1]"/> </dateStamp> </xsl:template> </xsl:stylesheet> From 3252d14711effe7f3a8b4b553b07b9951d0cb6c1 Mon Sep 17 00:00:00 2001 From: Ian Allen <ianwallen@hotmail.com> Date: Sun, 8 Sep 2024 07:13:08 -0300 Subject: [PATCH 70/97] Update external management url Add {objectId} property in external management url (base64 unique identifier for the record) Change external management type url property {type} so that it is fixed values so that same value can be used in {objectId} CMIS Fixed property names used for validation fields to be consistent with other names. Jcloud Updgade from jcloud 2.3.0 to jcloud 2.5.0 Add support for external management named properties similar to cmis Fix bug with deleting all resources as it was failing to identify folders correctly for azure blob. --- .../records/attachments/AbstractStore.java | 30 ++- .../api/records/attachments/CMISStore.java | 21 +- .../geonet/resources/CMISConfiguration.java | 57 +++--- .../config-cmis-overrides.properties | 4 +- .../resources/config-store/config-cmis.xml | 6 +- .../api/records/attachments/JCloudStore.java | 190 +++++++++++++++--- .../geonet/resources/JCloudConfiguration.java | 122 +++++++++-- .../JCloudMetadataNameValidator.java | 137 +++++++++++++ .../config-jcloud-overrides.properties | 6 + .../resources/config-store/config-jcloud.xml | 7 +- pom.xml | 2 +- 11 files changed, 498 insertions(+), 84 deletions(-) create mode 100644 datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudMetadataNameValidator.java diff --git a/core/src/main/java/org/fao/geonet/api/records/attachments/AbstractStore.java b/core/src/main/java/org/fao/geonet/api/records/attachments/AbstractStore.java index c5291a59bbf..168e4e2a63c 100644 --- a/core/src/main/java/org/fao/geonet/api/records/attachments/AbstractStore.java +++ b/core/src/main/java/org/fao/geonet/api/records/attachments/AbstractStore.java @@ -1,6 +1,6 @@ /* * ============================================================================= - * === Copyright (C) 2019 Food and Agriculture Organization of the + * === Copyright (C) 2024 Food and Agriculture Organization of the * === United Nations (FAO-UN), United Nations World Food Programme (WFP) * === and United Nations Environment Programme (UNEP) * === @@ -44,12 +44,16 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Base64; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public abstract class AbstractStore implements Store { + protected static final String RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_SEPARATOR = ":"; + protected static final String RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_ESCAPED_SEPARATOR = "\\:"; + @Override public final List<MetadataResource> getResources(final ServiceContext context, final String metadataUuid, final Sort sort, final String filter) throws Exception { @@ -279,4 +283,28 @@ public String toString() { } }; } + + private String escapeResourceManagementExternalProperties(String value) { + return value.replace(RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_SEPARATOR, RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_ESCAPED_SEPARATOR); +} + + /** + * Create an encoded base 64 object id contains the following fields to uniquely identify the resource + * The fields are separated by a colon ":" + * @param type to identify type of storage - document/folder + * @param visibility of the resource public/private + * @param metadataId internal metadata id + * @param version identifier which can be used to directly get this version. + * @param resourceId or filename of the resource + * @return based 64 object id + */ + protected String getResourceManagementExternalPropertiesObjectId(final String type, final MetadataResourceVisibility visibility, final Integer metadataId, final String version, + final String resourceId) { + return Base64.getEncoder().encodeToString( + ((type + RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_SEPARATOR + + escapeResourceManagementExternalProperties(visibility == null ? "" : visibility.toString().toLowerCase()) + RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_SEPARATOR + + metadataId + RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_SEPARATOR + + escapeResourceManagementExternalProperties(version == null ? "" : version) + RESOURCE_MANAGEMENT_EXTERNAL_PROPERTIES_SEPARATOR + + escapeResourceManagementExternalProperties(resourceId)).getBytes())); + } } diff --git a/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java b/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java index de258b3a711..37fe8501899 100644 --- a/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java +++ b/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java @@ -1,6 +1,6 @@ /* * ============================================================================= - * === Copyright (C) 2001-2016 Food and Agriculture Organization of the + * === Copyright (C) 2001-2024 Food and Agriculture Organization of the * === United Nations (FAO-UN), United Nations World Food Programme (WFP) * === and United Nations Environment Programme (UNEP) * === @@ -627,8 +627,10 @@ private GeonetworkDataDirectory getDataDirectory(ServiceContext context) { /** * get external resource management for the supplied resource. * Replace the following + * {objectId} type:visibility:metadataId:version:resourceId in base64 encoding * {id} resource id - * {type:folder:document} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed + * {type:folder:document} // Custom return type based on type. If the type is folder then type "folder" will be displayed else if document then "document" will be displayed + * {type} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed * {uuid} metadatauuid * {metadataid} metadataid * {visibility} visibility @@ -657,16 +659,27 @@ protected MetadataResourceExternalManagementProperties getMetadataResourceExtern ) { String metadataResourceExternalManagementPropertiesUrl = cmisConfiguration.getExternalResourceManagementUrl(); if (!StringUtils.isEmpty(metadataResourceExternalManagementPropertiesUrl)) { + // {objectid} objectId // It will be the type:visibility:metadataId:version:resourceId in base64 + // i.e. folder::100::100 # Folder in resource 100 + // i.e. document:public:100:v1:sample.jpg # public document 100 version v1 name sample.jpg + if (metadataResourceExternalManagementPropertiesUrl.contains("{objectid}")) { + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{objectid\\})", + getResourceManagementExternalPropertiesObjectId((type == null ? "document" : (type instanceof Folder ? "folder" : "document")), visibility, metadataId, version, resourceId)); + } // {id} id if (metadataResourceExternalManagementPropertiesUrl.contains("{id}")) { metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{id\\})", (resourceId==null?"":resourceId)); } - // {type:folder:document} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed + // {type:folder:document} // Custom return type based on type. If the type is folder then type "folder" will be displayed else if document then "document" will be displayed if (metadataResourceExternalManagementPropertiesUrl.contains("{type:")) { metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("\\{type:([a-zA-Z0-9]*?):([a-zA-Z0-9]*?)\\}", (type==null?"":(type instanceof Folder?"$1":"$2"))); } - + // {type} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed + if (metadataResourceExternalManagementPropertiesUrl.contains("{type}")) { + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{type\\})", + (type == null ? "document" : (type instanceof Folder ? "folder" : "document"))); + } // {uuid} metadatauuid if (metadataResourceExternalManagementPropertiesUrl.contains("{uuid}")) { metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{uuid\\})", (metadataUuid==null?"":metadataUuid)); diff --git a/datastorages/cmis/src/main/java/org/fao/geonet/resources/CMISConfiguration.java b/datastorages/cmis/src/main/java/org/fao/geonet/resources/CMISConfiguration.java index 257ef3246d6..87b76ec0821 100644 --- a/datastorages/cmis/src/main/java/org/fao/geonet/resources/CMISConfiguration.java +++ b/datastorages/cmis/src/main/java/org/fao/geonet/resources/CMISConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -59,26 +59,28 @@ public class CMISConfiguration { private Session client = null; - public final static Integer CMIS_MAX_ITEMS_PER_PAGE = 1000; - public final static String CMIS_FOLDER_DELIMITER = "/"; // Specs indicate that "/" is the folder delimiter/separator - not sure if other delimiter can be used?. - public final static String CMIS_SECONDARY_PROPERTY_SEPARATOR = "->"; - private final String CMIS_DEFAULT_WEBSERVICES_ACL_SERVICE = "/services/ACLService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_DISCOVERY_SERVICE = "/services/DiscoveryService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_MULTIFILING_SERVICE = "/services/MultiFilingService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_NAVIGATION_SERVICE = "/services/NavigationService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_OBJECT_SERVICE = "/services/ObjectService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_POLICY_SERVICE = "/services/PolicyService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_RELATIONSHIP_SERVICE = "/services/RelationshipService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_REPOSITORY_SERVICE = "/services/RepositoryService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_VERSIONING_SERVICE = "/services/VersioningService?wsdl"; - private final String CMIS_DEFAULT_WEBSERVICES_BASE_URL_SERVICE = "/cmis"; - private final String CMIS_DEFAULT_BROWSER_URL_SERVICE = "/browser"; - private final String CMIS_DEFAULT_ATOMPUB_URL_SERVICE = "/atom"; - - private final String CMIS_DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_WINDOW_PARAMETERS = "toolbar=0,width=600,height=600"; - private final Boolean CMIS_DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_MODAL_ENABLED = true; - private final Boolean CMIS_DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ENABLED = true; - private final Boolean CMIS_DEFAULT_VERSIONING_ENABLED = false; + // DFO change to 100. Due to bug with open text cmis where if max is set to 1000, it will return 100 but if it is set to 100 it will return all records. + // https://dev.azure.com/foc-poc/EDH-CDE/_workitems/edit/95878 + public static final Integer CMIS_MAX_ITEMS_PER_PAGE = 100; + public static final String CMIS_FOLDER_DELIMITER = "/"; // Specs indicate that "/" is the folder delimiter/separator - not sure if other delimiter can be used?. + public static final String CMIS_SECONDARY_PROPERTY_SEPARATOR = "->"; + private static final String CMIS_DEFAULT_WEBSERVICES_ACL_SERVICE = "/services/ACLService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_DISCOVERY_SERVICE = "/services/DiscoveryService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_MULTIFILING_SERVICE = "/services/MultiFilingService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_NAVIGATION_SERVICE = "/services/NavigationService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_OBJECT_SERVICE = "/services/ObjectService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_POLICY_SERVICE = "/services/PolicyService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_RELATIONSHIP_SERVICE = "/services/RelationshipService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_REPOSITORY_SERVICE = "/services/RepositoryService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_VERSIONING_SERVICE = "/services/VersioningService?wsdl"; + private static final String CMIS_DEFAULT_WEBSERVICES_BASE_URL_SERVICE = "/cmis"; + private static final String CMIS_DEFAULT_BROWSER_URL_SERVICE = "/browser"; + private static final String CMIS_DEFAULT_ATOMPUB_URL_SERVICE = "/atom"; + + private static final String CMIS_DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_WINDOW_PARAMETERS = "toolbar=0,width=600,height=600"; + private static final Boolean CMIS_DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_MODAL_ENABLED = true; + private static final Boolean CMIS_DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ENABLED = true; + private static final Boolean CMIS_DEFAULT_VERSIONING_ENABLED = false; private String servicesBaseUrl; private String bindingType; @@ -111,7 +113,6 @@ public class CMISConfiguration { * Property name for validation status that is expected to be an integer with values of null, 0, 1, 2 * (See MetadataResourceExternalManagementProperties.ValidationStatus for code meaning) * Property name follows the same format as cmisMetadataUUIDPropertyName - * * If null then validation status will default to UNKNOWN. */ private String externalResourceManagementValidationStatusPropertyName; @@ -505,7 +506,6 @@ public void setExternalResourceManagementValidationStatusPropertyName(String ext String.format("Invalid format for property name %s property will not be used", externalResourceManagementValidationStatusPropertyName)); this.externalResourceManagementValidationStatusPropertyName = null; this.externalResourceManagementValidationStatusSecondaryProperty = false; - return; } else { this.externalResourceManagementValidationStatusSecondaryProperty = true; } @@ -514,7 +514,7 @@ public void setExternalResourceManagementValidationStatusPropertyName(String ext public MetadataResourceExternalManagementProperties.ValidationStatus getValidationStatusDefaultValue() { // We only need to set the default if there is a status property supplied, and it is not already set - if (this.defaultStatus == null && !org.springframework.util.StringUtils.isEmpty(getExternalResourceManagementValidationStatusPropertyName())) { + if (this.defaultStatus == null && org.springframework.util.StringUtils.hasLength(getExternalResourceManagementValidationStatusPropertyName())) { if (getExternalResourceManagementValidationStatusDefaultValue() != null) { // If a default property name does exist then use it this.defaultStatus = MetadataResourceExternalManagementProperties.ValidationStatus.valueOf(getExternalResourceManagementValidationStatusDefaultValue()); @@ -536,9 +536,8 @@ public void init() { } // default factory implementation - Map<String, String> parameters = new HashMap<String, String>(); + Map<String, String> parameters = new HashMap<>(); - this.baseRepositoryPath = baseRepositoryPath; if (this.baseRepositoryPath == null) { this.baseRepositoryPath = ""; } @@ -609,7 +608,7 @@ public void init() { } } } else { - // Try to find the repository name for the id that we have specified.. + // Try to find the repository name for the id that we have specified. try { for (Repository repository : factory.getRepositories(parameters)) { if (repository.getId().equalsIgnoreCase(this.repositoryId)) { @@ -633,7 +632,7 @@ public void init() { repositoryUrl + "' using product '" + client.getRepositoryInfo().getProductName() + "' version '" + client.getRepositoryInfo().getProductVersion() + "'."); - // Check if we can parse the secondary parameters from human readable to secondary ids. + // Check if we can parse the secondary parameters from human-readable to secondary ids. parsedCmisMetadataUUIDPropertyName = parseSecondaryProperty(client, cmisMetadataUUIDPropertyName); parsedExternalResourceManagementValidationStatusPropertyName = parseSecondaryProperty(client, externalResourceManagementValidationStatusPropertyName); @@ -743,7 +742,7 @@ public boolean existExternalResourceManagementValidationStatusSecondaryProperty( } /** - * Generte a full url based on the supplied entered serviceurl and the default. + * Generate a full url based on the supplied entered serviceUrl and the default. * * @param baseUrl Base url * @param serviceUrl Supplied service url (This could start with / or http. If it starts with http then ignore baseUrl) diff --git a/datastorages/cmis/src/main/resources/config-store/config-cmis-overrides.properties b/datastorages/cmis/src/main/resources/config-store/config-cmis-overrides.properties index f0a62c1920a..4c154639ca5 100644 --- a/datastorages/cmis/src/main/resources/config-store/config-cmis-overrides.properties +++ b/datastorages/cmis/src/main/resources/config-store/config-cmis-overrides.properties @@ -11,8 +11,8 @@ cmis.external.resource.management.window.parameters=${CMIS_EXTERNAL_RESOURCE_MAN cmis.external.resource.management.modal.enabled=${CMIS_EXTERNAL_RESOURCE_MANAGEMENT_MODAL_ENABLED:#{null}} cmis.external.resource.management.folder.enabled=${CMIS_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ENABLED:#{null}} cmis.external.resource.management.folder.root=${CMIS_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ROOT:#{null}} -cmis.external.resource.status.property.name=${CMIS_EXTERNAL_RESOURCE_STATUS_PROPERTY_NAME:#{null}} -cmis.external.resource.management.status.default.value=${CMIS_EXTERNAL_RESOURCE_MANAGEMENT_STATUS_DEFAULT_VALUE:#{null}} +cmis.external.resource.management.validation.status.property.name=${CMIS_EXTERNAL_RESOURCE_MANAGEMENT_VALIDATION_STATUS_PROPERTY_NAME:#{null}} +cmis.external.resource.management.validation.status.default.value=${CMIS_EXTERNAL_RESOURCE_MANAGEMENT_VALIDATION_STATUS_DEFAULT_VALUE:#{null}} cmis.versioning.enabled=${CMIS_VERSIONING_ENABLED:#{null}} cmis.versioning.state=#{'${CMIS_VERSIONING_STATE:MAJOR}'.toUpperCase()} diff --git a/datastorages/cmis/src/main/resources/config-store/config-cmis.xml b/datastorages/cmis/src/main/resources/config-store/config-cmis.xml index 76abe73572c..1c302788b5c 100644 --- a/datastorages/cmis/src/main/resources/config-store/config-cmis.xml +++ b/datastorages/cmis/src/main/resources/config-store/config-cmis.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - ~ Copyright (C) 2001-2016 Food and Agriculture Organization of the + ~ Copyright (C) 2001-2024 Food and Agriculture Organization of the ~ United Nations (FAO-UN), United Nations World Food Programme (WFP) ~ and United Nations Environment Programme (UNEP) ~ @@ -99,8 +99,8 @@ <property name="externalResourceManagementModalEnabled" value="${cmis.external.resource.management.modal.enabled}"/> <property name="externalResourceManagementFolderEnabled" value="${cmis.external.resource.management.folder.enabled}"/> <property name="externalResourceManagementFolderRoot" value="${cmis.external.resource.management.folder.root}"/> - <property name="externalResourceManagementValidationStatusPropertyName" value="${cmis.external.resource.status.property.name}"/> - <property name="externalResourceManagementValidationStatusDefaultValue" value="${cmis.external.resource.management.status.default.value}"/> + <property name="externalResourceManagementValidationStatusPropertyName" value="${cmis.external.resource.management.validation.status.property.name}"/> + <property name="externalResourceManagementValidationStatusDefaultValue" value="${cmis.external.resource.management.validation.status.default.value}"/> <property name="versioningEnabled" value="${cmis.versioning.enabled}"/> <property name="versioningState" value="${cmis.versioning.state}"/> diff --git a/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java b/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java index 067809526d1..835dc3051c4 100644 --- a/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java +++ b/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java @@ -1,6 +1,6 @@ /* * ============================================================================= - * === Copyright (C) 2001-2016 Food and Agriculture Organization of the + * === Copyright (C) 2001-2024 Food and Agriculture Organization of the * === United Nations (FAO-UN), United Nations World Food Programme (WFP) * === and United Nations Environment Programme (UNEP) * === @@ -29,6 +29,7 @@ import jeeves.server.context.ServiceContext; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.fao.geonet.ApplicationContextHolder; import org.fao.geonet.api.exception.ResourceNotFoundException; @@ -59,9 +60,14 @@ import java.nio.file.PathMatcher; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.text.SimpleDateFormat; import java.util.ArrayList; + import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import javax.annotation.Nullable; import com.fasterxml.jackson.core.JsonProcessingException; @@ -69,6 +75,9 @@ public class JCloudStore extends AbstractStore { + // For azure Blob ADSL hdi_isfolder property name used to identify folders + private final static String AZURE_BLOB_IS_FOLDER_PROPERTY_NAME="hdi_isfolder"; + private Path baseMetadataDir = null; @Autowired @@ -129,17 +138,29 @@ private MetadataResource createResourceDescription(final ServiceContext context, String versionValue = null; if (jCloudConfiguration.isVersioningEnabled()) { - versionValue = storageMetadata.getETag(); + versionValue = storageMetadata.getETag(); // ETAG is cryptic may need some other value? + } + + MetadataResourceExternalManagementProperties.ValidationStatus validationStatus = MetadataResourceExternalManagementProperties.ValidationStatus.UNKNOWN; + if (!StringUtils.isEmpty(jCloudConfiguration.getExternalResourceManagementValidationStatusPropertyName())) { + String validationStatusPropertyName = jCloudConfiguration.getExternalResourceManagementValidationStatusPropertyName(); + String propertyValue = null; + if (storageMetadata.getUserMetadata().containsKey(validationStatusPropertyName)) { + propertyValue = storageMetadata.getUserMetadata().get(validationStatusPropertyName); + } + if (StringUtils.isNotEmpty(propertyValue)) { + validationStatus = MetadataResourceExternalManagementProperties.ValidationStatus.fromValue(Integer.parseInt(propertyValue)); + } } MetadataResourceExternalManagementProperties metadataResourceExternalManagementProperties = - getMetadataResourceExternalManagementProperties(context, metadataId, metadataUuid, visibility, resourceId, filename, storageMetadata.getETag(), storageMetadata.getType()); + getMetadataResourceExternalManagementProperties(context, metadataId, metadataUuid, visibility, resourceId, filename, storageMetadata.getETag(), storageMetadata.getType(), validationStatus); return new FilesystemStoreResource(metadataUuid, metadataId, filename, settingManager.getNodeURL() + "api/records/", visibility, storageMetadata.getSize(), storageMetadata.getLastModified(), versionValue, metadataResourceExternalManagementProperties, approved); } - private static String getFilename(final String key) { + protected static String getFilename(final String key) { final String[] splittedKey = key.split("/"); return splittedKey[splittedKey.length - 1]; } @@ -152,11 +173,17 @@ public ResourceHolder getResource(final ServiceContext context, final String met try { final Blob object = jCloudConfiguration.getClient().getBlobStore().getBlob( jCloudConfiguration.getContainerName(), getKey(context, metadataUuid, metadataId, visibility, resourceId)); + if (object == null) { + throw new ResourceNotFoundException( + String.format("Metadata resource '%s' not found for metadata '%s'", resourceId, metadataUuid)) + .withMessageKey("exception.resourceNotFound.resource", new String[]{resourceId}) + .withDescriptionKey("exception.resourceNotFound.resource.description", new String[]{resourceId, metadataUuid}); + } return new ResourceHolderImpl(object, createResourceDescription(context, metadataUuid, visibility, resourceId, object.getMetadata(), metadataId, approved)); } catch (ContainerNotFoundException e) { throw new ResourceNotFoundException( - String.format("Metadata resource '%s' not found for metadata '%s'", resourceId, metadataUuid)) + String.format("Metadata container for resource '%s' not found for metadata '%s'", resourceId, metadataUuid)) .withMessageKey("exception.resourceNotFound.resource", new String[]{resourceId}) .withDescriptionKey("exception.resourceNotFound.resource.description", new String[]{resourceId, metadataUuid}); } @@ -167,7 +194,7 @@ public ResourceHolder getResourceInternal(String metadataUuid, MetadataResourceV throw new UnsupportedOperationException("JCloud does not support getResourceInternal."); } - private String getKey(final ServiceContext context, String metadataUuid, int metadataId, MetadataResourceVisibility visibility, String resourceId) { + protected String getKey(final ServiceContext context, String metadataUuid, int metadataId, MetadataResourceVisibility visibility, String resourceId) { checkResourceId(resourceId); final String metadataDir = getMetadataDir(context, metadataId); return metadataDir + jCloudConfiguration.getFolderDelimiter() + visibility.toString() + jCloudConfiguration.getFolderDelimiter() + getFilename(metadataUuid, resourceId); @@ -177,25 +204,94 @@ private String getKey(final ServiceContext context, String metadataUuid, int met public MetadataResource putResource(final ServiceContext context, final String metadataUuid, final String filename, final InputStream is, @Nullable final Date changeDate, final MetadataResourceVisibility visibility, Boolean approved) throws Exception { + return putResource(context, metadataUuid, filename, is, changeDate, visibility, approved, null); + } + + protected MetadataResource putResource(final ServiceContext context, final String metadataUuid, final String filename, + final InputStream is, @Nullable final Date changeDate, final MetadataResourceVisibility visibility, Boolean approved, Map<String, String> additionalProperties) + throws Exception { final int metadataId = canEdit(context, metadataUuid, approved); String key = getKey(context, metadataUuid, metadataId, visibility, filename); - // Todo - jcloud does not seem to allow setting the last modified date. May need to investigate to see if there are other options. - //if (changeDate != null) { - // metadata.setLastModified(changeDate); + Map<String, String> properties = null; + + try { + StorageMetadata storageMetadata = jCloudConfiguration.getClient().getBlobStore().blobMetadata(jCloudConfiguration.getContainerName(), key); + if (storageMetadata != null) { + properties = storageMetadata.getUserMetadata(); + } + } catch (ContainerNotFoundException ignored) { + // ignored + } + + + if (properties == null) { + properties = new HashMap<>(); + } + + addProperties(metadataUuid, properties, changeDate, additionalProperties); Blob blob = jCloudConfiguration.getClient().getBlobStore().blobBuilder(key) .payload(is) .contentLength(is.available()) + .userMetadata(properties) .build(); // Upload the Blob in multiple chunks to supports large files. jCloudConfiguration.getClient().getBlobStore().putBlob(jCloudConfiguration.getContainerName(), blob, multipart()); Blob blobResults = jCloudConfiguration.getClient().getBlobStore().getBlob(jCloudConfiguration.getContainerName(), key); + return createResourceDescription(context, metadataUuid, visibility, filename, blobResults.getMetadata(), metadataId, approved); } + protected void addProperties(String metadataUuid, Map<String, String> properties, Date changeDate, Map<String, String> additionalProperties) { + + // Add additional properties if exists. + if (MapUtils.isNotEmpty(additionalProperties)) { + properties.putAll(additionalProperties); + } + + // now update metadata uuid and status and change date . + + setMetadataUUID(properties, metadataUuid); + + // JCloud does not allow changing the last modified date. So the change date will be put in defined changed date field if supplied. + setExternalResourceManagementChangedDate(properties, changeDate); + + // If it is a new record so set the default status value property if it does not already exist as an additional property. + if (!StringUtils.isEmpty(jCloudConfiguration.getExternalResourceManagementValidationStatusPropertyName()) && + !properties.containsKey(jCloudConfiguration.getExternalResourceManagementValidationStatusPropertyName())) { + setExternalManagementResourceValidationStatus(properties, jCloudConfiguration.getValidationStatusDefaultValue()); + } + + } + protected void setMetadataUUID(Map<String, String> properties, String metadataUuid) { + // Don't allow users metadata uuid to be supplied as a property so let's overwrite any value that may exist. + if (!StringUtils.isEmpty(jCloudConfiguration.getMetadataUUIDPropertyName())) { + setProperty(properties, jCloudConfiguration.getMetadataUUIDPropertyName(), metadataUuid); + } + } + + protected void setExternalResourceManagementChangedDate(Map<String, String> properties, Date changeDate) { + // Don't allow change date to be supplied as a property so let's overwrite any value that may exist. + if (changeDate != null && !StringUtils.isEmpty(jCloudConfiguration.getExternalResourceManagementChangedDatePropertyName())) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + properties.put(jCloudConfiguration.getExternalResourceManagementChangedDatePropertyName(), dateFormat.format(changeDate)); + } + } + + protected void setExternalManagementResourceValidationStatus(Map<String, String> properties, MetadataResourceExternalManagementProperties.ValidationStatus status) { + if (!StringUtils.isEmpty(jCloudConfiguration.getExternalResourceManagementValidationStatusPropertyName())) { + setProperty(properties, jCloudConfiguration.getExternalResourceManagementValidationStatusPropertyName(), String.valueOf(status.getValue())); + } + } + + protected void setProperty(Map<String, String> properties, String propertyName, String value) { + if (!StringUtils.isEmpty(propertyName)) { + properties.put(propertyName, value); + } + } @Override public MetadataResource patchResourceStatus(final ServiceContext context, final String metadataUuid, final String resourceId, final MetadataResourceVisibility visibility, Boolean approved) throws Exception { @@ -254,7 +350,7 @@ public String delResources(final ServiceContext context, final int metadataId) t PageSet<? extends StorageMetadata> page = jCloudConfiguration.getClient().getBlobStore().list(jCloudConfiguration.getContainerName(), opts); for (StorageMetadata storageMetadata : page) { - if (storageMetadata.getType() == StorageType.BLOB) { + if (!isFolder(storageMetadata)) { jCloudConfiguration.getClient().getBlobStore().removeBlob(jCloudConfiguration.getContainerName(), storageMetadata.getName()); } } @@ -275,9 +371,13 @@ public String delResource(final ServiceContext context, final String metadataUui for (MetadataResourceVisibility visibility : MetadataResourceVisibility.values()) { if (tryDelResource(context, metadataUuid, metadataId, visibility, resourceId)) { + Log.info(Geonet.RESOURCES, + String.format("MetadataResource '%s' removed.", resourceId)); return String.format("MetadataResource '%s' removed.", resourceId); } } + Log.info(Geonet.RESOURCES, + String.format("Unable to remove resource '%s'.", resourceId)); return String.format("Unable to remove resource '%s'.", resourceId); } @@ -286,12 +386,16 @@ public String delResource(final ServiceContext context, final String metadataUui final String resourceId, Boolean approved) throws Exception { int metadataId = canEdit(context, metadataUuid, approved); if (tryDelResource(context, metadataUuid, metadataId, visibility, resourceId)) { + Log.info(Geonet.RESOURCES, + String.format("MetadataResource '%s' removed.", resourceId)); return String.format("MetadataResource '%s' removed.", resourceId); } + Log.info(Geonet.RESOURCES, + String.format("Unable to remove resource '%s'.", resourceId)); return String.format("Unable to remove resource '%s'.", resourceId); } - private boolean tryDelResource(final ServiceContext context, final String metadataUuid, final int metadataId, final MetadataResourceVisibility visibility, + protected boolean tryDelResource(final ServiceContext context, final String metadataUuid, final int metadataId, final MetadataResourceVisibility visibility, final String resourceId) throws Exception { final String key = getKey(context, metadataUuid, metadataId, visibility, resourceId); @@ -321,11 +425,22 @@ public MetadataResource getResourceDescription(final ServiceContext context, fin } @Override - public MetadataResourceContainer getResourceContainerDescription(ServiceContext context, String metadataUuid, Boolean approved) throws Exception { - + public MetadataResourceContainer getResourceContainerDescription(final ServiceContext context, final String metadataUuid, Boolean approved) throws Exception { int metadataId = getAndCheckMetadataId(metadataUuid, approved); - return new FilesystemStoreResourceContainer(metadataUuid, metadataId, metadataUuid, settingManager.getNodeURL() + "api/records/", approved); + final String key = getMetadataDir(context, metadataId); + + + String folderRoot = jCloudConfiguration.getExternalResourceManagementFolderRoot(); + if (folderRoot == null) { + folderRoot = ""; + } + MetadataResourceExternalManagementProperties metadataResourceExternalManagementProperties = + getMetadataResourceExternalManagementProperties(context, metadataId, metadataUuid, null, String.valueOf(metadataId), null, null, StorageType.FOLDER, + MetadataResourceExternalManagementProperties.ValidationStatus.UNKNOWN); + + return new FilesystemStoreResourceContainer(metadataUuid, metadataId, metadataUuid, + settingManager.getNodeURL() + "api/records/", metadataResourceExternalManagementProperties, approved); } private String getMetadataDir(ServiceContext context, final int metadataId) { @@ -360,7 +475,7 @@ private String getMetadataDir(ServiceContext context, final int metadataId) { } } - private Path getBaseMetadataDir(ServiceContext context, Path metadataFullDir) { + protected Path getBaseMetadataDir(ServiceContext context, Path metadataFullDir) { //If we not already figured out the base metadata dir then lets figure it out. if (baseMetadataDir == null) { Path systemFullDir = getDataDirectory(context).getSystemDataDir(); @@ -385,11 +500,17 @@ private GeonetworkDataDirectory getDataDirectory(ServiceContext context) { return ApplicationContextHolder.get().getBean(GeonetworkDataDirectory.class); } + private boolean isFolder(StorageMetadata storageMetadata) { + // For azure Blob ADSL if the type is folder then the storage type will be BLOB and hdi_isfolder=true so we cannot only rely on StorageType.FOLDER + return storageMetadata.getType().equals(StorageType.FOLDER) || "true".equals(storageMetadata.getUserMetadata().get(AZURE_BLOB_IS_FOLDER_PROPERTY_NAME)); + } + /** * get external resource management for the supplied resource. * Replace the following + * {objectId} type:visibility:metadataId:version:resourceId in base64 encoding * {id} resource id - * {type:folder:document} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed + * {type} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed * {uuid} metadatauuid * {metadataid} metadataid * {visibility} visibility @@ -409,39 +530,48 @@ private MetadataResourceExternalManagementProperties getMetadataResourceExternal final String resourceId, String filename, String version, - StorageType type + StorageType type, + MetadataResourceExternalManagementProperties.ValidationStatus validationStatus ) { String metadataResourceExternalManagementPropertiesUrl = jCloudConfiguration.getExternalResourceManagementUrl(); + String objectId = getResourceManagementExternalPropertiesObjectId((type == null ? "document" : (StorageType.FOLDER.equals(type) ? "folder" : "document")), visibility, metadataId, version, + resourceId); if (!StringUtils.isEmpty(metadataResourceExternalManagementPropertiesUrl)) { + // {objectid} objectId // It will be the type:visibility:metadataId:version:resourceId in base64 + // i.e. folder::100::100 # Folder in resource 100 + // i.e. document:public:100:v1:sample.jpg # public document 100 version v1 name sample.jpg + if (metadataResourceExternalManagementPropertiesUrl.contains("{objectid}")) { + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{objectid\\})", objectId); + } // {id} id if (metadataResourceExternalManagementPropertiesUrl.contains("{id}")) { metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{id\\})", resourceId); } - // {type:folder:document} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed - if (metadataResourceExternalManagementPropertiesUrl.contains("{type:")) { - metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("\\{type:([a-zA-Z0-9]*?):([a-zA-Z0-9]*?)\\}", - (type==null?"":(StorageType.FOLDER.equals(type)?"$1":"$2"))); + // {type} // If the type is folder then type "folder" will be displayed else if document then "document" will be displayed + if (metadataResourceExternalManagementPropertiesUrl.contains("{type}")) { + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{type\\})", + (type == null ? "document" : (StorageType.FOLDER.equals(type) ? "folder" : "document"))); } - - // {uuid} metadatauuid + // {uuid} metadata uuid if (metadataResourceExternalManagementPropertiesUrl.contains("{uuid}")) { - metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{uuid\\})", (metadataUuid==null?"":metadataUuid)); + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{uuid\\})", (metadataUuid == null ? "" : metadataUuid)); } - // {metadataid} metadataid + // {metadataid} metadataId if (metadataResourceExternalManagementPropertiesUrl.contains("{metadataid}")) { metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{metadataid\\})", String.valueOf(metadataId)); } // {visibility} visibility if (metadataResourceExternalManagementPropertiesUrl.contains("{visibility}")) { - metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{visibility\\})", (visibility==null?"":visibility.toString().toLowerCase())); + metadataResourceExternalManagementPropertiesUrl = + metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{visibility\\})", (visibility == null ? "" : visibility.toString().toLowerCase())); } // {filename} filename if (metadataResourceExternalManagementPropertiesUrl.contains("{filename}")) { - metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{filename\\})", (filename==null?"":filename)); + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{filename\\})", (filename == null ? "" : filename)); } // {version} version if (metadataResourceExternalManagementPropertiesUrl.contains("{version}")) { - metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{version\\})", (version==null?"":version)); + metadataResourceExternalManagementPropertiesUrl = metadataResourceExternalManagementPropertiesUrl.replaceAll("(\\{version\\})", (version == null ? "" : version)); } if (metadataResourceExternalManagementPropertiesUrl.contains("{lang}") || metadataResourceExternalManagementPropertiesUrl.contains("{ISO3lang}")) { @@ -469,7 +599,7 @@ private MetadataResourceExternalManagementProperties getMetadataResourceExternal } MetadataResourceExternalManagementProperties metadataResourceExternalManagementProperties - = new MetadataResourceExternalManagementProperties(resourceId, metadataResourceExternalManagementPropertiesUrl, MetadataResourceExternalManagementProperties.ValidationStatus.UNKNOWN); + = new MetadataResourceExternalManagementProperties(objectId, metadataResourceExternalManagementPropertiesUrl, validationStatus); return metadataResourceExternalManagementProperties; } @@ -508,7 +638,7 @@ public String toString() { }; } - private static class ResourceHolderImpl implements ResourceHolder { + protected static class ResourceHolderImpl implements ResourceHolder { private Path tempFolderPath; private Path path; private final MetadataResource metadataResource; diff --git a/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudConfiguration.java b/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudConfiguration.java index 2531f78420e..5971855c8a2 100644 --- a/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudConfiguration.java +++ b/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -24,22 +24,23 @@ package org.fao.geonet.resources; import org.apache.commons.lang.BooleanUtils; -import org.apache.commons.lang.StringUtils; +import org.fao.geonet.domain.MetadataResourceExternalManagementProperties; import org.jclouds.ContextBuilder; import org.jclouds.blobstore.BlobStoreContext; +import org.springframework.util.StringUtils; import javax.annotation.Nonnull; import javax.annotation.PostConstruct; public class JCloudConfiguration { + private BlobStoreContext client = null; - private ContextBuilder builder = null; - private String DEFAULT_CLOUD_FOLDER_SEPARATOR = "/"; // not sure if this is consistent for all clouds defaulting to "/" and make it a config - private final String DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_WINDOW_PARAMETERS = "toolbar=0,width=600,height=600"; - private final Boolean DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_MODAL_ENABLED = true; - private final Boolean DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ENABLED = true; - private final Boolean DEFAULT_VERSIONING_ENABLED = false; + private static final String DEFAULT_CLOUD_FOLDER_SEPARATOR = "/"; // not sure if this is consistent for all clouds defaulting to "/" and make it a config + private static final String DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_WINDOW_PARAMETERS = "toolbar=0,width=600,height=600"; + private static final Boolean DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_MODAL_ENABLED = true; + private static final Boolean DEFAULT_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ENABLED = true; + private static final Boolean DEFAULT_VERSIONING_ENABLED = false; private String provider; private String baseFolder; @@ -49,6 +50,10 @@ public class JCloudConfiguration { private String endpoint; private String folderDelimiter = null; + /** + * Property name for storing the metadata uuid that is expected to be a String + */ + private String metadataUUIDPropertyName; /** * Url used for managing enhanced resource properties related to the metadata. */ @@ -58,6 +63,25 @@ public class JCloudConfiguration { private Boolean externalResourceManagementFolderEnabled; private String externalResourceManagementFolderRoot; + /** + * Property name for storing the changed date as JCloud does not allow changing the last modified date. + */ + private String externalResourceManagementChangedDatePropertyName; + + /** + * Property name for validation status that is expected to be an integer with values of null, 0, 1, 2 + * (See MetadataResourceExternalManagementProperties.ValidationStatus for code meaning) + * If null then validation status will default to UNKNOWN. + */ + private String externalResourceManagementValidationStatusPropertyName; + /** + * Default value to be used for the validation status. + * If null then it will use INCOMPLETE as the default. + * Note that if property name is not supplied then it will always default to UNKNOWN + */ + private String externalResourceManagementValidationStatusDefaultValue; + private MetadataResourceExternalManagementProperties.ValidationStatus defaultStatus = null; + /* * Enable option to add versioning in the link to the resource. */ @@ -84,7 +108,7 @@ public void setBaseFolder(String baseFolder) { if (this.folderDelimiter == null) { this.folderDelimiter = DEFAULT_CLOUD_FOLDER_SEPARATOR; } - if (StringUtils.isEmpty(baseFolder)) { + if (!StringUtils.hasLength(baseFolder)) { this.baseFolder = this.folderDelimiter; } else { if (baseFolder.endsWith(this.folderDelimiter)) { @@ -142,7 +166,7 @@ public void setExternalResourceManagementModalEnabled(Boolean externalResourceMa } public void setExternalResourceManagementModalEnabled(String externalResourceManagementModalEnabled) { - this.externalResourceManagementModalEnabled = BooleanUtils.toBooleanObject(externalResourceManagementModalEnabled);; + this.externalResourceManagementModalEnabled = BooleanUtils.toBooleanObject(externalResourceManagementModalEnabled); } public Boolean isExternalResourceManagementFolderEnabled() { @@ -172,7 +196,15 @@ public void setExternalResourceManagementFolderRoot(String externalResourceManag } } - this.externalResourceManagementFolderRoot=folderRoot; + this.externalResourceManagementFolderRoot = folderRoot; + } + + public String getExternalResourceManagementValidationStatusDefaultValue() { + return externalResourceManagementValidationStatusDefaultValue; + } + + public void setExternalResourceManagementValidationStatusDefaultValue(String externalResourceManagementValidationStatusDefaultValue) { + this.externalResourceManagementValidationStatusDefaultValue = externalResourceManagementValidationStatusDefaultValue; } @Nonnull @@ -191,7 +223,45 @@ public void setVersioningEnabled(Boolean versioningEnabled) { public void setVersioningEnabled(String versioningEnabled) { this.versioningEnabled = BooleanUtils.toBooleanObject(versioningEnabled); - ; + } + + public String getMetadataUUIDPropertyName() { + return metadataUUIDPropertyName; + } + + public void setMetadataUUIDPropertyName(String metadataUUIDPropertyName) { + this.metadataUUIDPropertyName = metadataUUIDPropertyName; + } + + public String getExternalResourceManagementChangedDatePropertyName() { + return externalResourceManagementChangedDatePropertyName; + } + + public void setExternalResourceManagementChangedDatePropertyName(String externalResourceManagementChangedDatePropertyName) { + this.externalResourceManagementChangedDatePropertyName = externalResourceManagementChangedDatePropertyName; + } + public String getExternalResourceManagementValidationStatusPropertyName() { + return externalResourceManagementValidationStatusPropertyName; + } + + public void setExternalResourceManagementValidationStatusPropertyName(String externalResourceManagementValidationStatusPropertyName) { + this.externalResourceManagementValidationStatusPropertyName = externalResourceManagementValidationStatusPropertyName; + } + + public MetadataResourceExternalManagementProperties.ValidationStatus getValidationStatusDefaultValue() { + // We only need to set the default if there is a status property supplied, and it is not already set + if (this.defaultStatus == null && StringUtils.hasLength(getExternalResourceManagementValidationStatusPropertyName())) { + if (getExternalResourceManagementValidationStatusDefaultValue() != null) { + // If a default property name does exist then use it + this.defaultStatus = MetadataResourceExternalManagementProperties.ValidationStatus.valueOf(getExternalResourceManagementValidationStatusDefaultValue()); + } else { + // Otherwise let's default to incomplete. + // Reason - as the administrator decided to use the status, it most likely means that there are extra properties that need to be set after a file is uploaded so defaulting it to + // incomplete seems reasonable. + this.defaultStatus = MetadataResourceExternalManagementProperties.ValidationStatus.INCOMPLETE; + } + } + return this.defaultStatus; } @PostConstruct @@ -203,24 +273,50 @@ public void init() { // Run the setBaseFolder following to ensure the baseFolder is formatted correctly. setBaseFolder(baseFolder); + validateMetadataPropertyNames(); + + ContextBuilder builder; if (storageAccountName != null && provider != null) { builder = ContextBuilder.newBuilder(provider).credentials(storageAccountName, storageAccountKey); storageAccountName = null; storageAccountKey = null; + } else { + throw new RuntimeException("Need to supply storage account name and provider for JCloud configuration"); } + if (endpoint != null) { builder.endpoint(endpoint); } client = builder.buildView(BlobStoreContext.class); - builder = null; if (containerName == null) { throw new RuntimeException("Missing the container Name configuration"); } } + /** + * Checks if the metadata names that were supplied are correct. + * + * @throws IllegalArgumentException is any of the metadata property names are invalid. + */ + private void validateMetadataPropertyNames() throws IllegalArgumentException { + + // If provider not supplied then nothing to check. + if (this.provider == null) { + return; + } + + String[] names = { + getMetadataUUIDPropertyName(), + getExternalResourceManagementChangedDatePropertyName(), + getExternalResourceManagementValidationStatusPropertyName() + }; + + JCloudMetadataNameValidator.validateMetadataNamesForProvider(provider, names); + } + @Nonnull public BlobStoreContext getClient() { return this.client; diff --git a/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudMetadataNameValidator.java b/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudMetadataNameValidator.java new file mode 100644 index 00000000000..c9a22eceae6 --- /dev/null +++ b/datastorages/jcloud/src/main/java/org/fao/geonet/resources/JCloudMetadataNameValidator.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.resources; + +import java.util.Map; +import java.util.HashMap; +import java.util.regex.Pattern; + +import org.springframework.util.StringUtils; + +/** + * Each JCloud provider has different restrictions on the naming standard used for the metadata property names. + * This class is used to check the requirement of these headers so that we don't get obscure errors when attempting to set the metadata property names. + */ +public class JCloudMetadataNameValidator { + + public static class ProviderMetadataNamingRules { + private final String maxLength; + private final Pattern regex; + + public ProviderMetadataNamingRules(String maxLength, Pattern regex) { + this.maxLength = maxLength; + this.regex = regex; + } + + public String getMaxLength() { + return maxLength; + } + + public Pattern getRegex() { + return regex; + } + } + + // Define metadata naming rules for each provider + private static final Map<String, ProviderMetadataNamingRules> providerMetadataNamingRules = new HashMap<>(); + private static final ProviderMetadataNamingRules defaultRules = new ProviderMetadataNamingRules( + "255", + Pattern.compile("^[a-zA-Z0-9._-]{1,255}$") + ); + + // Note: All these patterns have not been tested with all providers and may need adjustments. + static { + providerMetadataNamingRules.put("aws-s3", new ProviderMetadataNamingRules( + "255", + Pattern.compile("^[a-zA-Z0-9._-]{1,255}$") + )); + + providerMetadataNamingRules.put("b2", new ProviderMetadataNamingRules( + "255", + Pattern.compile("^[a-zA-Z0-9._-]{1,255}$") + )); + + providerMetadataNamingRules.put("google-cloud-storage", new ProviderMetadataNamingRules( + "1024", + Pattern.compile("^[a-zA-Z0-9._-]{1,1024}$") + )); + + /** + * Azure blob + * https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#metadata-names + * Follows C# naming in lowercase only + */ + providerMetadataNamingRules.put("azureblob", new ProviderMetadataNamingRules( + "255", + Pattern.compile("^[a-z_][a-z0-9_]{0,254}$") + )); + + providerMetadataNamingRules.put("rackspace-cloudfiles-us", new ProviderMetadataNamingRules( + "255", + Pattern.compile("^[a-zA-Z0-9._-]{1,255}$") + )); + + providerMetadataNamingRules.put("rackspace-cloudfiles-uk", new ProviderMetadataNamingRules( + "255", + Pattern.compile("^[a-zA-Z0-9._-]{1,255}$") + )); + } + + /** + * Validates metadata names for each provider. + * + * @param provider The name of the provider. + * @param metadataNames Array of metadata names to validate. + * @throws IllegalArgumentException if any metadata name is invalid according to the provider's rules. + */ + public static void validateMetadataNamesForProvider(String provider, String[] metadataNames) throws IllegalArgumentException { + ProviderMetadataNamingRules rules = providerMetadataNamingRules.getOrDefault(provider.toLowerCase(), defaultRules); + + for (String name : metadataNames) { + if (StringUtils.hasLength(name) && !isValidMetadataName(name, rules)) { + throw new IllegalArgumentException(String.format("Invalid metadata name for provider %s: %s", provider, name)); + } + } + } + + /** + * Checks if a single metadata name is valid based on the provider's rules. + * + * @param name The metadata name to check. + * @param rules The metadata naming rules for the provider. + * @return True if the name is valid, false otherwise. + */ + private static boolean isValidMetadataName(String name, ProviderMetadataNamingRules rules) { + // Null/Empty property names are allow as it means they will not be used. + if (!StringUtils.hasLength(name)) { + return false; + } + + if (name.length() > Integer.parseInt(rules.getMaxLength())) { + return false; + } + + return rules.getRegex().matcher(name).matches(); + } +} diff --git a/datastorages/jcloud/src/main/resources/config-store/config-jcloud-overrides.properties b/datastorages/jcloud/src/main/resources/config-store/config-jcloud-overrides.properties index 5b7d183edf9..4a2bafe5b34 100644 --- a/datastorages/jcloud/src/main/resources/config-store/config-jcloud-overrides.properties +++ b/datastorages/jcloud/src/main/resources/config-store/config-jcloud-overrides.properties @@ -12,5 +12,11 @@ jcloud.external.resource.management.window.parameters=${JCLOUD_EXTERNAL_RESOURCE jcloud.external.resource.management.modal.enabled=${JCLOUD_EXTERNAL_RESOURCE_MANAGEMENT_MODAL_ENABLED:#{null}} jcloud.external.resource.management.folder.enabled=${JCLOUD_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ENABLED:#{null}} jcloud.external.resource.management.folder.root=${JCLOUD_EXTERNAL_RESOURCE_MANAGEMENT_FOLDER_ROOT:#{null}} +jcloud.external.resource.management.validation.status.property.name=${JCLOUD_EXTERNAL_RESOURCE_MANAGEMENT_VALIDATION_STATUS_PROPERTY_NAME:#{null}} +jcloud.external.resource.management.validation.status.default.value=${JCLOUD_EXTERNAL_RESOURCE_MANAGEMENT_VALIDATION_STATUS_DEFAULT_VALUE:#{null}} + +jcloud.external.resource.management.changed.date.property.name=${JCLOUD_EXTERNAL_RESOURCE_MANAGEMENT_CHANGE_DATE_PROPERTY_NAME:#{null}} jcloud.versioning.enabled=${JCLOUD_VERSIONING_ENABLED:#{null}} + +jcloud.metadata.uuid.property.name=${JCLOUD_METADATA_UUID_PROPERTY_NAME:#{null}} diff --git a/datastorages/jcloud/src/main/resources/config-store/config-jcloud.xml b/datastorages/jcloud/src/main/resources/config-store/config-jcloud.xml index 1824fb452ec..e6a43b63a16 100644 --- a/datastorages/jcloud/src/main/resources/config-store/config-jcloud.xml +++ b/datastorages/jcloud/src/main/resources/config-store/config-jcloud.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - ~ Copyright (C) 2001-2016 Food and Agriculture Organization of the + ~ Copyright (C) 2001-2024 Food and Agriculture Organization of the ~ United Nations (FAO-UN), United Nations World Food Programme (WFP) ~ and United Nations Environment Programme (UNEP) ~ @@ -50,8 +50,13 @@ <property name="externalResourceManagementModalEnabled" value="${jcloud.external.resource.management.modal.enabled}"/> <property name="externalResourceManagementFolderEnabled" value="${jcloud.external.resource.management.folder.enabled}"/> <property name="externalResourceManagementFolderRoot" value="${jcloud.external.resource.management.folder.root}"/> + <property name="externalResourceManagementValidationStatusPropertyName" value="${jcloud.external.resource.management.validation.status.property.name}"/> + <property name="externalResourceManagementValidationStatusDefaultValue" value="${jcloud.external.resource.management.validation.status.default.value}"/> + <property name="externalResourceManagementChangedDatePropertyName" value="${jcloud.external.resource.management.changed.date.property.name}"/> <property name="versioningEnabled" value="${jcloud.versioning.enabled}"/> + + <property name="metadataUUIDPropertyName" value="${jcloud.metadata.uuid.property.name}"/> </bean> <bean id="filesystemStore" class="org.fao.geonet.api.records.attachments.JCloudStore" /> <bean id="resourceStore" diff --git a/pom.xml b/pom.xml index 8e6770b471a..3ad5f9167cb 100644 --- a/pom.xml +++ b/pom.xml @@ -1280,7 +1280,7 @@ <dependency> <groupId>org.apache.jclouds</groupId> <artifactId>jclouds-all</artifactId> - <version>2.3.0</version> + <version>2.5.0</version> </dependency> <dependency> From b3f5000aceba9509ca4650bdcac4a71883a88d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Tue, 1 Oct 2024 16:17:16 +0200 Subject: [PATCH 71/97] Javascript / HTML formatting fixes related to Prettier --- .../edit/onlinesrc/OnlineSrcService.js | 24 +++++------ .../edit/onlinesrc/partials/linkToMd.html | 3 +- .../viewer/gfi/partials/featurestables.html | 10 ++--- .../wfsfilter/partials/wfsfilterfacet.html | 43 ++++++++----------- .../catalog/templates/admin/settings/ui.html | 1 - .../templates/recordView/technical.html | 4 +- 6 files changed, 40 insertions(+), 45 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js index 94ee49c926e..7755bcee53e 100644 --- a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js +++ b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcService.js @@ -265,9 +265,9 @@ linksAndRelatedPromises.push( $http.get( apiPrefix + - "/related?type=" + - relatedTypes.join("&type=") + - (!isApproved ? "&approved=false" : ""), + "/related?type=" + + relatedTypes.join("&type=") + + (!isApproved ? "&approved=false" : ""), { headers: { Accept: "application/json" @@ -281,9 +281,9 @@ linksAndRelatedPromises.push( $http.get( apiPrefix + - "/associated?type=" + - associatedTypes.join(",") + - (!isApproved ? "&approved=false" : ""), + "/associated?type=" + + associatedTypes.join(",") + + (!isApproved ? "&approved=false" : ""), { headers: { Accept: "application/json" @@ -610,8 +610,8 @@ scopedName: params.remote ? "" : params.name === qParams.name - ? "" - : qParams.name, + ? "" + : qParams.name, uuidref: qParams.uuidDS, uuid: qParams.uuidSrv, url: qParams.remote ? qParams.url : "", @@ -934,10 +934,10 @@ search: function (url, prefix, query) { return $http.get( url + - "?prefix=" + - prefix + - "&query=" + - query.replaceAll("https://doi.org/", "") + "?prefix=" + + prefix + + "&query=" + + query.replaceAll("https://doi.org/", "") ); } }; diff --git a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html index 698421f1769..71bd10acdaa 100644 --- a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html +++ b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/partials/linkToMd.html @@ -62,7 +62,8 @@ ng-disabled="!canEnableLinkButton(selectRecords)" > <i class="fa gn-icon-{{mode}}"></i> - <i class="icon-external-link"></i>  {{btn.label || ('saveLinkToSibling' | translate)}} + <i class="icon-external-link"></i>  {{btn.label || ('saveLinkToSibling' | + translate)}} </button> <div data-gn-need-help="linking-records" class="pull-right"></div> </div> diff --git a/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html b/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html index 59a2726ae30..c5643c6959f 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html +++ b/web-ui/src/main/resources/catalog/components/viewer/gfi/partials/featurestables.html @@ -63,11 +63,11 @@ data-ng-show="ctrl.currentTable == table" ng-repeat="table in ctrl.tables" > -<!-- <div class="pull-left">--> - <h4> - <span>{{table.name}}</span> - </h4> -<!-- </div>--> + <!-- <div class="pull-left">--> + <h4> + <span>{{table.name}}</span> + </h4> + <!-- </div>--> <gn-features-table gn-features-table-loader="table.loader" gn-features-table-loader-map="ctrl.map" diff --git a/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html b/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html index 98915cc5eb6..e10fd98de86 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html +++ b/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/partials/wfsfilterfacet.html @@ -18,14 +18,10 @@ <div data-ng-show="isWfsAvailable"> <!--admin buttons--> <!--Facet count--> - <h4 - data-ng-if="isFeaturesIndexed" - class="count" - data-ng-if="showCount" - > + <h4 data-ng-if="isFeaturesIndexed" class="count" data-ng-if="showCount"> {{count | number}} / {{countTotal | number}} <span translate="" - >features</span - > + >features</span + > </h4> <div class="btn-group dropup wfs-filter-group"> <button @@ -144,26 +140,23 @@ data-ng-model="ctrl.filter.fullTextSearch" /> <div class="input-group-btn"> + <button + data-ng-if="!managerOnly && isFeaturesIndexed" + data-gn-click-and-spin="resetFacets(false).then(filterWMS)" + title="{{'reset' | translate}}" + class="btn btn-default gn-reset-facets" + > + <i class="fa fa-fw fa-times"></i> + </button> - <button - data-ng-if="!managerOnly && isFeaturesIndexed" - data-gn-click-and-spin="resetFacets(false).then(filterWMS)" - title="{{'reset' | translate}}" - class="btn btn-default gn-reset-facets" - > - <i class="fa fa-fw fa-times"></i> - </button> - - <button - class="btn btn-default" - title="{{'search' | translate}}" - data-ng-click="filterFacets()" - > - <i class="fa fa-fw fa-search"></i> - </button> - + <button + class="btn btn-default" + title="{{'search' | translate}}" + data-ng-click="filterFacets()" + > + <i class="fa fa-fw fa-search"></i> + </button> </div> - </div> <button data-ng-if="!managerOnly && isFeaturesIndexed" diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html b/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html index fab8d3a89e6..b6aa5a6197a 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/ui.html @@ -69,7 +69,6 @@ </div> </div> - <!-- delete and save--> <div class="col-md-12 gn-nopadding-left gn-nopadding-right"> <div class="btn-toolbar pull-right"> diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html index 3df446c6aee..12495938b65 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html @@ -22,7 +22,9 @@ <h3>{{date.type | translate}}</h3> </ul> </section> - <div ng-include="'../../catalog/views/default/templates/recordView/maintenance.html'"></div> + <div + ng-include="'../../catalog/views/default/templates/recordView/maintenance.html'" + ></div> <div data-ng-if="mdView.current.record.serviceType" class="gn-margin-bottom flex-row"> <span class="badge badge-rounded" title="{{'serviceType' | translate}}"> From 1cc4e4201f4cd25ac8b2edbca87456d1b4ac69ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Tue, 25 Jun 2024 11:03:34 +0200 Subject: [PATCH 72/97] CSW / Fix parsing date values for filters. Fixes #8034 --- .../services/getrecords/es/CswFilter2Es.java | 7 ++++- .../getrecords/es/CswFilter2EsTest.java | 23 ++++++++++++++ .../services/getrecords/es/EsJsonHelper.java | 31 ++++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/csw-server/src/main/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2Es.java b/csw-server/src/main/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2Es.java index 2122a8c4a10..d77bfd28818 100644 --- a/csw-server/src/main/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2Es.java +++ b/csw-server/src/main/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2Es.java @@ -29,6 +29,7 @@ import org.apache.commons.text.StringEscapeUtils; import org.fao.geonet.constants.Geonet; import org.fao.geonet.kernel.csw.services.getrecords.IFieldMapper; +import org.fao.geonet.utils.DateUtil; import org.fao.geonet.utils.Log; import org.geotools.api.filter.*; import org.geotools.api.filter.expression.Expression; @@ -338,7 +339,11 @@ public Object visitRange(BinaryComparisonOperator filter, String operator, Objec String dataPropertyValue = stack.pop(); String dataPropertyName = stack.pop(); - if (!NumberUtils.isNumber(dataPropertyValue)) { + boolean isDate = (DateUtil.parseBasicOrFullDateTime(dataPropertyValue) != null); + + if (isDate) { + dataPropertyValue = CswFilter2Es.quoteString(dataPropertyValue); + } else if (!NumberUtils.isNumber(dataPropertyValue)) { dataPropertyValue = StringEscapeUtils.escapeJson(CswFilter2Es.quoteString(dataPropertyValue)); } diff --git a/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2EsTest.java b/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2EsTest.java index f8a31dabbfb..98770670563 100644 --- a/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2EsTest.java +++ b/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/CswFilter2EsTest.java @@ -381,4 +381,27 @@ void assertFilterEquals(JsonNode expected, String actual, String filterSpecVersi assertEquals(expected, MAPPER.readTree(new StringReader(result))); } + + + @Test + void testPropertyIsGreaterThanDateValue() throws IOException { + + // INPUT: + final String input = + " <ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">\n" + + " <ogc:PropertyIsGreaterThan>\n" + + " <ogc:PropertyName>Modified</ogc:PropertyName>\n" + + " <ogc:Literal>1910-02-05</ogc:Literal>\n" + + " </ogc:PropertyIsGreaterThan>\n" + + " </ogc:Filter>"; + + // EXPECTED: + final ObjectNode expected = EsJsonHelper.boolbdr(). // + must(array(range("Modified", "gt", "1910-02-05"))). // + filter(queryStringPart()). // + bld(); + + + assertFilterEquals(expected, input); + } } diff --git a/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/EsJsonHelper.java b/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/EsJsonHelper.java index 629247c8825..f727509808a 100644 --- a/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/EsJsonHelper.java +++ b/csw-server/src/test/java/org/fao/geonet/kernel/csw/services/getrecords/es/EsJsonHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2023 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * @@ -62,6 +62,35 @@ public static ObjectNode match(String property, String matchString) { return outer; } + + /** + * Returns a structure like + * + * <pre> + * { "range": + * { + * "gt": "value" + * } + * </pre> + * + * @param property + * @param operator + * @param matchString + * @return + */ + public static ObjectNode range(String property, String operator, String matchString) { + final ObjectNode rangeOperatorObject = MAPPER.createObjectNode(); + rangeOperatorObject.put(operator, matchString); + + final ObjectNode rangeObject = MAPPER.createObjectNode(); + rangeObject.put(property, rangeOperatorObject); + + final ObjectNode outer = MAPPER.createObjectNode(); + outer.set("range", rangeObject); + return outer; + } + + private static ArrayNode bound(double x, double y) { final ArrayNode bound = MAPPER.createArrayNode(); bound.add(x); From 8471646c1591263e16b6581b8bba30e83ef47192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Tue, 4 Jun 2024 10:14:42 +0200 Subject: [PATCH 73/97] Standard / ISO19115-3 / Only search for associated record with UUID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sources or feature catalogue reference may be described using description or uuidref. Do not consider text description while searching for associated records. eg. ```xml <mdb:resourceLineage > <mrl:LI_Lineage> <mrl:source> <mrl:LI_Source> <mrl:description xsi:type="lan:PT_FreeText_PropertyType"> <gco:CharacterString>Le référentiel utilisé comme trait de côte est celui de Ifremer-Shom au 1/25 000 (date de révision 1995).</gco:CharacterString> ``` This is not really visible but avoid to do search with an empty id in `MetadataUtils#getAssociated` --- .../schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java b/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java index 9673820efdd..403f1037946 100644 --- a/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java +++ b/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java @@ -181,7 +181,7 @@ public Set<String> getAssociatedFeatureCatalogueUUIDs(Element metadata) { @Override public Set<AssociatedResource> getAssociatedFeatureCatalogues(Element metadata) { - return collectAssociatedResources(metadata, "*//mrc:featureCatalogueCitation[@uuidref]"); + return collectAssociatedResources(metadata, "*//mrc:featureCatalogueCitation[@uuidref != '']"); } public Set<String> getAssociatedSourceUUIDs(Element metadata) { @@ -193,7 +193,7 @@ public Set<String> getAssociatedSourceUUIDs(Element metadata) { @Override public Set<AssociatedResource> getAssociatedSources(Element metadata) { - return collectAssociatedResources(metadata, "*//mrl:source"); + return collectAssociatedResources(metadata, "*//mrl:source[@uuidref != '']"); } private Set<AssociatedResource> collectAssociatedResources(Element metadata, String xpath) { From 2df2bb1a64e10831b499f82bf75d540ab060f573 Mon Sep 17 00:00:00 2001 From: Francois Prunayre <fx.prunayre@gmail.com> Date: Tue, 4 Jun 2024 14:08:13 +0200 Subject: [PATCH 74/97] Thesaurus / Add inScheme property in concept of local thesaurus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GeoNetwork local thesaurus may be exposed in third party apps. In GeoNetwork, a thesaurus file contains one `conceptScheme` with a set of `concept`. When combining multiple files into an RDF graph the link between concept and scheme may be required. This changes add the `skos:inScheme` property to each concepts (https://www.w3.org/TR/skos-reference/skos.html#inScheme). ```xml <rdf:Description rdf:about="https://vocab.ifremer.fr/scheme/SXT/type_jeux_donnee/b64f008f-5e3f-43b6-a3bd-8ae291056305"> <rdf:type rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/> <ns2:prefLabel xml:lang="en">/Administrative data</ns2:prefLabel> <ns2:prefLabel xml:lang="fr">/Données administratives</ns2:prefLabel> <ns2:inScheme rdf:resource="https://vocab.ifremer.fr/scheme/SXT/type_jeux_donnee"> </rdf:Description> ``` It does not change existing thesaurus. Funded by Ifremer --- .../java/org/fao/geonet/kernel/Thesaurus.java | 251 +++++++++--------- 1 file changed, 129 insertions(+), 122 deletions(-) diff --git a/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java b/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java index 91a506b57ab..a9f2d57230f 100644 --- a/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java +++ b/core/src/main/java/org/fao/geonet/kernel/Thesaurus.java @@ -121,7 +121,7 @@ public class Thesaurus { // map of lang -> dictionary of values // key is a dublinCore element (i.e. https://guides.library.ucsc.edu/c.php?g=618773&p=4306386) // see #retrieveDublinCore() for example - private Map<String, Map<String,String>> dublinCoreMultilingual = new Hashtable<>(); + private Map<String, Map<String, String>> dublinCoreMultilingual = new Hashtable<>(); private Cache<String, Object> THESAURUS_SEARCH_CACHE; @@ -133,14 +133,15 @@ protected Thesaurus() { } /** - * @param fname file name - * @param dname category/domain name of thesaurus + * @param fname file name + * @param dname category/domain name of thesaurus * @param thesaurusCacheMaxSize */ public Thesaurus(IsoLanguagesMapper isoLanguageMapper, String fname, String type, String dname, Path thesaurusFile, String siteUrl, int thesaurusCacheMaxSize) { this(isoLanguageMapper, fname, null, null, type, dname, thesaurusFile, siteUrl, false, thesaurusCacheMaxSize); } + public Thesaurus(IsoLanguagesMapper isoLanguageMapper, String fname, String tname, String tnamespace, String type, String dname, Path thesaurusFile, String siteUrl, boolean ignoreMissingError, int thesaurusCacheMaxSize) { this(isoLanguageMapper, fname, null, null, null, type, dname, thesaurusFile, siteUrl, false, thesaurusCacheMaxSize); } @@ -152,9 +153,9 @@ public Thesaurus(IsoLanguagesMapper isoLanguageMapper, String fname, super(); THESAURUS_SEARCH_CACHE = CacheBuilder.newBuilder() - .maximumSize(thesaurusCacheMaxSize) - .expireAfterAccess(25, TimeUnit.HOURS) - .build(); + .maximumSize(thesaurusCacheMaxSize) + .expireAfterAccess(25, TimeUnit.HOURS) + .build(); this.isoLanguageMapper = isoLanguageMapper; this.fname = fname; @@ -193,7 +194,6 @@ public Thesaurus(IsoLanguagesMapper isoLanguageMapper, String fname, } /** - * * @param fname * @param type * @param dname @@ -211,7 +211,7 @@ public Map<String, String> getMultilingualTitles() { return Collections.unmodifiableMap(this.multilingualTitles); } - public Map<String,Map<String, String>> getDublinCoreMultilingual() { + public Map<String, Map<String, String>> getDublinCoreMultilingual() { return Collections.unmodifiableMap(this.dublinCoreMultilingual); } @@ -332,7 +332,7 @@ public synchronized Thesaurus initRepository() throws ConfigurationException, IO SailConfig syncSail = new SailConfig("org.openrdf.sesame.sailimpl.sync.SyncRdfSchemaRepository"); SailConfig memSail = new org.openrdf.sesame.sailimpl.memory.RdfSchemaRepositoryConfig(getFile().toString(), - RDFFormat.RDFXML); + RDFFormat.RDFXML); repConfig.addSail(syncSail); repConfig.addSail(memSail); repConfig.setWorldReadable(true); @@ -344,7 +344,7 @@ public synchronized Thesaurus initRepository() throws ConfigurationException, IO } public synchronized QueryResultsTable performRequest(String query) throws IOException, MalformedQueryException, - QueryEvaluationException, AccessDeniedException { + QueryEvaluationException, AccessDeniedException { if (Log.isDebugEnabled(Geonet.THESAURUS)) Log.debug(Geonet.THESAURUS, "Query : " + query); @@ -354,15 +354,15 @@ public synchronized QueryResultsTable performRequest(String query) throws IOExce public boolean hasConceptScheme(String uri) { String query = "SELECT conceptScheme" - + " FROM {conceptScheme} rdf:type {skos:ConceptScheme}" - + " WHERE conceptScheme = <" + uri + ">" - + " USING NAMESPACE skos = <http://www.w3.org/2004/02/skos/core#>"; + + " FROM {conceptScheme} rdf:type {skos:ConceptScheme}" + + " WHERE conceptScheme = <" + uri + ">" + + " USING NAMESPACE skos = <http://www.w3.org/2004/02/skos/core#>"; try { return performRequest(query).getRowCount() > 0; } catch (Exception e) { Log.error(Geonet.THESAURUS_MAN, - String.format("Error retrieving concept scheme for %s. Error is: %s", thesaurusFile, e.getMessage())); + String.format("Error retrieving concept scheme for %s. Error is: %s", thesaurusFile, e.getMessage())); throw new RuntimeException(e); } } @@ -370,8 +370,8 @@ public boolean hasConceptScheme(String uri) { public List<String> getConceptSchemes() { String query = "SELECT conceptScheme" - + " FROM {conceptScheme} rdf:type {skos:ConceptScheme}" - + " USING NAMESPACE skos = <http://www.w3.org/2004/02/skos/core#>"; + + " FROM {conceptScheme} rdf:type {skos:ConceptScheme}" + + " USING NAMESPACE skos = <http://www.w3.org/2004/02/skos/core#>"; try { List<String> ret = new ArrayList<>(); @@ -383,7 +383,7 @@ public List<String> getConceptSchemes() { return ret; } catch (Exception e) { Log.error(Geonet.THESAURUS_MAN, String.format( - "Error retrieving concept schemes for %s. Error is: %s", thesaurusFile, e.getMessage())); + "Error retrieving concept schemes for %s. Error is: %s", thesaurusFile, e.getMessage())); return Collections.emptyList(); } } @@ -406,34 +406,28 @@ public synchronized URI addElement(KeywordBean keyword) throws IOException, Acce URI mySubject = myFactory.createURI(keyword.getUriCode()); URI skosClass = myFactory.createURI(SKOS_NAMESPACE, "Concept"); + URI rdfType = myFactory.createURI(org.openrdf.vocabulary.RDF.TYPE); + mySubject.addProperty(rdfType, skosClass); + URI predicatePrefLabel = myFactory - .createURI(SKOS_NAMESPACE, "prefLabel"); + .createURI(SKOS_NAMESPACE, "prefLabel"); URI predicateScopeNote = myFactory - .createURI(SKOS_NAMESPACE, "scopeNote"); - - URI predicateBoundedBy = myFactory.createURI(namespaceGml, "BoundedBy"); - URI predicateEnvelope = myFactory.createURI(namespaceGml, "Envelope"); - URI predicateSrsName = myFactory.createURI(namespaceGml, "srsName"); - URI srsNameURI = myFactory - .createURI("http://www.opengis.net/gml/srs/epsg.xml#epsg:4326"); - BNode gmlNode = myFactory.createBNode(); - URI predicateLowerCorner = myFactory.createURI(namespaceGml, - "lowerCorner"); - URI predicateUpperCorner = myFactory.createURI(namespaceGml, - "upperCorner"); - - Literal lowerCorner = myFactory.createLiteral(keyword.getCoordWest() + " " + keyword.getCoordSouth()); - Literal upperCorner = myFactory.createLiteral(keyword.getCoordEast() + " " + keyword.getCoordNorth()); + .createURI(SKOS_NAMESPACE, "scopeNote"); + + URI predicateInScheme = myFactory + .createURI(SKOS_NAMESPACE, "inScheme"); + myGraph.add(mySubject, + predicateInScheme, + myFactory.createURI(this.getDefaultNamespace())); - mySubject.addProperty(rdfType, skosClass); Set<Entry<String, String>> values = keyword.getValues().entrySet(); for (Entry<String, String> entry : values) { String language = toiso639_1_Lang(entry.getKey()); Value valueObj = myFactory.createLiteral(entry.getValue(), language); myGraph.add(mySubject, predicatePrefLabel, valueObj); - } + Set<Entry<String, String>> definitions = keyword.getDefinitions().entrySet(); for (Entry<String, String> entry : definitions) { String language = toiso639_1_Lang(entry.getKey()); @@ -441,12 +435,29 @@ public synchronized URI addElement(KeywordBean keyword) throws IOException, Acce myGraph.add(mySubject, predicateScopeNote, definitionObj); } - myGraph.add(mySubject, predicateBoundedBy, gmlNode); - gmlNode.addProperty(rdfType, predicateEnvelope); - myGraph.add(gmlNode, predicateLowerCorner, lowerCorner); - myGraph.add(gmlNode, predicateUpperCorner, upperCorner); - myGraph.add(gmlNode, predicateSrsName, srsNameURI); + if (!(keyword.getCoordEast() + keyword.getCoordNorth() + keyword.getCoordWest() + keyword.getCoordSouth()).trim().isEmpty()) { + URI predicateBoundedBy = myFactory.createURI(namespaceGml, "BoundedBy"); + URI predicateEnvelope = myFactory.createURI(namespaceGml, "Envelope"); + URI predicateSrsName = myFactory.createURI(namespaceGml, "srsName"); + URI srsNameURI = myFactory + .createURI("http://www.opengis.net/gml/srs/epsg.xml#epsg:4326"); + BNode gmlNode = myFactory.createBNode(); + URI predicateLowerCorner = myFactory.createURI(namespaceGml, + "lowerCorner"); + URI predicateUpperCorner = myFactory.createURI(namespaceGml, + "upperCorner"); + + Literal lowerCorner = myFactory.createLiteral(keyword.getCoordWest() + " " + keyword.getCoordSouth()); + Literal upperCorner = myFactory.createLiteral(keyword.getCoordEast() + " " + keyword.getCoordNorth()); + + myGraph.add(mySubject, predicateBoundedBy, gmlNode); + + gmlNode.addProperty(rdfType, predicateEnvelope); + myGraph.add(gmlNode, predicateLowerCorner, lowerCorner); + myGraph.add(gmlNode, predicateUpperCorner, upperCorner); + myGraph.add(gmlNode, predicateSrsName, srsNameURI); + } repository.addGraph(myGraph); return mySubject; @@ -485,7 +496,7 @@ public synchronized Thesaurus removeElement(String uri) throws AccessDeniedExcep } private Thesaurus removeElement(Graph myGraph, URI subject) - throws AccessDeniedException { + throws AccessDeniedException { StatementIterator iter = myGraph.getStatements(subject, null, null); while (iter.hasNext()) { AtomicReference<Statement> st = new AtomicReference<Statement>(iter.next()); @@ -504,8 +515,8 @@ private Thesaurus removeElement(Graph myGraph, URI subject) private String toiso639_1_Lang(String lang) { String defaultCode = getIsoLanguageMapper().iso639_2_to_iso639_1( - Geonet.DEFAULT_LANGUAGE, - Geonet.DEFAULT_LANGUAGE.substring(0, 2)); + Geonet.DEFAULT_LANGUAGE, + Geonet.DEFAULT_LANGUAGE.substring(0, 2)); return getIsoLanguageMapper().iso639_2_to_iso639_1(lang, defaultCode); } @@ -548,15 +559,14 @@ public synchronized URI updateElement(KeywordBean keyword, boolean replace) thro String language = toiso639_1_Lang(entry.getKey()); Value valueObj = myFactory.createLiteral(entry.getValue(), language); myGraph.add(subject, predicatePrefLabel, valueObj); - } + // add updated Definitions/Notes Set<Entry<String, String>> definitions = keyword.getDefinitions().entrySet(); for (Entry<String, String> entry : definitions) { String language = toiso639_1_Lang(entry.getKey()); Value definitionObj = myFactory.createLiteral(entry.getValue(), language); myGraph.add(subject, predicateScopeNote, definitionObj); - } // update bbox @@ -677,7 +687,7 @@ public synchronized Thesaurus updateCode(String namespace, String oldcode, Strin /** * Update concept code using its URI. This is recommended when concept identifier may not be * based on thesaurus namespace and does not contains #. - * + * <p> * eg. http://vocab.nerc.ac.uk/collection/P07/current/CFV13N44/ */ public synchronized Thesaurus updateCodeByURI(String olduri, String newuri) throws AccessDeniedException { @@ -729,13 +739,13 @@ public void createConceptScheme(String thesaurusTitle, Graph myGraph = new org.openrdf.model.impl.GraphImpl(); writeConceptScheme(myGraph, - thesaurusTitle, - multilingualTitles, - thesaurusDescription, - multilingualDescriptions, - identifier, - type, - namespace); + thesaurusTitle, + multilingualTitles, + thesaurusDescription, + multilingualDescriptions, + identifier, + type, + namespace); repository.addGraph(myGraph); } @@ -755,13 +765,13 @@ public void updateConceptScheme(String thesaurusTitle, removeElement(getConceptSchemes().get(0)); writeConceptScheme(myGraph, - thesaurusTitle, - multilingualTitles, - thesaurusDescription, - multilingualDescriptions, - identifier, - type, - namespace); + thesaurusTitle, + multilingualTitles, + thesaurusDescription, + multilingualDescriptions, + identifier, + type, + namespace); } public void writeConceptScheme(Graph myGraph, String thesaurusTitle, @@ -823,9 +833,6 @@ public void writeConceptScheme(Graph myGraph, String thesaurusTitle, } - - - private void addElement(String name, String value, Graph myGraph, ValueFactory myFactory, URI mySubject) { if (StringUtils.isNotEmpty(value)) { URI uri = myFactory.createURI(DC_NAMESPACE, name); @@ -861,22 +868,22 @@ private void addElement(String name, String value, Graph myGraph, ValueFactory m private void retrieveDublinCore(Element thesaurusEl) { List<Namespace> theNSs = getThesaurusNamespaces(); - Namespace xmlNS = Namespace.getNamespace("xml","http://www.w3.org/XML/1998/namespace"); + Namespace xmlNS = Namespace.getNamespace("xml", "http://www.w3.org/XML/1998/namespace"); try { List<Element> multiLingualTitles = (List<Element>) Xml.selectNodes(thesaurusEl, - "skos:ConceptScheme/dc:*[@xml:lang]|skos:ConceptScheme/dcterms:*[@xml:lang]", theNSs); + "skos:ConceptScheme/dc:*[@xml:lang]|skos:ConceptScheme/dcterms:*[@xml:lang]", theNSs); dublinCoreMultilingual.clear(); - for (Element el: multiLingualTitles) { + for (Element el : multiLingualTitles) { String lang = isoLanguageMapper.iso639_2_to_iso639_1(el.getAttribute("lang", xmlNS).getValue()); String value = el.getTextTrim(); String name = el.getName(); if (!dublinCoreMultilingual.containsKey(lang)) { - dublinCoreMultilingual.put(lang,new HashMap<>()); + dublinCoreMultilingual.put(lang, new HashMap<>()); } - dublinCoreMultilingual.get(lang).put(name,value); + dublinCoreMultilingual.get(lang).put(name, value); } } catch (Exception e) { - Log.warning(Geonet.THESAURUS,"error extracting multilingual dublin core items from thesaurus",e); + Log.warning(Geonet.THESAURUS, "error extracting multilingual dublin core items from thesaurus", e); } } @@ -896,14 +903,14 @@ private void retrieveDublinCore(Element thesaurusEl) { private void retrieveMultiLingualTitles(Element thesaurusEl) { try { String xpathTitles = "skos:ConceptScheme/dc:title[@xml:lang]" + - "|skos:ConceptScheme/dcterms:title[@xml:lang]" + - "|skos:ConceptScheme/rdfs:label[@xml:lang]" + - "|skos:ConceptScheme/skos:prefLabel[@xml:lang]" + - "|rdf:Description[rdf:type/@rdf:resource = 'http://www.w3.org/2004/02/skos/core#ConceptScheme']/dc:title[@xml:lang]"; + "|skos:ConceptScheme/dcterms:title[@xml:lang]" + + "|skos:ConceptScheme/rdfs:label[@xml:lang]" + + "|skos:ConceptScheme/skos:prefLabel[@xml:lang]" + + "|rdf:Description[rdf:type/@rdf:resource = 'http://www.w3.org/2004/02/skos/core#ConceptScheme']/dc:title[@xml:lang]"; multilingualTitles.clear(); multilingualTitles.putAll(retrieveMultilingualField(thesaurusEl, xpathTitles)); } catch (Exception e) { - Log.warning(Geonet.THESAURUS,"error extracting multilingual titles from thesaurus",e); + Log.warning(Geonet.THESAURUS, "error extracting multilingual titles from thesaurus", e); } } @@ -913,19 +920,19 @@ private void retrieveMultiLingualDescriptions(Element thesaurusEl) { multilingualDescriptions.clear(); multilingualDescriptions.putAll(retrieveMultilingualField(thesaurusEl, xpathDescriptions)); } catch (Exception e) { - Log.warning(Geonet.THESAURUS,"error extracting multilingual descriptions from thesaurus",e); + Log.warning(Geonet.THESAURUS, "error extracting multilingual descriptions from thesaurus", e); } } private Map<String, String> retrieveMultilingualField(Element thesaurusEl, String xpath) throws JDOMException { List<Namespace> theNSs = getThesaurusNamespaces(); - Namespace xmlNS = Namespace.getNamespace("xml","http://www.w3.org/XML/1998/namespace"); + Namespace xmlNS = Namespace.getNamespace("xml", "http://www.w3.org/XML/1998/namespace"); Map<String, String> multilingualValues = new HashMap<>(); List<Element> multilingualValuesEl = (List<Element>) Xml.selectNodes(thesaurusEl, - xpath, theNSs); - for (Element el: multilingualValuesEl) { + xpath, theNSs); + for (Element el : multilingualValuesEl) { String lang = isoLanguageMapper.iso639_2_to_iso639_1(el.getAttribute("lang", xmlNS).getValue()); String titleValue = el.getTextTrim(); multilingualValues.put(lang, titleValue); @@ -936,7 +943,7 @@ private Map<String, String> retrieveMultilingualField(Element thesaurusEl, Strin /** * Retrieves the thesaurus information from rdf file. - * + * <p> * Used to set the thesaurusName and thesaurusDate for keywords. */ private void retrieveThesaurusInformation(Path thesaurusFile, String defaultTitle, boolean ignoreMissingError) { @@ -956,25 +963,25 @@ private void retrieveThesaurusInformation(Path thesaurusFile, String defaultTitl retrieveDublinCore(thesaurusEl); Element titleEl = Xml.selectElement(thesaurusEl, - "skos:ConceptScheme/dc:title|skos:ConceptScheme/dcterms:title" + - "|skos:ConceptScheme/rdfs:label|skos:ConceptScheme/skos:prefLabel" + - "|skos:Collection/dc:title|skos:Collection/dcterms:title" + - "|rdf:Description/dc:title|rdf:Description/dcterms:title", theNSs); + "skos:ConceptScheme/dc:title|skos:ConceptScheme/dcterms:title" + + "|skos:ConceptScheme/rdfs:label|skos:ConceptScheme/skos:prefLabel" + + "|skos:Collection/dc:title|skos:Collection/dcterms:title" + + "|rdf:Description/dc:title|rdf:Description/dcterms:title", theNSs); if (titleEl != null) { this.title = titleEl.getValue(); this.defaultNamespace = titleEl - .getParentElement() - .getAttributeValue("about", Namespace.getNamespace("rdf", RDF_NAMESPACE)); + .getParentElement() + .getAttributeValue("about", Namespace.getNamespace("rdf", RDF_NAMESPACE)); } else { this.title = defaultTitle; this.defaultNamespace = DEFAULT_THESAURUS_NAMESPACE; } Element descriptionEl = Xml.selectElement(thesaurusEl, - "skos:ConceptScheme/dc:description|skos:ConceptScheme/dcterms:description|" + - "skos:Collection/dc:description|skos:Collection/dcterms:description|" + - "rdf:Description/dc:description|rdf:Description/dcterms:description", theNSs); + "skos:ConceptScheme/dc:description|skos:ConceptScheme/dcterms:description|" + + "skos:Collection/dc:description|skos:Collection/dcterms:description|" + + "rdf:Description/dc:description|rdf:Description/dcterms:description", theNSs); this.description = descriptionEl != null ? descriptionEl.getValue() : ""; @@ -987,13 +994,13 @@ private void retrieveThesaurusInformation(Path thesaurusFile, String defaultTitl } Element issuedDateEl = Xml.selectElement(thesaurusEl, "skos:ConceptScheme/dcterms:issued", theNSs); - this.issuedDate = issuedDateEl==null? "": issuedDateEl.getText(); + this.issuedDate = issuedDateEl == null ? "" : issuedDateEl.getText(); Element modifiedDateEl = Xml.selectElement(thesaurusEl, "skos:ConceptScheme/dcterms:modified", theNSs); - this.modifiedDate = modifiedDateEl==null? "": modifiedDateEl.getText(); + this.modifiedDate = modifiedDateEl == null ? "" : modifiedDateEl.getText(); Element createdDateEl = Xml.selectElement(thesaurusEl, "skos:ConceptScheme/dcterms:created", theNSs); - this.createdDate = createdDateEl==null? "": createdDateEl.getText(); + this.createdDate = createdDateEl == null ? "" : createdDateEl.getText(); // Default date Element dateEl = Xml.selectElement(thesaurusEl, "skos:ConceptScheme/dcterms:issued|skos:Collection/dc:date", theNSs); @@ -1031,12 +1038,12 @@ private void retrieveThesaurusInformation(Path thesaurusFile, String defaultTitl if (Log.isDebugEnabled(Geonet.THESAURUS_MAN)) { Log.debug(Geonet.THESAURUS_MAN, String.format( - "Thesaurus information: %s (%s)", this.title, this.date)); + "Thesaurus information: %s (%s)", this.title, this.date)); } } catch (Exception ex) { if (!ignoreMissingError) Log.error(Geonet.THESAURUS_MAN, String.format( - "Error getting thesaurus info for %s. Error is: %s", thesaurusFile, ex.getMessage())); + "Error getting thesaurus info for %s. Error is: %s", thesaurusFile, ex.getMessage())); } } @@ -1137,9 +1144,9 @@ public KeywordBean getKeyword(String uri, String... languages) { try { Query<KeywordBean> query = QueryBuilder - .keywordQueryBuilder(getIsoLanguageMapper(), languages) - .where(Wheres.ID(uri)) - .build(); + .keywordQueryBuilder(getIsoLanguageMapper(), languages) + .where(Wheres.ID(uri)) + .build(); keywords = query.execute(this); } catch (Exception e) { @@ -1165,9 +1172,9 @@ public List<KeywordBean> getTopConcepts(String... languages) { try { Query<KeywordBean> query = QueryBuilder - .keywordQueryBuilder(getIsoLanguageMapper(), languages) - .select(Selectors.TOPCONCEPTS, true) - .build(); + .keywordQueryBuilder(getIsoLanguageMapper(), languages) + .select(Selectors.TOPCONCEPTS, true) + .build(); keywords = query.execute(this); } catch (Exception e) { @@ -1235,9 +1242,9 @@ public boolean hasBroader(String uri) { */ public List<KeywordBean> getRelated(String uri, KeywordRelation request, String... languages) { Query<KeywordBean> query = QueryBuilder - .keywordQueryBuilder(getIsoLanguageMapper(), languages) - .select(Selectors.related(uri, request), true) - .build(); + .keywordQueryBuilder(getIsoLanguageMapper(), languages) + .select(Selectors.related(uri, request), true) + .build(); try { return query.execute(this); @@ -1272,9 +1279,9 @@ public boolean hasKeywordWithLabel(String label, String langCode) { */ public KeywordBean getKeywordWithLabel(String label, String langCode) { Query<KeywordBean> query = QueryBuilder - .keywordQueryBuilder(getIsoLanguageMapper(), langCode) - .where(Wheres.prefLabel(langCode, label)) - .build(); + .keywordQueryBuilder(getIsoLanguageMapper(), langCode) + .where(Wheres.prefLabel(langCode, label)) + .build(); List<KeywordBean> matchingKeywords; @@ -1304,7 +1311,7 @@ public Map<String, String> getTitles(ApplicationContext context) throws JDOMExce return LangUtils.translate(context, getKey()); } - public List <String> getKeywordHierarchy(String keywordLabel, String langCode) { + public List<String> getKeywordHierarchy(String keywordLabel, String langCode) { String cacheKey = "getKeywordHierarchy" + keywordLabel + langCode; Object cacheValue = THESAURUS_SEARCH_CACHE.getIfPresent(cacheKey); if (cacheValue != null) { @@ -1312,26 +1319,26 @@ public List <String> getKeywordHierarchy(String keywordLabel, String langCode) { } boolean isUri = keywordLabel.startsWith("http"); KeywordBean term = - isUri - ? this.getKeyword(keywordLabel, langCode) - : this.getKeywordWithLabel(keywordLabel, langCode); + isUri + ? this.getKeyword(keywordLabel, langCode) + : this.getKeywordWithLabel(keywordLabel, langCode); - List<ArrayList <KeywordBean>> result = this.classify(term, langCode); + List<ArrayList<KeywordBean>> result = this.classify(term, langCode); - List <String> hierarchies = new ArrayList<>(); - for ( List <KeywordBean> hierachy : result) { + List<String> hierarchies = new ArrayList<>(); + for (List<KeywordBean> hierachy : result) { String path = hierachy.stream() - .map(k -> isUri ? k.getUriCode() : k.getPreferredLabel(langCode)) - .collect(Collectors.joining("^")); + .map(k -> isUri ? k.getUriCode() : k.getPreferredLabel(langCode)) + .collect(Collectors.joining("^")); hierarchies.add(path); } THESAURUS_SEARCH_CACHE.put(cacheKey, hierarchies); return hierarchies; } - public List<ArrayList <KeywordBean>> classify(KeywordBean term, String langCode) { + public List<ArrayList<KeywordBean>> classify(KeywordBean term, String langCode) { - List<ArrayList <KeywordBean>> result = new ArrayList<>(); + List<ArrayList<KeywordBean>> result = new ArrayList<>(); if (this.hasBroader(term.getUriCode())) { result.addAll(classifyTermWithBroaderTerms(term, langCode)); } else { @@ -1340,16 +1347,16 @@ public List<ArrayList <KeywordBean>> classify(KeywordBean term, String langCode) return result; } - private List<ArrayList <KeywordBean>> classifyTermWithBroaderTerms(KeywordBean term, String langCode) { - List<ArrayList <KeywordBean>> result = new ArrayList<>(); - for (ArrayList <KeywordBean> stringToBroaderTerm : classifyBroaderTerms(term, langCode)) { + private List<ArrayList<KeywordBean>> classifyTermWithBroaderTerms(KeywordBean term, String langCode) { + List<ArrayList<KeywordBean>> result = new ArrayList<>(); + for (ArrayList<KeywordBean> stringToBroaderTerm : classifyBroaderTerms(term, langCode)) { stringToBroaderTerm.add(term); result.add(stringToBroaderTerm); } return result; } - private List<ArrayList <KeywordBean>> classifyBroaderTerms(KeywordBean term, String langCode) { + private List<ArrayList<KeywordBean>> classifyBroaderTerms(KeywordBean term, String langCode) { List<ArrayList<KeywordBean>> result = new ArrayList<>(); List<KeywordBean> narrowerList = this.getNarrower(term.getUriCode(), langCode); for (KeywordBean broaderTerm : this.getBroader(term.getUriCode(), langCode)) { @@ -1361,8 +1368,8 @@ private List<ArrayList <KeywordBean>> classifyBroaderTerms(KeywordBean term, Str return result; } - private ArrayList <KeywordBean> classifyTermWithNoBroaderTerms(KeywordBean term) { - ArrayList <KeywordBean> list = new ArrayList <>(); + private ArrayList<KeywordBean> classifyTermWithNoBroaderTerms(KeywordBean term) { + ArrayList<KeywordBean> list = new ArrayList<>(); list.add(term); return list; } From 9228e4acd684445f17c21475b4f6a540200ee59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 10 Oct 2024 11:00:22 +0200 Subject: [PATCH 75/97] Editor / Table mode / Fix field using directive (#8261) * Editor / Table mode / Fix field using directive eg. when using thesaurus for a field in a table, the field was not displayed. ```xml <tableFields> <table fieldset="false" for="mac:MI_Instrument"> <header> <col label="mac:MI_Instrument"/> <col label="mac:MI_Platform"/> <col/> </header> <row> <col xpath="mac:identifier/*/mcc:code" use="data-gn-keyword-picker"> <directiveAttributes data-thesaurus-key="local.theme.cersat_sensor"/> </col> <col xpath="mac:mountedOn/*/mac:identifier/*/mcc:code" use="data-gn-keyword-picker"> <directiveAttributes data-thesaurus-key="local.theme.cersat_platform"/> </col> <col del=".."/> </row> </table> ``` Follow up of https://github.com/geonetwork/core-geonetwork/pull/8016 * Editor / Table mode / Fix field using directive / Review comment. --- web/src/main/webapp/xslt/ui-metadata/form-builder.xsl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/src/main/webapp/xslt/ui-metadata/form-builder.xsl b/web/src/main/webapp/xslt/ui-metadata/form-builder.xsl index c37260a275d..6426cb3de27 100644 --- a/web/src/main/webapp/xslt/ui-metadata/form-builder.xsl +++ b/web/src/main/webapp/xslt/ui-metadata/form-builder.xsl @@ -1770,6 +1770,14 @@ <xsl:choose> <xsl:when test="@use != ''"> <xsl:copy-of select="@use|directiveAttributes"/> + + <xsl:if test="@xpath != ''"> + <saxon:call-template name="{concat('evaluate-', $schema)}"> + <xsl:with-param name="base" select="$base"/> + <xsl:with-param name="in" + select="concat('/', @xpath)"/> + </saxon:call-template> + </xsl:if> </xsl:when> <xsl:when test="@del != ''"> <xsl:attribute name="remove" select="'true'"/> From 8f9cfa970e8527c4b656b13ad79d5cb02cc2c8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 10 Oct 2024 11:00:52 +0200 Subject: [PATCH 76/97] Map / Save your map improvements (#8155) * Map / Save your map improvements * Save your map create ISO19115-3 records (and can create ISO19139) * Distribution panel / Add a map section * Fix icon for map resource type in facet and record view * Indexing / Set only one resource type for records categorized as a map (map was also categorized as dataset). A map is an ISO record with * presentation form = mapDigital * format:PDF = static map * format:OWS-C = interactive map Index change: * resourceType `map/interactive` is now `map-interactive` * resourceType `map/static` is now `map-static` * Map / Save your map / Generate map overview by default * Map / Save your map improvements / Translations. --- .../config/associated-panel/default.json | 53 ++ .../convert/fromOGCWMC-OR-OWSC.xsl | 633 ++++++++++++++++++ .../iso19115-3.2018/index-fields/index.xsl | 20 + .../iso19115-3.2018/layout/config-editor.xml | 18 +- .../OGCWMC-OR-OWSC-to-ISO19139.xsl | 86 +-- .../OGCWMCtoISO19139/identification.xsl | 49 +- .../plugin/iso19139/index-fields/index.xsl | 28 +- .../api/records/MetadataInsertDeleteApi.java | 17 +- .../WEB-INF/classes/web-ui-wro-sources.xml | 2 - .../components/viewer/ViewerDirective.js | 2 +- .../viewer/owscontext/OwsContextDirective.js | 73 +- .../SearchLayerForMapDirective.js | 2 +- .../resources/catalog/js/CatController.js | 3 +- .../lib/dom-to-image/dom-to-image.min.js | 2 - .../resources/catalog/locales/en-editor.json | 3 + .../resources/catalog/style/gn_icons.less | 8 +- .../resources/catalog/views/default/module.js | 2 +- .../webapp/xslt/base-layout-cssjs-loader.xsl | 1 - 18 files changed, 854 insertions(+), 148 deletions(-) create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromOGCWMC-OR-OWSC.xsl delete mode 100644 web-ui/src/main/resources/catalog/lib/dom-to-image/dom-to-image.min.js diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/config/associated-panel/default.json b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/config/associated-panel/default.json index b37adf61088..8b05cb3f205 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/config/associated-panel/default.json +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/config/associated-panel/default.json @@ -799,6 +799,59 @@ } } }, + { + "group": "onlineUseMap", + "label": "map-interactive", + "copyLabel": "name", + "sources": { + "filestore": true + }, + "fileStoreFilter": "*.{xml,XML}", + "icon": "fa fa-map", + "process": "onlinesrc-add", + "fields": { + "url": { + "isMultilingual": false + }, + "name": {}, + "function": { + "value": "browsing", + "hidden": true, + "isMultilingual": false + }, + "protocol": { + "value": "OGC:OWS-C", + "hidden": true, + "isMultilingual": false + } + } + }, + { + "group": "onlineUseMap", + "label": "map-static", + "copyLabel": "name", + "sources": { + "filestore": true + }, + "fileStoreFilter": "*.{pdf,PDF}", + "icon": "fa fa-map", + "process": "onlinesrc-add", + "fields": { + "url": { + "isMultilingual": false + }, + "name": {}, + "function": { + "value": "browsing", + "hidden": true, + "isMultilingual": false + }, + "protocol": { + "value": "PDF:MAP", + "isMultilingual": false + } + } + }, { "group": "onlineUseLegend", "label": "onlineUseLegendLYR", diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromOGCWMC-OR-OWSC.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromOGCWMC-OR-OWSC.xsl new file mode 100644 index 00000000000..d3ccc7c62b1 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromOGCWMC-OR-OWSC.xsl @@ -0,0 +1,633 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:wmc="http://www.opengis.net/context" + xmlns:wmc11="http://www.opengeospatial.net/context" + xmlns:ows-context="http://www.opengis.net/ows-context" + xmlns:ows="http://www.opengis.net/ows" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" + xmlns:mds="http://standards.iso.org/iso/19115/-3/mds/2.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:mdt="http://standards.iso.org/iso/19115/-3/mdt/2.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:java="java:org.fao.geonet.util.XslUtil" + xmlns:saxon="http://saxon.sf.net/" + version="2.0" + exclude-result-prefixes="#all"> + + <xsl:param name="uuid"></xsl:param> + <xsl:param name="lang">eng</xsl:param> + <xsl:param name="topic"></xsl:param> + <xsl:param name="viewer_url"></xsl:param> + <xsl:param name="title"></xsl:param> + <xsl:param name="abstract"></xsl:param> + <xsl:param name="map_url"></xsl:param> + + <!-- These are provided by the ImportWmc.java jeeves service --> + <xsl:param name="currentuser_name"></xsl:param> + <xsl:param name="currentuser_phone"></xsl:param> + <xsl:param name="currentuser_mail"></xsl:param> + <xsl:param name="currentuser_org"></xsl:param> + + + <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> + + <xsl:variable name="df">[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]</xsl:variable> + + <xsl:variable name="isOws" select="count(//ows-context:OWSContext) > 0"/> + + <xsl:template match="/"> + <xsl:apply-templates/> + </xsl:template> + + + <xsl:template match="wmc:ViewContext|wmc11:ViewContext|ows-context:OWSContext"> + <mdb:MD_Metadata + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mda="http://standards.iso.org/iso/19115/-3/mda/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" + xmlns:mds="http://standards.iso.org/iso/19115/-3/mds/2.0" + xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mdt="http://standards.iso.org/iso/19115/-3/mdt/2.0" + xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" + xmlns:mpc="http://standards.iso.org/iso/19115/-3/mpc/1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" + xmlns:mac="http://standards.iso.org/iso/19115/-3/mac/2.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:gfc="http://standards.iso.org/iso/19110/gfc/1.1" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.0" + xmlns:dqm="http://standards.iso.org/iso/19157/-2/dqm/1.0" + xmlns:gml="http://www.opengis.net/gml/3.2" + xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mas="http://standards.iso.org/iso/19115/-3/mas/1.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" + xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + > + <mdb:metadataIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString> + <xsl:value-of select="$uuid"/> + </gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </mdb:metadataIdentifier> + + <mdb:defaultLocale> + <lan:PT_Locale id="{upper-case(java:twoCharLangCode($lang))}"> + <lan:language> + <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="{$lang}"/> + </lan:language> + <lan:characterEncoding> + <lan:MD_CharacterSetCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_CharacterSetCode" + codeListValue="utf8"/> + </lan:characterEncoding> + </lan:PT_Locale> + </mdb:defaultLocale> + + <mdb:metadataScope> + <mdb:MD_MetadataScope> + <mdb:resourceScope> + <mcc:MD_ScopeCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" + codeListValue="document"/> + </mdb:resourceScope> + <mdb:name xsi:type="lan:PT_FreeText_PropertyType"> + <gco:CharacterString>map</gco:CharacterString> + </mdb:name> + </mdb:MD_MetadataScope> + </mdb:metadataScope> + + <xsl:for-each select="wmc:General/wmc:ContactInformation| + wmc11:General/wmc11:ContactInformation| + ows-context:General/ows:ServiceProvider"> + <mdb:contact> + <cit:CI_Responsibility> + <xsl:apply-templates select="." mode="RespParty"/> + </cit:CI_Responsibility> + </mdb:contact> + </xsl:for-each> + + <!-- Assign a specific user with the info provided by the webservice --> + <xsl:if test="$currentuser_name != ''"> + <mdb:contact> + <xsl:call-template name="build-current-user"/> + </mdb:contact> + </xsl:if> + + <mdb:dateInfo> + <cit:CI_Date> + <cit:date> + <gco:DateTime> + <xsl:value-of select="format-dateTime(current-dateTime(), $df)"/> + </gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" + codeListValue="creation"/> + </cit:dateType> + </cit:CI_Date> + </mdb:dateInfo> + + <mdb:metadataStandard> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString>ISO 19115-3</gco:CharacterString> + </cit:title> + </cit:CI_Citation> + </mdb:metadataStandard> + + <mdb:referenceSystemInfo> + <mrs:MD_ReferenceSystem> + <mrs:referenceSystemIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString> + <xsl:value-of select=" + wmc:General/wmc:BoundingBox/@SRS| + wmc11:General/wmc11:BoundingBox/@SRS| + ows-context:General/ows:BoundingBox/@crs"/> + </gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </mrs:referenceSystemIdentifier> + </mrs:MD_ReferenceSystem> + </mdb:referenceSystemInfo> + + + <mdb:identificationInfo> + <mri:MD_DataIdentification> + <xsl:apply-templates select="." mode="DataIdentification"> + <xsl:with-param name="topic"> + <xsl:value-of select="$topic"/> + </xsl:with-param> + <xsl:with-param name="lang"> + <xsl:value-of select="$lang"/> + </xsl:with-param> + </xsl:apply-templates> + </mri:MD_DataIdentification> + </mdb:identificationInfo> + + <mdb:distributionInfo> + <mrd:MD_Distribution> + <mrd:distributionFormat> + <mrd:MD_Format> + <mrd:formatSpecificationCitation> + <cit:CI_Citation> + <cit:title xsi:type="lan:PT_FreeText_PropertyType"> + <gco:CharacterString>OGC:OWS-C</gco:CharacterString> + </cit:title> + </cit:CI_Citation> + </mrd:formatSpecificationCitation> + </mrd:MD_Format> + </mrd:distributionFormat> + <mrd:transferOptions> + <mrd:MD_DigitalTransferOptions> + + <!-- Add link to the map --> + <xsl:if test="$map_url != ''"> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="$map_url"/> + </gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString> + <xsl:value-of select="if ($isOws) then 'OGC:OWS-C' else 'OGC:WMC'"/> + </gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString> + <xsl:value-of + select="wmc:General/wmc:Title|wmc11:General/wmc11:Title|ows-context:General/ows:Title"/> + </gco:CharacterString> + </cit:name> + <cit:function> + <cit:CI_OnLineFunctionCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" + codeListValue="browsing"/> + </cit:function> + </cit:CI_OnlineResource> + </mrd:onLine> + </xsl:if> + + <!-- --> + <xsl:if test="$viewer_url != ''"> + <mrd:onLine> + <mrd:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="$viewer_url"/> + </gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:LINK</gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="wmc:General/wmc:Title| + wmc11:General/wmc11:Title| + ows-context:General/ows:Title"/> + </gco:CharacterString> + </cit:name> + <cit:function> + <cit:CI_OnLineFunctionCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" + codeListValue="browsing"/> + </cit:function> + </mrd:CI_OnlineResource> + </mrd:onLine> + </xsl:if> + + <xsl:for-each + select="wmc:LayerList/wmc:Layer|ows-context:ResourceList/ows-context:Layer"> + <mrd:onLine> + <!-- iterates over the layers --> + <!-- Only first URL is used --> + <xsl:variable name="layerUrl" + select="wmc:Server/wmc:OnlineResource/@xlink:href| + ows-context:Server[1]/ows-context:OnlineResource[1]/@xlink:href"/> + <!-- service="urn:ogc:serviceType:WMS">--> + <xsl:variable name="layerName" select="wmc:Name/text()|@name"/> + <xsl:variable name="layerTitle" select="wmc:Title/text()|ows:Title/text()"/> + <xsl:variable name="layerVersion" select="wmc:Server/@version"/> + <xsl:variable name="layerProtocol" + select="if (ows:Server/@service) then ows:Server/@service else 'OGC:WMS'"/> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="$layerUrl"/> + </gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString> + <xsl:value-of select="$layerProtocol"/> + </gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="$layerName"/> + </gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString> + <xsl:value-of select="$layerTitle"/> + </gco:CharacterString> + </cit:description> + </cit:CI_OnlineResource> + </mrd:onLine> + </xsl:for-each> + </mrd:MD_DigitalTransferOptions> + </mrd:transferOptions> + </mrd:MD_Distribution> + </mdb:distributionInfo> + + <mdb:resourceLineage> + <mrl:LI_Lineage> + <mrl:statement gco:nilReason="missing"> + <gco:CharacterString/> + </mrl:statement> + <mrl:scope> + <mcc:MD_Scope> + <mcc:level> + <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" + codeListValue="dataset"/> + </mcc:level> + </mcc:MD_Scope> + </mrl:scope> + <xsl:for-each + select="wmc:LayerList/wmc:Layer|ows-context:ResourceList/ows-context:Layer"> + <!-- Would be good to add link to metadata using uuidref="" --> + <mrl:source + xlink:href="{wmc:MetadataURL/wmc:OnlineResource/@xlink:href| + ows-context:MetadataURL/ows-context:OnlineResource/@xlink:href}"/> + </xsl:for-each> + </mrl:LI_Lineage> + </mdb:resourceLineage> + </mdb:MD_Metadata> + </xsl:template> + + + <xsl:template match="wmc:BoundingBox|ows:BoundingBox" + mode="BoundingBox"> + <xsl:variable name="minx" + select="if (ows:LowerCorner) then tokenize(ows:LowerCorner, ' ')[1] else string(./@minx)"/> + <xsl:variable name="miny" + select="if (ows:LowerCorner) then tokenize(ows:LowerCorner, ' ')[2] else string(./@miny)"/> + <xsl:variable name="maxx" + select="if (ows:UpperCorner) then tokenize(ows:UpperCorner, ' ')[1] else string(./@maxx)"/> + <xsl:variable name="maxy" + select="if (ows:UpperCorner) then tokenize(ows:UpperCorner, ' ')[2] else string(./@maxy)"/> + <xsl:variable name="fromEpsg" select="if (@crs) then string(@crs) else string(./@SRS)"/> + <xsl:variable name="reprojected" + select="java:reprojectCoords($minx,$miny,$maxx,$maxy,$fromEpsg)"/> + <xsl:variable name="bbox" select="saxon:parse($reprojected)"/> + <xsl:if test="$bbox"> + <gex:westBoundLongitude> + <gco:Decimal> + <xsl:value-of select="$bbox//*:westBoundLongitude/*:Decimal/text()"/> + </gco:Decimal> + </gex:westBoundLongitude> + <gex:eastBoundLongitude> + <gco:Decimal> + <xsl:value-of select="$bbox//*:eastBoundLongitude/*:Decimal/text() "/> + </gco:Decimal> + </gex:eastBoundLongitude> + <gex:southBoundLatitude> + <gco:Decimal> + <xsl:value-of select="$bbox//*:southBoundLatitude/*:Decimal/text()"/> + </gco:Decimal> + </gex:southBoundLatitude> + <gex:northBoundLatitude> + <gco:Decimal> + <xsl:value-of select="$bbox//*:northBoundLatitude/*:Decimal/text()"/> + </gco:Decimal> + </gex:northBoundLatitude> + </xsl:if> + </xsl:template> + + + <xsl:template match="*" mode="DataIdentification"> + <mri:citation> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString> + <xsl:value-of select="if ($title) then $title else wmc:General/wmc:Title| + wmc11:General/wmc11:Title| + ows-context:General/ows:Title"/> + </gco:CharacterString> + </cit:title> + <!-- date is mandatory --> + <cit:date> + <cit:CI_Date> + <cit:date> + <gco:DateTime> + <xsl:value-of select="format-dateTime(current-dateTime(),$df)"/> + </gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeListValue="publication" + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode"/> + </cit:dateType> + </cit:CI_Date> + </cit:date> + + <cit:presentationForm> + <cit:CI_PresentationFormCode codeListValue="mapDigital" + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_PresentationFormCode" + /> + </cit:presentationForm> + </cit:CI_Citation> + </mri:citation> + + <mri:abstract> + <gco:CharacterString> + <xsl:value-of select="if ($abstract) + then $abstract + else wmc:General/wmc:Abstract| + wmc11:General/wmc11:Abstract| + ows-context:General/ows:Abstract"/> + </gco:CharacterString> + </mri:abstract> + + <mri:status> + <mcc:MD_ProgressCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ProgressCode" + codeListValue="completed"/> + </mri:status> + + <xsl:for-each select="wmc:General/wmc:ContactInformation| + wmc11:General/wmc11:ContactInformation| + ows-context:General/ows:ServiceProvider"> + <mri:pointOfContact> + <cit:CI_Responsibility> + <xsl:apply-templates select="." mode="RespParty"/> + </cit:CI_Responsibility> + </mri:pointOfContact> + </xsl:for-each> + + <xsl:if test="$currentuser_name != ''"> + <mri:pointOfContact> + <xsl:call-template name="build-current-user"/> + </mri:pointOfContact> + </xsl:if> + + <mri:topicCategory> + <mri:MD_TopicCategoryCode> + <xsl:value-of select="$topic"/> + </mri:MD_TopicCategoryCode> + </mri:topicCategory> + + <!-- extracts the extent (if not 4326, need to reproject) --> + <gex:extent> + <gex:EX_Extent> + <gex:geographicElement> + <gex:EX_GeographicBoundingBox> + <xsl:apply-templates select=".//*:BoundingBox" + mode="BoundingBox"/> + </gex:EX_GeographicBoundingBox> + </gex:geographicElement> + </gex:EX_Extent> + </gex:extent> + + <xsl:for-each select="wmc:General/wmc:KeywordList| + wmc11:General/wmc11:KeywordList| + ows-context:General/ows:Keywords"> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <xsl:apply-templates select="." mode="Keywords"/> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + </xsl:for-each> + + <mri:defaultLocale> + <lan:PT_Locale> + <lan:language> + <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="{$lang}"/> + </lan:language> + <lan:characterEncoding> + <lan:MD_CharacterSetCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_CharacterSetCode" + codeListValue="utf8"/> + </lan:characterEncoding> + </lan:PT_Locale> + </mri:defaultLocale> + </xsl:template> + + + <xsl:template match="*" mode="Keywords"> + <xsl:for-each select=".//*:Keyword"> + <mri:keyword> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mri:keyword> + </xsl:for-each> + <mri:type> + <mri:MD_KeywordTypeCode codeList="./resources/codeList.xml#MD_KeywordTypeCode" + codeListValue="theme"/> + </mri:type> + </xsl:template> + + + <xsl:template match="*" mode="RespParty"> + <cit:role> + <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" + codeListValue="{if (ows:ServiceContact/ows:Role) then ows:ServiceContact/ows:Role else 'pointOfContact'}"/> + </cit:role> + <cit:party> + <cit:CI_Organisation> + + <xsl:for-each select="wmc:ContactPersonPrimary/wmc:ContactOrganization| + wmc11:ContactPersonPrimary/wmc11:ContactOrganization| + ../ows:ProviderName">"> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:name> + </xsl:for-each> + + <xsl:for-each select="wmc:ContactAddress|wmc11:ContactAddress|ows:ContactInfo/ows:Address"> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + + <xsl:for-each select="*:Address"> + <cit:deliveryPoint> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:deliveryPoint> + </xsl:for-each> + + <xsl:for-each select="*:City"> + <cit:city> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:city> + </xsl:for-each> + + <xsl:for-each select="*:StateOrProvince"> + <cit:administrativeArea> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:administrativeArea> + </xsl:for-each> + + <xsl:for-each select="*:PostCode"> + <cit:postalCode> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:postalCode> + </xsl:for-each> + + <xsl:for-each select="*:Country"> + <cit:country> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:country> + </xsl:for-each> + + <xsl:for-each select="*:eMailAdd|ows:electronMailAddress"> + <cit:electronicMailAddress> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:electronicMailAddress> + </xsl:for-each> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + </xsl:for-each> + + + <xsl:for-each select="wmc:ContactPersonPrimary/wmc:ContactPerson| + wmc11:ContactPersonPrimary/wmc11:ContactPerson| + ows:ServiceContact/ows:IndividualName"> + <cit:individual> + <cit:CI_Individual> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:name> + </cit:CI_Individual> + </cit:individual> + </xsl:for-each> + </cit:CI_Organisation> + </cit:party> + </xsl:template> + + <xsl:template name="build-current-user"> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" + codeListValue="author"/> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="$currentuser_org"/> + </gco:CharacterString> + </cit:name> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + <cit:electronicMailAddress> + <gco:CharacterString> + <xsl:value-of select="$currentuser_mail"/> + </gco:CharacterString> + </cit:electronicMailAddress> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + <cit:individual> + <cit:CI_Individual> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="$currentuser_name"/> + </gco:CharacterString> + </cit:name> + <cit:positionName gco:nilReason="missing" + xsi:type="lan:PT_FreeText_PropertyType"> + <gco:CharacterString/> + </cit:positionName> + </cit:CI_Individual> + </cit:individual> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl index 9d67f38bac0..f73136cc9e0 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/index-fields/index.xsl @@ -240,11 +240,31 @@ and exists(mdb:contentInfo/*/mrc:featureCatalogue)" as="xs:boolean"/> + <xsl:variable name="isMapDigital" + select="count(mdb:identificationInfo/*/mri:citation/*/cit:presentationForm[*/@codeListValue = 'mapDigital']) > 0"/> + <xsl:variable name="isStatic" + select="count(mdb:distributionInfo/*/mrd:distributionFormat/*/mrd:formatSpecificationCitation/*/cit:title/*[contains(., 'PDF') or contains(., 'PNG') or contains(., 'JPEG')]) > 0"/> + <xsl:variable name="isInteractive" + select="count(mdb:distributionInfo/*/mrd:distributionFormat/*/mrd:formatSpecificationCitation/*/cit:title/*[contains(., 'OGC:WMC') or contains(., 'OGC:OWS-C')]) > 0"/> + <xsl:variable name="isPublishedWithWMCProtocol" + select="count(mdb:distributionInfo/*/mrd:transferOptions/*/mrd:onLine/*/cit:protocol[starts-with(gco:CharacterString, 'OGC:WMC')]) > 0"/> + <xsl:if test="$isOnlyFeatureCatalog"> <resourceType>featureCatalog</resourceType> </xsl:if> <xsl:choose> + <xsl:when test="$isMapDigital and + ($isStatic or $isInteractive or $isPublishedWithWMCProtocol)"> + <xsl:choose> + <xsl:when test="$isStatic"> + <resourceType>map-static</resourceType> + </xsl:when> + <xsl:when test="$isInteractive or $isPublishedWithWMCProtocol"> + <resourceType>map-interactive</resourceType> + </xsl:when> + </xsl:choose> + </xsl:when> <xsl:when test="$isDataset"> <resourceType>dataset</resourceType> </xsl:when> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/config-editor.xml b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/config-editor.xml index 9562c719939..e017378389d 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/config-editor.xml +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/layout/config-editor.xml @@ -640,13 +640,17 @@ title: 'download', filter: 'protocol:OGC:WFS|OGC:WCS|.*DOWNLOAD.*|DB:.*|FILE:.*|OGC API Features|OGC API Coverages', editActions: ['addOnlinesrc#onlineDownload|localNetwork'] + }, { + title: 'map', + filter: 'protocol:OGC:OWS-C|PDF:MAP', + editActions: ['addOnlinesrc#onlineUseMap'] }, { title: 'mapLegend', filter: 'function:legend', editActions: ['addOnlinesrc#onlineUseLegend'] }, { title: 'links', - filter:'-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.* AND -function:legend|featureCatalogue|dataQualityReport', + filter:'-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.*|PDF:MAP AND -function:legend|featureCatalogue|dataQualityReport', editActions: ['addOnlinesrc#links'] }, { title: 'quality', @@ -743,13 +747,17 @@ title: 'download', filter: 'protocol:OGC:WFS|OGC:WCS|.*DOWNLOAD.*|DB:.*|FILE:.*|OGC API Features|OGC API Coverages', editActions: ['addOnlinesrc#onlineDownload|localNetwork'] + }, { + title: 'map', + filter: 'protocol:OGC:OWS-C|PDF:MAP', + editActions: ['addOnlinesrc#onlineUseMap'] }, { title: 'mapLegend', filter: 'function:legend', editActions: ['addOnlinesrc#onlineUseLegend'] }, { title: 'links', - filter:'-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.* AND -function:legend|featureCatalogue|dataQualityReport', + filter:'-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.*|PDF:MAP AND -function:legend|featureCatalogue|dataQualityReport', editActions: ['addOnlinesrc#links'] }, { title: 'quality', @@ -876,13 +884,17 @@ title: 'download', filter: 'protocol:OGC:WFS|OGC:WCS|.*DOWNLOAD.*|DB:.*|FILE:.*|OGC API Features|OGC API Coverages', editActions: ['addOnlinesrc#onlineDownload|localNetwork'] + }, { + title: 'map', + filter: 'protocol:OGC:OWS-C|PDF:MAP', + editActions: ['addOnlinesrc#onlineUseMap'] }, { title: 'mapLegend', filter: 'function:legend', editActions: ['addOnlinesrc#onlineUseLegend'] }, { title: 'links', - filter:'-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.* AND -function:legend|featureCatalogue|dataQualityReport', + filter:'-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.*|PDF:MAP AND -function:legend|featureCatalogue|dataQualityReport', editActions: ['addOnlinesrc#links'] }, { title: 'quality', diff --git a/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/OGCWMC-OR-OWSC-to-ISO19139.xsl b/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/OGCWMC-OR-OWSC-to-ISO19139.xsl index 9d5eb8d5384..6753f9c1f82 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/OGCWMC-OR-OWSC-to-ISO19139.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/OGCWMC-OR-OWSC-to-ISO19139.xsl @@ -45,9 +45,8 @@ <!-- <fileIdentifier/> Will be set by UFO --> <gmd:language> - <gco:CharacterString> - <xsl:value-of select="$lang"/> - </gco:CharacterString> + <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" + codeListValue="{$lang}"/> <!-- English is default. Not available in Web Map Context or OWS. Selected by user from GUI --> </gmd:language> @@ -75,45 +74,7 @@ <!-- Assign a specific user with the info provided by the webservice --> <xsl:if test="$currentuser_name != ''"> <gmd:contact> - <gmd:CI_ResponsibleParty> - <gmd:individualName> - <gco:CharacterString> - <xsl:value-of select="$currentuser_name"/> - </gco:CharacterString> - </gmd:individualName> - <gmd:organisationName> - <gco:CharacterString> - <xsl:value-of select="$currentuser_org"/> - </gco:CharacterString> - </gmd:organisationName> - <gmd:contactInfo> - <gmd:CI_Contact> - <!--<gmd:phone> - <gmd:CI_Telephone> - <gmd:voice> - <gco:CharacterString> - <xsl:value-of select="$currentuser_phone" /> - </gco:CharacterString> - </gmd:voice> - </gmd:CI_Telephone> - </gmd:phone>--> - <gmd:address> - <gmd:CI_Address> - <gmd:electronicMailAddress> - <gco:CharacterString> - <xsl:value-of select="$currentuser_mail"/> - </gco:CharacterString> - </gmd:electronicMailAddress> - </gmd:CI_Address> - </gmd:address> - </gmd:CI_Contact> - </gmd:contactInfo> - <gmd:role> - <gmd:CI_RoleCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode" - codeListValue="author"/> - </gmd:role> - </gmd:CI_ResponsibleParty> + <xsl:call-template name="build-current-user"/> </gmd:contact> </xsl:if> @@ -318,4 +279,45 @@ <xsl:copy-of select="saxon:parse($reprojected)"/> </xsl:template> + <xsl:template name="build-current-user"> + <gmd:CI_ResponsibleParty> + <gmd:individualName> + <gco:CharacterString> + <xsl:value-of select="$currentuser_name"/> + </gco:CharacterString> + </gmd:individualName> + <gmd:organisationName> + <gco:CharacterString> + <xsl:value-of select="$currentuser_org"/> + </gco:CharacterString> + </gmd:organisationName> + <gmd:contactInfo> + <gmd:CI_Contact> + <!--<gmd:phone> + <gmd:CI_Telephone> + <gmd:voice> + <gco:CharacterString> + <xsl:value-of select="$currentuser_phone" /> + </gco:CharacterString> + </gmd:voice> + </gmd:CI_Telephone> + </gmd:phone>--> + <gmd:address> + <gmd:CI_Address> + <gmd:electronicMailAddress> + <gco:CharacterString> + <xsl:value-of select="$currentuser_mail"/> + </gco:CharacterString> + </gmd:electronicMailAddress> + </gmd:CI_Address> + </gmd:address> + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode" + codeListValue="author"/> + </gmd:role> + </gmd:CI_ResponsibleParty> + </xsl:template> </xsl:stylesheet> diff --git a/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/identification.xsl b/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/identification.xsl index 49a8f59750c..0e07348d910 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/identification.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/convert/OGCWMCtoISO19139/identification.xsl @@ -22,7 +22,6 @@ ows-context:General/ows:Title"/> </gco:CharacterString> </gmd:title> - <!-- date is mandatory --> <gmd:date> <gmd:CI_Date> <gmd:date> @@ -70,50 +69,10 @@ <xsl:if test="$currentuser_name != ''"> <gmd:pointOfContact> - <gmd:CI_ResponsibleParty> - <gmd:individualName> - <gco:CharacterString> - <xsl:value-of select="$currentuser_name"/> - </gco:CharacterString> - </gmd:individualName> - <gmd:organisationName> - <gco:CharacterString> - <xsl:value-of select="$currentuser_org"/> - </gco:CharacterString> - </gmd:organisationName> - <gmd:contactInfo> - <gmd:CI_Contact> - <!--<gmd:phone> - <gmd:CI_Telephone> - <gmd:voice> - <gco:CharacterString> - <xsl:value-of select="$currentuser_phone" /> - </gco:CharacterString> - </gmd:voice> - </gmd:CI_Telephone> - </gmd:phone>--> - <gmd:address> - <gmd:CI_Address> - <gmd:electronicMailAddress> - <gco:CharacterString> - <xsl:value-of select="$currentuser_mail"/> - </gco:CharacterString> - </gmd:electronicMailAddress> - </gmd:CI_Address> - </gmd:address> - </gmd:CI_Contact> - </gmd:contactInfo> - <gmd:role> - <gmd:CI_RoleCode - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode" - codeListValue="author"/> - </gmd:role> - </gmd:CI_ResponsibleParty> + <xsl:call-template name="build-current-user"/> </gmd:pointOfContact> </xsl:if> - <!-- TODO: add graphic overview --> - <xsl:for-each select="wmc:General/wmc:KeywordList| wmc11:General/wmc11:KeywordList| ows-context:General/ows:Keywords"> @@ -128,13 +87,11 @@ <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="{$lang}"/> </gmd:language> - <gmd:topicCategory> <gmd:MD_TopicCategoryCode> <xsl:value-of select="$topic"/> </gmd:MD_TopicCategoryCode> </gmd:topicCategory> - </xsl:template> @@ -151,7 +108,5 @@ <gmd:MD_KeywordTypeCode codeList="./resources/codeList.xml#MD_KeywordTypeCode" codeListValue="theme"/> </gmd:type> - </xsl:template> - -</xsl:stylesheet> +</xsl:stylesheet> \ No newline at end of file diff --git a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl index b38d4b12a0d..6f711e96804 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/index-fields/index.xsl @@ -192,19 +192,6 @@ </xsl:for-each> <!-- # Resource type --> - <xsl:choose> - <xsl:when test="$isDataset"> - <resourceType>dataset</resourceType> - </xsl:when> - <xsl:otherwise> - <xsl:for-each select="gmd:hierarchyLevel/*/@codeListValue[normalize-space(.) != '']"> - <resourceType> - <xsl:value-of select="."/> - </resourceType> - </xsl:for-each> - </xsl:otherwise> - </xsl:choose> - <xsl:variable name="isMapDigital" select="count(gmd:identificationInfo/*/gmd:citation/*/gmd:presentationForm[*/@codeListValue = 'mapDigital']) > 0"/> <xsl:variable name="isStatic" @@ -217,16 +204,25 @@ <xsl:choose> <xsl:when test="$isDataset and $isMapDigital and ($isStatic or $isInteractive or $isPublishedWithWMCProtocol)"> - <resourceType>map</resourceType> <xsl:choose> <xsl:when test="$isStatic"> - <resourceType>map/static</resourceType> + <resourceType>map-static</resourceType> </xsl:when> <xsl:when test="$isInteractive or $isPublishedWithWMCProtocol"> - <resourceType>map/interactive</resourceType> + <resourceType>map-interactive</resourceType> </xsl:when> </xsl:choose> </xsl:when> + <xsl:when test="$isDataset"> + <resourceType>dataset</resourceType> + </xsl:when> + <xsl:otherwise> + <xsl:for-each select="gmd:hierarchyLevel/*/@codeListValue[normalize-space(.) != '']"> + <resourceType> + <xsl:value-of select="."/> + </resourceType> + </xsl:for-each> + </xsl:otherwise> </xsl:choose> diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java index 8204995874d..ad25403313c 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataInsertDeleteApi.java @@ -708,6 +708,9 @@ public SimpleMetadataProcessingReport insertOgcMapContextFile( @Parameter(description = "Publish record.", required = false) @RequestParam(required = false, defaultValue = "false") final boolean publishToAll, @Parameter(description = API_PARAM_RECORD_UUID_PROCESSING, required = false) @RequestParam(required = false, defaultValue = "NOTHING") final MEFLib.UuidAction uuidProcessing, @Parameter(description = API_PARAM_RECORD_GROUP, required = false) @RequestParam(required = false) final String group, + @Parameter(description = "Schema", required = false) + @RequestParam(required = false, defaultValue = "iso19139") + final String schema, HttpServletRequest request) throws Exception { if (StringUtils.isEmpty(xml) && StringUtils.isEmpty(url)) { throw new IllegalArgumentException("A context as XML or a remote URL MUST be provided."); @@ -718,12 +721,17 @@ public SimpleMetadataProcessingReport insertOgcMapContextFile( } ServiceContext context = ApiUtils.createServiceContext(request); - Path styleSheetWmc = dataDirectory.getXsltConversion("schema:iso19139:convert/fromOGCWMC-OR-OWSC"); + Path styleSheetWmc = dataDirectory.getXsltConversion( + String.format("schema:%s:convert/fromOGCWMC-OR-OWSC", + schema)); FilePathChecker.verify(filename); + String uuid = UUID.randomUUID().toString(); + // Convert the context in an ISO19139 records Map<String, Object> xslParams = new HashMap<>(); + xslParams.put("uuid", uuid); xslParams.put("viewer_url", viewerUrl); xslParams.put("map_url", url); xslParams.put("topic", topic); @@ -749,7 +757,6 @@ public SimpleMetadataProcessingReport insertOgcMapContextFile( // 4. Inserts the metadata (does basically the same as the metadata.insert.paste // service (see Insert.java) - String uuid = UUID.randomUUID().toString(); String date = new ISODate().toString(); SimpleMetadataProcessingReport report = new SimpleMetadataProcessingReport(); @@ -760,7 +767,7 @@ public SimpleMetadataProcessingReport insertOgcMapContextFile( md.add(transformedMd); // Import record - Importer.importRecord(uuid, uuidProcessing, md, "iso19139", 0, settingManager.getSiteId(), + Importer.importRecord(uuid, uuidProcessing, md, schema, 0, settingManager.getSiteId(), settingManager.getSiteName(), null, context, id, date, date, group, MetadataType.METADATA); final Store store = context.getBean("resourceStore", Store.class); @@ -779,7 +786,7 @@ public SimpleMetadataProcessingReport insertOgcMapContextFile( onlineSrcParams.put("name", filename); onlineSrcParams.put("desc", title); transformedMd = Xml.transform(transformedMd, - schemaManager.getSchemaDir("iso19139").resolve("process").resolve("onlinesrc-add.xsl"), + schemaManager.getSchemaDir(schema).resolve("process").resolve("onlinesrc-add.xsl"), onlineSrcParams); dataManager.updateMetadata(context, id.get(0), transformedMd, false, true, context.getLanguage(), null, true, IndexingMode.none); @@ -794,7 +801,7 @@ public SimpleMetadataProcessingReport insertOgcMapContextFile( onlineSrcParams.put("thumbnail_url", settingManager.getNodeURL() + String.format("api/records/%s/attachments/%s", uuid, overviewFilename)); transformedMd = Xml.transform(transformedMd, - schemaManager.getSchemaDir("iso19139").resolve("process").resolve("thumbnail-add.xsl"), + schemaManager.getSchemaDir(schema).resolve("process").resolve("thumbnail-add.xsl"), onlineSrcParams); dataManager.updateMetadata(context, id.get(0), transformedMd, false, true, context.getLanguage(), null, true, IndexingMode.none); diff --git a/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml b/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml index 3708d2bbf22..d65e5b19fd3 100644 --- a/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml +++ b/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml @@ -100,7 +100,6 @@ <jsSource webappPath="/catalog/lib/recaptcha/angular-recaptcha.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/geohash.js"/> <jsSource webappPath="/catalog/lib/xml2json/xml2json.min.js" minimize="false"/> - <jsSource webappPath="/catalog/lib/dom-to-image/dom-to-image.min.js" minimize="false"/> </declarative> <!-- Same as previous + olcesium --> <declarative name="lib3d" pathOnDisk="web-ui/src/main/resources"> @@ -174,6 +173,5 @@ <jsSource webappPath="/catalog/lib/recaptcha/angular-recaptcha.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/geohash.js"/> <jsSource webappPath="/catalog/lib/xml2json/xml2json.min.js" minimize="false"/> - <jsSource webappPath="/catalog/lib/dom-to-image/dom-to-image.min.js" minimize="false"/> </declarative> </sources> diff --git a/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js b/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js index 150d12bf1a4..b48ad9e2c40 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js +++ b/web-ui/src/main/resources/catalog/components/viewer/ViewerDirective.js @@ -408,7 +408,7 @@ filters: { filters: { maps: { - query_string: { query: '+resourceType:"map/interactive"' } + query_string: { query: '+resourceType:"map-interactive"' } } } } diff --git a/web-ui/src/main/resources/catalog/components/viewer/owscontext/OwsContextDirective.js b/web-ui/src/main/resources/catalog/components/viewer/owscontext/OwsContextDirective.js index c02aa5d8cac..edb386ea705 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/owscontext/OwsContextDirective.js +++ b/web-ui/src/main/resources/catalog/components/viewer/owscontext/OwsContextDirective.js @@ -45,7 +45,7 @@ filters: [ { query_string: { - query: '+resourceType:"map/interactive"' + query: '+resourceType:"map-interactive"' } } ], @@ -140,27 +140,55 @@ scope.mapFileName = getMapFileName(); scope.map.once("postrender", function (event) { - domtoimage.toPng(scope.map.getTargetElement()).then(function (data) { - // resize if necessary - var finalData = data; - - if (scaleFactor !== undefined) { - var img = new Image(); - img.src = data; - img.onload = function () { - var canvas = document.createElement("canvas"); - var size = scope.map.getSize(); - canvas.width = size[0]; - canvas.height = size[1]; - canvas - .getContext("2d") - .drawImage(img, 0, 0, canvas.width, canvas.height); - finalData = canvas.toDataURL("image/png"); - }; + var mapCanvas = document.createElement("canvas"); + var size = scope.map.getSize(); + mapCanvas.width = size[0]; + mapCanvas.height = size[1]; + var mapContext = mapCanvas.getContext("2d"); + Array.prototype.forEach.call( + scope.map + .getViewport() + .querySelectorAll(".ol-layer canvas, canvas.ol-layer"), + function (canvas) { + if (canvas.width > 0) { + var opacity = + canvas.parentNode.style.opacity || canvas.style.opacity; + mapContext.globalAlpha = opacity === "" ? 1 : Number(opacity); + var matrix; + var transform = canvas.style.transform; + if (transform) { + // Get the transform parameters from the style's transform matrix + matrix = transform + .match(/^matrix\(([^\(]*)\)$/)[1] + .split(",") + .map(Number); + } else { + matrix = [ + parseFloat(canvas.style.width) / canvas.width, + 0, + 0, + parseFloat(canvas.style.height) / canvas.height, + 0, + 0 + ]; + } + // Apply the transform to the export map context + CanvasRenderingContext2D.prototype.setTransform.apply( + mapContext, + matrix + ); + var backgroundColor = canvas.parentNode.style.backgroundColor; + if (backgroundColor) { + mapContext.fillStyle = backgroundColor; + mapContext.fillRect(0, 0, canvas.width, canvas.height); + } + mapContext.drawImage(canvas, 0, 0); + } } - - defer.resolve(finalData); - }); + ); + mapContext.globalAlpha = 1; + mapContext.setTransform(1, 0, 0, 1, 0, 0); + defer.resolve(mapCanvas.toDataURL()); }); scope.map.renderSync(); } else { @@ -208,7 +236,8 @@ title: "", recordAbstract: "", group: null, - publishToAll: false + publishToAll: false, + schema: "iso19115-3.2018" }; scope.mapProps = angular.extend({}, defaultMapProps); diff --git a/web-ui/src/main/resources/catalog/components/viewer/searchlayerformap/SearchLayerForMapDirective.js b/web-ui/src/main/resources/catalog/components/viewer/searchlayerformap/SearchLayerForMapDirective.js index 7deaaa7c25b..ed4f17c7ea5 100644 --- a/web-ui/src/main/resources/catalog/components/viewer/searchlayerformap/SearchLayerForMapDirective.js +++ b/web-ui/src/main/resources/catalog/components/viewer/searchlayerformap/SearchLayerForMapDirective.js @@ -75,7 +75,7 @@ } }; if ($scope.mode === "map") { - $scope.searchObj.params.type = "map/interactive"; + $scope.searchObj.params.type = "map-interactive"; } else { $scope.searchObj.params.linkProtocol = "OGC:WMS*"; } diff --git a/web-ui/src/main/resources/catalog/js/CatController.js b/web-ui/src/main/resources/catalog/js/CatController.js index 79b66951b47..f9ae78f9e83 100644 --- a/web-ui/src/main/resources/catalog/js/CatController.js +++ b/web-ui/src/main/resources/catalog/js/CatController.js @@ -824,7 +824,7 @@ is3DModeAllowed: false, singleTileWMS: true, isSaveMapInCatalogAllowed: true, - isExportMapAsImageEnabled: false, + isExportMapAsImageEnabled: true, isAccessible: false, storage: "sessionStorage", bingKey: "", @@ -937,6 +937,7 @@ "protocol:OGC:WFS|OGC:WCS|.*DOWNLOAD.*|DB:.*|FILE:.*|OGC API Features|OGC API Coverages", title: "download" }, + { filter: "protocol:OGC:OWS-C", title: "map" }, { filter: "function:legend", title: "mapLegend" }, { filter: "function:featureCatalogue", diff --git a/web-ui/src/main/resources/catalog/lib/dom-to-image/dom-to-image.min.js b/web-ui/src/main/resources/catalog/lib/dom-to-image/dom-to-image.min.js deleted file mode 100644 index bc73227434d..00000000000 --- a/web-ui/src/main/resources/catalog/lib/dom-to-image/dom-to-image.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! dom-to-image 10-06-2017 */ -!function(a){"use strict";function b(a,b){function c(a){return b.bgcolor&&(a.style.backgroundColor=b.bgcolor),b.width&&(a.style.width=b.width+"px"),b.height&&(a.style.height=b.height+"px"),b.style&&Object.keys(b.style).forEach(function(c){a.style[c]=b.style[c]}),a}return b=b||{},g(b),Promise.resolve(a).then(function(a){return i(a,b.filter,!0)}).then(j).then(k).then(c).then(function(c){return l(c,b.width||q.width(a),b.height||q.height(a))})}function c(a,b){return h(a,b||{}).then(function(b){return b.getContext("2d").getImageData(0,0,q.width(a),q.height(a)).data})}function d(a,b){return h(a,b||{}).then(function(a){return a.toDataURL()})}function e(a,b){return b=b||{},h(a,b).then(function(a){return a.toDataURL("image/jpeg",b.quality||1)})}function f(a,b){return h(a,b||{}).then(q.canvasToBlob)}function g(a){"undefined"==typeof a.imagePlaceholder?v.impl.options.imagePlaceholder=u.imagePlaceholder:v.impl.options.imagePlaceholder=a.imagePlaceholder,"undefined"==typeof a.cacheBust?v.impl.options.cacheBust=u.cacheBust:v.impl.options.cacheBust=a.cacheBust}function h(a,c){function d(a){var b=document.createElement("canvas");if(b.width=c.width||q.width(a),b.height=c.height||q.height(a),c.bgcolor){var d=b.getContext("2d");d.fillStyle=c.bgcolor,d.fillRect(0,0,b.width,b.height)}return b}return b(a,c).then(q.makeImage).then(q.delay(100)).then(function(b){var c=d(a);return c.getContext("2d").drawImage(b,0,0),c})}function i(a,b,c){function d(a){return a instanceof HTMLCanvasElement?q.makeImage(a.toDataURL()):a.cloneNode(!1)}function e(a,b,c){function d(a,b,c){var d=Promise.resolve();return b.forEach(function(b){d=d.then(function(){return i(b,c)}).then(function(b){b&&a.appendChild(b)})}),d}var e=a.childNodes;return 0===e.length?Promise.resolve(b):d(b,q.asArray(e),c).then(function(){return b})}function f(a,b){function c(){function c(a,b){function c(a,b){q.asArray(a).forEach(function(c){b.setProperty(c,a.getPropertyValue(c),a.getPropertyPriority(c))})}a.cssText?b.cssText=a.cssText:c(a,b)}c(window.getComputedStyle(a),b.style)}function d(){function c(c){function d(a,b,c){function d(a){var b=a.getPropertyValue("content");return a.cssText+" content: "+b+";"}function e(a){function b(b){return b+": "+a.getPropertyValue(b)+(a.getPropertyPriority(b)?" !important":"")}return q.asArray(a).map(b).join("; ")+";"}var f="."+a+":"+b,g=c.cssText?d(c):e(c);return document.createTextNode(f+"{"+g+"}")}var e=window.getComputedStyle(a,c),f=e.getPropertyValue("content");if(""!==f&&"none"!==f){var g=q.uid();b.className=b.className+" "+g;var h=document.createElement("style");h.appendChild(d(g,c,e)),b.appendChild(h)}}[":before",":after"].forEach(function(a){c(a)})}function e(){a instanceof HTMLTextAreaElement&&(b.innerHTML=a.value),a instanceof HTMLInputElement&&b.setAttribute("value",a.value)}function f(){b instanceof SVGElement&&(b.setAttribute("xmlns","http://www.w3.org/2000/svg"),b instanceof SVGRectElement&&["width","height"].forEach(function(a){var c=b.getAttribute(a);c&&b.style.setProperty(a,c)}))}return b instanceof Element?Promise.resolve().then(c).then(d).then(e).then(f).then(function(){return b}):b}return c||!b||b(a)?Promise.resolve(a).then(d).then(function(c){return e(a,c,b)}).then(function(b){return f(a,b)}):Promise.resolve()}function j(a){return s.resolveAll().then(function(b){var c=document.createElement("style");return a.appendChild(c),c.appendChild(document.createTextNode(b)),a})}function k(a){return t.inlineAll(a).then(function(){return a})}function l(a,b,c){return Promise.resolve(a).then(function(a){return a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),(new XMLSerializer).serializeToString(a)}).then(q.escapeXhtml).then(function(a){return'<foreignObject x="0" y="0" width="100%" height="100%">'+a+"</foreignObject>"}).then(function(a){return'<svg xmlns="http://www.w3.org/2000/svg" width="'+b+'" height="'+c+'">'+a+"</svg>"}).then(function(a){return"data:image/svg+xml;charset=utf-8,"+a})}function m(){function a(){var a="application/font-woff",b="image/jpeg";return{woff:a,woff2:a,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:b,jpeg:b,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml"}}function b(a){var b=/\.([^\.\/]*?)$/g.exec(a);return b?b[1]:""}function c(c){var d=b(c).toLowerCase();return a()[d]||""}function d(a){return a.search(/^(data:)/)!==-1}function e(a){return new Promise(function(b){for(var c=window.atob(a.toDataURL().split(",")[1]),d=c.length,e=new Uint8Array(d),f=0;f<d;f++)e[f]=c.charCodeAt(f);b(new Blob([e],{type:"image/png"}))})}function f(a){return a.toBlob?new Promise(function(b){a.toBlob(b)}):e(a)}function g(a,b){var c=document.implementation.createHTMLDocument(),d=c.createElement("base");c.head.appendChild(d);var e=c.createElement("a");return c.body.appendChild(e),d.href=b,e.href=a,e.href}function h(){var a=0;return function(){function b(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)}return"u"+b()+a++}}function i(a){return new Promise(function(b,c){var d=new Image;d.onload=function(){b(d)},d.onerror=c,d.src=a})}function j(a){var b=3e4;return v.impl.options.cacheBust&&(a+=(/\?/.test(a)?"&":"?")+(new Date).getTime()),new Promise(function(c){function d(){if(4===g.readyState){if(200!==g.status)return void(h?c(h):f("cannot fetch resource: "+a+", status: "+g.status));var b=new FileReader;b.onloadend=function(){var a=b.result.split(/,/)[1];c(a)},b.readAsDataURL(g.response)}}function e(){h?c(h):f("timeout of "+b+"ms occured while fetching resource: "+a)}function f(a){console.error(a),c("")}var g=new XMLHttpRequest;g.onreadystatechange=d,g.ontimeout=e,g.responseType="blob",g.timeout=b,g.open("GET",a,!0),g.send();var h;if(v.impl.options.imagePlaceholder){var i=v.impl.options.imagePlaceholder.split(/,/);i&&i[1]&&(h=i[1])}})}function k(a,b){return"data:"+b+";base64,"+a}function l(a){return a.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1")}function m(a){return function(b){return new Promise(function(c){setTimeout(function(){c(b)},a)})}}function n(a){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}function o(a){return a.replace(/#/g,"%23").replace(/\n/g,"%0A")}function p(a){var b=r(a,"border-left-width"),c=r(a,"border-right-width");return a.scrollWidth+b+c}function q(a){var b=r(a,"border-top-width"),c=r(a,"border-bottom-width");return a.scrollHeight+b+c}function r(a,b){var c=window.getComputedStyle(a).getPropertyValue(b);return parseFloat(c.replace("px",""))}return{escape:l,parseExtension:b,mimeType:c,dataAsUrl:k,isDataUrl:d,canvasToBlob:f,resolveUrl:g,getAndEncode:j,uid:h(),delay:m,asArray:n,escapeXhtml:o,makeImage:i,width:p,height:q}}function n(){function a(a){return a.search(e)!==-1}function b(a){for(var b,c=[];null!==(b=e.exec(a));)c.push(b[1]);return c.filter(function(a){return!q.isDataUrl(a)})}function c(a,b,c,d){function e(a){return new RegExp("(url\\(['\"]?)("+q.escape(a)+")(['\"]?\\))","g")}return Promise.resolve(b).then(function(a){return c?q.resolveUrl(a,c):a}).then(d||q.getAndEncode).then(function(a){return q.dataAsUrl(a,q.mimeType(b))}).then(function(c){return a.replace(e(b),"$1"+c+"$3")})}function d(d,e,f){function g(){return!a(d)}return g()?Promise.resolve(d):Promise.resolve(d).then(b).then(function(a){var b=Promise.resolve(d);return a.forEach(function(a){b=b.then(function(b){return c(b,a,e,f)})}),b})}var e=/url\(['"]?([^'"]+?)['"]?\)/g;return{inlineAll:d,shouldProcess:a,impl:{readUrls:b,inline:c}}}function o(){function a(){return b(document).then(function(a){return Promise.all(a.map(function(a){return a.resolve()}))}).then(function(a){return a.join("\n")})}function b(){function a(a){return a.filter(function(a){return a.type===CSSRule.FONT_FACE_RULE}).filter(function(a){return r.shouldProcess(a.style.getPropertyValue("src"))})}function b(a){var b=[];return a.forEach(function(a){try{q.asArray(a.cssRules||[]).forEach(b.push.bind(b))}catch(c){console.log("Error while reading CSS rules from "+a.href,c.toString())}}),b}function c(a){return{resolve:function(){var b=(a.parentStyleSheet||{}).href;return r.inlineAll(a.cssText,b)},src:function(){return a.style.getPropertyValue("src")}}}return Promise.resolve(q.asArray(document.styleSheets)).then(b).then(a).then(function(a){return a.map(c)})}return{resolveAll:a,impl:{readAll:b}}}function p(){function a(a){function b(b){return q.isDataUrl(a.src)?Promise.resolve():Promise.resolve(a.src).then(b||q.getAndEncode).then(function(b){return q.dataAsUrl(b,q.mimeType(a.src))}).then(function(b){return new Promise(function(c,d){a.onload=c,a.onerror=d,a.src=b})})}return{inline:b}}function b(c){function d(a){var b=a.style.getPropertyValue("background");return b?r.inlineAll(b).then(function(b){a.style.setProperty("background",b,a.style.getPropertyPriority("background"))}).then(function(){return a}):Promise.resolve(a)}return c instanceof Element?d(c).then(function(){return c instanceof HTMLImageElement?a(c).inline():Promise.all(q.asArray(c.childNodes).map(function(a){return b(a)}))}):Promise.resolve(c)}return{inlineAll:b,impl:{newImage:a}}}var q=m(),r=n(),s=o(),t=p(),u={imagePlaceholder:void 0,cacheBust:!1},v={toSvg:b,toPng:d,toJpeg:e,toBlob:f,toPixelData:c,impl:{fontFaces:s,images:t,util:q,inliner:r,options:{}}};"undefined"!=typeof module?module.exports=v:a.domtoimage=v}(this); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/locales/en-editor.json b/web-ui/src/main/resources/catalog/locales/en-editor.json index a9eb126f92f..a2e2ba082c7 100644 --- a/web-ui/src/main/resources/catalog/locales/en-editor.json +++ b/web-ui/src/main/resources/catalog/locales/en-editor.json @@ -236,6 +236,7 @@ "onlineUseDQReport": "Data quality report", "onlineUseDQTOR": "Data quality specification", "onlineUseDQProdReport": "Data quality production report", + "onlineUseMap": "Map", "onlineUseLegend": "Legend for the resource", "onlineUseLegendLYR": "Style for the resource for ArcGIS (LYR)", "onlineUseStyleSLD": "Style for the resource using SLD", @@ -441,6 +442,8 @@ "addOnlinesrc#API-help": "eg. view service, REST API", "addOnlinesrc#onlineDownload|localNetwork": "Add download", "addOnlinesrc#onlineDownload|localNetwork-help": "eg. file, download service, local network links", + "addOnlinesrc#onlineUseMap": "Add map", + "addOnlinesrc#onlineUseMap-help": "eg. PDF static maps or OGC Web Map Context interactive maps", "addOnlinesrc#onlineUseLegend": "Add portrayal", "addOnlinesrc#onlineUseLegend-help": "eg. LYR, QML, SLD files", "addOnlinesrc#links": "Add links", diff --git a/web-ui/src/main/resources/catalog/style/gn_icons.less b/web-ui/src/main/resources/catalog/style/gn_icons.less index 9425c45040f..6eb3ddf60f7 100644 --- a/web-ui/src/main/resources/catalog/style/gn_icons.less +++ b/web-ui/src/main/resources/catalog/style/gn_icons.less @@ -17,12 +17,12 @@ content: @fa-var-cog; } .gn-icon-map:before, +.gn-icon-map-static:before, .gn-icon-staticMap:before, -.gn-icon-maps:before { - content: @fa-var-map; -} +.gn-icon-maps:before, +.gn-icon-map-interactive:before, .gn-icon-interactiveMap:before { - content: @fa-var-globe; + content: @fa-var-map; } .gn-icon-featureCatalog:before { content: @fa-var-table; diff --git a/web-ui/src/main/resources/catalog/views/default/module.js b/web-ui/src/main/resources/catalog/views/default/module.js index 74a74fc1c7a..380d6b1ed5d 100644 --- a/web-ui/src/main/resources/catalog/views/default/module.js +++ b/web-ui/src/main/resources/catalog/views/default/module.js @@ -95,7 +95,7 @@ filters: [ { query_string: { - query: '+resourceType:"map/interactive"' + query: '+resourceType:"map-interactive"' } } ], diff --git a/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl b/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl index a06f9d6948d..aa8b2ee4a4c 100644 --- a/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl +++ b/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl @@ -200,7 +200,6 @@ <script src="{$uiResourcesPath}lib/geohash.js?v={$buildNumber}"></script> <script src="{$uiResourcesPath}lib/xml2json/xml2json.min.js?v={$buildNumber}"></script> - <script src="{$uiResourcesPath}lib/dom-to-image/dom-to-image.min.js?v={$buildNumber}"></script> </xsl:when> <xsl:otherwise> </xsl:otherwise> From 50cbfd096c289583a4773edccf928e0cbd767d12 Mon Sep 17 00:00:00 2001 From: Francois Prunayre <fx.prunayre@gmail.com> Date: Tue, 8 Oct 2024 07:59:18 +0200 Subject: [PATCH 77/97] Record view / Does not display thesaurus block if no keywords. --- .../catalog/views/default/less/gn_result_default.less | 3 +++ .../catalog/views/default/templates/recordView/technical.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less b/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less index 53c83cc4b6d..48d5ead834f 100644 --- a/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less +++ b/web-ui/src/main/resources/catalog/views/default/less/gn_result_default.less @@ -331,6 +331,9 @@ } } // keywords + .gn-thesaurus:not(:has(button)) { + display: none !important; + } [data-gn-keyword-badges] { .btn { word-break: break-word; diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html index 12495938b65..0fdc21a8737 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/technical.html @@ -62,7 +62,7 @@ <h3 data-translate="">cl_couplingType</h3> && viewConfig.internalThesaurus && viewConfig.internalThesaurus.indexOf(key) !== -1) || highlightedThesaurus.indexOf(key) === -1" - class="gn-margin-bottom flex-row" + class="gn-margin-bottom flex-row gn-thesaurus" > <span class="badge badge-rounded"> <i class="fa fa-fw fa-tags"></i> From ffe8282c432719b82a2212a2f34d2c0ee7f1fb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 10 Oct 2024 12:45:53 +0200 Subject: [PATCH 78/97] Thesaurus / OWL format / Mobility theme hierarchy (#8393) * Thesaurus / OWL format / Mobility theme hierarchy Follow up of https://github.com/geonetwork/core-geonetwork/pull/7674 Mobility DCAT theme vocabulary top concepts is available at https://mobilitydcat-ap.github.io/controlled-vocabularies/mobility-theme/latest/index.html#/ The vocabulary contains 2 top concepts: ```xml <skos:hasTopConcept rdf:resource="https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-category"/> <skos:hasTopConcept rdf:resource="https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-sub-category"/> ``` which are not really needed for browsing the main categories and sub categories. Use the narrower terms of the "content category" top concept as the top concepts of the scheme to facilitate keyword selection in editor and generate proper facet hierarchy in search. * Fix test The 2 default top concepts of the vocabulary are replaced by correct one. --- .../vocabularies/KeywordsApiTest.java | 2 +- .../xslt/services/thesaurus/owl-to-skos.xsl | 61 ++++++++++++++++--- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/services/src/test/java/org/fao/geonet/api/registries/vocabularies/KeywordsApiTest.java b/services/src/test/java/org/fao/geonet/api/registries/vocabularies/KeywordsApiTest.java index 01871cb85a0..2545a897882 100644 --- a/services/src/test/java/org/fao/geonet/api/registries/vocabularies/KeywordsApiTest.java +++ b/services/src/test/java/org/fao/geonet/api/registries/vocabularies/KeywordsApiTest.java @@ -249,6 +249,6 @@ public void testImportOntologyToSkos() throws Exception { "Mobility Theme", scheme.getChildText("title", NAMESPACE_DCT)); List concepts = thesaurus.getChildren("Concept", SKOS_NAMESPACE); - assertEquals(123, concepts.size()); + assertEquals(121, concepts.size()); } } diff --git a/web/src/main/webapp/xslt/services/thesaurus/owl-to-skos.xsl b/web/src/main/webapp/xslt/services/thesaurus/owl-to-skos.xsl index 449ee6d70d5..b7a71380331 100644 --- a/web/src/main/webapp/xslt/services/thesaurus/owl-to-skos.xsl +++ b/web/src/main/webapp/xslt/services/thesaurus/owl-to-skos.xsl @@ -24,9 +24,9 @@ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" + xmlns:terms="http://purl.org/dc/terms/" xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="2.0"> @@ -40,12 +40,38 @@ <xsl:template mode="owl-to-skos" match="owl:Ontology"> - <rdf:RDF xmlns:skos="http://www.w3.org/2004/02/skos/core#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/"> + <rdf:RDF> + <xsl:namespace name="skos" select="'http://www.w3.org/2004/02/skos/core#'"/> + <xsl:namespace name="rdf" select="'http://www.w3.org/1999/02/22-rdf-syntax-ns#'"/> + <xsl:namespace name="dc" select="'http://purl.org/dc/elements/1.1/'"/> + <xsl:namespace name="terms" select="'http://purl.org/dc/terms/'"/> <skos:ConceptScheme rdf:about="{@rdf:about}"> - <xsl:copy-of select="dcterms:*|skos:*"/> + <xsl:copy-of select="terms:*|skos:*[local-name() != 'hasTopConcept']" copy-namespaces="no"/> + + <!-- + Custom case for Mobility DCAT theme vocabulary top concepts. + https://mobilitydcat-ap.github.io/controlled-vocabularies/mobility-theme/latest/index.html#/ + + The vocabulary contains 2 top concepts: + <skos:hasTopConcept rdf:resource="https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-category"/> + <skos:hasTopConcept rdf:resource="https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-sub-category"/> + which are not really needed for browsing the main categories and sub categories. + + Use the narrower terms of the "content category" top concept as the top concepts of the scheme + to facilitate keyword selection in editor and generate proper facet hierarchy in search. + --> + <xsl:variable name="mobilityThemeTopConcept" + select="../owl:NamedIndividual[@rdf:about = 'https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-category']"/> + <xsl:choose> + <xsl:when test="$mobilityThemeTopConcept"> + <xsl:for-each select="$mobilityThemeTopConcept/skos:narrower"> + <skos:hasTopConcept rdf:resource="{@rdf:resource}"/> + </xsl:for-each> + </xsl:when> + <xsl:otherwise> + <xsl:copy-of select="skos:hasTopConcept" copy-namespaces="no"/> + </xsl:otherwise> + </xsl:choose> </skos:ConceptScheme> <xsl:apply-templates mode="owl-to-skos" @@ -53,10 +79,29 @@ </rdf:RDF> </xsl:template> + <xsl:variable name="excludedConcepts" + select="( + 'https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-category', + 'https://w3id.org/mobilitydcat-ap/mobility-theme/data-content-sub-category' + )" + as="xs:string*"/> + + <xsl:template mode="owl-to-skos" + match="owl:NamedIndividual[@rdf:about = $excludedConcepts] + |skos:broader[@rdf:resource = $excludedConcepts]"/> + <xsl:template mode="owl-to-skos" match="owl:NamedIndividual"> <skos:Concept rdf:about="{@rdf:about}"> - <xsl:copy-of select="skos:*"/> + <xsl:apply-templates mode="owl-to-skos" select="skos:*"/> </skos:Concept> </xsl:template> + + <xsl:template mode="owl-to-skos" + match="@*|node()"> + <xsl:copy copy-namespaces="no"> + <xsl:apply-templates select="@*|node()" mode="owl-to-skos"/> + </xsl:copy> + </xsl:template> + </xsl:stylesheet> From c1564c0517f8015b729ee0882c1a76c02e12e6b2 Mon Sep 17 00:00:00 2001 From: Ian <ianwallen@hotmail.com> Date: Thu, 10 Oct 2024 08:35:40 -0300 Subject: [PATCH 79/97] Remove spaces from the list of schema list of metadata import restrictions so that "iso19115-3.2018, dublin-core" will also work. (#8408) Also updated the admin documentation so that it is clear that it expect to get a comma separated list. --- .../geonet/kernel/datamanager/base/BaseMetadataManager.java | 6 +++++- web-ui/src/main/resources/catalog/locales/en-admin.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java index f2f159c029c..7464a267735 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java @@ -582,7 +582,11 @@ public AbstractMetadata insertMetadata(ServiceContext context, AbstractMetadata // Check if the schema is allowed by settings String mdImportSetting = settingManager.getValue(Settings.METADATA_IMPORT_RESTRICT); - if (mdImportSetting != null && !mdImportSetting.equals("")) { + if (mdImportSetting != null) { + // Remove spaces from the list so that "iso19115-3.2018, dublin-core" will also work + mdImportSetting = mdImportSetting.replace(" ", ""); + } + if (!StringUtils.isBlank(mdImportSetting)) { if (!newMetadata.getHarvestInfo().isHarvested() && !Arrays.asList(mdImportSetting.split(",")).contains(schema)) { throw new IllegalArgumentException("The system setting '" + Settings.METADATA_IMPORT_RESTRICT + "' doesn't allow to import " + schema diff --git a/web-ui/src/main/resources/catalog/locales/en-admin.json b/web-ui/src/main/resources/catalog/locales/en-admin.json index 1a711de4150..81d7da738e0 100644 --- a/web-ui/src/main/resources/catalog/locales/en-admin.json +++ b/web-ui/src/main/resources/catalog/locales/en-admin.json @@ -868,7 +868,7 @@ "metadata/workflow/forceValidationOnMdSave-help": "When the metadata is saved force validation check", "metadata/import": "Metadata import", "metadata/import/restrict": "Restrict import to schemas", - "metadata/import/restrict-help": "List of all allowed schemas for metadata to be imported. If the metadata schema is not allowed, then the import is not done. No value means all schemas allowed.", + "metadata/import/restrict-help": "Comma separated list of all allowed schemas for metadata to be imported. If the metadata schema is not allowed, then the import is not done. No value means all schemas allowed.", "metadata/import/userprofile": "Minimum user profile allowed to import metadata", "metadata/import/userprofile-help": "Minimum user profile allowed to import metadata (Editor, Reviewer or Administrator). The default value is Editor.", "metadata/delete": "Metadata delete", From c7c9e9736a57deae22a63b67a12608f3967b615c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 10 Oct 2024 13:39:32 +0200 Subject: [PATCH 80/97] Formatter / Datacite / Default resource type (#8407) * Formatter / Datacite / Default resource type If scope code has no mapping defined, default to Other which is XSD valid for Datacite. Add application value mapping. * DOI / Fix for french translation. --- .../main/plugin/iso19115-3.2018/formatter/datacite/view.xsl | 3 ++- .../src/main/plugin/iso19139/formatter/datacite/view.xsl | 3 ++- .../classes/org/fao/geonet/api/Messages_fre.properties | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl index 52bd4fb71f8..e53c47302fb 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/datacite/view.xsl @@ -349,6 +349,7 @@ <entry key="series">Dataset</entry> <entry key="service">Service</entry> <entry key="software">Software</entry> + <entry key="application">Software</entry> </xsl:variable> <xsl:template mode="toDatacite" match="mdb:metadataScope/*/mdb:resourceScope/*/@codeListValue"> @@ -356,7 +357,7 @@ select="."/> <xsl:variable name="type" select="concat(upper-case(substring(.,1,1)), substring(., 2))"/> - <datacite:resourceType resourceTypeGeneral="{$scopeMapping//*[@key = $key]/text()}"> + <datacite:resourceType resourceTypeGeneral="{($scopeMapping//*[@key = $key]/text(), 'Other')[1]}"> <xsl:value-of select="concat($key, '/', $type)"/> </datacite:resourceType> </xsl:template> diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl index 7465bc4b58f..f5b40a03488 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/datacite/view.xsl @@ -312,6 +312,7 @@ <entry key="series">Dataset</entry> <entry key="service">Service</entry> <entry key="software">Software</entry> + <entry key="application">Software</entry> </xsl:variable> <xsl:template mode="toDatacite" @@ -320,7 +321,7 @@ select="."/> <xsl:variable name="type" select="concat(upper-case(substring(.,1,1)), substring(., 2))"/> - <datacite:resourceType resourceTypeGeneral="{$scopeMapping//*[@key = $key]/text()}"> + <datacite:resourceType resourceTypeGeneral="{($scopeMapping//*[@key = $key]/text(), 'Other')[1]}"> <xsl:value-of select="concat($key, '/', $type)"/> </datacite:resourceType> </xsl:template> diff --git a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties index bcbb4d011b4..b0180115f96 100644 --- a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties +++ b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties @@ -200,8 +200,8 @@ exception.doi.recordNotConformantMissingInfo=La fiche n''est pas conforme au for exception.doi.recordNotConformantMissingInfo.description=La fiche ''{0}'' n''est pas conforme au format DataCite. {1} champ(s) obligatoire(s) manquant(s). {2} exception.doi.recordNotConformantMissingMandatory=La fiche n''est pas conforme aux r\u00E8gles de validation DataCite pour les champs obligatoires exception.doi.recordNotConformantMissingMandatory.description=La fiche ''{0}'' n''est pas conforme aux r\u00E8gles de validation DataCite pour les champs obligatoires. L''erreur est: {1}. Les champs obligatoires dans DataCite sont : identifiant, cr\u00E9ateurs, titres, \u00E9diteur, publicationYear, resourceType. <a href=''{2}api/records/{3}/formatters/datacite?output=xml''>V\u00E9rifiez la sortie au format DataCite</a> et adaptez le contenu de la fiche pour ajouter les informations manquantes. -exception.doi.recordInvalid=Le fiche converti n''est pas conforme au format DataCite -exception.doi.recordInvalid.description=Le fiche ''{0}'' converti n''est pas conforme au format DataCite. L''erreur est: {1}. Les champs obligatoires dans DataCite sont : identifiant, cr\u00E9ateurs, titres, \u00E9diteur, ann\u00E9e de publication, type de ressource. <a href=''{2}api/records/{3}/formatters/datacite?output=xml''>V\u00E9rifier la sortie au format DataCite</a> et adapter le contenu de la fiche pour ajouter les informations manquantes. +exception.doi.recordInvalid=La fiche n''est pas conforme au format DataCite +exception.doi.recordInvalid.description=La fiche ''{0}'' n''est pas conforme au format DataCite. L''erreur est: {1}. Les champs obligatoires dans DataCite sont : identifiant, cr\u00E9ateurs, titres, \u00E9diteur, ann\u00E9e de publication, type de ressource. <a href=''{2}api/records/{3}/formatters/datacite?output=xml''>V\u00E9rifier la sortie au format DataCite</a> et adapter le contenu de la fiche pour ajouter les informations manquantes.\ exception.doi.serverErrorCreate=Erreur lors de la cr\u00E9ation du DOI exception.doi.serverErrorCreate.description=Erreur lors de la cr\u00E9ation du DOI : {0} exception.doi.serverErrorRetrieve=Erreur lors de la r\u00E9cup\u00E9ration du DOI From 721cd4cccbf0dd9f0fbfd91c4aa792cafa7b1ff9 Mon Sep 17 00:00:00 2001 From: neo <48834031+SuperOctocat@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:32:38 +1100 Subject: [PATCH 81/97] Fixed description for getIdentifiers in IdentifierApi (#8422) * fixed typo * moved identifier as an adjective to template * replaced correct location of identifier template --- .../java/org/fao/geonet/api/identifiers/IdentifiersApi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java b/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java index 9f9f30e5b8e..b658f37e006 100644 --- a/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java +++ b/services/src/main/java/org/fao/geonet/api/identifiers/IdentifiersApi.java @@ -63,9 +63,9 @@ public class IdentifiersApi { @io.swagger.v3.oas.annotations.Operation( summary = "Get identifier templates", description = "Identifier templates are used to create record UUIDs " + - "havind a particular structure. The template will be used " + - "when user creates a new record. The template identifier to " + - "use is defined in the administration > settings." + "having a particular structure. The template will be used " + + "when user creates a new record. The identifier template to " + + "use is defined in the admin console > metadata and templates." // authorizations = { // @Authorization(value = "basicAuth") // }) From 6d6eef10b424d8419b8c274f24e75aa06b269afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Tue, 3 Sep 2024 13:04:39 +0200 Subject: [PATCH 82/97] Editor / Associated resource / Remote document / Add content type While adding a remote document URL, the app tries to extract title from the remote document (which can be XML or HTML page). eg. https://metawal.wallonie.be/geonetwork/srv/api/records/19381245-dc52-438c-b1cd-cdf5d646b69e?language=all or https://doi.org/10.1016/j.onehlt.2024.100873 The 2nd link has redirect and return an error if content type does not contains text/html and the link considered invalid can't be attached to the current metadata. --- .../catalog/components/edit/onlinesrc/OnlineSrcDirective.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcDirective.js b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcDirective.js index 67fefe6b30f..b08df082594 100644 --- a/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcDirective.js +++ b/web-ui/src/main/resources/catalog/components/edit/onlinesrc/OnlineSrcDirective.js @@ -259,8 +259,7 @@ } function guessContentType() { - // We may support JSON at some point ? - return "application/xml"; + return "application/xml,application/json,text/html"; } function getProperties(doc, url) { @@ -268,6 +267,7 @@ if (angular.isObject(doc)) { // JSON doc + // We may support JSON at some point ? } else if (doc.startsWith("<?xml")) { // XML - Support of ISO19139, ISO19110 and ISO19115-3 try { From 58a713c0d56534252d5e16f6fb6e8d2d568517c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Fri, 11 Oct 2024 08:39:53 +0200 Subject: [PATCH 83/97] WebDav harvester / Add support for XSLT filter process (#8243) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WebDav harvester / Add support for XSLT filter process * Documentation / update documentation for harvesters and add Geonetwork 2.1-3.X harvester page * WebDav harvester / Use current date for metadata change date if can't be retrieved from the remote metadata * Documentation / remove Z39.50 harvester documentation. The harvester is no longer available in GeoNetwork 4.x * Documentation / Unify harvesters configuration * Update web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.html Co-authored-by: François Prunayre <fx.prunayre@gmail.com> * Update harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java Co-authored-by: François Prunayre <fx.prunayre@gmail.com> * HarvesterUtil / Use conversions from schema (#106) Cf https://github.com/geonetwork/core-geonetwork/pull/6772 --------- Co-authored-by: François Prunayre <fx.prunayre@gmail.com> --- .../user-guide/harvesting/harvesting-csw.md | 46 +++-- .../harvesting/harvesting-filesystem.md | 46 +++-- .../harvesting/harvesting-geonetwork-2.md | 9 + .../harvesting/harvesting-geonetwork.md | 46 ++++- .../harvesting/harvesting-geoportal.md | 44 +++-- .../harvesting/harvesting-oaipmh.md | 57 +++--- .../harvesting/harvesting-ogcwxs.md | 61 ++++--- .../user-guide/harvesting/harvesting-sde.md | 65 +++---- .../harvesting/harvesting-simpleurl.md | 91 ++++++---- .../harvesting/harvesting-thredds.md | 56 +++--- .../harvesting/harvesting-webdav.md | 44 +++-- .../harvesting/harvesting-wfs-features.md | 47 +++-- .../user-guide/harvesting/harvesting-z3950.md | 90 ---------- .../harvesting/img/add-arcsde-harvester.png | Bin 0 -> 6597 bytes .../harvesting/img/add-csw-harvester.png | Bin 0 -> 16634 bytes .../img/add-filesystem-harvester.png | Bin 0 -> 8260 bytes .../img/add-geonetwork-3-harvester.png | Bin 0 -> 12826 bytes .../img/add-geoportalrest-harvester.png | Bin 0 -> 13441 bytes .../harvesting/img/add-harvester.png | Bin 0 -> 29006 bytes .../harvesting/img/add-oaipmh-harvester.png | Bin 0 -> 14305 bytes .../img/add-ogcwebservices-harvester.png | Bin 0 -> 18528 bytes .../img/add-simpleurl-harvester.png | Bin 0 -> 21541 bytes .../img/add-threddscatalog-harvester.png | Bin 0 -> 22972 bytes .../harvesting/img/add-webdav-harvester.png | Bin 0 -> 23560 bytes .../img/add-wfsgetfeature-harvester.png | Bin 0 -> 20597 bytes .../harvesting/img/harvester-history.png | Bin 0 -> 48659 bytes .../harvesting/img/harvester-statistics.png | Bin 0 -> 104109 bytes .../user-guide/harvesting/img/harvesters.png | Bin 0 -> 44828 bytes .../docs/user-guide/harvesting/index.md | 86 +++------ docs/manual/mkdocs.yml | 2 +- .../harvest/harvester/HarvesterUtil.java | 14 +- .../harvest/harvester/webdav/Harvester.java | 72 ++++---- .../harvester/webdav/WebDavHarvester.java | 23 +-- .../harvester/webdav/WebDavParams.java | 49 ++--- .../templates/admin/harvest/type/webdav.html | 15 ++ .../templates/admin/harvest/type/webdav.js | 170 +++++++++--------- .../main/webapp/xsl/xml/harvesting/webdav.xsl | 3 + 37 files changed, 599 insertions(+), 537 deletions(-) create mode 100644 docs/manual/docs/user-guide/harvesting/harvesting-geonetwork-2.md delete mode 100644 docs/manual/docs/user-guide/harvesting/harvesting-z3950.md create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-arcsde-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-csw-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-filesystem-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-geonetwork-3-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-geoportalrest-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-oaipmh-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-ogcwebservices-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-simpleurl-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-threddscatalog-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-webdav-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/add-wfsgetfeature-harvester.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/harvester-history.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/harvester-statistics.png create mode 100644 docs/manual/docs/user-guide/harvesting/img/harvesters.png diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-csw.md b/docs/manual/docs/user-guide/harvesting/harvesting-csw.md index 614687eb471..dc94a777d4a 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-csw.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-csw.md @@ -4,16 +4,38 @@ This harvester will connect to a remote CSW server and retrieve metadata records ## Adding a CSW harvester -The figure above shows the options available: - -- **Site** - Options about the remote site. - - *Name* - This is a short description of the remote site. It will be shown in the harvesting main page as the name for this instance of the CSW harvester. - - *Service URL* - The URL of the capabilities document of the CSW server to be harvested. eg. <http://geonetwork-site.com/srv/eng/csw?service=CSW&request=GetCabilities&version=2.0.2>. This document is used to discover the location of the services to call to query and retrieve metadata. - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing harvested metadata records in the search results. - - *Use account* - Account credentials for basic HTTP authentication on the CSW server. -- **Search criteria** - Using the Add button, you can add several search criteria. You can query only the fields recognised by the CSW protocol. -- **Options** - Scheduling options. -- **Options** - Specific harvesting options for this harvester. - - *Validate* - If checked, the metadata will be validated after retrieval. If the validation does not pass, the metadata will be skipped. +To create a CSW harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `CSW`: + +![](img/add-csw-harvester.png) + +Providing the following information: + +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to OGC CSW 2.0.2** + - *Service URL*: The URL of the capabilities document of the CSW server to be harvested. eg. <http://geonetwork-site.com/srv/eng/csw?service=CSW&request=GetCabilities&version=2.0.2>. This document is used to discover the location of the services to call to query and retrieve metadata. + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the CSW server. + - *Search filter*: (Optional) Define the search criteria below to restrict the records to harvest. + - *Search options*: + - *Sort by*: Define sort option to retrieve the results. Sorting by 'identifier:A' means by UUID with alphabetical order. Any CSW queryables can be used in combination with A or D for setting the ordering. + - *Output Schema*: The metadata standard to request the metadata records from the CSW server. + - *Distributed search*: Enables the distributed search in remote server (if the remote server supports it). When this option is enabled, the remote catalog cascades the search to the Federated CSW servers that has configured. + +- **Configure response processing for CSW** + - *Action on UUID collision*: When a harvester finds the same uuid on a record collected by another method (another harvester, importer, dashboard editor,...), should this record be skipped (default), overriden or generate a new UUID? + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + - *Check for duplicate resources based on the resource identifier*: If checked, ignores metadata with a resource identifier (`gmd:identificationInfo/*/gmd:citation/gmd:CI_Citation/gmd:identifier/*/gmd:code/gco:CharacterString`) that is assigned to other metadata record in the catalog. It only applies to records in ISO19139 or ISO profiles. + - *XPath filter*: (Optional) When record is retrived from remote server, check an XPath expression to accept or discard the record. + - *XSL transformation to apply*: (Optional) The referenced XSL transform will be applied to each metadata record before it is added to GeoNetwork. + - *Batch edits*: (Optional) Allows to update harvested records, using XPATH syntax. It can be used to add, replace or delete element. + - *Category*: (Optional) A GeoNetwork category to assign to each metadata record. + - **Privileges** - Assign privileges to harvested metadata. -- **Categories** diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-filesystem.md b/docs/manual/docs/user-guide/harvesting/harvesting-filesystem.md index 5e0b6b3ab54..900deeafc4c 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-filesystem.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-filesystem.md @@ -4,21 +4,35 @@ This harvester will harvest metadata as XML files from a filesystem available on ## Adding a Local File System harvester -The figure above shows the options available: - -- **Site** - Options about the remote site. - - *Name* - This is a short description of the filesystem harvester. It will be shown in the harvesting main page as the name for this instance of the Local Filesystem harvester. - - *Directory* - The path name of the directory containing the metadata (as XML files) to be harvested. - - *Recurse* - If checked and the *Directory* path contains other directories, then the harvester will traverse the entire file system tree in that directory and add all metadata files found. - - *Keep local if deleted at source* - If checked then metadata records that have already been harvested will be kept even if they have been deleted from the *Directory* specified. - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing harvested metadata records in the search results. -- **Options** - Scheduling options. -- **Harvested Content** - Options that are applied to harvested content. - - *Apply this XSLT to harvested records* - Choose an XSLT here that will convert harvested records to a different format. - - *Validate* - If checked, the metadata will be validated after retrieval. If the validation does not pass, the metadata will be skipped. -- **Privileges** - Assign privileges to harvested metadata. -- **Categories** +To create a Local File System harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `Directory`: + +![](img/add-filesystem-harvester.png) + +Providing the following information: -!!! Notes +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. - - in order to be successfully harvested, metadata records retrieved from the file system must match a metadata schema in the local GeoNetwork instance +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to Directory** + - *Directory*: The path name of the directory containing the metadata (as XML files) to be harvested. The directory must be accessible by GeoNetwork. + - *Also search in subfolders*: If checked and the *Directory* path contains other directories, then the harvester will traverse the entire file system tree in that directory and add all metadata files found. + - *Script to run before harvesting* + - *Type of record* + +- **Configure response processing for filesystem** + - *Action on UUID collision*: When a harvester finds the same uuid on a record collected by another method (another harvester, importer, dashboard editor,...), should this record be skipped (default), overriden or generate a new UUID? + - *Update catalog record only if file was updated* + - *Keep local even if deleted at source*: If checked then metadata records that have already been harvested will be kept even if they have been deleted from the *Directory* specified. + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + - *XSL transformation to apply*: (Optional) The referenced XSL transform will be applied to each metadata record before it is added to GeoNetwork. + - *Batch edits*: (Optional) Allows to update harvested records, using XPATH syntax. It can be used to add, replace or delete element. + - *Category*: (Optional) A GeoNetwork category to assign to each metadata record. + +- **Privileges** - Assign privileges to harvested metadata. diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork-2.md b/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork-2.md new file mode 100644 index 00000000000..de085a9bb9b --- /dev/null +++ b/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork-2.md @@ -0,0 +1,9 @@ +# GeoNetwork 2.0 Harvester {#gn2_harvester} + +## Upgrading from GeoNetwork 2.0 Guidance + +GeoNetwork 2.1 introduced a new powerful harvesting engine which is not compatible with GeoNetwork version 2.0 based catalogues. + +* Harvesting metadata from a v2.0 server requires this harvesting type. +* Old 2.0 servers can still harvest from 2.1 servers +* Due to the fact that GeoNetwork 2.0 is no longer suitable for production use, this harvesting type is deprecated. diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork.md b/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork.md index de085a9bb9b..3c692b5e3ec 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-geonetwork.md @@ -1,9 +1,43 @@ -# GeoNetwork 2.0 Harvester {#gn2_harvester} +# GeoNetwork 2.1-3.X Harvester -## Upgrading from GeoNetwork 2.0 Guidance +This harvester will connect to a remote GeoNetwork server that uses versions from 2.1-3.X and retrieve metadata records that match the query parameters. -GeoNetwork 2.1 introduced a new powerful harvesting engine which is not compatible with GeoNetwork version 2.0 based catalogues. +## Adding a GeoNetwork 2.1-3.X harvester -* Harvesting metadata from a v2.0 server requires this harvesting type. -* Old 2.0 servers can still harvest from 2.1 servers -* Due to the fact that GeoNetwork 2.0 is no longer suitable for production use, this harvesting type is deprecated. +To create a GeoNetwork 2.1-3.X harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `GeoNetwork (from 2.1 to 3.x)`: + +![](img/add-geonetwork-3-harvester.png) + +Providing the following information: + +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to GeoNetwork (from 2.1 to 3.x)** + - *Catalog URL*: + - The remote URL of the GeoNetwork server from which metadata will be harvested. The URL should contain the catalog name, for example: http://www.fao.org/geonetwork. + - Additionally, it should be configured the node name, usually the value `srv`. + - *Search filter*: (Optional) Define the filter to retrieve the remote metadata. + - *Catalog*: (Optional) Select the portal in the remote server to harvest. + +- **Configure response processing for GeoNetwork** + - *Action on UUID collision*: When a harvester finds the same uuid on a record collected by another method (another harvester, importer, dashboard editor,...), should this record be skipped (default), overriden or generate a new UUID? + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the WebDAV/WAF server. + - *Use full MEF format*: If checked, uses MEF format instead of XML to retrieve the remote metadata. Recommended to metadata with files. + - *Use change date for comparison*: If checked, uses change date to detect changes on remote server. + - *Set category if it exists locally*: If checked, uses the category set on the metadata in the remote server also locally (assuming it exists locally). Applies only when using MEF format for the harvesting. + - *Category*: (Optional) A GeoNetwork category to assign to each metadata record. + - *XSL filter name to apply*: (Optional) The XSL filter is applied to each metadata record. The filter is a process which depends on the schema (see the `process` folder of the schemas). + + It could be composed of parameter which will be sent to XSL transformation using the following syntax: `anonymizer?protocol=MYLOCALNETWORK:FILEPATH&email=gis@organisation.org&thesaurus=MYORGONLYTHEASURUS` + + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + +- **Privileges** - Assign privileges to harvested metadata. diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-geoportal.md b/docs/manual/docs/user-guide/harvesting/harvesting-geoportal.md index e8887286ea3..ec16a07b9ae 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-geoportal.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-geoportal.md @@ -4,24 +4,38 @@ This harvester will connect to a remote GeoPortal version 9.3.x or 10.x server a ## Adding a GeoPortal REST harvester -The figure above shows the options available: - -- **Site** - Options about the remote site. - - *Name* - This is a short description of the remote site. It will be shown in the harvesting main page as the name for this instance of the GeoPortal REST harvester. - - *Base URL* - The base URL of the GeoPortal server to be harvested. eg. <http://yourhost.com/geoportal>. The harvester will add the additional path required to access the REST services on the GeoPortal server. - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing harvested metadata records in the search results. -- **Search criteria** - Using the Add button, you can add several search criteria. You can query any field on the GeoPortal server using the Lucene query syntax described at <http://webhelp.esri.com/geoportal_extension/9.3.1/index.htm#srch_lucene.htm>. -- **Options** - Scheduling options. -- **Harvested Content** - Options that are applied to harvested content. - - *Apply this XSLT to harvested records* - Choose an XSLT here that will convert harvested records to a different format. See notes section below for typical usage. - - *Validate* - If checked, the metadata will be validated after retrieval. If the validation does not pass, the metadata will be skipped. +To create a GeoPortal REST harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `GeoPortal REST`: + +![](img/add-geoportalrest-harvester.png) + +Providing the following information: + +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to GeoPortal REST** + - *URL*: The base URL of the GeoPortal server to be harvested. eg. <http://yourhost.com/geoportal>. The harvester will add the additional path required to access the REST services on the GeoPortal server. + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the server. + - *Search filter*: (Optional) You can query any field on the GeoPortal server using the Lucene query syntax described at <http://webhelp.esri.com/geoportal_extension/9.3.1/index.htm#srch_lucene.htm>. + +- **Configure response processing for geoPREST** + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + - *XSL transformation to apply*: (Optional) The referenced XSL transform will be applied to each metadata record before it is added to GeoNetwork. + - **Privileges** - Assign privileges to harvested metadata. -- **Categories** + !!! Notes - - this harvester uses two REST services from the GeoPortal API: + - This harvester uses two REST services from the GeoPortal API: - `rest/find/document` with searchText parameter to return an RSS listing of metadata records that meet the search criteria (maximum 100000) - `rest/document` with id parameter from each result returned in the RSS listing - - this harvester has been tested with GeoPortal 9.3.x and 10.x. It can be used in preference to the CSW harvester if there are issues with the handling of the OGC standards etc. - - typically ISO19115 metadata produced by the Geoportal software will not have a 'gmd' prefix for the namespace `http://www.isotc211.org/2005/gmd`. GeoNetwork XSLTs will not have any trouble understanding this metadata but will not be able to map titles and codelists in the viewer/editor. To fix this problem, please select the ``Add-gmd-prefix`` XSLT for the *Apply this XSLT to harvested records* in the **Harvested Content** set of options described earlier + - This harvester has been tested with GeoPortal 9.3.x and 10.x. It can be used in preference to the CSW harvester if there are issues with the handling of the OGC standards etc. + - Typically ISO19115 metadata produced by the Geoportal software will not have a 'gmd' prefix for the namespace `http://www.isotc211.org/2005/gmd`. GeoNetwork XSLTs will not have any trouble understanding this metadata but will not be able to map titles and codelists in the viewer/editor. To fix this problem, please select the ``Add-gmd-prefix`` XSLT for the *Apply this XSLT to harvested records* in the **Harvested Content** set of options described earlier diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-oaipmh.md b/docs/manual/docs/user-guide/harvesting/harvesting-oaipmh.md index cf046363634..6c528feb7e2 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-oaipmh.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-oaipmh.md @@ -1,36 +1,49 @@ # OAIPMH Harvesting {#oaipmh_harvester} -This is a harvesting protocol that is widely used among libraries. GeoNetwork implements version 2.0 of the protocol. +This is a harvesting protocol that is widely used among libraries. GeoNetwork implements version 2.0 of the protocol. An OAI-PMH server implements a harvesting protocol that GeoNetwork, acting as a client, can use to harvest metadata. ## Adding an OAI-PMH harvester -An OAI-PMH server implements a harvesting protocol that GeoNetwork, acting as a client, can use to harvest metadata. +To create a OAI-PMH harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `OAI/PMH`: -Configuration options: +![](img/add-oaipmh-harvester.png) -- **Site** - Options describing the remote site. - - *Name* - This is a short description of the remote site. It will be shown in the harvesting main page as the name for this instance of the OAIPMH harvester. - - *URL* - The URL of the OAI-PMH server from which metadata will be harvested. - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing search results. - - *Use account* - Account credentials for basic HTTP authentication on the OAIPMH server. -- **Search criteria** - This allows you to select metadata records for harvest based on certain criteria: - - *From* - You can provide a start date here. Any metadata whose last change date is equal to or greater than this date will be harvested. To add or edit a value for this field you need to use the icon alongside the text box. This field is optional so if you don't provide a start date the constraint is dropped. Use the icon to clear the field. - - *Until* - Functions in the same way as the *From* parameter but adds an end constraint to the last change date search. Any metadata whose last change data is less than or equal to this data will be harvested. - - *Set* - An OAI-PMH server classifies metadata into sets (like categories in GeoNetwork). You can request all metadata records that belong to a set (and any of its subsets) by specifying the name of that set here. - - *Prefix* - 'Prefix' means metadata format. The oai_dc prefix must be supported by all OAI-PMH compliant servers. - - You can use the Add button to add more than one Search Criteria set. Search Criteria sets can be removed by clicking on the small cross at the top left of the set. +Providing the following information: -!!! note +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. - the 'OAI provider sets' drop down next to the *Set* text box and the 'OAI provider prefixes' drop down next to the *Prefix* textbox are initially blank. After specifying the connection URL, you can press the **Retrieve Info** button, which will connect to the remote OAI-PMH server, retrieve all supported sets and prefixes and fill the drop downs with these values. Selecting a value from either of these drop downs will fill the appropriate text box with the selected value. +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). +- **Configure connection to OGC CSW 2.0.2** + - *URL*: The URL of the OAI-PMH server from which metadata will be harvested. + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the OAIPMH server. + - *Search filter*: (Optional) Define the search criteria below to restrict the records to harvest. + - *From*: You can provide a start date here. Any metadata whose last change date is equal to or greater than this date will be harvested. To add or edit a value for this field you need to use the icon alongside the text box. This field is optional so if you don't provide a start date the constraint is dropped. Use the icon to clear the field. + - *Until*: Functions in the same way as the *From* parameter but adds an end constraint to the last change date search. Any metadata whose last change data is less than or equal to this data will be harvested. + - *Set*: An OAI-PMH server classifies metadata into sets (like categories in GeoNetwork). You can request all metadata records that belong to a set (and any of its subsets) by specifying the name of that set here. + - *Prefix*: 'Prefix' means metadata format. The oai_dc prefix must be supported by all OAI-PMH compliant servers. + + !!! note + + The 'OAI provider sets' drop down next to the *Set* text box and the 'OAI provider prefixes' drop down next to the *Prefix* textbox are initially blank. After specifying the connection URL, you can press the **Retrieve Info** button, which will connect to the remote OAI-PMH server, retrieve all supported sets and prefixes and fill the drop downs with these values. Selecting a value from either of these drop downs will fill the appropriate text box with the selected value. +- **Configure response processing for oaipmh** + - *Action on UUID collision*: When a harvester finds the same uuid on a record collected by another method (another harvester, importer, dashboard editor,...), should this record be skipped (default), overriden or generate a new UUID? + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + - *XSL transformation to apply*: (Optional) The referenced XSL transform will be applied to each metadata record before it is added to GeoNetwork. + + - *Category*: (Optional) A GeoNetwork category to assign to each metadata record. + +- **Privileges** - Assign privileges to harvested metadata. -- **Options** - Scheduling Options. -- **Privileges** -- **Categories** !!! Notes - - if you request the oai_dc output format, GeoNetwork will convert it to Dublin Core format. - - when you edit a previously created OAIPMH harvester instance, both the *set* and *prefix* drop down lists will be empty. You have to press the retrieve info button again to connect to the remote server and retrieve set and prefix information. - - the id of the remote server must be a UUID. If not, metadata can be harvested but during hierarchical propagation id clashes could corrupt harvested metadata. + - If you request the oai_dc output format, GeoNetwork will convert it to Dublin Core format. + - When you edit a previously created OAIPMH harvester instance, both the *set* and *prefix* drop down lists will be empty. You have to press the retrieve info button again to connect to the remote server and retrieve set and prefix information. + - The id of the remote server must be a UUID. If not, metadata can be harvested but during hierarchical propagation id clashes could corrupt harvested metadata. diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-ogcwxs.md b/docs/manual/docs/user-guide/harvesting/harvesting-ogcwxs.md index 52c88c134d4..70f45cf75d6 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-ogcwxs.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-ogcwxs.md @@ -11,27 +11,46 @@ An OGC service implements a GetCapabilities operation that GeoNetwork, acting as ## Adding an OGC Service Harvester -Configuration options: - -- **Site** - - *Name* - The name of the catalogue and will be one of the search criteria. - - *Type* - The type of OGC service indicates if the harvester has to query for a specific kind of service. Supported type are WMS (1.0.0, 1.1.1, 1.3.0), WFS (1.0.0 and 1.1.0), WCS (1.0.0), WPS (0.4.0 and 1.0.0), CSW (2.0.2) and SOS (1.0.0). - - *Service URL* - The service URL is the URL of the service to contact (without parameters like "REQUEST=GetCapabilities", "VERSION=", \...). It has to be a valid URL like <http://your.preferred.ogcservice/type_wms>. - - *Metadata language* - Required field that will define the language of the metadata. It should be the language used by the OGC web service administrator. - - *ISO topic category* - Used to populate the topic category element in the metadata. It is recommended to choose one as the topic category is mandatory for the ISO19115/19139 standard if the hierarchical level is "datasets". - - *Type of import* - By default, the harvester produces one service metadata record. Check boxes in this group determine the other metadata that will be produced. - - *Create metadata for layer elements using GetCapabilities information*: Checking this option means that the harvester will loop over datasets served by the service as described in the GetCapabilities document. - - *Create metadata for layer elements using MetadataURL attributes*: Checkthis option means that the harvester will generate metadata from an XML document referenced in the MetadataUrl attribute of the dataset in the GetCapabilities document. If the document referred to by this attribute is not valid (eg. unknown schema, bad XML format), the GetCapabilities document is used as per the previous option. - - *Create thumbnails for WMS layers*: If harvesting from an OGC WMS, then checking this options means that thumbnails will be created during harvesting. - - *Target schema* - The metadata schema of the dataset metadata records that will be created by this harvester. - - *Icon* - The default icon displayed as attribution logo for metadata created by this harvester. -- **Options** - Scheduling Options. -- **Privileges** -- **Category for service** - Metadata for the harvested service is assigned to the category selected in this option (eg. "interactive resources"). -- **Category for datasets** - Metadata for the harvested datasets is assigned to the category selected in this option (eg. "datasets"). +To create a OGC Service harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `OGC Web Services`: + +![](img/add-ogcwebservices-harvester.png) + +Providing the following information: + +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to OGC Web Services** + - *Service URL*: The service URL is the URL of the service to contact (without parameters like "REQUEST=GetCapabilities", "VERSION=", \...). It has to be a valid URL like <http://your.preferred.ogcservice/type_wms>. + - *Service type* - The type of OGC service indicates if the harvester has to query for a specific kind of service. Supported type are WMS (1.0.0, 1.1.1, 1.3.0), WFS (1.0.0 and 1.1.0), WCS (1.0.0), WPS (0.4.0 and 1.0.0), CSW (2.0.2) and SOS (1.0.0). + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the server. + +- **Configure response processing for ogcwxs** + - *Build service metadata record from a template*: + - *Category for service metadata*: (Optional) Metadata for the harvested service is assigned to the category selected in this option (eg. "interactive resources"). + - *Create record for each layer only using GetCapabilities information*: Checking this option means that the harvester will loop over datasets served by the service as described in the GetCapabilities document. + - *Import record for each layer using MetadataURL attributes*: Checkthis option means that the harvester will generate metadata from an XML document referenced in the MetadataUrl attribute of the dataset in the GetCapabilities document. If the document referred to by this attribute is not valid (eg. unknown schema, bad XML format), the GetCapabilities document is used as per the previous option. + - *Build dataset metadata records from a template* + - *Create thumbnail*: If checked, when harvesting from an OGC Web Map Service (WMS) that supports WGS84 projection, thumbnails for the layers metadata will be created during harvesting. + - *Category for datasets*: Metadata for the harvested datasets is assigned to the category selected in this option (eg. "datasets"). + + - *ISO category*: (Optional) Used to populate the topic category element in the metadata. It is recommended to choose one as the topic category is mandatory for the ISO19115/19139 standard if the hierarchical level is "datasets". + - *Metadata language*: Required field that will define the language of the metadata. It should be the language used by the OGC web service administrator. + - *Output schema*: The metadata schema of the dataset metadata records that will be created by this harvester. The value should be an XSLT process which is used by the harvester to convert the GetCapabilities document to metadata records from that schema. If in doubt, use the default value `iso19139`. + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + - *XSL transformation to apply*: (Optional) The referenced XSL transform will be applied to each metadata record before it is added to GeoNetwork. + + +- **Privileges** - Assign privileges to harvested metadata. + !!! Notes - - every time the harvester runs, it will remove previously harvested records and create new records. GeoNetwork will generate the uuid for all metadata (both service and datasets). The exception to this rule is dataset metadata created using the MetadataUrl tag is in the GetCapabilities document, in that case, the uuid of the remote XML document is used instead - - thumbnails can only be generated when harvesting an OGC Web Map Service (WMS). The WMS should support the WGS84 projection - - the chosen *Target schema* must have the support XSLTs which are used by the harvester to convert the GetCapabilities statement to metadata records from that schema. If in doubt, use iso19139. + - Every time the harvester runs, it will remove previously harvested records and create new records. GeoNetwork will generate the uuid for all metadata (both service and datasets). The exception to this rule is dataset metadata created using the MetadataUrl tag is in the GetCapabilities document, in that case, the uuid of the remote XML document is used instead diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-sde.md b/docs/manual/docs/user-guide/harvesting/harvesting-sde.md index 7f4f99cb913..32cdd4df780 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-sde.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-sde.md @@ -1,55 +1,60 @@ # Harvesting an ARCSDE Node {#sde_harvester} -This is a harvesting protocol for metadata stored in an ArcSDE installation. +This is a harvesting protocol for metadata stored in an ArcSDE installation. The harvester identifies the ESRI metadata format: ESRI ISO, ESRI FGDC to apply the required xslts to transform metadata to ISO19139. ## Adding an ArcSDE harvester -The harvester identifies the ESRI metadata format: ESRI ISO, ESRI FGDC to apply the required xslts to transform metadata to ISO19139. Configuration options: +To create an ArcSDE harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `ArcSDE`: + +![](img/add-arcsde-harvester.png) + +Providing the following information: - **Identification** - - *Name* - This is a short description of the node. It will be shown in the harvesting main page. - - *Group* - User admin of this group and catalog administrator can manage this node. - - *Harvester user* - User that owns the harvested metadata. -- **Schedule** - Schedule configuration to execute the harvester. -- **Configuration for protocol ArcSDE** - - *Server* - ArcSde server IP address or name. - - *Port* - ArcSde service port (typically 5151) or ArcSde database port, depending on the connection type selected, see below the *Connection type* section. - - *Database name* - ArcSDE instance name (typically esri_sde). - - *ArcSde version* - ArcSde version to harvest. The data model used by ArcSde is different depending on the ArcSde version. + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to Database** + - *Server*: ArcSDE server IP address or name. + - *Port*: ArcSDE service port (typically 5151) or ArcSDE database port, depending on the connection type selected, see below the *Connection type* section. + - *Database name*: ArcSDE instance name (typically esri_sde). + - *ArcSDE version: ArcSDE version to harvest. The data model used by ArcSDE is different depending on the ArcSDE version. - *Connection type* - - *ArcSde service* - Uses the ArcSde service to retrieve the metadata. + - *ArcSDE service*: Uses the ArcSDE service to retrieve the metadata. !!! note - Additional installation steps are required to use the ArcSDE harvester because it needs proprietary ESRI Java api jars to be installed. - - ArcSDE Java API libraries need to be installed by the user in GeoNetwork (folder INSTALL_DIR_GEONETWORK/WEB-INF/lib), as these are proprietary libraries not distributed with GeoNetwork. - - The following jars are required: - - - jpe_sdk.jar - - jsde_sdk.jar - - dummy-api-XXX.jar must be removed from INSTALL_DIR/web/geonetwork/WEB-INF/lib + Additional installation steps are required to use the ArcSDE harvester because it needs proprietary ESRI Java api jars to be installed. + ArcSDE Java API libraries need to be installed by the user in GeoNetwork (folder `INSTALL_DIR_GEONETWORK/WEB-INF/lib`), as these are proprietary libraries not distributed with GeoNetwork. - - *Database direct connection* - Uses a database connection (JDBC) to retrieve the metadata. With + The following jars are required: - !!! note + - jpe_sdk.jar + - jsde_sdk.jar - Database direct connection requires to copy JDBC drivers in INSTALL_DIR_GEONETWORK/WEB-INF/lib. + `dummy-api-XXX.jar` must be removed from `INSTALL_DIR/web/geonetwork/WEB-INF/lib`. + - *Database direct connection*: Uses a database connection (JDBC) to retrieve the metadata. + + !!! note + + Database direct connection requires to copy JDBC drivers in `INSTALL_DIR_GEONETWORK/WEB-INF/lib`. !!! note Postgres JDBC drivers are distributed with GeoNetwork, but not for Oracle or SqlServer. - - *Database type* - ArcSde database type: Oracle, Postgres, SqlServer. Only available if connection type is configured to *Database direct connection*. - - *Username* - Username to connect to ArcSDE server. - - *Password* - Password of the ArcSDE user. -- **Advanced options for protocol arcsde** - - *Validate records before import* - Defines the criteria to reject metadata that is invalid according to XSD and schematron rules. + - *Database type* - ArcSDE database type: Oracle, Postgres, SqlServer. Only available if connection type is configured to *Database direct connection*. + - *Remote authentication*: Credentials to connect to the ArcSDE server. + +- **Configure response processing for arcsde** + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). - Accept all metadata without validation. - Accept metadata that are XSD valid. - Accept metadata that are XSD and schematron valid. + - **Privileges** - Assign privileges to harvested metadata. diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-simpleurl.md b/docs/manual/docs/user-guide/harvesting/harvesting-simpleurl.md index 775b4a9d1a9..e7243dc8421 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-simpleurl.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-simpleurl.md @@ -4,47 +4,72 @@ This harvester connects to a remote server via a simple URL to retrieve metadata ## Adding a simple URL harvester -- **Site** - Options about the remote site. +To create a Simple URL harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `Simple URL`: - - *Name* - This is a short description of the remote site. It will be shown in the harvesting main page as the name for this instance of the harvester. - - *Service URL* - The URL of the server to be harvested. This can include pagination params like `?start=0&rows=20` - - *loopElement* - Propery/element containing a list of the record entries. (Indicated as an absolute path from the document root.) eg. `/datasets` - - *numberOfRecordPath* : Property indicating the total count of record entries. (Indicated as an absolute path from the document root.) eg. `/nhits` - - *recordIdPath* : Property containing the record id. eg. `datasetid` - - *pageFromParam* : Property indicating the first record item on the current "page" eg. `start` - - *pageSizeParam* : Property indicating the number of records containned in the current "page" eg. `rows` - - *toISOConversion* : Name of the conversion schema to use, which must be available as XSL on the GN instance. eg. `OPENDATASOFT-to-ISO19115-3-2018` +![](img/add-simpleurl-harvester.png) - !!! note +Providing the following information: - GN looks for schemas by name in <https://github.com/geonetwork/core-geonetwork/tree/4.0.x/web/src/main/webapp/xsl/conversion/import>. These schemas might internally include schemas from other locations like <https://github.com/geonetwork/core-geonetwork/tree/4.0.x/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert>. To indicate the `fromJsonOpenDataSoft` schema for example, from the latter location directly in the admin UI the following syntax can be used: `schema:iso19115-3.2018:convert/fromJsonOpenDataSoft`. +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). - **Sample configuration for opendatasoft** +- **Configure connection to Simple URL** + - *URL* - The URL of the server to be harvested. This can include pagination params like `?start=0&rows=20` + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the server. + - *Element to loop on*: Propery/element containing a list of the record entries. (Indicated as an absolute path from the document root.) eg. `/datasets` + - *Element for the UUID of each record* : Property containing the record id. eg. `datasetid` + - *Pagination parameters*: (optional). + - *Element for the number of records to collect*: Property indicating the total count of record entries. (Indicated as an absolute path from the document root.) eg. `/nhits` + - *From URL parameter*: Property indicating the first record item on the current "page" eg. `start` + - *Size URL parameter*: Property indicating the number of records containned in the current "page" eg. `rows` + +- **Configure response processing for Simple URL** - - *loopElement* - `/datasets` - - *numberOfRecordPath* : `/nhits` - - *recordIdPath* : `datasetid` - - *pageFromParam* : `start` - - *pageSizeParam* : `rows` - - *toISOConversion* : `OPENDATASOFT-to-ISO19115-3-2018` + - *XSL transformation to apply*: Name of the conversion schema to use, which must be available as XSL on the GeoNetwork instance. eg. `OPENDATASOFT-to-ISO19115-3-2018` - **Sample configuration for ESRI** + !!! note - - *loopElement* - `/dataset` - - *numberOfRecordPath* : `/result/count` - - *recordIdPath* : `landingPage` - - *pageFromParam* : `start` - - *pageSizeParam* : `rows` - - *toISOConversion* : `ESRIDCAT-to-ISO19115-3-2018` + GN looks for schemas by name in <https://github.com/geonetwork/core-geonetwork/tree/4.0.x/web/src/main/webapp/xsl/conversion/import>. These schemas might internally include schemas from other locations like <https://github.com/geonetwork/core-geonetwork/tree/4.0.x/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert>. To indicate the `fromJsonOpenDataSoft` schema for example, from the latter location directly in the admin UI the following syntax can be used: `schema:iso19115-3.2018:convert/fromJsonOpenDataSoft`. - **Sample configuration for DKAN** - - - *loopElement* - `/result/0` - - *numberOfRecordPath* : `/result/count` - - *recordIdPath* : `id` - - *pageFromParam* : `start` - - *pageSizeParam* : `rows` - - *toISOConversion* : `DKAN-to-ISO19115-3-2018` + - *Batch edits*: (Optional) Allows to update harvested records, using XPATH syntax. It can be used to add, replace or delete element. + - *Category*: (Optional) A GeoNetwork category to assign to each metadata record. + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. - **Privileges** - Assign privileges to harvested metadata. + + +## Sample configurations + +### Sample configuration for opendatasoft + +- *Element to loop on* - `/datasets` +- *Element for the number of records to collect* : `/nhits` +- *Element for the UUID of each record* : `datasetid` +- *From URL parameter* : `start` +- *Size URL parameter* : `rows` +- *XSL transformation to apply* : `OPENDATASOFT-to-ISO19115-3-2018` + +### Sample configuration for ESRI + +- *Element to loop on* - `/dataset` +- *Element for the number of records to collect* : `/result/count` +- *Element for the UUID of each record* : `landingPage` +- *From URL parameter* : `start` +- *Size URL parameter* : `rows` +- *XSL transformation to apply* : `ESRIDCAT-to-ISO19115-3-2018` + +### Sample configuration for DKAN + +- *Element to loop on* - `/result/0` +- *Element for the number of records to collect* : `/result/count` +- *Element for the UUID of each record* : `id` +- *From URL parameter* : `start` +- *Size URL parameter* : `rows` +- *XSL transformation to apply* : `DKAN-to-ISO19115-3-2018` diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-thredds.md b/docs/manual/docs/user-guide/harvesting/harvesting-thredds.md index 2c988d58e34..bb4716c7508 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-thredds.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-thredds.md @@ -4,35 +4,33 @@ THREDDS catalogs describe inventories of datasets. They are organised in a hiera ## Adding a THREDDS Catalog Harvester -The available options are: - -- **Site** - - *Name* - This is a short description of the THREDDS catalog. It will be shown in the harvesting main page as the name of this THREDDS harvester instance. - - *Catalog URL* - The remote URL of the THREDDS Catalog from which metadata will be harvested. This must be the xml version of the catalog (i.e. ending with .xml). The harvester will crawl through all datasets and services defined in this catalog creating metadata for them as specified by the options described further below. - - *Metadata language* - Use this option to specify the language of the metadata to be harvested. - - *ISO topic category* - Use this option to specify the ISO topic category of service metadata. - - *Create ISO19119 metadata for all services in catalog* - Select this option to generate iso19119 metadata for services defined in the THREDDS catalog (eg. OpenDAP, OGC WCS, ftp) and for the THREDDS catalog itself. - - *Create metadata for Collection datasets* - Select this option to generate metadata for each collection dataset (THREDDS dataset containing other datasets). Creation of metadata can be customised using options that are displayed when this option is selected as described further below. - - *Create metadata for Atomic datasets* - Select this option to generate metadata for each atomic dataset (THREDDS dataset not containing other datasets -- for example cataloguing a netCDF dataset). Creation of metadata can be customised using options that are displayed when this option is selected as described further below. - - *Ignore harvesting attribute* - Select this option to harvest metadata for selected datasets regardless of the harvest attribute for the dataset in the THREDDS catalog. If this option is not selected, metadata will only be created for datasets that have a harvest attribute set to true. - - *Extract DIF metadata elements and create ISO metadata* - Select this option to generate ISO metadata for datasets in the THREDDS catalog that have DIF metadata elements. When this option is selected a list of schemas is shown that have a DIFToISO.xsl stylesheet available (see for example `GEONETWORK_DATA_DIR/config/schema_plugins/iso19139/convert/DIFToISO.xsl`). Metadata is generated by reading the DIF metadata items in the THREDDS into a DIF format metadata record and then converting that DIF record to ISO using the DIFToISO stylesheet. - - *Extract Unidata dataset discovery metadata using fragments* - Select this option when the metadata in your THREDDS or netCDF/ncml datasets follows Unidata dataset discovery conventions (see <http://www.unidata.ucar.edu/software/netcdf-java/formats/DataDiscoveryAttConvention.html>). You will need to write your own stylesheets to extract this metadata as fragments and define a template to combine with the fragments. When this option is selected the following additional options will be shown: - - *Select schema for output metadata records* - choose the ISO metadata schema or profile for the harvested metadata records. Note: only the schemas that have THREDDS fragment stylesheets will be displayed in the list (see the next option for the location of these stylesheets). - - *Stylesheet to create metadata fragments* - Select a stylesheet to use to convert metadata for the dataset (THREDDS metadata and netCDF ncml where applicable) into metadata fragments. These stylesheets can be found in the directory convert/ThreddsToFragments in the schema directory eg. for iso19139 this would be `GEONETWORK_DATA_DIR/config/schema_plugins/iso19139/convert/ThreddsToFragments`. - - *Create subtemplates for fragments and XLink them into template* - Select this option to create a subtemplate (=metadata fragment stored in GeoNetwork catalog) for each metadata fragment generated. - - *Template to combine with fragments* - Select a template that will be filled in with the metadata fragments generated for each dataset. The generated metadata fragments are used to replace referenced elements in the templates with an xlink to a subtemplate if the *Create subtemplates* option is checked. If *Create subtemplates* is not checked, then the fragments are simply copied into the template metadata record. - - For Atomic Datasets , one additional option is provided *Harvest new or modified datasets only*. If this option is checked only datasets that have been modified or didn't exist when the harvester was last run will be harvested. - - *Create Thumbnails* - Select this option to create thumbnails for WMS layers in referenced WMS services - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing search results. -- **Options** - Scheduling Options. -- **Privileges** -- **Category for Service** - Select the category to assign to the ISO19119 service records for the THREDDS services. -- **Category for Datasets** - Select the category to assign the generated metadata records (and any subtemplates) to. - -At the bottom of the page there are the following buttons: - -- **Back** - Go back to the main harvesting page. The harvesting definition is not added. -- **Save** - Saves this harvester definition creating a new harvesting instance. After the save operation has completed, the main harvesting page will be displayed. +To create a THREDDS Catalog harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `Thredds Catalog`: + +![](img/add-threddscatalog-harvester.png) + +Providing the following information: + +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to Thredds catalog** + - *Service URL*: The remote URL of the THREDDS Catalog from which metadata will be harvested. This must be the xml version of the catalog (i.e. ending with .xml). The harvester will crawl through all datasets and services defined in this catalog creating metadata for them as specified by the options described further below. + +- **Configure response processing for thredds** + - *Language*: Use this option to specify the language of the metadata to be harvested. + - *ISO19115 Topic category for output metadata records*: Use this option to specify the ISO topic category of service metadata. + - *Create ISO19119 metadata for all services in the thredds catalog*: Select this option to generate iso19119 metadata for services defined in the THREDDS catalog (eg. OpenDAP, OGC WCS, ftp) and for the THREDDS catalog itself. + - *Select schema for output metadata records*: The metadata standard to create the metadata. It should be a valid metadata schema installed in GeoNetwork, by default `iso19139`. + - *Dataset title*: (Optional) Title for the dataset. Default is catalog url. + - *Dataset abstract*: (Optional) Abstract for the dataset. Default is 'Thredds Dataset'. + - *Geonetwork category to assign to dataset metadata records* - Select the category to assign to the ISO19119 service records for the THREDDS services. + - *Geonetwork category to assign to dataset metadata records* - Select the category to assign the generated metadata records (and any subtemplates) to. + +- **Privileges** - Assign privileges to harvested metadata. ## More about harvesting THREDDS DIF metadata elements with the THREDDS Harvester diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-webdav.md b/docs/manual/docs/user-guide/harvesting/harvesting-webdav.md index 4313483f627..cdd6b12434a 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-webdav.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-webdav.md @@ -4,19 +4,35 @@ This harvesting type uses the WebDAV (Distributed Authoring and Versioning) prot ## Adding a WebDAV harvester -- **Site** - Options about the remote site. - - *Subtype* - Select WebDAV or WAF according to the type of server being harvested. - - *Name* - This is a short description of the remote site. It will be shown in the harvesting main page as the name for this instance of the WebDAV harvester. - - *URL* - The remote URL from which metadata will be harvested. Each file found that ends with .xml is assumed to be a metadata record. - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing search results. - - *Use account* - Account credentials for basic HTTP authentication on the WebDAV/WAF server. -- **Options** - Scheduling options. -- **Options** - Specific harvesting options for this harvester. - - *Validate* - If checked, the metadata will be validated after retrieval. If the validation does not pass, the metadata will be skipped. - - *Recurse* - When the harvesting engine will find folders, it will recursively descend into them. -- **Privileges** - Assign privileges to harvested metadata. -- **Categories** +To create a WebDAV harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `WebDAV / WAF`: + +![](img/add-webdav-harvester.png) + +Providing the following information: -!!! Notes +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. - - The same metadata could be harvested several times by different instances of the WebDAV harvester. This is not good practise because copies of the same metadata record will have a different UUID. +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to WebDAV / WAF** + - *URL*: The remote URL from which metadata will be harvested. Each file found that has the extension `.xml` is assumed to be a metadata record. + - *Type of protocol*: Select WebDAV or WAF according to the type of server being harvested. + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the WebDAV/WAF server. + - *Also search in subfolders*: When the harvesting engine will find folders, it will recursively descend into them. + +- **Configure response processing for webdav** + - *Action on UUID collision*: When a harvester finds the same uuid on a record collected by another method (another harvester, importer, dashboard editor,...), should this record be skipped (default), overriden or generate a new UUID? + - *XSL filter name to apply*: (Optional) The XSL filter is applied to each metadata record. The filter is a process which depends on the schema (see the `process` folder of the schemas). + + It could be composed of parameter which will be sent to XSL transformation using the following syntax: `anonymizer?protocol=MYLOCALNETWORK:FILEPATH&email=gis@organisation.org&thesaurus=MYORGONLYTHEASURUS` + + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + - *Category*: (Optional) A GeoNetwork category to assign to each metadata record. + +- **Privileges** - Assign privileges to harvested metadata. diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-wfs-features.md b/docs/manual/docs/user-guide/harvesting/harvesting-wfs-features.md index 16abfa13bb7..c198e5f5966 100644 --- a/docs/manual/docs/user-guide/harvesting/harvesting-wfs-features.md +++ b/docs/manual/docs/user-guide/harvesting/harvesting-wfs-features.md @@ -2,26 +2,43 @@ Metadata can be present in the tables of a relational databases, which are commonly used by many organisations. Putting an OGC Web Feature Service (WFS) over a relational database will allow metadata to be extracted via standard query mechanisms. This harvesting type allows the user to specify a GetFeature query and map information from the features to fragments of metadata that can be linked or copied into a template to create metadata records. +An OGC web feature service (WFS) implements a GetFeature query operation that returns data in the form of features (usually rows from related tables in a relational database). GeoNetwork, acting as a client, can read the GetFeature response and apply a user-supplied XSLT stylesheet to produce metadata fragments that can be linked or copied into a user-supplied template to build metadata records. + ## Adding an OGC WFS GetFeature Harvester -An OGC web feature service (WFS) implements a GetFeature query operation that returns data in the form of features (usually rows from related tables in a relational database). GeoNetwork, acting as a client, can read the GetFeature response and apply a user-supplied XSLT stylesheet to produce metadata fragments that can be linked or copied into a user-supplied template to build metadata records. +To create a OGC WFS GetFeature harvester go to `Admin console` > `Harvesting` and select `Harvest from` > `OGC WFS GetFeature`: + +![](img/add-wfsgetfeature-harvester.png) -The available options are: +Providing the following information: -- **Site** - - *Name* - This is a short description of the harvester. It will be shown in the harvesting main page as the name for this WFS GetFeature harvester. - - *Service URL* - The bare URL of the WFS service (no OGC params required) - - *Metadata language* - The language that will be used in the metadata records created by the harvester +- **Identification** + - *Node name and logo*: A unique name for the harvester and, optionally, a logo to assign to the harvester. + - *Group*: Group which owns the harvested records. Only the catalog administrator or users with the profile `UserAdmin` of this group can manage the harvester. + - *User*: User who owns the harvested records. + +- **Schedule**: Scheduling options to execute the harvester. If disabled, the harvester must be run manually from the harvester page. If enabled, a scheduling expression using cron syntax should be configured ([See examples](https://www.quartz-scheduler.org/documentation/quartz-2.1.7/tutorials/crontrigger)). + +- **Configure connection to OGC CSW 2.0.2** + - *Service URL*: The bare URL of the WFS service (no OGC params required). + - *Remote authentication*: If checked, should be provided the credentials for basic HTTP authentication on the WFS server. - *OGC WFS GetFeature Query* - The OGC WFS GetFeature query used to extract features from the WFS. - - *Schema for output metadata records* - choose the metadata schema or profile for the harvested metadata records. Note: only the schemas that have WFS fragment stylesheets will be displayed in the list (see the next option for the location of these stylesheets). - - *Stylesheet to create fragments* - User-supplied stylesheet that transforms the GetFeature response to a metadata fragments document (see below for the format of that document). Stylesheets exist in the WFSToFragments directory which is in the convert directory of the selected output schema. eg. for the iso19139 schema, this directory is `GEONETWORK_DATA_DIR/config/schema_plugins/iso19139/convert/WFSToFragments`. - - *Save large response to disk* - Check this box if you expect the WFS GetFeature response to be large (eg. greater than 10MB). If checked, the GetFeature response will be saved to disk in a temporary file. Each feature will then be extracted from the temporary file and used to create the fragments and metadata records. If not checked, the response will be held in RAM. - - *Create subtemplates* - Check this box if you want the harvested metadata fragments to be saved as subtemplates in the metadata catalog and xlink'd into the metadata template (see next option). If not checked, the fragments will be copied into the metadata template. - - *Template to use to build metadata using fragments* - Choose the metadata template that will be combined with the harvested metadata fragments to create metadata records. This is a standard GeoNetwork metadata template record. - - *Category for records built with linked fragments* - Choose the metadata template that will be combined with the harvested metadata fragments to create metadata records. This is a standard GeoNetwork metadata template record. -- **Options** -- **Privileges** -- **Category for subtemplates** - When fragments are saved to GeoNetwork as subtemplates they will be assigned to the category selected here. + +- **Configure response processing for wfsfeatures** + - *Language*: The language that will be used in the metadata records created by the harvester. + - *Metadata standard*: The metadata standard to create the metadata. It should be a valid metadata schema installed in GeoNetwork, by default `iso19139`. + - *Save large response to disk*: Check this box if you expect the WFS GetFeature response to be large (eg. greater than 10MB). If checked, the GetFeature response will be saved to disk in a temporary file. Each feature will then be extracted from the temporary file and used to create the fragments and metadata records. If not checked, the response will be held in RAM. + - *Stylesheet to create fragments*: User-supplied stylesheet that transforms the GetFeature response to a metadata fragments document (see below for the format of that document). Stylesheets exist in the WFSToFragments directory which is in the convert directory of the selected output schema. eg. for the iso19139 schema, this directory is `GEONETWORK_DATA_DIR/config/schema_plugins/iso19139/convert/WFSToFragments`. + - *Create subtemplates*: Check this box if you want the harvested metadata fragments to be saved as subtemplates in the metadata catalog and xlink'd into the metadata template (see next option). If not checked, the fragments will be copied into the metadata template. + - *Select template to combine with fragments*: Choose the metadata template that will be combined with the harvested metadata fragments to create metadata records. This is a standard GeoNetwork metadata template record. + - *Category for directory entries*: (Optional) When fragments are saved to GeoNetwork as subtemplates they will be assigned to the category selected here. + - *Validate records before import*: Defines the criteria to reject metadata that is invalid according to XML structure (XSD) and validation rules (schematron). + - Accept all metadata without validation. + - Accept metadata that are XSD valid. + - Accept metadata that are XSD and schematron valid. + +- **Privileges** - Assign privileges to harvested metadata. + ## More about turning the GetFeature Response into metadata fragments diff --git a/docs/manual/docs/user-guide/harvesting/harvesting-z3950.md b/docs/manual/docs/user-guide/harvesting/harvesting-z3950.md deleted file mode 100644 index 47722c37464..00000000000 --- a/docs/manual/docs/user-guide/harvesting/harvesting-z3950.md +++ /dev/null @@ -1,90 +0,0 @@ -# Z3950 Harvesting {#z3950_harvester} - -Z3950 is a remote search and harvesting protocol that is commonly used to permit search and harvest of metadata. Although the protocol is often used for library catalogs, significant geospatial metadata catalogs can also be searched using Z3950 (eg. the metadata collections of the Australian Government agencies that participate in the Australian Spatial Data Directory - ASDD). This harvester allows the user to specify a Z3950 query and retrieve metadata records from one or more Z3950 servers. - -## Adding a Z3950 Harvester - -The available options are: - -- **Site** - - *Name* - A short description of this Z3950 harvester. It will be shown in the harvesting main page using this name. - - *Z3950 Server(s)* - These are the Z3950 servers that will be searched. You can select one or more of these servers. - - *Z3950 Query* - Specify the Z3950 query to use when searching the selected Z3950 servers. At present this field is known to support the Prefix Query Format (also known as Prefix Query Notation) which is described at this URL: <http://www.indexdata.com/yaz/doc/tools.html#PQF>. See below for more information and some simple examples. - - *Icon* - An icon to assign to harvested metadata. The icon will be used when showing search results. -- **Options** - Scheduling options. -- **Harvested Content** - - *Apply this XSLT to harvested records* - Choose an XSLT here that will convert harvested records to a different format. - - *Validate* - If checked, records that do not/cannot be validated will be rejected. -- **Privileges** -- **Categories** - -!!! note - - this harvester automatically creates a new Category named after each of the Z3950 servers that return records. Records that are returned by a server are assigned to the category named after that server. - - -## More about PQF Z3950 Queries - -PQF is a rather arcane query language. It is based around the idea of attributes and attribute sets. The most common attribute set used for geospatial metadata in Z3950 servers is the GEO attribute set (which is an extension of the BIB-1 and GILS attribute sets - see <http://www.fgdc.gov/standards/projects/GeoProfile>). So all PQF queries to geospatial metadata Z3950 servers should start off with @attrset geo. - -The most useful attribute types in the GEO attribute set are as follows: - -| @attr number | Meaning | Description | -|---------------|------------|--------------------------------------------------| -| 1 | Use | What field to search | -| 2 | Relation | How to compare the term specified | -| 4 | Structure | What type is the term? eg. date, numeric, phrase | -| 5 | Truncation | How to truncate eg. right | - -In GeoNetwork the numeric values that can be specified for `@attr 1` map to the lucene index field names as follows: - -| @attr 1= | Lucene index field | ISO19139 element | -|----------------------|-------------------------------|-------------------------------------------------------------------------------------------------------------| -| 1016 | any | All text from all metadata elements | -| 4 | title, altTitle | gmd:identificationInfo//gmd:citation//gmd:title/gco:CharacterString | -| 62 | abstract | gmd:identificationInfo//gmd:abstract/gco:CharacterString | -| 1012 | _changeDate | Not a metadata element (maintained by GeoNetwork) | -| 30 | createDate | gmd:MD_Metadata/gmd:dateStamp/gco:Date | -| 31 | publicationDate | gmd:identificationInfo//gmd:citation//gmd:date/gmd:<CI_DateCode/@codeListValue>='publication' | -| 2072 | tempExtentBegin | gmd:identificationInfo//gmd:extent//gmd:temporalElement//gml:begin(Position) | -| 2073 | tempExtentEnd | gmd:identificationInfo//gmd:extent//gmd:temporalElement//gml:end(Position) | -| 2012 | fileId | gmd:MD_Metadata/gmd:fileIdentifier/* | -| 12 | identifier | gmd:identificationInfo//gmd:citation//gmd:identifier//gmd:code/* | -| 21,29,2002,3121,3122 | keyword | gmd:identificationInfo//gmd:keyword/* | -| 2060 | northBL,eastBL,southBL,westBL | gmd:identificationInfo//gmd:extent//gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude*/gco:Decimal (etc) | - -Note that this is not a complete set of the mappings between Z3950 GEO attribute set and the GeoNetwork lucene index field names for ISO19139. Check out INSTALL_DIR/web/geonetwork/xml/search/z3950Server.xsl and INSTALL_DIR/web/geonetwork/xml/schemas/iso19139/index-fields.xsl for more details and annexe A of the GEO attribute set for Z3950 at <http://www.fgdc.gov/standards/projects/GeoProfile/annex_a.html> for more details. - -Common values for the relation attribute (`@attr=2`): - -| @attr 2= | Description | -|-----------|--------------------------| -| 1 | Less than | -| 2 | Less than or equal to | -| 3 | Equals | -| 4 | Greater than or equal to | -| 5 | Greater than | -| 6 | Not equal to | -| 7 | Overlaps | -| 8 | Fully enclosed within | -| 9 | Encloses | -| 10 | Fully outside of | - -So a simple query to get all metadata records that have the word 'the' in any field would be: - -`@attrset geo @attr 1=1016 the` - -- `@attr 1=1016` means that we are doing a search on any field in the metadata record - -A more sophisticated search on a bounding box might be formulated as: - -`@attrset geo @attr 1=2060 @attr 4=201 @attr 2=7 "-36.8262 142.6465 -44.3848 151.2598` - -- `@attr 1=2060` means that we are doing a bounding box search -- `@attr 4=201` means that the query contains coordinate strings -- `@attr 2=7` means that we are searching for records whose bounding box overlaps the query box specified at the end of the query - -!!! Notes - - - Z3950 servers must be configured for GeoNetwork in `INSTALL_DIR/web/geonetwork/WEB-INF/classes/JZKitConfig.xml.tem` - - every time the harvester runs, it will remove previously harvested records and create new ones. diff --git a/docs/manual/docs/user-guide/harvesting/img/add-arcsde-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-arcsde-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..258c163bfdac19842b29d6a4aef2f24c9a031da4 GIT binary patch literal 6597 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 H%aH#85xZKL literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-csw-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-csw-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e484359b92226a3b449715660b5096d3dbe06a GIT binary patch literal 16634 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 literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-filesystem-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-filesystem-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0f0d66bfdcfbfcf74d2708f972453a64741a82 GIT binary patch literal 8260 zcmZX31ymf(5-u9t-3jgzEQ>C(IKkZ^Sa4t5f<u5HA&YAuxCRIWhY$iRuECu^aF;i^ z_rCw$^WL7*J3U=p)!o%I)%AT7tMN(!2a^&L0RaI=Nl{J<xb6eR3;h}JAAemPgn)o( z>>w+vp(HCyui@cp>)>RAfWVgGojjs~q)FVLWXlGM&(9~74zK7^^~(3L(w4IjRK08s zc$Z2l+A$Doum2?5_=cuxp^dFj>UoT${WMEVa~M2Y^$Ij?KOR7Rl+@etp%?X@aHE|X zL4)5}C5tkNi@QcHTpgW3j#4^vPd8U{nyYE`Yjfu<PGF%KPP}Prhy5<7>VjtA59z&t z>p{rfqM3eo*}jgHV*MyL)iHC-v~w2LGV@Ur8}Z4v)xzPy@H3t~p#Tq<OrX+I)dz#H z>#&y@t|#%_ChV?z<`i=NLwq|sWtXYX_`;N4?<wRn#A<4Vi*Myow1SE(kg3ILYoi#H zYaK*oaTO?@od~M##xTlrT{1t9H-7q7u;XloY#o7;lsm|Fw}$~g+xOFK`;dk-Y6ohV z8?y<z0DB9idx1=lMe(S2YzWYC5fhCE{c1q3Hqdul(0KOqoZeZLH{B{C1K!rNF;KEq zQ$yeY>gWiF(GCbGKn)Qnlt4j1Kz<*EfCgL%fg+cW^pA8uANilU*WZrP+OkSYz*XDY z!^XzN)85r9vm}ohFg4?#W8h_=rYdUf>da&L+SSU22kPwhR|P>FDhgDcZM-b$q0UY& zo}y3*hJW=C1?qpBc^T;c)y2zEg26ydgI?Cv!-ig%hmVJkK@yXmo?hJJwXLX@ocw>( zfjbEXdoM3HQC?nOUtb<y0UlQmJ6?Ve2*k_xg7?J>ZlDLZr=N?LC6wF6lkwk1{;wT5 z8&7Kw2RAPVR~P!fb}g-3y}cwD82%3Q&+p&!w1GPOcO)0j|11kwAn#uZFFy|-??1Ky zRq?;Aq8biR8z)0K2WP-Nz!;MJ{KDe@>i_>q{yXCTXd3)i^M!!m|7!k^<p0&w^|bMj zb#(@Y^pgDV&iqIDe}(^16zBcB^8fL~zuo+=R>04anBu(u?3pBH@Y%Cw1O#deB{^vw zDB__h8kAUfR<aw#fq}l`nFav?F}@_2u>*ZVI!@~?-c3s399tYQDstR8Axuy+g$1Iy z2U(T%$C&6tAV5cSC_ug0kyuM;$oe(H^4q0;2&B&9yM5{By9~NoZoOIx{Th`V$B>U+ zY>zTgvb*50MT`guCD16`kH|;AMnqE9k-AQ4jEf5;)XhVLbm8G^6yA0x73=Dtq?O%b zvmphCh7wNW1v6C@GUUrm+kpv=kpW5YF{1+s2_o}nN#wXtI{JLMiwHWUiZXOI%?k<* zlzW6Qu)g<Ft0P&*leE<B#jN?><>6v=;Tr==8G1Ihn9n-pGK^8d%3D7&yrDb#HD)E+ zpI(ixggmJ|-Jd1(zTDrFL_!?Z8w)KS)2~rR1ijE)mBk}0!E%$*PyE<MaJ|FRZ`P{h z%i9MpZ93RUAz}K}86t&>hNfL@(z+XlMyvP>dcAs-P1vOO;NQ4)^@})D2w4+Mt(5** z@*1KACD?{3T6@3#y+x(d+9%MsADu4TB<Zz_Z!?^cc)C5}xKTr<q|n8#DPS|KEZq%a z0}Gbd3+}OfYEHYF^Ph!Reo;5c&+Oz~Tw0r{GA@^i#Qdz}tkK$u^(jc_Txl|*SXIOQ zPYs`14h+9#nAcswnrt`qjpuAbXOniJ2S5E@hi#3L!B|F3>kSRk#C3n~^PON{qF{Z? zS-C`O)>K{Mij`jldUFlvOE~l!W2<b6Khz`b&SsaW8CGFs*E9(cA-HEE{OZ)UWx3@P zh!NRPTI}c{7|c~D@>iB)p@+@Muwqr!&iW@8m^A&X^Z^Mxk6c?9Nk7*qoI+*P^x|+i znD<G~CBJl0QPJM@$p*_N$aA~65E2iYb=YDekW=GK-VG`xMqyxJC{s#hA*P~o)GpZ` z$(jsBL}oK>YZO49Iq<zT+o5f=`1wH?%(~4`9LUU(DH77obmOu0{O!#~(uKwC`BeKW zSq{zfap+YE?Gr<7z||3y39{Q0iRA##myU(OpgW^9qW<S>52wStjX`%lJ-^v2EIwQ7 z=%h_^LUICf%5?LpWP~^)nQlryyvkN7x(g=ceF(^DBkGAGdu2G1pI18i$+n5Auc8JT znjPZ&5<DqM3yEm!<XzrpAq-<y$$-Oz9G8@vhBI-E8*J6y%v4fzoQ;Z2wR+lpHvKBh zZPfT(Rmx$4iBcR|>z6a}s&VgN&Aiy^qetT%JlN=b7&97l<==#LCpDgrnbV1X$oI<V ztlevmFzBS8%<FVh>1;+NjZGRDN3ez_hZ^MZ_RaL?Ew=CH5tk_Z<^hL7z%9wvSY93j zBcsF3=~iVro!=(GXQQUi6jCL*P}8E@{ej^$=zCnA6;-lk+JgAScN68_0p*$({wDW3 ze{f1^u=KUZ^dD7NXO9XVR7C3UEc~tOx+V4&OUQD}z9i8OW#qsGO~qYEbAA!O8aKxE zTwu7t^7y#~@|bYN(sKu~aaxVIyfNtDk<hPZfK;yxx{C^hMEdZW`SR|B<j{Qzl&v}t z5!y~hf%6ne9#S@K`ujLfhcyS?5q*f9!}&Z@S|sJX^FjlycsTPpqn%)}zWKMYSh~b~ z0V+HX7-Yk?o>ak9gLMh*^q36Mft1%wwe#UJ%kTd2?$5v{qYW{5kn+>x!(JqrS^jcI zfPhj8&G*~egBtCtqhA;iy6;fbHucSe(mC|2Rh<``OGr2$gHGO22t<{tWexC>*>3~h z8{ZsC9dUyH%oX+K5OSJJ?uF-l3!L|Xl~Bx&5G4_j1P%7wV8R9?@CH)4_x0Ia5&h|N z?l?I-C^pMXOJF0KjTQu1#wIU<g}3~e$hfZ^*b|@Lh?d|ft6NKw|8PIu8kOz7!5Ux9 z4cayODYVe&No6yX_EA*W*?D{XvSi!qP#zod6qJ&o{s{Z5S0*FnWB_USFuD^k|I!yU zm?LIINFwkf_p1}4TBb-Z8|!!bfp?{zQ9dRe-i(7FBJYgg<@TAM#;<}G8Z!!cvUkw% z-Fu&2%6t^CEqpF<r&TA@-T3tVIfrq*U_pW^#S8e<pKbVzM5kuSr@RvHh731hKaWiY zi>1m-6+z!UU*h0<KHZvY@!7Q`Z302-HSr%77Luh;eC)#gUr+JJGWjDekA4lKjh@JS zrIY?<H<nw{=6xXgv($06dWpIjPcD^GZ8IDd%fqw9pw4Ql#$3v%)q`0<BIs5ykwz@z zu01B2IfRJy)uumVPmB8o`bEfAy8cVLpFu~{6(555W7{t6C%>o+`v|W83d7~BwHp$p zdMa_$*NXlo;dGyE3N{|46B;q(Lq&Z?iHzmzus&-(5n7k$(SBO;LnCrx>!%>O*R9Le z)%k6gFBAb2&p+$g2;1*P!*h*ouD2fs6C%y|+4HzB1l2xDW!)xF_w3EO{E};s8JryE z6)tUW^_X<FCibwOV-pQ{q&|FEo3*@u970Us7q@WX7tsVl=W!UpBxfzMi`Lv5RMAR> zU4W|Ju7z<;UZdU)(_ixnkiJOaYzj_ccogl|+zz6Z=Z%`$Y<yp;lys?Tg-=rz9n<+r zd-^i*<@HHn|Hmc5+5O80SKfW=Mq28j<8o_uuLT1I>EJ!z?Vl9YBCs#9DYdnHpAG65 zBBP=_>P5ZxkJ}b7h*&f_{N1Y>fiM8y9WP?<7{3jdhg7T{uk{jBQ~zY5;kSBAK{j$t z%54M>Lq;ppDc2I#m0lr_X55>pqFM`urj=3oI+e_?jM=R#b_;QKg6(;NJJwg;iNOSi zXCJsU3B9gpa6egU%g^^6Ow>zEUyq&rMq5vF()ifc6r7lEn8)|b>2&j_TAe&mA4i8Q z+A%XrqO7)Va4Ax1vuvu~Zz+#$CePIh$S?V&;-=CX-91!T>opZ6{E!Ay1UCO^RDR<2 zuv4qz%UAe_u}GCBk@q);9X%FyLTTeXelr9at!uSMTNWacq9y#*=v&!p(<Do>3;fo= zi@59o&&Zg|*J{p8{fScNaM{48!n(um7LP5=f{$^`ehe+RczB=ir0zA^=O9F6YI9j4 z8^Jqvc|jRUab4K*2dwJ3;?zFteHibOx~p|7^iEpu#h}L);)R$5heL0e*(U<h%A()V z6^KM%eDJUP8aN@&vQH)ZUb4rJM>I~)rIBW>!dfsAlCO*VP#c+*qVOdC%J}kkK5M+x z=!jA*^285WoKAkv(&L?+(k4oc;kLw&Y$-dV<bJQWne?koOH}k95B23J)QqtSr5&G| zLqse!%I>w*Co6D_DIZ2{by~e8L@7_Ai9fJiy&Zo|B7J~hV+^Toc>SYi`Q5FH?@^yo zYK!<6R>wC?><Hg;#6&hiA-@YTs=ChiCZmUhf^NMgspKNN;v#j6v3w6^xGyst9jUXi zQVRO3ctd>-7c^5Cntur?IjZXgyl2Q&h~+@NTR@$M?*!WQfnB~81_riCcdGY2u9<b% zAe(l&=iHU6OB(g;&c50xTf987@VyOh6+Fr{AN>uo->yCJI-awH-RwaZoX*{i+oxkU zE}$g>K}!{MO(Kn_3f3DiWv$Y$N8Irrsq80Lks|%T2iqOdg-TVo*(9*}e(tMHm&bSO z7={G4628PDt@pWp+Z33BW+s<Jv>J3?Ha|Y_{;7Xs@J7EgIOy?cp<J6)##0w%WL+&w zc$~_${khriLUydf7P~RpHw%sB6j82i9|i1$n;I!Be6?EKEHAskS|!Tv-1!HyHIqL- z3YhW~lhrfSU6|CXlgOp>N5_>6PdqEaxc2B6I1g-nI+oZT%h5j)%Kd7)$l~dx6Vt{S zNCz=ZD8)<Mc0MnOKeyXdqP%&;e>D4gwrWQCWXUEXJC>Vdg>z?+vY!2?E?|L}7bUPz zI+cz$qVGqUVJZe=o1-mHshRAZb}Q>JoXS~rd_|w<#A15*0>&h)^65mIL%O5~y32q2 zCP#+N5*3q}Pr<!^EM>7oh3s}MnyySX8W#m8?vcR>ghL~m78|WDd>KBzoWiJ}_3?!b z8xzx8K5{|VW%2!S#x;JDWa^@y-$UkVEh}~HMqm(N&8+QQCb5j+%7HaRBt{1VBUD<s z`b#&QAGA7WR|@rbh1ZZrOcH8mu*$oGW*Fr?=TZ{xJs5~C`u0-A7dYK1eO(n+)H7v? zo?+Y7R17Gdbh#J2{boKGEMXr@5Y^3`;w-Nn@Qxn|3lz9cE^*eUEy(JHv{hqdRG3*U zSfz^hmFRpck4H0(kMGM5a)a>I{_#cyG|A4hB<Id73GI_kx{&*n?a>?+@@zzRLeBnp zGP^`kw^cCJ;mwq`dR@kFu0%jP7r#-w>(_{9I4^n^zPPH>i1}<f+BK~8(e1g>(<vJE zB2dR1RJQ(1A-vw1B39AZPDpEgEoogM*VWOqF`(f`C_hZcsg-a_i7ZBLf7*;f#`b#7 zLPcRv{b2}VX|Y{7-r01iMx-50jb~R>X-La}KW}zyDiko|<n?<q78;~{*P_%B%+>M| z0?D&;hE0i!=N|ERv^!$kcekp{_B<6X&Q>oHBUhwfzh0{jyqMM(41_MJj2puKe7k$s zRM6n&dv9%J1+7QEtu_R*K|YLUG`uD)V0uq2F1@7|_lUbnAV|4|+b|P%AIPbdAyFRL zp+m#UUI<{QX(@yg=;@EhC^%?knOnU1`n-egNfv>Um3gc|4I`#h1tT3U%7zpd>Ik5s z>XUH|2t5RVLuv$45qdHNZi%6nnx-2?1upa!QXf&2sBc<RbYZdY=TOm<rv%UJuaD%@ zi!rPZ(HZqOz30v$ESU!}+*mrqh<50!H??_0@h#WKdGJ15JHJw!kmFal0o1CAZ^qmL zYnMHsBB(Y=S;g;?mYl+PFj8rMV@*3sK~|SVbjpK%Zyo5Ac%(x|OjPBie2=n+TdUqH z7<rpIs9RWVF|MD!MXUIP5baDR`$nh83zX<gMmH*lh=(rQpPu=B+N1hYIeAzM9VJZg zQVaXRQ!+}p(yU^U$A6d17qX0C4NH@Sg|*W==HcB<W^fyOF<Rq2ke5HF67;n!WIEp{ z(3vq<TUV?${aQ*zA%-x(Okv|4TjX^q*Yrl;Zf7R2(!KK0zZ#tlsTutxWBK&Td~2`d z=k!1io@!#}5bno)4#1bzC~pPyUKm;TtWXa6kIIqYF}?R}nY$y5imUr<dS69x&<fz$ zB`G9&HquJFq4$vr<B_#8_HMjg<nkhSWykn3;l&2)5g3yO^E|Ofokp+-pt}J9!Vdh? zAP0j%L9)8pYWDFc)8}NJ7)+uk3IW^K8O8$Bo)7@s;v(61^f<-O84(utY+>N(y<exs zvK?QFWYN_`Ax2!GNB9=zyP7A#ihL+hIa}xxq^-scAy8aI4|VO43Sj!FX^x`E)WQ)L z%8)FMZg9i;W1?JMEtlg>InZLk{5gB^ToaK12`;Y(SPR>f2H%#k(FFFTydvjBNe|sD zFU<H1c&101({jT>$1z`~6uA4Q08V33CY`94?~jD`OqcTZ7CaG$y_N=F+ijJ!x|w8h zy3|i;VCe$W(~dW4wZGI1OG4@TJ6&LaE&@E{x*HCpe3z|I3LK}N4Yjb=5Cg=nORwBa z#K`+vW1(%<ogeA(wO?YqYm#DO(9e8oC8S5QLC!tQa7y+2K5m_|WYCq?{gf_>cw!e2 z@Ss>YnT;uo_^F}NI?0pDI_hLDd34PMy*~TS3yo{evxmJzo{1f=Y9V4Q!V%|g?&fpf zOod7P_ewsj+r&O_1YG`Bnk&|m<PwWx#i&!u6AQ>t4D==mE2gIp_=T=iV1R^;<29?S zksZ+pb;Ba%%1rYhRE@ZIoT*g$_<~|_f$A>NX|Xwx41p;VE{&r4Ix6VX2lL>M{#QpM zepXrEG>ha3glkPZ{DnGmz;mNHVrTJ)TM7`!IKV$R{LJK^>Im@NUufdoaY?i@r*7oy z($++2k3_ge=*RF_HzX3FL1$m+TfWe<sa;`$mBFF-$x0|py}9XbD}iTf{#U<zLG}Qe zn`(A87Df!mu?=~=vAZ0MYD|95tO6T8shy_1?0MT9<wMe~cQQA`Y5py+(m~oJIiTk) zhN{UOG{#XPtvEcnZCS1>H@Zc*v&abRSy2ajJQ;84{&dA;QIe#x_rVOaQ#ot6jpW+e zn(D;vu00EjaKqtBr<BCyob~y*0-dIt8y^vQ&;$V4>$eA4WM!kU*Kn-s<nSJp?1$dM zKG#dE0s;NGE`3@&S>(mbfXhmXYSy?=5rWzsx@u>Zt$+r%Au6U&VPfZn7I*7q3sO16 zJvrrcj(#y=*?8$*D>A$JlM4AnO4T0V(5th(2LQUmM6pt%MK_XUvO<3xiC?t66Yn48 z*N1e1?ccLOp6JoK`%~qzc_ELj(<);mh<VSuQcr{QV4C<o$x)%N2j9^Y&CMBndjzoI zUe%Z7b<cZbkhIqM#{$c7G?H$6o@YgJwZM4-eO!&educ9MRR`kniOrP?k(4;;BO(;a z4Y)bAx$Ip{MQ@IBU2bnRsn1HbZH}!Ziwlh=s2wl6<e2TXac8|*bnV>wwi!pl`SUlw z7FG!MeoVeAdbf;G%!M{qz|!3pzcbr~I%~9x{pol$gESsfm>XDo_OovMOttC3`!X~< z+Rg00<d1E<G~>CaF7Wcmb^TDt!?iq`Z-{=pKU2rV!YTq7qK|`V?AlPcU2hZ)3r|>> z`=4ZNiWkS9NS_lkSWJ;p`d<E?_uBeF0uy$o%n|pSP>m-F%!>pwiV-D{Gje}xCFL=h zGZehgM|n?!NR_yMxWHvt{}!$qInaO^gY*=MMYdqC8#`HVqr&1lUvE<`7faaawWsBR zn?xs-8(lN*6e)kW_=PvR2!ur_n;UQh8j6DBJ+3@G4sIqUBru&jpR8v}2DMS3u@a6A zOtyeS$Y$1o<HVd1KdDU5`(WrtUtb>_cygeticxvYAtoY@GYM#KkCpn(jww(hG%}|U z5bL6GX?_SKyGi(+zQ)ACDd90~TYZn(H@KSQ&4=+|L5;8K(-k@m07WSAM~OcV4Fe6g z8v=y366I`2%ksc;eZnH1Zy3AH@O`5S15c?#30u6Nm4mVA@}_Hvp_I8tk|XBxio_wo z#6jA-P*rGGL;Mi#i?!#u@@hjO;lULG?+ce}r4wX<pz4f%?ZwC56!z(=2>lup;2LX^ zXFQ0*?!e$!f4Wr%El8I>z&8d(Hf9u|FQFkRPu(G?r*a^DlL5!>a~3yILslj6-ERDz zt#IiAlqdZSfkq<izB6nFOrVG#23AcQRAsu8b;4oJjF8s=f@cjQe&*Hq3wNdt<oacP zz0$r`GhRcizmhKm@Y0$^4F@^E2tbdr&|MnUGpq^&)ajRkiI_O>>GRdovjmaPHcfI# z%;N93W~>i6xG=WI@>ZyH;o>BSow8j!a?U_LD4tv!^Hm{<wzS{hpg81D#}zu`L@sIO z!~J%aYZ*X+qKI_@M~4)BGMAcpGD@?*eznPvEhtOSp{Fk!ph2vkX>&8mCmdr2*Anwv z4`5UEE}5|_3ILHg23(Iny=)~BgQZ<yRY&WSU^@cq|AN6dS7rRg)_N`mSq+PmnBKcc zK5;HtB*7zoUY#jCaXI+m)}0(Xs5fC3$oX!z5WXrWyZmY!pEVB|*_lg2BgMB&pz<rE zwHhFvAxx1{P4?M^hpBbtOMX(%+itv$u3tloj{)W@g0DzgDB4C)XAlBFx!_|w>X%*P zeIAmEn9c^}TFl{^0^}^cq-3t055lSFi{@ZHcVyuVFqhz`6T;9TI3n`1+KWK))2OaA zHtdoD_N77y)+p86J{HZ|ICLsi{N&(`fkYGBgtF%nzp-l!8=`to@UnEe)mdXRlXqjI z36A~frVStZ`!K)nexD)0PU+64*rtnq`xXwM?{c#a|7;p`G?hqt5kb~QK5VyMbV?Mz zjW&P>(E*T*i%V~pu+xoID%%{%Gf@9`pMeC5c|MpEHEMnMF1;X%aD=5|yXjY-K%64G z@A`M`*wK$?NJzM`ZO&)U-spURk;QrDmI#^_H1VxF^46x|A<1sYSg^y}T8Z!Tr@^oB z)fF*Auq{B8eKO=+m%YVh$;80`%C#vpx++2hLEz$1Gf~eu=I{ncY3z9_fY(Qc-fYtM zVEaPQ;oQwNeMiuozt*|Qz%|jy6-4(osze%;|I0#-D$mCv5^mc4?E7W2e?Q05NR|kQ zDvf}c__eKJwF!uaOzn+e-H8=A)dWItOo}8-d7;yX0Tbj%Lvw7`%`XZpK($1n8Zl1B zF&Z@kcFD&f0xXLOf+zKx3DSdnlodM9?r+ZS6G`3q+wS|x%<-{97qNs(dmbyv^Lu<v zzkdt5n}Zm_SM}aAAi!uwECfU9E>N8aRUTdzJZhteCxj--KWq)!NIqw$4K}EZ77o{R z!N#;KCPS9Rz-XkpEd%1FwTvYvRx-XZhyi;<553u<Zxb^aUo6X7MA#{t>upc4P%R?% z`vQ!+dAmG<OQT3BNgPX&77ObD1-o!b_S?SNg_V41WV`VxbAn^^zw7H-Hl-aBEKse? z*zLEHXtwl%U_0i{wc?=pm_~F_KC<Qo_E0Gm%*Q>vK2~~WL^h(8Oq{1j51*SmC%>z* zk|QtbC(rD8p67VX0Di1S85kNz8CWGd{hJxYg2C5AyI<Q$rwx{8zTL!ooo(YRd*dK8 zy&yao!CX>b-Zd|z+xxjIEDvNucamidF9_(2^l!^X*SqO5*C3(NJboB0aW$54p<?J3 z^dyUhEsbe;<4{Fuoe+ZG=TW^MUytSfGE9~Y@!hbFV}u>rzYwER^DzkZ=Ri`D>ncq$ z%FlO^*u{Nk?`%OzcsoEI1munFiJ@wALdEhlqP4DHz6_t=-Scad6rx`f0_TYls903O ztUir*c(xvhd0jXtPBAdaAp8y~i?a9AIIDtj467<APVzzhE%Qx|`s^?Dw~3|p4^;9S zxgcF+=r5@*n#Rkt2vn8z|E7;=5uqa%?}M5M1?*-dtIRl&;=t<!ZjJP)tuLp_V#mz1 z|Kc7I;8T)6k?Dvr!7)A%5%Cbq=Yc0#4v4{OUP7*rE?FQ(OQ00n7NJ9lfEbPjCy9?V zxS;>KuGD-S5hF!fCR_Q~BLA{yRR*8uW^I8o%CW-!rVcxLm6^O}GOoeG=}(d)MrtEF z&eLl~j*L%0CX{!GbGX!+`k?}mPhCkzhZrI+KQN3dg+Q8S9cyAG7Yr^&<Ofsx@%51# zgTV-Pv5q%uThh{@T&DHgs8XA#R}&>FP9Krh-hU__6j}#YZvFZ7^}{<_i64(K5$!H3 z-wu6lVgdlVW|V5L4xf%QVu_p1JKbN2(u8&EF@;va>PV_8EssmiwAqP5w@f39TMV1} zWwNNxZ^h})y4Dk?L_1+2wUp?bkzal0d7=ifkXWQ=tBiN_*bU&glYI0E)X>ahKFnA* z-0)EFac?hjnACdQfGl-PUrMy$eNRu1{qbsd_N#RU2^9CO<kPxf(hR~Bx=QWy-}9+t z4amk8m`GxrbXQZQYE+Lj04p=*lYUazRo@M;>}SK+TWuUGlUKZ%n7Kxeo!3uN`ncLs Uk7iRcf4><kL0-vK%UFc}A3?Y>_W%F@ literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-geonetwork-3-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-geonetwork-3-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..002459bae7d3de446c88e771754b8591e629b2ea GIT binary patch literal 12826 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 I<jg|;7iU<K4*&oF literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-geoportalrest-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-geoportalrest-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..31d60f997e76443980ad8744b823dbdc42cdb395 GIT binary patch literal 13441 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 MWmRQrrOZPA2Yj@hZ~y=R literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..5d50e1dce3ecde0be0dd677150675136501a47ba GIT binary patch literal 29006 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 literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-oaipmh-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-oaipmh-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ad14e6a544b51a51415e911130f37130700064 GIT binary patch literal 14305 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 b2Ax5W-M$`w3;e4W1jI*41&InV!+`$*C%+2? literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-ogcwebservices-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-ogcwebservices-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..2734781c718e7c6c0f96f99afa252b83e25b042f GIT binary patch literal 18528 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 literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-simpleurl-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-simpleurl-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7af0255a954967f18088c5a47525e5471e9f2f GIT binary patch literal 21541 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 W@XvD{cF?(43aP7Us8OkA9r_>pO94#) literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-threddscatalog-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-threddscatalog-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..a326a4b7c790c4bf3141fde9b42e77039e6458b0 GIT binary patch literal 22972 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.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 axBfN9o#^p9Qlm3h^_m)8H>}pb9r-^n6QwZ# literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-webdav-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-webdav-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..4b36e089b8d366530a0acf44e660159b39dba8d1 GIT binary patch literal 23560 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 My1rVIibKr*0p2k;6#xJL literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/add-wfsgetfeature-harvester.png b/docs/manual/docs/user-guide/harvesting/img/add-wfsgetfeature-harvester.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3646bc0cf33f1a341ee52e26e2c315f53c1ab3 GIT binary patch literal 20597 zcmcG$WmFwelrD&KA-Dv0hu|c@#XY#YL$DCs3GVLh?h**WU4py2dvNzDy8HF(nfGhf ztYNLY?y0I{b*k>(-~RS@2vv}iKt{wzgn)oRmi#KJ1bkmZKtK|M;DAzFFjp0DpkpB- zq97?ELaJbIV`}lk1OkFK)+t6_8cGqXFWN-r07giN(Jw#?OCy8=tFD%g91XwXVEpuf z1KH7IR7R|&U1V}iw(dI>2zyc@B+pOH%I~&IFhS<dqVQu||L!x_%Fiak99a|Lofini zB4eukB9U^-W3pXXMDQdma!<rExiv1r_pXL|{ySp+(gtIDbvhO*6mjc+8=6h>>vYMl zw+*d=U}J|V)G}P0B<Oqc-oI58lxLWCT8>y3xjR2H<tdAgJQR;LrH*>%dslh;r+Vdk zH&x=Zt+s@{(!EzntJT@}F3BwfW+6;j!eL&}kVIL9u*u}#%&67UClv!ai9h`y4<{r{ zi;Aa+kqB}nrsn#KPM!3W7cyAkZMJY;f9f+R<hLKxe{g%HoU>oKiL9ts2B*UWGOfw} z=2^AAHj(FqqUIAtG5%8*GC?utal`Eld%T<&`XstD@d;t4(%7FQx1|VJZZ#7PNmE%_ z2zsClf`AORfPeu?kiZ8Y_&`8F#|1&a1K$|HM>GfOzpq~BK>x2YB=LJiA!QLsN#I-A z*xtm%+QHn$vH4&_1L$hbLPf(-LskZCY-7b__|3-1gvr&)_Pq%NuPYcRTA4T+lDb;` zuyz2u@{#{X4KPrCKg~=|`X5ysE&0ebWEDt7Z0t=)zc8^dv5@m4l9H10+J7?zD~XE# zS99QqkKEkR(H6|i?Be3W<igHmV{gXH%FWHq%)-XZ#>NQLV03V^b~JQlw05BQ&rbeV zKcXfM#`YGrjutl7r0@M28re8G@{yCj5A@%E|2a<+SBw8WlC{Hs-4<|z%<os2S(#Xv z|GRIXDewDPu!4oF$q!9Y3oBrGfHC;lxW4fINB#ff%Kskmf3(#2A1ygJ{%6boapnKn zQq{r4Uc|-<7}Amde?OW3YWzPh{#Qd@=Jz}QA1m>n%lsc_fpz9b<YoTvXU2~xn5oYM z0U-z>DJrDm3VD)=(5g25*spG_V^Z{0_-}zWUds`4p|J4YFjXQM6O{;4n5_tX9GnTQ z2sEcMWkTuKsmKJnIO`(ets;gi&$p+inctNz4eM9!XWaWlW8C9c+-HkFtJ~(5EZ=Uu z=G^Cg-@Wq9V)$}ligcotV1a%p(2aG=b)&Jsz(6XSx1b~WN(K1PIZ`#JIMWCD(ABL% z2MJOMcVabT=*sY5i*#ZwokEJ_V2~Lg>V`5EWrmR{@M(kg+8&Bpp3BxwXVvwcI-W13 z>-!kJsl*I=kU1S0wd!pBty>3A8qV5l%pTU?Ugte;7tKxu-X5Z#fFqprevIKD!9PFr zJ_)6w^4BGn*E`9od;S&xHwgWyC0dnICx&@Vw(Y2T9i(d4+}2BdopP6oWb3#Z<Eip` zd8~3iSvp1az8Bf$z9R?6S70^k2H#rW!e8m$jB+|xEoqs2No2|^*UTvjsK$q5CVG8b zjjnR@_guM>mzVuM`gGQDR=;8|tzImbS>U)#s}EDFbdaWPefp)M<4<`J#cvCT2ffHJ zon>&P91O(`vvh}@<?EI1)MD%HlI3Y9G-_QeH$vj&`oMRT(F`|=1Whc><lS}J@|ryI zn3ysCv4-x9#gTt2`tuc7T50}l)$9!-ePf<HCm^v%AN<u7!e+f0<f^*JVZGe>?=`f4 zP-YT867kfGpnX+w=+e&_rv1HwotpStXE#dl7IE|j(aV0Z+Y+ZL;U{!uw~+*?g3)QP z0hyHUztPH_6QB=Rw5lBP?P|+3#&RSm%iz5~cm7rCsqxJ1n2d$O$Dt`~3>d1;lKoj` zVtP&Xh1#{>BtdSKT7OoUTK-{JtM4YV(L1UJjg7UTfjlk;X-*rrqZ~S3A1$Xg<#{he z=NoMF8@k|BpRD%$GG5llPdAD2+-;^{2Tk*LU*VhFosO#1zdbE2bKk1=hClX4ezB(^ z_KL9lHGF!UnN0N@)%pBzHLq-X%l~+gf7*OpHGGsfweIya%Ba`6z<0OeV12sM6xFck zv57s4&7gKKDb}Hf7HI7x_+kDwC#ew5>~i4Zw4T96qxyM${OEL{VOg%v#7nm2iOi+j zP@-~PPgXEAx#PKt!1D#oMfYy_^J0=F`T6~JbPJBY2W!5P4O}&AgVpj}rfoMum3p<_ z>A&CO&cQ^^DL?<!^mkw8i$~hO-S-Q0pM?D~qIMy!Qu<B()bw!Hu}%E*v~(f==HHC$ z)E&4i@aZu<vBs@TYpYDPe5JBs?TG*7dis2ZfWv$P|H}_t>;6iQ`_14g-4<uNmTnGl zW32lT_HoDJ4EwNh?S?At`X8z3Y$jn5m&-qXM_SI7sit(0S7Ln&7{d{i#s7D*md-Zp zd9@ULy38HEYR0~1PlRg49Ne*c_GW9t`{>tle(kVQJdM-nLOq_aOTvlB57wkncRoJk z&%UT%HXW`cq`oNFylY|B*E~=g)1x$TsnV9Ww{CG_ynCb=AGYI~qhTI%=_hm#c<Ojb zYcgSOV{{t>UpR7lPenL=ertE#tMYDE<{>0$Emt0G!>ikmh@z3^8RsbsPiMDFBMe`W z_yZnc%=)4pB}720ZoG}Jq}Y+AKI9hFY8vxowD(hKuV(WuR8>&h9CKfY2wO~{N;00h zX<px(@7eRb3%)D=bmKt-uTVal|1?Gf#V%RLK9rVyHg{$}>u1&RT3buc;YXU3y-cu^ z{b)L;OL3-i+RvlXb)JJ<k>KXZd<kiq-mmM;PL?kHL@oid25ak{cdMr<#!<1JBX=E7 zOb<5;EDm^Tmw6K-RxV5JdiPJ;B=hu<+4aVmL@Oj;2A)4;Ecs#(&E+{w*(AI3&<I`J zhtycNSbcAiD3W!ippLL3uxgAYaG#BgGkdaXaJV@>J$SX-#6ErcyxyX|H)@wYx6<px z_d4?{YC4L4((`Q_zu{6~y_wF1_dttip_}jJ^2++(PVkP7X;e13TR$rPt}}8J-|L{n z$_eTUCZSnRr$_s!Cw4?VbL$u7OOKi@>AQawhlZ=oY$u6_)_t7%!;w;Jfp4!9R!aFr z$1a<R*7HQiEiU{X>nF><YPNAdbFM9{zMOO2E&0u_3dy3{vY&eElr35xFQG)pbNw^t z^t$Y^-i#AFoiK%$CU|{Wq&dx!Ah9KYPeDDI)<@O8mTp@-YuYEio71)#jCKOI*Me@m z9(I#YLnxv`D)(Bi#xU7=n=zG%r(5;f+>L_HfS+lV%h{Us(M)OF&DFSoOHUATJU92l zeS+i8K<tz?8xjfs%H->`ynyb}=IU)0-%oK=<-L=P^p#aP{vPD!e@hENOs*c{N{>5- z%DTx6KPd|fmkh2w%?A!tT2_N*%i&St0tg;9+N#cerBklIMy54F6P)2Bb-CT1&(N$i z&EH~3;3Hnl=gZl;$hEFp)eja$$?auH(1ctPPn49l9Ou@YhIPFZJYUc2+1;VyZob;@ z)KtlxSgkVq&fomy32tQWcpYlHIQ4L`OYUfrPx9OwYutjWK{)``{aElZ*sZT|Y5x23 zi(~(v6H+%P5>D%QV^q6g|EP_opTyXK0tYh`t2Dy`@t;sv?2CD7O|<FCO`?t`H4`#X zAT4*|ce7j6GI@qh`CJxd!H}cJ%+<Wb#VzE&#J9d}toE$<O!jO!s}9sLx8DmdMQUb7 zuDI=IR%!k=weIwRRQh+`gPMHSY}4`LJm3DJRc>=!+2Gu;>YTnz`)dz3w}$N_qt?#R zd^PhBulYm{3-fevyc~G2?di0oN-<wtQr7Tvj9G3>;LW3-IdMlP*R1^_jo_(QB+p<e zq<$3DE~ONe|E2{RO8NUxgxP25rQPN5kIk<x$dW_zCp%+RquHoQ99R{bileI!#aV~A zrFV#g^2@VJb1(QQ{OvkyIn_TdFCZxNuRKw(c2DhB=;HYA+ZA)6&k88OVRR?SHZBun zr|pt&j-KOZyC329Ud;5F9GFKvXEW_BIPa#%1s*hiYk8ZjS>}yk8C}1TAJD3#O15lg z--QZq&q{Pg-%_l<{Sr^A6WMKftD2j=Nh<rLSXlLAXe898e$mwa^*f|!mqwfWpB~;l zWqIs+944KEs`kh4vT;;JpNp>K1uEOd;0bMgXxVu<Q7TGL>X+qi8FiagF1PD`zCP@m z=)Sext^GWvtE2y+QaVk??zE?qyRLtk+fw39V%71fIKo{J>(S4v@b19tk9}Y|n0+zd z&DFrKoJFeb?fM6+K8|;5@2K8+(DKg)zP^ZAUfPDW=K^FRmt@{saQmv_=?+B{cA(bn zERGOS`q$Xm^|$#-t(T`(Gcg0D?SI{ft}mGnDEo7--rtYFL=N^W%=}%S1^%>YKM!`? z*lIE+!xhyc&cXHHiZyUnHkDHLk1~2cov3$w4Lt@HAz}y#V%fT-asy(~FRFr{MP0`( zkajbL)wuf`7QSy{A5JFt_4#T%u437XcusY*2Jty+D}sH@mgg*kS9YdWv2aW@l`h>O za1L(oXQ&bz&FSX@E!K2y{^+`t<TBC3jlf0b780*#p}onUXKSP>F40L94r}frNyfx@ zXF=7{<$q@9PTOB8R(_H&+TX2mbdMtLZP4g?B<&pAJuaR;X0_?=8zgj?E@)xOMyDQL znnkaLPBy)w@Przl7CUi{+ns>Fs;1nvxa}ucyx2XclrHX9_wO>QEb%}6+b)AA(z))# zSn9$0{`PXmTw~$Uy_hQk?`G{er)kDL@(p|BLS4_TPuI2!HjPqR#$0?E_QS`<?Pvl1 zm45aM*)NNfgf~4zv5A?^OOi^qAw-T7TH!~*Bwn_6t1kMX0jOm&Shw>Ovouy}T7hco zlE42xH77$)UooFVJHembnQ=cfFV9Irb*;PFjWOhMYG6N(2HLb>uU9#$!<*g=sjfFi zCwm^j>95IWxs3ljW8~aAf;4*ddbmNvtGQcn<1D?*cgklcf{(6B`95LsjX~tJqi3_r z>!Mw<YCqC*#p@@h9nSO3r@QRg^4`PS<lBA|ZIhwrzOsQOg9K=s-)~37r^|-HM8eg7 ziuxE^oR0UhydEv)3#D=TLq<G4R{bWhX;s8ZkkC}@YT<J|H<&Mw#GJ1+kq%Zq_Jt?5 z<#R8%dzir6P%VCaeR&$D^#qo%C0WmXaI!RkGL^n|P7y886zln-nB)&Kw<bS_Q|+<m zY2RrAMRYvL-e=<7TgK&qjK`i%r0DpryC|$cy~l^*t<^c+erJImKD#F_m!Iptao6je z>|Q75kWoz*^J{!7+g<z_-{>8nFuip)?8HAZz6_lFp3h!sgluSOuEe)YvMr_7O+nM_ znxCi>q6qfCc<2-gn&={2&kwJ7yY2Ya;X|pm<vq@O6+s~2)!H){;Ag_na#EijF)^?A z(`w56xme&uQhc<se(8G~{e|4sk7vN;e7JKuU0HNGSyHW6Zp$n=OxTv-8)%1&B}dE} zl1Y{+yidl4oeWB!u}$Y#;lHmfS^`J;Z=eg)Ws(1@xvHv?+sNrQOtLKP=!t?%-h{Ir zG$R?#wPo?d8|ipya`<Ak;2zGnx|eRfr*L0#uH#-l+Tcjy+3eWHZNp(>(QsGNk*-~H zX^EF9tu4`%EUjQnZaY%*webvx$)&^NO=QZ@Aaqwzu87UB8-~+%V`+?CH5GUPHN@vt zp4cVzf15_Os&ucoUyX9gYs2gxa;|%9D?CoI{CWnUC|mKGQ8?oiaXAMbV%|idMM)x^ z5sZD##A6X|k!{9?;@BKvWO;FIp=$LHns58c+-L?c<>qIKIM9~_SRxb^$U#123jClH z;bhb(wQw>8ETD+fXYxxN7i!nvXEb*hUZR}JPw={s$hp5zEKK!qwARZN%C%@h_3`7- z`d~U+aX%O(|3@OPaeTV}1rtNAoD7n$3dq)5blr`bnOURYr!Tc?rYbj4+q6D4R|1!? z#7`tWq?9)E_GR1hKO_w2Y`!e~Nn5*dGWce0^bk<TSwfc5-Y=){^LcLJHzSt(QujyY z)lwcVn#Uz&!;bki)zPJwMIJT1%oPxra`h(ZbJqS^LR^cC-<!XCE6C0j?ja?8iTP=u zvN!t&CoT42Ue$8ttzB<h&&#kmFrKkkI!nr~l;2vvLb#uf9XlpUN#71|(LZm0e7HxU zrS^j`{W8M~UDYvpLg0apO|$O()&}bl4M{D>`dPdFX-@fo%j9-isnQZ!<I(NeQJWJ6 z$@d$K5?w`h)^}Y?sU;FxeRIN}<#F@tQQCLYv}mhy&`VQ594sZ?sV-%IRL}HMchKBH z6g8n}a^2vRNmb)bMj2cvG+jE;3)C7yg~Y-$3Y6tsRms9HF*=T;csOomL?lv`@lJPI z6;FL|jKJA9{2rpF;Z<z>84pU80MZd98(KfJt1K@XYLZ+3?AZye{G-P@UfK#}$>mXV z^+W(%sbYT6HU2+NR$!_t<UXH~bYtyfONF1p{#6%y)QDnhCVMPIrj8E$FaqI1JqST~ zikwXd%!=v${X=@#hrvd!MQVL`2WN+^l}2U&N+5wcNIx>vschE2v2R1yO4RybX)@`! zY9kFq{sVkarPnNF$(x{)v-1y6$4xf%L|wpbZJ~u674J>ProL3rL{3Z!H;-Zvti9ha zqQB2rE;snGq`7o?iC*#GKyKBv6x$;0V_hLI)($G<_4vF*RE5P7Vtu^0`6~Koh1AJe zgVXy^Bv54|gsf!)UJP+qTI@$kAAWPhF9(m#A^Sd)=R5{mlb7W;&&&lNR^mBHNCrOh z)>{L2*CZi`t)4tdQT7^ycw#n@SzrO{m6km}hYTq~dI#z~G|Z4wd)x3wjZ2tg9$={! zI4}mmB}tRXfGR!)tbU5-oGLj3g0r~0am)FtlMvmVevHSRc=_&WvI<Ec;*GmKmJ`S> zI<yA@2^seWwP`C0Py!7UiPwE@z?$!nq&II-*lSrnZ#%~CD2(5tp`L+E<8Xgx#au^Y zDI}UZUT>=3VX>Vin;b=wQng;&4y+3pUe9r#>dvqyC=hZi3J7v<jwtlb0&(;XKzo(r z_gj}1Lfz4(7?_e*%Ts8y$WZvw(ut{%U$c1N5wi+rgnHdmP0E$Z*`C5iz(cZK?l(t? zMSK>+3f{~0R=T5Up95!&#xl4s$-XZ6vEsSr621QJc;00`jgw}I1tSQ6zYU;C<ecH? zxeB@SkmF<l49k?S?K2QZH#Rx!H@}BZr>iY30B0iq{q9N(wZ8;qfI3L93XQZK=P?w+ zq53fHrbNjmreHOeECa4~U4KX%<rUo~S)LtF2t7d#)`ZfOc{rS@c|g~B(WKULD1q*@ zZdwlWhycn?;OXD*IJph$0^rU!&9VZ}s6Mjf3*`S9GEKMI3*l{ixm_L}i1eFASn+x~ z$=jIp*tzj88VQSGbO;qxK~+Aq8p;hM?n*wW@2KXTqmfP9LE*brXaG=d3q=%HH#)sa z;CTN>CLP+LR{LEkMFT&tyTj@JlbU|w(=^K}yPM;A95J)8)?ucW5GtWxzX3)_(!h%U z<y-r3N&1-R+^^!d*Sn5C2vOTpx%VB+9nWklHVi?6Oz0s;`i|PsMD4?s2!R@TpCYQj zU=n}{zz87-6y{dN|NMRD@$QV-6rSRiESL~Ooc70bQ6%j#Ko>DnoB+`BSUeJcm)LCw z{XtRUx9O-(G%?=_Ki$`V*IbV$bRYeP8tt|T1@ut_o^4%*85`~;fp;1U%a<}xt#aO^ zUF#O01O{>y{zmgZ4!k@bSJ%GuV#+s$Gq-d7fRl;{9nQ!?Pv@>hT(ivhPQPr`kl6z8 zB`d1xy1OMf@mZu>nLIAesC?Hk%a+w`9LMg%XYEgNQ?_}fjz=?tnXX%*&2+<#6rM_^ z%Yd1}gS^I?)=pN*E|{?EAO2&n{MH+aX;SqxqbwgN+sQ5q9;3tFs{)aDP`pymN^0EM z%vETfMslv%^8LKUI!gK*Nx<V3@qDuM$6>lyo>?(>{pT59X{lT$*zgZmM@n!yE>xf> zX(oSBhRA;T<cE)+Y)QPIYu;b9)p&V+yjNi2Om=#0&zHl7%4O>M%WpqgFaBPFq_Crr zTubq~`lE=Bp~l+?_}uHBuBYXDYAen|Pz(d)sayx>hS`q+lt-ufMVb>P48ymM!m&#G z1#qG~BgWzi`U<pDB%ark1&Uf%830)|h48QCti4LeAI|!6XV54p8kbdg<uPSAVgi7Z zh5z~^#1~`Vo;u#9zY|_vd%qm(=j{w9F*=O29UA<Nz{A`#6uY9Lf+HB|H#Fm5g$aZ7 zjlcr0vgj{i0?}IJJ44h9S!C^28GeE($0bCl&HFtJF*@0{=;9J23~##~$q8Nqi2!^V z3a3FQ#C)YT=i(j-5sciYb-KU2nIzrPR9tI8s3c5!4w5=|<Kz3qSFW<rhsDdyWD0Ab zZ+XG9P?+o<H89Ev!k=z}>4u}N5<aOjCnenO*yR{fmz#mLP&rCk<q$hq5v|4}^FfQw zH556_Nw#N~N}+E?2o?v0Ozil%;ST|+>cvW?OUS`o0+=E>^rQ;5#Tu#*i(`{$12|Ac z6A!{mQO2MhNJ!-aUY{SqEHIaW0MpwZQ@@Q1<tEsP1x6)ZCPVV|0Jz;u=7JNhAVFd@ zmcTLS0cVg1sXl-;_CHwgM3Ke7!<3C@3+S(*Y$LP272AY8NSC<EAOWnfD|(5Z*<I08 z^Piy+hHTo~W_1B?<H7Q5%jCYF_;YN4FMxn#Z#v;;fuTnS=973}v{Z@<6r53Up%Ov9 zdG||0(K21dhIZ(m?w#@X#+sdu)yVHpRFHfx#d2t|z)Wmn9DcCq^c&kjMGdX6;5B#> z4~4IHn}=UmVd&|h#Ek8G1TTTesKsKssOe(6zhyg$M-B_uniWPo4tO(mVa!tGPn-6$ zD4||62nXmt!`Md%PSQFygFdG04k5rTdUC|URnWVvdp7Xwr5NiR&sFNKw|izzUHFj^ zE}w_jM3Y>%1B_**|F7&2{DFu4>@#B54M<HIt_4^e9nyl=8A(dyLY$z?gvVUC)2YI6 z1(M0Eae+6Tq04CFcsS_NP_h_im@x6&ZMlVL17AP1WW><$0!UQc{C|hV*-X5~v;>sC zAm)Ap$QW@_@SMKKg_xpLo<-gFS*c5O?GNqNGPYcecum!9w_5!P5Nb+XLulaORCY6| z0m1<g*>f;W23Qr8B$3t@ksq?aMgqd>BLvTe(*Hq2#OjAFisjhA;<?}O@1wL?Z*Nn9 z$2^dv$=q4<ywk-CB|A5}?sJqVA(-}>*L86s0z1Y`W<T57tvfGUbz_c&RDXN?{Cx(^ zPYBsSA|1ETkVI_bncAQe&n$y%S%#!!es2dV_+=Oq3XkDBLzB5BN}_H|`S%>LxU8wT z5bug&SAp1MGLtTSOAd^9tcPz)`i3LgT{+ut681Fx3^WVqGJRFkOM{{wT*S<3#4C@) zC?cMr0n}WA=k<VFGL9->+2mo^*qZdyZ{i4?mODM_rK1W(AH85cbfDu)ZWm{J#eKs< zFqMB{)!Jg*kHx9TPDS+H%2(ueO!ox!FWB}V_t4+1dwWav{QFy149$Iz<KO*KZv@(b z28_zJS@tKV{2(MW`gISEuhHm{23;k1*pUUf=uEhFs-Y=nn8#sb1^`bS<8}e?n2h6% zrDgydW_`ZVMMl%0&k1=MA|II_xxY2AY}3Ig9R-WtQ9bgnQ>pV?vEGR5-o_F?o%tJ* zFE43~bAZ=rD$P~i2!5*HB=V)_z>OlI(dS}JacM$jw3B?-fKDOJ(qPY{Yx34lYxW7) z)t@IR5Ll|iBzQk@wJM6sm=VXLTc%z6Lc>d44?PMkEUDPfC`yEGN6`{j0A~0>ob&|r za;j~!S19ZCEi8^)qu@JIEcL_Yt~e;x-_Mx-ib4-Ny6jxT7zNY689+sG$%@Gv=WRdl zoXs+wl0;iYQ!l<>bt4D|`}Vg`l7YGacTKZqcf`&La~Uc4r%%5Eg~F`j<p<lt)!-Nn z@uAn_p~Qn4zJz>@*jNbEU&3T=CwhC&EWZ4S)W7-U0{M+&x%vH94Q{;R!9pq8C!d~Q z03VnD=W8FCp-9n~s(27aE?TscECob<<ti;k)9j<;<)tz>5G2tJp=1gmn5nT`ml88F zRrV&9*4iO$!-h5Y@_^>if{0yKm>~k+I){TKD-@TrcD|0*XzjzJme<E)hE?uG1XW&` zsi=ujZQ`Tb9}6X0nW=vk&`SJ31*!*;UzR3x*Y3oXkLX<;7U<N0iu4@Cb#{?yr?ura zC9Y;>j9*~NaG~(%I8x5-{6Ya-i^U1N(~fr8L4U>o3=G)FrBmqtTlUKU(drHe%0dA{ zStW`yE!PJW>VE>6HBrD`s^^7U6dQrC5{0i8DMqq9inwjocps2zd6_4}uo+frO@`;n z;|9{vNNC$8-0=`oAd>M<#>6|%{ZaWr;hn8{9I}Q+2n;)g5r_-V$NFzmvf3Y6p~Uhh z<oO>8c+NYaS1pP&sYRhY<dIlOhII9yq-iR0Y}!+0mO7C~Tt?VUM+OcQ0K(S6F5xR4 z_88lAiDEvX3_~g+kzj-MYCv;J)J9%76GkokuRsxx$viQ-awC%acpN{_g3Msiq5 z|2~ntX6OkmEfj%AjjONr>*ljl2W->{^T&=qw|9!ao)4_<b}_sxxoaFIm%LxEvb(9F z&|jsQ+jdOHvlyk#LqOh`s-3m<n*dT9{N5WzjCzY{f**OxaD5wsP7zS!IL>#M&<Sb# zTQ-G7C`H{sUaWNc6M6_1a9T&b#o6j^LIf3|pL-t^{=wqBu*?0s(hdj)hque-=4dul zwOozLkC-3bR*nWrxJ|UPI#HwD!;SpjTmU^qH`J$`;g{U7I+ytN-$=}^uUOi4Z?7+y zzTLr3ADQ(sK#et+kaz}p4*O%F8$3I<`e=*fc0edV3FWT4NV1X>>ch>kBHsi+W*Vrd zn%;?Ak)CTG1%)NF^Y7C5H!x(b7+ocdZq)!E*#(CL^#x;a8OZmDX7hVuKswoy=kQ4> zz#)iR53+kcIs!mow-gmYyh{`<S7b@z#TSYiVBB#QIZcMJ1_>O^?X7_sO548HY3^<Y zlO#Pt3&YAHChIW#LXxp=QmcS(-PwEvD6oN7QV7A6A_hq9(tjWPkj$0*9CD(3)MZa$ zD|to?7~F&)+P2q3P@Dc9AU%d=<y9XrK86$Htn5(lAVC@GXRru&c0?Ko6MH{j7(v}0 z&&%iOu=w?0`3W-R?0BDhclFC^euY-ep*9LIO;AlUSS=n_QRK>jQu~4-qcreh2%_@I zO54!D6dm#Df-&R>V2<=y6yG5Y3uca|mbK5|^w>BLk_bc-0#)Qkl%40Ev_G91enGx& z0I+|sMYHfSTA{dUW(hf{H*^NxDSosNHZJcaIcbA*o^jqS)tf@7<2ZeB;#?0{7<+$V z(vU;=wo`y5qn3)292_NyFt3t`CN=_3ohC7AHyco5$74F^70RZ6iTcGE181c72-PG& z=0u7RA->s}3x`04lrz)i<=Wdgsqg*bBteOaD{MhAk{3chnf>-`#%Vf&JD4sjieh9# zc8_~d;5VtqHB8BRiMo$%HHm6r9*szZv@Z&e)8B9lq&uWFN5_@iW)^}4iw<~}DJNgC zv7unq&D$P4*gUK$Bei_{)e^JNKeI4)Z`hL#f>77%$1DI~K7nRnZH<+T&Q4FuMFcf8 z+^QsYEQuZ1qmD7u+3&d%D>2lX?Y=jb$slxb;1d!Vn1`7k9>W!}1+3`?E)b*CK5GPf zawG}{Mo?{hKoKB!UHN&|hCvtL+$Z_x`|O-_(Qjc6By@@|a%}NiVmTX#mAvz`O!>rq z>@u+9b@Y^b3`iNaR^`9Oka0#tsOY48Pz?<-FhlGkCKO)2*sST4f5<cu-JDp^`Zq&M zXee$2yJq9Jfi4i9qV7olE1wOFStloQI)QR@BPJnaMR5|A1^w_IM1>no=@r4)LBYLl zQ}eF%ZW-;|GDbDl%Fv|bO`uR|?&zR_#bFBPJE7wY-oj9P{TMi&XWyy55sTFL$Lr<@ z+Yy0_1@aMiXy$;Gl`zVDoGXD5`+z7R9t3e*83U;KJ_O&r5|TbONt{5DtA}CJ(X>Ho zYJt`jS~_&z^M(8w{6BG%?8_m9DkC8IU?^ydjgWY>MhzUruJFjqvKXA<V2A5sj^=fJ zdQ%Od3}_6l$#10#Ms(<x{ROV*w2jIU#M$>FwB#2lsXW`yM&GtI>zKLx7sd$_LOybt z(@GOL9nWDqBs_dRq~(@l6PJxdJDl$WQ}FCOiykN#27IDJgnz)T3He^?dz|uxMGCXj zzlqIH>6ffoq0U}m<UnpLU&vqI&t0^YzRx=b$FGwYtV5S2VP-=k>4zX(3)Z`vVh5uU z8*%FZK`%$pMt_s9_j#{i1u{|Yw#=hbaJ^V8fYt-y;KkX6Ta3urP)*jJ8aiHN6Z|Kt z=vN$9Mn-;Kgk9A_b8_eEp!0URW{-346Q+^~0I778FLK^0p<~#JP?t}BaoY>skm4^R z)7({Q{ROMuZ!c`>bM{~to29x^%9G#Y{I%B-N=wmDLJ!hU04Xa|Lu}oANL^XfOJ&uc zCMdK$VojuZ;am>?7DQl;MuWfe_Sj<?IdPHO3Nqzq9<fDEx%3fOU>Ty&kaqmoKCk1v z(2*ycgFjwnj$ZVMx{OJ4zds{_<ak8^ytH%l30D_a*RJz^&*j=RVrxWV)^Pi*AH8?9 zKScSXA-|-qo!(~cjP&9Ua{F%%pZ1nE#Nk!6a(i-61dM3Z&?)$dQYF362dM4EC+Qr$ za?3m<dMZpQspXuT-5iR{<csHkG_c#>YBj+k6Gr_-^a1hQ@a`R^CpvB9Fo^N(3$YRr z>FMFxUJo-Z;~|}oSXat(;s?(gKO|UTq#}JHCklhc5b>d~34nNn;r8bD908Oh;IL`B z3<-h+`@{jci;=#7WgA({yA}q6u-*`)@&iUD_y1efoD!_GYIjobuK~P{brp~7k>b2X z5H5WxNp`#NX7AldAXbWUEjquhs#ejDp+sutY&dw8u|hg}lScg}xjs_B@qgr|cy*?g z-a$&h)uKt^haNk-hu-1Bex%@U3+RQa$JS6#$Z@p4=)-B@Icxph`(tL*EUyq7j07Sj z&G)e=5(!2j!!!QkB+M@6<8Ks`r(hnQq3G4%CqCv=jx5I>@Rd>leOFuI%U9xDwIDI< zdTiXUO>1^g-r$6honR=sOoa~n+Tvk?29ltUQJ647wwN?>SoH)^nU!KN!zhju9^rcC zbdAE$dT2z#?VD6p7^1GAVIU=pNEAg9jS$6hV0Ul=ITh_0=q6c>f+z4~*sAhZ0T#cV zrNl@2=%o}s2xS3`r`t%kdA=2-JoVP)4?m1NL_1lkTpVMCshrH~mGNmvnFJ~meVt*N z|A>Y~5Y0*CmhWap+5VHY(ipN<Q3>zm0EN<9h34<PmH@Lzf)C#*j&_3rn|3RHk73ky zr`xn^TI(bP85^f1&k*zJgW;A$(hWs7)6h43ti(U>qC|f&-y2EomK4V&8h8sO3F?EG zwae&Cg1(JmDl$&b<x`;a$8&Ya0$FXkPkcG0xh=*xNCv(6-w48g^%A8^d$vdAJ@+A$ zki^AXZR+SuAcd)e9QnWqI1FprUUD<8O+*m{5Jo?;ZqfjrZTW@&MzlG}uVh>HDM>V1 zLAN<lre2QVUXsB4eB~si0hmLyO_t!FgzUKd99-)PyyP)xf%$-J#V~kpeZnl;(;4Fo z|4L;5BSCX^d>DKv<Vx|-b*L8Cd8}5h#z+VK0OesL#6@E9fkPAKJ|C0pa%iSh*|^+K z4q;2uy!v2;G%;WXeK!h`h;&9~M!LU81*A-{#trlO8O&c8AC)vd?|kDyL_2GjAi7>W zTr+^@DN>|F^ims{0eQnr^0z0hjFV^{B1m}v^KQWy6&{iTG5RLQ7ukR%@F9Lu0#+H% zM8aGiO@G8Nw{st^nt*~S)6W}u@R)&V2x*vBsw+fS&DS(^3^hrONb@iPclD2mQB0?1 z-$1FN!d6sxUtT^#L7W}06O5EkF|x2^0=~HVC+P)KbYy0jy-5RjyZ#YXtu6_30sEjV z$~Hz$Tmf<H$YRm6s#tcGhkMp;V|PYmaw_tn_CYYGr6h22-4N|Y?AUOuxZfZukT$+3 zJ3G8Omi_Dg9*W;^=$37~83wn%y%fR-I6sKlHk!f3wLX^p*<E8lNFo(|&%-X3cVWK) zzFrBt3V|%>x=5W|NW4;|`yiMK;-ljnK0AZz>r{a;tAVU2BcF!)VXv!SoK#M@*JdD2 zfLPLDtbp$2un*B5@6d>6Q6`~V9Xmr^Lkr-uVa{|MvCY37(mgzIVqSfW%n%x{AY8h> z|9&KzFINx_9R3@hyy<4YJYdx*3eWI$pi<pII{9Yap#*u{boAv3Eee|tek!$PN+_{+ z4-aVGRB~TYnOYZoS=Oqh{$-NA@c~aLm0u={m)orM8!ZP$pWKBilRY2&-pXTRDDQ}W zD!GBRWsVS_T9`HbE4U?aq$J~bm^`@e-i3`1@!4J+%Tb&wLyq277@C)};nj7;$D(+W z=sC)_pF(u(s|l1)r+jd3K1shKdn|W6G4wbMg(9HasiTvWcDJSkrW%PQ$;0A%vzI>t z1jeJ}yw=x2-?GKWaxzDzXOPUYnMYb?Ew+oFj-{65wWv=nhD}?>2r;7^J`wE|>$K<~ z)b%(9DcbiwT<uFsgbe=s@DcXJh<-cV+v?eI?hxXfY@*ai>nY;`zm0u$ML^5U%?3v& z_i*x)y*PVulGF;U8dWcPz+Dmnz3xs#qkEo3VdM^aCC%)Yz0YIhVBW~3t~lB(kQ%c5 zr>!Ek(xdBXJk3;mgYVOB<=hdfonOOhw=(}8lVF3*HDmyal0lB0yyiTD&{CGi0P1;? zzv9bLk6j37`dHRjqHWvbLd2zpLeqwAbbVXF2>^Q{e-Gg8l5j)o<SPn)y`s{kj4mlX zNgn;?xz_5IM~Yt~lKeOjqljGiml*?lDXZ#*SE<*`H|~NOe@q}lO#}8`P66DyHxj!Y z5QQF&WJcs*)4Eo1jD@gIaw1~uGwF*~3ES1YO$Q|p!S#ijYdJ6}FaP4t0G>$;RSI<i z;4iDl-4afINU5hy;@g1F*uJq9i;<-&7l-x6Rbj9E=2{Oz!Xx)rZhl@o9S{23aDW9~ zj{oyK2r`&Ta@mR4p;%DEf*f(r@&y=eaC5m%{cpvCJeH>6-HJ*KAyS-JcBG{^^v;z% zlN=*7g52;;dJO_3UktQg=*=*;Ka$B5QqfuBTiEn<c^c@00pFR}vg6#HhzC%PLmo~i zD`kWL-KTmQw~U}}`tDD!X8$;p+rNj(P14phIzZ#VsuA`1vC5%$f$1(&Q>LxSyEpzn zI`s96hk4w%B;#gozJlb9h>FDjtQB3`Kc0O8CMlJ$FeY_jICkk+tb-Ou3PI<#CghPM z+y?#l^lIi4Lr}0)<#%NX(DDh?LaZ>BplpopkKK3U9@E47fvqGuaiY<hN_xxcydbPd z;U1=36+sq(b5D9{+>iOaHidzxe?w{YvFi9(6guro16&s8P-QW!tmdn9m-1+FcI-Xu z_pb^qgtA@brb`Hr%qc#_v)BtBV$%F_INwDj*%PTQ=c?V&**prOWI5&X@&rir<TL*l z4sB*Hm@who&;kgGfJ=cZLomro&m`;_rVPez9~|V#NRE*I&QNCp<O_1YDUAPW9)~at z{Cx$R;(^Rja0N=9C=7<zz|+(9A%*DU&}|ogV_#kcF|7c}ib!UU%OovlZ<ut_r&!c; z1U-nJLK0!PBI#e}+_m=$>jhh60Pg&YB%T{Wo%=l0SrW^RtGVH(6d0r#Zw?#N)uj%5 z5)rkL^4sGZN)4D$UN(&b-QG2ui|C_5p^gcH5E&<@iNb-SQ>QlUChr3sJY7a@knlY` zBMTC4%p&Hh-|aNY*Fy^%YN*`I`q<})p^2>nyE+tbESE1BezR54HsC6t<pf|qlfFFM z_#+SnXHy6M(+?EM*^p!18wsH|!4e`T>BI}nc@Aju9d6O@@DfHI233h#rQ}XrD&g#X z9un0QZZ5#s%S%Z<Pa``#GLReMfVh?Y`m{yPrQ>-s+b!gISeT4x!Dm{p1zWnLs06<H zE@O@>=V>?-`FbwWxmP+#(HUBApLK3%T+crKr8EPC<q<IEvV$b<EF%MxW{|1egU|=) zTmTs+Yc$%|UDm?Ts?G!mL#%8L3ni}oTMDiX+iu^$(27hf3hD=TY;sN7whH?S)+M8` zCk(0`vuyD`pPD#Z#@_C&;Li5JCUmRG0(){`&2K5pN|X`hE27BHf0R!>#j;=9vvhmE z+{{~Be2isRzzEo8Q5Q>9#O2CBH}U*N6#p6Db2|W24wRV6+rGg{14TK>AJPcf_sL;S zWv@nGZJu=!l?zY|^<owEK)|=Yan-BXMv3iD41E~AFzD!=1dZdWA!TArBSI~SZJSzT z)>kZmuyk@0qtgiLfmqtF2pq6rz#&G5M%-h*gCq%hwcE}UO%)$A2O<Zq;JVh1k-8|A zfTtNTB85S=bt+L5Q#KUpku{k>Hqi)`E(ckfp6B_y2uxQ}xs(=60|<EB=)d@!)}I9Y znhmX3`d9*^M5?xmv2}9s@IKqa<%;L#s7?;x9m#CLQEx%2{Gspl^jlwy&dAM#*<<E( z_J>2}_!&AZbF8rS)HrnD5fZiebC1lHIeeook3tKedBkToYW{MEbaX{i6lPi4vc5mI z6*{$n0lZ1+FwRs1TT%VqZ$<f?l0jxfMmH*cho=&@q$FeXdpi*$w4A2xX^*8xbaa{h z-??Bt0R}y)F24RK+L=ZDFNawGHR?%cjq|juCBn;RwgCO)N_7+%M1EoDeDSeP3TaXs zY|kjL{mxg(?iI=<$mpi`yv~(&>qtr*XcxgYcrcvh%|zRn%s8!>AaiP#3|rzAy$g~C zm)L2qg{$X0;L2F4lijep`jUdp!~%vr8%N_j<v87Hwb@C#n!bpE7q63^w4y9KxPC&j zkGn6=;o^qAJ^;~IaB}j#OdUsglCvY<oK34R%&{|{z>}R`i)s3#cCP08EPX2Rfn`cW zoFj`}^-t5KqN$yHB7M)BM6QdOb%iwd3Ykr`f&Vb~&9=W5W08HgL`ew(neGXjxyb6& z@Sw0U0TUhOwpuY8B=`xi(KWv`^2iie-|cbA{HT@{sF&OTk?2D>6%aK2|5O#o{}5~C z`Wu0ci23jQGrs}qU&M}=S>EOy2T}5`q7=M>kTAdDvk`@PbGlt76z&BL1U2<HKKl!H z;-m;0O8D|AcL?0xIUq&B(m^3nOYx&sN>G@HE^p7990v)yktuK>R(^YW4b7E_>0p43 z?Lf8u=XSL>2>&!xHRy$f{zV3t+0zsSmyc9}Yb%6;P(?y<6F0%%g}|2!66hKMgOcoC z0uACwD9inbF89IrONtzY6eo-Tmm)nE>aI+@-|aZs03?){p?yywpW}hT=2XxHblK`) zJk5v1F(A`IS&{hK)N>xnmVZ7mXG*@~KPrL%m(v?an@wV9vD9G0ys{XB{g~(2?6p*9 zG5stH$W_AN-boaW)&Lj7UcQT7%+-(DKgee4&|ZW@KAfQS-n8fZL;E27#QyX4U!CuK z&WR9$C$VLuoKPJoD)&=5AUZX2ErCYmRoMF4<+b&Jcm5wh<%c1^_i2}o)>yM$VB8<Y zRvm-^@-2Ssf+xY6YTp}8|A42rLVGkHsEK4p>~N`)H_4fRn(i^ukc)hoNEl_g_fW?` zKS3i#p((gz2Bc6v`1+0KrW%v?)`np^v2}HZ3S%7lp~rK7ipW)%mCN8#B-gzsQ~$$6 zsEszP@46WXi24Y>mHqhTZuC9B^>yGwF`j5(w7_elXh{KSCcK-6yG~^a3wJwq&S5<V zke?I;uqY-0nKe7*qheQlB<&)xgCXsAMYezvyp)-gHM=n;uG+!rGF67b>NnhrL^T}w z&lFr&PMOA*?I=Xx5Mv}Wf~@a(ss=~>2<XfPkJo`wpgDO=5mF#IrjzSbKw)ppflB~^ zmK78mKf%R2=C_aErxd6bqj1d?C=Q8d@*<&;VEAp`?e`pdLqI|H1K5-&%eKP5@oP*1 zRRXG;r!VDt?|W_)2=Ry!a&rO<O<s@EM`L<0cVyk_ovKEr)Dr+9gFNWsM)Q{+d>|uA zUCHI~t4uQ2G3l^G69P&#Ya<(@&BJ@n70A`%QZwaRv7{n&426ueru9q0sP(j(4zlZI zsbbQOshj#t?N3DHwWIZ<LYx7Dfb#5&8}OBrj9K?-&IF+4sCjoPaJX1;Un5;Z6!q#A zt+%)hrP#eqnIe=}iz5*o44}HVpD!r{Cm<8Bx~a9~9kq|US%dr2$HX#Co8^=3Y~sa^ ze_M%=&V#UsCi&%9GBjN4q!AI5QE*$Ad5w(Zw3T3@9B&r9L~<rT-$d&4&$%73K4s|R z6M&nU)2+ni$hFgOp;Qrk0kl|-vEf|xuCf5q$5hQ~4P-H90NT4kY9ty%8=wNrOOxpQ z(HEG@2mm2wK{oW@K{bg2`RC*Vt<@mGtoK&z8_rxJq{#p>+{e%@Uq%~X2U@wot)Q5J zb}#@_rITmrL;&RmU_<b@&+;acuMS|JGNm0Wtwl)3-&^6?@??<3NW+93S(g7GH#<+I z%9g0z`Dxx>F=Z3)*%_h(iAO5XUQVq~9YK+r;P1Ezh&mhqNkBZfRC^F*lfnP^6aJ!q z2!RI=vUGTu_`Hu2m(<$EzV8KxRAIqWzBJeL{qu~OPw3u7!+eD%=J4U(e$CC6M2<NY zczOVDWkw_j$?iS(;J8WPzaM^<Wz+s(ijbTCOC-#8kSaOE$O8Yt@T>0wW#Ts_6sl8T z>w`b5%CexR=hH2=5-b+c5oJj@slK2B+k*UnfaP2TOD{^l|N4*T`wNsjA^jZH=FK32 zmFvT4s?_GH=A*I&bMkLKM!5VA$hZ^rR@yG3pXURJBK0|sfsH!>8<P7XEzORH<Va=W z3ut0xem~$TB>mQpX3H@l;nm4Qo)SPz*5sskUttP7LJdSEVMsJ+puDO@J3a8u;SxF` za9PRiCWPRrprC$od$C+n`JsPC4@j2euwLP+vEA%G&++x6UixF13~H>!>?$EY+&P)d z51#4bCKWm$p!*4^+Nt^9o*g8O@nRmOA0zPCDH$J`r|r8Uv$=qsGq5B_pam5Sp=;Dq z9uRR1NJGZNb0mdzlkA-zx5!Y=IX7&sr#q<V=1^NexgWvst)+nq+Yrqu2qh);&7irF zpgLH<fNZhIGaJwH!|VTG9*DW0>7vI`{zCxRQ#6$YNHe+69c6%okZe7TObS~1I>rZo z2>0OE+~5NW_fW6A;sb^|ULaW_Vxp}Oh$4>F6zYc#{#Z%s5xFw+4@sPEkjHE+<L0tT zr-{vO(Ih#P{5NJHs`$jsWh`26wiL{ac+C?VqXfKTAGSK>EILeeeDfb@Vf2?T6Lymq zIo}{_3^l%hhAG1EsVlTMh4Y>Pt&Vjg0|=AS!ac%P;+HUugcleGyYJJ6#dLu!Uc^e? zv!U=WdqBe8U*9)weEcBx?xq`+Kcx@gp)DGJ?9L^^zHet~+I%+BLw-wvO9<aX7O&8V z=SjDpLDqZ&bO;+oGO1gBllprVGi`vzc90CZ5XVSpZvaH;4>RF!eGhEWOXL`_g*rrs zrKGn_MW+h*nn7>i^P}VCHVuo3+bp1|F>H!b#Fr3z>!+^UZlWRE%7F~FR2U0}X?<dz zXwHVi0q}c*;Y(aLN!E??`Nof@foF&x@Yq`>3<&qrS@`0yt)!`U-S18rr2@OrN1+#i zO%En(9)N~ss6J>`v(>eRtIJPu_U3F|-|ru5!(W82_!#q&n-G>WC9(hZN&4|P%wu?V z6O<|8G#ZUphX4V^C!(zEDmji@u|9R3gon#vW*l#5NO&1~YQXTmPlg5D-{-6bk22E{ z@fEzpy7gC*W!*L+4L?%k3at}muz)bE+uQ>XeuTllyepevYI^AYmV9V>TLTo{H|VmM zXPjy<3EfAV)I|H(hcNrnR5P3azzf}gjARMJp|R8R;=Kql!cvd=qCjJ4zsWVP$j4M& zh|LKF%h`0ZM`kacaSs4?I9xPCSXDB%-J5xRW&xtenH?4R>b+SLmOH05_nWCv+f)l~ zC<r86mQL6!XEzn`mYffNrDYwFcj1fq-uFmWcf2-#*n6o0@(^*^{if%E@gKRWC@~}! zLIx0taA*E1V6lTSx54;T65$HW#NOgw*sb%ROv4N`%^g6B7jFS2gkYX5+4r6gI*}Ng zXe#P1jb#rxj(|a7(8LJfqfg0qzq<T~{c6qC_F4AISS?=t;m_wxlcL=mSn8s>G5<d( zSdmSY-ozvMsT9V1zpA=<!RKt!M0R9893*yiuHqxxR7M)fl;9zDRJATdL04j8?7eN? zEyRpa3^!3|Xz{B>=RP4|@Jx#xB+^~jxXup@<2mpsgtX&2Zp0&_W4}%G0X+|OKK8h( zqCwXFWh>`7+pu{bFNYi(9kBb7DD{esg!&Vz)77>nxTeANw!E7+O)fBdJ(R`l6;ORq zrH}pj6T#$GB(pruwT(nK9?tPN&COcGM#1TK266S0q-|~IYo-GZ@62cZ2tmPNMQKay zN|rLOfmJ7VY=Tfkjg9G>N47-6&%Rf%w$mx8z@--!0xk_vbpix-RFUmm{pXi((NV$< zX$F^FzyF<6eK^`FqKV{EEv1aNPwA#bF)c%s^1saG0GsWK;f`ov1#{O+l{v1C$6f6_ zZ^NMe1Rip4L_c0|JhI_TpTp=3%%&I?R+ih-RG~Cg)#prdfg%XS4?%1&m*L`*l&b|S zAX`R%coTbhL$S;4*C~>A%sI`Ek-`irTm@{A8C@a%E=dI1*k6w?l2a-oz$3B0$u7nV z2(MI+_C8A|i0@y#UVNyD%47RHu=9CdxNbZul^Y6ME0<kBcGv=>f(%oucmM#i^1oCy zzX2TO5BOOx+xmP!=OqMqOlFp4Atc{tQov)9WSr0j3F^J;ygrOLqlu6TygN^LGoCQA z7@T*X4fUG{fH<gt_kHMEi~<lJEZ}`xJAc3fvXK8*-C|`Zj|hwkON{v_fnJ$Huv834 zd?(|_nLJV0O1uV81C<Dqad!WF3IKTwrIaRM#ZpXz*+%=#k~}O4UiNsWFO#Yp(P;4l znSuuJ&Yc0eN6NMRy2Z3{Y~$MRm6r4bwVL?ZuwmV+#h;J`yB{aug9M3Z-G`8W(v&J7 z24uDS`sRWVLa((;4b-o%g*}K|J;V9n^88K^R-kY`E-grgoE9aYY=lZ-N02T&k8b{R z0uQYwTA?sk^Y@t&G8saDc+`*eF@Ua2(rw^wBa{DXggx*!NfF1ySA>9=QJj+2+f$LA zw8ZId(TrpfHkO19P^shD8HNjPAmn?{n<N377T|+%M`*_RpDK*M1<R+8p^%F%NO(k@ zDyeknp=*eGDs|nkX$S`j0|wUozzdhk4~>}#^hEA4o$~7jT1y)Xb%->DFBXs86tqaJ zA~u1UI|6dc9r1OQ4}DUM5JBM<HPS9c7{yr96&D=YErC&_p_B~0SxDh_DC+&$-K&OT zHDV7&`g#@nt`SaQ&qZxN@BR>&E$v+K1fNPelJ@Ux=}-ADpU0;crzKSA4?_{1wNR-7 zRzdZku7nN%#1ajGBGG2Lr1+4wX_pniUBz&+7|#|P6~Z(^_>N+ZGIjcaDDumQ*yu#z zi2XU%QG@*VLkZNl?iA*c+!9_Bq(aF*;`Ct<t0u~P05O%uzf_lh3yK2}isaUU;?-PA zkC!1CLOT*iLC!dvaC<2!qqcsB=9Lv`5eG5%=xEXQj`T5ihS>KiJuvhB7nmOc(6c%n zVVc6@WytN{w;--MjPo&tR8l=#(AuDlOO+YR$<T<VcLvCz+|H27$hmUe#=}+PPeVcB zlKzUBLO%uM!`&w05(pHuxH*lsg+h@?$ZTCO8;Hg1;<OSpp;VBD6yHMsaSk%S+xX8~ zfkB3mS?x;0N0G_H19*f4eIKAk29bFIHP4}7W7lU7WK-TN(}ci~<d}P*vgklx18l*D zCqUyH@Gm<-F|emr&?2-kHz^oP=Z;xd6a|czfVU-3cq7J|n$~$8nllqoU>iswLFAM` zn`9<G1Ob5*@czF57$|6kDW#Wkyr3kJUL%S5w3e!2e65!1Vij?y74qV9MwE-?kTZiE zePlcja{PRJ*>v-eo~>olH$48Y09p*C^E1gW0tHv-Vv3vr^o+X0h7FSulzFq>peQ<u z1aTndcFUG6Md`W8F@YJ$RMeVKI$xAn1tr2yfRe-s`%8+*p}qtdLE-xLMJ)%?f`EA8 zE|eEP1S2sWCo#6}y6diRKP!yDOeyG`RA>u+3`Dumea9dQ%Txr;D;$S76tNaC$>{)7 zQ6)=-_Ae(06kMVG$Qf~j^U=r|M0&uStyQa*0OF5wn39Me0YgVI*|F{)CL>D6NE{VE zd=2$6e?^)$Z7NIVoGAKDH{B$POd`yh8s3I&Vo&>)1dO1*;7CIeqJkL=fj`{fIPHkY z!4Ksm*Z}imt(X1&V>IZ4q4Q-5LtA`j9l;E+C{Sbq0WfXxIl^g&@_a`}ZEYiXA^v%? zj*p{e&6+|BOs9vb&2Qqwi89)o_goRo&$8fi=wgbT0pvU{W_00E6C;n#*KxqH&M1VS z5ah*y#i-7_QGaw&>WCw6G|Uf9H&smbt59FMh#VSV4u_Z?kKh4xD(Xn{m6^IRftm9% zN5<TygHUh19vkx+rT0g9EDuK6v17-I<B`1ZdFyfMxHv9lagd?lOg$z|nk4z?K+Nn` zg!8j3xI%ODaf2}GU3%%IjuDx8HRdE{95)$D1SQFJ<P463rGWX#h^M1H>3FrH>D=%r zIqhYh51Bp@HB`AMM^FHqXY6O5ikYqvD%r0>89I%UB66TK%+vAo(@|hX^T-a%#UDMj zPF-Sl;}ali#^Hw_uE|MDjn9SRV=ZuAobQoG9x2CUWXET~J}iNL{rbuAnKnW6k2%hx zLFVupRM58~k`87YIYA)V7R<>Z(pSn2#+;6uRF#)f%ssh*{F?%W#%x4MCQO(RR_;g6 zAQ6WZv90hdtJzFCCL;5~R8BbZU^O7j1%1)c+JAn{BOayzbVdjxHXdJ0Wo~YSIkVpe z@}iV+!eb_WoR12Mgol~OPzaCn_~GS7cs>nwsmx{aFqNQf_yBbJK)NqD@9<P>AV098 zUUf|Js0^naUVnt^!(%!u06h6P;&h5bM@&Z(wHEy2*?RdSV39M*2~*5dMkc-aqt!A8 zWz=GSNl`wuTqY4Y$V0vASk$s*UGlseueRTj`gO7ozW}DTFF4i+Nz0NsekSMXm$&tJ z1hOI8FFJ*eKP5{w1gb6q*(h|u=g?L6GTE6M0_Bf@DRlW`YBd@H1w+6Tx?s@TfenH3 zN5B-i{4uo}4S|9oU<zF@=<UFUK=~tJ3SIt~T8)N4!4Sy$#S)%Dniv9xKye~qBXn_I z7i*OvP$~pWp-Tmu6*2^h69H4`;=C@_Dnp=D2$({b3N|Zb2oxs*rqIQCU944xK&cQg zg)S9rR>%-2P6V=kY?aH?(8w9ET<|?J>>Q~+!GkQ1kL*{iS|!8>4I4I$jbOoNjS$%J z;~Qx5@qKZe@GUS@JbZ7hLiu!&Gx#3*haY~>BH@y@^9?e>Cxx(q@Qw6ln{6gM<0XBQ zt(8y?j`GEe7fU$^0W&G5<)ceJw}faRPN<i*nN(Z^ibkO!lZU6v7nFey=b_M5;agqE z4aSWdCrKzL{9F(U+<f!RNksIppFn5JcgiZ{ham-C>8L<E1WO0JVM-PND+t5_kQDI2 zz6#_D1PFlg7qS5uN#X>$q2<e$3&FvXB}=3;Q9dyU0buJ)C3FB#`k;V%p5#5}oO2ws zL#aaW`1Qe1N*iG2L>4Vt<T`cg<Yx)jAzn}tg)lM86)1+GWL7f6EQ?$AG9pkE3XNi* zAh44}BWFO11L2(BAQ1eaWGFSHbQ(DW`Wx6zpqYh27De+TXE5qUBWFZeL*gQ5pxj6_ zat0jTe&me(_S?@595^uca=>5$_ZCq-pc#Vbo^yi3ng|_n(J-Log$)IYBNPy8h0zsy zAlOV$a8=USgRV=2LI~!TXkI!>7)gAg&aw&=OVA$c^(t$9Rz5of3O<J>q673p7hQBw zY~+kajT#BH4W~7ugvc3;l5l=80wE|7RJ)9DYC@-roS`>3#PTXIf6`Gfs-heSibaRf zqD2eMChQ&Xk41lEU}}K1p*&;cflA4bh7ne@ZiVxqli)m*7!a!g`X881mEMT#koHp_ z?O}w~Xcus1!)(e2@~579s_?bxai9o_wpA56Reh9YI)sJ8v7j=7Z4}JmHscrwovTtP z(W&|*|1g@64{L>=u5+EJ7a>2L8OMOnJQd}!WVU}v2ozkQRRJ@JoWaP<O&6u0<&3yN zF}WFKnO|e3LW~zDgu{t5xuMj7H!M};3>~eN8B<4ej=?LjdXwr>O=~#Qo__jiQDCTe znUh1|Lp$O|GI+nhMY+48=YZ9s^u^5IVc(?f5ai<{Kr!IQhHDI^12b4cmHL?aXoI$s zrAE&vsXodvO#mOvbMR(5!x9UGV;~$C=2V1Ekn5p>pM*3zMf?t|qs;g(u(&i52}F%_ zYWOs;E@+oYdISn?ax=d~QaO4UMGzDewn@UX_`*n_ibFbPFrzx+-@uZP!9Q-QRFN}g z&6*`Q7wnmIAUN(+7}cYl1ZFKn{SfP69S|);=h`reGJ3_ae<~(Eizmlsj_(Tue$+`_ z5DP-hOUKA43LP*31HcR`NC^cQArVG?U+_Udzgtp$baotr^HJtdoOO`?bNx655j`Le zRI)(-7^&8|UYrX~L`G&hEG#yJX%VcWL?Xc&Few><f-AHV(a~E&*d7(_-O0yDgIC)Z z$|%P)RJxe9C?yijtK|ryhWA>Jt?4Xb{M5)9jB?zZ+-Qs#(a0ITQ>samCNiS<b*YJs zsmy2$fj-`LIt1u`@fk1zaRd9JLHPWRigUy_fS~YL3%~sGi+IjCAA-ZFpup)yG^m1o z>p<B#u|87O2M##BI5yKHMpw*ZzvIz1WV0k%2X%8z@EzdUSM!^C7|s1@P&Rc}wY&va zXnm}MIUN@{<IOkU6h-D{W<+EZ;bzs*SLbS6xJ)BwaPwpOl_hcp3gHVTr$1urK1Rs6 zXc&ylj7CIzj4HHt1Yn}m20AJ2sGfZCNl_|}!FkZB`AWsQ-`Qwe{N)Zi>=4`DlIo)a z!NX36!Klggg548B{Y(XAjfz@fC^SOH?Vk@*il}84t;4q0B2aLJ*2o#ePGU}~qb<!t z88GL#i4bB%VOqkg?Z=X0AEvB6o}!Kp9Xbg4Jo7KiV--mJ$?NlE>pqqmIfD@tXOhm> zHF5?KA`nfNjS~J*A7(6OrOq+Q&WMP!PEBCH3Pvlu+dP`X!>tNV9u$H&RVs8Mr1^Nz zv88&}tmRTIORA3%nMZ-(&pa8?=##1H!#eT9$}U~HbiJ$^D#(vSf|E~$N1Aj%Cg~9< zxKoT9o12lxLJ++Bku&hvqKrCsii@0q`AIYg0>S%2CxFS?wQE;VVCI#K_7KA}0{B7M z{Bo=_@^JG;BWK`sjZ2S~_qS0-=AJxbXEesT;Kxl$3@GN<ae|3XJMplSkM?7Z;*9dm zPr}-O86^00R+z&)+S85^eCaeOlgYR2>FT4cIMLu3r(HzMpkA$;Hq%a~76=~t$&)9G zlMin-9db!RM@FaVM<M|`f5a}Sd{y69@DZ8|fP)2-8Z*{^v4Qz3UR8gtO9Tm&ghw)% zvMM-vc)qJa*BEISWr>`@;~^DBO00oYPB`*u<P1MT2I(3(Bl`S0oq3BFn3q!g=>a!B zQ6~NK<rpeVDd?zpR;{6E*~g<S&WjgPI4+OcZn)tF=`aWkN4;1l#MRdPjFNPU?Dwq| z$q@OMu0F06A#nJiWLyu<jYn1Z1PEPAEG!~)(rM9w(te#*&>@jG6=nqGqw~_}9Zbn^ z!r`<tNsmC*MEkySrLR8w95}%k!RXo56iZbL7anIC7acP-mGBsd=eEq%)UlK*Z!XiB zpVAJ_3uQpjG7&l{%zxU?Ts@V58wy(z7OBd{rKhS7XJaCf2s>IvYdR8jtVQc$Zp>pT z=G$sHMDs+qDT8I9zLMzvs<aKh;LUXfKYpz1kIs>GmPMz~Rp~<6xf%kQAdrnhrykZa zIg;fu1Pp<qLckQds4j;!#t<kQ0;bSq!_P_^0!4*@DRfa?4r`1dP&Nciq05G!l{N&5 z3IS8-qPiT`7(<|J2xR?YNlDK^%hnVtZ3q|waR~6(DpRo$I#Z-9pCM2I5cq$JG|#z8 Sp(R=X0000<MNUMnLSTYUvgv35 literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/harvester-history.png b/docs/manual/docs/user-guide/harvesting/img/harvester-history.png new file mode 100644 index 0000000000000000000000000000000000000000..f9064c1a8f3c5e877be22f4e47fa4747b05467d3 GIT binary patch literal 48659 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 II%RtOUzQt1NdN!< literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/harvester-statistics.png b/docs/manual/docs/user-guide/harvesting/img/harvester-statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..b311bb2ec8ee42129812a54d20e9abaa0c37f44b GIT binary patch literal 104109 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 AL;wH) literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/img/harvesters.png b/docs/manual/docs/user-guide/harvesting/img/harvesters.png new file mode 100644 index 0000000000000000000000000000000000000000..bd008fdef7ca5c887baf963baa59aa0219248316 GIT binary patch literal 44828 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 Iuh>QZ3%m6SLjV8( literal 0 HcmV?d00001 diff --git a/docs/manual/docs/user-guide/harvesting/index.md b/docs/manual/docs/user-guide/harvesting/index.md index 46f52f782c5..abea85ff38c 100644 --- a/docs/manual/docs/user-guide/harvesting/index.md +++ b/docs/manual/docs/user-guide/harvesting/index.md @@ -6,7 +6,8 @@ Harvesting is the process of ingesting metadata from remote sources and storing The following sources can be harvested: -- [GeoNetwork 2.0 Harvester](harvesting-geonetwork.md) +- [GeoNetwork 2.1-3.X Harvester](harvesting-geonetwork.md) +- [GeoNetwork 2.0 Harvester](harvesting-geonetwork-2.md) - [Harvesting CSW services](harvesting-csw.md) - [Harvesting OGC Services](harvesting-ogcwxs.md) - [Simple URL harvesting (opendata)](harvesting-simpleurl.md) @@ -17,7 +18,6 @@ The following sources can be harvested: - [GeoPortal REST Harvesting](harvesting-geoportal.md) - [THREDDS Harvesting](harvesting-thredds.md) - [WFS GetFeature Harvesting](harvesting-wfs-features.md) -- [Z3950 Harvesting](harvesting-z3950.md) ## Mechanism overview @@ -134,79 +134,45 @@ The script will add the certificate to the JVM keystore, if you run it as follow $ ./ssl_key_import.sh https_server_name 443 -## The main page +## Harvesting page -To access the harvesting main page you have to be logged in as an administrator. From the administration page, select the harvest shortcut. The harvesting main page will then be displayed. +To access the harvesting main page you have to be logged in with a profile `Administrator` or `UserAdmin`. From the `Admin console` menu, select the option `Harvesting`. -The page shows a list of the currently defined harvesters and a set of buttons for management functions. The meaning of each column in the list of harvesters is as follows: +The page shows a list of the currently defined harvesters with information about the status of the harvesters: -1. *Select* Check box to select one or more harvesters. The selected harvesters will be affected by the first row of buttons (activate, deactivate, run, remove). For example, if you select three harvesters and press the Remove button, they will all be removed. -2. *Name* This is the harvester name provided by the administrator. -3. *Type* The harvester type (eg. GeoNetwork, WebDAV etc\...). -4. *Status* An icon showing current status. See [Harvesting Status and Error Icons](index.md#admin_harvesting_status) for the different icons and status descriptions. -5. *Errors* An icon showing the result of the last harvesting run, which could have succeeded or not. See [Harvesting Status and Error Icons](index.md#admin_harvesting_status) for the different icons and error descriptions. Hovering the cursor over the icon will show detailed information about the last harvesting run. -6. *Run at* and *Every*: Scheduling of harvester runs. Essentially the time of the day + how many hours between repeats and on which days the harvester will run. -7. *Last run* The date, in ISO 8601 format, of the most recent harvesting run. -8. *Operation* A list of buttons/links to operations on a harvester. - - Selecting *Edit* will allow you to change the parameters for a harvester. - - Selecting *Clone* will allow you to create a clone of this harvester and start editing the details of the clone. - - Selecting *History* will allow you to view/change the harvesting history for a harvester - see [Harvest History](index.md#harvest_history). +![](img/harvesters.png) -At the bottom of the list of harvesters are two rows of buttons. The first row contains buttons that can operate on a selected set of harvesters. You can select the harvesters you want to operate on using the check box in the Select column and then press one of these buttons. When the button finishes its action, the check boxes are cleared. Here is the meaning of each button: +The following information is shown for each harvester: -1. *Activate* When a new harvester is created, the status is *inactive*. Use this button to make it *active* and start the harvester(s) according to the schedule it has/they have been configured to use. -2. *Deactivate* Stops the harvester(s). Note: this does not mean that currently running harvest(s) will be stopped. Instead, it means that the harvester(s) will not be scheduled to run again. -3. *Run* Start the selected harvesters immediately. This is useful for testing harvester setups. -4. *Remove* Remove all currently selected harvesters. A dialogue will ask the user to confirm the action. +- **Last run**: Date on which the harvester was last run. +- **Total**: It is the total number of metadata found remotely. Metadata with the same id are considered as one. +- **Updated**: Number of metadata that are present locally but needed to be updated because their last modification date was different from the remote one. +- **Unchanged**: Number of local metadata that have not been modified. Its remote last modification date has not changed. -The second row contains general purpose buttons. Here is the meaning of each button: +At the bottom of the harvester list there are the following buttons: -1. *Back* Simply returns to the main administration page. -2. *Add* This button creates a new harvester. -3. *Refresh* Refreshes the current list of harvesters from the server. This can be useful to see if the harvesting list has been altered by someone else or to get the status of any running harvesters. -4. *History* Show the harvesting history of all harvesters. See [Harvest History](index.md#harvest_history) for more details. +1. *Harvest from*: Allows you to select the type of harvester to create. +2. *Clone*: Creates a new harvester, using the information of an existing harvester. +3. *Refresh*: Refreshes the list of harvesters. -## Harvesting Status and Error Icons {#admin_harvesting_status} +### Adding new harvesters -## Harvesting result tips +To add a new harvester, click on the `Harvest from` button. A drop-down list with all available harvesting protocols will appear. -When a harvester runs and completes, a tool tip showing detailed information about the harvesting process is shown in the **Errors** column for the harvester. If the harvester succeeded then hovering the cursor over the tool tip will show a table, with some rows labelled as follows: +![](img/add-harvester.png) -- **Total** - This is the total number of metadata found remotely. Metadata with the same id are considered as one. -- **Added** - Number of metadata added to the system because they were not present locally. -- **Removed** - Number of metadata that have been removed locally because they are not present in the remote server anymore. -- **Updated** - Number of metadata that are present locally but that needed to be updated because their last change date was different from the remote one. -- **Unchanged** - Local metadata left unchanged. Their remote last change date did not change. -- **Unknown schema** - Number of skipped metadata because their format was not recognised by GeoNetwork. -- **Unretrievable** - Number of metadata that were ready to be retrieved from the remote server but for some reason there was an exception during the data transfer process. -- **Bad Format** - Number of skipped metadata because they did not have a valid XML representation. -- **Does not validate** - Number of metadata which did not validate against their schema. These metadata were harvested with success but skipped due to the validation process. Usually, there is an option to force validation: if you want to harvest these metadata anyway, simply turn/leave it off. -- **Thumbnails/Thumbnails failed** - Number of metadata thumbnail images added/that could not be added due to some failure. -- **Metadata URL attribute used** - Number of layers/featuretypes/coverages that had a metadata URL that could be used to link to a metadata record (OGC Service Harvester only). -- **Services added** - Number of ISO19119 service records created and added to the catalogue (for THREDDS catalog harvesting only). -- **Collections added** - Number of collection dataset records added to the catalogue (for THREDDS catalog harvesting only). -- **Atomics added** - Number of atomic dataset records added to the catalogue (for THREDDS catalog harvesting only). -- **Subtemplates added** - Number of subtemplates (= fragment visible in the catalog) added to the metadata catalog. -- **Subtemplates removed** - Number of subtemplates (= fragment visible in the catalog) removed from the metadata catalog. -- **Fragments w/Unknown schema** - Number of fragments which have an unknown metadata schema. -- **Fragments returned** - Number of fragments returned by the harvester. -- **Fragments matched** - Number of fragments that had identifiers that in the template used by the harvester. -- **Existing datasets** - Number of metadata records for datasets that existed when the THREDDS harvester was run. -- **Records built** - Number of records built by the harvester from the template and fragments. -- **Could not insert** - Number of records that the harvester could not insert into the catalog (usually because the record was already present eg. in the Z3950 harvester this can occur if the same record is harvested from different servers). +You can choose the type of harvesting you want to do. Supported harvesters and details on what to do next can be found in the following sections. -## Adding new harvesters +### Harvester History {#harvest_history} -The Add button in the main page allows you to add new harvesters. A drop down list is then shown with all the available harvester protocols. +Each time a harvester is run, a log file is generated of what was harvested and/or what went wrong (e.g., an exception report). To view the harvester history, select a harvester in the harvester list and select the `Harvester history` tab on the harvester page: -You can choose the type of harvest you intend to perform and press *Add* to begin the process of adding the harvester. The supported harvesters and details of what to do next are in the following sections: +![](img/harvester-history.png) -## Harvest History {#harvest_history} +Once the harvester history is displayed, it is possible to download the log file of the harvester run and delete the harvester history. -Each time a harvester is run, it generates a status report of what was harvested and/or what went wrong (eg. exception report). These reports are stored in a table in the database used by GeoNetwork. The entire harvesting history for all harvesters can be recalled using the History button on the Harvesting Management page. The harvest history for an individual harvester can also be recalled using the History link in the Operations for that harvester. +### Harvester records -Once the harvest history has been displayed it is possible to: +When a harvester is executed, you can see the list of harvested metadata and some statistics about the metadata. Select a harvester in the list of harvesters and select the `Metadata records` tab on the harvester page: -- expand the detail of any exceptions -- sort the history by harvest date (or in the case of the history of all harvesters, by harvester name) -- delete any history entry or the entire history +![](img/harvester-statistics.png) diff --git a/docs/manual/mkdocs.yml b/docs/manual/mkdocs.yml index 73af7ac42b5..40d6d86640f 100644 --- a/docs/manual/mkdocs.yml +++ b/docs/manual/mkdocs.yml @@ -294,6 +294,7 @@ nav: - user-guide/harvesting/harvesting-csw.md - user-guide/harvesting/harvesting-filesystem.md - user-guide/harvesting/harvesting-geonetwork.md + - user-guide/harvesting/harvesting-geonetwork-2.md - user-guide/harvesting/harvesting-geoportal.md - user-guide/harvesting/harvesting-oaipmh.md - user-guide/harvesting/harvesting-ogcwxs.md @@ -302,7 +303,6 @@ nav: - user-guide/harvesting/harvesting-thredds.md - user-guide/harvesting/harvesting-webdav.md - user-guide/harvesting/harvesting-wfs-features.md - - user-guide/harvesting/harvesting-z3950.md - user-guide/export/index.md - 'Administration': - administrator-guide/index.md diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/HarvesterUtil.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/HarvesterUtil.java index cf30c71312c..ce411b33256 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/HarvesterUtil.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/HarvesterUtil.java @@ -23,18 +23,19 @@ package org.fao.geonet.kernel.harvest.harvester; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import org.fao.geonet.ApplicationContextHolder; import org.fao.geonet.constants.Geonet; import org.fao.geonet.domain.Pair; +import org.fao.geonet.kernel.GeonetworkDataDirectory; import org.fao.geonet.kernel.schema.MetadataSchema; import org.fao.geonet.utils.Xml; import org.jdom.Element; import org.slf4j.LoggerFactory; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - /** * Created by francois on 3/7/14. */ @@ -74,8 +75,7 @@ public static Element processMetadata(MetadataSchema metadataSchema, Element md, String processName, Map<String, Object> processParams) { - - Path filePath = metadataSchema.getSchemaDir().resolve("process").resolve(processName + ".xsl"); + Path filePath = ApplicationContextHolder.get().getBean(GeonetworkDataDirectory.class).getXsltConversion(processName); if (!Files.exists(filePath)) { LOGGER.info(" processing instruction not found for {} schema. metadata not filtered.", metadataSchema.getName()); } else { diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java index 81dad939cad..cf8717e5213 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -22,32 +22,21 @@ //============================================================================== package org.fao.geonet.kernel.harvest.harvester.webdav; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.lang.StringUtils; import org.fao.geonet.GeonetContext; import org.fao.geonet.Logger; import org.fao.geonet.constants.Geonet; -import org.fao.geonet.domain.AbstractMetadata; -import org.fao.geonet.domain.ISODate; -import org.fao.geonet.domain.Metadata; -import org.fao.geonet.domain.MetadataType; +import org.fao.geonet.domain.*; import org.fao.geonet.exceptions.NoSchemaMatchesException; import org.fao.geonet.kernel.DataManager; import org.fao.geonet.kernel.SchemaManager; import org.fao.geonet.kernel.UpdateDatestamp; import org.fao.geonet.kernel.datamanager.IMetadataManager; import org.fao.geonet.kernel.harvest.BaseAligner; -import org.fao.geonet.kernel.harvest.harvester.CategoryMapper; -import org.fao.geonet.kernel.harvest.harvester.GroupMapper; -import org.fao.geonet.kernel.harvest.harvester.HarvestError; -import org.fao.geonet.kernel.harvest.harvester.HarvestResult; -import org.fao.geonet.kernel.harvest.harvester.IHarvester; -import org.fao.geonet.kernel.harvest.harvester.RecordInfo; -import org.fao.geonet.kernel.harvest.harvester.UriMapper; +import org.fao.geonet.kernel.harvest.harvester.*; import org.fao.geonet.kernel.search.IndexingMode; import org.fao.geonet.repository.MetadataRepository; import org.fao.geonet.repository.OperationAllowedRepository; @@ -94,7 +83,9 @@ class Harvester extends BaseAligner<WebDavParams> implements IHarvester<HarvestR private UriMapper localUris; private HarvestResult result; private SchemaManager schemaMan; - private List<HarvestError> errors = new LinkedList<HarvestError>(); + private List<HarvestError> errors = new LinkedList<>(); + private String processName; + private Map<String, Object> processParams = new HashMap<>(); public Harvester(AtomicBoolean cancelMonitor, Logger log, ServiceContext context, WebDavParams params) { super(cancelMonitor); @@ -154,6 +145,10 @@ private void align(final List<RemoteFile> files) throws Exception { localGroups = new GroupMapper(context); localUris = new UriMapper(context, params.getUuid()); + Pair<String, Map<String, Object>> filter = HarvesterUtil.parseXSLFilter(params.xslfilter); + processName = filter.one(); + processParams = filter.two(); + //----------------------------------------------------------------------- //--- remove old metadata for (final String uri : localUris.getUris()) { @@ -259,6 +254,7 @@ private void addMetadata(RemoteFile rf) throws Exception { case SKIP: log.info("Skipping record with uuid " + uuid); result.uuidSkipped++; + return; default: return; } @@ -292,6 +288,13 @@ private void addMetadata(RemoteFile rf) throws Exception { md = translateMetadataContent(context, md, schema); } + if (StringUtils.isNotEmpty(params.xslfilter)) { + md = HarvesterUtil.processMetadata(dataMan.getSchema(schema), + md, processName, processParams); + + schema = dataMan.autodetectSchema(md); + } + // // insert metadata // @@ -310,6 +313,11 @@ private void addMetadata(RemoteFile rf) throws Exception { date = rf.getChangeDate(); } } + + if (date == null) { + date = new ISODate(); + } + AbstractMetadata metadata = new Metadata(); metadata.setUuid(uuid); metadata.getDataInfo(). @@ -385,11 +393,11 @@ private Element retrieveMetadata(RemoteFile rf) { * harvester are applied. Also, it changes the ownership of the record so it is assigned to the * new harvester that last updated it. * @param rf - * @param record + * @param recordInfo * @param force * @throws Exception */ - private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) throws Exception { + private void updateMetadata(RemoteFile rf, RecordInfo recordInfo, boolean force) throws Exception { Element md = null; // Get the change date from the metadata content. If not possible, get it from the file change date if available @@ -411,8 +419,8 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr //Update only if different String uuid = dataMan.extractUUID(schema, md); - if (!record.uuid.equals(uuid)) { - md = dataMan.setUUID(schema, record.uuid, md); + if (!recordInfo.uuid.equals(uuid)) { + md = dataMan.setUUID(schema, recordInfo.uuid, md); } } catch (Exception e) { log.error(" - Failed to set uuid for metadata with remote path : " + rf.getPath()); @@ -424,7 +432,7 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr date = dataMan.extractDateModified(schema, md); } catch (Exception ex) { log.error("WebDavHarvester - updateMetadata - Can't get metadata modified date for metadata id= " - + record.id + ", using current date for modified date"); + + recordInfo.id + ", using current date for modified date"); // WAF harvester, rf.getChangeDate() returns null if (rf.getChangeDate() != null) { date = rf.getChangeDate().getDateAndTime(); @@ -434,7 +442,7 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr } - if (!force && !rf.isMoreRecentThan(record.changeDate)) { + if (!force && !rf.isMoreRecentThan(recordInfo.changeDate)) { if (log.isDebugEnabled()) log.debug(" - Metadata XML not changed for path : " + rf.getPath()); result.unchangedMetadata++; @@ -454,8 +462,8 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr //Update only if different String uuid = dataMan.extractUUID(schema, md); - if (!record.uuid.equals(uuid)) { - md = dataMan.setUUID(schema, record.uuid, md); + if (!recordInfo.uuid.equals(uuid)) { + md = dataMan.setUUID(schema, recordInfo.uuid, md); } } catch (Exception e) { log.error(" - Failed to set uuid for metadata with remote path : " + rf.getPath()); @@ -467,7 +475,7 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr date = dataMan.extractDateModified(schema, md); } catch (Exception ex) { log.error("WebDavHarvester - updateMetadata - Can't get metadata modified date for metadata id= " - + record.id + ", using current date for modified date"); + + recordInfo.id + ", using current date for modified date"); // WAF harvester, rf.getChangeDate() returns null if (rf.getChangeDate() != null) { date = rf.getChangeDate().getDateAndTime(); @@ -475,12 +483,16 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr } } - // Translate metadata if (params.isTranslateContent()) { md = translateMetadataContent(context, md, schema); } + if (StringUtils.isNotEmpty(params.xslfilter)) { + md = HarvesterUtil.processMetadata(dataMan.getSchema(schema), + md, processName, processParams); + } + // // update metadata // @@ -488,7 +500,7 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr boolean ufo = false; String language = context.getLanguage(); - final AbstractMetadata metadata = metadataManager.updateMetadata(context, record.id, md, validate, ufo, language, + final AbstractMetadata metadata = metadataManager.updateMetadata(context, recordInfo.id, md, validate, ufo, language, date, false, IndexingMode.none); if(force) { @@ -502,15 +514,15 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr //--- the administrator could change privileges and categories using the //--- web interface so we have to re-set both OperationAllowedRepository repository = context.getBean(OperationAllowedRepository.class); - repository.deleteAllByMetadataId(Integer.parseInt(record.id)); - addPrivileges(record.id, params.getPrivileges(), localGroups, context); + repository.deleteAllByMetadataId(Integer.parseInt(recordInfo.id)); + addPrivileges(recordInfo.id, params.getPrivileges(), localGroups, context); metadata.getCategories().clear(); addCategories(metadata, params.getCategories(), localCateg, context, null, true); dataMan.flush(); - dataMan.indexMetadata(record.id, true); + dataMan.indexMetadata(recordInfo.id, true); } } diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java index e6cc3af1a9d..e745a5b3311 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavHarvester.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -28,40 +28,23 @@ import java.sql.SQLException; -//============================================================================= - public class WebDavHarvester extends AbstractHarvester<HarvestResult, WebDavParams> { - //--------------------------------------------------------------------------- - //--- - //--- Add - //--- - //--------------------------------------------------------------------------- - @Override protected WebDavParams createParams() { return new WebDavParams(dataMan); } //--------------------------------------------------------------------------- + @Override protected void storeNodeExtra(WebDavParams params, String path, String siteId, String optionsId) throws SQLException { harvesterSettingsManager.add("id:" + siteId, "url", params.url); harvesterSettingsManager.add("id:" + siteId, "icon", params.icon); harvesterSettingsManager.add("id:" + optionsId, "validate", params.getValidate()); harvesterSettingsManager.add("id:" + optionsId, "recurse", params.recurse); harvesterSettingsManager.add("id:" + optionsId, "subtype", params.subtype); + harvesterSettingsManager.add("id:" + siteId, "xslfilter", params.xslfilter); } - //--------------------------------------------------------------------------- - //--- - //--- Variables - //--- - //--------------------------------------------------------------------------- - - //--------------------------------------------------------------------------- - //--- - //--- Harvest - //--- - //--------------------------------------------------------------------------- public void doHarvest(Logger log) throws Exception { log.info("WebDav doHarvest start"); Harvester h = new Harvester(cancelMonitor, log, context, params); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java index d264bb908fb..c32bfd40cda 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/WebDavParams.java @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the +//=== Copyright (C) 2001-2024 Food and Agriculture Organization of the //=== United Nations (FAO-UN), United Nations World Food Programme (WFP) //=== and United Nations Environment Programme (UNEP) //=== @@ -29,61 +29,44 @@ import org.fao.geonet.kernel.harvest.harvester.AbstractParams; import org.jdom.Element; -//============================================================================= - public class WebDavParams extends AbstractParams { - //-------------------------------------------------------------------------- - //--- - //--- Constructor - //--- - //-------------------------------------------------------------------------- + /** * url of webdav folder to harvest */ public String url; - //--------------------------------------------------------------------------- - //--- - //--- Create : called when a new entry must be added. Reads values from the - //--- provided entry, providing default values - //--- - //--------------------------------------------------------------------------- /** * Icon to use for harvester */ public String icon; - //--------------------------------------------------------------------------- - //--- - //--- Update : called when an entry has changed and variables must be updated - //--- - //--------------------------------------------------------------------------- /** * If true recurse into directories. */ public boolean recurse; - //--------------------------------------------------------------------------- - //--- - //--- Other API methods - //--- - //--------------------------------------------------------------------------- /** * Flag indicating if WAFRetriever or WebDavRetriever should be used. */ public String subtype; - //--------------------------------------------------------------------------- - //--- - //--- Variables - //--- - //--------------------------------------------------------------------------- + /** + * The filter is a process (see schema/process folder) which depends on the schema. It could be + * composed of parameter which will be sent to XSL transformation using the following syntax : + * <pre> + * anonymizer?protocol=MYLOCALNETWORK:FILEPATH&email=gis@organisation.org&thesaurus=MYORGONLYTHEASURUS + * </pre> + */ + public String xslfilter; + public WebDavParams(DataManager dm) { super(dm); } + @Override public void create(Element node) throws BadInputEx { super.create(node); @@ -92,12 +75,14 @@ public void create(Element node) throws BadInputEx { url = Util.getParam(site, "url", ""); icon = Util.getParam(site, "icon", ""); + xslfilter = Util.getParam(site, "xslfilter", ""); recurse = Util.getParam(opt, "recurse", false); subtype = Util.getParam(opt, "subtype", ""); } + @Override public void update(Element node) throws BadInputEx { super.update(node); @@ -106,6 +91,7 @@ public void update(Element node) throws BadInputEx { url = Util.getParam(site, "url", url); icon = Util.getParam(site, "icon", icon); + xslfilter = Util.getParam(site, "xslfilter", ""); recurse = Util.getParam(opt, "recurse", recurse); subtype = Util.getParam(opt, "subtype", subtype); @@ -117,6 +103,7 @@ public WebDavParams copy() { copy.url = url; copy.icon = icon; + copy.xslfilter = xslfilter; copy.setValidate(getValidate()); copy.recurse = recurse; @@ -131,7 +118,3 @@ public String getIcon() { return icon; } } - -//============================================================================= - - diff --git a/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.html b/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.html index 8057edba033..77ea9d96c9c 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.html +++ b/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.html @@ -98,6 +98,21 @@ <fieldset> <legend data-translate="">filteringAndProcessing</legend> + <div id="gn-harvest-settings-gn-advanced-xsl-row"> + <label + id="gn-harvest-settings-gn-advanced-xsl-label" + class="control-label" + data-translate="" + >geonetwork-xslfilter</label + > + <div + id="gn-harvest-settings-gn-advanced-xsl-input" + data-gn-import-xsl="harvesterSelected.site.xslfilter" + data-mode="btn-group" + ></div> + <p class="help-block" data-translate="">geonetwork-xslfilterHelp</p> + </div> + <div id="gn-harvest-settings-webdav-advanced-validate-row"> <label id="gn-harvest-settings-webdav-advanced-validate-label" diff --git a/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.js b/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.js index 29ce0fb1cad..95ec0705197 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.js +++ b/web-ui/src/main/resources/catalog/templates/admin/harvest/type/webdav.js @@ -1,87 +1,91 @@ // This is not that much elegant and should be replaced by some kind // of Angular module. var gnHarvesterwebdav = { - createNew : function() { - return { - "@id" : "", - "@type" : "webdav", - "owner" : [], - "ownerGroup" : [], - "ownerUser": [""], - "site" : { - "name" : "", - "uuid" : "", - "url" : "http://", - "account" : { - "use" : false, - "username" : [], - "password" : [] - }, - "icon" : "blank.png" - }, - "content" : { - "validate" : "NOVALIDATION", - "importxslt" : "none", - "translateContent": false, - "translateContentLangs": "", - "translateContentFields": "" - }, - "options" : { - "every" : "0 0 0 ? * *", - "oneRunOnly" : false, - "status" : "active", - "recurse" : true, - "overrideUuid" : "SKIP", - "subtype" : "waf" - }, - "ifRecordExistAppendPrivileges": false, - "privileges" : [ { - "@id" : "1", - "operation" : [ { - "@name" : "view" - }, { - "@name" : "dynamic" - } ] - } ], - "categories" : [{'@id': ''}], - "info" : { - "lastRun" : [], - "running" : false - } - }; - }, - buildResponse : function(h, $scope) { - var body = '<node id="' + h['@id'] + '" ' - + ' type="' + h['@type'] + '">' - + ' <ownerGroup><id>' + h.ownerGroup[0] + '</id></ownerGroup>' - + ' <ownerUser><id>' + h.ownerUser[0] + '</id></ownerUser>' - + ' <site>' - + ' <name>' + h.site.name + '</name>' - + ' <url>' + h.site.url.replace(/&/g, '&') + '</url>' - + ' <icon>' + h.site.icon + '</icon>' - + ' </site>' - + ' <account>' - + ' <use>' + h.site.account.use + '</use>' - + ' <username>' + h.site.account.username + '</username>' - + ' <password>' + h.site.account.password + '</password>' - + ' </account>' - + ' <options>' - + ' <oneRunOnly>' + h.options.oneRunOnly + '</oneRunOnly>' - + ' <overrideUuid>' + h.options.overrideUuid + '</overrideUuid>' - + ' <every>' + h.options.every + '</every>' - + ' <status>' + h.options.status + '</status>' - + ' <recurse>' + h.options.recurse + '</recurse>' - + ' <subtype>' + h.options.subtype + '</subtype>' - + ' </options>' - + ' <content>' - + ' <validate>' + h.content.validate + '</validate>' - + ' <importxslt>' + h.content.importxslt + '</importxslt>' - + ' <translateContent>' + _.escape(h.content.translateContent) + '</translateContent>' - + ' <translateContentLangs>' + _.escape(h.content.translateContentLangs) + '</translateContentLangs>' - + ' <translateContentFields>' + _.escape(h.content.translateContentFields) + '</translateContentFields>' - + ' </content>' - + $scope.buildResponseGroup(h) - + $scope.buildResponseCategory(h) + '</node>'; - return body; - } + createNew: function () { + return { + "@id": "", + "@type": "webdav", + "owner": [], + "ownerGroup": [], + "ownerUser": [""], + "site": { + "name": "", + "uuid": "", + "url": "http://", + "account": { + "use": false, + "username": [], + "password": [] + }, + "icon": "blank.png", + "xslfilter": [] + }, + "content": { + "validate": "NOVALIDATION", + "importxslt": "none", + "translateContent": false, + "translateContentLangs": "", + "translateContentFields": "" + }, + "options": { + "every": "0 0 0 ? * *", + "oneRunOnly": false, + "status": "active", + "recurse": true, + "overrideUuid": "SKIP", + "subtype": "waf" + }, + "ifRecordExistAppendPrivileges": false, + "privileges": [{ + "@id": "1", + "operation": [{ + "@name": "view" + }, { + "@name": "dynamic" + }] + }], + "categories": [{'@id': ''}], + "info": { + "lastRun": [], + "running": false + } + }; + }, + buildResponse: function (h, $scope) { + var body = '<node id="' + h['@id'] + '" ' + + ' type="' + h['@type'] + '">' + + ' <ownerGroup><id>' + h.ownerGroup[0] + '</id></ownerGroup>' + + ' <ownerUser><id>' + h.ownerUser[0] + '</id></ownerUser>' + + ' <site>' + + ' <name>' + h.site.name + '</name>' + + ' <url>' + h.site.url.replace(/&/g, '&') + '</url>' + + ' <icon>' + h.site.icon + '</icon>' + + ' <xslfilter>' + + (h.site.xslfilter[0] ? h.site.xslfilter.replace(/&/g, '&') : '') + + '</xslfilter>' + + ' </site>' + + ' <account>' + + ' <use>' + h.site.account.use + '</use>' + + ' <username>' + h.site.account.username + '</username>' + + ' <password>' + h.site.account.password + '</password>' + + ' </account>' + + ' <options>' + + ' <oneRunOnly>' + h.options.oneRunOnly + '</oneRunOnly>' + + ' <overrideUuid>' + h.options.overrideUuid + '</overrideUuid>' + + ' <every>' + h.options.every + '</every>' + + ' <status>' + h.options.status + '</status>' + + ' <recurse>' + h.options.recurse + '</recurse>' + + ' <subtype>' + h.options.subtype + '</subtype>' + + ' </options>' + + ' <content>' + + ' <validate>' + h.content.validate + '</validate>' + + ' <importxslt>' + h.content.importxslt + '</importxslt>' + + ' <translateContent>' + _.escape(h.content.translateContent) + '</translateContent>' + + ' <translateContentLangs>' + _.escape(h.content.translateContentLangs) + '</translateContentLangs>' + + ' <translateContentFields>' + _.escape(h.content.translateContentFields) + '</translateContentFields>' + + ' </content>' + + $scope.buildResponseGroup(h) + + $scope.buildResponseCategory(h) + '</node>'; + return body; + } }; diff --git a/web/src/main/webapp/xsl/xml/harvesting/webdav.xsl b/web/src/main/webapp/xsl/xml/harvesting/webdav.xsl index bc04b113524..2f6c3b9d201 100644 --- a/web/src/main/webapp/xsl/xml/harvesting/webdav.xsl +++ b/web/src/main/webapp/xsl/xml/harvesting/webdav.xsl @@ -17,6 +17,9 @@ <icon> <xsl:value-of select="icon/value"/> </icon> + <xslfilter> + <xsl:value-of select="xslfilter"/> + </xslfilter> </xsl:template> <!-- ============================================================================================= --> From c7f8e8b27557da977019d453a4ee3b5db9bcedfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Fri, 11 Oct 2024 08:40:41 +0200 Subject: [PATCH 84/97] Editor / Geopublication / Misc fix. (#8092) * Editor / Geopublication / Misc fix. * Admin configuration / Show reset password only once the mapserver is created. Removed unused code * API / Fix ZIP file publication and coverage removal (probably related to GeoServer API changes - tested with version 2.25.1) * Editor / Fix zoom to layer due to mapservice change, do not show styler if not configured * Editor / Geopublication / Avoid NPE if style can't be created on GS side. --- .../geonet/api/mapservers/GeoServerRest.java | 35 +++++++++------- .../api/mapservers/MapServersUtils.java | 5 ++- .../geopublisher/GeoPublisherDirective.js | 39 ++++++++++-------- .../templates/admin/settings/mapservers.html | 40 +++---------------- 4 files changed, 52 insertions(+), 67 deletions(-) diff --git a/services/src/main/java/org/fao/geonet/api/mapservers/GeoServerRest.java b/services/src/main/java/org/fao/geonet/api/mapservers/GeoServerRest.java index a6f4d19a446..d7d347cbd4f 100644 --- a/services/src/main/java/org/fao/geonet/api/mapservers/GeoServerRest.java +++ b/services/src/main/java/org/fao/geonet/api/mapservers/GeoServerRest.java @@ -346,11 +346,14 @@ public boolean createDatastore(String ws, String ds, String file) throws IOExcep } else if (file.startsWith("file://")) { type = "external"; } + boolean isZip = ".zip".equals(extension); Log.debug(Geonet.GEOPUBLISH, "Creating datastore " + ds + " in workspace " + ws + " from file " + file); - int status = sendREST(GeoServerRest.METHOD_PUT, "/workspaces/" + ws - + "/datastores/" + ds + "/" + type + extension, file, null, - "text/plain", false); + int status = sendREST(GeoServerRest.METHOD_PUT, + "/workspaces/" + ws + "/datastores/" + ds + "/" + type + (isZip ? ".shp" : extension), + file, null, + (isZip ? "application/zip" : "text/plain"), + false); return status == 201; } @@ -473,18 +476,20 @@ public boolean createStyle(String ws, String layer, String sldbody) { } if (sldbody.isEmpty() || (!sldbody.isEmpty() && status != 200)) { String info = getLayerInfo(layer); - Element layerProperties = Xml.loadString(info, false); - String styleName = layerProperties.getChild("defaultStyle") - .getChild("name").getText(); - - Log.debug(Geonet.GEOPUBLISH, "Getting default style for " + styleName + " to apply to layer " + layer + " in workspace " + ws); - /* get the default style (polygon, line, point) from the global styles */ - status = sendREST(GeoServerRest.METHOD_GET, "/styles/" + styleName - + ".sld?quietOnNotFound=true", null, null, null, true); - - status = sendREST(GeoServerRest.METHOD_PUT, url + "/" + layer - + "_style", getResponse(), null, - "application/vnd.ogc.sld+xml", true); + if (info != null) { + Element layerProperties = Xml.loadString(info, false); + String styleName = layerProperties.getChild("defaultStyle") + .getChild("name").getText(); + + Log.debug(Geonet.GEOPUBLISH, "Getting default style for " + styleName + " to apply to layer " + layer + " in workspace " + ws); + /* get the default style (polygon, line, point) from the global styles */ + status = sendREST(GeoServerRest.METHOD_GET, "/styles/" + styleName + + ".sld?quietOnNotFound=true", null, null, null, true); + + status = sendREST(GeoServerRest.METHOD_PUT, url + "/" + layer + + "_style", getResponse(), null, + "application/vnd.ogc.sld+xml", true); + } } checkResponseCode(status); diff --git a/services/src/main/java/org/fao/geonet/api/mapservers/MapServersUtils.java b/services/src/main/java/org/fao/geonet/api/mapservers/MapServersUtils.java index 57c4aa03f54..83a19c251a8 100644 --- a/services/src/main/java/org/fao/geonet/api/mapservers/MapServersUtils.java +++ b/services/src/main/java/org/fao/geonet/api/mapservers/MapServersUtils.java @@ -259,7 +259,10 @@ public static boolean publishExternal(String file, GeoServerRest g, ACTION actio if (!g.deleteLayer(dsName)) report += "Layer: " + g.getStatus(); if (isRaster) { - + if (!g.deleteCoverage(dsName, dsName)) + report += "Coverage: " + g.getStatus(); + if (!g.deleteCoverageStore(dsName)) + report += "Coveragestore: " + g.getStatus(); } else { if (!g.deleteFeatureType(dsName, dsName)) report += "Feature type: " + g.getStatus(); diff --git a/web-ui/src/main/resources/catalog/components/edit/geopublisher/GeoPublisherDirective.js b/web-ui/src/main/resources/catalog/components/edit/geopublisher/GeoPublisherDirective.js index c5aed1fb7ba..34a061b3b04 100644 --- a/web-ui/src/main/resources/catalog/components/edit/geopublisher/GeoPublisherDirective.js +++ b/web-ui/src/main/resources/catalog/components/edit/geopublisher/GeoPublisherDirective.js @@ -194,16 +194,16 @@ gnMap .addWmsFromScratch(map, scope.gsNode.wmsurl, scope.layerName, false) .then( - function (o) { - if (o.layer) { - gnMap.zoomLayerToExtent(o.layer, map); - scope.layer = o.layer; + function (layer) { + if (layer) { + gnMap.zoomLayerToExtent(layer, map); + scope.layer = layer; } }, - function (o) { - if (o.layer) { - gnMap.zoomLayerToExtent(o.layer, map); - scope.layer = o.layer; + function (layer) { + if (layer) { + gnMap.zoomLayerToExtent(layer, map); + scope.layer = layer; } } ); @@ -218,7 +218,12 @@ scope.$watch("gsNode", function (n, o) { if (n != o) { scope.checkNode(scope.gsNode.id); - scope.hasStyler = !angular.isArray(scope.gsNode.stylerurl); + scope.hasStyler = scope.gsNode.stylerurl !== ""; + } + }); + scope.$watch("layerName", function (n, o) { + if (n != o) { + scope.checkNode(scope.gsNode.id); } }); @@ -307,7 +312,6 @@ scope.hidden = false; } scope.mapId = "map-geopublisher"; - // FIXME: only one publisher in a page ? scope.ref = r.ref; scope.refParent = r.refParent; scope.name = r.name; @@ -323,14 +327,17 @@ } // Build layer name based on file name - scope.layerName = r.name.replace(/.zip$|.gpkg$|.tif$|.tiff$|.ecw$/, ""); - scope.wmsLayerName = scope.layerName; + scope.layerName = r.name + .split("/") + .pop() + .replace(/.zip$|.gpkg$|.tif$|.tiff$|.ecw$/, ""); if (scope.layerName.match("^jdbc")) { scope.wmsLayerName = scope.layerName.split("#")[1]; - } else if (scope.layerName.match("^file")) { - scope.wmsLayerName = scope.layerName - .replace(/.*\//, "") - .replace(/.zip$|.gpkg$|.tif$|.tiff$|.ecw$/, ""); + } else { + scope.wmsLayerName = + (scope.gsNode.namespacePrefix !== "" + ? scope.gsNode.namespacePrefix + ":" + : "") + scope.layerName; } }; } diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/mapservers.html b/web-ui/src/main/resources/catalog/templates/admin/settings/mapservers.html index 62ee52e5ee7..671b60bbcc9 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/settings/mapservers.html +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/mapservers.html @@ -51,6 +51,7 @@ <button type="button" class="btn btn-default" + data-ng-hide="mapserverSelected.id === ''" data-ng-click="resetMapServerPassword(mapserverSelected.id)" > <i class="fa fa-lock"></i>  @@ -134,42 +135,11 @@ class="form-control" required="" data-ng-model="mapserverSelected.configurl" - placeholder="http://" + placeholder="http://localhost/geoserver/rest" /> </div> </div> - <fieldset data-ng-show="operation === 'ADD_NODE'"> - <legend data-translate="">useAccount</legend> - - <div class="form-group"> - <label class="control-label col-sm-3" data-translate="">username</label> - - <div class="col-sm-9"> - <input - type="text" - class="form-control" - required="" - data-ng-model="mapserverSelected.username" - /> - </div> - </div> - - <div class="form-group"> - <label class="control-label col-sm-3" data-translate="">password</label> - - <div class="col-sm-9"> - <input - type="password" - class="form-control" - required="required" - autocomplete="new-password" - data-ng-model="mapserverSelected.password" - /> - </div> - </div> - </fieldset> - <div class="form-group"> <label class="control-label col-sm-3" data-translate="">workspace</label> @@ -222,7 +192,7 @@ class="form-control" required="" data-ng-model="mapserverSelected.wmsurl" - placeholder="http://" + placeholder="http://localhost/geoserer/wms" /> </div> </div> @@ -237,7 +207,7 @@ class="form-control" required="" data-ng-model="mapserverSelected.wfsurl" - placeholder="http://" + placeholder="http://localhost/geoserver/wfs" /> </div> </div> @@ -252,7 +222,7 @@ class="form-control" required="" data-ng-model="mapserverSelected.wcsurl" - placeholder="http://" + placeholder="http://localhost/geoserver/wcs" /> </div> </div> From 87a8e3df5871ae240e3496f97bf75b4041dcb386 Mon Sep 17 00:00:00 2001 From: Francois Prunayre <fx.prunayre@gmail.com> Date: Mon, 9 Sep 2024 18:16:43 +0200 Subject: [PATCH 85/97] Harvester / Simple URL / ODS improvement * Ignore "null" value * Add support for "metas/dcat" * Fix path for language when using v2 API * Add spatial and temporal extent when available * Add extra keywords based one "metas/dcat/temporal" and "metas/default/territory" * Add resource identifier * Add record count and geometry type * Add lineage and credit * Add references * Cleanup namespaces Follow up of https://github.com/geonetwork/core-geonetwork/pull/7201 Related to https://github.com/geonetwork/core-geonetwork/pull/8359 --- .../ISO19115_3_2018Namespaces.java | 22 + .../ISO19115_3_2018SchemaPlugin.java | 2 +- .../convert/fromJsonOpenDataSoft.xsl | 1323 ++++++++++------- .../convert/odstheme-mapping.xsl | 1 + .../geonet/schema/LanguageXslProcessTest.java | 25 +- .../fao/geonet/schema/XslConversionTest.java | 75 + .../java/org/fao/geonet/util/XslUtil.java | 25 + .../src/test/resources/ods.json | 381 +++++ .../src/test/resources/ods.xml | 854 +++++++++++ 9 files changed, 2155 insertions(+), 553 deletions(-) create mode 100644 schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/XslConversionTest.java create mode 100644 schemas/iso19115-3.2018/src/test/resources/ods.json create mode 100644 schemas/iso19115-3.2018/src/test/resources/ods.xml diff --git a/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018Namespaces.java b/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018Namespaces.java index e495952af4d..6d47aeb24e7 100644 --- a/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018Namespaces.java +++ b/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018Namespaces.java @@ -1,3 +1,25 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ package org.fao.geonet.schema.iso19115_3_2018; import org.jdom.Namespace; diff --git a/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java b/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java index 403f1037946..aa73fd0d2fd 100644 --- a/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java +++ b/schemas/iso19115-3.2018/src/main/java/org/fao/geonet/schema/iso19115_3_2018/ISO19115_3_2018SchemaPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2023 Food and Agriculture Organization of the + * Copyright (C) 2001-2024 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl index 04e69e18483..8c7b9b76bf2 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/fromJsonOpenDataSoft.xsl @@ -1,224 +1,169 @@ <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:xs="http://www.w3.org/2001/XMLSchema" - xmlns:gmd="http://www.isotc211.org/2005/gmd" - xmlns:gcoold="http://www.isotc211.org/2005/gco" - xmlns:gmi="http://www.isotc211.org/2005/gmi" - xmlns:gmx="http://www.isotc211.org/2005/gmx" - xmlns:gsr="http://www.isotc211.org/2005/gsr" - xmlns:gss="http://www.isotc211.org/2005/gss" - xmlns:gts="http://www.isotc211.org/2005/gts" - xmlns:srvold="http://www.isotc211.org/2005/srv" - xmlns:gml30="http://www.opengis.net/gml" - xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" - xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" - xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" - xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.0" - xmlns:mac="http://standards.iso.org/iso/19115/-3/mac/2.0" - xmlns:mas="http://standards.iso.org/iso/19115/-3/mas/1.0" xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" - xmlns:mda="http://standards.iso.org/iso/19115/-3/mda/1.0" xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" - xmlns:mdt="http://standards.iso.org/iso/19115/-3/mdt/1.0" - xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" - xmlns:mic="http://standards.iso.org/iso/19115/-3/mic/1.0" - xmlns:mil="http://standards.iso.org/iso/19115/-3/mil/1.0" - xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/1.0" - xmlns:mds="http://standards.iso.org/iso/19115/-3/mds/2.0" xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" - xmlns:mpc="http://standards.iso.org/iso/19115/-3/mpc/1.0" xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/1.0" xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" - xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" - xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" - xmlns:mai="http://standards.iso.org/iso/19115/-3/mai/1.0" - xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" + xmlns:gfc="http://standards.iso.org/iso/19110/gfc/1.1" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:java-xsl-util="java:org.fao.geonet.util.XslUtil" exclude-result-prefixes="#all"> <xsl:import href="protocol-mapping.xsl"/> <xsl:import href="odstheme-mapping.xsl"/> + <xsl:import href="ISO19139/utility/create19115-3Namespaces.xsl"/> <xsl:output method="xml" indent="yes"/> - <xsl:strip-space elements="*"/> - - <xsl:template match="/record"> - - <mdb:MD_Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" - xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" - xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" - xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" - xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" - xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" - xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" - xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" - xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" - xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" - xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" - xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" - xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" - xmlns:gfc="http://standards.iso.org/iso/19110/gfc/1.1" - xmlns:gml="http://www.opengis.net/gml/3.2"> - <mdb:metadataIdentifier> - <mcc:MD_Identifier> - <mcc:code> - <gco:CharacterString> - <xsl:value-of select="(datasetid|dataset/dataset_id)[1]"/> - </gco:CharacterString> - </mcc:code> - </mcc:MD_Identifier> - </mdb:metadataIdentifier> - <mdb:defaultLocale> - <lan:PT_Locale> - <lan:language> - <lan:LanguageCode codeList="codeListLocation#LanguageCode" - codeListValue="{java-xsl-util:threeCharLangCode( + <xsl:strip-space elements="*"/> + + <xsl:template match="/record"> + + <mdb:MD_Metadata> + <xsl:call-template name="add-iso19115-3.2018-namespaces"/> + <mdb:metadataIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString> + <xsl:value-of select="(datasetid|dataset/dataset_id)[1]"/> + </gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </mdb:metadataIdentifier> + <mdb:defaultLocale> + <lan:PT_Locale> + <lan:language> + <lan:LanguageCode codeList="codeListLocation#LanguageCode" + codeListValue="{java-xsl-util:threeCharLangCode( (metas/language|dataset/metas/default/metadata_languages)[1])}"/> - </lan:language> - <lan:characterEncoding> - <lan:MD_CharacterSetCode codeList="codeListLocation#MD_CharacterSetCode" - codeListValue="utf8"/> - </lan:characterEncoding> - </lan:PT_Locale> - </mdb:defaultLocale> - <mdb:metadataScope> - <mdb:MD_MetadataScope> - <mdb:resourceScope> - <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" - codeListValue="{if (@type) then @type else 'dataset'}"/> - </mdb:resourceScope> - </mdb:MD_MetadataScope> - </mdb:metadataScope> - - <mdb:contact> - <cit:CI_Responsibility> - <cit:role> - <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="publisher"/> - </cit:role> - <cit:party> - <cit:CI_Organisation> - <cit:name> - <gco:CharacterString> - <xsl:value-of select="(metas/publisher|dataset/metas/default/publisher)[1]"/> - </gco:CharacterString> - </cit:name> - <cit:contactInfo> - <cit:CI_Contact> - <cit:address> - <cit:CI_Address> - <cit:electronicMailAddress> - <gco:CharacterString> - <xsl:value-of select="author_email"/> - </gco:CharacterString> - </cit:electronicMailAddress> - </cit:CI_Address> - </cit:address> - </cit:CI_Contact> - </cit:contactInfo> - </cit:CI_Organisation> - </cit:party> - </cit:CI_Responsibility> - </mdb:contact> - - <xsl:for-each select="metas/modified"> - <mdb:dateInfo> - <cit:CI_Date> - <cit:date> - <gco:DateTime><xsl:value-of select="."/></gco:DateTime> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="publication"/> - </cit:dateType> - </cit:CI_Date> - </mdb:dateInfo> - </xsl:for-each> - <xsl:for-each select="metas/metadata_processed|dataset/metas/default/metadata_processed"> - <mdb:dateInfo> - <cit:CI_Date> - <cit:date> - <gco:DateTime><xsl:value-of select="."/></gco:DateTime> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="revision"/> - </cit:dateType> - </cit:CI_Date> - </mdb:dateInfo> - </xsl:for-each> - <mdb:metadataStandard> - <cit:CI_Citation> - <cit:title> - <gco:CharacterString>ISO 19115-3</gco:CharacterString> - </cit:title> - </cit:CI_Citation> - </mdb:metadataStandard> - <mdb:identificationInfo> - <mri:MD_DataIdentification> - <mri:citation> - <cit:CI_Citation> - <cit:title> - <gco:CharacterString> - <xsl:value-of select="(metas/title|dataset/metas/default/title)[1]"/> - </gco:CharacterString> - </cit:title> - <cit:date> - <cit:CI_Date> - <cit:date> - <gco:DateTime> - <xsl:value-of select="(metas/modified|dataset/metas/default/modified)[1]"/> - </gco:DateTime> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="publication"/> - </cit:dateType> - </cit:CI_Date> - </cit:date> - <cit:date> - <cit:CI_Date> - <cit:date> - <gco:DateTime><xsl:value-of select="metas/data_processed"/></gco:DateTime> - </cit:date> - <cit:dateType> - <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="revision"/> - </cit:dateType> - </cit:CI_Date> - </cit:date> - </cit:CI_Citation> - </mri:citation> - <mri:abstract> - <gco:CharacterString> - <xsl:value-of select="(metas/description|dataset/metas/default/description)[1]"/> - </gco:CharacterString> - </mri:abstract> - <!-- TODO: Check state definition--> - <!--<mri:status> - <mcc:MD_ProgressCode codeList="codeListLocation#MD_ProgressCode" codeListValue="{state}"/> - </mri:status>--> - - <!-- add publisher to resource organisation as well--> - <xsl:if test="not(organization)"> - <mri:pointOfContact> - <cit:CI_Responsibility> - <cit:role> - <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="originator">publisher</cit:CI_RoleCode> - </cit:role> - <cit:party> - <cit:CI_Organisation> - <cit:name> + </lan:language> + <lan:characterEncoding> + <lan:MD_CharacterSetCode codeList="codeListLocation#MD_CharacterSetCode" + codeListValue="utf8"/> + </lan:characterEncoding> + </lan:PT_Locale> + </mdb:defaultLocale> + + <mdb:metadataScope> + <mdb:MD_MetadataScope> + <mdb:resourceScope> + <mcc:MD_ScopeCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" + codeListValue="{if (@type) then @type else 'dataset'}"/> + </mdb:resourceScope> + </mdb:MD_MetadataScope> + </mdb:metadataScope> + + <mdb:contact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="publisher"/> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="(metas/publisher|dataset/metas/default/publisher)[1]"/> + </gco:CharacterString> + </cit:name> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + <cit:electronicMailAddress> <gco:CharacterString> - <xsl:value-of select="metas/publisher"/> + <xsl:value-of select="author_email"/> </gco:CharacterString> - </cit:name> + </cit:electronicMailAddress> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mdb:contact> + + + <xsl:call-template name="build-date"> + <xsl:with-param name="tag" select="'mdb:dateInfo'"/> + </xsl:call-template> + + <mdb:metadataStandard> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString>ISO 19115-3</gco:CharacterString> + </cit:title> + </cit:CI_Citation> + </mdb:metadataStandard> + + <xsl:apply-templates select="dataset/metas/default/records_count" + mode="ods-to-iso"/> + + <mdb:identificationInfo> + <mri:MD_DataIdentification> + <mri:citation> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString> + <xsl:value-of select="(metas/title|dataset/metas/default/title)[1]"/> + </gco:CharacterString> + </cit:title> + + <xsl:call-template name="build-date"> + <xsl:with-param name="tag" select="'cit:date'"/> + </xsl:call-template> + + <xsl:apply-templates select="dataset/dataset_id" + mode="ods-to-iso"/> + </cit:CI_Citation> + </mri:citation> + <mri:abstract> + <gco:CharacterString> + <xsl:value-of select="(metas/description|dataset/metas/default/description)[1]"/> + </gco:CharacterString> + </mri:abstract> + + <xsl:for-each select="dataset/metas/default/attributions[. != 'null']"> + <mri:credit> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mri:credit> + </xsl:for-each> + + <!-- TODO: Check state definition--> + <!--<mri:status> + <mcc:MD_ProgressCode codeList="codeListLocation#MD_ProgressCode" codeListValue="{state}"/> + </mri:status>--> + + <!-- add publisher to resource organisation as well--> + <xsl:if test="not(organization)"> + <mri:pointOfContact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="originator">publisher + </cit:CI_RoleCode> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="metas/publisher|dataset/metas/default/publisher"/> + </gco:CharacterString> + </cit:name> + <xsl:if test="author_email"> <cit:contactInfo> <cit:CI_Contact> <cit:address> @@ -232,403 +177,683 @@ </cit:address> </cit:CI_Contact> </cit:contactInfo> - </cit:CI_Organisation> - </cit:party> - </cit:CI_Responsibility> - </mri:pointOfContact> - </xsl:if> - <xsl:for-each select="organization"> - <mri:pointOfContact> - <cit:CI_Responsibility> - <cit:role> - <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="originator">originator</cit:CI_RoleCode> - </cit:role> - <cit:party> - <cit:CI_Organisation> - <cit:name> - <gco:CharacterString> - <xsl:value-of select="interop_metas/dcat/creator"/> - </gco:CharacterString> - </cit:name> - <cit:contactInfo> - <cit:CI_Contact> - <cit:address> - <cit:CI_Address> - <cit:electronicMailAddress> - <gco:CharacterString> - <xsl:value-of select="interop_metas/dcat/contact_email"/> - </gco:CharacterString> - </cit:electronicMailAddress> - </cit:CI_Address> - </cit:address> - </cit:CI_Contact> - </cit:contactInfo> - </cit:CI_Organisation> - </cit:party> - </cit:CI_Responsibility> - </mri:pointOfContact> + </xsl:if> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mri:pointOfContact> + </xsl:if> + <xsl:for-each select="organization"> + <mri:pointOfContact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="originator">originator + </cit:CI_RoleCode> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="interop_metas/dcat/creator"/> + </gco:CharacterString> + </cit:name> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + <cit:electronicMailAddress> + <gco:CharacterString> + <xsl:value-of select="interop_metas/dcat/contact_email"/> + </gco:CharacterString> + </cit:electronicMailAddress> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mri:pointOfContact> + </xsl:for-each> + + <xsl:apply-templates select="dataset/metas/dcat/creator" + mode="ods-to-iso"/> + + + <xsl:variable name="odsThemes" + select="metas/theme|dataset/metas/default/theme"/> + <xsl:if test="count($odsThemes) > 0"> + <xsl:for-each select="distinct-values($odsThemeToIsoTopic[theme = $odsThemes]/name())"> + <mri:topicCategory> + <mri:MD_TopicCategoryCode> + <xsl:value-of select="."/> + </mri:MD_TopicCategoryCode> + </mri:topicCategory> </xsl:for-each> + </xsl:if> + <mri:extent> + <gex:EX_Extent> + <xsl:for-each select="dataset/metas/default/bbox"> + <gex:geographicElement> + <gex:EX_GeographicBoundingBox> + <gex:westBoundLongitude> + <gco:Decimal> + <xsl:value-of select="min(geometry/coordinates/array[position() mod 2 != 0])"/> + </gco:Decimal> + </gex:westBoundLongitude> + <gex:eastBoundLongitude> + <gco:Decimal> + <xsl:value-of select="max(geometry/coordinates/array[position() mod 2 != 0])"/> + </gco:Decimal> + </gex:eastBoundLongitude> + <gex:southBoundLatitude> + <gco:Decimal> + <xsl:value-of select="min(geometry/coordinates/array[position() mod 2 = 0])"/> + </gco:Decimal> + </gex:southBoundLatitude> + <gex:northBoundLatitude> + <gco:Decimal> + <xsl:value-of select="max(geometry/coordinates/array[position() mod 2 = 0])"/> + </gco:Decimal> + </gex:northBoundLatitude> + </gex:EX_GeographicBoundingBox> + </gex:geographicElement> + </xsl:for-each> - <xsl:variable name="odsThemes" - select="metas/theme|dataset/metas/default/theme"/> - <xsl:if test="count($odsThemes) > 0"> - <xsl:for-each select="distinct-values($odsThemeToIsoTopic[theme = $odsThemes]/name())"> - <mri:topicCategory> - <mri:MD_TopicCategoryCode> - <xsl:value-of select="."/> - </mri:MD_TopicCategoryCode> - </mri:topicCategory> + <xsl:for-each select="dataset/metas/default/geographic_reference"> + <gex:geographicElement> + <gex:EX_GeographicDescription> + <gex:geographicIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </gex:geographicIdentifier> + </gex:EX_GeographicDescription> + </gex:geographicElement> </xsl:for-each> - <mri:descriptiveKeywords> - <mri:MD_Keywords> - <xsl:for-each select="$odsThemes"> - <mri:keyword> - <gco:CharacterString> - <xsl:value-of select="."/> - </gco:CharacterString> - </mri:keyword> - </xsl:for-each> - <mri:type> - <mri:MD_KeywordTypeCode codeListValue="theme" - codeList="./resources/codeList.xml#MD_KeywordTypeCode"/> - </mri:type> - </mri:MD_Keywords> - </mri:descriptiveKeywords> - </xsl:if> + <xsl:apply-templates select="dataset/metas/dcat/temporal_coverage_start" + mode="ods-to-iso"/> + </gex:EX_Extent> + </mri:extent> - <!-- ODS keywords copied without type --> - <xsl:variable name="keywords" - select="metas/keyword|dataset/metas/default/keyword"/> - <xsl:if test="$keywords"> - <mri:descriptiveKeywords> - <mri:MD_Keywords> - <xsl:for-each select="$keywords"> - <mri:keyword> - <gco:CharacterString> - <xsl:value-of select="."/> - </gco:CharacterString> - </mri:keyword> - </xsl:for-each> - </mri:MD_Keywords> - </mri:descriptiveKeywords> - </xsl:if> + <xsl:apply-templates select="dataset/metas/dcat/accrualperiodicity" + mode="ods-to-iso"/> + <xsl:apply-templates select="dataset/metas/dcat/temporal" + mode="ods-to-iso"/> - <!-- - license_url: "http://opendatacommons.org/licenses/odbl/", - --> - <mri:resourceConstraints> - <mco:MD_LegalConstraints> - <mco:reference> + <xsl:apply-templates select="dataset/metas/default/territory" + mode="ods-to-iso"/> + + <xsl:if test="count($odsThemes) > 0"> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <xsl:for-each select="$odsThemes"> + <mri:keyword> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mri:keyword> + </xsl:for-each> + <mri:type> + <mri:MD_KeywordTypeCode codeListValue="theme" + codeList="./resources/codeList.xml#MD_KeywordTypeCode"/> + </mri:type> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + </xsl:if> + + <!-- ODS keywords copied without type --> + <xsl:variable name="keywords" + select="metas/keyword|dataset/metas/default/keyword"/> + <xsl:if test="$keywords"> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <xsl:for-each select="$keywords"> + <mri:keyword> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mri:keyword> + </xsl:for-each> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + </xsl:if> + + + <!-- + license_url: "http://opendatacommons.org/licenses/odbl/", + --> + <mri:resourceConstraints> + <mco:MD_LegalConstraints> + <mco:reference> + <cit:CI_Citation> + <cit:title> + <xsl:variable name="licenseUrl" + select="metas/license_url[. != 'null']|dataset/metas/default/license_url[. != 'null']"/> + <xsl:choose> + <xsl:when test="$licenseUrl != ''"> + <gcx:Anchor xlink:href="{$licenseUrl}"> + <xsl:value-of select="metas/license|dataset/metas/default/license"/> + </gcx:Anchor> + </xsl:when> + <xsl:otherwise> + <gco:CharacterString> + <xsl:value-of select="metas/license|dataset/metas/default/license"/> + </gco:CharacterString> + </xsl:otherwise> + </xsl:choose> + </cit:title> + <cit:onlineResource> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="metas/license_url|dataset/metas/default/license_url"/> + </gco:CharacterString> + </cit:linkage> + </cit:CI_OnlineResource> + </cit:onlineResource> + </cit:CI_Citation> + </mco:reference> + <mco:accessConstraints> + <mco:MD_RestrictionCode codeListValue="otherRestrictions" + codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode"/> + </mco:accessConstraints> + <mco:useConstraints> + <mco:MD_RestrictionCode codeListValue="otherRestrictions" + codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode"/> + </mco:useConstraints> + <mco:otherConstraints> + <gco:CharacterString> + <xsl:value-of select="metas/license|dataset/metas/default/license"/> + </gco:CharacterString> + </mco:otherConstraints> + </mco:MD_LegalConstraints> + </mri:resourceConstraints> + + + <mri:defaultLocale> + <lan:PT_Locale> + <lan:language> + <lan:LanguageCode codeList="codeListLocation#LanguageCode" + codeListValue="{java-xsl-util:threeCharLangCode((metas/language|dataset/metas/default/language)[1])}"/> + </lan:language> + <lan:characterEncoding> + <lan:MD_CharacterSetCode codeList="codeListLocation#MD_CharacterSetCode" + codeListValue="utf8"/> + </lan:characterEncoding> + </lan:PT_Locale> + </mri:defaultLocale> + </mri:MD_DataIdentification> + </mdb:identificationInfo> + + + <!-- + fields: [ + { + label: "N_SQ_FIL", + type: "double", + description: "Numéro unique du filet de hauteur", + name: "n_sq_fil" + }, + --> + <xsl:if test="count(fields|dataset/fields) > 0"> + <mdb:contentInfo> + <mrc:MD_FeatureCatalogue> + <mrc:featureCatalogue> + <gfc:FC_FeatureCatalogue> + <gfc:producer></gfc:producer> + <gfc:featureType> + <gfc:FC_FeatureType> + <gfc:typeName> + <xsl:value-of select="(metas/title|dataset/metas/default/title)[1]"/> + </gfc:typeName> + <gfc:isAbstract> + <gco:Boolean>false</gco:Boolean> + </gfc:isAbstract> + <xsl:for-each select="fields|dataset/fields"> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName> + <xsl:value-of select="name"/> + </gfc:memberName> + <gfc:definition> + <gco:CharacterString> + <xsl:value-of select="label"/> + <xsl:if test="description[. != 'null']"> + - + <xsl:value-of select="description"/> + </xsl:if> + </gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString> + <xsl:value-of select="type"/> + </gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + </xsl:for-each> + <gfc:featureCatalogue/> + </gfc:FC_FeatureType> + </gfc:featureType> + </gfc:FC_FeatureCatalogue> + </mrc:featureCatalogue> + </mrc:MD_FeatureCatalogue> + </mdb:contentInfo> + </xsl:if> + + <!-- + attachments: [ + { + mimetype: "application/pdf", + url: "odsfile://plu_filets_hauteur0.pdf", + id: "plu_filets_hauteur_pdf", + title: "PLU_FILETS_HAUTEUR.pdf" + } + ], +--> + <mdb:distributionInfo> + <mrd:MD_Distribution> + <xsl:for-each-group select="attachments/mimetype" group-by="."> + <mrd:distributionFormat> + <mrd:MD_Format> + <mrd:formatSpecificationCitation> <cit:CI_Citation> <cit:title> <gco:CharacterString> - <xsl:value-of select="metas/license|dataset/meta/default/license"/> + <xsl:value-of select="."/> </gco:CharacterString> </cit:title> - <cit:onlineResource> - <cit:CI_OnlineResource> - <cit:linkage> - <gco:CharacterString> - <xsl:value-of select="metas/license_url|dataset/meta/default/license_url"/> - </gco:CharacterString> - </cit:linkage> - </cit:CI_OnlineResource> - </cit:onlineResource> </cit:CI_Citation> - </mco:reference> - <mco:accessConstraints> - <mco:MD_RestrictionCode codeListValue="otherRestrictions" - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode"/> - </mco:accessConstraints> - <mco:useConstraints> - <mco:MD_RestrictionCode codeListValue="otherRestrictions" - codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode"/> - </mco:useConstraints> - <mco:otherConstraints> - <gco:CharacterString> - <xsl:value-of select="metas/license|dataset/meta/default/license"/> - </gco:CharacterString> - </mco:otherConstraints> - </mco:MD_LegalConstraints> - </mri:resourceConstraints> - - - <mri:defaultLocale> - <lan:PT_Locale> - <lan:language> - <lan:LanguageCode codeList="codeListLocation#LanguageCode" codeListValue="{java-xsl-util:threeCharLangCode((metas/language|dataset/meta/default/language)[1])}"/> - </lan:language> - <lan:characterEncoding> - <lan:MD_CharacterSetCode codeList="codeListLocation#MD_CharacterSetCode" - codeListValue="utf8"/> - </lan:characterEncoding> - </lan:PT_Locale> - </mri:defaultLocale> - </mri:MD_DataIdentification> - </mdb:identificationInfo> - - - <!-- - fields: [ - { - label: "N_SQ_FIL", - type: "double", - description: "Numéro unique du filet de hauteur", - name: "n_sq_fil" - }, - --> - <xsl:if test="count(fields|dataset/fields) > 0"> - <mdb:contentInfo> - <mrc:MD_FeatureCatalogue> - <mrc:featureCatalogue> - <gfc:FC_FeatureCatalogue> - <gfc:producer></gfc:producer> - <gfc:featureType> - <gfc:FC_FeatureType> - <gfc:typeName> - <xsl:value-of select="(metas/title|dataset/metas/default/title)[1]"/> - </gfc:typeName> - <gfc:isAbstract> - <gco:Boolean>false</gco:Boolean> - </gfc:isAbstract> - <xsl:for-each select="fields|dataset/fields"> - <gfc:carrierOfCharacteristics> - <gfc:FC_FeatureAttribute> - <gfc:memberName> - <xsl:value-of select="name"/> - </gfc:memberName> - <gfc:definition> - <gco:CharacterString> - <xsl:value-of select="label"/> - <xsl:if test="description"> - - <xsl:value-of select="description"/> - </xsl:if> - </gco:CharacterString> - </gfc:definition> - <gfc:cardinality>1</gfc:cardinality> - <gfc:valueType> - <gco:TypeName> - <gco:aName> - <gco:CharacterString><xsl:value-of select="type"/></gco:CharacterString> - </gco:aName> - </gco:TypeName> - </gfc:valueType> - </gfc:FC_FeatureAttribute> - </gfc:carrierOfCharacteristics> - </xsl:for-each> - <gfc:featureCatalogue/> - </gfc:FC_FeatureType> - </gfc:featureType> - </gfc:FC_FeatureCatalogue> - </mrc:featureCatalogue> - </mrc:MD_FeatureCatalogue> - </mdb:contentInfo> - </xsl:if> - - <!-- - attachments: [ - { - mimetype: "application/pdf", - url: "odsfile://plu_filets_hauteur0.pdf", - id: "plu_filets_hauteur_pdf", - title: "PLU_FILETS_HAUTEUR.pdf" - } - ], ---> - <mdb:distributionInfo> - <mrd:MD_Distribution> - <xsl:for-each-group select="attachments/mimetype" group-by="."> - <mrd:distributionFormat> - <mrd:MD_Format> - <mrd:formatSpecificationCitation> - <cit:CI_Citation> - <cit:title> - <gco:CharacterString> - <xsl:value-of select="."/> - </gco:CharacterString> - </cit:title> - </cit:CI_Citation> - </mrd:formatSpecificationCitation> - </mrd:MD_Format> - </mrd:distributionFormat> - </xsl:for-each-group> - <xsl:if test="metas/records_count > 0"> + </mrd:formatSpecificationCitation> + </mrd:MD_Format> + </mrd:distributionFormat> + </xsl:for-each-group> + <xsl:if test="metas/records_count > 0"> + <xsl:call-template name="dataFormat"> + <xsl:with-param name="format">csv</xsl:with-param> + </xsl:call-template> + <xsl:call-template name="dataFormat"> + <xsl:with-param name="format">json</xsl:with-param> + </xsl:call-template> + <xsl:if test="count(features[. = 'geo']) > 0"> <xsl:call-template name="dataFormat"> - <xsl:with-param name="format">csv</xsl:with-param> + <xsl:with-param name="format">geojson</xsl:with-param> </xsl:call-template> - <xsl:call-template name="dataFormat"> - <xsl:with-param name="format">json</xsl:with-param> - </xsl:call-template> - <xsl:if test="count(features[. = 'geo']) > 0"> + <xsl:if test="metas/records_count < 5000"> <xsl:call-template name="dataFormat"> - <xsl:with-param name="format">geojson</xsl:with-param> + <xsl:with-param name="format">shapefile</xsl:with-param> </xsl:call-template> - <xsl:if test="metas/records_count < 5000"> - <xsl:call-template name="dataFormat"> - <xsl:with-param name="format">shapefile</xsl:with-param> - </xsl:call-template> - </xsl:if> </xsl:if> </xsl:if> + </xsl:if> - <mrd:transferOptions> - <mrd:MD_DigitalTransferOptions> - <xsl:for-each select="attachments|dataset/attachments"> - <mrd:onLine> - <cit:CI_OnlineResource> - <cit:linkage> - <gco:CharacterString> - <xsl:value-of select="url"/> - </gco:CharacterString> - </cit:linkage> - <cit:protocol> - <gco:CharacterString> - <xsl:value-of select="mimetype"/> - </gco:CharacterString> - </cit:protocol> - <cit:name> - <gco:CharacterString> - <xsl:value-of select="id"/> - </gco:CharacterString> - </cit:name> - <cit:description> - <gco:CharacterString> - <xsl:value-of select="title"/> - </gco:CharacterString> - </cit:description> - </cit:CI_OnlineResource> - </mrd:onLine> - </xsl:for-each> - - <!-- Data download links are inferred from the record metadata --> - <xsl:variable name="count" - select="metas/records_count|dataset/metas/default/records_count"/> - <xsl:if test="$count > 0"> - <xsl:call-template name="dataLink"> - <xsl:with-param name="format">csv</xsl:with-param> - </xsl:call-template> - <xsl:call-template name="dataLink"> - <xsl:with-param name="format">json</xsl:with-param> - </xsl:call-template> - <xsl:if test="count(.//features[. = 'geo']) > 0"> - <xsl:call-template name="dataLink"> - <xsl:with-param name="format">geojson</xsl:with-param> - </xsl:call-template> - <xsl:if test="$count < 5000"> - <xsl:call-template name="dataLink"> - <xsl:with-param name="format">shp</xsl:with-param> - </xsl:call-template> - </xsl:if> - </xsl:if> - </xsl:if> - - </mrd:MD_DigitalTransferOptions> - </mrd:transferOptions> - <mrd:transferOptions> - <mrd:MD_DigitalTransferOptions> + <mrd:transferOptions> + <mrd:MD_DigitalTransferOptions> + <xsl:for-each select="attachments|dataset/attachments"> <mrd:onLine> <cit:CI_OnlineResource> <cit:linkage> <gco:CharacterString> - <xsl:value-of select="concat(nodeUrl, - '/explore/dataset/', - (datasetid|dataset/dataset_id)[1], - '/information/')" /> + <xsl:value-of select="url"/> </gco:CharacterString> </cit:linkage> <cit:protocol> <gco:CharacterString> - WWW:LINK:LANDING_PAGE + <xsl:value-of select="mimetype"/> </gco:CharacterString> </cit:protocol> <cit:name> <gco:CharacterString> - Landing Page + <xsl:value-of select="id"/> </gco:CharacterString> </cit:name> <cit:description> <gco:CharacterString> + <xsl:value-of select="title"/> </gco:CharacterString> </cit:description> </cit:CI_OnlineResource> </mrd:onLine> - </mrd:MD_DigitalTransferOptions> - </mrd:transferOptions> - </mrd:MD_Distribution> - </mdb:distributionInfo> - - <mdb:resourceLineage> - <mrl:LI_Lineage> - <mrl:statement> - <gco:CharacterString/> - </mrl:statement> - <mrl:scope> - <mcc:MD_Scope> - <mcc:level> - <mcc:MD_ScopeCode codeList="codeListLocation#MD_ScopeCode" codeListValue="dataset"/> - </mcc:level> - </mcc:MD_Scope> - </mrl:scope> - </mrl:LI_Lineage> - </mdb:resourceLineage> - </mdb:MD_Metadata> - </xsl:template> - - <xsl:template name="dataLink"> - <xsl:param name="format" /> - - <mrd:onLine> - <cit:CI_OnlineResource> - <cit:linkage> + </xsl:for-each> + + <!-- Data download links are inferred from the record metadata --> + <xsl:variable name="count" + select="metas/records_count|dataset/metas/default/records_count"/> + <xsl:if test="$count > 0"> + <xsl:call-template name="dataLink"> + <xsl:with-param name="format">csv</xsl:with-param> + </xsl:call-template> + <xsl:call-template name="dataLink"> + <xsl:with-param name="format">json</xsl:with-param> + </xsl:call-template> + <xsl:if test="count(.//features[. = 'geo']) > 0"> + <xsl:call-template name="dataLink"> + <xsl:with-param name="format">geojson</xsl:with-param> + </xsl:call-template> + <xsl:if test="$count < 5000"> + <xsl:call-template name="dataLink"> + <xsl:with-param name="format">shp</xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:if> + </xsl:if> + + </mrd:MD_DigitalTransferOptions> + </mrd:transferOptions> + <mrd:transferOptions> + <mrd:MD_DigitalTransferOptions> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="concat(nodeUrl, + '/explore/dataset/', + (datasetid|dataset/dataset_id)[1], + '/information/')"/> + </gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString> + WWW:LINK:LANDING_PAGE + </gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString> + Landing Page + </gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString> + </gco:CharacterString> + </cit:description> + </cit:CI_OnlineResource> + </mrd:onLine> + + <xsl:for-each select="dataset/metas/default/references[. != 'null']"> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString> + WWW:LINK + </gco:CharacterString> + </cit:protocol> + </cit:CI_OnlineResource> + </mrd:onLine> + </xsl:for-each> + </mrd:MD_DigitalTransferOptions> + </mrd:transferOptions> + </mrd:MD_Distribution> + </mdb:distributionInfo> + + <mdb:resourceLineage> + <mrl:LI_Lineage> + <mrl:statement> <gco:CharacterString> - <xsl:value-of select="concat(nodeUrl, + <xsl:value-of select="dataset/metas/dcat/dataquality[. != 'null']"/> + </gco:CharacterString> + </mrl:statement> + <mrl:scope> + <mcc:MD_Scope> + <mcc:level> + <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" + codeListValue="dataset"/> + </mcc:level> + </mcc:MD_Scope> + </mrl:scope> + </mrl:LI_Lineage> + </mdb:resourceLineage> + </mdb:MD_Metadata> + </xsl:template> + + <xsl:template name="dataLink"> + <xsl:param name="format"/> + + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString> + <xsl:value-of select="concat(nodeUrl, '/api/explore/v2.1/catalog/datasets/', (datasetid|dataset/dataset_id)[1], - '/exports/', $format, '?use_labels=true')" /> - </gco:CharacterString> - </cit:linkage> - <cit:protocol> - <gco:CharacterString> - <xsl:value-of select="$format-protocol-mapping/entry[format=lower-case($format)]/protocol"/> - </gco:CharacterString> - </cit:protocol> - <cit:name> - <gco:CharacterString> - <xsl:value-of select="$format"/> - </gco:CharacterString> - </cit:name> - <cit:description> - <gco:CharacterString> - <xsl:value-of select="$format"/> - </gco:CharacterString> - </cit:description> - <cit:function> - <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" - codeListValue="download"/> - </cit:function> - </cit:CI_OnlineResource> - </mrd:onLine> - </xsl:template> - - <xsl:template name="dataFormat"> - <xsl:param name="format" /> - <mrd:distributionFormat> - <mrd:MD_Format> - <mrd:formatSpecificationCitation> - <cit:CI_Citation> - <cit:title> - <gco:CharacterString> - <xsl:value-of select="$format"/> - </gco:CharacterString> - </cit:title> - </cit:CI_Citation> - </mrd:formatSpecificationCitation> - </mrd:MD_Format> - </mrd:distributionFormat> - </xsl:template> + '/exports/', $format, '?use_labels=true')"/> + </gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString> + <xsl:value-of select="$format-protocol-mapping/entry[format=lower-case($format)]/protocol"/> + </gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="$format"/> + </gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString> + <xsl:value-of select="$format"/> + </gco:CharacterString> + </cit:description> + <cit:function> + <cit:CI_OnLineFunctionCode + codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" + codeListValue="download"/> + </cit:function> + </cit:CI_OnlineResource> + </mrd:onLine> + </xsl:template> + + <xsl:template name="dataFormat"> + <xsl:param name="format"/> + <mrd:distributionFormat> + <mrd:MD_Format> + <mrd:formatSpecificationCitation> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString> + <xsl:value-of select="$format"/> + </gco:CharacterString> + </cit:title> + </cit:CI_Citation> + </mrd:formatSpecificationCitation> + </mrd:MD_Format> + </mrd:distributionFormat> + </xsl:template> + + + <xsl:template name="build-date"> + <xsl:param name="tag"/> + <xsl:for-each select="metas/modified[. != 'null']| + metas/data_processed[. != 'null']| + dataset/metas/default/modified[. != 'null']| + dataset/metas/default/data_processed[. != 'null']"> + + <xsl:variable name="type" + select="if(name() = 'data_processed') then 'revision' else 'publication'"/> + <xsl:element name="{$tag}"> + <cit:CI_Date> + <cit:date> + <gco:DateTime> + <xsl:value-of select="."/> + </gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="{$type}"/> + </cit:dateType> + </cit:CI_Date> + </xsl:element> + </xsl:for-each> + </xsl:template> + + + <xsl:template match="dataset/metas/dcat/accrualperiodicity" + mode="ods-to-iso"> + <mri:resourceMaintenance> + <mmi:MD_MaintenanceInformation> + <mmi:maintenanceAndUpdateFrequency> + <mmi:MD_MaintenanceFrequencyCode + codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_MaintenanceFrequencyCode" + codeListValue="{.}"/> + </mmi:maintenanceAndUpdateFrequency> + </mmi:MD_MaintenanceInformation> + </mri:resourceMaintenance> + </xsl:template> + + <xsl:template match="dataset/metas/dcat/creator" + mode="ods-to-iso"> + <mri:pointOfContact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="author"></cit:CI_RoleCode> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString> + <!-- TODO: Clarify meaning of publisher/creator/contributor + and to which contact contact_name/contact_email is attached to. --> + <xsl:value-of select="if (. != 'null') then . else ../../default/publisher"/> + </gco:CharacterString> + </cit:name> + <xsl:if test="../contact_email[. != 'null']"> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + <cit:electronicMailAddress> + <gco:CharacterString> + <xsl:value-of select="../contact_email"/> + </gco:CharacterString> + </cit:electronicMailAddress> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + </xsl:if> + <xsl:if test="../contact_name[. != 'null']"> + <cit:individual> + <cit:CI_Individual> + <cit:name> + <gco:CharacterString> + <xsl:value-of select="../contact_name"/> + </gco:CharacterString> + </cit:name> + </cit:CI_Individual> + </cit:individual> + </xsl:if> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mri:pointOfContact> + </xsl:template> + + + <!-- + "territory": [ + "Région wallonne", + "Région de Bruxelles-Capitale" + ], + + "metas": { + "dcat": {... + "accrualperiodicity": "daily", +--> + <xsl:template match="dataset/metas/dcat/temporal[. != 'null'] + |dataset/metas/default/territory[. != 'null']" + mode="ods-to-iso"> + <xsl:variable name="type" + select="if(name() = 'temporal') then 'temporal' else 'place'"/> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <mri:keyword> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mri:keyword> + <mri:type> + <mri:MD_KeywordTypeCode codeList="" codeListValue="{$type}"/> + </mri:type> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + </xsl:template> + + + <!-- + "metas": { + "dcat": {... + "temporal_coverage_start": "2018-12-30T23:00:00+00:00", + "temporal_coverage_end": "2020-12-30T23:00:00+00:00", + --> + <xsl:template match="dataset/metas/dcat/temporal_coverage_start[. != 'null']" + mode="ods-to-iso"> + <gex:temporalElement> + <gex:EX_TemporalExtent> + <gex:extent> + <gml:TimePeriod> + <gml:beginPosition> + <xsl:value-of select="."/> + </gml:beginPosition> + <gml:endPosition> + <xsl:value-of select="../temporal_coverage_end[. != 'null']"/> + </gml:endPosition> + </gml:TimePeriod> + </gex:extent> + </gex:EX_TemporalExtent> + </gex:temporalElement> + </xsl:template> + + + <xsl:template match="dataset/dataset_id" + mode="ods-to-iso"> + <cit:identifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString> + <xsl:value-of select="."/> + </gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </cit:identifier> + </xsl:template> + + <xsl:template match="dataset/metas/default/records_count" + mode="ods-to-iso"> + <mdb:spatialRepresentationInfo> + <msr:MD_VectorSpatialRepresentation> + <msr:geometricObjects> + <msr:MD_GeometricObjects> + <xsl:for-each select="../geometry_types[1]"> + <msr:geometricObjectType> + <msr:MD_GeometricObjectTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_GeometricObjectTypeCode" + codeListValue="{.}"/> + </msr:geometricObjectType> + </xsl:for-each> + <msr:geometricObjectCount> + <gco:Integer><xsl:value-of select="."/></gco:Integer> + </msr:geometricObjectCount> + </msr:MD_GeometricObjects> + </msr:geometricObjects> + </msr:MD_VectorSpatialRepresentation> + </mdb:spatialRepresentationInfo> + </xsl:template> + <xsl:template match="*" mode="ods-to-iso"/> </xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl index c5046e099cf..3b99ba96c35 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/odstheme-mapping.xsl @@ -6,6 +6,7 @@ <health> <theme>Santé</theme> <theme>Health</theme> + <theme>Qualité de Vie</theme> </health> <environment> <theme>Environnement</theme> diff --git a/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/LanguageXslProcessTest.java b/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/LanguageXslProcessTest.java index c3f5a966ce3..b91a3eddd62 100644 --- a/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/LanguageXslProcessTest.java +++ b/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/LanguageXslProcessTest.java @@ -1,3 +1,25 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ package org.fao.geonet.schema; import org.fao.geonet.schema.iso19115_3_2018.ISO19115_3_2018SchemaPlugin; @@ -14,9 +36,6 @@ import static org.junit.Assert.assertThat; import static org.xmlunit.matchers.EvaluateXPathMatcher.hasXPath; -/** - * Created by francois on 3/24/14. - */ public class LanguageXslProcessTest extends XslProcessTest { public LanguageXslProcessTest() { diff --git a/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/XslConversionTest.java b/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/XslConversionTest.java new file mode 100644 index 00000000000..926e6045a99 --- /dev/null +++ b/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/schema/XslConversionTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ +package org.fao.geonet.schema; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.fao.geonet.schema.iso19115_3_2018.ISO19115_3_2018SchemaPlugin; +import org.fao.geonet.schemas.XslProcessTest; +import org.fao.geonet.utils.Xml; +import org.jdom.Element; +import static org.junit.Assert.assertFalse; +import org.junit.Test; +import org.xmlunit.builder.DiffBuilder; +import org.xmlunit.builder.Input; +import org.xmlunit.diff.DefaultNodeMatcher; +import org.xmlunit.diff.Diff; +import org.xmlunit.diff.ElementSelectors; + +public class XslConversionTest extends XslProcessTest { + + public XslConversionTest() { + super(); + this.setNs(ISO19115_3_2018SchemaPlugin.allNamespaces); + } + + @Test + public void testOdsConversion() throws Exception { + xslFile = Paths.get(testClass.getClassLoader().getResource("convert/fromJsonOpenDataSoft.xsl").toURI()); + xmlFile = Paths.get(testClass.getClassLoader().getResource("ods.xml").toURI()); + Path jsonFile = Paths.get(testClass.getClassLoader().getResource("ods.json").toURI()); + String jsonString = Files.readString(jsonFile); + Element xmlFromJSON = Xml.getXmlFromJSON(jsonString); + xmlFromJSON.setName("record"); + xmlFromJSON.addContent(new Element("nodeUrl").setText("https://www.odwb.be")); + + Element inputElement = Xml.loadFile(xmlFile); + String expectedXml = Xml.getString(inputElement); + + Element resultElement = Xml.transform(xmlFromJSON, xslFile); + String resultOfConversion = Xml.getString(resultElement); + + Diff diff = DiffBuilder + .compare(Input.fromString(resultOfConversion)) + .withTest(Input.fromString(expectedXml)) + .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)) + .normalizeWhitespace() + .ignoreComments() + .checkForSimilar() + .build(); + assertFalse( + String.format("Differences: %s", diff.toString()), + diff.hasDifferences()); + } +} diff --git a/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/util/XslUtil.java b/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/util/XslUtil.java index d26836d4400..8d40393b2e0 100644 --- a/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/util/XslUtil.java +++ b/schemas/iso19115-3.2018/src/test/java/org/fao/geonet/util/XslUtil.java @@ -1,7 +1,32 @@ +/* + * Copyright (C) 2001-2024 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ package org.fao.geonet.util; public class XslUtil { public static String twoCharLangCode(String iso3code) { return iso3code.substring(0, 2); } + public static String threeCharLangCode(String iso2code) { + return "fre"; + } } diff --git a/schemas/iso19115-3.2018/src/test/resources/ods.json b/schemas/iso19115-3.2018/src/test/resources/ods.json new file mode 100644 index 00000000000..daaba03772d --- /dev/null +++ b/schemas/iso19115-3.2018/src/test/resources/ods.json @@ -0,0 +1,381 @@ +{ + "links": [ + { + "rel": "self", + "href": "https://www.odwb.be/api/explore/v2.0/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes" + }, + { + "rel": "datasets", + "href": "https://www.odwb.be/api/explore/v2.0/catalog/datasets" + }, + { + "rel": "records", + "href": "https://www.odwb.be/api/explore/v2.0/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/records" + }, + { + "rel": "exports", + "href": "https://www.odwb.be/api/explore/v2.0/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/exports" + }, + { + "rel": "facets", + "href": "https://www.odwb.be/api/explore/v2.0/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/facets" + }, + { + "rel": "reuses", + "href": "https://www.odwb.be/api/explore/v2.0/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/reuses" + } + ], + "dataset": { + "visibility": "domain", + "dataset_id": "collecte-de-sang-centre-de-prelevement-fixes", + "dataset_uid": "da_lac5du", + "has_records": true, + "features": [ + "calendar", + "geo", + "analyze", + "timeserie", + "custom_view" + ], + "attachments": [], + "alternative_exports": [], + "data_visible": true, + "fields": [ + { + "name": "identifiant", + "description": null, + "annotations": { + + }, + "label": "identifiant", + "type": "text" + }, + { + "name": "code_collecte", + "description": null, + "annotations": { + + }, + "label": "code_collecte", + "type": "text" + }, + { + "name": "nom", + "description": null, + "annotations": { + "sortable": true + }, + "label": "nom", + "type": "text" + }, + { + "name": "type_de_collecte", + "description": null, + "annotations": { + "facet": true + }, + "label": "type_de_collecte", + "type": "text" + }, + { + "name": "description", + "description": null, + "annotations": { + + }, + "label": "description", + "type": "text" + }, + { + "name": "url_source", + "description": null, + "annotations": { + + }, + "label": "url_source", + "type": "text" + }, + { + "name": "latitude", + "description": null, + "annotations": { + + }, + "label": "latitude", + "type": "text" + }, + { + "name": "longitude", + "description": null, + "annotations": { + + }, + "label": "longitude", + "type": "text" + }, + { + "name": "rue", + "description": null, + "annotations": { + + }, + "label": "rue", + "type": "text" + }, + { + "name": "code_postal", + "description": null, + "annotations": { + + }, + "label": "code postal", + "type": "text" + }, + { + "name": "ville", + "description": null, + "annotations": { + "facet": true + }, + "label": "ville", + "type": "text" + }, + { + "name": "date_collecte", + "description": null, + "annotations": { + "facetsort": "-count", + "timeserie_precision": "day" + }, + "label": "date_collecte", + "type": "date" + }, + { + "name": "horaire_am1", + "description": null, + "annotations": { + + }, + "label": "horaire_am1", + "type": "text" + }, + { + "name": "horaire_am2", + "description": null, + "annotations": { + + }, + "label": "horaire_am2", + "type": "text" + }, + { + "name": "horaire_pm1", + "description": null, + "annotations": { + + }, + "label": "horaire_pm1", + "type": "text" + }, + { + "name": "horaire_pm2", + "description": null, + "annotations": { + + }, + "label": "horaire_pm2", + "type": "text" + }, + { + "name": "collecte_publique", + "description": null, + "annotations": { + + }, + "label": "collecte_publique", + "type": "text" + }, + { + "name": "collecte_avec_rdv", + "description": null, + "annotations": { + + }, + "label": "collecte_avec_rdv", + "type": "text" + }, + { + "name": "statut", + "description": null, + "annotations": { + + }, + "label": "statut", + "type": "text" + }, + { + "name": "infos_complementaires", + "description": null, + "annotations": { + + }, + "label": "Infos complémentaires", + "type": "text" + }, + { + "name": "geopointarcgis", + "description": null, + "annotations": { + + }, + "label": "geopointarcgis", + "type": "geo_point_2d" + }, + { + "name": "commune", + "description": null, + "annotations": { + + }, + "label": "commune", + "type": "text" + }, + { + "name": "province", + "description": null, + "annotations": { + + }, + "label": "province", + "type": "text" + } + ], + "metas": { + "dcat": { + "created": null, + "issued": null, + "creator": null, + "contributor": null, + "contact_name": "Thomas Paulus 084 32 16 00 pendant les heures d'ouverture.", + "contact_email": "sfs.communication@croix-rouge.be", + "accrualperiodicity": "daily", + "spatial": null, + "temporal": null, + "granularity": null, + "dataquality": "lineage", + "publisher_type": [ + "NonProfitOrganisation" + ], + "conforms_to": null, + "temporal_coverage_start": "2020", + "temporal_coverage_end": "2022", + "accessRights": null + }, + "semantic": { + "rml_mapping": null, + "classes": null, + "properties": null + }, + "default": { + "title": "Tous les lieux de collecte de sang en Région wallonne et à Bruxelles", + "description": "\u003Cp\u003E\u003Cfont face=\"Open Sans, sans-serif\"\u003E\u003Cspan style=\"font-size: 12px;\"\u003EToutes les collectes de sang organisées par le Service du Sang de la Croix-Rouge, en Région wallonne et à Bruxelles, y compris les dons de plasma et de plaquettes. \u003C/span\u003E\u003C/font\u003E\u003C/p\u003E\u003Cp\u003E\u003Cfont face=\"Open Sans, sans-serif\"\u003E\u003Cspan style=\"font-size: 12px;\"\u003ERecherchez le lieu de collecte le plus proche de chez vous et prenez rendez-vous si nécessaire.\u003C/span\u003E\u003C/font\u003E\u003Cbr\u003E\u003C/p\u003E", + "theme": [ + "Qualité de Vie" + ], + "keyword": [ + "Centre de prélèvement", + "Sang", + "don de sang", + "Croix rouge", + "santé", + "Collecte" + ], + "license": "Creative Commons - CC0", + "license_url": "http://www.opendefinition.org/licenses/cc-by/", + "language": "fr", + "metadata_languages": [ + "fr" + ], + "timezone": [ + "Europe/Brussels" + ], + "modified": "2024-08-29T08:09:20.651000+00:00", + "modified_updates_on_metadata_change": true, + "modified_updates_on_data_change": true, + "data_processed": "2024-08-29T08:09:20.651000+00:00", + "metadata_processed": "2024-08-29T08:09:20.896000+00:00", + "geographic_reference": [ + "be_40_03000", + "be_40_04000" + ], + "geographic_reference_auto": false, + "territory": [ + "Région wallonne", + "Région de Bruxelles-Capitale" + ], + "geometry_types": [ + "Point" + ], + "bbox": { + "type": "Feature", + "geometry": { + "coordinates": [ + [ + [6.17299164645374, 50.8502430282533], + [3.97492295131087, 50.8502430282533], + [3.97492295131087, 49.9810485122725], + [6.17299164645374, 49.9810485122725], + [6.17299164645374, 50.8502430282533] + ] + ], + "type": "Polygon" + }, + "properties": { + + } + }, + "publisher": "Croix-rouge de Belgique - Service du sang", + "references": "https://www.donneurdesang.be", + "records_count": 2355, + "attributions": [ + "National Geographic Institute (NGI-IGN, ngi.be)" + ], + "source_domain": null, + "source_domain_title": null, + "source_domain_address": null, + "source_dataset": null, + "shared_catalog": null, + "federated": false, + "oauth_scope": null, + "parent_domain": null, + "update_frequency": null + }, + "inspire": { + "theme": null, + "type": null, + "file_identifier": null, + "hierarchy_level": null, + "hierarchy_level_name": null, + "spatial_resolution": null, + "topologic_consistency": null, + "contact_individual_name": null, + "contact_position": null, + "contact_address": null, + "contact_email": null, + "identification_purpose": null, + "extend_description": null, + "extend_bounding_box_westbound_longitude": null, + "extend_bounding_box_eastbound_longitude": null, + "extend_bounding_box_southbound_latitude": null, + "extend_bounding_box_northbound_latitude": null + }, + "custom": { + "echelon-territorial": [ + "Régional" + ], + "high-value-dataset": false, + "nom-moissonneur": null + } + } + } +} diff --git a/schemas/iso19115-3.2018/src/test/resources/ods.xml b/schemas/iso19115-3.2018/src/test/resources/ods.xml new file mode 100644 index 00000000000..5caa315c569 --- /dev/null +++ b/schemas/iso19115-3.2018/src/test/resources/ods.xml @@ -0,0 +1,854 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdb:MD_Metadata xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" xmlns:gfc="http://standards.iso.org/iso/19110/gfc/1.1" xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.0" xmlns:mas="http://standards.iso.org/iso/19115/-3/mas/1.0" xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" xmlns:mda="http://standards.iso.org/iso/19115/-3/mda/1.0" xmlns:mds="http://standards.iso.org/iso/19115/-3/mds/2.0" xmlns:mdt="http://standards.iso.org/iso/19115/-3/mdt/2.0" xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" xmlns:mpc="http://standards.iso.org/iso/19115/-3/mpc/1.0" xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" xmlns:dqm="http://standards.iso.org/iso/19157/-2/dqm/1.0" xmlns:mac="http://standards.iso.org/iso/19115/-3/mac/2.0" xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://standards.iso.org/iso/19115/-3/mdb/2.0 https://schemas.isotc211.org/19115/-3/mdb/2.0/mdb.xsd"> + <mdb:metadataIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString>collecte-de-sang-centre-de-prelevement-fixes</gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </mdb:metadataIdentifier> + <mdb:defaultLocale> + <lan:PT_Locale> + <lan:language> + <lan:LanguageCode codeList="codeListLocation#LanguageCode" codeListValue="fre" /> + </lan:language> + <lan:characterEncoding> + <lan:MD_CharacterSetCode codeList="codeListLocation#MD_CharacterSetCode" codeListValue="utf8" /> + </lan:characterEncoding> + </lan:PT_Locale> + </mdb:defaultLocale> + <mdb:metadataScope> + <mdb:MD_MetadataScope> + <mdb:resourceScope> + <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" codeListValue="dataset" /> + </mdb:resourceScope> + </mdb:MD_MetadataScope> + </mdb:metadataScope> + <mdb:contact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="publisher" /> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString>Croix-rouge de Belgique - Service du sang</gco:CharacterString> + </cit:name> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + <cit:electronicMailAddress> + <gco:CharacterString /> + </cit:electronicMailAddress> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mdb:contact> + <mdb:dateInfo> + <cit:CI_Date> + <cit:date> + <gco:DateTime>2024-08-29T08:09:20.651000+00:00</gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="revision" /> + </cit:dateType> + </cit:CI_Date> + </mdb:dateInfo> + <mdb:dateInfo> + <cit:CI_Date> + <cit:date> + <gco:DateTime>2024-08-29T08:09:20.651000+00:00</gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="publication" /> + </cit:dateType> + </cit:CI_Date> + </mdb:dateInfo> + <mdb:metadataStandard> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString>ISO 19115-3</gco:CharacterString> + </cit:title> + </cit:CI_Citation> + </mdb:metadataStandard> + <mdb:spatialRepresentationInfo> + <msr:MD_VectorSpatialRepresentation> + <msr:geometricObjects> + <msr:MD_GeometricObjects> + <msr:geometricObjectType> + <msr:MD_GeometricObjectTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_GeometricObjectTypeCode" codeListValue="Point" /> + </msr:geometricObjectType> + <msr:geometricObjectCount> + <gco:Integer>2355</gco:Integer> + </msr:geometricObjectCount> + </msr:MD_GeometricObjects> + </msr:geometricObjects> + </msr:MD_VectorSpatialRepresentation> + </mdb:spatialRepresentationInfo> + <mdb:identificationInfo> + <mri:MD_DataIdentification> + <mri:citation> + <cit:CI_Citation> + <cit:title> + <gco:CharacterString>Tous les lieux de collecte de sang en Région wallonne et à Bruxelles</gco:CharacterString> + </cit:title> + <cit:date> + <cit:CI_Date> + <cit:date> + <gco:DateTime>2024-08-29T08:09:20.651000+00:00</gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="revision" /> + </cit:dateType> + </cit:CI_Date> + </cit:date> + <cit:date> + <cit:CI_Date> + <cit:date> + <gco:DateTime>2024-08-29T08:09:20.651000+00:00</gco:DateTime> + </cit:date> + <cit:dateType> + <cit:CI_DateTypeCode codeList="codeListLocation#CI_DateTypeCode" codeListValue="publication" /> + </cit:dateType> + </cit:CI_Date> + </cit:date> + <cit:identifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString>collecte-de-sang-centre-de-prelevement-fixes</gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </cit:identifier> + </cit:CI_Citation> + </mri:citation> + <mri:abstract> + <gco:CharacterString><p><font face="Open Sans, sans-serif"><span style="font-size: 12px;">Toutes les collectes de sang organisées par le Service du Sang de la Croix-Rouge, en Région wallonne et à Bruxelles, y compris les dons de plasma et de plaquettes. </span></font></p><p><font face="Open Sans, sans-serif"><span style="font-size: 12px;">Recherchez le lieu de collecte le plus proche de chez vous et prenez rendez-vous si nécessaire.</span></font><br></p></gco:CharacterString> + </mri:abstract> + <mri:credit> + <gco:CharacterString>National Geographic Institute (NGI-IGN, ngi.be)</gco:CharacterString> + </mri:credit> + <mri:pointOfContact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="originator">publisher</cit:CI_RoleCode> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString>Croix-rouge de Belgique - Service du sang</gco:CharacterString> + </cit:name> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mri:pointOfContact> + <mri:pointOfContact> + <cit:CI_Responsibility> + <cit:role> + <cit:CI_RoleCode codeList="codeListLocation#CI_RoleCode" codeListValue="author" /> + </cit:role> + <cit:party> + <cit:CI_Organisation> + <cit:name> + <gco:CharacterString>Croix-rouge de Belgique - Service du sang</gco:CharacterString> + </cit:name> + <cit:contactInfo> + <cit:CI_Contact> + <cit:address> + <cit:CI_Address> + <cit:electronicMailAddress> + <gco:CharacterString>sfs.communication@croix-rouge.be</gco:CharacterString> + </cit:electronicMailAddress> + </cit:CI_Address> + </cit:address> + </cit:CI_Contact> + </cit:contactInfo> + <cit:individual> + <cit:CI_Individual> + <cit:name> + <gco:CharacterString>Thomas Paulus 084 32 16 00 pendant les heures d'ouverture.</gco:CharacterString> + </cit:name> + </cit:CI_Individual> + </cit:individual> + </cit:CI_Organisation> + </cit:party> + </cit:CI_Responsibility> + </mri:pointOfContact> + <mri:topicCategory> + <mri:MD_TopicCategoryCode> + health + </mri:MD_TopicCategoryCode> + </mri:topicCategory> + <mri:extent> + <gex:EX_Extent> + <gex:geographicElement> + <gex:EX_GeographicBoundingBox> + <gex:westBoundLongitude> + <gco:Decimal>3.97492295131087</gco:Decimal> + </gex:westBoundLongitude> + <gex:eastBoundLongitude> + <gco:Decimal>6.17299164645374</gco:Decimal> + </gex:eastBoundLongitude> + <gex:southBoundLatitude> + <gco:Decimal>49.9810485122725</gco:Decimal> + </gex:southBoundLatitude> + <gex:northBoundLatitude> + <gco:Decimal>50.8502430282533</gco:Decimal> + </gex:northBoundLatitude> + </gex:EX_GeographicBoundingBox> + </gex:geographicElement> + <gex:temporalElement> + <gex:EX_TemporalExtent> + <gex:extent> + <gml:TimePeriod> + <gml:beginPosition> + 2020 + </gml:beginPosition> + <gml:endPosition> + 2022 + </gml:endPosition> + </gml:TimePeriod> + </gex:extent> + </gex:EX_TemporalExtent> + </gex:temporalElement> + <gex:geographicElement> + <gex:EX_GeographicDescription> + <gex:geographicIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString>be_40_03000</gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </gex:geographicIdentifier> + </gex:EX_GeographicDescription> + </gex:geographicElement> + <gex:geographicElement> + <gex:EX_GeographicDescription> + <gex:geographicIdentifier> + <mcc:MD_Identifier> + <mcc:code> + <gco:CharacterString>be_40_04000</gco:CharacterString> + </mcc:code> + </mcc:MD_Identifier> + </gex:geographicIdentifier> + </gex:EX_GeographicDescription> + </gex:geographicElement> + </gex:EX_Extent> + </mri:extent> + <mri:resourceMaintenance> + <mmi:MD_MaintenanceInformation> + <mmi:maintenanceAndUpdateFrequency> + <mmi:MD_MaintenanceFrequencyCode codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_MaintenanceFrequencyCode" codeListValue="daily" /> + </mmi:maintenanceAndUpdateFrequency> + </mmi:MD_MaintenanceInformation> + </mri:resourceMaintenance> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <mri:keyword> + <gco:CharacterString>Région wallonne</gco:CharacterString> + </mri:keyword> + <mri:type> + <mri:MD_KeywordTypeCode codeList="" codeListValue="place" /> + </mri:type> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <mri:keyword> + <gco:CharacterString>Région de Bruxelles-Capitale</gco:CharacterString> + </mri:keyword> + <mri:type> + <mri:MD_KeywordTypeCode codeList="" codeListValue="place" /> + </mri:type> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <mri:keyword> + <gco:CharacterString>Qualité de Vie</gco:CharacterString> + </mri:keyword> + <mri:type> + <mri:MD_KeywordTypeCode codeListValue="theme" codeList="./resources/codeList.xml#MD_KeywordTypeCode" /> + </mri:type> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + <mri:descriptiveKeywords> + <mri:MD_Keywords> + <mri:keyword> + <gco:CharacterString>Centre de prélèvement</gco:CharacterString> + </mri:keyword> + <mri:keyword> + <gco:CharacterString>Sang</gco:CharacterString> + </mri:keyword> + <mri:keyword> + <gco:CharacterString>don de sang</gco:CharacterString> + </mri:keyword> + <mri:keyword> + <gco:CharacterString>Croix rouge</gco:CharacterString> + </mri:keyword> + <mri:keyword> + <gco:CharacterString>santé</gco:CharacterString> + </mri:keyword> + <mri:keyword> + <gco:CharacterString>Collecte</gco:CharacterString> + </mri:keyword> + </mri:MD_Keywords> + </mri:descriptiveKeywords> + <mri:resourceConstraints> + <mco:MD_LegalConstraints> + <mco:reference> + <cit:CI_Citation> + <cit:title> + <gcx:Anchor xlink:href="http://www.opendefinition.org/licenses/cc-by/">Creative Commons - CC0</gcx:Anchor> + </cit:title> + <cit:onlineResource> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>http://www.opendefinition.org/licenses/cc-by/</gco:CharacterString> + </cit:linkage> + </cit:CI_OnlineResource> + </cit:onlineResource> + </cit:CI_Citation> + </mco:reference> + <mco:accessConstraints> + <mco:MD_RestrictionCode codeListValue="otherRestrictions" codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode" /> + </mco:accessConstraints> + <mco:useConstraints> + <mco:MD_RestrictionCode codeListValue="otherRestrictions" codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode" /> + </mco:useConstraints> + <mco:otherConstraints> + <gco:CharacterString>Creative Commons - CC0</gco:CharacterString> + </mco:otherConstraints> + </mco:MD_LegalConstraints> + </mri:resourceConstraints> + <mri:defaultLocale> + <lan:PT_Locale> + <lan:language> + <lan:LanguageCode codeList="codeListLocation#LanguageCode" codeListValue="fre" /> + </lan:language> + <lan:characterEncoding> + <lan:MD_CharacterSetCode codeList="codeListLocation#MD_CharacterSetCode" codeListValue="utf8" /> + </lan:characterEncoding> + </lan:PT_Locale> + </mri:defaultLocale> + </mri:MD_DataIdentification> + </mdb:identificationInfo> + <mdb:contentInfo> + <mrc:MD_FeatureCatalogue xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/1.0"> + <mrc:featureCatalogue> + <gfc:FC_FeatureCatalogue> + <gfc:producer /> + <gfc:featureType> + <gfc:FC_FeatureType> + <gfc:typeName>Tous les lieux de collecte de sang en Région wallonne et à Bruxelles</gfc:typeName> + <gfc:isAbstract> + <gco:Boolean>false</gco:Boolean> + </gfc:isAbstract> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>identifiant</gfc:memberName> + <gfc:definition> + <gco:CharacterString>identifiant</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>code_collecte</gfc:memberName> + <gfc:definition> + <gco:CharacterString>code_collecte</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>nom</gfc:memberName> + <gfc:definition> + <gco:CharacterString>nom</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>type_de_collecte</gfc:memberName> + <gfc:definition> + <gco:CharacterString>type_de_collecte</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>description</gfc:memberName> + <gfc:definition> + <gco:CharacterString>description</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>url_source</gfc:memberName> + <gfc:definition> + <gco:CharacterString>url_source</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>latitude</gfc:memberName> + <gfc:definition> + <gco:CharacterString>latitude</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>longitude</gfc:memberName> + <gfc:definition> + <gco:CharacterString>longitude</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>rue</gfc:memberName> + <gfc:definition> + <gco:CharacterString>rue</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>code_postal</gfc:memberName> + <gfc:definition> + <gco:CharacterString>code postal</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>ville</gfc:memberName> + <gfc:definition> + <gco:CharacterString>ville</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>date_collecte</gfc:memberName> + <gfc:definition> + <gco:CharacterString>date_collecte</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>date</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>horaire_am1</gfc:memberName> + <gfc:definition> + <gco:CharacterString>horaire_am1</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>horaire_am2</gfc:memberName> + <gfc:definition> + <gco:CharacterString>horaire_am2</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>horaire_pm1</gfc:memberName> + <gfc:definition> + <gco:CharacterString>horaire_pm1</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>horaire_pm2</gfc:memberName> + <gfc:definition> + <gco:CharacterString>horaire_pm2</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>collecte_publique</gfc:memberName> + <gfc:definition> + <gco:CharacterString>collecte_publique</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>collecte_avec_rdv</gfc:memberName> + <gfc:definition> + <gco:CharacterString>collecte_avec_rdv</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>statut</gfc:memberName> + <gfc:definition> + <gco:CharacterString>statut</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>infos_complementaires</gfc:memberName> + <gfc:definition> + <gco:CharacterString>Infos complémentaires</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>geopointarcgis</gfc:memberName> + <gfc:definition> + <gco:CharacterString>geopointarcgis</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>geo_point_2d</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>commune</gfc:memberName> + <gfc:definition> + <gco:CharacterString>commune</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:carrierOfCharacteristics> + <gfc:FC_FeatureAttribute> + <gfc:memberName>province</gfc:memberName> + <gfc:definition> + <gco:CharacterString>province</gco:CharacterString> + </gfc:definition> + <gfc:cardinality>1</gfc:cardinality> + <gfc:valueType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>text</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gfc:valueType> + </gfc:FC_FeatureAttribute> + </gfc:carrierOfCharacteristics> + <gfc:featureCatalogue /> + </gfc:FC_FeatureType> + </gfc:featureType> + </gfc:FC_FeatureCatalogue> + </mrc:featureCatalogue> + </mrc:MD_FeatureCatalogue> + </mdb:contentInfo> + <mdb:distributionInfo> + <mrd:MD_Distribution> + <mrd:transferOptions> + <mrd:MD_DigitalTransferOptions> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>https://www.odwb.be/api/explore/v2.1/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/exports/csv?use_labels=true</gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:DOWNLOAD:text/csv</gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString>csv</gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString>csv</gco:CharacterString> + </cit:description> + <cit:function> + <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" codeListValue="download" /> + </cit:function> + </cit:CI_OnlineResource> + </mrd:onLine> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>https://www.odwb.be/api/explore/v2.1/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/exports/json?use_labels=true</gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:DOWNLOAD:application/json</gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString>json</gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString>json</gco:CharacterString> + </cit:description> + <cit:function> + <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" codeListValue="download" /> + </cit:function> + </cit:CI_OnlineResource> + </mrd:onLine> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>https://www.odwb.be/api/explore/v2.1/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/exports/geojson?use_labels=true</gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:DOWNLOAD:application/vnd.geo+json</gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString>geojson</gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString>geojson</gco:CharacterString> + </cit:description> + <cit:function> + <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" codeListValue="download" /> + </cit:function> + </cit:CI_OnlineResource> + </mrd:onLine> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>https://www.odwb.be/api/explore/v2.1/catalog/datasets/collecte-de-sang-centre-de-prelevement-fixes/exports/shp?use_labels=true</gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:DOWNLOAD:x-gis/x-shapefile</gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString>shp</gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString>shp</gco:CharacterString> + </cit:description> + <cit:function> + <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" codeListValue="download" /> + </cit:function> + </cit:CI_OnlineResource> + </mrd:onLine> + </mrd:MD_DigitalTransferOptions> + </mrd:transferOptions> + <mrd:transferOptions> + <mrd:MD_DigitalTransferOptions> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>https://www.odwb.be/explore/dataset/collecte-de-sang-centre-de-prelevement-fixes/information/</gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:LINK:LANDING_PAGE</gco:CharacterString> + </cit:protocol> + <cit:name> + <gco:CharacterString>Landing Page</gco:CharacterString> + </cit:name> + <cit:description> + <gco:CharacterString /> + </cit:description> + </cit:CI_OnlineResource> + </mrd:onLine> + <mrd:onLine> + <cit:CI_OnlineResource> + <cit:linkage> + <gco:CharacterString>https://www.donneurdesang.be</gco:CharacterString> + </cit:linkage> + <cit:protocol> + <gco:CharacterString>WWW:LINK</gco:CharacterString> + </cit:protocol> + </cit:CI_OnlineResource> + </mrd:onLine> + </mrd:MD_DigitalTransferOptions> + </mrd:transferOptions> + </mrd:MD_Distribution> + </mdb:distributionInfo> + <mdb:resourceLineage> + <mrl:LI_Lineage> + <mrl:statement> + <gco:CharacterString>lineage</gco:CharacterString> + </mrl:statement> + <mrl:scope> + <mcc:MD_Scope> + <mcc:level> + <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" codeListValue="dataset" /> + </mcc:level> + </mcc:MD_Scope> + </mrl:scope> + </mrl:LI_Lineage> + </mdb:resourceLineage> +</mdb:MD_Metadata> From 9afd1bfee2d093006ae94724ee5210ec1d4cc40b Mon Sep 17 00:00:00 2001 From: Michael Scholz <michael.scholz@dlr.de> Date: Fri, 11 Oct 2024 18:13:47 +0200 Subject: [PATCH 86/97] Improve administrator guide UI configuration documentation - Update details on how additional/custom projections are to be defined (proj4 vs. proj4js syntax) - Improve indentation of some figures for better readability of these list items - Generalise social media bar, not naming any explicit platforms because their names tend to change periodically ^^ - Fix minor capitalisation issues --- .../user-interface-configuration.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md b/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md index 1734724599f..2c8fcaf66c1 100644 --- a/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md +++ b/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md @@ -18,7 +18,7 @@ To add a new configuration, such as for a sub-portal (see [Portal configuration] Since the settings form is a long form, the `save` button is repeated at the base of the page. In either case, all settings are saved. -- **Filter settings**: This search box can be used to filter settings in the form, for example searching for "social" will show only the settings related to the Social Bar. +- **Filter settings**: This search box can be used to filter settings in the form, for example searching for "social" will show only the settings related to the Social bar. ![](img/ui-settings-filter.png) @@ -31,7 +31,7 @@ To add a new configuration, such as for a sub-portal (see [Portal configuration] ## Footer {#user-interface-config-footer} - **Footer**: Select this checkbox to determine whether the GeoNetwork footer is shown. If not set, no footer will be visible. -- **Social bar**: Select this check box to show the social bar (links to twitter, facebook, linkedin etc) in the footer. +- **Social bar**: Select this check box to show the social media bar in the footer. ![](img/ui-settings-footer.png) @@ -135,30 +135,30 @@ You can configure each map with different layers and projections. - **Map Projection** This is the default projection of the map. Make sure the projection is defined in **Projections to display maps into** below. -![](img/ui-settings-mapprojection.png) + ![](img/ui-settings-mapprojection.png) -- **List of map projections to display bounding box coordinates in** This is used in the map when editing a record and defining the bounding box extent. Note that the coordinates will be stored in WGS84 regardless of the projection used to draw them. +- **List of map projections to display bounding box coordinates in** This is used in the map when editing a record and defining the bounding box extent. Make sure the listed projections are defined in **Projections to display maps into** below. Note that the coordinates will be stored in WGS84 regardless of the projection used to draw them. -![](img/ui-settings-mapprojectionslist.png) + ![](img/ui-settings-mapprojectionslist.png) - **Projections to display maps into** This is where the different projections available to the map are defined. All projections will be shown in the `Projection Switcher` tool of the map. -![](img/ui-settings-mapprojection2.png) + ![](img/ui-settings-mapprojection2.png) -In order to enable a new projection it must be defined here using the **proj4js** syntax, which can be found at <https://proj4js.io>. Additionally the default bounding box extent, maximum bounding box extent, and allowed resolutions (if required) can be defined. + In order to enable a new projection it must be defined here using the **proj4** syntax, which can be found for many EPSG-listed projections at, for example, <https://epsg.io>. Additionall, the default bounding box extent, maximum bounding box extent and allowed resolutions (if required) can be defined. -Ensure that the coordinates inserted are in the correct units for and are local to the projection. A list of resolutions is only relevant if the main map layer has a XYZ source, which does not follow the common tiling pattern. + Ensure that the coordinates inserted are in the correct units for the projection and are local to the projection. A list of resolutions is only relevant if the main map layer has a XYZ source that does not follow the common tiling pattern. -Check that this configuration is valid by opening the map. + Check that this configuration is valid by opening the map. -![](img/ui-settings-mapprojection3.png) + ![](img/ui-settings-mapprojection3.png) -!!! info "Important" + !!! info "Important" If the configuration of a projection is incomplete or invalid, the map may fail to load. -If a projection is defined which is not supported by the source of the map layer, the map application will reproject map images at the client side. This may cause unexpected behaviour, such as rotated or distorted labels. + If a projection is defined which is not supported by the source of the map layer, the map application will reproject map images at the client side. This may cause unexpected behaviour, such as rotated or distorted labels. - **Optional Map Viewer Tools** The checkboxes in this section define the tools available to the user in the right toolbar of the main map. Elements that are not checked are not visible. - **OGC Service to use as a graticule**: This is optional and allows the use of an external service to display the graticule on the map. @@ -215,7 +215,7 @@ This section defines the configuration for the map shown when editing a record. ## Record View - **Record view**: -- **Show Social bar**: If enabled the social bar (links to facebook, twitter etc) are enabled in record view. +- **Show Social bar**: If enabled, the social media bar is enabled in record view. ## Editor Application @@ -250,7 +250,7 @@ This section defines the configuration for the map shown when editing a record. ## JSON Configuration -This section shows the JSON configuration for the currently applied User Interface settings. From here, the json can be saved to a file (by copying and pasting). +This section shows the JSON configuration for the currently applied User Interface settings. From here, the JSON can be saved to a file (by copying and pasting). - **Test client configuration**: Click this button to test the configuration in a new browser tab. - **Reset configuration**: Click this button to reset the configuration back to the default. Note that this will revert any changes you have made in the above page. From eb1a2e9f77d05a0a65750faae7ad97e0a92a0243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 10 Oct 2024 15:46:04 +0200 Subject: [PATCH 87/97] Elasticsearch / API / Allow ndjson for _msearch endpoint Some libraries/apps are using `_msearch` endpoint which can allow both `application/json` or `application/x-ndjson` content type. When ndjson is used, the API call is not forwarded to Elasticsearch ``` ERROR [geonetwork] - Content type 'application/x-ndjson' not supported ``` Cf. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html eg. ``` curl -L 'https://apps.titellus.net/geonetwork/mapstore/api/search/records/_msearch?' \ -H 'accept: application/json' \ -H 'content-type: application/x-ndjson' \ --data-raw $'{"preference":"cardQuickFilter_2"}\n{"query":{"bool":{"must":[{"bool":{"must":[{"query_string":{"query":"+(resourceType:application) -(th_infraSIG.default:Reporting_INSPIRE) -(cl_status.key:obsolete)"}}]}}]}},"size":0,"_source":{"includes":["*"],"excludes":[]},"aggs":{"th_Themes_geoportail_wallon_hierarchy.default":{"terms":{"field":"th_Themes_geoportail_wallon_hierarchy.default","size":100,"order":{"_count":"desc"}}}}}\n' ``` --- .../main/java/org/fao/geonet/api/es/EsHTTPProxy.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/src/main/java/org/fao/geonet/api/es/EsHTTPProxy.java b/services/src/main/java/org/fao/geonet/api/es/EsHTTPProxy.java index a2a0cd1bcb2..caf3c9ea8ad 100644 --- a/services/src/main/java/org/fao/geonet/api/es/EsHTTPProxy.java +++ b/services/src/main/java/org/fao/geonet/api/es/EsHTTPProxy.java @@ -330,11 +330,15 @@ public void search( description = "The multi search API executes several searches from a single API request. See https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html for search parameters, and https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html Query DSL.") @RequestMapping(value = "/search/records/_msearch", method = RequestMethod.POST, - produces = MediaType.APPLICATION_JSON_VALUE, - consumes = MediaType.APPLICATION_JSON_VALUE) + produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_NDJSON_VALUE}, + consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_NDJSON_VALUE}) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Search results.", - content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(type = "string"))) + content = { + @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(type = "string")), + @Content(mediaType = MediaType.APPLICATION_NDJSON_VALUE, schema = @Schema(type = "string")) + } + ) }) @ResponseStatus(value = HttpStatus.OK) @ResponseBody From 8c1636f15148675183c0bca3c792286678cbeabd Mon Sep 17 00:00:00 2001 From: tylerjmchugh <163562062+tylerjmchugh@users.noreply.github.com> Date: Wed, 16 Oct 2024 03:06:10 -0400 Subject: [PATCH 88/97] Remove empty filename condition (#8436) --- .../src/main/plugin/iso19139/process/thumbnail-remove.xsl | 1 - 1 file changed, 1 deletion(-) diff --git a/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl b/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl index de77616984c..cd20ebb8147 100644 --- a/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/process/thumbnail-remove.xsl @@ -54,7 +54,6 @@ <xsl:variable name="position" select="count(//gmd:graphicOverview[current() >> .]) + 1" /> <xsl:if test="not( - gmd:MD_BrowseGraphic[gmd:fileName/gco:CharacterString != ''] and ($resourceIdx = '' or $position = xs:integer($resourceIdx)) and ($resourceHash != '' or ($thumbnail_url != null and (normalize-space(gmd:MD_BrowseGraphic/gmd:fileName/gco:CharacterString) = normalize-space($thumbnail_url)))) and ($resourceHash = '' or digestUtils:md5Hex(normalize-space(.)) = $resourceHash) From 7b9361a2fb0ecdf3b838c410fb47ecc9d5619584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Wed, 16 Oct 2024 09:34:00 +0200 Subject: [PATCH 89/97] Elasticsearch / Update to 8.14.3. (#8337) * Elasticsearch / Update to 8.14.3. * Update installing-index.md --- .../docs/install-guide/installing-index.md | 21 ++++++++++++------- es/README.md | 10 ++++----- es/docker-compose.yml | 4 ++-- es/es-dashboards/README.md | 4 ++-- pom.xml | 2 +- .../WEB-INF/data/config/index/records.json | 1 - 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/docs/manual/docs/install-guide/installing-index.md b/docs/manual/docs/install-guide/installing-index.md index e3ea8950d68..870e764f3ed 100644 --- a/docs/manual/docs/install-guide/installing-index.md +++ b/docs/manual/docs/install-guide/installing-index.md @@ -1,38 +1,43 @@ # Installing search platform -The GeoNetwork search engine is built on top of Elasticsearch. The platform is used to index records and also to analyze WFS data (See [Analyze and visualize data](../user-guide/analyzing/data.md) ). +The GeoNetwork search engine is built on top of Elasticsearch. The platform is used to index records and also to index WFS data (See [Analyze and visualize data](../user-guide/analyzing/data.md) ). GeoNetwork requires an [Elasticsearch](https://www.elastic.co/products/elasticsearch) instance to be installed next to the catalog. + ## Elasticsearch compatibility +Elasticsearch Java client version: 8.14.3 + | Elasticsearch Version | Compatibility | |-----------------------| ------------- | -| Elasticsearch 7.15.x | minimum | -| Elasticsearch 8.11.3 | tested | +| Elasticsearch 8.14.3 | recommended | +| Elasticsearch 8.14.x | minimum | + +Older version may be supported but are untested. ## Installation === "Manual installation" - 1. **Download:** Elasticsearch 8.x (`8.11.3` tested, minimum `7.15.x`) from <https://www.elastic.co/downloads/elasticsearch> and unzip the file. + 1. **Download:** Elasticsearch `8.14.3` from <https://www.elastic.co/downloads/elasticsearch> and unzip the file. ``` shell - wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.3.tar.gz - tar xvfz elasticsearch-8.11.3.tar.gz + wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3.tar.gz + tar xvfz elasticsearch-8.14.3.tar.gz ``` 2. **Start**: Manually start Elasticsearch using: ``` shell - elasticsearch-8.11.3/bin/elasticsearch + elasticsearch-8.14.3/bin/elasticsearch ``` 3. **Stop**: Manually stop Elasticsearch using: ``` shell - elasticsearch-8.11.3/bin/elasticsearch stop + elasticsearch-8.14.3/bin/elasticsearch stop ``` === "Install using Maven" diff --git a/es/README.md b/es/README.md index c4b8cb15ac2..d46d0574d06 100644 --- a/es/README.md +++ b/es/README.md @@ -11,7 +11,7 @@ These configurations should not be used for a production deployment. 1. Use docker pull to download the image (you can check version in the :file:`pom.xml` file): ``` - docker pull docker.elastic.co/elasticsearch/elasticsearch:8.14.0 + docker pull docker.elastic.co/elasticsearch/elasticsearch:8.14.3 ``` 2. Use docker run, leaving 9200 available: @@ -21,7 +21,7 @@ These configurations should not be used for a production deployment. -e "discovery.type=single-node" \ -e "xpack.security.enabled=false" \ -e "xpack.security.enrollment.enabled=false" \ - docker.elastic.co/elasticsearch/elasticsearch:8.14.0 + docker.elastic.co/elasticsearch/elasticsearch:8.14.3 ``` 3. Check that elasticsearch is running by visiting http://localhost:9200 in a browser @@ -61,8 +61,8 @@ Maven installation ensure you always are using the ``es.version`` version specif ## Manual installation -1. Download Elasticsearch 8.14.0 from https://www.elastic.co/downloads/elasticsearch -and copy to the ES module, e.g., ``es/elasticsearch-8.14.0` +1. Download Elasticsearch 8.14.3 from https://www.elastic.co/downloads/elasticsearch +and copy to the ES module, e.g., ``es/elasticsearch-8.14.3` 2. Disable the security @@ -127,7 +127,7 @@ Don't hesitate to propose a Pull Request with the new language. 1. Configure ES to start on server startup. It is recommended to protect `gn-records` index from the Internet access. - * Note that for debian-based servers the current deb download (8.14.0) can be installed rather than installing manually and can be configured to run as a service using the instructions here: https://www.elastic.co/guide/en/elasticsearch/reference/current/starting-elasticsearch.html + * Note that for debian-based servers the current deb download (8.14.3) can be installed rather than installing manually and can be configured to run as a service using the instructions here: https://www.elastic.co/guide/en/elasticsearch/reference/current/starting-elasticsearch.html # Troubleshoot diff --git a/es/docker-compose.yml b/es/docker-compose.yml index 6d30f675bb1..994c6089a01 100644 --- a/es/docker-compose.yml +++ b/es/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.14.0 + image: docker.elastic.co/elasticsearch/elasticsearch:8.14.3 container_name: elasticsearch8 environment: - cluster.name=docker-cluster @@ -20,7 +20,7 @@ services: ports: - "9200:9200" kibana: - image: docker.elastic.co/kibana/kibana:8.14.0 + image: docker.elastic.co/kibana/kibana:8.14.3 container_name: kibana8 ports: - "5601:5601" diff --git a/es/es-dashboards/README.md b/es/es-dashboards/README.md index 9a2b7527487..e5e87790e31 100644 --- a/es/es-dashboards/README.md +++ b/es/es-dashboards/README.md @@ -39,7 +39,7 @@ ## Manual installation -1. Download Kibana 8.14.0 from https://www.elastic.co/downloads/kibana +1. Download Kibana 8.14.3 from https://www.elastic.co/downloads/kibana 2. Set Kibana base path and index name in config/kibana.yml: @@ -81,7 +81,7 @@ Visit Kibana in a browser using one of the above links and go to 'Saved Objects' ### Production Use -Kibana can be installed from the debian files, and Kibana 8.14.0 is confirmed as working with Geonetwork 4.4.x. +Kibana can be installed from the debian files, and Kibana 8.14.3 is confirmed as working with Geonetwork 4.4.x. Set Kibana to start when the server starts up, using the instructions at https://www.elastic.co/guide/en/kibana/current/start-stop.html diff --git a/pom.xml b/pom.xml index 3ad5f9167cb..3384985322c 100644 --- a/pom.xml +++ b/pom.xml @@ -1565,7 +1565,7 @@ <jetty.port>8080</jetty.port> <jetty.stop.port>8090</jetty.stop.port> - <es.version>8.14.0</es.version> + <es.version>8.14.3</es.version> <es.platform>linux-x86_64</es.platform> <es.installer.extension>tar.gz</es.installer.extension> <es.protocol>http</es.protocol> diff --git a/web/src/main/webResources/WEB-INF/data/config/index/records.json b/web/src/main/webResources/WEB-INF/data/config/index/records.json index f5262626866..28febb0667d 100644 --- a/web/src/main/webResources/WEB-INF/data/config/index/records.json +++ b/web/src/main/webResources/WEB-INF/data/config/index/records.json @@ -1361,7 +1361,6 @@ { "tag": { "match": "th_*", - "match_mapping_type": "object", "mapping": { "properties": { "default": { From 5ef4f51575e95fe91b87c13571c73c0b5459b41a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Tue, 15 Oct 2024 07:15:51 +0200 Subject: [PATCH 90/97] Harvester / Simple URL / Fix multiple URL alignement Cleanup records to remove, only once all URL are processed. No need for the Element to be preserved, alignement only require the list of UUIds. --- .../kernel/harvest/harvester/simpleurl/Harvester.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/simpleurl/Harvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/simpleurl/Harvester.java index 2cd1100dc6d..254fac91f84 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/simpleurl/Harvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/simpleurl/Harvester.java @@ -105,6 +105,7 @@ public HarvestResult harvest(Logger log) throws Exception { String[] urlList = params.url.split("\n"); boolean error = false; Aligner aligner = new Aligner(cancelMonitor, context, params, log); + Set<String> listOfUuids = new HashSet<>(); for (String url : urlList) { log.debug("Loading URL: " + url); @@ -151,7 +152,6 @@ public HarvestResult harvest(Logger log) throws Exception { params.numberOfRecordPath, e.getMessage())); } } - Map<String, Element> allUuids = new HashMap<>(); try { List<String> listOfUrlForPages = buildListOfUrl(params, numberOfRecordsToHarvest); for (int i = 0; i < listOfUrlForPages.size(); i++) { @@ -166,7 +166,6 @@ public HarvestResult harvest(Logger log) throws Exception { if (StringUtils.isNotEmpty(params.loopElement) || type == SimpleUrlResourceType.RDFXML) { Map<String, Element> uuids = new HashMap<>(); - try { if (type == SimpleUrlResourceType.XML) { collectRecordsFromXml(xmlObj, uuids, aligner); @@ -176,7 +175,7 @@ public HarvestResult harvest(Logger log) throws Exception { collectRecordsFromJson(jsonObj, uuids, aligner); } aligner.align(uuids, errors); - allUuids.putAll(uuids); + listOfUuids.addAll(uuids.keySet()); } catch (Exception e) { errors.add(new HarvestError(this.context, e)); log.error(String.format("Failed to collect record in response at path %s. Error is: %s", @@ -184,7 +183,6 @@ public HarvestResult harvest(Logger log) throws Exception { } } } - aligner.cleanupRemovedRecords(allUuids.keySet()); } catch (Exception t) { error = true; log.error("Unknown error trying to harvest"); @@ -198,11 +196,12 @@ public HarvestResult harvest(Logger log) throws Exception { errors.add(new HarvestError(context, t)); } - log.info("Total records processed in all searches :" + allUuids.size()); + log.info("Total records processed in all searches :" + listOfUuids.size()); if (error) { log.warning("Due to previous errors the align process has not been called"); } } + aligner.cleanupRemovedRecords(listOfUuids); return aligner.getResult(); } From 4f1dc68b3189a9850e9dd02134a4657ad347fc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Wed, 16 Oct 2024 10:00:37 +0200 Subject: [PATCH 91/97] Fix saving UI settings without changes --- .../resources/catalog/js/admin/SystemSettingsController.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js b/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js index d62c4d70814..b6cc6fab770 100644 --- a/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js +++ b/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js @@ -410,7 +410,11 @@ "../api/ui" + (isUpdate ? "/" + newid : ""), { id: newid, - configuration: isUpdate ? $scope.uiConfiguration.configuration : null + configuration: isUpdate + ? typeof $scope.uiConfiguration.configuration === "string" + ? $scope.uiConfiguration.configuration + : JSON.stringify($scope.uiConfiguration.configuration, null, 2) + : null }, { responseType: "text" } ) From f64425c7e32652602f49c83e851d00c0e21a2b1b Mon Sep 17 00:00:00 2001 From: Francois Prunayre <fx.prunayre@gmail.com> Date: Tue, 15 Oct 2024 08:25:23 +0200 Subject: [PATCH 92/97] Record view / More like this / Add filter option. Similar records are suggested using a more like this query. Catalogue administrator may want to customize what is proposed. eg. exclude obsolete records. Funded by EEA --- .../img/morelikethisconfig.png | Bin 0 -> 39426 bytes .../img/ui-settings-searchpage.png | Bin 48832 -> 29083 bytes .../user-interface-configuration.md | 15 ++++++------ .../search/mdview/mdviewDirective.js | 22 +++++++++++++++--- .../resources/catalog/js/CatController.js | 3 +++ .../resources/catalog/locales/en-admin.json | 1 + .../main/resources/catalog/locales/en-v4.json | 6 +++-- 7 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 docs/manual/docs/administrator-guide/configuring-the-catalog/img/morelikethisconfig.png diff --git a/docs/manual/docs/administrator-guide/configuring-the-catalog/img/morelikethisconfig.png b/docs/manual/docs/administrator-guide/configuring-the-catalog/img/morelikethisconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..bc215c549b528c0da97fed46ff325b7332252723 GIT binary patch literal 39426 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�OO1fjx13)PLf*8_%Ytk+O^0Z8UU>oDZnu?hJgc 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≶8|*5H&5eRcgk<9xJ= zG*u-IR^<}3MX9YSC3@mXC#LANbhty55f*HEy@QgTXqmJ$-<N*ZvHZp6`HlS~UhmSx zc`)WE%kad$6jKG-+oANI_!OQ+$fzpq<m%8n6wtcMR@?jaC|$TE?Q1T?jG8X@g~wGa z-QPdKgiY&{=@MM1HdITPESkoz|LEg#-qU)TTydgvH_`ngldJt&>gckLdz5lYFNyk- zTc~WQ#}u<3dtp0*2khU&rz?-5@@RuHI+djh<C7VQDvu+&+k+A;Mt8!f#0v?f3hV`A zosDI7YgYKnM$})VcoH67@{Vekm8D!fvf{8|h^%{eIvv_;s#wQ%D$zsog2wr?{dDg| z-&!;kO|lpw`yIc9Y~TX~BkP2{USY&upsy0^bK#)-*-x2>I<||0j)@7Fm?MI}mQp)8 z9rhlV+Z6wRYthvw_Ej3e-`T^L&v?F{Y-i=)qT6*wEl@p2X|cGRh)*9)&bbb!a9$KV zf=5Ul&IxoRC|WVBm1Jm?>~$G$wpQ%e<|u*oyS1w}O|h%-JLMDx_Q<I{1L3IdK+b{D zRnKEy{Jn}!jrAJJ4vsTdX<Q*L4w;?@S<Rd&`S&L?<^xqiw&-1pqp<r<IJ)iLOLIJG zZEjDx-$DGVg0k$z)F7MYI{&MobJ7l%V!qSXJB${~YP^w`3$tlUZ5SPKN+e7(^D4|X z2(@1AXhJEQV|d@Fl<f>uvbK_@wm@cBDIyH-tgX&fraHprO{kiN;qrz^i)7!lQdMUD z^MZC)rESv(R=AyUIwT&A!2;O=85#16u66|v_zSZW6MlLYCVW=mV->wSS{~OYJWtrW zJf%jo1@n+w44+_k^9bBlKFF3CJZ5Er-Wu3hS`44gs&N0z1nqUN9v$6)O9BBr4v`|u zBEQ9o7uDc&i|5aBRTht<-Y;66aj43i%vC(9afni>!9SJjb%rT&kp8F-qY<1sTb|s{ zgPL~bp`NDai*J5<a6BgCZvlIM?xCqvLtB%*by%^TvOl$*pU=0%9_T5|u2&#^ITaw} zYk^}kwz5CRaB}>9WuALf>?)|oW8eNStXnwaU1)iayto>p;IekcY1<Qeja3zS0FI_e z$$xLcv#9b+uI(kGv0%n4Iqhn-FA1Hgm#L(jGHhq~GLHUtO-gnKwCyC8rEKzzYR{Zk zT`qTU^Qnooa;XbVlT=(=BrWnIusT0>8~7^CsYF?XK1QlmH^|zRcm0fc9a~<dMcmCY z-O((0Fga1{#*4pE5rwj!l=LB6ZBDLBa&X=5{nsvenlk;Q2laZ7RVOBLsz8mY0)vO* zYkm_S{si=j;WVhh_O0?RRGlXOvahe-X?m+Zykg(Il!90Yt>(;vn-LRKVtPFujyXZ^ zPt&r{Pp9S1iZZTj+4dY~$i^Mm4@dcqU35h~S>`MqXFxK`$s>nG!s`fSGR{BonOnOT zF3A}y@ldMU?eA0DXk;GLv5YVF191ZinZ|h{-{S4KGcp-BL|U!*uAaAOOM)d{Q|fFN z{U}N9=o}`##ohGfB0F>W(<zv<j|HX;((FycBMT?e$hP>@<c)jy6a1DS;=hfjP9Vfw z-Z{P-t5j6=;_ex5<eMz6NCx;qYqNjWT>cs6lg$P7aq3ya9Rv+k<Jg^NvGT^{o2E0& zWGo^`Sl_bJ`yB(b$V|aur4y4BBU2;kj-!g#EWPE!R$n4CS(c<EW+*i$Hn5?Ko8ZZp zi|;zQ10qcu`zIfS%IL6Lnc4_5UF3UD`8H2$QQFxw4_P0z;GV)|&-3JD3UO9gv;XBd zc|N~nAqxTP;VD{$W3AHM)~DL!@Hs(dT6h(wyA5*XCwYz19Ne0du`At3EOY<Dj=?|E zv18~>Nv>E)_wfuS)XG^?cqTa2XO?PK@M!KHbYKKySws5;HNU>LH8p|Iq^_2Fg+D@N z2D9pD$1kXT=1WvmQ1rrjVPn{UJ-73i1aReVi)?*oMP+^Ia&0n=${ia&_+nR1sA_X3 zEG^y|c=5Thr10#pH%jwxAS-{OE8WGqELVnKx>-^isAXiOdZ_C;prtdDDHv_WOovyh z$naxB^J_aZ(o-)U4&$*=JB#=emvTH|iDcW{O4rHx6z=&`Nee3I^fhjUQCpZkB3NIn zR#z3VJtd^AagnD{`M<XM+0x2Ow`1l5Meja;SvK{>u36bj-h9={%vk+ln_hXG{VuPl z(r1R>jXynFJttdyZqM(orOVz{I=gP1l9!S9|Bp}aw$N4T&paGmgSU8JIXzD=ka^4N z**}2!K<;Q1i`1O=-qG7vANjuWt!u7IZU4DL?REcvQ!Ovcu0|JW-#WKpXOvgG-uKd< zS(CQrpP97vovTdgx!>!QR(4w4?~KTvSoZn!w0X6=<?JTiOV+=aZD4UQ?)Yz>Q_~J@ zd*7e=_fyI4OaHI=y!P1i-tCKKO!E)sV+S<npG;nQwGg<u3z#0I!{zLJmaeS5wld;} z!2O2L2U~;U)-V0I+52Ter16GG_Q!l$6E^KQxM}6#_Dc(rIon=JbgYx{*KVksG;yLT zEBCfCDZ4WaF9gp$X3V`C<u>IQuSDM6U_DmmxwR#``6kVikZr!SW!VW%M$1X&%N)4k z^(Wnl-x@lP-{SZ8VyD{=VouHu$YPs6ds^eQsF`0=mPr=On;oyCnryUq|F72@h2o|M zC(fIr9r^c;o_X%mwdbB+TEAVG!)wW{>Yx8k?Udw^t*!0bXSe_FtuxQd=f{<QVtiit zuAwmg$AmU7%`5L*trpY)t3kdj?k>-F!R(Xvx^MdMFlVjQe9gV@Pfv}Ep4`gME?Z#d zao_r9!{@f8=S;t6zgBwsCU{50_riA<r^uY#bKdg4I`@*2)Tzb!#wxch*T=?k0C)Nq zTF=Wah`##e&if*#?&`hES{Da&9e?Wi?t#wpdtyhMf*!qRi&_1H*-Z;L_;JW(!w1H2 zpV#xY2JKw9_E|;UT9JEKzpehhGHPX1ob=ip>(FPX1SS1gr*%E)bzgmD&zly`_g2Om zAMjqc{?{<k3z!oOfUB>gOhP;_KF~RNDKqwWs`tFxzRR}yojRTZOz&T&zbTwrxY^P1 zgr!uj=_#pLz0!MkJb!TTB6NeB!PIOR0}Z4?^O}Gue|&*sSTTDlF2(~#Hh|zlZpO18 zvw=5g268HZ1t##BWP^l?pPxGkTv+T9?XZPg4AhlSN-AF!>1=%bKl`PsFCqES2EgGa O;NXa>pUXO@geCx!r(neZ literal 0 HcmV?d00001 diff --git a/docs/manual/docs/administrator-guide/configuring-the-catalog/img/ui-settings-searchpage.png b/docs/manual/docs/administrator-guide/configuring-the-catalog/img/ui-settings-searchpage.png index 06bc3bff312534b4c9e9a8f5ec413272f8dedc72..c764f5d9244fee55fa713c7494f1e05a23e94137 100644 GIT binary patch literal 29083 zcmeFZbyQr<5-$pYK=2R}+=2!l+#x}O2S{*-8FX-Gu#h0Z0tC0<!JXjlHX*n>6Wrb2 zBq87V&U^Q)d(XY^y!X%9EY{5KUH$9o>gw9n)zuU9N>LgMofsVf0Rc<qrGyFs0<t~= z0^-C26nIIZx^xEoqs{%bhNFt13#F~S4anRINa^Ti3#0_Pnu8D!T&KXVl(E|=A6&y8 z3*Nh@B^0JRZNfXTkD4wsd-8~4VVM3N?9!>F?S;(qgY2xBw<x(Pxti&OX32Q6urSDR z?<SA}n~XuzB$)JVOrZHrI0k1nNVAb>-QmF{<A^JPOjF3Sdmhp$6m4Iysk0w`2bk@% zFu(bFNpOOvZpLi;NO$@smp5@PVw;RkfS;Y1GuF(<6V28k&7sP#+oHyCP-wu4@^+02 zks@$j^TWx?Z9lwk@6E-<U&)Az|LG3A6G@&C!Y|vNlXmE<R;n<PZBZ^gOcT(2_{6T@ z%`>t0ub3(}4D8nfzGXg@v9o)ugMsbEtVX7j<m6=g1i1z0p(!f8Bmu*|w@jL30czK^ ztIMw4DfYt+V78{N-Sc5EXR>_Y<je;`SILKlM+T&A9OWUJGO}sQXSD(0#V+hAqvtcJ z8A=1%n0rC(cAz+(eS!U>Y_RPdeOO6k!J|~X@OZ};OVUM5<V|+0wak0{f$=g>T<O3L zBN8TXzihUYkR<6F?&O2_1zn6VmO-tW-h|T?Hq6!IRobFqQn5!E8t;&C(eoyr6Y&^T zY-DP@9QI20^Zs@$x1!Qri6|B3_WJV+=j#RUy*llD0RJNG`$x}DgO?#82)??Xl^v3H zjl0Z~5N=EtWNprwoD9~Yj<n>0$q^U93rn?G3?9v^*nmBg?(8jDuLQ9)g!<GW-c_F) zZOZD6<FT2pb)=7JMJl|_El&YjnOl|EyF1|B?Rn0D8!v=PPx}_Aw1+KR?_AB{`lX>D zFJNo~W;HaiF#@u>g5eL~myoEdt)a0c(2>#zXliaPOto9rL`7+CB21;utpHH46$hG` zzjU_;s=6z_Hg>l(<~N}d6+str6@UYPfsTfhu3#%`2LV@Ms$aMQ@b5p1*{CRgkvLik zQ)wu?q7=8W2U2pea<KwfBwfv&IjBU?DTVA!KmsZfQg;yWJ7Fp_M@L%$HZ~U*7giTe zRvUX$Hg<k~el`FH8wUpqoPx!{&Dzn>mBreD`X|J13<;ovvAwyiqq&VW<xfmQBO512 zVJa&4bIL#bfo&BO{(`r5xRU~09&E0LwruRI05&j~?e8@l93`FMAa@M?4{JEQhEG#A z6`+HSlf5xe(iv#&Nd0#R6XU<?+dA1>{pya1F&oed2!@k7z*}YirzWLk6kh#R<EIEr z&B3<6YQcs5Pn3@4pnnMKpLqNE<X3n8&Ir8vU%3B7{ipB0h~ZQU3IY-~#!f%klaUan z`q{pKiH)(jiNLR~M*O_IT%24cEJi?19u_VxASa8F2>{4q#Kp_c0R*t~aq;v14NAt^ z!O_s#82A$k4$f*0$1&pI1#%gI_*uBvL53_`Aa-^ZLk@rmi-{o*J1>BP8w4=o`x}Ik zy*XSf4Xysp)lVoBIFt!L(1erUgqwxSki&$93kcw0;WOglVgYcQz+ph_hMYjaFDMgZ z0Vx}MupxXn&B2DIKsH-z(_asM3S8jDD;Z%b4%XkKze-+N89IXC6@;ne&8?kW|3UiN z91K)-H2f(|c3uuXeqJtqPWTsYUY_4P|EjG9w0D4O;!jL=04pcYuj)UCMF8FzxL^%` z>M0!HS2?^d0^;^SLq{9?*ETj*!c;#YD1X-c>#+iSI+++c8cG;C0^y(l4lV(9fB-x9 zYXF}B7oPw(fC<1M0QeidjfpwP?SDr7bMjCM{T}j{<__@o-F_AQo>8hmyWe-eZ>`LK zO(jaoUz0+>(D-*391NX-CcpTEWBq<)Y-VU}3WQsaJ9Yh2ZvH<|1wJlbb}lZs766Pv z#&CUr&u)GYACSeE*O<?k9|Q!lbN}wuU+4}tAV(KNd*BOGxE$fKf~)5*Sy4XwHBb!y z%!`W|@aHJN1;)Y-VEKo@*zW|!cGqFHpEl!9kA>L&A2Jd8MesKx1F!eH3~s#Owvg>F zV|XVsIKThN>uxOmlTA=k{<o2TOTPaV*MG(JZ%N?aBL1&-{a0N7mIVGS;{R&b|7+qx z|HpC)Xbty*T;PkP(~w(V_(BWCNKRS;;r8d>=Z2gpcnO;AOHBs^1Pr{N|A+_)Nrdo1 zR7V*FNz@<cI4A(l=NJ!n5fCU5WF%g^cAeUq^?p5a>brZJ69jqr&YX^t+_z{@q1RPy z<rA~nSeo#lf|`|4;M}9{Ojb=sr|FZ=hERGm4WI;DnkGsQ{a%3I&pxrn@WPX|$fLvJ zX;{u~4)w=sK%ZYWm~GkRcxBLUay|seT)ph_Nl(XJrpa~_9^6L;i5#BSdt<>MdTveg zshZ31EAZ}m`Ftje?ji2)3oU6fN)&Ro81U==YQM|k$=#C(qBvm>p3_+u3i$tg<*u)& zD-khqs}&EY$B9*C+#OgqCInsy6C3-U4qo%j{hPfG6AlK~I|$sG`{kz4P7{v(#Q+Mu z!#UjrCDX_CfB2ZGoh&z1s!I;$nfcQu8s&R7s=Es@b5By@_eJCLxbaUd<d3Zce>g-? zIr~HX=sCLn9ks;0my5xF`ij5+`NPb=1P4Knki5^@D1Q9-(Y(CB7a)3NIAy%kcxm0* z+8P)dy1G-htHyMP*d03-(iY2UI%qqt>#`r~eICmzR8(Fb1uxk<F80<fWWM7_UyD=E zd1c?#b*}~We3|0bb)e}G20e7~K6ObF^-e*hfIJNEI=l~#A>T+nXS%6sgoQm*xGc)i zjKAf{P``#;Ix1f_G#PDfl6z9$b<Db)2nsp>kr7Tv)^IZBZDR6nw$5dEejX}%)h7Dt z_3L(N3QxyF`W?3biZ>$%`Be@_*yjK-Sh>MIZ+G`xdj^Kzs45=5$zzor?dBZoh#|$f zo9J+0c!!aZ$b9c~TUm)Mcgb(Lb%S}9_kdPbn5j^gflaoCqeo4bv%3f-)7vvH^PVB0 zp|dNR({65?*k0F_RtH{ZSdI9gg}R9rHb&WJJ@3y&y}~qB*%0EWjDs4;=r_LPEFBYi zooO)By+sQTk{tRY%5C0DHBmkej#j4P`c{|5Lo%<M!&HZpElmV+_a9Hk3N$&(qmCWF zIolyx@)Rzny~it#C#TCOi92s1r#kv>x4UOQiRd*t*7p&&_brfUWhE2W@}Nn0LQhFk zQ<xrl%wh7b^o)e0yGL7G9<Zl~8&2^6IBZP7=ekD~e!WL;rS+|669^o+srA#-Ck&>T zlu#TrzF9_uz`j7CStl#^{l%I(sV6&DM2Y#qPplochg=Rcb#bMfJ0BL0JKNfIOPfJZ z+}@kFqqJStjUAkd6Irp(Wmgr(28*Kvr}k&;#RmX%osv&<mCCo5=)!g&pA1mUi`mi& zPH14P#Qovk?-bmo_X$b^T=ZBMo7n`a0mx|>OKu#3;ilx+0jDmdJf{RYN7rw6Z$=ZX z&R}8_`@Bgyhv*(-?~wfJ_4UOh!6XF!5W+)(!)|}lG78<70O1kQL)|&gijM(v#j67j z4LV2fORZF&N`|wH@XG$yp%uojM_<+>B5<9zrzBNX@kGyBaL!iQywRFduP0MW4cq+V zQvp_p7-DRD!51z+5^B?X9`|L03x{}*D$|QHK3n9)C_9H4H?71Le=6%#@57+A;e611 zN&1Yh`IaEHD?I#`sY}0S*%HQh)|Kjf4h0h0?vK|`Ms=pBd%XnpQ|`vB+J8Pxe0+1p z*X5PeH9i=<e~LQAww?3+_+ry_?9)MSsqvN!=h>S{#JObW@@Nu$K|&;V?-pp?SP5)Y zo&QRfz0VzIFC10iTC&YxZ@hT;WWdPlV8hVsq>T$AI@>bmVpCrp4BLKWZ)vEo4(0RO z3a~;Kl#zMCqU!@Ye&l?`_$h?qCdB)CJhjvm>k1-$e;4x}4j2}Yh>v$wY2|g*=lyg! zufP3p4IACUQ%LOsz3FO|{l;zh-jpo*mz^Y`R%z|)>36{0Mfzg$wXVcgK25uiF4D*E zAN@8nH7tvLN&F6H8|qEy&G0L0oX2XS8D0YNYF!BEVVG-9t=wLy%cp=9r}mh_!u4Ru z&d}9R;IuwWy`isr<_NIZ;=|z2O+x;3WhF6*6xlU!i{duq07gzFMEJIiVy*NHz*>=7 z2MJ3%7fRSy!1qslKn`9W&~M}AOrhctB2-;zv+89sS#C><4X$MNGbInB;hT`y;%)4? zr_V;fs;KUpSj`jc#$jwk7t9b-(S`qQ*g3MO=PS(HFQ;)`{|v8wPg@9Iw7thg!1{56 z?ZI)>J8w%QOCx#YMEnCY=cn(9g4uocY@QtUhGV!{rJ(_E54$rU11@1<b4nYSI89#V zSi{sLFN4_;TO_<3kj#TU&PNls@wy1#c~ggWQC+LPYh9)Q-8fB4-Dzasc1$dp=dQ;* z(&w5QA|EUgo)UwWx7w_M3_O0xqHgF)rl?@D-GiGt8<nccdrRe$s`dUQ7!60*$(aVL z#YGn@<3Ac6#7V6SyM08eY|36<YER)3Cor7+BrXm&efFc@I`rH<4IvIUs{<zT?DH$i z2v<t{2~D;)t59N;PA55Uhw&6qplWnU37~qSL$Vp+Ev(D-+=8yP71N(puf9b!)O~&H zeMwjLCw8G28xev1^4)t)d3?>AU;@Ge#52N!_p|L@><x~`tyj4)+NASCEY_0~4%xV- zs|Z7NNbffnncp2X(c;9`2SFRJB6<+$goKg;;6^UNc(?I#hbTojZZ9stm22%Oxh~SA z?(xcv!u{wbuXjyIAtm$-!u81k*_URp7wEEH3i5O0dTv~i2A{82b0)_;t^=E0>a_N= ziw5ZRF30YLtPgT^Pt(?r*2leA$I++bAti)FZQmBEQS04Fo0Df5C=Du)cYqD*UR-<3 zU(QvKY^4agV3$uqRAEQ;m((BhyhxyLic#5g`riTwi4P35N_<Mv9CYH`zkNXs_iiIV zfhK40ZjlIa<9hi7IKZq+u<5KsFhcYOb*qKGnp7NuE#|FKC&bs*W=ARm+}D#;PJ$Z< zo?1PPI+T|35UfcWb^Wn@jEm26ixU1R1=@Q4ZJM8Ualam#SZOoN@9ulzAYwEww2q_a zGvu(HRF_*}F2b&!N`TWq0C_jigcV+m|9hsLN5<Qom6;7ub#`^}J8eAvDanf4Igedo zc)|Ih=<Q*mfT=5?&Y2t0{kpl8>mqU?KXUilIoN<M@M>eph+GpNyEJ^i`^sTNt$uy} zlS@hP*S?#W+x!J5cLZwYkZ-|c6;7e|$mfa+7q-)0Rl7!*Q^zg1l3)6_2%_TbSwkuP zgm>*fXTD4Q3WcEbD(Fu0b#0=~r<p$9s~6wiBnZ^03X$`eJ-JDk;;kdRk1}7pdK~s@ ziQ;-HR4dd*2p_t@hW%=K$IuquF3u<A6K6IlTfzuK+nre+p=N{e>DMEv)FXsTOOoCb zCWI)<;>kLDn0l2J3`s!C81}P#zxp};2O-}NPY^AjEDJqdMn|D{j!t|U5u4yeuX>}H zl@&9E_tidDc-`er9U2x^LrqktP+N*{1Sy{eG^~kbdFdk#wWA0IJ{$FAK%y)2BT9c$ zS&aQ?vIQIUSbzi}#!^$qt!}mdOP>JVkJm2|pLmxi_@!ZJ#Kedj>S5m3#@Vy-dUoqL zutJK5V;UQ&t0vXsqV5m@z!!~d6E*32BvcCP8$iFwv=l{o=jF#;y8CJ`nM{X}Bd&=# zu@x(}Eo1>`=~~?ova9B38v$72eO$JhMgrwT^Dg+f6ioa2F(d#9FFaw8Y0%*5!<YtN z7ne_a$xVz;t@f#{dKp#>jhO_UudocWL=A__x-`_ZrCMABUCS!s_HtpKT;bn?fuB}y zcp3dE9leCYALB=*ZQc2kCY_+r@bK_dxEpqU2+QZbx0+0KlgE5idpTOM>z)86;I(sv zWoV62|90gL?vG7R_aWg3*>+gE<ZAw&ND>nFr2pn+nomaDd7RzgbfEMfuQZkY{}+E2 zX~qF6d~|Y>$Nh&{k@p@uHL!$n5EA5QNLpyG8Oh@5ow`IQEnb};j@M`ZgYEzCT<`y= zU;iHk-`U#(`uO)tJi;5!bw<pvi7=L<u^Uy?5)IxAx>E&+Y$_v!$Z5q`NuGv%sFM>5 z$(IehM-@3<XnO4~81Z%WooVjN%Kg_JlRX#)3cApX<J|W5sCkbHw{)Uk8X3_!?c~d< zM#vf&Q7OHtMj#kn52B&dJBEVjX@vvO0}_?v>~+xVpcc>X{OK8U(ENoosvW60=mApO zo?Y!e^3KTX^m|%582M%8nof0!FpIRTKHk;)cy<hv?X$|dCJ*CFNG-qI@}_plY{uh_ zSh;XGF66Axnmzmj*<<aw)@Q&O$|BycRTdW7hb5&QzEEvM7m!%%c#9dn@inhUM)&;y z$oS2g;#`7I(WI!unzkes>14djhgtuD6j{YtbCjIAHOIa%6s_DrCHf9)>LCz4cb%0i zzm#1=Wt2j$vsF;ggj!aV>TEB94>jtvs)yaZqJ)qj2gR>jW<F!J5DwL?iAUfG^{gn} zwPs;~{VHk-ZMaBc_|1w2>73HBp}NJ`ocM#@o{b@89Jfs$Hd5^urX!x?uwds%{aMeD z?ZmXjzUWfcf*4fh?7b64^y4IT(WwmUM6gxSU2c!jeL07Rj{>dl#Bt_YXoMgjg+`Nd z7g86SQKPl!CQT$m=f;K-pS=&>*q+=1JL09(N5E8<_bN$^F0(ll!|&ysMyl=+7fwv5 z=)APZOvLkWIP3a~(vqM!h=+mrK)*4iwf-@_p2Lmupqh~M$&QrHqBD<3(|eQPfEe*< zx9rSGiXuW36u>tPsa12P+<0dyPhGBE)^xh(eLi%s4MP7k+`DC^eL!6YP#TGkSbN_P zm^IrvvuE;1R_knDn#3;4)M#HC30dii*Up$c*BOsFV5}3yH#POL?>S>`%R@{|?Xig1 z26PMqJ3&|bQzFHBC;$3)?|E6JEXe`}&*Ca+0+P>jB}&7pyB}dE6LpLtsSVq6U=+p` zIBx~Zhb(<gTR=9|(k)^1U3vFRHq6<uj4sMZA6ci;X21-C8%q(=X@B7SB!YwBWvG$a zs53DM&SH0I1c!1!+ABeR;AA`dhmO&H2kAP#Wl|qW2T>q_o7q&d`010rFn3BWU#Hw) zgjlK4yVWPz)>vz-FCHoQnB8*Gehc4cm4=?MqJnG578q$B?{528j+yQ@yak_G*=JZm z9lA=58NB)(rB*rSnHaxcPS*e>FSb64j;^aujapy39%oB?7J=?uIq+M%fgEi#kap#= z8I~BwxpX+IBkZB*;QRo@Qel+b|LScabLsPCB7)?iz5o>M7=z?z;-8u#L$EKb#R<-T zSO~uu|D+y5I}cJ<#y)w5W$@d6MhMQbun5|xnypmebk<q8GO|asx7(CvbfEI_yRS%D zf{XB^<TVYsHV!F{*9k^KzU!1F&xR^CM%G99IXR7pP;}3l`_Y3gAdmbE+UD`qO`nVV ziQjO(S1R<RS+CsPhdVU;dfWH~KG0P|E-sA>^*cunV*$UFfH#b~@a#cH?GjpwtI?AF z!J}4RR%vSWPBzw??XC8)az9i4ZIqB__=;|7M_=-fzb_Guua}=8sG2;^R(jT>BS*97 z)8*!DgcGl<#l#a4AFpt{PM*Yy^RVaOwO}wa{+<rZZel#~^CP0J^jCztc1uZDKR!pP z5g2F$RnEvpX_shWHuvmPo3g<ak+6vsU43i|Vm5_f?n44qLbzz+^b=pdp7VfzFx|Zl zeYp;S($=WbP=tt{mFQI^H|Fw0fzzlhk>T#r;YsF%gZi~w)tY1uD0)bYcoN~;g;k{z zBUT+Px#8iLGG2TPY6MtVy3c8tRAQRxJ222TU0bJK4#dkIxQLbIMvDh%t)t!YOpe*k zETVjCyA>FDE<a<AU3vBZ6(z}Le{Ayo1U*lm6F*~aRc2(8MZ>{WOP^+J?L%n=4B)g2 zN1Rd1s771R(-MdvS>3u?!puA2Lo`Nhy=AKbloYF=He!(vmq$dk{>`6CB95yz2Q1J! ztANyfWP)b=T2ceG$W_b<klo$}L%MLKZe|)`#d4FoSFZ>gXUh4Kh0q7Qz_J{9G(Cj$ zk{sriPN>kP%(FMD)+>(U~{S;(pI#*}s9T1UWUezC=-x@H)o(V^8Pkx5^JVK$5a z4T+P!I*lf(4=EXSlb$~?rCJ4?$-3#EPDt1*lJ{U>xrfD+o(8tmCZoD~Nz(WqK6@kW z@t`WJ+**cDN(p1siRDPg;l^O84ChrTEm3ezL<4P|xnn@NQD5KHGf`jdP%e42b5h8; zTO=M;%c!heFkZMh8q*ko!`|vh5LR%pu{An>yc%XL-|O!HV4d#m9DrU?{(8Lo*7=;P z_s**lkuHZj-d)gCQRq)!DN#xIx%k@GXZ*&%KBdi~sdp}7mbm#mWI(eH)`Z@z4Xiu& z<6JC})wo7(;E&7ni0^NKyk|arVSikhMxBbSmv=WSoZ0`|!9lZ=LP$64kR1SMh6mxA z;W4vJwa0gJ*{2$o;!%Bja~Ut_!s>4bdAbQ$-s^xJ?oZF(#CYsB#0CaF06|j<BPj3K zMcm)-qTqywuxz|9waFoSEo>$ToXaaF1_nMq$>Hwh&uA%VAfcl`vz&|g5BpWb6cnZq zNK!FmmFa57rO6mh|K-aUHXUIQX(Jp3RYF?Yn9%?2pGYU#m;HUao!U)Scqme&wyv&; zbg>W4_`4nxmAyZLL*$JYe&_G+Wq6w0u&KsWwD2c-DuSVZL@E}ZaJO!X5KQ?if{Gg- z^Vj!?e-%yr5r(dx^d|A#t8kMpd}qzp8vk+{5mFuYBq}<h#s7QM8N!b?<;M7s5KLz- zcN=fRI-ICP<!1VnDVNBDeoPJ?g5e3_eJzhCiJTnWjC>)(E~EQ%QXe?v%!wNn$?EBI zdk1K!sbjSW`0~rnHowzB5VwigLM4ezOsq2Mb8Y;c&I&pQO^2{k+0>6g93RLa383R- zX4>)v!a2b#l{SUPrdHWgxuTuF<ZzI)iH)vbyKZ|C81!|<g#4SLc2jh*Hi7`3&V11E zq$g>=u0P@e#P32C^j$wM3ov<g{-#f(vueZBMAGSCxNZAp+^Bp)JzmaAUszPs38=H+ zaD$?LG#-Q%--zw0P`pg2EwkUE!oi&ShPI!EVD!Mq{Xxz~_;P{_naKObDk(+hO*sMT zMxK)=6m1j{Sj*2EIgmH6LW3^}x{TE1emjN`&`#3c>Ic9o-41)s+yagV5qU7kuK$yE zFD_f#8le$v7A=~yoKNH}Zt>|sf5=C|C6<L_J$}>{ZwIU6c~T`+RGTIOYC8Pj{mF4E z0Xme!lGB5Npv2s^LYxPRqvJ#0i`mvgj_Q8!N-tAzunKgg2R1%_>om+0<)ivr|Ez;2 zU1VQCwwqdjHRqF$lAG-8Z<i|Mc+ZTVe;f6cc=c^Hb-K5w0R1TwRv3k4PThR4p=M8c z4H4crY4-J=S6+DKBDpW61E$QnW`WX&6KLkTpv-6rBWV%tTPpl=XYf(<_=cd2(;Kp| zFt5(HYY(3^#S|2bYOsyM5?XN`6$*7KDlY?j%H;I}NFes<54qlK=QQTxoj&Lf`p}Y6 z6WZ^}`K@blW_Q?nUe>B>lTXLf)f2SDSyei)Qyl!YFy<g{+0p%}(Y_W(th366J95V* zN2&blr)Jqsdo^Y=`jXeViXtl_Mpi^7z{%^yh_9hjo}+vMGmvglDrT8Xn*l0wJ&I7t z`J8MAOj%Ad?b>Lh=_NbCyf1m8@AJKpcY>+Bj?0DW#(EvaJEzt98ZA)CuBid^Z#!hx zO@OS20goE3NiX|yg;zl)VfVE=iN&yYTawjeyi~f6p{q9!*CY%y6P#<X8?6&8^1fJZ zv<u?Dn=JcOQNX-~w?0vFNO+l#Jv?^&)cD0|sjWG2VyeQ4_lXIAJonSg;;rn)x!{KC zB+R~5yNP4Nhq%E}FTHt!GvyFx0Na%vBc!{Zy{)j>Pnhk?V{|XbG3x}-K9nk9q7rzn z5vH@g$xI&fVq#*s@v?jUM%lafeG@-{F?2>=s@`qsTife56d41;LtZEHJf`hRI$Z&q zD4vT2Q~iUBT{09Ne#9^%`+T1A>bjtWJb?s(OQOW`k7t#dLUkAR^P$Ir6Y6i|9L68K zP~Oi3Pxo#>sSSUdOf(-s(3+fSV$`LvwR6?G;3{X(jrU%ILj7V{gtnIA8=%Pk9PbzY z9sThor%$Txu7n;hXe%pG-RwM(w=d;#9qzf>z1~hUS0rX5FUYFp3pJF++bQi^&7G}D zJ^3Nui!-KDSL_qr7BE@UWDdG?a7}h}FN6rMjZJ-<u1>wC7uV3%>B%ovQ>l1Fy80$5 z>6yewcBw9sfw*x3mB!)^2bi4T(c_A9pT(%xu}v*;EUBKA(T@vH?5i7-OFw@m!Z)%Y z^Ec0D%pR=!G~+3{xFDBU>Zn$l-x(Bcn2^`YF9OQ>eDFq3SVKPHoaXYBcL_+|BUw`r z#~F}0qlIm)?Z23pQ=jMe<(SQWZ#1=p&4t19IBTR*N!5R+?QtxRaRJMc0hk3fc+7}v zdvVqHrg6tBBPs91&7|J-<J1AOk>cp$kJA8|@$9$YksXIK=<!BADYJJ>$BxC#x+}#( zMgxfc&FsDvOL10JRZ^kc?CV&yp&cZ%oT7@b#tHD&Wl#Q<$vmi_i1?&w$df;uM5HI^ zCi?L<6Wss@J9c<W?^{_f`;s_E2a-!U9L|~xi-JSGfi<oVOgJj>bs>h*SOLikmc`kW zys>XLcyw$YM<pi8?S#1tOm9AWme+xXsf5ON8K$nh`eAYMK<idR)ACz=@t7$71u+Ag z6TlR_FL9ZL`(0<S$QbYP8ls|)+@ewEH&_fSD;5fNO&W>b=`!zG>gY`^vC$TqyHLra zL#5MGY#frgs<Ou>heR9&I&WAc5{=E9{(AW;pV<r6m~Fo6;BA->jta|t+7Y*#Kw_F| z6H;m^VrB@`D!9F^B2jC!MoVw1oA*A1{h%C48MKglU;wbuL<#RYI@Bx2^Pe`~h-)hw z?U5jP9vEHGWz42O<dy`oVK!gikHeyD7qi!T^c0LeMYls4N=ZmjS0&$A+E=Vo%g<A! zA5h9ZUm0aa7q?xr#WepxSOED!OQcB~$Cv^vD@*Xj48<+qiQ5fcoUu_5;bzV>hGR-P zm^r0uxFC)l(3MlpbF%@UdeB(}9^D*k86VtNHD=bm<Wnnu(OvKQ{VNzatKxkgS+!%V zf1`D!KpqNy|D;wh-Z_y#j=1AekH&IR2otkkO;ARe+R;hB&dKU)o3Ee+?Yi@A0WI~E zVuJ8nZ<nO>M3E`Qns`&CHgfRUrNy;udRNhSL0d@3^KVHHZ)^HXO&+Ts;^f18i$i%6 zAT(Kp9Tq46V^5*bvqjaU9|(a!Pd8f0_|iBmK>vP0V6tD`u#?;QWVeu&Wn>^vfPs8i zTP9Z|%TvOqLo`5Z;O11EoH0vx{iljiwSIqJey{tbAhsPZ3MnhPj;#Aa)<N{;)t|n9 zS1F6pDuKnQYJKv3Vyl40Ctcs>Lv%>$^DrGQ$NVYzdc@g*uJsBbMXB%gK__xl*ZXES z4d<V{+2WOcU?34<1Oc7O?mGk`Zqu7>==V=mxURh?j58i~b=Ib<V(44PFVs|0Ig&_@ zVqS1gdt!R`l3yCsa2^>~3>fcCNKD#ipYi%&-S<7{W2>}_DrZq3AqRcVz}bbF$RZ65 zXmypA;6_lrUsWxd@Wt6U(@;Pi1y%MOmJuk0|ACFSsECcIUVpok{JE7Q@*3ss_F_q0 z_)Wxo$!2kCV_qi4`sux=23743mFFc?zlN@uApuI-wSQQOytf2$#eD3U6kWfW6dfLI znfA{BV_IG~iRG1AC**DL%}oxJ;24BNuyZ0GVF3Q*0;q<k;Bf=3m0vyVl)waRZJYL6 zJzY|{XJ`-<MEAv^Hz30(2raL5XoXg!=c>nPuXddzm~#C<2CbBt+PsWnHs?#eh?Mqe zyB?o0b%<di9TyT|+M&ji<D8@;1!OH_im?6BQp;4Ek@;QVSpBnXM*`d-+=U;V!LeR! zaTz)Fg3!0CB4@U>eZ+Dya-xd+DFY^wEOa7X3^FG)OBv!<$0X+;RRvSl&fZW2Zy(-s z_+gWubFs&uGZ$nZ26+&i<NOjCH`af)ov%WPA#t*|EVC!@QD9&ShhYC+0Ee;hO}BA% z^8B7tnb;L<V~eMJ!v0M&e<^8ynE=^zt}w)V+0MvlS<^z>SGb3w|ETVQX!DGoN90;b zU2Q`IL(gDN;Yjl1q<!vnz~v<&JCxd}_fh?iGn(}4NqhrP(PSJ4^R;r6l6UHFw|22_ zn{#GT>MM|8EOBb7McOnm*o{3t4pDs@qkgZGkjcS;UJQk;%h@U|+lE0~ZW(Q&2v?mJ z`Ne4=Ws?PG>A2urf)wZq<CE9z{R@3YdTQcy^&-<OV^lV)&72YoT5vK-aCv%8v0rh} z(tyX0kaLR1^a@}5dH@QSE-JgaGG2BO-gKQMe(9kBHu}k-uHQLW9&b(dhb?+Orc1PW z6`-`y>AdkF-%LM7&hDl?BrR&yWGnS%ud&l!mh43V+cWyfM{jSHm)Z8_Se$1E*s?iF z3Ru$_dnC2BNpceAK3~0eU-}wTHt-1fg>nG{YwAspYLS-gX=>|%mB=OC3AVi&cn#H4 zU4L<-iYU=8bSe+y3wX0lm{iPe$Ijs0jTgn*Tb;Q;Xu25?7LAzWMwHlx6S*eTk-MhK zrM~<5#+JCF!;+pOr|?S7`g_HEYT`!lXUoQ_-zy1yEtlr9j2^%$h{Ag_yKtD2ZqD1! zrpGlRc1(JxqIjxF|2{~KK&?!8O!Cd>z)lTE_?HJiT$CD^PQK5I`twr}w~_i1vF$Ky zQbIhfFX(q7#M9Rd$?cXCYVUQzIs{jj8mlZ$DmA;OE~$v{Cg0^-<8+CCcQe<=FZJAZ zbZ5bn%gxU9i;#E$eClk2B`P$=t3Xz}?ijkSucpZAi<p`pwUbyMj>Ddac5t$Mth+;? zZh9I`G+g4B$4Ib$e#t6)adF{<(68K&vC%c^c|JG|v$vgCG^uXFgS~uw(nbH4pm}tC z$-TqL$&rJ}d9{5&1hAD}?tPI#&5RpzT2ri1^?iO8=a5;#fX)c}NJ+P71lD@Icsvbq zbtUY_U)r|pVRVgv)V1XDP7(4*KO`GbQaT+`<_U30Uk=bsK1y76gV+y)>Z`Lg>6`}m zwi3QK%{dd}@GjOGy5dSeK<xL!wKWossj{-NK3P{8%1lYQnKMWdjRpA}ZpI=h&I8&+ z{M^Q9)J&~2s=0y*PwhyHf=)J_7aP-Y>tj1R<uC40(io9DNY&aY<+`8tw2@jKZm|81 zaz2C9BqIiwmwwpD-ZA%b85*<WmygGMMEd3pmjM0F$%Uedwo}N7;lc(91T#G<vLvK> zog^O8)6b!e={UdDhzp7-)an12kz!nA*etED%577fu3`Q4`AcRwV<|qjEy5zhz2i#d zQ~%+n`{+JSv{erXY+m#KI6-Wi<=SR5&^D)z`Z_dc%}X7V#hmQ2z7xA+&8Dwg`^gN+ zU$Cf_Kcxu!Y3YQ~z){UbPNDcaqMM9DGB&`>ti%9`qS#yi^KTw_!`MbKkMKqYNxF0~ zk>;uduw8VV#AoLfMA>ON5^c(`OAA79mR@_3fj!$WPb-zb7Jtxp4#PDGYnB(?PQD4X zyqwC*-Sy!&j!Jv;Q0g1u_3SL>C8VD-k;uhqf%Ig4i&u^R2gbgr`=!N@+_uI{SFX)Q zCn{zgajuhVX^}>+&>Aj<Wp?p7fc_dw(m2_#k%5!D9vqOHC%o>RS(P92c0ls=R|V!! zV&~yWUip_2$S<UXm|_#$ni|8RJVgu$)s6XUrcZ{sFkh@acw5gZQ0wUvd(!rX3kPaA zBe-fes~#?XY2=@<!MAn9AvB|)y6t6=a8c|TIqrz~hF&9`KBa8M9`})P&4^NRj!u7Y zDkfimIpb`9l`ytW+s$c1kzzfb@v|vV*LUxv4da{Ag-y$hJTnr(4c(hSGZat6=UeEJ z{mG<7;B*hyiCdbi>wt4_&leXMzaz)!`qruJGXvO)703FQ9{TjjZ87;Nd&3HeZ7m*A z0UqAs<rzfddtAI{<D6~BQfryul^i0z54@2PrM?6k0h+bkE=K%8@hb()G4433B~SfA z1;Y)!AeG+nQ8>+FQa5Tb7uc#Li{>eF8WPtfq2TGr_}bw9f=v+`ccT-ft2gD|+4*fw zyXr7Q{ZuJO7&(ur$wBK4HhvB)vT9_(WF6zRplBMRSY&svR`0~(JsyyWvZK)3%5d$X z+L?)p@Ww_jGO<7?qk*TR;ALZzFV_6Lw8xQqRdIO715Me^3yq8XCMBsgkSv*U<|-)S z@z9IWD$k^&4g<LlOQIWkaOLD&tJEyOG&kz%#N@!pvzsoTs9M_$A)oJ=r>L_Cp8GMn zvNlCn#AYBag+dY>Zd@=3v@C1lWj5EA3EnWcUBl$i|I*sv$kLb1bybp&ChZU)N?Dp& z$}%fvI?BT%bj?MS7;N`0vs9Q9AIWc`08(aDo9kwXq-1K9c~;%Bab+rljz}#M%A6S9 z#%4uHogc`n(N;B(UwSmI{AweP$A^9TYeXFnvh+HL$I8`Lz(okUR<s&LVDGeikWeZ= zn72VnZD9{WXT7y5jr$>Y9a-T<;yiEofmdW;Sjomf+ljXnD$=*%)?5$oM=@=?a(`z? z&g7ohli4xms+{vS(muH1Kww%whd$aY$}m_);fWP^pqU7rXT=!O{~gFaSBc{m5fSma zxpE_SUGPo3cy4LQgd=?P&}G(XJXtl^5LJ>Sy!<H3=yrhmxi)|NDDLBEQ=QVqEm+pB z1|syU@L<zp`JIf#j9gbFo6e>cZ~H+<xFIih=dAND|1v{L;iGb~XQ<N)xxj`UT&p_k zG3ssOMCgoKF_F`iTX634Y6l2@f}(b2$-D%AvSIF;P#Y-UzsUF<XtSrkfTz%PU+y+3 ziHWt6=?<=Q#MIr;xKo;8KRp^+PbfQ;diCJNbu!;>Aeh#Fed`C^Gn$nH6MTJoGV3@z zd%xRDQ3W!w{uh{aI>Vx2=fiuIrEHc+_eZx~Jr_2u(|4*9e`M{)f_9Jib&p7%_Q%VR z?L7DFLZ2w9c`SVjIIHKI=abidB^1Pdx3f3n>`lBFj0;VuFq=BHG7(>wxt0Aq(Iulj zqcpGv4}*Dyp@r<ytj3c}?pExLOa+-@epN4ZYg0_<XVNS`LTTyXatf@<Ds|ifu$io= zY}Ph_<7!w!-L_Y)ZZ>l!U%d+8z0s@^+3~(mF;<2r4y@CQfN96#M;5WUY*yj139Gn^ zx1mDU<B1Glbi?f`<_h$?WSV=6O2&WfL|@4amr>tES^t*;eP*4DeZr?RZM)vL9+gRd zHZeh7x0mzq{p3@~(>{^qz15q`U6>z^hyetmBm5^>6OmU$By4>1=d)X}7;iYvOpOB( zDQRX-P5?aFEEM664YWA;ox8jH8T9r_X>Bn1@_j+uR=ig;023ZNeSw04a(3!{>mqXT zgE|!XPnAIU&UFBM<Wqm9Ott|UKRU&EGEs0~`hEHGEImD)3;j=k*!sDW;9V9L?!V0S z{EzMl|J&f*nPXIHv~-c5md|E_mz=j~JflO~B?O^lL}zcgS2P(_@MPp?B-(uZqkoS^ zD?v?0(p<b4d`md!gmjKL>A=4(tiN3%(tgh9NU8D3;P+Si#ERiTtDEKL&Pg&z;=g3G zf+4>cJQMG)SW<j&6iaCqABGx^3W)hw%l@Q}R%7|a--vw0&~SKdc|Q#;q}&9yP*2j( z(H)pfuFDly;uliE_pqH&eS$ZR;G5p%=4N0@`q8j~st-q3)YT}8s>#W3XW{$67mB3g z%%S@WU%Kf!tlL0Jt2G<LItlMMH<k*MCo_x6BFxI8A~hx2CWm^&B9h~}zxP|r<;}G- zYNONU<S<<$6gr)oWKWdRPL&kP(%1F-dORld3?`j+ASJs8p`S?k)a_quNwVmui5?W> zd=OqQshk&@sUS^=fTF$G4V7=PmTRwKjNbYH%2u=4vqF-L+MQONs5pF3#DErCSMxUM z=uPY#v_Ci7%}41=DoNL%LgvKPcC;$2-Nh+1F`q4&cc|*a$QB3b__}t&VJSV`L18*d z*j9i22oAr~*K&%Pku3VixHy?(?a`IYqE=9ODWe0uO-+tXvBWgv_rpy-&zgtTVJlIM zy=xTOlG3jE%%h?x^TgLH_8)$YU@JicG(70ZW(wtZ7ysLu@s<Ua<hEu2Legt>E@K&m zr-OS7R?O6}8V*J6@rXyJt;>*5@0n@$4$Q=%F^fE1wJ{)_aa!<N!}R2|06OM(ok)ci z%N+K??u=>xUOwy@Ep+>{+d}{*z+h&ydCp(?QRMbj2RD<y6u<U9>0}*=-TUduvn%{a z7IH0YFf2Y2gyOgS5~|(x2ni6gx7}(~X0<pzHVE)}s>Q^_PZr(3@kAN9ZnJxEP9dX9 z7G%io#w4FqG^uEvY)NIqCw7zlC`>?Mf=2`@kl3<5?!4EJ?M;HivuiT!z@4<G@pA4= zh-7=QT5)T&Mgf>a-r#jTgC*GQUHC-l%zg|kPkSXnEA5_5$0j{d>d8hg75gz>{pDiJ zD)LuyDi;s#qRk_+=I6$=(h8g1Oj9q#YzgR{Ve_3{arGfl8^rWgTVe+(B>>koZm*II zMBZjIP9XGrx-UglUeBJdsB?BjO+F;HJbGozteu}Q$aB^`(i3Ydxxf{Ws-yVJw48sB zE2R4<7#^-^7jLCG^zw!A{WqI2hmf=Ww%CQB662v-sxtL>zUgJk<ySZj5u0BI_1>=+ z1gwP+vsMo-J@x(46Yf9V!_)`DHE8Qm^+--~-NbYoLnJ2lpuCzkfzgyBza+F+lnC-0 zPe3i5q~C!BV5*UQ0rjPuf8d@HQ}Dw}ElsM|mCWqFuaZHiRhit`Db8ol_)<nQENknb zDMWcfMa{5ISx%EzMYjqa&$h~l-W2jNF1|~k4sFYU-_r<B)RM1t^2q8f3C<7)a?J7j zt$rP38UwV#v<_Iy0K#BG#?iyxy!zOluc$~p?>tgWr2BAhQpZ@@Y30?M5Q#r%?c*xS z&MB6GTRs}4n~q{@(P6CHEuQ$ATi<i`K*v`_?*r$$2GZEq%HF>$4>s%*I4Dy$L}a!` zRoW48xV%{Weg=3s6DOTFi`<u1xz8U~#q*uxqpXE3-wDfmns;3hR^<=tXWAk%>dZwQ z638DBf*rrzm&n2|<rKs&d2yk-<wSfViz#5OGx%nzPx_Y$S`6-n^#mHdai-&D@i3q8 z_;j1%l24D`WwbxP;;-H6OHRdtFORUO+<%|-45H2)g;qsl5PvplRBEu$KD-S2w%xjl zBvf3=uwKbjv}9k~BC;=MM(SPqL!e`we_--yT;;b9PCG02|LpR!Qtqr-n#u$oj=xvd zVZAK~K9y~hRO$KThoW08C5<MseGik_E~-*nLiR>c1;H$<Wff`ZESNURqrbnyBJ^Dh zs}3s;4P2JwgYF1aLGd$*ohHB~W4u_IPHSNag-z>}i((J7uXH64H;&wRyBRZHk~X87 z$Ac1@=?_->w>Jai(lt2PMIKZc1l>!ru66gRw#AI~6ZhzQMs&1zcrM*jF!VyoHzkF< zxw*DoV3MR=v#o`ny|81u-i}|L<@>45Uoz`23uEaCaNRMZ_0Uc|Yj2aznN8u1`?k<0 ziiDgfVu&<tKF5=N^XMG8Lr|3s`Ux?_7DJvj9gXL#psE`So2Q7e>cvtFIuE@(L#biw zBg}zVl8v=<$gqxM_OZ6aNlR*^ZG~^=nwsL*D*KA;_Zgu%{CmTYM{kR#(_+1keAyPR zZGpO|VOs_s3K&wY?#{xgVk6&h4|qqv@eeE3TJ!%3*sS!4c{FyDF%wS5u+R{a6X%n} z*M<ff5)%4!ZKq7&b-o|wchoN05cIhCu1CWfi$P)Vp~B!pnGw5B%Zs-xcI_P<hFGW+ zD0IULb8FI_rOzIBdL;3&flW3uNADA=8L@nwQ;Uds+1y3B2q(oQFl|{md|~?xrA32o z&V`@e(j}%gNuGl@dPu1HBVRCL((3%6d^R~!lAZgnoQ1+m^sZYqoa89MQ*1sv#qEM2 zM4dtM^vH4s#{BG-eFt>)cVbFREJd5+W+S8SH57`e$v*<VOb_G4R-b(>$K!m10=1vQ zB2;D$c~>-i6Y6&>cOYOD%q+3g!db~geZ9Rdv|R64G(5;4Ju~+EP0&pc4{GdA23w;; zi}UF+vN3RC>9df#Xbo23SvDssuNR*d<wQ`Yyt*nUu--T4$hc7oJ0;DcnV0x5Dk)xx z7f8e3flh~!+Y^z*=l-_r3SGz<Z@?)!=||}SM3;L#f;TFH*;IE!jFg+@6L`MI;KO}& zV=Q|A=7Vj=tyCkDkCF_z%={IJoTHMDiE`U(h`+dQW1b4_a~w-LXnsmiY)yNlg|q#+ z`v@5yrp&0sci#KKNkhQ_O)pg*xT!qHIH?#ntyo>|yP-zWGUjyUqP^#oz>V&4@aQCk zzfGI={9R#i+wes5NB~A?)edmjL7GTGL;3_y?m-r6fWreZyuhH^7w_GP8G3L|PsPOv z9`=0rL~C&1dEphebo<&mr@#DO#_B_Qe@fSLyn;9k5jmQL#jOb9Fv3MX?Bvb|0sARx z#AK`-QDEkR_4NF-KvL=_a!S;pI}8pE@>L|Us@lI#3qj1y)`DmD@qwTy$Z>n{m)8d= z`YmE@;&N?IwOToQ+*-Zqck5Q^&o5$=`xWL|YxnT;m`LmlJ5s&|57@Q%plR#f@0eF? z=JO1UjFcTjW;2!RVExX*>k;~|5-ApkS=7ri%kzyen9|+NW*Yp;q;P^8b-Tk4tZqCF z(^V#&7Th8W{rFCHvdi2)Rof68WF+UuVZ>QUl1@~nJXusEc8-0uPS_rKB_t~Fu_x4- zK1h}=eGiR^4vL07%C#id^K=*;(EA1FEttPP=@dB_CG1sIhR@qbi=@RKA${fc(32!A zy~Y%$wAjn1{5Ay8`6{pK5wlE_qUPCGJ!$wj5onvwSmg~_A4W&E9rjVP4|2UyoBRNj zyZ?j)?*R<6_zmx}X2tttHzp0Uqi^;<9u}tMTGdkt*Cnt1+U|>BEBkel3<gbw`J$4) zvJC8o6;}qnNetttFd|R@o*?L&z;hyPl<hlvV^YT=%xj_@FgX@Z7M><aD$^N!{A#bJ zY)h3i;wRl5tg8OYBZ3eq#Fm=D*DT$IeA)xqA;h&}u_dg6Pc}dM_2P+Wn8DEU6MnxP zSXJSNz3iFr!I=dU(wabOELy=mqD76^VrqID47(|%--%J#-~L+jL`<91hDeg^{Pw&8 z1OE?Bj(wiwyl#dkbBtQtWm_E7R9~<U>LbHb`Wr7si}P~+BwJWV#*qEV|NK8_@bBl~ zxC9^4laY`t!xvr6o5vgi0(ok`QaK_--C9~&;s!uFO}Ace-@YB8q_Xb;<LGyGc2?Ui z-aDQ1U^`qJFh1Fuv;hA0c%n}4vQ^$=5NMPb_}(MLty!s}r>21HA^swVK~3T0{R!N` zn&qI}tlySfY3%Hb4}N|So~xq2=+bma_LCfrtlAd%;Gxf6$L8_DXtCFmHo)D{zV6sg zcm;UafZ*rh!P|X`+cbEx4r|T!V&9J+&*-9LT7GAjLUQHjZs8d#7Q1q|HDb?GoHOrI zRvJSb*=VSShcdE%OVyeho<(iX{lA||UA~*yiYXXg>a9eU)4%>2zqk`J>hb1H0RJkv zFTXOg!gPOm4?gB`THw{~_N=#++G#S|8E@`&oKNxuyP<_DZKH%;CY|08h9iOLNOhhC z2=9y3qFQYl^<o5%ghiwx>XhPB2ZAyW-*ucgMe#h6>M7q*e5tRr7QBu-{_?NC5La7l znD2-&btwOcn)BfeA`|89L=m-KzHWO?nPwij`0zn->?h<@nA_l?a4Iw?>u}AZ5f#Cw z{Ay>SG_z5JLcr3Jd$}ue%3WRAHcgj{Q$K7=Gq(6@b~qOdmfud)Cv{_-*Su|by*86r zEP7?z=(RiG2JEV}@&rksA|fCR+AcMB3Z0wE9j;_w6A3pQkJeYO?_9w|>v)wYT;D`2 z+^aKdjg9!8bk#9FzE;kw<k4ptos-hd8JemHg{_&W85@HJ)_cBd%eh?ynNoSdA^FUI z1YKQO-hLX|-wzQv=RIGCBM;=e*$wNj!IT=4#=G?UBZ|Sj#Q~qtSu=y_Am+QZ)Z4?* zYpwGdds#4V_HhW9*Q<hic@<_afddDm;~p5mN{w?n2<Slo&8N=Criz{)^nfelPlBe0 zzh}O-eX4s8V@Hisg$R1I9%@>+tCAohTuB|xnLPxrt+P`k)AylipkAo~w>hK%Vv!&R z&i35MKVN>59G~~f_JuBol3?D(69j~2L0bh8`+4<Yo<oI1)42#YCIL<b--Wkz$gQy| z#3VUDNT$6S0=$`?vm>b{KKQZT!2=7unJZp~rmO4$w%cc-qL#RN3t}}ipvL}MH?=(I zHKVkWO>Xv8AG}`_3W?<R5D=1%EH0E-iv)9doH&(O_6|C!>ggY&vwjJNnM+5@GDgR$ z=7!LZ%IX!pR>=*?Ovtpm*^bwrO)Q-Eq?2ZhCOw}#v6|MGg>5@5p&i3HpvO91J5Nn2 zt=`FLOqeF0gp3gbGDOe2jy$GtbzX53bOBO&s@RI4jl+lYUU5x&H*GY$pvg6-8soJt zhtpX7p0Pq47?UWe!geJ%-urZexlZ#4&ZVu^aL!@z?Z)kZQd1S%dHc#z?Qo>L_WoCy z8;;wnC>5<63(1@49I}@C+(08EqouvYws>KW6Tyq;l@}*+^W;LV0E)|rF8hur>R(vl zaFcG=$K!{=`d3tBWMsS3gkCON8Y=p!ILV&evHQj{;D)C5weM<-x-+o78jcuZFcJd7 znZfxh&+8giO;zn;o;@#s@O^l9KR<6JfPeVhLxca?8Ug}34Fo>I2+uz5{nNwb)4i;s zBG#^O3Uy5cgoQH4tF!%)(NP9u+bK63ePR+4PA;xbK|yGv@LH@)czAfZuNlp)tX^X- zR2-5wa&dD5U0wOEudj*7$le(K1ONyKB;4HG)SpaQnp;??JY1+qIBaN}nwrvqTQc~; z=ibG(08SpB>|VGMq3Y@C>cZP_fQLrmsTpc7e1<JPOqhegV9;Pvd_1RV9(>0a!B+FI zf*St$Kk3Oock|Ui-F0&?TjLiCc+KWZBe*$^or$w#4e&#T7q~W6Z$E&4{;$dC4*9ie zyJG&R1w6XO0hb9Lz2X-R1cW_bUZ;(bpK|C7A!3M@MZcHiJl7U$QJDZs^%hara|0GN zoJ@_3jQl1(g(pDrWMpKx-JHW5+OT*Z82AhidT?+603YFpcR46-_5xH@RihYGvrT$G zF)(5wAV3Th<mFA^fhu)fr#E`;>sgqXn3<K8Zw!5C?!RLb7Z;D`wp5eNid=vXP_>o3 zy!^@srlRgqb^T;&>97a-KjF{pm)e84xVRqZ!G+k@o4c8Map7*Mf6tU*#a#L=TuBz} zSF|4R5rikef02(b{2g0!;y(-X|E4p4<l$h4nZY)_bG>=B%w%fA;^f6}J5C^)LPNBE zsa$1!{USv~AVJ=8;0ijI2zB|Il^Fn+xas+9sj-Zwr-<ViJP^|rsnU@Dtoj>k<Q|ZV znp!>QkZmjrw#Mm&JEE9)wcD+FK6tSUTp8ByAEz*r>lN*GX{=<`HuW+FoEQAb1z<WI zj4uj?L(`LaZ&<q7&xS`S-8hMyuZj+?JQ>bEAK=~TgL>)o7NGI~TMEaYJ=S?n&;^zr zjR*--f>xG;vP(<%L%p+=P}u*qvF1qs$$ONZr_e2MHYFr1+|&`;1PyQ69}Y>v)Vt|R zi9NVD^X~K3K0Ow?%~NT4?`YQ#AtLK}*?BmFGq&0X6^>QU3ytT7oy^P*Cs(b@{4(EP zbB;s8XU>MkLUvtQrR^=Jj&b3gssVXTiJnWl0ikj-bVzaZx0arY^<0hzSa2iWBWcdP ze;;lEP1fX8rsG1CQd3jdiu<P6=29$Er&B8DrxIoJh;l<rFOE9P$6Oc`Qd6cPWTlQD z!pAt%l4G+k@le$1cBm({3yQ5*OK&4ttCF_xww4cWgtrEfa9rRgm(@hPPcdp-uJO(_ zvp9#NULV7Mw{d~2nr{5MLm#$!>+X%+<k-0;s+Dv<XWR!7{!%(o9?sG%jE|3~S7FF1 zwbSa9W;DGIppK3RQL^dh5{6GVzBc$M%wJ!Y`^D0@t(TIXbt)AmqV4(xQ$ccLPE9t) z8W>V*wqNqI<*<+Q(3M-KL~l4W^$zjsDV)cyewq?V;Q58JK1#}8Q@xWpC4Zff9p&w1 zj61iCexG1O61VYFHm&rD^+4OSSB!mDr0jXF)oiV3{Neh{R2<h}lkj1_NBMCbbme7M zB(>;t3iwiPz1~w%D2@E5SpKi}zC5bQb6=NTm-V!Y?6dc-6cMl$wam&OGKAP#3m5?l zC_)0*!w?z56d*tnP}zmmt%5Qn5Fpu>N#;VB!Vpv}7y?9y#6l(mBoPRSCJ@L#xL-VH z@3Z$=y}kFIweEi>|GZiG-r>tTJkRg<d*1K;LP-AnV*bBGG-T{%cx~n-x+NG^%vi{# zzYXxXy?^z`P=)YLi#Iug&GLL(ybG$#L@bE-HT$I040-Oe6$=J8GWR&N&#Ssao8sK_ zsy9Z*Z6QlyXZ8cA6Zgt?a@->81UO=AX}PrY&YFLK;|{&5l!GVj^p}MiVUD|I>8U5^ z1n@a%;Z+Ts<3PfjDV0i5l!fM6d;j9c?_t-YV?>ve`|eI;w3I{nM@H!BA*^=R1<M>d zANq(VuEm!D81On@cz$zJ{7cxyrU=CAo$ERJb2rc3`m+O&80`H6RiFIHXB!|cgUd$+ zz-|8LMR%Ei{<0|usohR3*TX#oU<C&7!zUk{T^}lR@bmN2<M*>?e_jPj<I8{e;fG-B zasc|QK73CWv6B@K1Omav))qWHJ^1_I0a)|&&6^u)jYhGM(4ogi035F(si<q#<!J!+ z0h_yzj_5W!kc-bgx&k1N*V_jF8bU)u11DwF@ZX{IDge2V`oJ(Kl)13b{1mv^$1zjP zA|U<W@!78fmy1lfr_jjastZu?HTE=GDS;$S%G@!k=iXjFGWFHT?z8_J)n1UKV=$fo z2m`EWVrm)`1604K1K`tp_wE7gcM*YTyKT@2aBK{aZA3MdoF*&}i4{#&HZ?VU`#!U* zZ)6AYjkmX=imyEZ9EDM1@FCFICyxPjQsfgh3V~7HSr-?VO2?Rs4VNl^oYk`?>)Erf zff<uFcO^tvkB^vm@!~STmrbY6m3;6N4^TldX89P<fA5jK>-6c<4{X}|KM#q-W<+4# zT@dVlKUjcsGyCGj(Ja6wu(xS!&s$wvYr}q2U4OsP40yHz7`g`upS^~8#vca$ktZ-~ zl7ao?KsWtY^WmSn`|{M!&J_=+7DA7_zGDHd_EWeFRNXtj4g^=7?}<%!u4EBZq+wT* zED2)e8|arUV<qnJm{uc>#JDzO+BlcQAn`oI3-vQ+T2^ERSzS{+B==r*%C&83bFlh7 z?7H#PB>othCA7)gN{@${25Cgb-oyzME6<_aZA-Lf1g`GjqmdEwo%T?YNu~A^IlWCa z#!6ejwb4hRx-*fI!?a@RyEaMN4ZyHS$#zS<9!1oW>$B6Cy1PW48n95)QNY<5+^R;S zp=O_yTj9<Ex=)<HZgDL^F<;d<EbN&G3Rtcj3uqK0k&Z2$r^%v?=#{p5&z)yZCcZ8V z?Gn>OriJ0Kn5&0P;UW=u*aHRAv}l<@4r}@rRiEa34&Ge=$E0ICYXfwCxdU-|-zb1) zH}EP|se^d)oiTDbp-R5?S^e$(D?fe|xiBd8(a0!}M_QO$eXl7qXROy0yg+y-N4k~N zW=o%E#d0xGyb4cO8w8@qP0sn&3|L6^7Jf+N=*d{3_B+R$^IPIAp*Vo3zO%A$N%L$y zE-uiz|GxdLy{MM|Ad2d2_`k)eH(nM6I}$EhAM;)6CYM%?tuTYknxelh)(^&*OI+x? zzRIm8*AFT>@d19wrm5}#tV`a|k4{0K00uck6z4q$eyi?}0D!@ga>9ZlYl*8;HB33l zo(}=8L&Le0C*dCmAXfM8F&(`E-E3|GO-EyLq8jQ?-(!|Om?4Y%gRPHQ`6b^Kn*q}d zj}K8Sibi}@Q;_RaZLL<@dLir9eql+4%5hB;+T^v>GSqn+;v$U11;uM_EX)#2+40C_ zJfr4cr^^&{dDep0Lc^#YE0*UrNH7>G5V0Cd40|oScOfeP;Q!0U3}%sad9bxZW1vYu zbNLXgsV)#0KHnuR+i7IL6*{81R1|FOCMU1Y_l}eSTc7I60!0`#>!oxzsdrc61GpZF zNmQTkhX*PZDH-unZ}`ejzpN7HrHw5Pkks)>=x9Y~!sENTWecV(&O7Bxzsib=inEyQ z6yT|sog%NxZPcArn|(&+ljB~>PFU*CgR~4HZ4|Udmf0!zNt0buYiZ+?(RDKK`GL)S z+3N3SUPiESD$)){DkWs3{VOlNNWvw^Fv)on9hS^?5{bb>qXyWVbbxJP*ZxKqb+xri zSe0&OkEw#$u@3P%4Y23(VTaP<DxH{AHY*Q_q-*!Sy74D`YhY9Qx5YA;3H`!*g20>_ z;tL=pfA^a;@%DPZSzU4>)pzhuqxk=EI)2@^`v2f`{JPin&#?RJ=J~IeoP%M`AD(m_ z$vnDys;rFAPCu5n39dU&0<iri<mJz<iWu$J>cSJd*Ua3Bw^IG|W`ccql7~M1JN6qt zAvh$rzLQ_=Sf=kLZLN@6e+M|B2C#VEZlwbpxKMa)4*)|3{V#`h1(5ZZ-Oj`0J{+Na z@@|-)KBK+aKUzGIM~)o^mz3{Hjpy-}lr#Ko{_Z#?@U^~0*ay?)o!3(IZtUMZwQ!7p zZj$i$+7e))04;=L65g9Mupe7h`XVW}{`-CNKPCU)eC*$xcP})i)G`bD>hbWEYF7sm zY}hqwcXsC<h*(~ua7-4cHzFplj8u%dWuEeoMpn0HD`qL%pLej`Hrm50vK8)%`e7X$ zm_)A^gB9)I)7ooN)p9-@R)-IaPx9B;g@?|PZSQ!*4lRYR^LtODBhKP*Y$;uSVZF&i zR_Kc3ZIWolYMi)`jf*bG9qFk-_r)k~>FTiGN(U2C+e7{UOqH`8@jQ(;G>wi}kMnoQ z7v{TlC&Le}vrDmSIxjx#7xh6eFis$dFA=5NuhSMO7mh?knuAYO#FM|-^%~93Z#qF~ z8axRx?z7T|5~|^{o!(kCC6t;PbtVb(1v?W&lyy+-rc5SzhNg<`x3sOh<%(^!h8+DJ zT$GU+lge0-<Yd~?&Sh?L2>X;*N)N=o0x8ngCdQp`wey-6v@OQkrB@~Bu2k7fsfS0! zy*uI<-jGJ|OVf^#WCElR#pq@cRwLP%J%eeCAuywMhxY8Dp{g_+LSDB^wuZB3X;`WI z_BEE$_7WTpKcsABEHzS<Z;Cc1tMDoaYWZbD=Xgj1k~gHKsc9<kK3Dtcq3rO`onLf` zgL$a~{?aJf<8#X7p_6w!JeZWXM9-HV809N`No{dQ0Aq1FJ=1=2c5YBESwVLcC?xGY z6nJWgyEvmE;T<S+H%qnL7Mgq)J<hwgva&iU=H;Z6j`DXeU$qafXrInrk%Uzf%h_Fd z*X2EMi?9+#qPw$7Jhgj5F~Ex5twQ~T%5WD?(cvsGF5Jerk&MhxQW41kb0e<os}56( z?X*{T&dBLTXk~P(HtP&;#B#rfxJIWf${$T$q0f)I;^a{Y<a9ywa1P5$$)Z|tHDkHr zj99^J`F!T;O@88bCkLDyA+npV7|(3;8s^uxSU^;s%J1abH<J@)rBQ3El1t)6wERWo z(&0B#z2y)_^LSM9fzL<xp`wK)?dh4BvF|{@r~<8|=sR$MhdSjC%mVwVw?f;DIOvcy zU5qP<+9!Xe6IhPUj|g<0Z{Iv|=JZ;xu{P?kDX23T!4ru^(sPb5q3aRIchw0sPtbNi zJZ49tGOi|r??<iE$+1)6D`#0%H7ypC?X|M+d<>D~#Gesyz9l$m>osKL0MBtxLs_7e zueu8{DlHqp$M|}m|Ii3T7@6PBD&Px3$}iSij?WIppw%LK-w>!{)|;8ce)0Z!$Nr;` z0e0YF$<!_-7fJ*v^7GMMF>se~6t{e@-RKIN{FzZ=C1(8bQUa1uz_seLr!{A^bk+4# zds|$qEHo;rago-TZZ))%JxEC%c?rEg<zc0&r%H)wB4kVcNhoiwT27r(Jq4K}Q*7hb zsbHG{Xo;m=9~bY^f~(tU+lLP<xrK#xwT*zdcMjDF5ooky+4k(t{E+wtVGs}hxuhuA zNHU4{&rSZ&oUw{F2R6>cFW_6B|7Fmf`J&IGN=gBHOsICow<Ne$ObSX}z@F{FWDj)N zK$X?=^|kYzIT@KsR?HJ@LRajRoa2~zv}$DIF@^DPmL^-_m)mLBWXu$SGj|$C1sRDT z;!dMdvA4^<-bDJft%=s~`Es0&ml!!Lh`#K0f7~2aIi)FTK+p)SgULy0H&D91a_9*L zzLS@zoo$eyKZ{$7APy$E5!S1=V&6vJ+$tRZ2(UdhO(N}j{5MH)$^JPSCLdgJ09+N0 zR+oxAkh>F7PD!-1bI*L=cgg155o-W!YW5DEiAF_+FAN-lf9IX%jEb2f)FGZcO`r53 zpi#od(tMSe+G!hy#g8^6K;Uri!)Mm%yRST5xpzDmog&D}vb)o$Dg=dfYB6@T45vL| zBu+e}^2*4k%w&r;jkec_E+Ay7GEJHL9qPm49{3c2nBD*q?umRZHCE5MR&&zjx83G? zIX$@uT<?jMPp22bdCm?JZmE37aD_{87@s8)KcO?ZxVpCLJwT{wJaaSlg12TRmC?VZ z$&Oy3{Ke`1FdNkf-VE(uWruRF;Oji5@=3J(edcuV1`nT66TUJK13k08!nk4<9y;{X zI*bywT5^QWX;o`_R$3vB+N`TO9`9fya;!+=89Y@6y&Ai-dOQwT12^XH*A$KgN&^ln zlNi(|b(`&***ApI-+P!&s9dXzgcg}*le6V^VoxgEVxh{oq}wjEbQ9!yJoJ8`%4t6R zP4Jf*W=Q)9L%Yxyb2Z<$WvoQ}bW|8+7>8v;8Sb;>=9A%0CGDc~^9o80Fcp&fn>D&t zn5S#T%JW}%!`ZJN-}0RCz<nR?%l@%El>EpAX*}(hu)yp~i0mCn`2xF#=I7vv+mlZ# zgW|+h3HSyVU+;`m9Y);Ae8{BsnZX<R=>RfV+<kkziKrT#p_aAyerPcT>hsEBX(q7V zrAXKt*H<CTK{Vt{a@MKQriQSZ13qIP@6t86?mpM*BVQ*FAif1HvMdqZ3gH?K&OXiK zREsQ+A<W`PockiRW&T|7$&;6=we3ny`fAQ_+c8A8^G^Pb8$svECRt+VwG=2>HF>iU zcn3(MxUn0EBJojAcE37^Yw>lLcO*A?nBDK`>$BV!;Y0DPNT({kZfVDUDPj$ic?XZ6 zKg;)x?e44JjK0n6OkbxRO|V59;Y!P9bLpmv#DxWR5Q(~hr<)L~J2r4jYcg3t;6=7w z<8%#+^O9G6#C@(wX)8^lNxip(w-_9Pp<Q2H)R!SR+whVqUXqKrV2zn;U73IgfTo#i zQpQv>sdBB)`7k!2bkB~7r+Y=6o1t3;2zmy-lt0>ZwWV=4viXFG*8=H@r6HnmwX&N( zOAJ&86#6HFr|afq?tl?%^woBn^FAa0h$DU7J=G5qY$pabA=3lfHZFZNONxDD6~rhO zl?NGk<yj&$Gj!{(KWQXwqWUd3WfEE4k04m?3Rp*Mw7<gm7kslUWu%_zfp~=0psJy0 zsan~b?ppm$SAcUSC2(ZHJ!;;?;AV6}cy45}QFRA$)$9mAw2*n9(t=vn)S$Z(WV|C1 zP{p3&r0H8+bQ+&8^I`bOuDeEwSEbpjqm>?Bif4ARiG_U@Qx6N+U5gKeD~VD@k!GaK zTf;{T>t37%eBmr`b)!q<SYU2qRIkOwKz{iJ<k|`N@5@RK7&W%H9RoBX0AZS~>IE?0 zXXhf->QZOMRLRd~aS1l{?$<yz4HdA+r5h1vDY@e*{D*z^{c7}B2)3gz(=ol`Q(JgS zVp=42Shz(UaWYia%U*_AV)q64JJ$Dr+Tv(_cD{}k@!@E9clX&D)~W1w5%F1t#miJL zGeo^5Lj*`t1G5&-A5v+Rht?6hw;^)y3$_WO)L5I3We{O?S+>JQ+)^S@LteigzTm!4 z63j$BlHJoj>~I(_f$@370=}Zh&d$!a*~-FwZZqwm(vbMBNN@z(TP^67w!$=*dqKUf zyIX&O1~w~WB4smu>!ak8k>+RtW=nAQuJAgaHW_mi>u}(NRXwH0ElSASxKcU*9Uw<b z{o)eL>960Ke&lx^30W;YVuKHGP;-FR?;_u7i-6;Xfv1Fq85lQKm7PsUY)DD`?!yhG zVFN*w-WK+ty})v1vP6oLu!kK?L%?NE+6yH7&f^+2oBVI%y|!4zCz<CVVXLJFl(FMQ z<3Z9q=fR>gjb*xxb#_fY(l|!yw>htSx?iO$*rYTJ+V9J>xD*aN|G`J*U&fw4Tykk+ zeHw=_3>~_WDw@v1kGs`^*6n<gcZrFZpX~009gJn%TD7R?l>6t`r1gUOy`s2nZrxER zb<l(#H#`oKuqqp{GXnkOP~4Vx$_|8d8iGT5Ek1>a2{JKT_Qt%#WF?GMV>djg*e-Ao z5^BTar0jCU@Z8HDet8~S<<M`LyuD|*1|4#!M@Cbghj!&)XSpw`YCO<PJ_asL4p<1o z340Mn(fszF(9kf#^hWIXG_@}GOPn3Wibf&%rw5@z+WAzFFx)6ML-Aub@OPxOjqay$ z2PBL!fUBtmdqY{|FV^d$+`2o!bIy(H4I*IVrson$e@3iuJ3aEnJx0k{2$`rg_fa)v z6x~(dM{q{LXE*~d%@BUb65aVhvamD03l5(!+@y8tBwTLQUQ}jdOExOgVxh#Ltu6Lj z#S@8F!b1UzqwHP!(+B{sLnPf^r${yO2A?Wn_c;uEm-g;O#m@2bT=}ppYwisnadTmp zbedvi#;G(k?Ondiz0KKr;Y#jaKQh>|HYvY?65&KoB<vxp!4HjNrjE6Ay-^1iNx3E7 zM#pPxSfXhtAqdp%!A2Q1B+Owc_37$a%@Nfof|BqpdbI^RPez6uJV?baNuJAl=v{w3 zzQP`~8=Nqs<OvaRK8{zh#jc<$0qt;R*V!$*=GZNq-8_?jA9|>bHbA5;PG0LjQ`{O> zrd-t}W~ZFbEQihxuRd&rYNwgC1=Bs*%T@F=C^8a|9`4(r3z@9p&vyk6h@1@vcZBY8 za`MCuUl)txvIshERacz&VVQ_mp6u0?lg6zu*-y@86F6?JZr#Z9XCxd_I;Ya5xRtTk zx8FG_jJVm7MBl7WQzp$<^3*Y*omuijeXGAL=e|lBa^Ox0B@5f<%(GIWln1(n(=Pn! z5HZ!yVCF?R@i<Lt2knvtTS(pWuxGI+Hf<qL{&eCz7Y`dby44oxViL^jwr!CTs&Ilm z^ORKR#Qv+o2b+*I$j<eHiR=fwc=*-!5r_R@C2}HSKKqd!9nS#S7<iJFfB@EOEx{3p zTBmNm6-*LAP?!FpyMWh7!W`8cmQEfk?wID>ri$hZamz?{<ny5`y8*h<lC3`!+>Ocl zE7-fZe3r!`3|M-jHkO^L4hkDIRFaH%KmtsWtlb)$sHSfZ^*_I7HgTRbc(VB58TgYf z;YyMnd`o%WcLm3pnQQO@avHk{_QNErqF7<ytGa<Wh*HYAzh_R}-Oa~oSgr0`b{HTN zESQt2*OF6+)izO-uK@Mjz~C>({;#6sXw~JOu&Kw7&lMCD0NU(FSM>FKeEOe+Wc>2! zp|!X5VQnInn8YX#iKtBI7(N3?0n_@-fBpT)&U&&Fptb8|W>-KlId1ZJXia}$&QZPS z?4=bLH8wPy2x_=QE3*o!283jT$Js7`767O=u#CAY*(>#Uz3R+ju^`g3yo_zVrVVUX zst>l-$Nvp(eg(+R|0pHH%mwrx{&@0lqJhE3C~Neij*gM&S2e?n!{+^Z{n?=Z_x77d zp4K)1ymj*q@%>JNo5<hPoSG?@BZEQm;NIk&2x5-(#y7}}b`sJ%N2+6TIA>LAAAWIH z#+s3QV`e5gEJ2i~<YB0TcE>^Q15@7_1BYhxIC!w~PBJcyfFgBjTw*8+wGgR`pmuIH z-L<6syMkQrDCS{y1ci!Cbn>)~2P<aH>6p8|8)38dm$n_ld>6cGVo0*-De__FFUohe z!%MX$GR>6<U+VzS1NdQZ4UsWLYaJV#Brr?s`*8A&KQg}7z7J4M0Oe=5-)&$hCoM?2 zu?9eWnM|DO@tt6l2gMJbZi8c%$BKJnhqSPwH-NZnkn#~a@(`yDmsi#X{?tzlA9Qq@ zyBj>_gw0tBT^lTG2nbmBIbNId{@$L(+iw^bY2|~VyKOshlF%Bo_)<WipZ~5YP!S;W z-7au&0B^Q=_OJVh_=EN!q`#Nwi+blX{`761<8#X!68wV+pRq>9g!A8eOVV3A!7!iB zXIoQtZaL-SegCetGNH{@yIs|RY;R_RH&FfK<C3R;b~py6v)Te0H_0GMPpWhIMd32| zSksBP>O8b4WGi+JMWQ{pc-%X;7sOWLXR|fcWY#TU<bkLhtb$!cWRoIwTQhfc;~mke zJWs{<#iG3Vt~1<wzonTPq{I!L0#1H*h-K%g7unR99F3W3(N+3F-+8b12tPg!qy}FU z{lg}f@fXOaz$^ET>faIYe~MoXuf2^~ec9xetL>lA->LEByQOg_VBJB|B!C<UNOpQL z4baxo&GpT20HMvg{33xsu&2En0m=dzrir<^e_mc5AlcREYdH5E@C`USp7bgLZRZp_ z*>73=P{hssYp}Jjz%=POu*P$D)*{8ve)!{mtlOYQe?MT0M^e9_pzLBjME+?!k6w83 yZyM*SEl{UHmMQT)wES0r_BU73Z(daI{;n<?@iHuHU$DLb-wXa<w|{m0_WuHUCdu;v literal 48832 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 diff --git a/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md b/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md index 2c8fcaf66c1..9f3072a7657 100644 --- a/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md +++ b/docs/manual/docs/administrator-guide/configuring-the-catalog/user-interface-configuration.md @@ -60,22 +60,23 @@ To add a new configuration, such as for a sub-portal (see [Portal configuration] - **Search application**: Select this check box to determine whether the search application is visible in the top toolbar. If not set, no link is shown. - **Application URL**: Define the URL for the search application. In the majority of cases this can be left as the default. - **Number of records per page**: Define the options to determine the number of records shown per page of results, and the default. -- **Type of facet**: Define the set of search facets should be visible in the search page. The default is `details` but `manager` can be used to show the facets more normally used on the editor page. -- **Default search**: Define a default filter for the search. +- **Facet configuration**: See [Configuring faceted search](../../customizing-application/configuring-faceted-search.md)). The configuration are defined using JSON following Elasticsearch API (See <https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html>. ![](img/ui-settings-searchpage.png) -- **Facet field to display using tabs**: This option creates a tab for each configured facet above the search results. This can be used to further narrow down the search results. The list of facet names can be found at <https://github.com/geonetwork/core-geonetwork/blob/master/web/src/main/webapp/WEB-INF/config-summary.xml#L82>. For example, to include the Topic Category filter above the search results, the administrator would add `topicCat` as the facet field to display. -- **List of facets**: This can be used to restrict the facets available for searching. For example, adding `topicCat` to this list would restrict the search options to `Topic Category` only. This can be useful for restricting the search options in a sub-portal or external web application. To add additional facets to the list, select the blue `+` button. +- **Facet field to display using tabs**: This option creates a tab for each configured facet above the search results. This can be used to further narrow down the search results. - **Filters**: Define additional search criteria added to all searches and again are used primarily for external applications and sub-portals. - -![](img/ui-settings-searchpage2.png) - - **Type of sort options**: Define the different ways by which a user can sort a set of search results. The **default sort by option** is shown below. Note that to search for example on `title` in alphabetical order it is necessary to set the order to `reverse`. - **List of templates for search results**: This section allows the administrator to configure templates for the layout of the search results. The default is `grid` whereas `list` is the default for the editor board. ![](img/ui-settings-searchpage3.png) + +- **Similar records** or **More like this**: Define the query used to search for similar records that are displayed at the bottom of the record view. + +![](img/morelikethisconfig.png) + + - **Default template used for search results**: Define the template page for the search. Generally this can be left as the default. - **List of formatter for record view**: Determine the formatter used to display the search results. See [Customizing metadata views](../../customizing-application/creating-custom-view.md) for information on creating a new formatter. To add an additional view, click the blue `+` button below the list and provide a name and a URL. diff --git a/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js b/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js index f91c671e018..e1ca1871d49 100644 --- a/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js +++ b/web-ui/src/main/resources/catalog/components/search/mdview/mdviewDirective.js @@ -178,12 +178,28 @@ var resourceType = scope.md.resourceType ? scope.md.resourceType[0] : undefined; + var filter = []; if (scope.ofSameType && resourceType) { var mapping = resourceTypeMapping[resourceType]; scope.label = mapping ? mapping.label : resourceType; - query.query.bool.filter = [ - { terms: { resourceType: mapping ? mapping.types : [resourceType] } } - ]; + filter.push({ + terms: { resourceType: mapping ? mapping.types : [resourceType] } + }); + } + + if ( + gnGlobalSettings.gnCfg.mods.search.moreLikeThisFilter && + gnGlobalSettings.gnCfg.mods.search.moreLikeThisFilter != "" + ) { + filter.push({ + query_string: { + query: gnGlobalSettings.gnCfg.mods.search.moreLikeThisFilter + } + }); + } + + if (filter.length > 0) { + query.query.bool.filter = filter; } return query; diff --git a/web-ui/src/main/resources/catalog/js/CatController.js b/web-ui/src/main/resources/catalog/js/CatController.js index f9ae78f9e83..65b8d949d76 100644 --- a/web-ui/src/main/resources/catalog/js/CatController.js +++ b/web-ui/src/main/resources/catalog/js/CatController.js @@ -370,6 +370,8 @@ size: 20 }, moreLikeThisSameType: true, + moreLikeThisFilter: + "-cl_status.key:(obsolete OR historicalArchive OR superseded)", moreLikeThisConfig: { more_like_this: { fields: [ @@ -1322,6 +1324,7 @@ "geocoder", "disabledTools", "filters", + "info", "scoreConfig", "autocompleteConfig", "moreLikeThisConfig", diff --git a/web-ui/src/main/resources/catalog/locales/en-admin.json b/web-ui/src/main/resources/catalog/locales/en-admin.json index 81d7da738e0..7f3cd11fd34 100644 --- a/web-ui/src/main/resources/catalog/locales/en-admin.json +++ b/web-ui/src/main/resources/catalog/locales/en-admin.json @@ -1082,6 +1082,7 @@ "ui-mod-header": "Top toolbar", "ui-mod-footer": "Footer", "ui-mod-cookieWarning": "Cookie warning", + "ui-mod-directory": "Directory", "ui-createPageTpl": "New metadata page layout", "ui-createPageTpl-horizontal": "Horizontal", "ui-createPageTpl-vertical": "Vertical", diff --git a/web-ui/src/main/resources/catalog/locales/en-v4.json b/web-ui/src/main/resources/catalog/locales/en-v4.json index dc8e786767d..59927c5984e 100644 --- a/web-ui/src/main/resources/catalog/locales/en-v4.json +++ b/web-ui/src/main/resources/catalog/locales/en-v4.json @@ -164,12 +164,14 @@ "dropIndexAndRebuild": "Delete index and reindex", "rebuildIndexHelp": "While rebuilding index, search may return incomplete results and the CSW GetRecords operation can be disabled (if you selected the option in the settings). Use this function, when catalog traffic is low. It's recommended to rebuild index manually from here when making changes directly in the database. If you change index mapping (cf. <a href='https://github.com/geonetwork/core-geonetwork/blob/es/web/src/main/webResources/WEB-INF/data/config/index/records.json'>records.json</a>), then you have to click on 'Delete index and reindex'.", "indexInEsDoneError": "There is an error with the index. See the logs for details", - "indexInEsDone": "The indexing operation was successfull", + "indexInEsDone": "The indexing operation was successful", "indexCommit": "Commit index changes", "indexCommit-help": "To use only if indexing task is hanging.", "indexCommitError": "Error while committing index changes.", "ui-moreLikeThisConfig": "More like this configuration", - "ui-moreLikeThisConfig-help": "Configuration must have a more_like_this.like which will be set with the record title to search for similar records.", + "ui-moreLikeThisConfig-help": "Configuration must have a more_like_this.like which will be set with the record title to search for similar records. (See <a href=\"https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html\">Elasticsearch API</a>).", + "ui-moreLikeThisFilter": "More like this query filter", + "ui-moreLikeThisFilter-help": "Optional filter expression to apply on the more like this query (eg. <pre>-cl_status.key:(obsolete OR historicalArchive OR superseded)</pre> to exclude obsolete records).", "ui-autocompleteConfig": "Autocompletion configuration", "ui-autocompleteConfig-help": "Configuration must have a query.multi_match.query which will be set on autocompletion.", "ui-facetConfig": "Facets configuration", From 66d3a586e1ccc57a834a9a393fd87fd959b3c7dc Mon Sep 17 00:00:00 2001 From: Ian <ianwallen@hotmail.com> Date: Wed, 16 Oct 2024 12:04:25 -0300 Subject: [PATCH 93/97] Add better logging when resources are deleted to make it clear what metadata record the resource was deleted from. (#8430) Also renamed "MetadataResource" in the message to be "Metadata resource" --- .../records/attachments/FilesystemStore.java | 22 ++++++++++++----- .../api/records/attachments/CMISStore.java | 16 +++++-------- .../api/records/attachments/JCloudStore.java | 24 +++++++++---------- .../api/records/attachments/S3Store.java | 16 +++++++++---- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java b/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java index fb0577bc8bd..469bfc296ea 100644 --- a/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java +++ b/core/src/main/java/org/fao/geonet/api/records/attachments/FilesystemStore.java @@ -234,20 +234,26 @@ public String delResources(ServiceContext context, int metadataId) throws Except try { Log.info(Geonet.RESOURCES, String.format("Deleting all files from metadataId '%d'", metadataId)); IO.deleteFileOrDirectory(metadataDir, true); - return String.format("Metadata '%s' directory removed.", metadataId); + Log.info(Geonet.RESOURCES, + String.format("Metadata '%d' directory removed.", metadataId)); + return String.format("Metadata '%d' directory removed.", metadataId); } catch (Exception e) { - return String.format("Unable to remove metadata '%s' directory.", metadataId); + return String.format("Unable to remove metadata '%d' directory.", metadataId); } } @Override public String delResource(ServiceContext context, String metadataUuid, String resourceId, Boolean approved) throws Exception { - canEdit(context, metadataUuid, approved); + int metadataId = canEdit(context, metadataUuid, approved); try (ResourceHolder filePath = getResource(context, metadataUuid, resourceId, approved)) { Files.deleteIfExists(filePath.getPath()); - return String.format("MetadataResource '%s' removed.", resourceId); + Log.info(Geonet.RESOURCES, + String.format("Resource '%s' removed for metadata %d (%s).", resourceId, metadataId, metadataUuid)); + return String.format("Metadata resource '%s' removed.", resourceId); } catch (IOException e) { + Log.warning(Geonet.RESOURCES, + String.format("Unable to remove resource '%s' for metadata %d (%s). %s", resourceId, metadataId, metadataUuid, e.getMessage())); return String.format("Unable to remove resource '%s'.", resourceId); } } @@ -255,12 +261,16 @@ public String delResource(ServiceContext context, String metadataUuid, String re @Override public String delResource(final ServiceContext context, final String metadataUuid, final MetadataResourceVisibility visibility, final String resourceId, Boolean approved) throws Exception { - canEdit(context, metadataUuid, approved); + int metadataId = canEdit(context, metadataUuid, approved); try (ResourceHolder filePath = getResource(context, metadataUuid, visibility, resourceId, approved)) { Files.deleteIfExists(filePath.getPath()); - return String.format("MetadataResource '%s' removed.", resourceId); + Log.info(Geonet.RESOURCES, + String.format("Resource '%s' removed for metadata %d (%s).", resourceId, metadataId, metadataUuid)); + return String.format("Metadata resource '%s' removed.", resourceId); } catch (IOException e) { + Log.warning(Geonet.RESOURCES, + String.format("Unable to remove resource '%s' for metadata %d (%s). %s", resourceId, metadataId, metadataUuid, e.getMessage())); return String.format("Unable to remove resource '%s'.", resourceId); } } diff --git a/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java b/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java index 37fe8501899..a158ae9a319 100644 --- a/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java +++ b/datastorages/cmis/src/main/java/org/fao/geonet/api/records/attachments/CMISStore.java @@ -424,13 +424,9 @@ public String delResource(final ServiceContext context, final String metadataUui for (MetadataResourceVisibility visibility : MetadataResourceVisibility.values()) { if (tryDelResource(context, metadataUuid, metadataId, visibility, resourceId)) { - Log.info(Geonet.RESOURCES, - String.format("MetadataResource '%s' removed.", resourceId)); - return String.format("MetadataResource '%s' removed.", resourceId); + return String.format("Metadata resource '%s' removed.", resourceId); } } - Log.info(Geonet.RESOURCES, - String.format("Unable to remove resource '%s'.", resourceId)); return String.format("Unable to remove resource '%s'.", resourceId); } @@ -439,12 +435,8 @@ public String delResource(final ServiceContext context, final String metadataUui final String resourceId, Boolean approved) throws Exception { int metadataId = canEdit(context, metadataUuid, approved); if (tryDelResource(context, metadataUuid, metadataId, visibility, resourceId)) { - Log.info(Geonet.RESOURCES, - String.format("MetadataResource '%s' removed.", resourceId)); - return String.format("MetadataResource '%s' removed.", resourceId); + return String.format("Metadata resource '%s' removed.", resourceId); } - Log.info(Geonet.RESOURCES, - String.format("Unable to remove resource '%s'.", resourceId)); return String.format("Unable to remove resource '%s'.", resourceId); } @@ -459,6 +451,8 @@ protected boolean tryDelResource(final ServiceContext context, final String meta try { final CmisObject object = cmisConfiguration.getClient().getObjectByPath(key, oc); object.delete(); + Log.info(Geonet.RESOURCES, + String.format("Resource '%s' removed for metadata %d (%s).", resourceId, metadataId, metadataUuid)); if (object instanceof Folder) { cmisUtils.invalidateFolderCacheItem(key); } @@ -467,6 +461,8 @@ protected boolean tryDelResource(final ServiceContext context, final String meta //CmisPermissionDeniedException when user does not have permissions. //CmisConstraintException when there is a lock on the file from a checkout. } catch (CmisObjectNotFoundException | CmisPermissionDeniedException | CmisConstraintException e) { + Log.info(Geonet.RESOURCES, + String.format("Unable to remove resource '%s' for metadata %d (%s). %s", resourceId, metadataId, metadataUuid, e.getMessage())); return false; } } diff --git a/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java b/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java index 835dc3051c4..ba300c53254 100644 --- a/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java +++ b/datastorages/jcloud/src/main/java/org/fao/geonet/api/records/attachments/JCloudStore.java @@ -356,11 +356,13 @@ public String delResources(final ServiceContext context, final int metadataId) t } marker = page.getNextMarker(); } while (marker != null); - return String.format("Metadata '%s' directory removed.", metadataId); + Log.info(Geonet.RESOURCES, + String.format("Metadata '%d' directory removed.", metadataId)); + return String.format("Metadata '%d' directory removed.", metadataId); } catch (ContainerNotFoundException e) { Log.warning(Geonet.RESOURCES, - String.format("Unable to located metadata '%s' directory to be removed.", metadataId)); - return String.format("Unable to located metadata '%s' directory to be removed.", metadataId); + String.format("Unable to located metadata '%d' directory to be removed.", metadataId)); + return String.format("Unable to located metadata '%d' directory to be removed.", metadataId); } } @@ -371,13 +373,9 @@ public String delResource(final ServiceContext context, final String metadataUui for (MetadataResourceVisibility visibility : MetadataResourceVisibility.values()) { if (tryDelResource(context, metadataUuid, metadataId, visibility, resourceId)) { - Log.info(Geonet.RESOURCES, - String.format("MetadataResource '%s' removed.", resourceId)); - return String.format("MetadataResource '%s' removed.", resourceId); + return String.format("Metadata resource '%s' removed.", resourceId); } } - Log.info(Geonet.RESOURCES, - String.format("Unable to remove resource '%s'.", resourceId)); return String.format("Unable to remove resource '%s'.", resourceId); } @@ -386,12 +384,8 @@ public String delResource(final ServiceContext context, final String metadataUui final String resourceId, Boolean approved) throws Exception { int metadataId = canEdit(context, metadataUuid, approved); if (tryDelResource(context, metadataUuid, metadataId, visibility, resourceId)) { - Log.info(Geonet.RESOURCES, - String.format("MetadataResource '%s' removed.", resourceId)); - return String.format("MetadataResource '%s' removed.", resourceId); + return String.format("Metadata resource '%s' removed.", resourceId); } - Log.info(Geonet.RESOURCES, - String.format("Unable to remove resource '%s'.", resourceId)); return String.format("Unable to remove resource '%s'.", resourceId); } @@ -401,8 +395,12 @@ protected boolean tryDelResource(final ServiceContext context, final String meta if (jCloudConfiguration.getClient().getBlobStore().blobExists(jCloudConfiguration.getContainerName(), key)) { jCloudConfiguration.getClient().getBlobStore().removeBlob(jCloudConfiguration.getContainerName(), key); + Log.info(Geonet.RESOURCES, + String.format("Resource '%s' removed for metadata %d (%s).", resourceId, metadataId, metadataUuid)); return true; } + Log.info(Geonet.RESOURCES, + String.format("Unable to remove resource '%s' for metadata %d (%s).", resourceId, metadataId, metadataUuid)); return false; } diff --git a/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java b/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java index 27df07a4532..061f566aab3 100644 --- a/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java +++ b/datastorages/s3/src/main/java/org/fao/geonet/api/records/attachments/S3Store.java @@ -193,9 +193,13 @@ public String delResources(final ServiceContext context, final int metadataId) t for (S3ObjectSummary object: objects.getObjectSummaries()) { s3.getClient().deleteObject(s3.getBucket(), object.getKey()); } - return String.format("Metadata '%s' directory removed.", metadataId); + Log.info(Geonet.RESOURCES, + String.format("Metadata '%d' directory removed.", metadataId)); + return String.format("Metadata '%d' directory removed.", metadataId); } catch (AmazonServiceException e) { - return String.format("Unable to remove metadata '%s' directory.", metadataId); + Log.warning(Geonet.RESOURCES, + String.format("Unable to remove metadata '%d' directory. %s", metadataId, e.getMessage())); + return String.format("Unable to remove metadata '%d' directory.", metadataId); } } @@ -206,7 +210,7 @@ public String delResource(final ServiceContext context, final String metadataUui for (MetadataResourceVisibility visibility: MetadataResourceVisibility.values()) { if (tryDelResource(metadataUuid, metadataId, visibility, resourceId)) { - return String.format("MetadataResource '%s' removed.", resourceId); + return String.format("Metadata resource '%s' removed.", resourceId); } } return String.format("Unable to remove resource '%s'.", resourceId); @@ -217,7 +221,7 @@ public String delResource(final ServiceContext context, final String metadataUui final String resourceId, Boolean approved) throws Exception { int metadataId = canEdit(context, metadataUuid, approved); if (tryDelResource(metadataUuid, metadataId, visibility, resourceId)) { - return String.format("MetadataResource '%s' removed.", resourceId); + return String.format("Metadata resource '%s' removed.", resourceId); } return String.format("Unable to remove resource '%s'.", resourceId); } @@ -227,8 +231,12 @@ private boolean tryDelResource(final String metadataUuid, final int metadataId, final String key = getKey(metadataUuid, metadataId, visibility, resourceId); if (s3.getClient().doesObjectExist(s3.getBucket(), key)) { s3.getClient().deleteObject(s3.getBucket(), key); + Log.info(Geonet.RESOURCES, + String.format("Resource '%s' removed for metadata %d (%s).", resourceId, metadataId, metadataUuid)); return true; } + Log.info(Geonet.RESOURCES, + String.format("Unable to remove resource '%s' for metadata %d (%s).", resourceId, metadataId, metadataUuid)); return false; } From e20820ace5e87f72c97a2493d2d72e99fcf48d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Wed, 16 Oct 2024 16:49:59 +0200 Subject: [PATCH 94/97] Add bootstrap datepicker language files for supported UI languages --- .../WEB-INF/classes/web-ui-wro-sources.xml | 40 ++++++++++++++++++ .../datepicker/bootstrap-datepicker.az.min.js | 1 + .../datepicker/bootstrap-datepicker.ca.min.js | 1 + .../datepicker/bootstrap-datepicker.cs.min.js | 1 + .../datepicker/bootstrap-datepicker.cy.min.js | 1 + .../datepicker/bootstrap-datepicker.da.min.js | 1 + .../datepicker/bootstrap-datepicker.de.min.js | 1 + .../datepicker/bootstrap-datepicker.es.min.js | 1 + .../datepicker/bootstrap-datepicker.fi.min.js | 1 + .../datepicker/bootstrap-datepicker.hy.min.js | 1 + .../datepicker/bootstrap-datepicker.is.min.js | 1 + .../datepicker/bootstrap-datepicker.it.min.js | 1 + .../datepicker/bootstrap-datepicker.ka.min.js | 1 + .../datepicker/bootstrap-datepicker.ko.min.js | 1 + .../datepicker/bootstrap-datepicker.pt.min.js | 1 + .../datepicker/bootstrap-datepicker.ro.min.js | 1 + .../datepicker/bootstrap-datepicker.ru.min.js | 1 + .../datepicker/bootstrap-datepicker.sk.min.js | 1 + .../datepicker/bootstrap-datepicker.sv.min.js | 1 + .../datepicker/bootstrap-datepicker.uk.min.js | 1 + .../datepicker/bootstrap-datepicker.zh.min.js | 1 + .../webapp/xslt/base-layout-cssjs-loader.xsl | 42 +++++++++++++++++++ 22 files changed, 102 insertions(+) create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js create mode 100644 web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js diff --git a/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml b/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml index d65e5b19fd3..b160fe4f051 100644 --- a/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml +++ b/web-ui/src/main/resources/WEB-INF/classes/web-ui-wro-sources.xml @@ -83,6 +83,26 @@ <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.js" minimize="true"/> <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fr.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.nl.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/bootstrap-table/dist/bootstrap-table.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/bootstrap-table/dist/bootstrap-table-locale-all.min.js" @@ -156,6 +176,26 @@ <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.js"/> <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fr.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.nl.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js" minimize="false"/> + <jsSource webappPath="/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/bootstrap-table/dist/bootstrap-table.min.js" minimize="false"/> <jsSource webappPath="/catalog/lib/bootstrap-table/dist/bootstrap-table-locale-all.min.js" diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js new file mode 100644 index 00000000000..aa1edbf4f80 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.az={days:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],daysShort:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],daysMin:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],months:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthsShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],today:"Bu gün",weekStart:1,clear:"Təmizlə",monthsTitle:"Aylar"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js new file mode 100644 index 00000000000..d21351866dc --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ca={days:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],daysShort:["dg.","dl.","dt.","dc.","dj.","dv.","ds."],daysMin:["dg","dl","dt","dc","dj","dv","ds"],months:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthsShort:["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],today:"Avui",monthsTitle:"Mesos",clear:"Esborra",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js new file mode 100644 index 00000000000..42dfd1a29d8 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.cs={days:["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],daysShort:["Ned","Pon","Úte","Stř","Čtv","Pát","Sob"],daysMin:["Ne","Po","Út","St","Čt","Pá","So"],months:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],monthsShort:["Led","Úno","Bře","Dub","Kvě","Čer","Čnc","Srp","Zář","Říj","Lis","Pro"],today:"Dnes",clear:"Vymazat",monthsTitle:"Měsíc",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js new file mode 100644 index 00000000000..f85ea031dd0 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.cy={days:["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],daysShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],daysMin:["Su","Ll","Ma","Me","Ia","Gwe","Sa"],months:["Ionawr","Chewfror","Mawrth","Ebrill","Mai","Mehefin","Gorfennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthsShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"],today:"Heddiw"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js new file mode 100644 index 00000000000..53c81805282 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.da={days:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],daysShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],daysMin:["Sø","Ma","Ti","On","To","Fr","Lø"],months:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"I Dag",weekStart:1,clear:"Nulstil",format:"dd/mm/yyyy",monthsTitle:"Måneder"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js new file mode 100644 index 00000000000..c76f75d37f4 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.de={days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["So","Mo","Di","Mi","Do","Fr","Sa"],daysMin:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",monthsTitle:"Monate",clear:"Löschen",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js new file mode 100644 index 00000000000..f3cef5d2b93 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.es={days:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],daysShort:["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],daysMin:["Do","Lu","Ma","Mi","Ju","Vi","Sa"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthsShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],today:"Hoy",monthsTitle:"Meses",clear:"Borrar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js new file mode 100644 index 00000000000..33af3d3ebc6 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.fi={days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],daysShort:["sun","maa","tii","kes","tor","per","lau"],daysMin:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],monthsShort:["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],today:"tänään",clear:"Tyhjennä",weekStart:1,format:"d.m.yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js new file mode 100644 index 00000000000..a1cf653d380 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.hy={days:["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],daysShort:["Կիր","Երկ","Երե","Չոր","Հին","Ուրբ","Շաբ"],daysMin:["Կի","Եկ","Եք","Չո","Հի","Ու","Շա"],months:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthsShort:["Հնվ","Փետ","Մար","Ապր","Մայ","Հուն","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],today:"Այսօր",clear:"Ջնջել",format:"dd.mm.yyyy",weekStart:1,monthsTitle:"Ամիսնէր"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js new file mode 100644 index 00000000000..f49bd18cc23 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.is={days:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],daysShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],daysMin:["Su","Má","Þr","Mi","Fi","Fö","La"],months:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],today:"Í Dag"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js new file mode 100644 index 00000000000..cc30766ffa0 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.it={days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],daysShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],daysMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthsShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],today:"Oggi",monthsTitle:"Mesi",clear:"Cancella",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js new file mode 100644 index 00000000000..84f14c0e90e --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ka={days:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],daysShort:["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],daysMin:["კვ","ორ","სა","ოთ","ხუ","პა","შა"],months:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthsShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],today:"დღეს",clear:"გასუფთავება",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js new file mode 100644 index 00000000000..9751ee5c228 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ko={days:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],daysShort:["일","월","화","수","목","금","토"],daysMin:["일","월","화","수","목","금","토"],months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthsShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],today:"오늘",clear:"삭제",format:"yyyy-mm-dd",titleFormat:"yyyy년mm월",weekStart:0}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js new file mode 100644 index 00000000000..e2b4e64d774 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.pt={days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],daysShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],daysMin:["Do","Se","Te","Qu","Qu","Se","Sa"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthsShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],today:"Hoje",monthsTitle:"Meses",clear:"Limpar",format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js new file mode 100644 index 00000000000..5fff2986df1 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ro={days:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],daysShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],daysMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],months:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthsShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],today:"Astăzi",clear:"Șterge",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js new file mode 100644 index 00000000000..52bc010b97c --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ru={days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вск","Пнд","Втр","Срд","Чтв","Птн","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",format:"dd.mm.yyyy",weekStart:1,monthsTitle:"Месяцы"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js new file mode 100644 index 00000000000..79a9267fd52 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sk={days:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],daysShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],daysMin:["Ne","Po","Ut","St","Št","Pia","So"],months:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],today:"Dnes",clear:"Vymazať",weekStart:1,format:"d.m.yyyy"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js new file mode 100644 index 00000000000..7ab6becb925 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sv={days:["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],daysShort:["sön","mån","tis","ons","tor","fre","lör"],daysMin:["sö","må","ti","on","to","fr","lö"],months:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],monthsShort:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],today:"Idag",format:"yyyy-mm-dd",weekStart:1,clear:"Rensa"}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js new file mode 100644 index 00000000000..a555be8008a --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.uk={days:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"],daysShort:["Нед","Пнд","Втр","Срд","Чтв","Птн","Суб"],daysMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthsShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],today:"Сьогодні",clear:"Очистити",format:"dd.mm.yyyy",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js new file mode 100644 index 00000000000..5688b92ea61 --- /dev/null +++ b/web-ui/src/main/resources/catalog/lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["zh"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["周日","周一","周二","周三","周四","周五","周六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今天",monthsTitle:"选择月份",clear:"清除",format:"yyyy-mm-dd",titleFormat:"yyyy年mm月",weekStart:1}}(jQuery); diff --git a/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl b/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl index aa8b2ee4a4c..627d639e8f2 100644 --- a/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl +++ b/web/src/main/webapp/xslt/base-layout-cssjs-loader.xsl @@ -187,6 +187,48 @@ src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.fr.min.js?v={$buildNumber}"></script> <script src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.nl.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.az.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.ca.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.cs.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.cy.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.da.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.de.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.es.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.fi.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.hy.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.is.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.it.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.ka.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.ko.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.pt.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.ro.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.ru.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.sk.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.sv.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.uk.min.js?v={$buildNumber}"></script> + <script + src="{$uiResourcesPath}lib/bootstrap.ext/datepicker/bootstrap-datepicker.zh.min.js?v={$buildNumber}"></script> + + <script src="{$uiResourcesPath}lib/bootstrap-table/dist/bootstrap-table.js?v={$buildNumber}"></script> <script src="{$uiResourcesPath}lib/bootstrap-table-angular.js?v={$buildNumber}"></script> <script src="{$uiResourcesPath}lib/bootstrap-table/src/extensions/export/bootstrap-table-export.js?v={$buildNumber}"></script> From 82fda1217cd67a346d468b893babd310bfda07a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Garc=C3=ADa?= <josegar74@gmail.com> Date: Thu, 17 Oct 2024 10:22:19 +0200 Subject: [PATCH 95/97] Avoid duplicate validation message when trying to register a user with existing email --- .../test/resources/org/fao/geonet/api/Messages.properties | 3 +-- .../resources/org/fao/geonet/api/Messages_fre.properties | 3 +-- .../api/users/validation/UserRegisterDtoValidator.java | 8 +++----- .../classes/org/fao/geonet/api/Messages.properties | 3 +-- .../classes/org/fao/geonet/api/Messages_fre.properties | 3 +-- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/core/src/test/resources/org/fao/geonet/api/Messages.properties b/core/src/test/resources/org/fao/geonet/api/Messages.properties index 4db47277a6b..823338a3a32 100644 --- a/core/src/test/resources/org/fao/geonet/api/Messages.properties +++ b/core/src/test/resources/org/fao/geonet/api/Messages.properties @@ -54,8 +54,7 @@ user_password_changed='%s' password was updated. user_password_notchanged=A problem occurred trying to change '%s' password. Contact the helpdesk. user_password_invalid_changekey='%s' is an invalid change key for '%s'. Change keys are only valid for one day. user_registered=User '%s' registered. -user_with_that_email_found=A user with this email or username already exists. -user_with_that_username_found=A user with this email or username already exists. +user_with_that_email_username_found=A user with this email or username already exists. register_email_admin_subject=%s / New account for %s as %s register_email_admin_message=Dear Admin,\n\ Newly registered user %s has requested %s access for %s.\n\ diff --git a/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties b/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties index fa2455ebbf2..d93b300f600 100644 --- a/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties +++ b/core/src/test/resources/org/fao/geonet/api/Messages_fre.properties @@ -53,8 +53,7 @@ user_password_sent=Si l''utilisateur existe, vous recevrez un courriel contenant user_password_changed=Le mot de passe de %s a \u00E9t\u00E9 mis \u00E0 jour. user_password_notchanged=\u00C9chec lors du changement de mot de passe de %s. Contactez le support. user_password_invalid_changekey=%s est une cl\u00E9 invalide pour %s. Les cl\u00E9s ne sont valides que pendant une journ\u00E9e. -user_with_that_email_found=Un utilisateur avec cette adresse email ou ce nom d''utilisateur existe d\u00E9j\u00E0. -user_with_that_username_found=Un utilisateur avec cette adresse email ou ce nom d''utilisateur existe d\u00E9j\u00E0. +user_with_that_email_username_found=Un utilisateur avec cette adresse email ou ce nom d''utilisateur existe d\u00E9j\u00E0. register_email_admin_subject=%s / Cr\u00E9ation de compte pour %s en tant que %s register_email_admin_message=Cher administrateur,\n\ L'utilisateur %s vient de demander une cr\u00E9ation de compte pour %s.\n\ diff --git a/services/src/main/java/org/fao/geonet/api/users/validation/UserRegisterDtoValidator.java b/services/src/main/java/org/fao/geonet/api/users/validation/UserRegisterDtoValidator.java index 2ba53946b18..f22d7cc821f 100644 --- a/services/src/main/java/org/fao/geonet/api/users/validation/UserRegisterDtoValidator.java +++ b/services/src/main/java/org/fao/geonet/api/users/validation/UserRegisterDtoValidator.java @@ -60,12 +60,10 @@ public void validate(Object target, Errors errors) { } UserRepository userRepository = ApplicationContextHolder.get().getBean(UserRepository.class); - if (userRepository.findOneByEmail(userRegisterDto.getEmail()) != null) { - errors.rejectValue("", "user_with_that_email_found", "A user with this email or username already exists."); + if ((userRepository.findOneByEmail(userRegisterDto.getEmail()) != null) || + (!userRepository.findByUsernameIgnoreCase(userRegisterDto.getEmail()).isEmpty())) { + errors.rejectValue("", "user_with_that_email_username_found", "A user with this email or username already exists."); } - if (userRepository.findByUsernameIgnoreCase(userRegisterDto.getEmail()).size() != 0) { - errors.rejectValue("", "user_with_that_username_found", "A user with this email or username already exists."); - } } } diff --git a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties index 6d945f9df7f..c3cb510a706 100644 --- a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties +++ b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages.properties @@ -54,8 +54,7 @@ user_password_changed='%s' password was updated. user_password_notchanged=A problem occurred trying to change '%s' password. Contact the helpdesk. user_password_invalid_changekey='%s' is an invalid change key for '%s'. Change keys are only valid for one day. user_registered=User '%s' registered. -user_with_that_email_found=A user with this email or username already exists. -user_with_that_username_found=A user with this email or username already exists. +user_with_that_email_username_found=A user with this email or username already exists. register_email_admin_subject=%s / New account for %s as %s register_email_admin_message=Dear Admin,\n\ Newly registered user %s has requested %s access for %s.\n\ diff --git a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties index b0180115f96..5650e16f1ca 100644 --- a/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties +++ b/web/src/main/webapp/WEB-INF/classes/org/fao/geonet/api/Messages_fre.properties @@ -53,8 +53,7 @@ user_password_sent=Si l''utilisateur existe, vous recevrez un courriel contenant user_password_changed=Le mot de passe de %s a \u00E9t\u00E9 mis \u00E0 jour. user_password_notchanged=\u00C9chec lors du changement de mot de passe de %s. Contactez le support. user_password_invalid_changekey=%s est une cl\u00E9 invalide pour %s. Les cl\u00E9s ne sont valides que pendant une journ\u00E9e. -user_with_that_email_found=Un utilisateur avec cette adresse email ou ce nom d''utilisateur existe d\u00E9j\u00E0. -user_with_that_username_found=Un utilisateur avec cette adresse email ou ce nom d''utilisateur existe d\u00E9j\u00E0. +user_with_that_email_username_found=Un utilisateur avec cette adresse email ou ce nom d''utilisateur existe d\u00E9j\u00E0. register_email_admin_subject=%s / Cr\u00E9ation de compte pour %s en tant que %s register_email_admin_message=Cher administrateur,\n\ L'utilisateur %s vient de demander une cr\u00E9ation de compte pour %s.\n\ From 7d97656187737497b46c735403cef39e8e13469a Mon Sep 17 00:00:00 2001 From: tylerjmchugh <163562062+tylerjmchugh@users.noreply.github.com> Date: Thu, 17 Oct 2024 08:47:38 -0400 Subject: [PATCH 96/97] Update home page "browse by" to display facet as label if there is only one (#8426) * Update home page to display facet as label if there is only one * Show label with a single facet * Fix bug with single facet --- .../resources/catalog/views/default/templates/home.html | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/web-ui/src/main/resources/catalog/views/default/templates/home.html b/web-ui/src/main/resources/catalog/views/default/templates/home.html index c6aa22348aa..b68a0d79cef 100644 --- a/web-ui/src/main/resources/catalog/views/default/templates/home.html +++ b/web-ui/src/main/resources/catalog/views/default/templates/home.html @@ -119,11 +119,14 @@ <h1 data-translate="">topMaps</h1> > <div data-ng-class="fluidLayout ? 'container-fluid' : 'container'"> <div data-ng-show="homeFacet.list.length > 0"> - <div class="row" data-ng-show="homeFacet.list.length > 1"> + <div class="row"> <h1 class="col-md-12"> - <span data-translate="">browseBy</span> + <span data-translate="" data-ng-if="homeFacet.list.length > 2">browseBy</span> + <span data-ng-if="homeFacet.list.length < 3" data-translate=""> + {{::('facet-' + homeFacet.list[0]) | facetKeyTranslator}} + </span> </h1> - <div class="gn-topic-select col-md-12"> + <div class="gn-topic-select col-md-12" data-ng-if="homeFacet.list.length > 2"> <label data-ng-repeat="facetKey in homeFacet.list" data-ng-init="agg = searchInfo.aggregations[facetKey]" From 5b01f640fc4c4853cb1d1cdd75544577d087f125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Prunayre?= <fx.prunayre@gmail.com> Date: Thu, 17 Oct 2024 17:58:33 +0200 Subject: [PATCH 97/97] Standard / DCAT (and profiles) export (#7600) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Standard / ISO / DCAT formatters Proposal to better organize various flavor of DCAT. The target is to support: * DCAT * EU DCAT-AP * EU DCAT-AP mobility * EU GeoDCAT-AP. * Formatter / DCAT / Improvements. * Formatter / DCAT / Core. * Formatter / DCAT / Core / Associated. * Formatter / DCAT / Core / Lineage. * Formatter / DCAT / Core / Dataset / Temporal. * Formatter / DCAT / Core / Dataset / Distributions. * Formatter / DCAT / Core / Dataset / Services. * Formatter / DCAT / Core / Mulitlingual support. * Formatter / DCAT / RDF valid model. * Formatter / DCAT / Tests. * Formatter / EU-DCAT-AP / CatalogRecord. * Formatter / DCAT / Test dep. * Formatter / EU-DCAT-AP / Draft with test. * Added DCAT-AP validation with SHACL rules in FormatterApiTest. * Library / Update Jena for SHACL validation (issue on various commons-codec versions) * Formatter / EU-DCAT-AP / Improve shacl validation status - license and status. * Formatter / EU-DCAT-AP / Improve shacl validation status - bytesize. * Formatter / EU-DCAT-AP / Improve shacl validation status - 1 format, 1 accrualPeriodicity. * Formatter / EU-DCAT-AP / Improve shacl validation status - license, accessRights and rights. * Formatter / EU-DCAT-AP / Improve shacl validation status - dcat:theme from EU vocabulary as skos:Concept. * Formatter / EU-DCAT-AP / Improve shacl validation status - primaryTopic is required even if isPrimaryTopic is defined. Only one rights allowed. * Formatter / EU-DCAT-AP / Improve shacl validation status - only one dct:type allowed. * Formatter / EU-DCAT-AP / Add 2.1.1 base shacl validation level. * Formatter / EU-DCAT-AP / Validation / Shacl 2.1.1 / Success. * Formatter / EU-DCAT-AP-HVD / Base conversion with HVD category * Formatter / EU-DCAT-AP-HVD / Add Shacl validation - which is failing for now. * Formatter / EU-GEODCAT-AP / CatalogRecord. * Formatter / EU-GEODCAT-AP / Shacl validation. * Formatter / DCAT / Declare ISO conformity for the source and DCAT-AP conformity for the CatalogueRecord. * Formatter / DCAT / ISO19139 bridges. * Added Mobility DCAT - Mobility Theme concept. * CSW / Improve outputschema configuration and add DCAT outputs. * CSW / Improve outputschema configuration / Add config for ISO19110 and ISO19139 (which is the same as 115-3) * DCAT / Mobility / Remove unused import. * Added Mobility DCAT - support of georefenrecingMethod, networkCoverage and transportMode. * WIP mobility dcat - distribution * Dependencies / Declare version in root pom. * DCAT / ISO19139 / Fallback URI builder when no metadata linkage exist. To be discussed what is the best fallback. Former DCAT conversion was using a setting for resourcePrefix * DCAT / Add formatters to test list. * Standard / ISO / DCAT formatters / GeoDCAT-AP / Use dct:description instead of rdfs:label lfor potentially long texts https://github.com/SEMICeu/GeoDCAT-AP/issues/108. * Standard / ISO / DCAT formatters / EU-DCAT-AP / Update shacl validation rules to latests. * Standard / ISO / DCAT formatters / Testing / Turn off shacl phase for now and pass test. * Standard / ISO / DCAT formatters / EU-DCAT-AP / Use dct:provenance for lineage. DCAT core use versionNotes. * Standard / ISO / DCAT formatters / Distributions / Do not repeat eleements from the resources by default eg. rights, license, resolution, applicable legislation. * Standard / ISO / DCAT formatters / GeoDCAT-AP spatial representation technique TODO. * Standard / ISO / DCAT formatters / GeoDCAT-AP spatialResolutionAsText TODO. * Standard / ISO / DCAT formatters / adms:identifier / Schema Agency only if codespace is defined. * Standard / ISO / DCAT formatters / Bytesize / Range changed to xsd:nonNegativeInteger https://github.com/SEMICeu/GeoDCAT-AP/issues/91. * Standard / ISO / DCAT formatters / GeoDCAT-AP element without mapping. * Standard / ISO / DCAT formatters / HVD / Add applicable legislation. * Standard / ISO / DCAT formatters / Assume individual name is not multilingual. Use first CharacterString or Anchor text element. * Standard / ISO / DCAT formatters / Add references for org and individual. * Standard / ISO / DCAT formatters / Cleanup. Remove validation mode which will be probably either shacl or schematron at some point. * Standard / ISO / DCAT formatters / Refactor for easier object reference configuration. References are added to org, individual, keywords now. * API / Formatter / If no output parameter is provided try to infer content type from formatter id. eg. DCAT are usually XML. Formatter with JSON in name are JSON. * Standard / ISO / DCAT formatters / A bit closer to what EU-DCAT-AP SHACL rule expect. Tested with https://www.itb.ec.europa.eu/shacl/dcat-ap/upload. Difficulties to reproduce SHACL errors similar the the online validator. Could be related to not using the same SHACL rules or a difference with Jena validator? * Standard / ISO / DCAT formatters / Shacl rules are now in the same folder. Fix path in comments * Documentation / DCAT * Documentation / DCAT / Image * Standard / ISO / DCAT formatters / HVD extend DCAT-AP. Fix missing DCAT-AP theme (based on mapping from INSPIRE themes and topic category. * Test / EU-DCAT-AP / SHACL / Fix Jena issue. Related to https://github.com/SEMICeu/DCAT-AP/issues/366. * Standard / ISO / DCAT formatters / Fix range for MediaTypeOrExtent. * Standard / ISO / DCAT formatters / SHACL / Rules are now working. Then we have to fix input document or decide to lose information on constraints. * Standard / ISO / DCAT formatters / HVD / Fix test. * Standard / ISO / DCAT formatters / Fix namespace of contactPoint. * Standard / ISO / DCAT formatters / Better support multilingual records. * Admin / CSW / Add more GET request examples. * Standard / ISO / DCAT formatters / Fix namespace of contactPoint * Standard / ISO / DCAT formatters / Better handle HVD concept by normalizing long labels. * DCAT / Shacl rule update. From https://github.com/SEMICeu/DCAT-AP/commit/591fae6038c6f7c06f25d29b39d2df4f30edcd4f * Standards / ISO / Formatters / DCAT / Multilingual / Do not output empty text ```xml <dcat:keyword xml:lang="fre">Observation</dcat:keyword> <dcat:keyword xml:lang="eng">Observation</dcat:keyword> <dcat:keyword xml:lang="fre">Observation par point</dcat:keyword> <dcat:keyword xml:lang="eng"/> ``` * Standards / ISO / Formatters / DCAT / Distribution / Map taking into account protocol (and not only function). * Standards / ISO / Formatters / DCAT / Period of time using beginPosition. * Standards / ISO / Formatters / DCAT / Documentation and entry point for license mapping. * Updated license mapping to map to EU licenses for dcat-ap profile (and keep original license in dcat-core) mapping done in dcat-core profile (trigger behaviour with variable in dcat-ap profile). * Updated license mapping to map to EU licenses for dcat-ap profile (removed xsl messages) * Standards / ISO / Formatters / DCAT / Update SEMICeu conversion - following GeoDCAT-AP 3 revision working group progress. * Standards / ISO / Formatters / DCAT / Updates following GeoDCAT-AP working group meeting. * Standards / ISO / Formatters / DCAT / Update SEMICeu conversion - fix template. * Standards / ISO / Formatters / DCAT / Update SEMICeu conversion - more robust on CRS. * Formatter / DCAT / ISO common name are unused for keywords Dedicated template exist in dcat-core-keyword * Formatter / DCAT / Mobility DCAT improvement. * Add mapping for referenceSystem * Add test * Disable distribution for now and delegate to DCAT-AP for now. * Formatter / DCAT / accrualPeriodicity / Add support for userDefinedMaintenanceFrequency which can be mapped to mobility DCAT vocabulary https://mobilitydcat-ap.github.io/controlled-vocabularies/update-frequency/latest/index.html#. * DCAT / Formatter / Simplify template for constraint Match first resource constraints and then map to access and use elements. * Formatter / DCAT / Improve mapping for organization with multiple individual. * Formatter / DCAT / Mobility DCAT - improve accrual periodicity mapping. Cardinality: * ISO 0..n * DCAT 0..n * DCAT-AP 0..1 * Mobility DCAT 1..1 (in ISO either use corresponding period eg. P0Y0M0DT1H0M0S or extend the codelist with the proper vocabulary) accrualPeriodicity mapping done using the ISO to Dublin core value mapping but additional checks are done when ISO records extended the codelist and may used the EU Publication Office frequency codes or the Mobility DCAT-AP update frequency codes. Domain specific codelists take priority over the DC or ISO codelists. eg. <mmi:MD_MaintenanceFrequencyCode codeListValue="15min"/> multipleAccrualPeriodicityAllowed is a parameter that can be set to true to allow multiple accrualPeriodicity values. Default to false for EU formatters. true for DCAT. * Missing test file update. * Formatter / DCAT / Applicable legislations https://semiceu.github.io/DCAT-AP/r5r/releases/3.0.0/#applicableLegislation Add the element to DCAT-AP base. Element is 0..n in DCAT-AP and should be present in extensions (mobility, hvd, geodcat). HVD requires at least http://data.europa.eu/eli/reg_impl/2023/138/oj and cardinality is 1..n. Do not restrict to a particular legislation list. A sample vocabulary is provided but it can be extended depending on catalogue domains. * Formatter / DCAT / Identifier(s) In DCAT and DCAT-AP, `dct:identifier` is 0..n. Mobility DCAT restrict it to 0..1. In DCAT-AP and extensions, only convert the first identifier as `dct:identifier`; others as `adms:identifier`. * Formatter / DCAT / Identifier / Urn Use `:` separator for URN like identifiers. * Formatter / DCAT / Map ISO language codes (bibliographic codes) to DCAT language codes (terminology codes) * Formatter / DCAT / Map ISO language codes / Test. --------- Co-authored-by: GeryNi <gery.nicolay@spacebel.be> Co-authored-by: Jose García <josegar74@gmail.com> --- .../org/fao/geonet/kernel/SchemaManager.java | 21 +- .../geonet/component/csw/GetCapabilities.java | 11 +- .../fao/geonet/csw/common/OutputSchema.java | 12 +- .../org/fao/geonet/csw/common/util/Xml.java | 14 +- .../docs/api/img/dcat-in-download-menu.png | Bin 0 -> 31560 bytes docs/manual/docs/api/rdf-dcat.md | 137 +- pom.xml | 7 +- .../resources/config-spring-geonetwork.xml | 6 + .../convert/ISO19139/fromISO19139.xsl | 2 +- .../formatter/dcat/dcat-commons.xsl | 28 + .../dcat/dcat-core-access-and-use.xsl | 145 + .../formatter/dcat/dcat-core-associated.xsl | 111 + .../formatter/dcat/dcat-core-catalog.xsl | 30 + .../dcat/dcat-core-catalogrecord.xsl | 50 + .../formatter/dcat/dcat-core-contact.xsl | 247 + .../formatter/dcat/dcat-core-dataservice.xsl | 52 + .../formatter/dcat/dcat-core-dataset.xsl | 409 + .../formatter/dcat/dcat-core-distribution.xsl | 443 + .../formatter/dcat/dcat-core-keywords.xsl | 60 + .../formatter/dcat/dcat-core-lineage.xsl | 49 + .../formatter/dcat/dcat-core-resource.xsl | 47 + .../formatter/dcat/dcat-core.xsl | 392 + .../formatter/dcat/dcat-utils.xsl | 144 + .../formatter/dcat/dcat-variables.xsl | 220 + .../iso19115-3.2018/formatter/dcat/view.xsl | 20 + .../dcat/vocabularies/licences-skos.rdf | 7070 +++++++++++++++ .../eu-dcat-ap-hvd/eu-dcat-ap-hvd-core.xsl | 112 + .../formatter/eu-dcat-ap-hvd/view.xsl | 22 + .../eu-applicable-legislation.rdf | 572 ++ .../high-value-dataset-category.rdf | 315 + .../mobility-dcat-ap-core-distribution.xsl | 49 + .../mobility-dcat-ap-core.xsl | 119 + .../formatter/eu-dcat-ap-mobility/view.xsl | 23 + .../eu-dcat-ap/eu-dcat-ap-core-dataset.xsl | 302 + .../formatter/eu-dcat-ap/eu-dcat-ap-core.xsl | 150 + .../formatter/eu-dcat-ap/view.xsl | 28 + .../vocabularies/data-theme-skos.rdf | 546 ++ .../formatter/eu-geodcat-ap-semiceu/view.xsl | 83 + .../eu-geodcat-ap/eu-geodcat-ap-core.xsl | 237 + .../eu-geodcat-ap/eu-geodcat-ap-variables.xsl | 79 + .../formatter/eu-geodcat-ap/view.xsl | 22 + .../csw/{dcat-full.xsl => dcat-core.xsl} | 11 +- .../present/csw/{dcat-brief.xsl => dcat.xsl} | 0 .../present/csw/eu-dcat-ap-hvd.xsl | 27 + .../present/csw/eu-dcat-ap-mobility.xsl | 27 + .../present/csw/eu-dcat-ap.xsl | 27 + .../present/csw/eu-geodcat-ap-semiceu.xsl | 27 + .../present/csw/eu-geodcat-ap.xsl | 27 + .../resources/config-spring-geonetwork.xml | 15 + .../iso19139/formatter/dcat/dcat-utils.xsl | 31 + .../plugin/iso19139/formatter/dcat/view.xsl | 29 + .../formatter/eu-dcat-ap-hvd/view.xsl | 29 + .../iso19139/formatter/eu-dcat-ap/view.xsl | 30 + .../formatter/eu-geodcat-ap-semiceu/view.xsl | 4362 +++++++++ .../iso19139/formatter/eu-geodcat-ap/view.xsl | 29 + .../iso19139/present/csw/dcat-core.xsl} | 11 +- .../iso19139/present/csw/eu-dcat-ap-hvd.xsl | 27 + .../present/csw/eu-dcat-ap-mobility.xsl | 27 + .../iso19139/present/csw/eu-dcat-ap.xsl | 27 + .../present/csw/eu-geodcat-ap-semiceu.xsl | 27 + .../iso19139/present/csw/eu-geodcat-ap.xsl | 27 + .../resources/config-spring-geonetwork.xml | 15 + .../fao/geonet/kernel/schema/CSWPlugin.java | 2 +- .../geonet/kernel/schema/SchemaPlugin.java | 23 +- services/pom.xml | 10 +- .../api/records/formatters/FormatType.java | 17 + .../api/records/formatters/FormatterApi.java | 3 + .../FormatterAdminApiIntegrationTest.java | 4 +- .../records/formatters/FormatterApiTest.java | 259 +- .../iso19115-3.2018-dcat-dataset-core.rdf | 558 ++ .../iso19115-3.2018-dcat-dataset.xml | 1904 ++++ .../iso19115-3.2018-dcat-service-core.rdf | 386 + .../iso19115-3.2018-dcat-service.xml | 1728 ++++ ...core-multipleAccrualPeriodicityAllowed.rdf | 603 ++ ...so19115-3.2018-eu-dcat-ap-dataset-core.rdf | 594 ++ ...115-3.2018-eu-dcat-ap-hvd-dataset-core.rdf | 604 ++ ....2018-eu-dcat-ap-mobility-dataset-core.rdf | 598 ++ ...9115-3.2018-eu-geodcat-ap-dataset-core.rdf | 606 ++ .../mobilitydcat-ap_shacl_shapes.ttl | 411 + .../shacl/dcat-ap-2.1.1-base-SHACL.ttl | 7771 +++++++++++++++++ .../shacl/dcat-ap-hvd-2.2.0-SHACL.ttl | 712 ++ .../shacl/eu-dcat-ap-3.0.0/README.md | 1 + .../shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl | 123 + .../shacl/eu-dcat-ap-3.0.0/imports.ttl | 28 + .../mdr-vocabularies.shape.ttl | 440 + .../shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl | 29 + .../shacl/eu-dcat-ap-3.0.0/range.ttl | 449 + .../shacl/eu-dcat-ap-3.0.0/shapes.ttl | 746 ++ .../eu-dcat-ap-3.0.0/shapes_recommended.ttl | 336 + .../shacl/geodcat-ap-2.0.1-SHACL.ttl | 528 ++ .../templates/admin/settings/csw-test.html | 12 + 91 files changed, 36594 insertions(+), 109 deletions(-) create mode 100644 docs/manual/docs/api/img/dcat-in-download-menu.png create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-commons.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-access-and-use.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-associated.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalog.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalogrecord.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-contact.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataservice.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataset.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-distribution.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-keywords.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-lineage.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-resource.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-utils.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-variables.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/view.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/vocabularies/licences-skos.rdf create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/eu-dcat-ap-hvd-core.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/view.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/eu-applicable-legislation.rdf create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/high-value-dataset-category.rdf create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core-distribution.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/view.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core-dataset.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/view.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/vocabularies/data-theme-skos.rdf create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap-semiceu/view.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-core.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-variables.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/view.xsl rename schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/{dcat-full.xsl => dcat-core.xsl} (88%) rename schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/{dcat-brief.xsl => dcat.xsl} (100%) create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-hvd.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-mobility.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap-semiceu.xsl create mode 100644 schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/dcat-utils.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/view.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap-hvd/view.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap/view.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap-semiceu/view.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap/view.xsl rename schemas/{iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-summary.xsl => iso19139/src/main/plugin/iso19139/present/csw/dcat-core.xsl} (88%) create mode 100644 schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-hvd.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-mobility.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap-semiceu.xsl create mode 100644 schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap.xsl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset-core.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset.xml create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service-core.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service.xml create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core-multipleAccrualPeriodicityAllowed.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-hvd-dataset-core.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-mobility-dataset-core.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-geodcat-ap-dataset-core.rdf create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/mobilitydcat-ap_shacl_shapes.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-2.1.1-base-SHACL.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-hvd-2.2.0-SHACL.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/README.md create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/imports.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/range.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl create mode 100644 services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/geodcat-ap-2.0.1-SHACL.ttl diff --git a/core/src/main/java/org/fao/geonet/kernel/SchemaManager.java b/core/src/main/java/org/fao/geonet/kernel/SchemaManager.java index 4139d045ac5..18742c86494 100644 --- a/core/src/main/java/org/fao/geonet/kernel/SchemaManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/SchemaManager.java @@ -76,6 +76,7 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * Class that handles all functions relating to metadata schemas. This includes @@ -106,6 +107,7 @@ public class SchemaManager { private static int activeWriters = 0; private Map<String, Schema> hmSchemas = new HashMap<>(); private Map<String, Namespace> hmSchemasTypenames = new HashMap<>(); + private Map<String, String> cswOutputSchemas = new HashMap<>(); private String[] fnames = {"labels.xml", "codelists.xml", "strings.xml"}; private Path schemaPluginsDir; private Path schemaPluginsCat; @@ -958,6 +960,7 @@ private void addSchema(ApplicationContext applicationContext, Path schemaDir, El if (mds.getSchemaPlugin() != null && mds.getSchemaPlugin().getCswTypeNames() != null) { hmSchemasTypenames.putAll(mds.getSchemaPlugin().getCswTypeNames()); + cswOutputSchemas.putAll(mds.getSchemaPlugin().getOutputSchemas()); } // -- add cached xml files (schema codelists and label files) @@ -1925,17 +1928,17 @@ public Map<String, Namespace> getHmSchemasTypenames() { } /** - * Return the list of namespace URI of all typenames declared in all schema plugins. + * Return the list of outputSchema declared in all schema plugins. + */ + public Map<String, String> getOutputSchemas() { + return cswOutputSchemas; + } + + /** + * Return the list of namespace URI of all outputSchema declared in all schema plugins. */ public List<String> getListOfOutputSchemaURI() { - Iterator<String> iterator = hmSchemasTypenames.keySet().iterator(); - List<String> listOfSchemaURI = new ArrayList<>(); - while (iterator.hasNext()) { - String typeLocalName = iterator.next(); - Namespace ns = hmSchemasTypenames.get(typeLocalName); - listOfSchemaURI.add(ns.getURI()); - } - return listOfSchemaURI; + return new ArrayList<>(cswOutputSchemas.values()); } /** diff --git a/csw-server/src/main/java/org/fao/geonet/component/csw/GetCapabilities.java b/csw-server/src/main/java/org/fao/geonet/component/csw/GetCapabilities.java index 50f0a420200..72f0dc19c43 100644 --- a/csw-server/src/main/java/org/fao/geonet/component/csw/GetCapabilities.java +++ b/csw-server/src/main/java/org/fao/geonet/component/csw/GetCapabilities.java @@ -65,6 +65,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static org.fao.geonet.kernel.setting.SettingManager.isPortRequired; @@ -529,6 +530,8 @@ private void setOperationsParameters(Element capabilities) { */ private void populateTypeNameAndOutputSchema(Element op) { Map<String, Namespace> typenames = _schemaManager.getHmSchemasTypenames(); + List<String> outputSchemas = _schemaManager.getOutputSchemas().values().stream().sorted().collect(Collectors.toList()); + List<Element> operations = op.getChildren("Parameter", Csw.NAMESPACE_OWS); for (Element operation : operations) { if ("typeNames".equals(operation.getAttributeValue("name"))) { @@ -541,12 +544,10 @@ private void populateTypeNameAndOutputSchema(Element op) { .setText(typename)); } } else if ("outputSchema".equals(operation.getAttributeValue("name"))) { - for (Map.Entry<String, Namespace> entry : typenames.entrySet()) { - Namespace ns = entry.getValue(); - operation.addNamespaceDeclaration(ns); + outputSchemas.forEach(uri -> operation.addContent(new Element("Value", Csw.NAMESPACE_OWS) - .setText(ns.getURI())); - } + .setText(uri)) + ); } } } diff --git a/csw-server/src/main/java/org/fao/geonet/csw/common/OutputSchema.java b/csw-server/src/main/java/org/fao/geonet/csw/common/OutputSchema.java index 9b156b71541..c6d65519c47 100644 --- a/csw-server/src/main/java/org/fao/geonet/csw/common/OutputSchema.java +++ b/csw-server/src/main/java/org/fao/geonet/csw/common/OutputSchema.java @@ -78,16 +78,16 @@ public static String parse(String schema, SchemaManager schemaManager) throws In if (schema.equals("csw:IsoRecord")) return "gmd"; if (schema.equals("own")) return "own"; - Map<String, Namespace> typenames = schemaManager.getHmSchemasTypenames(); - for (Map.Entry<String, Namespace> entry : typenames.entrySet()) { - Namespace ns = entry.getValue(); - if (schema.equals(ns.getURI())) { - return ns.getPrefix(); + Map<String, String> typenames = schemaManager.getOutputSchemas(); + for (Map.Entry<String, String> entry : typenames.entrySet()) { + String ns = entry.getValue(); + if (schema.equals(ns)) { + return entry.getKey(); } } throw new InvalidParameterValueEx("outputSchema", - String.format("'%s' schema is not valid. Supported values are %s", + String.format("'%s' output schema is not valid. Supported values are %s", schema, schemaManager.getListOfOutputSchemaURI().toString())); } diff --git a/csw-server/src/main/java/org/fao/geonet/csw/common/util/Xml.java b/csw-server/src/main/java/org/fao/geonet/csw/common/util/Xml.java index 51bdeffe793..c5ab2c8053a 100644 --- a/csw-server/src/main/java/org/fao/geonet/csw/common/util/Xml.java +++ b/csw-server/src/main/java/org/fao/geonet/csw/common/util/Xml.java @@ -125,22 +125,24 @@ public static Element applyElementSetName(ServiceContext context, SchemaManager ResultType resultType, String id, String displayLanguage) throws InvalidParameterValueEx { Path schemaDir = schemaManager.getSchemaCSWPresentDir(schema); Path styleSheet = schemaDir.resolve(outputSchema + "-" + elementSetName + ".xsl"); + Path styleSheetWithoutElementSet = schemaDir.resolve(outputSchema + ".xsl"); - if (!Files.exists(styleSheet)) { + if (!Files.exists(styleSheet) && !Files.exists(styleSheetWithoutElementSet)) { throw new InvalidParameterValueEx("OutputSchema", String.format( - "OutputSchema '%s' not supported for metadata with '%s' (%s).\nCorresponding XSL transformation '%s' does not exist for this schema.\nThe record will not be returned in response.", - outputSchema, id, schema, styleSheet.getFileName())); + "OutputSchema '%s' not supported for metadata with '%s' (%s).\nCorresponding XSL transformation '%s' (or '%s') does not exist for this schema.\nThe record will not be returned in response.", + outputSchema, id, schema, styleSheet.getFileName(), styleSheetWithoutElementSet.getFileName())); } else { Map<String, Object> params = new HashMap<>(); params.put("lang", displayLanguage); + Path xslFile = Files.exists(styleSheet) ? styleSheet : styleSheetWithoutElementSet; try { - result = org.fao.geonet.utils.Xml.transform(result, styleSheet, params); + result = org.fao.geonet.utils.Xml.transform(result, xslFile, params); } catch (Exception e) { String msg = String.format( - "Error occured while transforming metadata with id '%s' using '%s'.", - id, styleSheet.getFileName()); + "Error occurred while transforming metadata with id '%s' using '%s'.", + id, xslFile.getFileName()); context.error(msg); context.error(" (C) StackTrace:\n" + Util.getStackTrace(e)); throw new InvalidParameterValueEx("OutputSchema", msg); diff --git a/docs/manual/docs/api/img/dcat-in-download-menu.png b/docs/manual/docs/api/img/dcat-in-download-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5de86b80f02f3f339f0a005059007da677926683 GIT binary patch literal 31560 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 Mt146T@#~NO2j*F4YXATM literal 0 HcmV?d00001 diff --git a/docs/manual/docs/api/rdf-dcat.md b/docs/manual/docs/api/rdf-dcat.md index bb2fa14fefc..c8d5d2c135a 100644 --- a/docs/manual/docs/api/rdf-dcat.md +++ b/docs/manual/docs/api/rdf-dcat.md @@ -1,24 +1,131 @@ -# RDF DCAT end point {#rdf-dcat} +# DCAT {#rdf-dcat} -!!! warning +The catalogue has the capability to convert ISO to DCAT format in various API endpoint. [The first implementation of DCAT output was done in 2012](https://trac.osgeo.org/geonetwork/wiki/proposals/DCATandRDFServices) and was targeting interaction with semantic service and semantic sitemap support. DCAT output was available using a service named `rdf.search`. This service was deprecated in version 4.0.0 in favor of producing DCAT output in the [Catalog Service for the Web (CSW)](csw.md) or using the formatters API. - Unavailable since version 4.0.0. - - There is no known sponsor or interested party for implementing RDF DCAT. - Interested parties may contact the project team for guidance and to express their intent. -The RDF DCAT end point provides a way of getting information about the catalog, the datasets and services, and links to distributed resources in a machine-readable format. The formats of the output are based on DCAT, an RDF vocabulary that is designed to facilitate interoperability between web-based data catalogs. +## Supported DCAT profiles -Reference: +A base conversion is provided with complementary extensions for various profiles of DCAT developed in Europe: -* [Data Catalog Vocabulary (DCAT)](https://www.w3.org/TR/vocab-dcat-3/) +* a default DCAT export following W3C standard https://www.w3.org/TR/vocab-dcat-3/ +* an extension for the European DCAT-AP https://semiceu.github.io/DCAT-AP/releases/3.0.0/ + * an extension for the European GeoDCAT-AP https://semiceu.github.io/GeoDCAT-AP/releases/ + * an extension for the European DCAT-AP-Mobility https://mobilitydcat-ap.github.io/mobilityDCAT-AP/releases/1.0.0/index.html + * an extension for the European DCAT-AP-HVD https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/ -## Upgrading from GeoNetwork 3.0 Guidance +The mapping is done from ISO19115-3 to DCAT*. An ISO19139 to ISO19115-3 conversion can be applied before if needed. -RDF DCAT API is no longer available. +[The SEMICeu XSLT conversion](https://github.com/SEMICeu/iso-19139-to-dcat-ap/blob/master/iso-19139-to-dcat-ap.xsl)) is also included with minor improvements. This conversion is from ISO19139 to RDF and if needed a conversion from ISO19115-3 is applied. -1. We recommend migrating to use of [Catalog Service for the Web (CSW)](csw.md) API to query and explore data. +## Usage in the formatters API -2. When downloading using `GetRecord` make use of the `application/rdf+xml; charset=UTF-8` output format. - - This will allow retrieving records in the same document format as previously provided by RDF DCAT api. +Each DCAT formats are available using a formatter eg. http://localhost:8080/geonetwork/srv/api/records/be44fe5a-65ca-4b70-9d29-ac5bf1f0ebc5/formatters/eu-dcat-ap?output=xml + +To add the formatter in the record view download list, the user interface configuration can be updated: + +![image](img/dcat-in-download-menu.png) + +```json +{ + "mods": { + "search": { + "downloadFormatter": [ + { + "label": "exportMEF", + "url": "/formatters/zip?withRelated=false", + "class": "fa-file-zip-o" + }, + { + "label": "exportPDF", + "url": "/formatters/xsl-view?output=pdf&language=${lang}", + "class": "fa-file-pdf-o" + }, + { + "label": "exportXML", + "url": "/formatters/xml", + "class": "fa-file-code-o" + }, + { + "label": "DCAT", + "url": "/formatters/dcat?output=xml" + }, + { + "label": "EU-DCAT-AP", + "url": "/formatters/eu-dcat-ap?output=xml" + }, + { + "label": "EU-GEO-DCAT-AP", + "url": "/formatters/eu-geodcat-ap?output=xml" + }, + { + "label": "EU-DCAT-AP-MOBILITY", + "url": "/formatters/eu-dcat-ap-mobility?output=xml" + }, + { + "label": "EU-DCAT-AP-HVD", + "url": "/formatters/eu-dcat-ap-hvd?output=xml" + } + ] +``` + + +## Usage in the CSW service + +All DCAT profiles are also accessible using CSW protocol. + +A `GetRecordById` operation can be used: http://localhost:8080/geonetwork/srv/eng/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&ID=da165110-88fd-11da-a88f-000d939bc5d8&outputSchema=https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/ and is equivalent to the API http://localhost:8080/geonetwork/srv/api/records/da165110-88fd-11da-a88f-000d939bc5d8/formatters/eu-dcat-ap-hvd?output=xml. + +A `GetRecords` operation can be used to retrieve a set of records: http://localhost:8080/geonetwork/srv/fre/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecords&outputSchema=http://data.europa.eu/930/&elementSetName=full&resultType=results&maxRecords=300 + +Use the `outputSchema` parameter to select the DCAT profile to use. The following values are supported: + +```xml +<ows:Parameter name="outputSchema"> + <ows:Value>http://data.europa.eu/930/</ows:Value> + <ows:Value>http://data.europa.eu/930/#semiceu</ows:Value> + <ows:Value>http://data.europa.eu/r5r/</ows:Value> + <ows:Value>http://standards.iso.org/iso/19115/-3/mdb/2.0</ows:Value> + <ows:Value>http://www.isotc211.org/2005/gfc</ows:Value> + <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value> + <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value> + <ows:Value>http://www.w3.org/ns/dcat#</ows:Value> + <ows:Value>http://www.w3.org/ns/dcat#core</ows:Value> + <ows:Value>https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/</ows:Value> + <ows:Value>https://w3id.org/mobilitydcat-ap</ows:Value> +``` + +Those values are listed in the `GetCapabilities` operation http://localhost:8080/geonetwork/srv/eng/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities. + +## Usage in OGC API Records + +For the time being, OGC API Records provides a simplified DCAT output (based on the index document). + +## DCAT validation + +The DCAT validation can be done using online validation tool: +* https://www.itb.ec.europa.eu/shacl/dcat-ap/upload + +Depending on the target DCAT profile to use, it may be required to build proper ISO template and metadata record containing all required fields. Usually profiles are adding constraints for usage of specific vocabularies and fields (eg. [for High Value datasets, specific vocabularies are defined for categories, license, applicable legislations, ...](https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/#controlled-vocabularies-to-be-used)). + + +## Mapping considerations + +The mapping is done from ISO19115-3 to DCAT. The mapping may not cover all usages and may be adapted. This can be done in the `iso19115-3.2018` schema plugin in the `formatter/dcat*` XSLT files. + +Some points under discussion are: +* Object vs Reference: + * Should we use object or reference for some fields (eg. contact, organisation, ...)? + * What should be the reference URI? + * Where is defined the reference URI in ISO? + +eg. for an organisation, the URI will be the first value in the following sequence: +```xml +(cit:partyIdentifier/*/mcc:code/*/text(), +cit:contactInfo/*/cit:onlineResource/*/cit:linkage/gco:CharacterString/text(), +cit:name/gcx:Anchor/@xlink:href, +@uuid)[1] +``` + +* No equivalent field in ISO (eg. Where to store `spdx:checksum` in ISO?) + +* Associated resources: Links between are not always bidirectional so using the associated API would allow to populate more relations. This is also mitigated with the complete RDF graph of the catalogue is retrieved providing relations from all records. diff --git a/pom.xml b/pom.xml index 3384985322c..288675c75e9 100644 --- a/pom.xml +++ b/pom.xml @@ -469,7 +469,7 @@ <groupId>org.apache.jena</groupId> <artifactId>apache-jena-libs</artifactId> <type>pom</type> - <version>3.17.0</version> + <version>4.10.0</version> </dependency> <!-- PDF stuff: Managed by Mapfish --> @@ -554,6 +554,11 @@ <artifactId>commons-email</artifactId> <version>1.5</version> </dependency> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>1.15</version> + </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>xmlgraphics-commons</artifactId> diff --git a/schemas/iso19110/src/main/resources/config-spring-geonetwork.xml b/schemas/iso19110/src/main/resources/config-spring-geonetwork.xml index 34d34f70574..f4356efcb55 100644 --- a/schemas/iso19110/src/main/resources/config-spring-geonetwork.xml +++ b/schemas/iso19110/src/main/resources/config-spring-geonetwork.xml @@ -31,6 +31,12 @@ <bean id="iso19110SchemaPlugin" class="org.fao.geonet.schema.iso19110.ISO19110SchemaPlugin"> + <property name="outputSchemas"> + <util:map key-type="java.lang.String" value-type="java.lang.String"> + <entry key="csw" value="http://www.opengis.net/cat/csw/2.0.2"/> + <entry key="gfc" value="http://www.isotc211.org/2005/gfc"/> + </util:map> + </property> <property name="xpathTitle"> <util:list value-type="java.lang.String"> <value>gmx:name/gco:CharacterString</value> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/fromISO19139.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/fromISO19139.xsl index e13c6942e8c..3d69ae90e8d 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/fromISO19139.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/convert/ISO19139/fromISO19139.xsl @@ -98,7 +98,7 @@ <xsl:variable name="stylesheetVersion" select="'0.1'"/> - <xsl:template match="/"> + <xsl:template match="/" name="to-iso19115-3"> <!-- root element (MD_Metadata or MI_Metadata) --> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-commons.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-commons.xsl new file mode 100644 index 00000000000..5c3ea377e0e --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-commons.xsl @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:locn="http://www.w3.org/ns/locn#" + xmlns:dcat="http://www.w3.org/ns/dcat#" + exclude-result-prefixes="#all"> + + <xsl:output method="xml" + indent="yes" + encoding="utf-8" + cdata-section-elements="locn:geometry dcat:bbox"/> + + <xsl:template name="create-namespaces"> + <xsl:namespace name="rdf" select="'http://www.w3.org/1999/02/22-rdf-syntax-ns#'"/> + <xsl:namespace name="rdfs" select="'http://www.w3.org/2000/01/rdf-schema#'"/> + <xsl:namespace name="owl" select="'http://www.w3.org/2002/07/owl#'"/> + <xsl:namespace name="dct" select="'http://purl.org/dc/terms/'"/> + <xsl:namespace name="dcat" select="'http://www.w3.org/ns/dcat#'"/> + <xsl:namespace name="foaf" select="'http://xmlns.com/foaf/0.1/'"/> + <xsl:namespace name="vcard" select="'http://www.w3.org/2006/vcard/ns#'"/> + <xsl:namespace name="prov" select="'http://www.w3.org/ns/prov#'"/> + <xsl:namespace name="org" select="'http://www.w3.org/ns/org#'"/> + <xsl:namespace name="pav" select="'http://purl.org/pav/'"/> + <xsl:namespace name="adms" select="'http://www.w3.org/ns/adms#'"/> + <xsl:namespace name="skos" select="'http://www.w3.org/2004/02/skos/core#'"/> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-access-and-use.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-access-and-use.xsl new file mode 100644 index 00000000000..d86da928861 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-access-and-use.xsl @@ -0,0 +1,145 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:dqm="http://standards.iso.org/iso/19157/-2/dqm/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" + xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:reg="http://standards.iso.org/iso/19115/-3/reg/1.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" + xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.1" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:gml="http://www.opengis.net/gml/3.2" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:owl="http://www.w3.org/2002/07/owl#" + xmlns:dct="http://purl.org/dc/terms/" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + exclude-result-prefixes="#all"> + + <xsl:variable name="euLicenses" + select="document('vocabularies/licences-skos.rdf')"/> + + <xsl:variable name="isMappingResourceConstraintsToEuVocabulary" + as="xs:boolean" + select="false()"/> + + <!-- + RDF Property: dcterms:accessRights + Definition: Information about who can access the resource or an indication of its security status. + Range: dcterms:RightsStatement + = First constraints of mdb:identificationInfo/*/mri:resourceConstraints/*[mco:accessConstraints] (then dct:rights) + + RDF Property: dcterms:license + Definition: A legal document under which the resource is made available. + Range: dcterms:LicenseDocument + Usage note: Information about licenses and rights MAY be provided for the Resource. See also guidance at 9. License and rights statements. + = First useLimitation or constraints of mdb:identificationInfo/*/mri:resourceConstraints/*[mco:useConstraints] (then dct:rights) + + RDF Property: dcterms:rights + Definition: A statement that concerns all rights not addressed with dcterms:license or dcterms:accessRights, such as copyright statements. + Range: dcterms:RightsStatement + Usage note: Information about licenses and rights MAY be provided for the Resource. See also guidance at 9. License and rights statements. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:resourceConstraints/*"> + <xsl:if test="count(../preceding-sibling::mri:resourceConstraints/*) = 0"> + <xsl:for-each select="../../mri:resourceConstraints/*[mco:accessConstraints]/mco:otherConstraints"> + <xsl:if test="position() = 1 or ($isPreservingAllResourceConstraints and position() > 1)"> + <xsl:element name="{if (position() = 1) then 'dct:accessRights' else 'dct:rights'}"> + <dct:RightsStatement> + <xsl:choose> + <xsl:when test="gcx:Anchor/@xlink:href"> + <xsl:attribute name="rdf:about" select="gcx:Anchor/@xlink:href"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'dct:description'"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </dct:RightsStatement> + </xsl:element> + </xsl:if> + </xsl:for-each> + + <xsl:variable name="useConstraints" + as="node()*"> + <xsl:copy-of select="../../mri:resourceConstraints/*[mco:useConstraints]/mco:otherConstraints"/> + <xsl:copy-of select="../../mri:resourceConstraints/*[mco:useConstraints]/mco:useLimitation"/> + </xsl:variable> + + <xsl:variable name="licensesAndRights" as="node()*"> + <xsl:for-each select="$useConstraints"> + + <xsl:variable name="httpUriInAnchorOrText" + select="(gcx:Anchor/@xlink:href[starts-with(., 'http')] + |gco:CharacterString[starts-with(., 'http')])[1]"/> + + <xsl:choose> + <xsl:when test="$httpUriInAnchorOrText != '' and $isMappingResourceConstraintsToEuVocabulary = true()"> + <xsl:variable name="licenseUriWithoutHttp" + select="replace($httpUriInAnchorOrText,'https?://','')"/> + <xsl:variable name="euDcatLicense" + select="$euLicenses/rdf:RDF/skos:Concept[ + matches(skos:exactMatch/@rdf:resource, + concat('https?://', $licenseUriWithoutHttp, '/?'))]"/> + + <xsl:if test="$euDcatLicense != ''"> + <dct:license> + <dct:LicenseDocument rdf:about="{$euDcatLicense/@rdf:about}"> + <!--<xsl:copy-of select="$euDcatLicense/(skos:prefLabel[@xml:lang = $languages/@iso2code] + |skos:exactMatch)" + copy-namespaces="no"/>--> + </dct:LicenseDocument> + </dct:license> + </xsl:if> + </xsl:when> + <xsl:when test="$httpUriInAnchorOrText != ''"> + <dct:license> + <dct:LicenseDocument rdf:about="{$httpUriInAnchorOrText}"/> + </dct:license> + </xsl:when> + <xsl:otherwise> + <dct:rights> + <dct:RightsStatement> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'dct:description'"/> + </xsl:call-template> + </dct:RightsStatement> + </dct:rights> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </xsl:variable> + + <xsl:copy-of select="$licensesAndRights"/> + </xsl:if> + </xsl:template> + + + + <!-- + RDF Property: odrl:hasPolicy + Definition: An ODRL conformant policy expressing the rights associated with the resource. + Range: odrl:Policy + Usage note: Information about rights expressed as an ODRL policy [ODRL-MODEL] using the ODRL vocabulary [ODRL-VOCAB] MAY be provided for the resource. See also guidance at 9. License and rights statements. + https://www.w3.org/TR/odrl-model/00Model.png + + TODO + --> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-associated.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-associated.xsl new file mode 100644 index 00000000000..ea2a5d1f2a0 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-associated.xsl @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:pav="http://purl.org/pav/" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + + <!-- TODO: either we only use the associated records in the current record + either we get all associated records using the API? + we may also have limitation depending on user privileges.--> + + <xsl:variable name="isoAssociatedTypesToDcatCommonNames" + as="node()*"> + <entry associationType="crossReference" initiativeType="collection">dct:isPartOf</entry> + <entry associationType="partOfSeamlessDatabase">dct:isPartOf</entry> + <entry associationType="series">dct:isPartOf</entry> + <!-- TO DISCUSS: Should we use dcat:inSeries instead of isPartOf --> + <entry associationType="crossReference">dct:references</entry> + <entry associationType="isComposedOf">dct:hasPart</entry> + <!-- <entry associationType="revisionOf">dct:isVersionOf</entry>--> + <entry associationType="revisionOf">pav:previousVersion</entry> + <!-- Others are dct:relation --> + </xsl:variable> + + <!-- + RDF Property: dcterms:relation (Fallback) + Definition: A resource with an unspecified relationship to the cataloged resource. + Usage note: dcterms:relation SHOULD be used where the nature of the relationship between a cataloged resource and related resources is not known. A more specific sub-property SHOULD be used if the nature of the relationship of the link is known. The property dcat:distribution SHOULD be used to link from a dcat:Dataset to a representation of the dataset, described as a dcat:Distribution + See also: Sub-properties of dcterms:relation in particular dcat:distribution, dcterms:hasPart, (and its sub-properties dcat:catalog, dcat:dataset, dcat:service ), dcterms:isPartOf, dcterms:conformsTo, dcterms:isFormatOf, dcterms:hasFormat, dcterms:isVersionOf, dcterms:hasVersion (and its sub-property dcat:hasVersion ), dcterms:replaces, dcterms:isReplacedBy, dcterms:references, dcterms:isReferencedBy, dcterms:requires, dcterms:isRequiredBy + _____________________________ + RDF Property: dcterms:hasPart (Supported) + Definition: A related resource that is included either physically or logically in the described resource. + _____________________________ + RDF Property: dcterms:isReferencedBy (Not supported) + Definition: A related resource, such as a publication, that references, cites, or otherwise points to the cataloged resource. + Usage note: In relation to the use case of data citation, when the cataloged resource is a dataset, the dcterms:isReferencedBy property allows to relate the dataset to the resources (such as scholarly publications) that cite or point to the dataset. Multiple dcterms:isReferencedBy properties can be used to indicate the dataset has been referenced by multiple publications, or other resources. + Usage note: This property is used to associate a resource with the resource (of type dcat:Resource) in question. For other relations to resources not covered with this property, the more generic property dcat:qualifiedRelation can be used. See also 15. Qualified relations. + _____________________________ + RDF Property: dcat:previousVersion (Supported) + Definition: The previous version of a resource in a lineage [PAV]. + Equivalent property: pav:previousVersion + Sub-property of: prov:wasRevisionOf + Usage note: + This property is meant to be used to specify a version chain, consisting of snapshots of a resource. + + The notion of version used by this property is limited to versions resulting from revisions occurring to a resource as part of its life-cycle. One of the typical cases here is representing the history of the versions of a dataset that have been released over time. + _____________________________ + RDF Property: dcterms:replaces (Not supported - same as previous version?) + Definition: A related resource that is supplanted, displaced, or superseded by the described resource [DCTERMS]. + Sub-property of: dcterms:relation + _____________________________ + RDF Property: dcat:hasVersion (Not supported) + Definition: This resource has a more specific, versioned resource [PAV]. + Equivalent property: pav:hasVersion + Sub-property of: dcterms:hasVersion + Sub-property of: prov:generalizationOf + Usage note: + This property is intended for relating a non-versioned or abstract resource to several versioned resources, e.g., snapshots [PAV]. + + The notion of version used by this property is limited to versions resulting from revisions occurring to a resource as part of its life-cycle. Therefore, its semantics is more specific than its super-property dcterms:hasVersion, which makes use of a broader notion of version, including editions and adaptations. + _____________________________ + RDF Property: dcat:hasCurrentVersion (Not supported - could be in a series, the not superseeded record) + Definition: This resource has a more specific, versioned resource with equivalent content [PAV]. + Equivalent property: pav:hasCurrentVersion + Sub-property of: pav:hasVersion + _____________________________ + RDF Property: dcat:first (Not supported) + Definition: The first resource in an ordered collection or series of resources, to which the current resource belongs. + Sub-property of: xhv:first + + RDF Property: dcat:last (Not supported) + Definition: The last resource in an ordered collection or series of resources, to which the current resource belongs. + Sub-property of: xhv:last + + RDF Property: dcat:prev (Not supported) + Definition: The previous resource (before the current one) in an ordered collection or series of resources. + Sub-property of: xhv:prev + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:associatedResource"> + <xsl:variable name="associationType" + select="*/mri:associationType/*/@codeListValue"/> + <xsl:variable name="initiativeType" + select="*/mri:initiativeType/*/@codeListValue"/> + <xsl:variable name="dcTypeForAssociationAndInitiative" + as="xs:string?" + select="$isoAssociatedTypesToDcatCommonNames[@associationType = $associationType and @initiativeType = $initiativeType]/text()"/> + <xsl:variable name="dcTypeForAssociation" + as="xs:string?" + select="$isoAssociatedTypesToDcatCommonNames[@associationType = $associationType and not(@initiativeType)]/text()"/> + <xsl:variable name="elementType" + as="xs:string" + select="if ($dcTypeForAssociationAndInitiative) + then $dcTypeForAssociationAndInitiative + else if ($dcTypeForAssociation) + then $dcTypeForAssociation + else 'dct:relation'"/> + + <xsl:element name="{$elementType}"> + <xsl:apply-templates mode="rdf-object-ref-attribute" + select="*/mri:metadataReference|*/mri:aggregateDataSetIdentifier"> + <xsl:with-param name="isAbout" select="false()"/> + </xsl:apply-templates> + </xsl:element> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalog.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalog.xsl new file mode 100644 index 00000000000..230a1f7947f --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalog.xsl @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:dqm="http://standards.iso.org/iso/19157/-2/dqm/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" + xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:reg="http://standards.iso.org/iso/19115/-3/reg/1.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" + xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.1" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:gml="http://www.opengis.net/gml/3.2" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalogrecord.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalogrecord.xsl new file mode 100644 index 00000000000..eb750e6c665 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-catalogrecord.xsl @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:gn-fn-dcat="http://geonetwork-opensource.org/xsl/functions/dcat" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + + <!-- Create CatalogueRecord --> + <xsl:template mode="iso19115-3-to-dcat-catalog-record" + name="iso19115-3-to-dcat-catalog-record" + match="mdb:MD_Metadata"> + <xsl:param name="additionalProperties" + as="node()*"/> + <xsl:variable name="properties" as="node()*"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="mdb:metadataIdentifier + |mdb:identificationInfo/*/mri:citation/*/cit:title + |mdb:identificationInfo/*/mri:abstract + |mdb:dateInfo/*[cit:dateType/*/@codeListValue = 'creation']/cit:date + |mdb:dateInfo/*[cit:dateType/*/@codeListValue = 'revision']/cit:date"/> + <xsl:copy-of select="$additionalProperties"/> + </xsl:variable> + + <xsl:call-template name="rdf-build-catalogue-record"> + <xsl:with-param name="properties" select="$properties"/> + <xsl:with-param name="metadata" select="."/> + </xsl:call-template> + </xsl:template> + + + <xsl:template name="rdf-build-catalogue-record"> + <xsl:param name="properties" + as="node()*"/> + <xsl:param name="metadata" + as="node()"/> + + <foaf:isPrimaryTopicOf> + <rdf:Description> + <rdf:type rdf:resource="http://www.w3.org/ns/dcat#CatalogRecord"/> + <xsl:copy-of select="$properties"/> + <foaf:primaryTopic rdf:resource="{gn-fn-dcat:getRecordUri($metadata)}"/> + </rdf:Description> + </foaf:isPrimaryTopicOf> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-contact.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-contact.xsl new file mode 100644 index 00000000000..f39ad713e69 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-contact.xsl @@ -0,0 +1,247 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:prov="http://www.w3.org/ns/prov#" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:geodcatap="http://data.europa.eu/930/" + xmlns:dct="http://purl.org/dc/terms/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + xmlns:vcard="http://www.w3.org/2006/vcard/ns#" + xmlns:org="http://www.w3.org/ns/org#" + xmlns:gn-fn-dcat="http://geonetwork-opensource.org/xsl/functions/dcat" + exclude-result-prefixes="#all"> + + <!-- + RDF Property: dcat:contactPoint + Definition: Relevant contact information for the cataloged resource. Use of vCard is recommended [VCARD-RDF]. + Range: vcard:Kind + + RDF Property: dcterms:creator + Definition: The entity responsible for producing the resource. + Range: foaf:Agent + Usage note: Resources of type foaf:Agent are recommended as values for this property. + + RDF Property: dcterms:publisher + Definition: The entity responsible for making the resource available. + Usage note: Resources of type foaf:Agent are recommended as values for this property. + --> + <xsl:template mode="iso19115-3-to-dcat" + name="iso19115-3-to-dcat-agent" + match="*[cit:CI_Responsibility]"> + <xsl:variable name="role" + as="xs:string?" + select="*/cit:role/*/@codeListValue"/> + <xsl:variable name="dcatElementConfig" + as="node()?" + select="$isoContactRoleToDcatCommonNames[. = $role]"/> + + <xsl:variable name="allIndividualOrOrganisationWithoutIndividual" + select="*/cit:party//(cit:CI_Organisation[not(cit:individual)]|cit:CI_Individual)" + as="node()*"/> + + <xsl:choose> + <xsl:when test="$dcatElementConfig"> + <xsl:for-each-group select="$allIndividualOrOrganisationWithoutIndividual" group-by="cit:name"> + <xsl:element name="{$dcatElementConfig/@key}"> + <xsl:choose> + <xsl:when test="$dcatElementConfig/@as = 'vcard'"> + <xsl:call-template name="rdf-contact-vcard"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="rdf-contact-foaf"/> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:for-each-group> + </xsl:when> + <xsl:otherwise> + <!-- + RDF Property: prov:qualifiedAttribution + Definition: Link to an Agent having some form of responsibility for the resource + Sub-property of: prov:qualifiedInfluence + Domain: prov:Entity + Range: prov:Attribution + Usage note: Used to link to an Agent where the nature of the relationship is known but does not match one of the standard [DCTERMS] properties (dcterms:creator, dcterms:publisher). Use dcat:hadRole on the prov:Attribution to capture the responsibility of the Agent with respect to the Resource. See 15.1 Relationships between datasets and agents for usage examples. + --> + <xsl:for-each-group select="$allIndividualOrOrganisationWithoutIndividual" group-by="cit:name"> + <prov:qualifiedAttribution> + <prov:Attribution> + <prov:agent> + <xsl:call-template name="rdf-contact-foaf"/> + </prov:agent> + <dcat:hadRole> + <dcat:Role rdf:about="{concat($isoCodeListBaseUri, $role)}"> + <!-- + Property needs to have at least 1 value + Location: + [Focus node] - [http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#custodian] - + [Result path] - [http://www.w3.org/2004/02/skos/core#prefLabel] + --> + <skos:prefLabel><xsl:value-of select="$role"/></skos:prefLabel> + </dcat:Role> + </dcat:hadRole> + </prov:Attribution> + </prov:qualifiedAttribution> + </xsl:for-each-group> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + + <xsl:template name="rdf-contact-vcard"> + <xsl:variable name="isindividual" + as="xs:boolean" + select="local-name() = 'CI_Individual'"/> + <xsl:variable name="individualName" + as="xs:string?" + select="if ($isindividual) then cit:name/*/text() else ''"/> + <xsl:variable name="organisation" + as="node()?" + select="if ($isindividual) then ancestor::cit:CI_Organisation else ."/> + + <rdf:Description> + <xsl:call-template name="rdf-object-ref-attribute"/> + + <rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Organization"/> + <xsl:if test="$individualName != ''"> + <vcard:fn><xsl:value-of select="$individualName"/></vcard:fn> + </xsl:if> + <xsl:for-each select="$organisation/cit:name"> + <vcard:org> + <rdf:Description> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'vcard:organisation-name'"/> + </xsl:call-template> + </rdf:Description> + </vcard:org> + </xsl:for-each> + + + <xsl:variable name="contactInfo" + as="node()?" + select="if ($isindividual) + then $organisation/cit:contactInfo + else cit:contactInfo"/> + + <!-- Priority on the individual email and fallback on org email--> + <xsl:for-each select="(cit:contactInfo/*/cit:address/*/cit:electronicMailAddress, $organisation/cit:contactInfo/*/cit:address/*/cit:electronicMailAddress)[1]"> + <vcard:hasEmail rdf:resource="mailto:{*/text()}"/> + </xsl:for-each> + + <xsl:for-each select="$contactInfo/*/cit:address"> + <xsl:if test="normalize-space(*/cit:city) != ''"> + <vcard:hasAddress> + <vcard:Address> + <xsl:for-each select="*/cit:country"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'vcard:country-name'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:for-each select="*/cit:city"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'vcard:locality'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:for-each select="*/cit:postalCode"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'vcard:postal-code'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:for-each select="*/cit:administrativeArea"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'vcard:region'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:for-each select="*/cit:deliveryPoint"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'vcard:street-address'"/> + </xsl:call-template> + </xsl:for-each> + </vcard:Address> + </vcard:hasAddress> + </xsl:if> + </xsl:for-each> + </rdf:Description> + </xsl:template> + + + <xsl:template name="rdf-contact-foaf"> + <xsl:variable name="isindividual" + as="xs:boolean" + select="local-name() = 'CI_Individual'"/> + <xsl:variable name="individualName" + as="xs:string?" + select="if ($isindividual) then cit:name/*/text() else ''"/> + <xsl:variable name="organisation" + as="node()?" + select="if ($isindividual) then ancestor::cit:CI_Organisation else ."/> + <xsl:variable name="orgReference" + as="xs:string?" + select="gn-fn-dcat:rdf-object-ref($organisation)"/> + <xsl:variable name="reference" + as="xs:string?" + select="if ($isindividual) + then gn-fn-dcat:rdf-object-ref(.) + else $orgReference"/> + + <rdf:Description> + <xsl:call-template name="rdf-object-ref-attribute"> + <xsl:with-param name="reference" select="$reference"/> + </xsl:call-template> + <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/{if ($isindividual) then 'Person' else 'Organization'}"/> + <rdf:type rdf:resource="http://www.w3.org/ns/prov#Agent"/> + + <xsl:choose> + <xsl:when test="$isindividual"> + <foaf:name><xsl:value-of select="$individualName"/></foaf:name> + <org:memberOf> + <xsl:for-each select="$organisation/cit:name"> + <foaf:Organization> + <xsl:call-template name="rdf-object-ref-attribute"> + <xsl:with-param name="reference" select="$reference"/> + </xsl:call-template> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'foaf:name'"/> + </xsl:call-template> + </foaf:Organization> + </xsl:for-each> + </org:memberOf> + </xsl:when> + <xsl:otherwise> + <xsl:for-each select="$organisation/cit:name"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'foaf:name'"/> + </xsl:call-template> + </xsl:for-each> + </xsl:otherwise> + </xsl:choose> + + <xsl:variable name="contactInfo" + as="node()?" + select="if ($isindividual) + then $organisation/cit:contactInfo + else cit:contactInfo"/> + + <!-- Priority on the individual email and fallback on org email--> + <xsl:for-each select="(cit:contactInfo/*/cit:address/*/cit:electronicMailAddress, $organisation/*/cit:address/*/cit:electronicMailAddress)[1]"> + <foaf:mbox rdf:resource="mailto:{*/text()}"/> + </xsl:for-each> + <xsl:for-each select="$contactInfo/*/cit:onlineResource/*/cit:linkage"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'foaf:workplaceHomepage'"/> + </xsl:call-template> + </xsl:for-each> + <!-- TODO: map other properties --> + </rdf:Description> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataservice.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataservice.xsl new file mode 100644 index 00000000000..c1daa81c24a --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataservice.xsl @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.1" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + exclude-result-prefixes="#all"> + + <xsl:variable name="endpointDescriptionProtocols" + as="xs:string*" + select="('OpenAPI', 'GetCapabilities')"/> + <!-- + RDF Property: dcat:endpointURL + Definition: The root location or primary endpoint of the service (a Web-resolvable IRI). + Domain: dcat:DataService + Range: rdfs:Resource + --> + <xsl:template mode="iso19115-3-to-dcat" + match="srv:containsOperations/*/srv:connectPoint/*[not(cit:protocol/*/text() = $endpointDescriptionProtocols)]/cit:linkage"> + <dcat:endpointURL rdf:resource="{normalize-space(gco:CharacterString/text())}"/> + </xsl:template> + + + <!-- + RDF Property: dcat:endpointDescription + Definition: A description of the services available via the end-points, including their operations, parameters etc. + Domain: dcat:DataService + Range: rdfs:Resource + Usage note: The endpoint description gives specific details of the actual endpoint instances, while dcterms:conformsTo is used to indicate the general standard or specification that the endpoints implement. + Usage note: An endpoint description may be expressed in a machine-readable form, such as an OpenAPI (Swagger) description [OpenAPI], an OGC GetCapabilities response [WFS], [ISO-19142], [WMS], [ISO-19128], a SPARQL Service Description [SPARQL11-SERVICE-DESCRIPTION], an [OpenSearch] or [WSDL20] document, a Hydra API description [HYDRA], else in text or some other informal mode if a formal representation is not possible. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="srv:containsOperations/*/srv:connectPoint/*[cit:protocol/*/text() = $endpointDescriptionProtocols]/cit:linkage"> + <dcat:endpointDescription rdf:resource="{normalize-space(gco:CharacterString/text())}"/> + </xsl:template> + + <!-- + RDF Property: dcat:servesDataset + Definition: A collection of data that this data service can distribute. + Range: dcat:Dataset + --> + <xsl:template mode="iso19115-3-to-dcat" + match="srv:operatesOn"> + <dcat:servesDataset> + <dcat:Dataset rdf:about="{if (@xlink:href) then @xlink:href else @uriref}"/> + </dcat:servesDataset> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataset.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataset.xsl new file mode 100644 index 00000000000..501b4bc4a1e --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-dataset.xsl @@ -0,0 +1,409 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:gml="http://www.opengis.net/gml/3.2" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:dct="http://purl.org/dc/terms/" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + exclude-result-prefixes="#all"> + + <xsl:import href="dcat-variables.xsl"/> + + <xsl:variable name="unitConversionFactorForMeter" + as="node()*"> + <unit id="m">1</unit> + <unit id="km">1000</unit> + <unit id="cm">.01</unit> + <unit id="ft">0.3048</unit> + </xsl:variable> + + <xsl:variable name="unitCodes" + as="node()*"> + <unit id="m">meter</unit> + <unit id="m">EPSG::9001</unit> + <unit id="m">urn:ogc:def:uom:EPSG::9001</unit> + <unit id="m">urn:ogc:def:uom:UCUM::m</unit> + <unit id="m">urn:ogc:def:uom:OGC::m</unit> + <unit id="ft">feet</unit> + <unit id="ft">EPSG::9002</unit> + <unit id="ft">urn:ogc:def:uom:EPSG::9002</unit> + <unit id="ft">urn:ogc:def:uom:UCUM::[ft_i]</unit> + <unit id="ft">urn:ogc:def:uom:OGC::[ft_i]</unit> + <unit id="km">kilometer</unit> + <unit id="cm">centimeter</unit> + </xsl:variable> + + <xsl:variable name="isoUnitCodelistBaseUri" + as="xs:string" + select="'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/uom/ML_gmxUom.xml#'"/> + <!-- + RDF Property: dcat:spatialResolutionInMeters + Definition: Minimum spatial separation resolvable in a dataset, measured in meters. + Range: rdfs:Literal typed as xsd:decimal + Usage note: If the dataset is an image or grid this should correspond to the spacing of items. + For other kinds of spatial datasets, this property will usually indicate the smallest distance between items in the dataset. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:spatialResolution/*/mri:distance"> + <xsl:variable name="unitId" + as="xs:string?" + select="if (starts-with(*/@uom, $isoUnitCodelistBaseUri)) + then substring-after(*/@uom, $isoUnitCodelistBaseUri) + else */@uom"/> + + <xsl:variable name="knownCode" + as="xs:string?" + select="$unitCodes[text() = $unitId]/@id"/> + + <xsl:variable name="unit" as="xs:string?" + select="if ($knownCode) then $knownCode else */@uom"/> + + <xsl:variable name="conversionFactor" + as="xs:decimal?" + select="$unitConversionFactorForMeter[@id = $unit]/text()"/> + + <xsl:choose> + <xsl:when test="($conversionFactor) + and */text() castable as xs:decimal"> + <dcat:spatialResolutionInMeters rdf:datatype="http://www.w3.org/2001/XMLSchema#decimal"> + <xsl:value-of select="xs:decimal(.) * $conversionFactor"/> + </dcat:spatialResolutionInMeters> + </xsl:when> + <xsl:otherwise> + <xsl:comment>WARNING: Spatial resolution only supported in meters. + <xsl:value-of select="concat(*/text(), ' ', */@uom)"/> is ignored (can be related to unknown unit or no + conversion factor or not a decimal value). + </xsl:comment> + </xsl:otherwise> + </xsl:choose> + + <!-- TODO: GeoDCAT-AP + <dqv:hasQualityMeasurement> + <dqv:QualityMeasurement> + <dqv:isMeasurementOf> + <dqv:Metric rdf:about="{$geodcatap}spatialResolutionAsDistance"/> + </dqv:isMeasurementOf> + <dqv:value rdf:datatype="{$xsd}decimal"><xsl:value-of select="."/></dqv:value> + <sdmx-attribute:unitMeasure rdf:resource="{$uom-km}"/> + </dqv:QualityMeasurement> + </dqv:hasQualityMeasurement> + --> + + </xsl:template> + + + <!-- + RDF Property: dcterms:accrualPeriodicity + Definition: The frequency at which a dataset is published. + Range: dcterms:Frequency (A rate at which something recurs) + Usage note: The value of dcterms:accrualPeriodicity gives the rate at which the dataset-as-a-whole is updated. This may be complemented by dcat:temporalResolution to give the time between collected data points in a time series. + + Cardinality: + * ISO 0..n + * DCAT 0..n + * DCAT-AP 0..1 + * Mobility DCAT 1..1 (in ISO either use corresponding period eg. P0Y0M0DT1H0M0S or extend the codelist with the proper vocabulary) + + accrualPeriodicity mapping done using the ISO to Dublin core value mapping + but additional checks are done when ISO records extended the codelist and + may used the EU Publication Office frequency codes + or the Mobility DCAT-AP update frequency codes. + Domain specific codelists take priority over the DC or ISO codelists. + + eg. + <mmi:MD_MaintenanceFrequencyCode codeListValue="15min"/> + + multipleAccrualPeriodicityAllowed is a parameter that can be set to true to allow multiple accrualPeriodicity values. + Default to false for EU formatters. true for DCAT. + --> + <xsl:variable name="isoFrequencyToDublinCore" + as="node()*"> + <entry key="continual">CONT</entry> + <entry key="daily">DAILY</entry> + <entry key="weekly">WEEKLY</entry> + <entry key="fortnightly">BIWEEKLY</entry> + <entry key="monthly">MONTHLY</entry> + <entry key="quarterly">QUARTERLY</entry> + <entry key="biannually">ANNUAL_2</entry> + <entry key="annually">ANNUAL</entry> + <entry key="irregular">IRREG</entry> + <entry key="unknown">UNKNOWN</entry> + <!-- + <entry key="asNeeded"></entry> + <entry key="notPlanned"></entry> + --> + </xsl:variable> + + + <!-- + http://publications.europa.eu/resource/authority/frequency + --> + <xsl:variable name="euUpdateFrquencyToUri" as="node()*"> + <entry key="BIDECENNIAL">http://publications.europa.eu/resource/authority/frequency/BIDECENNIAL</entry> + <entry key="TRIDECENNIAL">http://publications.europa.eu/resource/authority/frequency/TRIDECENNIAL</entry> + <entry key="BIHOURLY">http://publications.europa.eu/resource/authority/frequency/BIHOURLY</entry> + <entry key="TRIHOURLY">http://publications.europa.eu/resource/authority/frequency/TRIHOURLY</entry> + <entry key="OTHER">http://publications.europa.eu/resource/authority/frequency/OTHER</entry> + <entry key="WEEKLY">http://publications.europa.eu/resource/authority/frequency/WEEKLY</entry> + <entry key="NOT_PLANNED">http://publications.europa.eu/resource/authority/frequency/NOT_PLANNED</entry> + <entry key="AS_NEEDED">http://publications.europa.eu/resource/authority/frequency/AS_NEEDED</entry> + <entry key="HOURLY">http://publications.europa.eu/resource/authority/frequency/HOURLY</entry> + <entry key="QUADRENNIAL">http://publications.europa.eu/resource/authority/frequency/QUADRENNIAL</entry> + <entry key="QUINQUENNIAL">http://publications.europa.eu/resource/authority/frequency/QUINQUENNIAL</entry> + <entry key="DECENNIAL">http://publications.europa.eu/resource/authority/frequency/DECENNIAL</entry> + <entry key="WEEKLY_2">http://publications.europa.eu/resource/authority/frequency/WEEKLY_2</entry> + <entry key="WEEKLY_3">http://publications.europa.eu/resource/authority/frequency/WEEKLY_3</entry> + <entry key="UNKNOWN">http://publications.europa.eu/resource/authority/frequency/UNKNOWN</entry> + <entry key="UPDATE_CONT">http://publications.europa.eu/resource/authority/frequency/UPDATE_CONT</entry> + <entry key="QUARTERLY">http://publications.europa.eu/resource/authority/frequency/QUARTERLY</entry> + <entry key="TRIENNIAL">http://publications.europa.eu/resource/authority/frequency/TRIENNIAL</entry> + <entry key="NEVER">http://publications.europa.eu/resource/authority/frequency/NEVER</entry> + <entry key="OP_DATPRO">http://publications.europa.eu/resource/authority/frequency/OP_DATPRO</entry> + <entry key="MONTHLY_2">http://publications.europa.eu/resource/authority/frequency/MONTHLY_2</entry> + <entry key="MONTHLY_3">http://publications.europa.eu/resource/authority/frequency/MONTHLY_3</entry> + <entry key="IRREG">http://publications.europa.eu/resource/authority/frequency/IRREG</entry> + <entry key="MONTHLY">http://publications.europa.eu/resource/authority/frequency/MONTHLY</entry> + <entry key="DAILY">http://publications.europa.eu/resource/authority/frequency/DAILY</entry> + <entry key="DAILY_2">http://publications.europa.eu/resource/authority/frequency/DAILY_2</entry> + <entry key="BIWEEKLY">http://publications.europa.eu/resource/authority/frequency/BIWEEKLY</entry> + <entry key="CONT">http://publications.europa.eu/resource/authority/frequency/CONT</entry> + <entry key="BIENNIAL">http://publications.europa.eu/resource/authority/frequency/BIENNIAL</entry> + <entry key="BIMONTHLY">http://publications.europa.eu/resource/authority/frequency/BIMONTHLY</entry> + <entry key="ANNUAL_2">http://publications.europa.eu/resource/authority/frequency/ANNUAL_2</entry> + <entry key="ANNUAL_3">http://publications.europa.eu/resource/authority/frequency/ANNUAL_3</entry> + <entry key="ANNUAL">http://publications.europa.eu/resource/authority/frequency/ANNUAL</entry> + </xsl:variable> + + <!-- + https://w3id.org/mobilitydcat-ap/update-frequency + --> + <xsl:variable name="mobilityDcatApUpdateFrequencyToUri" + as="node()*"> + <entry key="1h">https://w3id.org/mobilitydcat-ap/update-frequency/1h</entry> + <entry key="1min">https://w3id.org/mobilitydcat-ap/update-frequency/1min</entry> + <entry key="10min">https://w3id.org/mobilitydcat-ap/update-frequency/10min</entry> + <entry key="12h">https://w3id.org/mobilitydcat-ap/update-frequency/12h</entry> + <entry key="15min">https://w3id.org/mobilitydcat-ap/update-frequency/15min</entry> + <entry key="2h">https://w3id.org/mobilitydcat-ap/update-frequency/2h</entry> + <entry key="24h">https://w3id.org/mobilitydcat-ap/update-frequency/24h</entry> + <entry key="3h">https://w3id.org/mobilitydcat-ap/update-frequency/3h</entry> + <entry key="3 months">https://w3id.org/mobilitydcat-ap/update-frequency/3-months</entry> + <entry key="30min">https://w3id.org/mobilitydcat-ap/update-frequency/30min</entry> + <entry key="5min">https://w3id.org/mobilitydcat-ap/update-frequency/5min</entry> + <entry key="6 months">https://w3id.org/mobilitydcat-ap/update-frequency/6-months</entry> + </xsl:variable> + + <xsl:variable name="isoDurationToMobilityDcatApUpdateFrequency" + as="node()*"> + <!-- <entry key="X">https://w3id.org/mobilitydcat-ap/update-frequency/less-than-yearly</entry>--> + <entry key="P0Y0M0DT1H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/1h</entry> + <entry key="P0Y0M0DT0H1M0S">https://w3id.org/mobilitydcat-ap/update-frequency/1min</entry> + <entry key="P0Y0M0DT0H10M0S">https://w3id.org/mobilitydcat-ap/update-frequency/10min</entry> + <entry key="P0Y0M0DT12H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/12h</entry> + <entry key="P0Y0M0DT0H15M0S">https://w3id.org/mobilitydcat-ap/update-frequency/15min</entry> + <entry key="P0Y0M0DT2H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/2h</entry> + <entry key="P0Y0M0DT24H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/24h</entry> + <entry key="P0Y0M0DT3H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/3h</entry> + <entry key="P0Y3M0DT0H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/3-months</entry> + <entry key="P0Y0M0DT0H30M0S">https://w3id.org/mobilitydcat-ap/update-frequency/30min</entry> + <entry key="P0Y0M0DT0H5M0S">https://w3id.org/mobilitydcat-ap/update-frequency/5min</entry> + <entry key="P0Y6M0DT0H0M0S">https://w3id.org/mobilitydcat-ap/update-frequency/6-months</entry> + </xsl:variable> + + + <xsl:param name="multipleAccrualPeriodicityAllowed" + as="xs:string" + select="'true'"/> + <xsl:variable name="allowMultipleAccrualPeriodicity" + as="xs:boolean" + select="xs:boolean($multipleAccrualPeriodicityAllowed)"/> + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:resourceMaintenance"> + <xsl:variable name="isFirstMaintenanceElement" + select="preceding-sibling::*[1]/name() != 'mri:resourceMaintenance'"/> + <xsl:if test="$isFirstMaintenanceElement"> + <xsl:variable name="listOfFrequency" + as="node()*"> + <xsl:for-each select="../mri:resourceMaintenance/*"> + <xsl:for-each select="mmi:maintenanceAndUpdateFrequency[*/@codeListValue != '']"> + <xsl:variable name="dcFrequency" + as="xs:string?" + select="$isoFrequencyToDublinCore[@key = current()/*/@codeListValue]"/> + + <xsl:variable name="dcatFrequencyUri" + as="xs:string?" + select="$euUpdateFrquencyToUri[@key = current()/*/@codeListValue]"/> + + <xsl:variable name="mobilityDcatApUpdateFrequencyUri" + as="xs:string?" + select="$mobilityDcatApUpdateFrequencyToUri[@key = current()/*/@codeListValue]"/> + + <!-- Domain specific codelists take priority --> + <xsl:variable name="dcOrIsoFrequency" + as="xs:string?" + select="if ($mobilityDcatApUpdateFrequencyUri != '' or $dcatFrequencyUri != '') then '' + else if($dcFrequency) + then concat($europaPublicationBaseUri, 'frequency/', $dcFrequency) + else concat($isoCodeListBaseUri, */@codeListValue)"/> + + <xsl:for-each select="($mobilityDcatApUpdateFrequencyUri, $dcatFrequencyUri, $dcOrIsoFrequency[. != ''])"> + <dct:accrualPeriodicity> + <dct:Frequency rdf:about="{current()}"/> + </dct:accrualPeriodicity> + </xsl:for-each> + </xsl:for-each> + + <xsl:for-each select="mmi:userDefinedMaintenanceFrequency"> + <xsl:variable name="mobilityFrequencyFromPeriod" + as="xs:string?" + select="$isoDurationToMobilityDcatApUpdateFrequency[@key = current()/gco:TM_PeriodDuration]"/> + + <xsl:if test="$mobilityFrequencyFromPeriod"> + <dct:accrualPeriodicity> + <dct:Frequency rdf:about="{$mobilityFrequencyFromPeriod}"/> + </dct:accrualPeriodicity> + </xsl:if> + </xsl:for-each> + </xsl:for-each> + </xsl:variable> + + <xsl:copy-of select="if ($allowMultipleAccrualPeriodicity) then $listOfFrequency else $listOfFrequency[1]"/> + </xsl:if> + </xsl:template> + + <!-- + RDF Property: dcat:temporalResolution + Definition: Minimum time period resolvable in the dataset. + Range: rdfs:Literal typed as xsd:duration + Usage note: If the dataset is a time-series this should correspond to the spacing of items in the series. + For other kinds of dataset, this property will usually indicate the smallest time difference between items in the dataset. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:temporalResolution/*"> + <dcat:temporalResolution rdf:datatype="http://www.w3.org/2001/XMLSchema#duration"> + <xsl:value-of select="text()"/> + </dcat:temporalResolution> + </xsl:template> + + + <!-- + RDF Property: dcterms:temporal + Definition: The temporal period that the dataset covers. + Range: dcterms:PeriodOfTime (An interval of time that is named or defined by its start and end dates) + Usage note: The temporal coverage of a dataset may be encoded as an instance of dcterms:PeriodOfTime, + or may be indicated using an IRI reference (link) to a resource describing a time period or interval. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:extent/*/gex:temporalElement/*/gex:extent"> + <dct:temporal> + <dct:PeriodOfTime> + <xsl:for-each select="*/gml:begin/*[gml:timePosition/text() != '']|*/gml:beginPosition[. != '']"> + <xsl:call-template name="rdf-date"> + <xsl:with-param name="nodeName" select="'dcat:startDate'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:for-each select="*/gml:end/*[gml:timePosition/text() != '']|*/gml:endPosition[. != '']"> + <xsl:call-template name="rdf-date"> + <xsl:with-param name="nodeName" select="'dcat:endDate'"/> + </xsl:call-template> + </xsl:for-each> + </dct:PeriodOfTime> + </dct:temporal> + </xsl:template> + + + <!-- + RDF Property: dcterms:spatial + Definition: The geographical area covered by the dataset. + Range: dcterms:Location (A spatial region or named place) + Usage note: The spatial coverage of a dataset may be encoded as an instance of dcterms:Location, + or may be indicated using an IRI reference (link) to a resource describing a location. It is recommended that links are to entries in a well maintained gazetteer such as Geonames. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:extent/*/gex:geographicElement/gex:EX_GeographicBoundingBox"> + <xsl:variable name="north" select="gex:northBoundLatitude/gco:Decimal"/> + <xsl:variable name="east" select="gex:eastBoundLongitude/gco:Decimal"/> + <xsl:variable name="south" select="gex:southBoundLatitude/gco:Decimal"/> + <xsl:variable name="west" select="gex:westBoundLongitude/gco:Decimal"/> + + <xsl:variable name="geojson" + as="xs:string" + select="concat('{"type":"Polygon","coordinates":[[[', + $west, ',', $north, '],[', + $east, ',', $north, '],[', + $east, ',', $south, '],[', + $west, ',', $south, '],[', + $west, ',', $north, ']]]}')"/> + + <dct:spatial> + <rdf:Description> + <rdf:type rdf:resource="http://purl.org/dc/terms/Location"/> + <dcat:bbox rdf:datatype="http://www.opengis.net/ont/geosparql#geoJSONLiteral"> + <xsl:value-of select="$geojson"/> + </dcat:bbox> + </rdf:Description> + </dct:spatial> + </xsl:template> + + + <xsl:template mode="iso19115-3-to-dcat" + match="mri:extent/*/gex:geographicElement/gex:EX_GeographicDescription"> + <xsl:for-each select="gex:geographicIdentifier/*"> + <xsl:variable name="uri" + as="xs:string?" + select="mcc:code/*/@xlink:href"/> + <xsl:choose> + <xsl:when test="string($uri)"> + <dct:spatial> + <dct:Location rdf:about="{$uri}"/> + </dct:spatial> + </xsl:when> + <xsl:otherwise> + <xsl:for-each select="mcc:code"> + <dct:spatial> + <rdf:Description> + <rdf:type rdf:resource="http://purl.org/dc/terms/Location"/> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'skos:prefLabel'"/> + </xsl:call-template> + </rdf:Description> + </dct:spatial> + </xsl:for-each> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </xsl:template> + + + <!-- + RDF Property: prov:wasGeneratedBy + Definition: An activity that generated, or provides the business context for, the creation of the dataset. + Domain: prov:Entity + Range: prov:Activity An activity is something that occurs over a period of time and acts upon or with entities; it may include consuming, processing, transforming, modifying, relocating, using, or generating entities. + Usage note: The activity associated with generation of a dataset will typically be an initiative, project, mission, survey, on-going activity ("business as usual") etc. Multiple prov:wasGeneratedBy properties can be used to indicate the dataset production context at various levels of granularity. + Usage note: Use prov:qualifiedGeneration to attach additional details about the relationship between the dataset and the activity, e.g., the exact time that the dataset was produced during the lifetime of a project + + TODO + --> + + <!-- + RDF Property: dcat:inSeries + Definition: A dataset series of which the dataset is part. + Range: dcat:DatasetSeries + Sub-property of: dcterms:isPartOf + + See dcat-core-associated.xsl + --> + + +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-distribution.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-distribution.xsl new file mode 100644 index 00000000000..9a54addef6f --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-distribution.xsl @@ -0,0 +1,443 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:dct="http://purl.org/dc/terms/" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + exclude-result-prefixes="#all"> + + <!-- + Some information are duplicated from the dataset to the distributions. + This can be enabled or not here. + + Related discussion: + https://github.com/SEMICeu/GeoDCAT-AP/issues/100 + --> + <xsl:param name="copyDatasetInfoToDistribution" + as="xs:string" + select="'false'"/> + <xsl:variable name="isCopyingDatasetInfoToDistribution" + as="xs:boolean" + select="xs:boolean($copyDatasetInfoToDistribution)"/> + + <xsl:variable name="protocolToStandardPage" + as="node()*"> + <entry key="http://www.opengeospatial.org/standards/cat"> + <value>csw</value> + <value>ogc:csw</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/sos"> + <value>sos</value> + <value>ogc:sos</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/sps"> + <value>sps</value> + <value>ogc:sps</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/wcs"> + <value>wcs</value> + <value>ogc:wcs</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/wfs"> + <value>wfs</value> + <value>ogc:wfs</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/wms"> + <value>wms</value> + <value>ogc:wms</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/wmts"> + <value>wmts</value> + <value>ogc:wmts</value> + </entry> + <entry key="http://www.opengeospatial.org/standards/wps"> + <value>wps</value> + <value>ogc:wps</value> + </entry> + </xsl:variable> + + + <!-- + RDF Property: dcat:landingPage + Definition: A Web page that can be navigated to in a Web browser to gain access to the catalog, a dataset, its distributions and/or additional information. + Sub-property of: foaf:page + Range: foaf:Document + Usage note: If the distribution(s) are accessible only through a landing page (i.e., direct download URLs are not known), then the landing page link SHOULD be duplicated as dcat:accessURL on a distribution. (see 5.7 Dataset available only behind some Web page) + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:metadataLinkage"> + <dcat:landingPage> + <foaf:Document rdf:about="{*/cit:linkage/*/text()}"> + <xsl:for-each select="*/cit:name"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'dct:title'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:for-each select="*/cit:description"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'dct:description'"/> + </xsl:call-template> + </xsl:for-each> + </foaf:Document> + </dcat:landingPage> + </xsl:template> + + + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:graphicOverview[*/mcc:fileName/*/text() != '']"> + <foaf:page> + <foaf:Document rdf:about="{*/mcc:fileName/*/text()}"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="*/mcc:fileDescription[normalize-space(.) != '']"/> + </foaf:Document> + </foaf:page> + </xsl:template> + + <!-- + RDF Property: dcat:distribution + Definition: An available distribution of the dataset. + Sub-property of: dcterms:relation + Domain: dcat:Dataset + Range: dcat:Distribution + --> + <xsl:template mode="iso19115-3-to-dcat" + name="iso19115-3-to-dcat-distribution" + match="mdb:distributionInfo//mrd:onLine"> + <xsl:param name="additionalProperties" + as="node()*"/> + + <xsl:variable name="url" + select="*/cit:linkage/gco:CharacterString/text()"/> + + <xsl:variable name="protocol" + select="*/cit:protocol/*/text()"/> + + <xsl:variable name="mimeType" + select="*/cit:protocol/gcx:MimeFileType/@type"/> + + <xsl:variable name="protocolAnchor" + select="*/cit:protocol/*/@xlink:href"/> + + <xsl:variable name="function" + select="*/cit:function/*/@codeListValue"/> + + <!-- TODO: SEMICeu check if GetCapabilities in URL. Could check for protocols ?--> + <xsl:variable name="pointsToService" select="false()"/> + + <xsl:choose> + <xsl:when test="normalize-space($url) = ''"/> + <xsl:when test="$function = ('information', 'search', 'completeMetadata', 'browseGraphic', 'upload', 'emailService') + or matches($protocol, 'WWW:LINK.*')"> + <foaf:page> + <foaf:Document rdf:about="{$url}"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="*/cit:name[normalize-space(.) != ''] + |*/cit:description[normalize-space(.) != '']"/> + </foaf:Document> + </foaf:page> + </xsl:when> + <xsl:otherwise> + <dcat:distribution> + <dcat:Distribution> + <!-- + RDF Property: dcterms:title + Definition: A name given to the distribution. + + RDF Property: dcterms:description + Definition: A free-text account of the distribution. + --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="*/cit:name[normalize-space(.) != ''] + |*/cit:description[normalize-space(.) != '']"/> + + <!-- + RDF Property: dcterms:issued + Definition: Date of formal issuance (e.g., publication) of the distribution. + --> + <xsl:for-each select="ancestor::mrd:MD_Distributor/mrd:distributionOrderProcess/*/mrd:plannedAvailableDateTime"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="."> + <xsl:with-param name="dateType" select="'publication'"/> + </xsl:apply-templates> + </xsl:for-each> + + <!-- + RDF Property: dcterms:modified + Definition: Most recent date on which the distribution was changed, updated or modified. + Range: rdfs:Literal encoded using the relevant ISO 8601 Date and Time compliant string [DATETIME] and typed using the appropriate XML Schema datatype [XMLSCHEMA11-2] (xsd:gYear, xsd:gYearMonth, xsd:date, or xsd:dateTime). + + Not supported + --> + + + <!-- + RDF Property: dcat:accessURL + Definition: A URL of the resource that gives access to a distribution of the dataset. E.g., landing page, feed, SPARQL endpoint. + Domain: dcat:Distribution + Range: rdfs:Resource + Usage note: + dcat:accessURL SHOULD be used for the URL of a service or location that can provide access to this distribution, typically through a Web form, query or API call. + + dcat:downloadURL is preferred for direct links to downloadable resources. + + If the distribution(s) are accessible only through a landing page (i.e., direct download URLs are not known), then the landing page URL associated with the dcat:Dataset SHOULD be duplicated as access URL on a distribution (see 5.7 Dataset available only behind some Web page). + --> + <!-- TODO: Can be multilingual --> + <!-- + Message: ClassConstraint[rdfs:Resource]: Expected class :rdfs:Resource for + --> + <dcat:accessURL rdf:resource="{$url}"/> + + <!-- + RDF Property: dcat:downloadURL + Definition: The URL of the downloadable file in a given format. E.g., CSV file or RDF file. The format is indicated by the distribution's dcterms:format and/or dcat:mediaType + Domain: dcat:Distribution + Range: rdfs:Resource + Usage note: dcat:downloadURL SHOULD be used for the URL at which this distribution is available directly, typically through a HTTP Get request + + This protocol list is GeoNetwork specific. It is not part of the ISO 19115-3 standard. + --> + <xsl:if test="matches($protocol, '.*DOWNLOAD.*|DB:.*|FILE:.*')"> + <dcat:downloadURL rdf:resource="{$url}"/> + </xsl:if> + + + <!-- + RDF Property: spdx:checksum + Definition: The checksum property provides a mechanism that can be used to verify that the contents of a file or package have not changed [SPDX]. + Range: spdx:Checksum + Usage note: + The checksum is related to the download URL. + + TODO: Not supported https://github.com/SEMICeu/GeoDCAT-AP/issues/89 + --> + + + + <!-- + RDF Property: dcat:byteSize + Definition: The size of a distribution in bytes. + Domain: dcat:Distribution + Range: rdfs:Literal typically typed as xsd:nonNegativeInteger. + Usage note: The size in bytes can be approximated (as a non-negative integer) when the precise size is not known. + Usage note: While it is recommended that the size be given as an integer, alternative literals such as '1.5 MB' are sometimes used. + --> + <xsl:for-each select="ancestor::mrd:MD_DigitalTransferOptions/mrd:transferSize/*/text()[. castable as xs:double]"> + <!-- Not valid for eu-dcat-ap <dcat:byteSize><xsl:value-of select="concat(., ' MB')"/></dcat:byteSize>--> + <dcat:byteSize rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"><xsl:value-of select="format-number(. * 1048576, '#')"/></dcat:byteSize> + </xsl:for-each> + + + <!-- + RDF Property: dcat:accessService + Definition: A data service that gives access to the distribution of the dataset + Range: dcat:DataService + Usage note: dcat:accessService SHOULD be used to link to a description of a dcat:DataService that can provide access to this distribution. + --> + <xsl:if test="$function = ('download', 'offlineAccess', 'order', 'browsing', 'fileAccess') + or matches($protocol, 'OGC:WMS|OGC:WFS|OGC:WCS|OGC:WPS|OGC API Features|OGC API Coverages|ESRI:REST')"> + <dcat:accessService> + <rdf:Description> + <rdf:type rdf:resource="http://www.w3.org/ns/dcat#DataService"/> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="*/cit:name[normalize-space(.) != '']"/> + <dcat:endpointURL rdf:resource="{$url}"/> + <!-- TODO: GetCapabilities document + <dcat:endpointDescription rdf:resource="{$endpoint-description}"/> + --> + + <xsl:variable name="standardPage" + as="node()?" + select="$protocolToStandardPage[value = lower-case($protocol)]"/> + <xsl:if test="$standardPage"> + <dct:conformsTo> + <dct:Standard rdf:about="{$standardPage/@key}"/> + </dct:conformsTo> + </xsl:if> + </rdf:Description> + </dcat:accessService> + </xsl:if> + + <!-- + RDF Property: dcat:mediaType + Definition: The media type of the distribution as defined by IANA [IANA-MEDIA-TYPES]. + Sub-property of: dcterms:format + Domain: dcat:Distribution + Range: dcterms:MediaType + Usage note: This property SHOULD be used when the media type of the distribution is defined in IANA [IANA-MEDIA-TYPES], otherwise dcterms:format MAY be used with different values. + + RDF Property: dcat:compressFormat + Definition: The compression format of the distribution in which the data is contained in a compressed form, e.g., to reduce the size of the downloadable file. + Range: dcterms:MediaType + Usage note: This property to be used when the files in the distribution are compressed, e.g., in a ZIP file. The format SHOULD be expressed using a media type as defined by IANA [IANA-MEDIA-TYPES], if available. + + RDF Property: dcat:packageFormat + Definition: The package format of the distribution in which one or more data files are grouped together, e.g., to enable a set of related files to be downloaded together. + Range: dcterms:MediaType + Usage note: This property to be used when the files in the distribution are packaged, e.g., in a TAR file, a ZIP file, a Frictionless Data Package or a Bagit file. The format SHOULD be expressed using a media type as defined by IANA [IANA-MEDIA-TYPES], if available. + See also: 6.8.18 Property: compression format. + + Rule: + * Use mimetype if any + * Use WWW:DOWNLOAD:(.*=format) if any + * fallback to ancestor::mrd:MD_DigitalTransferOptions/mrd:distributionFormat/*/mrd:formatSpecificationCitation + --> + <xsl:choose> + <xsl:when test="$mimeType"> + <xsl:call-template name="rdf-format-as-mediatype"> + <xsl:with-param name="format" select="$mimeType"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="starts-with($protocol, 'WWW:DOWNLOAD:')"> + <xsl:call-template name="rdf-format-as-mediatype"> + <xsl:with-param name="format" select="substring-after($protocol, 'WWW:DOWNLOAD:')"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates mode="iso19115-3-to-dcat-distribution" + select="ancestor::mrd:MD_DigitalTransferOptions/mrd:distributionFormat/*/mrd:formatSpecificationCitation"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates mode="iso19115-3-to-dcat-distribution" + select="ancestor::mrd:MD_DigitalTransferOptions/mrd:distributionFormat/*/mrd:fileDecompressionTechnique"/> + + + <xsl:if test="$isCopyingDatasetInfoToDistribution"> + <!-- + RDF Property: dcterms:license + Definition: A legal document under which the distribution is made available. + Range: dcterms:LicenseDocument + Usage note: Information about licenses and rights SHOULD be provided on the level of Distribution. + Information about licenses and rights MAY be provided for a Dataset in addition to + but not instead of the information provided for the Distributions of that Dataset. + Providing license or rights information for a Dataset that is different from information provided + for a Distribution of that Dataset SHOULD be avoided as this can create legal conflicts. + See also guidance at 9. License and rights statements. + --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="ancestor::mdb:MD_Metadata/mdb:identificationInfo/*/mri:resourceConstraints/*[mco:useConstraints]"/> + + <!-- + RDF Property: dcterms:accessRights + Definition: A rights statement that concerns how the distribution is accessed. + Range: dcterms:RightsStatement + Usage note: Information about licenses and rights MAY be provided for the Distribution. See also guidance at 9. License and rights statements. + --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="ancestor::mdb:MD_Metadata/mdb:identificationInfo/*/mri:resourceConstraints/*[mco:accessConstraints]"/> + + <!-- + RDF Property: dcterms:rights + Definition: Information about rights held in and over the distribution. + Range: dcterms:RightsStatement + Usage note: + dcterms:license, which is a sub-property of dcterms:rights, can be used to link a distribution to a license document. However, dcterms:rights allows linking to a rights statement that can include licensing information as well as other information that supplements the license such as attribution. + + Information about licenses and rights SHOULD be provided on the level of Distribution. Information about licenses and rights MAY be provided for a Dataset in addition to but not instead of the information provided for the Distributions of that Dataset. Providing license or rights information for a Dataset that is different from information provided for a Distribution of that Dataset SHOULD be avoided as this can create legal conflicts. See also guidance at 9. License and rights statements. + + See dcterms:license and dcterms:accessRights + --> + + <!-- + RDF Property: dcat:spatialResolutionInMeters + Definition: The minimum spatial separation resolvable in a dataset distribution, measured in meters. + Range: xsd:decimal + Usage note: If the dataset is an image or grid this should correspond to the spacing of items. For other kinds of spatial datasets, this property will usually indicate the smallest distance between items in the dataset. + Usage note: Alternative spatial resolutions might be provided as different dataset distributions + --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="ancestor::mdb:MD_Metadata/mdb:identificationInfo/*/mri:spatialResolution/*/mri:distance + |ancestor::mdb:MD_Metadata/mdb:identificationInfo/*/mri:temporalResolution/*"/> + + <!-- + RDF Property: odrl:hasPolicy + Definition: An ODRL conformant policy expressing the rights associated with the distribution. + Range: odrl:Policy + Usage note: Information about rights expressed as an ODRL policy [ODRL-MODEL] using the ODRL vocabulary [ODRL-VOCAB] MAY be provided for the distribution. See also guidance at 9. License and rights statements. + + Not supported + --> + + <!-- + RDF Property: dcterms:conformsTo + Definition: An established standard to which the distribution conforms. + Range: dcterms:Standard (A basis for comparison; a reference point against which other things can be evaluated.) + Usage note: This property SHOULD be used to indicate the model, schema, ontology, view or profile that this representation of a dataset conforms to. This is (generally) a complementary concern to the media-type or format. + --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="ancestor::mdb:MD_Metadata/mdb:dataQualityInfo/*/mdq:report/*/mdq:result[mdq:DQ_ConformanceResult and mdq:DQ_ConformanceResult/mdq:pass/*/text() = 'true']"/> + </xsl:if> + + <xsl:copy-of select="$additionalProperties"/> + </dcat:Distribution> + </dcat:distribution> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + + <xsl:template mode="iso19115-3-to-dcat-distribution" + match="mrd:distributionFormat/*/mrd:formatSpecificationCitation"> + <xsl:call-template name="rdf-format-as-mediatype"> + <xsl:with-param name="format" select="*/cit:title/*/text()"/> + </xsl:call-template> + </xsl:template> + + + <xsl:template mode="iso19115-3-to-dcat-distribution" + match="mrd:distributionFormat/*/mrd:fileDecompressionTechnique"> + <xsl:call-template name="rdf-format-as-mediatype"> + <xsl:with-param name="elementName" select="'dcat:compressFormat'"/> + <xsl:with-param name="format" select="*/text()"/> + </xsl:call-template> + </xsl:template> + + + <xsl:template name="rdf-format-as-mediatype"> + <xsl:param name="elementName" as="xs:string" select="'dct:format'"/> + <xsl:param name="format" as="xs:string"/> + + <xsl:variable name="formatUri" + as="xs:string?" + select="($formatLabelToUri[lower-case($format) = text()]/@key)[1]"/> + + <xsl:variable name="rangeName" + as="xs:string" + select="if ($elementName = 'dct:format') then 'dct:MediaTypeOrExtent' else 'dct:MediaType'"/> + <xsl:element name="{$elementName}"> + <xsl:choose> + <xsl:when test="$formatUri"> + <xsl:element name="{$rangeName}"> + <xsl:attribute name="rdf:about" select="$formatUri"/> + </xsl:element> + </xsl:when> + <xsl:otherwise> + <xsl:element name="{$rangeName}"> + <rdfs:label><xsl:value-of select="$format"/></rdfs:label> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:template> + +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-keywords.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-keywords.xsl new file mode 100644 index 00000000000..25f14d568ec --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-keywords.xsl @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:xlink="http://www.w3.org/1999/xlink" + exclude-result-prefixes="#all"> + + <!-- + RDF Property: dcat:theme + Type: owl:ObjectProperty + Definition: A main category of the resource. A resource can have multiple themes. + Sub-property of: dcterms:subject + Usage note: The set of themes used to categorize the resources are organized in a skos:ConceptScheme, skos:Collection, owl:Ontology or similar, describing all the categories and their relations in the catalog. + + RDF Property: dcat:keyword + Definition: A keyword or tag describing the resource. + Range: rdfs:Literal + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:descriptiveKeywords"> + <xsl:for-each select="*/mri:keyword[*/text() != '']"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="."/> + </xsl:for-each> + </xsl:template> + + <!-- + dcat:keyword is a rdfs:Literal and not a skos:Concept. + Main drawback is that the keyword is not linked to a concept in a concept scheme + which is often the case in ISO encoding using Anchor. + Using dcat:theme when an Anchor is present. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:descriptiveKeywords/*/mri:keyword[gcx:Anchor/@xlink:href != '']" + priority="2"> + <dcat:theme> + <skos:Concept> + <xsl:call-template name="rdf-object-ref-attribute"/> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" + select="'skos:prefLabel'"/> + </xsl:call-template> + </skos:Concept> + </dcat:theme> + </xsl:template> + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:descriptiveKeywords/*/mri:keyword[gco:CharacterString/text() != '']" + priority="2"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" + select="'dcat:keyword'"/> + </xsl:call-template> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-lineage.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-lineage.xsl new file mode 100644 index 00000000000..e4eb39fd565 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-lineage.xsl @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:adms="http://www.w3.org/ns/adms#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:tr="java:org.fao.geonet.api.records.formatters.SchemaLocalizations" + exclude-result-prefixes="#all"> + + <!-- + RDF Property: adms:status + Definition: The status of the resource in the context of a particular workflow process [VOCAB-ADMS]. + Range: skos:Concept + Usage note: + DCAT does not prescribe the use of any specific set of life-cycle statuses, but refers to existing standards and community practices fit for the relevant application scenario. + https://www.w3.org/TR/vocab-adms/#adms-status + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:status"> + <adms:status> + <skos:Concept rdf:about="{concat($isoCodeListBaseUri, */@codeListValue)}"> + <xsl:if test="$isExpandSkosConcept"> + <xsl:variable name="codelistKey" + select="*/@codeListValue"/> + <xsl:variable name="parentName" + select="local-name(*)"/> + + <xsl:for-each select="$languages/@iso3code"> + <xsl:variable name="codelistTranslation" + select="tr:codelist-value-label(tr:create('iso19115-3.2018', current()), $parentName, $codelistKey)"/> + + <skos:prefLabel xml:lang="{current()}"><xsl:value-of select="$codelistTranslation"/></skos:prefLabel> + </xsl:for-each> + </xsl:if> + </skos:Concept> + </adms:status> + </xsl:template> + + <!-- + RDF Property: adms:versionNotes + Definition: A description of changes between this version and the previous version of the resource [VOCAB-ADMS]. + Range: rdfs:Literal + Usage note: + In case of backward compatibility issues with the previous version of the resource, a textual description of them SHOULD be specified by using this property. + + See dcat-core (mdb:resourceLineage/*/mrl:statement). + --> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-resource.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-resource.xsl new file mode 100644 index 00000000000..314ac56989b --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core-resource.xsl @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + exclude-result-prefixes="#all"> + + <!-- Resource + Unsupported: + * dcat:first|previous(sameAs replaces, previousVersion?)|next|last|hasVersion (using the Associated API, navigate to series and sort by date?) + * dct:isReferencedBy (using the Associated API) + * dcat:hasCurrentVersion (using the Associated API) + * dct:rights + * odrl:hasPolicy + --> + <xsl:template mode="iso19115-3-to-dcat-resource" + name="iso19115-3-to-dcat-resource" + match="mdb:MD_Metadata"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="mdb:identificationInfo/*/mri:citation/*/cit:title + |mdb:identificationInfo/*/mri:abstract + |mdb:identificationInfo/*/mri:citation/*/cit:identifier + |mdb:identificationInfo/*/mri:citation/*/cit:date/*[cit:dateType/*/@codeListValue = $isoDateTypeToDcatCommonNames/text()]/cit:date + |mdb:identificationInfo/*/mri:citation/*/cit:edition + |mdb:identificationInfo/*/mri:defaultLocale + |mdb:identificationInfo/*/mri:otherLocale + |mdb:identificationInfo/*/mri:resourceConstraints/*[mco:useConstraints] + |mdb:identificationInfo/*/mri:resourceConstraints/*[mco:accessConstraints] + |mdb:identificationInfo/*/mri:status + |mdb:identificationInfo/*/mri:descriptiveKeywords + |mdb:identificationInfo/*/mri:pointOfContact + |mdb:identificationInfo/*/mri:associatedResource + |mdb:dataQualityInfo/*/mdq:report/*/mdq:result[mdq:DQ_ConformanceResult and mdq:DQ_ConformanceResult/mdq:pass/*/text() = 'true'] + |mdb:resourceLineage/*/mrl:statement + |mdb:metadataLinkage + "/> + + </xsl:template> + +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core.xsl new file mode 100644 index 00000000000..ed6a811ecf9 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-core.xsl @@ -0,0 +1,392 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:dqm="http://standards.iso.org/iso/19157/-2/dqm/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" + xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:reg="http://standards.iso.org/iso/19115/-3/reg/1.0" + xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" + xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" + xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" + xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" + xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" + xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.1" + xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" + xmlns:gml="http://www.opengis.net/gml/3.2" + xmlns:gmd="http://www.isotc211.org/2005/gmd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:util="java:org.fao.geonet.util.XslUtil" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:owl="http://www.w3.org/2002/07/owl#" + xmlns:adms="http://www.w3.org/ns/adms#" + xmlns:gn-fn-dcat="http://geonetwork-opensource.org/xsl/functions/dcat" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + + <xsl:import href="dcat-commons.xsl"/> + <xsl:import href="dcat-variables.xsl"/> + <xsl:import href="dcat-utils.xsl"/> + + <xsl:import href="dcat-core-catalog.xsl"/> + <xsl:import href="dcat-core-catalogrecord.xsl"/> + <xsl:import href="dcat-core-resource.xsl"/> + <xsl:import href="dcat-core-dataservice.xsl"/> + <xsl:import href="dcat-core-dataset.xsl"/> + <xsl:import href="dcat-core-contact.xsl"/> + <xsl:import href="dcat-core-keywords.xsl"/> + <xsl:import href="dcat-core-access-and-use.xsl"/> + <xsl:import href="dcat-core-distribution.xsl"/> + <xsl:import href="dcat-core-associated.xsl"/> + <xsl:import href="dcat-core-lineage.xsl"/> + + <!-- Current record is an ISO metadata + and can be an ISO19139 record before ISO19115-3 conversion. --> + <xsl:variable name="metadata" + as="node()" + select="(/root/mdb:MD_Metadata|/mdb:MD_Metadata|/root/gmd:MD_Metadata|/gmd:MD_Metadata)"/> + + <xsl:template mode="get-language" + match="mdb:MD_Metadata" + as="node()*"> + <xsl:variable name="defaultLanguage" + select="$metadata/mdb:defaultLocale/*"/> + <xsl:for-each select="$defaultLanguage"> + <xsl:variable name="iso3code" + as="xs:string?" + select="lan:language/*/@codeListValue"/> + <language id="{@id}" + iso3code="{$iso3code}" + iso2code="{util:twoCharLangCode($iso3code)}" + default=""/> + </xsl:for-each> + <xsl:for-each select="$metadata/mdb:otherLocale/*[not(@id = $defaultLanguage/@id)]"> + <language id="{@id}" + iso3code="{lan:language/*/@codeListValue}" + iso2code="{util:twoCharLangCode(lan:language/*/@codeListValue)}"/> + </xsl:for-each> + </xsl:template> + + <xsl:variable name="languages" + as="node()*"> + <xsl:apply-templates mode="get-language" + select="$metadata"/> + </xsl:variable> + + + <xsl:variable name="resourcePrefix" + select="concat(util:getSettingValue('nodeUrl'), 'api/records/')" + as="xs:string"/> + <!-- GeoNetwork historical DCAT export was using a setting + select="util:getSettingValue('metadata/resourceIdentifierPrefix')"/>--> + + <xsl:function name="gn-fn-dcat:getRecordUri" as="xs:string"> + <xsl:param name="metadata" as="node()"/> + + <xsl:variable name="metadataLinkage" + select="$metadata/mdb:metadataLinkage/*/cit:linkage/(gco:CharacterString|gcx:Anchor)/text()" + as="xs:string?"/> + + <xsl:value-of select="if($metadataLinkage) then $metadataLinkage + else concat($resourcePrefix, encode-for-uri($metadata/mdb:metadataIdentifier/*/mcc:code/*/text()))" + /> + </xsl:function> + + <!-- Create resource --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:MD_Metadata"> + <rdf:Description rdf:about="{gn-fn-dcat:getRecordUri(.)}"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="mdb:metadataScope/*/mdb:resourceScope/*/@codeListValue"/> + + <xsl:apply-templates mode="iso19115-3-to-dcat-catalog-record" + select="."/> + + <xsl:apply-templates mode="iso19115-3-to-dcat-resource" + select="."/> + + <!-- Dataset, DatasetSeries + Unsupported: + * prov:wasGeneratedBy (Could be associated resource of type project?) + --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="mdb:identificationInfo/*/mri:resourceMaintenance + |mdb:identificationInfo/*/mri:spatialResolution/*/mri:distance + |mdb:identificationInfo/*/mri:temporalResolution/* + |mdb:identificationInfo/*/mri:extent/*/gex:geographicElement/gex:EX_GeographicBoundingBox + |mdb:identificationInfo/*/mri:extent/*/gex:geographicElement/gex:EX_GeographicDescription + |mdb:identificationInfo/*/mri:extent/*/gex:temporalElement/*/gex:extent + |mdb:distributionInfo//mrd:onLine + |mdb:identificationInfo/*/mri:graphicOverview + "/> + + <!-- DataService --> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="mdb:identificationInfo/*/srv:containsOperations/*/srv:connectPoint/*/cit:linkage + |mdb:identificationInfo/*/srv:operatesOn + "/> + </rdf:Description> + </xsl:template> + + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:identificationInfo/*/mri:citation/*/cit:title + |mdb:identificationInfo/*/mri:citation/*/cit:edition + |mdb:identificationInfo/*/mri:abstract + |mdb:metadataStandard/*/cit:title + |mdb:metadataStandard/*/cit:edition + |mdb:resourceLineage/*/mrl:statement + |mrd:onLine/*/cit:name + |mrd:onLine/*/cit:description + |mri:graphicOverview/*/mcc:fileDescription + "> + <xsl:variable name="xpath" + as="xs:string" + select="string-join(current()/ancestor-or-self::*[name() != 'root']/name(), '/')"/> + <xsl:variable name="dcatElementName" + as="node()?" + select="$isoToDcatCommonNames[. = $xpath]"/> + + <xsl:choose> + <xsl:when test="$dcatElementName and $dcatElementName/@isMultilingual = 'false'"> + <xsl:call-template name="rdf-not-localised"> + <xsl:with-param name="nodeName" select="$dcatElementName/@key"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$dcatElementName"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="$dcatElementName/@key"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:message>WARNING: Unmatched XPath <xsl:value-of select="$xpath"/>. Check dcat-variables.xsl and add the element to isoToDcatCommonNames.</xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:dateInfo/*/cit:date + |cit:CI_Citation/cit:date/*/cit:date + |mrd:distributionOrderProcess/*/mrd:plannedAvailableDateTime"> + <xsl:param name="dateType" + as="xs:string?" + select="../cit:dateType/*/@codeListValue"/> + <xsl:variable name="dcatElementName" + as="xs:string?" + select="$isoDateTypeToDcatCommonNames[. = $dateType]/@key"/> + + <xsl:choose> + <xsl:when test="string($dcatElementName)"> + <xsl:call-template name="rdf-date"> + <xsl:with-param name="nodeName" select="$dcatElementName"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:message>WARNING: Unmatched date type <xsl:value-of select="$dateType"/>. If needed, add this type in dcat-variables.xsl and add the element to map to in isoDateTypeToDcatCommonNames.</xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + + <!-- + RDF Property: dcterms:identifier + Definition: A unique identifier of the resource being described or cataloged. + Range: rdfs:Literal + Usage note: The identifier might be used as part of the IRI of the resource, but still having it represented explicitly is useful. + Usage note: The identifier is a text string which is assigned to the resource to provide an unambiguous reference within a particular context. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:metadataIdentifier + |mdb:identificationInfo/*/mri:citation/*/cit:identifier + |cit:identifier"> + <xsl:variable name="code" + select="*/mcc:code/*/text()"/> + <xsl:variable name="codeSpace" + select="*/mcc:codeSpace/*/text()"/> + <xsl:variable name="isUrn" + as="xs:boolean" + select="starts-with($codeSpace, 'urn:')"/> + <xsl:variable name="separator" + as="xs:string" + select="if ($isUrn) then ':' else '/'"/> + + <xsl:variable name="codeWithPrefix" + select="if (string($codeSpace)) + then concat($codeSpace, + (if (ends-with($codeSpace, $separator)) then '' else $separator), + $code) + else $code"/> + + <xsl:variable name="codeType" + select="if (matches($codeWithPrefix, '^https?://|urn:')) + then 'anyURI' else 'string'"/> + <dct:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#{$codeType}"> + <xsl:value-of select="$codeWithPrefix"/> + </dct:identifier> + </xsl:template> + + + <!-- + RDF Property: dcterms:conformsTo + Definition: An established standard to which the described resource conforms. + Range: dcterms:Standard (A basis for comparison; a reference point against which other things can be evaluated.) + Usage note: This property SHOULD be used to indicate the model, schema, ontology, view or profile that the catalog record metadata conforms to. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:metadataStandard"> + <dct:conformsTo> + <dct:Standard> + <rdf:type rdf:resource="http://purl.org/dc/terms/Standard"/> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="*/cit:title"/> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="*/cit:edition"/> + </dct:Standard> + </dct:conformsTo> + </xsl:template> + + + <!-- + Definition: A language of the resource. This refers to the natural language used for textual metadata (i.e., titles, descriptions, etc.) of a cataloged resource (i.e., dataset or service) or the textual values of a dataset distribution + + Range: + dcterms:LinguisticSystem + Resources defined by the Library of Congress (ISO 639-1, ISO 639-2) SHOULD be used. + + If a ISO 639-1 (two-letter) code is defined for language, then its corresponding IRI SHOULD be used; if no ISO 639-1 code is defined, then IRI corresponding to the ISO 639-2 (three-letter) code SHOULD be used. + + Usage note: Repeat this property if the resource is available in multiple languages. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:defaultLocale + |mri:otherLocale + |mdb:defaultLocale + |mdb:otherLocale"> + <xsl:variable name="languageValue" + as="xs:string?" + select="if ($isoToDcatLanguage[@key = current()/*/lan:language/*/@codeListValue]) + then $isoToDcatLanguage[@key = current()/*/lan:language/*/@codeListValue] + else */lan:language/*/@codeListValue"/> + + <dct:language> + <!-- TO CHECK: In DCAT, maybe we should use another base URI? --> + <dct:LinguisticSystem rdf:about="{concat($europaPublicationLanguage, upper-case($languageValue))}"/> + </dct:language> + </xsl:template> + + <!-- + RDF Property: dcterms:conformsTo + Definition: An established standard to which the described resource conforms. + Range: dcterms:Standard ("A basis for comparison; a reference point against which other things can be evaluated." [DCTERMS]) + Usage note: This property SHOULD be used to indicate the model, schema, ontology, view or profile that the cataloged resource content conforms to. + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:dataQualityInfo/*/mdq:report/*/mdq:result[mdq:DQ_ConformanceResult and mdq:DQ_ConformanceResult/mdq:pass/*/text() = 'true']"> + <dct:conformsTo> + <dct:Standard> + <xsl:choose> + <xsl:when test="*/mdq:specification/*/cit:title/gcx:Anchor/@xlink:href"> + <xsl:attribute name="rdf:about" select="*/mdq:specification/*/cit:title/gcx:Anchor/@xlink:href"/> + </xsl:when> + <xsl:when test="*/mdq:specification/@xlink:href"> + <xsl:attribute name="rdf:about" select="*/mdq:specification/@xlink:href"/> + </xsl:when> + <xsl:otherwise> + <rdf:type rdf:resource="http://purl.org/dc/terms/Standard"/> + <xsl:for-each select="*/mdq:specification/*"> + <xsl:for-each select="cit:title"> + <xsl:call-template name="rdf-localised"> + <xsl:with-param name="nodeName" select="'rdfs:label'"/> + </xsl:call-template> + </xsl:for-each> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="cit:date/*[cit:dateType/*/@codeListValue = $isoDateTypeToDcatCommonNames/text()]/cit:date"/> + </xsl:for-each> + </xsl:otherwise> + </xsl:choose> + </dct:Standard> + </dct:conformsTo> + </xsl:template> + + + <!-- + Definition: The nature or genre of the resource. + Sub-property of: dc:type + Range: rdfs:Class + Usage note: The value SHOULD be taken from a well governed and broadly recognised controlled vocabulary, such as: + DCMI Type vocabulary [DCTERMS] + [ISO-19115-1] scope codes + Datacite resource types [DataCite] + PARSE.Insight content-types used by re3data.org [RE3DATA-SCHEMA] (see item 15 contentType) + MARC intellectual resource types + Some members of these controlled vocabularies are not strictly suitable for datasets or data services (e.g., DCMI Type Event, PhysicalObject; [ISO-19115-1] CollectionHardware, CollectionSession, Initiative, Sample, Repository), but might be used in the context of other kinds of catalogs defined in DCAT profiles or applications. + --> + <xsl:template name="iso19115-3-to-dcat-metadataScope" + mode="iso19115-3-to-dcat" + match="mdb:metadataScope/*/mdb:resourceScope/*/@codeListValue"> + <xsl:variable name="dcmiType" + select="$dcmiTypeVocabularyToIso[. = current()]/@key" + as="xs:string?"/> + <xsl:variable name="dcatType" + select="$dcatResourceTypeToIso[. = current()]/@key" + as="xs:string?"/> + + <xsl:choose> + <xsl:when test="$dcatType"> + <rdf:type rdf:resource="http://www.w3.org/ns/dcat#{$dcatType}"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="create-node-with-info"> + <xsl:with-param name="message" + select="concat('No DCMI type defined for value ', current(), + '. Default to Dataset.')"/> + <xsl:with-param name="node"> + <rdf:type rdf:resource="http://purl.org/dc/dcmitype/Dataset"/> + </xsl:with-param> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + + <!-- + SHACL rule + Value must be an instance of skos:Concept + Location: + [Focus node] - [https://xyz/geonetwork/srv/api/records/7fe2f305] - + [Result path] - [http://purl.org/dc/terms/type] + Test: + [Value] - [http://purl.org/dc/dcmitype/Dataset] + --> + <xsl:if test="$dcmiType"> + <dct:type> + <skos:Concept rdf:about="http://purl.org/dc/dcmitype/{$dcmiType}"> + <skos:prefLabel><xsl:value-of select="$dcmiType"/></skos:prefLabel> + </skos:Concept> + </dct:type> + </xsl:if> + <xsl:if test="$isPreservingIsoType and current() != ''"> + <dct:type> + <skos:Concept rdf:about="{concat($isoCodeListBaseUri, current())}"> + <skos:prefLabel><xsl:value-of select="current()"/></skos:prefLabel> + </skos:Concept> + </dct:type> + </xsl:if> + <!-- TODO: Add mapping to Datacite https://schema.datacite.org/meta/kernel-4.1/include/datacite-resourceType-v4.1.xsd ?--> + </xsl:template> + + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:referenceSystemInfo/*/mrs:referenceSystemIdentifier/*"/> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-utils.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-utils.xsl new file mode 100644 index 00000000000..05576cd746b --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-utils.xsl @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" + xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:dct="http://purl.org/dc/terms/" + xmlns:dcat="http://www.w3.org/ns/dcat#" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + xmlns:vcard="http://www.w3.org/2006/vcard/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:owl="http://www.w3.org/2002/07/owl#" + xmlns:adms="http://www.w3.org/ns/adms#" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:gn-fn-dcat="http://geonetwork-opensource.org/xsl/functions/dcat" + xmlns:xlink="http://www.w3.org/1999/xlink" + exclude-result-prefixes="#all"> + + <xsl:template name="create-node-with-info"> + <xsl:param name="message" as="xs:string?"/> + <xsl:param name="node" as="node()"/> + + <xsl:comment select="$message"/> + <xsl:copy-of select="$node"/> + </xsl:template> + + + <xsl:template name="rdf-localised"> + <xsl:param name="nodeName" + as="xs:string"/> + + <xsl:if test="*/text() != ''"> + <xsl:element name="{$nodeName}"> + <xsl:attribute name="xml:lang" select="$languages[@default]/@iso3code"/> + <xsl:value-of select="*/text()"/> + </xsl:element> + </xsl:if> + + <xsl:variable name="hasDefaultLanguageCharacterString" + select="count(gco:CharacterString|gcx:Anchor) > 0"/> + + <xsl:for-each select="lan:PT_FreeText/*/lan:LocalisedCharacterString[text() != '']"> + <xsl:variable name="translationLanguage" + select="@locale"/> + + <xsl:choose> + <xsl:when test="$hasDefaultLanguageCharacterString + and $translationLanguage = $languages[@default]/concat('#', @id)"> + <!-- Ignored default language which may be repeated in translations. --> + </xsl:when> + <xsl:otherwise> + <xsl:element name="{$nodeName}"> + <xsl:attribute name="xml:lang" select="$languages[concat('#', @id) = $translationLanguage]/@iso3code"/> + <xsl:value-of select="text()"/> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </xsl:template> + + + <xsl:template name="rdf-not-localised"> + <xsl:param name="nodeName" + as="xs:string"/> + <xsl:element name="{$nodeName}"> + <xsl:value-of select="*/text()"/> + </xsl:element> + </xsl:template> + + + <!-- + Range: rdfs:Literal encoded using the relevant ISO 8601 Date and Time compliant string [DATETIME] and typed using the appropriate XML Schema datatype [XMLSCHEMA11-2] (xsd:gYear, xsd:gYearMonth, xsd:date, or xsd:dateTime). + --> + <xsl:template name="rdf-date"> + <xsl:param name="nodeName" + as="xs:string"/> + + <xsl:variable name="date" + as="xs:string?" + select="if (*/text()) then */text() else text()"/> + + <xsl:element name="{$nodeName}"> + <xsl:attribute name="rdf:datatype" + select="concat('http://www.w3.org/2001/XMLSchema#date', (if (contains($date, 'T')) then 'Time' else ''))"/> + <xsl:value-of select="$date"/> + </xsl:element> + </xsl:template> + + + <!-- + Get an object reference from an node. + + In ISO, object reference are usually stored using gcx:Anchor elements (eg. keywords). + But in other cases, the reference can be stored in a more specific element. + Define here the rules to extract the reference from the object. + --> + <xsl:function name="gn-fn-dcat:rdf-object-ref" as="xs:string?"> + <xsl:param name="node" as="node()"/> + + <xsl:value-of select="if (name($node) = 'cit:CI_Organisation') + then $node/(cit:partyIdentifier/*/mcc:code/*/text(), + cit:contactInfo/*/cit:onlineResource/*/cit:linkage/gco:CharacterString/text(), + cit:name/gcx:Anchor/@xlink:href, + @uuid + )[1] + else if (name($node) = 'cit:CI_Individual') + then $node/(cit:partyIdentifier/*/mcc:code/*/text(), + cit:name/gcx:Anchor/@xlink:href, + @uuid + )[1] + else if ($node/gcx:Anchor/@xlink:href) then $node/gcx:Anchor/@xlink:href + else if ($node/@xlink:href) then $node/@xlink:href + else if ($node/@uuidref) then $node/@uuidref + else if ($node/*/mri:code/*/text() != '') then $node/*/mri:code/*/text() + else ''"/> + </xsl:function> + + <!-- + Template for creating a reference to an object as an XML attribute. + --> + <xsl:template name="rdf-object-ref-attribute" + mode="rdf-object-ref-attribute" + match="*"> + <xsl:param name="isAbout" + as="xs:boolean" + select="true()"/> + <xsl:param name="reference" + as="xs:string?" + select="gn-fn-dcat:rdf-object-ref(.)"/> + + <xsl:variable name="attributeName" + select="if($isAbout) then 'rdf:about' else 'rdf:resource'"/> + + <xsl:if test="$reference != ''"> + <xsl:attribute name="{$attributeName}" select="$reference"/> + </xsl:if> + </xsl:template> + +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-variables.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-variables.xsl new file mode 100644 index 00000000000..037b7f530e8 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/dcat-variables.xsl @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + exclude-result-prefixes="#all"> + <xsl:param name="expandSkosConcept" + select="'true'"/> + <xsl:param name="isExpandSkosConcept" + select="xs:boolean($expandSkosConcept)"/> + + <xsl:variable name="isPreservingIsoType" + as="xs:boolean" + select="true()"/> + + <!-- The first resourceConstraints is accessRights, + then rights is used for additional constraints information. + https://github.com/SEMICeu/GeoDCAT-AP/issues/82 + --> + <xsl:variable name="isPreservingAllResourceConstraints" + as="xs:boolean" + select="true()"/> + + <xsl:variable name="europaPublicationBaseUri" select="'http://publications.europa.eu/resource/authority/'"/> + <xsl:variable name="europaPublicationCorporateBody" select="concat($europaPublicationBaseUri,'corporate-body/')"/> + <xsl:variable name="europaPublicationCountry" select="concat($europaPublicationBaseUri,'country/')"/> + <xsl:variable name="europaPublicationFrequency" select="concat($europaPublicationBaseUri,'frequency/')"/> + <xsl:variable name="europaPublicationFileType" select="concat($europaPublicationBaseUri,'file-type/')"/> + <xsl:variable name="europaPublicationLanguage" select="concat($europaPublicationBaseUri,'language/')"/> + + <xsl:variable name="isoCodeListBaseUri" select="'http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#'"/> + + <!-- Mapping ISO element path to corresponding DCAT names --> + <xsl:variable name="isoToDcatCommonNames" + as="node()*"> + <entry key="dct:title">mdb:MD_Metadata/mdb:identificationInfo/mri:MD_DataIdentification/mri:citation/cit:CI_Citation/cit:title</entry> + <entry key="dct:title">mdb:MD_Metadata/mdb:identificationInfo/srv:SV_ServiceIdentification/mri:citation/cit:CI_Citation/cit:title</entry> + <entry key="dct:title">mdb:MD_Metadata/mdb:metadataStandard/cit:CI_Citation/cit:title</entry> + <entry key="dct:title">mdb:MD_Metadata/mdb:distributionInfo/mrd:MD_Distribution/mrd:transferOptions/mrd:MD_DigitalTransferOptions/mrd:onLine/cit:CI_OnlineResource/cit:name</entry> + <entry key="dct:title">mdb:MD_Metadata/mdb:distributionInfo/mrd:MD_Distribution/mrd:distributor/mrd:MD_Distributor/mrd:distributorTransferOptions/mrd:MD_DigitalTransferOptions/mrd:onLine/cit:CI_OnlineResource/cit:name</entry> + <entry key="dcat:version" isMultilingual="false">mdb:MD_Metadata/mdb:identificationInfo/mri:MD_DataIdentification/mri:citation/cit:CI_Citation/cit:edition</entry> + <entry key="dcat:version" isMultilingual="false">mdb:MD_Metadata/mdb:identificationInfo/srv:SV_ServiceIdentification/mri:citation/cit:CI_Citation/cit:edition</entry> + <entry key="dct:description">mdb:MD_Metadata/mdb:identificationInfo/mri:MD_DataIdentification/mri:abstract</entry> + <entry key="dct:description">mdb:MD_Metadata/mdb:identificationInfo/srv:SV_ServiceIdentification/mri:abstract</entry> + <entry key="dct:description">mdb:MD_Metadata/mdb:identificationInfo/mri:MD_DataIdentification/mri:graphicOverview/mcc:MD_BrowseGraphic/mcc:fileDescription</entry> + <entry key="dct:description">mdb:MD_Metadata/mdb:identificationInfo/srv:SV_ServiceIdentification/mri:graphicOverview/mcc:MD_BrowseGraphic/mcc:fileDescription</entry> + <entry key="dct:description">mdb:MD_Metadata/mdb:distributionInfo/mrd:MD_Distribution/mrd:transferOptions/mrd:MD_DigitalTransferOptions/mrd:onLine/cit:CI_OnlineResource/cit:description</entry> + <entry key="dct:description">mdb:MD_Metadata/mdb:distributionInfo/mrd:MD_Distribution/mrd:distributor/mrd:MD_Distributor/mrd:distributorTransferOptions/mrd:MD_DigitalTransferOptions/mrd:onLine/cit:CI_OnlineResource/cit:description</entry> + <entry key="owl:versionInfo">mdb:MD_Metadata/mdb:metadataStandard/cit:CI_Citation/cit:edition</entry> + <entry key="adms:versionNotes">mdb:MD_Metadata/mdb:resourceLineage/mrl:LI_Lineage/mrl:statement</entry> + </xsl:variable> + + <xsl:variable name="isoDateTypeToDcatCommonNames" + as="node()*"> + <entry key="dct:issued">creation</entry> + <entry key="dct:issued">publication</entry> + <entry key="dct:modified">revision</entry> + </xsl:variable> + + <xsl:variable name="isoContactRoleToDcatCommonNames" + as="node()*"> + <entry key="dct:creator" as="foaf">author</entry> + <entry key="dct:publisher" as="foaf">publisher</entry> + <entry key="dcat:contactPoint" as="vcard">pointOfContact</entry> + <entry key="dct:rightsHolder" as="foaf">owner</entry> <!-- TODO: Check if dcat or only in profile --> + <!-- Others are prov:qualifiedAttribution --> + </xsl:variable> + + <!-- DCAT resource type from ISO hierarchy level --> + <xsl:variable name="dcatResourceTypeToIso" + as="node()*"> + <entry key="DatasetSeries">series</entry> + <entry key="Dataset">dataset</entry> + <entry key="Dataset">nonGeographicDataset</entry> + <entry key="Dataset"></entry> + <entry key="DataService">service</entry> + <entry key="Catalogue">?</entry> + </xsl:variable> + + <!-- https://www.dublincore.org/specifications/dublin-core/dcmi-terms/#section-7 --> + <xsl:variable name="dcmiTypeVocabularyToIso" + as="node()*"> + <entry key="Collection">series</entry> + <entry key="Dataset">dataset</entry> + <entry key="Dataset">nonGeographicDataset</entry> + <entry key="Event"></entry> + <entry key="Image"></entry> + <entry key="InteractiveResource"></entry> + <entry key="MovingImage"></entry> + <entry key="PhysicalObject"></entry> + <entry key="Service">service</entry> + <entry key="Software">software</entry> + <entry key="Sound"></entry> + <entry key="StillImage"></entry> + <entry key="Text"></entry> + </xsl:variable> + + + <xsl:variable name="formatLabelToUri" + as="node()*"> + <entry key="https://publications.europa.eu/resource/authority/file-type/GRID_ASCII">aaigrid</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GRID">aig</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ATOM">atom</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/CSV">csv</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">csw</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/DBF">dbf</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/BIN">dgn</entry> + <entry key="https://www.iana.org/assignments/media-types/image/vn.djvu">djvu</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/DOC">doc</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/DOCX">docx</entry> + <entry key="https://www.iana.org/assignments/media-types/image/vn.dxf">dxf</entry> + <entry key="https://www.iana.org/assignments/media-types/image/vn.dwg">dwg</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ECW">ecw</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ECW">ecwp</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/EXE">elp</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/EPUB">epub</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GDB">fgeo</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GDB">gdb</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GEOJSON">geojson</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GPKG">geopackage</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RSS">georss</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TIFF">geotiff</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GIF">gif</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">gml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GMZ">gmz</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GPKG">gpkg</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">gpx</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GRID">grid</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GRID_ASCII">grid_ascii</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/CSV">gtfs</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TIFF">gtiff</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GZIP">gzip</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/HTML">html</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JPEG">jpeg</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JPEG">jpg</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JSON">json</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JSON_LD">json-ld</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JSON_LD">json_ld</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JSON_LD">jsonld</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/KML">kml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/KMZ">kmz</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/LAS">las</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/LAZ">laz</entry> + <entry key="https://www.iana.org/assignments/media-types/application/marc">marc</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/MDB">mdb</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/MXD">mxd</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_N_TRIPLES">n-triples</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/N3">n3</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/NETCDF">netcdf</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ODS">ods</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ODT">odt</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">ogc:csw</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">ogc:sos</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TIFF">ogc:wcs</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">ogc:wfs</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">ogc:wfs-g</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">ogc:wmc</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/PNG">ogc:wms</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/PNG">ogc:wmts</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">ogc:wps</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TXT">pc-axis</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/PDF">pdf</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/MDB">pgeo</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/PNG">png</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RAR">rar</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/rdf/RDF_XML">xml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/N3">rdf-n3</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_TURTLE">rdf-turtle</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_XML">rdf-xml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_N_TRIPLES">rdf_n_triples</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/N3">rdf_n3</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_TURTLE">rdf_turtle</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_XML">rdf_xml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RSS">rss</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RTF">rtf</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ZIP">scorm</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/SHP">shp</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/SHP">ESRI Shapefile</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">sos</entry> + <entry key="https://www.iana.org/assignments/media-types/application/vnd.sqlite3">spatialite</entry> + <entry key="https://www.iana.org/assignments/media-types/application/vnd.sqlite3">sqlite</entry> + <entry key="https://www.iana.org/assignments/media-types/application/vnd.sqlite3">sqlite3</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/SVG">svg</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TXT">text</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TIFF">tiff</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TMX">tmx</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TSV">tsv</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_TURTLE">ttl</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/RDF_TURTLE">turtle</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TXT">txt</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/JSON">vcard-json</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">vcard-xml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">xbrl</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XHTML">xhtml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XLS">xls</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XLSX">xlsx</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">xml</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/TIFF">wcs</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">wfs</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">wfs-g</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/XML">wmc</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/PNG">wms</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/PNG">wmts</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/GML">wps</entry> + <entry key="https://publications.europa.eu/resource/authority/file-type/ZIP">zip</entry> + </xsl:variable> + + <!-- DCAT uses the terminology code, while ISO uses bibliographic code. + For some languages like Dutch, French or German the values differ. --> + <xsl:variable name="isoToDcatLanguage" + as="node()*"> + <entry key="dut">nld</entry> <!-- Dutch --> + <entry key="cze">ces</entry> <!-- Czech --> + <entry key="ger">deu</entry> <!-- German --> + <entry key="gre">ell</entry> <!-- Greek --> + <entry key="fre">fra</entry> <!-- French --> + <entry key="rum">ron</entry> <!-- Romanian --> + <entry key="slo">slk</entry> <!-- Slovak --> + <entry key="ice">isl</entry> <!-- Icelandic--> + </xsl:variable> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/view.xsl new file mode 100644 index 00000000000..1b5dc69b565 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/view.xsl @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + <!-- https://www.w3.org/TR/vocab-dcat-3/ --> + + <xsl:import href="dcat-core.xsl"/> + + <xsl:template match="/"> + <rdf:RDF> + <xsl:call-template name="create-namespaces"/> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="root/mdb:MD_Metadata|mdb:MD_Metadata"/> + </rdf:RDF> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/vocabularies/licences-skos.rdf b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/vocabularies/licences-skos.rdf new file mode 100644 index 00000000000..3bf8547e4a5 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/dcat/vocabularies/licences-skos.rdf @@ -0,0 +1,7070 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:at="http://publications.europa.eu/ontology/authority/" + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:owl="http://www.w3.org/2002/07/owl#" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:atold="http://publications.europa.eu/resource/authority/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xml:base="http://publications.europa.eu/resource/authority/licence"> + <skos:ConceptScheme rdf:about="http://publications.europa.eu/resource/authority/licence" + at:table.id="licence" + at:table.version.number="20230927-0"> + <at:prefLabel xml:lang="en">Licence</at:prefLabel> + <rdfs:label xml:lang="en">Licence</rdfs:label> + <owl:versionInfo>20230927-0</owl:versionInfo> + <skos:prefLabel xml:lang="en">Licence</skos:prefLabel> + </skos:ConceptScheme> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/0BSD" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Zero-Clause BSD / Free Public License 1.0.0 (0BSD)</skos:prefLabel> + <at:authority-code>0BSD</at:authority-code> + <at:op-code>0BSD</at:op-code> + <at:start.use>2006-07-01</at:start.use> + <atold:op-code>0BSD</atold:op-code> + <dc:identifier>0BSD</dc:identifier> + <skos:altLabel xml:lang="bg">0BSD</skos:altLabel> + <skos:altLabel xml:lang="cs">0BSD</skos:altLabel> + <skos:altLabel xml:lang="da">0BSD</skos:altLabel> + <skos:altLabel xml:lang="de">0BSD</skos:altLabel> + <skos:altLabel xml:lang="el">0BSD</skos:altLabel> + <skos:altLabel xml:lang="en">0BSD</skos:altLabel> + <skos:altLabel xml:lang="es">0BSD</skos:altLabel> + <skos:altLabel xml:lang="et">0BSD</skos:altLabel> + <skos:altLabel xml:lang="fi">0BSD</skos:altLabel> + <skos:altLabel xml:lang="fr">0BSD</skos:altLabel> + <skos:altLabel xml:lang="ga">0BSD</skos:altLabel> + <skos:altLabel xml:lang="hr">0BSD</skos:altLabel> + <skos:altLabel xml:lang="hu">0BSD</skos:altLabel> + <skos:altLabel xml:lang="it">0BSD</skos:altLabel> + <skos:altLabel xml:lang="lt">0BSD</skos:altLabel> + <skos:altLabel xml:lang="lv">0BSD</skos:altLabel> + <skos:altLabel xml:lang="mt">0BSD</skos:altLabel> + <skos:altLabel xml:lang="nl">0BSD</skos:altLabel> + <skos:altLabel xml:lang="pl">0BSD</skos:altLabel> + <skos:altLabel xml:lang="pt">0BSD</skos:altLabel> + <skos:altLabel xml:lang="ro">0BSD</skos:altLabel> + <skos:altLabel xml:lang="sk">0BSD</skos:altLabel> + <skos:altLabel xml:lang="sl">0BSD</skos:altLabel> + <skos:altLabel xml:lang="sv">0BSD</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/0BSD.html</skos:changeNote> + <skos:definition xml:lang="en">The BSD 0-clause licence, 0BSD, goes further than the 2-clause licence by dropping the requirements to include the copyright notice, licence text or disclaimer in either source or binary forms. Doing so forms a public-domain-equivalent licence. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/0BSD"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/AGPL_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">GNU Affero General Public License version 3</skos:prefLabel> + <at:authority-code>AGPL_3_0</at:authority-code> + <at:op-code>AGPL_3_0</at:op-code> + <at:start.use>2007-11-19</at:start.use> + <atold:op-code>AGPL_3_0</atold:op-code> + <dc:identifier>AGPL_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="da">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="de">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="el">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="en">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="es">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="et">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="it">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">AGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">AGPL-3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Affero_General_Public_License</skos:changeNote> + <skos:definition xml:lang="en">AGPL-3.0 is a modified GPL-3.0 extended to network or Web services distribution (SaaS). Strong copyleft: copies and derivatives may be distributed under the same AGPL only. Need to document derivatives’ changes and dates. Incompatible with other licences except linking with code covered by the original GPL-3.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/AGPL-3.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/APACHE_1_1" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Apache Software License, version 1.1 (Apache-1.1)</skos:prefLabel> + <skos:prefLabel xml:lang="et">Apache tarkvara litsents, versioon 1.1 (Apache-1.1)</skos:prefLabel> + <at:authority-code>APACHE_1_1</at:authority-code> + <at:op-code>APACHE_1_1</at:op-code> + <at:start.use>2000-01-01</at:start.use> + <atold:op-code>APACHE_1_1</atold:op-code> + <dc:identifier>APACHE_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="da">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="de">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="el">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="en">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="es">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="et">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="it">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">Apache 1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">Apache 1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/Apache-1.1</skos:changeNote> + <skos:definition xml:lang="en">Apache-1.1 is a permissive free software licence approved by the Open Source Initiative. It is superseded by Apache-2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Apache-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-01-01</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/APACHE_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Apache License, Version 2.0</skos:prefLabel> + <skos:prefLabel xml:lang="et">Apache litsents, versioon 2.0</skos:prefLabel> + <at:authority-code>APACHE_2_0</at:authority-code> + <at:op-code>APACHE_2_0</at:op-code> + <at:start.use>2004-01-02</at:start.use> + <atold:op-code>APACHE_2_0</atold:op-code> + <dc:identifier>APACHE_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Apache 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Apache 2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/Apache-2.0</skos:changeNote> + <skos:definition xml:lang="en">Apache-2.0 is a permissive free software licence approved by the Open Source Initiative. It gives complete freedom to use the given works, as long as the required notices are included. Compared with the MIT, recipients receive a patent licence from the contributors of the code.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Apache-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/APL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Adaptive Public License 1.0</skos:prefLabel> + <at:authority-code>APL_1_0</at:authority-code> + <at:op-code>APL_1_0</at:op-code> + <at:start.use>2003-07-01</at:start.use> + <atold:op-code>APL_1_0</atold:op-code> + <dc:identifier>APL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">APL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">APL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://www.worldlii.org/int/other/PubRL/2009/1.html</skos:changeNote> + <skos:definition xml:lang="en">APL-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. It allows combining the covered code with other components not governed by the APL licence provided the APL requirements are fulfilled for the covered portion of the larger work.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/APL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/APSL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Apple Public Source License 2.0</skos:prefLabel> + <at:authority-code>APSL_2_0</at:authority-code> + <at:op-code>APSL_2_0</at:op-code> + <at:start.use>2003-08-06</at:start.use> + <atold:op-code>APSL_2_0</atold:op-code> + <dc:identifier>APSL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">APSL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">APSL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Apple_Public_Source_License</skos:changeNote> + <skos:definition xml:lang="en">APSL-2.0 is a copyleft-style, free software licence approved by the Open Source Initiative. Under this licence, it is possible to create a larger work by combining covered code with other code not governed by the terms of this licence and distribute the larger work as a single product. In each such instance, it must be ensured that requirements of this licence are fulfilled for the covered code or any portion thereof.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/APSL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ARTISTIC_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Artistic License 1.0 (Artistic-1.0)</skos:prefLabel> + <at:authority-code>ARTISTIC_1_0</at:authority-code> + <at:op-code>ARTISTIC_1_0</at:op-code> + <at:start.use>1997-08-15</at:start.use> + <atold:op-code>ARTISTIC_1_0</atold:op-code> + <dc:identifier>ARTISTIC_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Artistic 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Artistic 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://wiki.vvlibri.org/index.php?title=Artistic_License_Version_2.0</skos:changeNote> + <skos:definition xml:lang="en">Artistic-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. It is superseded by Artistic 2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Artistic-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2000-06-30</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ARTISTIC_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Artistic License 2.0</skos:prefLabel> + <at:authority-code>ARTISTIC_2_0</at:authority-code> + <at:op-code>ARTISTIC_2_0</at:op-code> + <at:start.use>2000-07-01</at:start.use> + <atold:op-code>ARTISTIC_2_0</atold:op-code> + <dc:identifier>ARTISTIC_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Artistic 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Artistic 2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.appropedia.org/Open_software_licenses; http://www.linfo.org/artistic.html</skos:changeNote> + <skos:definition xml:lang="en">Artistic-2.0 is a copyleft-style, free software licence approved by the Open Source Initiative. It preserves control of the original copyright holder: recipient can use, modify and distribute the original versions but other modified versions must document how far they are different and be reported to the original author, or be distributed under a different name, or otherwise be available under the Artistic licence or any other licence granting similar rights.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Artistic-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/BSD_2_CLAUSE" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">2-Clause BSD License</skos:prefLabel> + <at:authority-code>BSD_2_CLAUSE</at:authority-code> + <at:op-code>BSD_2_CLAUSE</at:op-code> + <at:start.use>1999-04-01</at:start.use> + <atold:op-code>BSD_2_CLAUSE</atold:op-code> + <dc:identifier>BSD_2_CLAUSE</dc:identifier> + <skos:altLabel xml:lang="bg">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="cs">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="da">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="de">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="el">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="en">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="es">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="et">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="fi">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="fr">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="ga">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="hr">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="hu">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="it">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="lt">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="lv">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="mt">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="nl">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="pl">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="pt">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="ro">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="sk">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="sl">BSD-2-Clause</skos:altLabel> + <skos:altLabel xml:lang="sv">BSD-2-Clause</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/BSD_licenses</skos:changeNote> + <skos:definition xml:lang="en">BSD-2-Clause permits redistribution and use in source and binary forms, with or without modification, provided that the certain conditions are met: redistributions of source code must retain the copyright notice, the specific list of conditions and the disclaimer.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/BSD-2-Clause"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/BSD_3_CLAUSE" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">3-Clause BSD License</skos:prefLabel> + <at:authority-code>BSD_3_CLAUSE</at:authority-code> + <at:op-code>BSD_3_CLAUSE</at:op-code> + <at:start.use>1999-07-22</at:start.use> + <atold:op-code>BSD_3_CLAUSE</atold:op-code> + <dc:identifier>BSD_3_CLAUSE</dc:identifier> + <skos:altLabel xml:lang="bg">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="cs">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="da">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="de">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="el">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="en">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="es">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="et">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="fi">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="fr">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="ga">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="hr">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="hu">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="it">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="lt">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="lv">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="mt">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="nl">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="pl">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="pt">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="ro">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="sk">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="sl">BSD-3-Clause</skos:altLabel> + <skos:altLabel xml:lang="sv">BSD-3-Clause</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/BSD_licenses</skos:changeNote> + <skos:definition xml:lang="en">BSD-3-Clause permits redistribution and use in source and binary forms, with or without modification, provided that the certain conditions are met: redistributions of source code and in binary forms must retain the copyright notice, the specific list of conditions and the disclaimer. Neither the name of the copyright holder nor of its contributors may be used to promote derived products without prior written permission.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/BSD-3-Clause"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/BSD_3_CLAUSE_LBNL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Lawrence Berkeley National Labs BSD Variant License (BSD-3-Clause-LBNL)</skos:prefLabel> + <at:authority-code>BSD_3_CLAUSE_LBNL</at:authority-code> + <at:op-code>BSD_3_CLAUSE_LBNL</at:op-code> + <at:start.use>2002-07-01</at:start.use> + <atold:op-code>BSD_3_CLAUSE_LBNL</atold:op-code> + <dc:identifier>BSD_3_CLAUSE_LBNL</dc:identifier> + <skos:altLabel xml:lang="bg">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="cs">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="da">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="de">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="el">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="en">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="es">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="et">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="fi">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="fr">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="ga">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="hr">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="hu">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="it">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="lt">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="lv">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="mt">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="nl">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="pl">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="pt">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="ro">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="sk">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="sl">BSD-3-Clause-LBNL</skos:altLabel> + <skos:altLabel xml:lang="sv">BSD-3-Clause-LBNL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/lbnl-bsd/?_list_filters=q%3Dbsd#essentials</skos:changeNote> + <skos:definition xml:lang="en">BSD-3-Clause-LBNL is a BSD-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/BSD-3-Clause-LBNL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/BSD_PLUS_PATENT" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">BSD+Patent</skos:prefLabel> + <at:authority-code>BSD_PLUS_PATENT</at:authority-code> + <at:op-code>BSD_PLUS_PATENT</at:op-code> + <at:start.use>2017-07-01</at:start.use> + <atold:op-code>BSD_PLUS_PATENT</atold:op-code> + <dc:identifier>BSD_PLUS_PATENT</dc:identifier> + <skos:altLabel xml:lang="bg">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="cs">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="da">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="de">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="el">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="es">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="et">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="fi">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="fr">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="ga">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="hr">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="hu">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="it">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="lt">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="lv">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="mt">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="nl">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="pl">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="pt">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="ro">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="sk">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="sl">BSD+Patent</skos:altLabel> + <skos:altLabel xml:lang="sv">BSD+Patent</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/bsd-plus-patent/?_list_filters=q%3Dbsd#essentials</skos:changeNote> + <skos:definition xml:lang="en">BSD+Patent is a free software licence approved by the Open Source Initiative. It is a 2-clause license in which nothing restricts redistribution under any other license, but it requests to retain copyright notices and restrict the use of the BSD licensor name to promote derivative products.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/BSDplusPatent"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/BSL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Boost Software License 1.0</skos:prefLabel> + <at:authority-code>BSL_1_0</at:authority-code> + <at:op-code>BSL_1_0</at:op-code> + <at:start.use>2003-08-17</at:start.use> + <atold:op-code>BSL_1_0</atold:op-code> + <dc:identifier>BSL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">BSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">BSL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Boost_(C%2B%2B_libraries)#License</skos:changeNote> + <skos:definition xml:lang="en">BSL-1.0 is a simple permissive licence only requiring preservation of copyright and licence notices for source (and not binary) distribution. Licenced works, modifications, and larger works may be distributed under different terms and without source code.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/BSL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CATOSL_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Computer Associates Trusted Open Source License 1.1 (CATOSL-1.1)</skos:prefLabel> + <at:authority-code>CATOSL_1_1</at:authority-code> + <at:op-code>CATOSL_1_1</at:op-code> + <at:start.use>2004-07-31</at:start.use> + <atold:op-code>CATOSL_1_1</atold:op-code> + <dc:identifier>CATOSL_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">CATOSL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">CATOSL-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://webcache.googleusercontent.com/search?q=cache:7pbd65y1OUYJ:https://www.theinquirer.net/inquirer/news/1022762/computer-associates-open-source-guru-speaks-out+&cd=1&hl=en&ct=clnk&gl=lu</skos:changeNote> + <skos:definition xml:lang="en">CATOSL-1.1 is a copyleft-style, free software licence approved by the Open Source Initiative. Under this licence, it is possible to create a larger work by combining the program with other software code not governed by the terms of this licence, and distribute the larger work as a single product.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/CATOSL-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons CC0 1.0 Универсален</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons CC0 1.0 Univerzální</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons CC0 1.0 Universel</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons CC0 1.0 Universell</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons CC0 1.0 Παγκόσμια</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons CC0 1.0 Universal</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons CC0 1.0 Universal</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons CC0 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons CC0 1.0 Yleismaailmallinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons CC0 1.0 Universel</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons CC0 1.0 Univerzalno</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons CC0 1.0 Univerzális</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons CC0 1.0 Universal</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons CC0 1.0 Universali</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons CC0 1.0 Universāls</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons CC0 1.0 Universali</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons CC0 1.0 Universeel</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons CC0 1.0 Universal</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons CC0 1.0 Universal</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons CC0 1.0 Universal</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons CC0 1.0 Univerzálne</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons CC0 1.0 Univerzalna</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons CC0 1.0 universell</skos:prefLabel> + <at:authority-code>CC0</at:authority-code> + <at:op-code>CC0</at:op-code> + <at:start.use>2009-03-11</at:start.use> + <atold:op-code>CC0</atold:op-code> + <dc:identifier>CC0</dc:identifier> + <skos:altLabel xml:lang="bg">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC0 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC0 1.0</skos:altLabel> + <skos:definition xml:lang="da">Personen, der har tilknyttet et værk disse betingelser, har dedikeret værket til offentligheden ved at give afkald på alle sine rettigheder til værket verden over, indenfor lovgivning om ophavsret, herunder alle relaterede og beslægtede rettigheder i det omfang, loven tillader. Du må kopiere, ændre, distribuere og fremføre værket, selv til kommercielle formål, alt sammen uden at spørge om tilladelse.</skos:definition> + <skos:definition xml:lang="en">The person who associated a work with CC0 1.0 has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. One can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.</skos:definition> + <skos:definition xml:lang="fr">La personne qui a associé une œuvre à CC0 1.0 a dédié l’œuvre au domaine public en renonçant dans le monde entier à ses droits sur l’œuvre selon les lois sur le droit d’auteur, droit voisin et connexes, dans la mesure permise par la loi. On peut copier, modifier, distribuer et représenter l’œuvre, même à des fins commerciales, sans avoir besoin de demander l’autorisation.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY" + at:deprecated="true"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Navngivelse 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande 4.0 Internationell</skos:prefLabel> + <at:authority-code>CC_BY</at:authority-code> + <at:op-code>CC_BY</at:op-code> + <at:start.use>2013-11-25</at:start.use> + <atold:op-code>CC_BY</atold:op-code> + <dc:identifier>CC_BY</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 4.0</skos:altLabel> + <skos:definition xml:lang="en">This licence lets others distribute, remix, tweak, and build upon the author's work, even commercially, as long as they credit the author for the original creation. This is the most accommodating of licences offered. Recommended for maximum dissemination and use of licenced materials.</skos:definition> + <skos:definition xml:lang="fr">Cette licence permet aux autres de distribuer, remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/l’autrice en citant son nom. C’est le contrat le plus souple proposé. Recommandé pour la diffusion et l’utilisation maximales d’œuvres licenciées sous CC.</skos:definition> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2013-11-26</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNC" + at:deprecated="true"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Navngivelse–IkkeKommerciel 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell 4.0 Internationell</skos:prefLabel> + <at:authority-code>CC_BYNC</at:authority-code> + <at:op-code>CC_BYNC</at:op-code> + <at:start.use>2013-11-25</at:start.use> + <atold:op-code>CC_BYNC</atold:op-code> + <dc:identifier>CC_BYNC</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC 4.0</skos:altLabel> + <skos:definition xml:lang="en">This licence lets others remix, tweak, and build upon the author's work non-commercially, and although their new works must also acknowledge the author and be non-commercial, they don’t have to licence their derivative works on the same terms.</skos:definition> + <skos:definition xml:lang="fr">Cette licence permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales et, bien que les nouvelles œuvres doivent créditer l’auteur/autrice en citant son nom et ne pas constituer une utilisation commerciale, elles n’ont pas à être diffusées selon les mêmes conditions.</skos:definition> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2013-11-26</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCND" + at:deprecated="true"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně–Nezpracovávejte 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Navngivelse–IkkeKommerciel–IngenBearbejdelse 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell – Keine Bearbeitungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Όχι Παράγωγα Έργα 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–NoDerivatives 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–SinDerivar 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–EiMuutoksia 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d'Utilisation Commerciale – Pas de Modification 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Bez prerada 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Ne változtasd! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Non opere derivate 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Jokių išvestinių darbų 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties, nekomerciāli, nepārveidojot 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GeenAfgeleideWerken 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Bez utworów zależnych 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–SemDerivações 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–FărăDerivate 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–Ickekommersiell–IngaBearbetningar 4.0 Internationell</skos:prefLabel> + <at:authority-code>CC_BYNCND</at:authority-code> + <at:op-code>CC_BYNCND</at:op-code> + <at:start.use>2013-11-25</at:start.use> + <atold:op-code>CC_BYNCND</atold:op-code> + <dc:identifier>CC_BYNCND</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-ND 4.0</skos:altLabel> + <skos:definition xml:lang="en">This licence is the most restrictive of the six main licences of Creative Commons, only allowing others to download the works and share them with others as long as they credit the author, but they can’t change them in any way or use them commercially.</skos:definition> + <skos:definition xml:lang="fr">Cette licence est la plus restrictive des six licences principales de Creative Commons, n’autorisant les autres qu’à télécharger les œuvres de l’auteur/autrice et à les partager qu’on le/la crédite en citant son nom, mais on ne peut les modifier de quelque façon que ce soit ni les utiliser à des fins commerciales.</skos:definition> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2013-11-26</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCND_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни-Некомерсиално 1.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte–Neužívejte komerčně 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ingen afledninger-Ikkekommerciel 1.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitungen – Nicht-kommerziell 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα – Μη Εμπορική Χρήση 1.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivs–NonCommercial 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivadas–NoComercial 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Tuletatud teoste keeld–Mitteäriline eesmärk 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia–EiKaupallinen 1.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification – Pas d’Utilisation Commerciale 1.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada–Nekomercijalno 1.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! – Ne add el! 1.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate – Non commerciale 1.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų – Nekomercinis platinimas 1.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nepārveidojot–Nekomerciāli 1.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-EbdaDerivattivi-MhuxKummerċjali 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken–NietCommercieel 1.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Bez utworów zależnych–Użycie Niekomercyjne 1.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações–NãoComercial 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–FărăModificări–Necomercial 1.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Bez Odvodeného Obsahu-Nekomerčné Použitie 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Brez predelav-Nekomercialno 1.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar–IckeKommersiell 1.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNCND_1_0</at:authority-code> + <at:op-code>CC_BYNCND_1_0</at:op-code> + <at:start.use>2002-12-15</at:start.use> + <atold:op-code>CC_BYNCND_1_0</atold:op-code> + <dc:identifier>CC_BYNCND_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND-NC 1.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND-NC 1.0 is the most restrictive of the six main licences of Creative Commons, only allowing others to download the works and share them with others as long as they credit the author, but they can’t change them in any way or use them commercially.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND-NC 1.0 est la plus restrictive des six licences principales de Creative Commons, n’autorisant les autres qu’à télécharger les œuvres de l’auteur/autrice et à les partager tant qu’on le/la crédite en citant son nom, mais on ne peut les modifier de quelque façon que ce soit ni les utiliser à des fins commerciales.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nd-nc/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-05-24</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCND_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни-Некомерсиално 2.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně–Nezpracovávejte 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Ingen afledninger 2.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Keine Bearbeitung 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Όχι Παράγωγα Έργα 2.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–NoDerivs 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–SinDerivadas 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Tuletatud teoste keeld 2.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–EiMuutoksia 2.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 2.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Bez prerada 2.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Ne változtasd! 2.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Non opere derivate 2.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Jokių išvestinių darbų 2.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nepārveidojot 2.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-EbdaDerivattivi 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GeenAfgeleideWerken 2.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Bez utworów zależnych 2.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–SemDerivações 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–FărăModificări 2.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Bez Odvodeného Obsahu 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Brez predelav 2.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–Ickekommersiell–IngaBearbetningar 2.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNCND_2_0</at:authority-code> + <at:op-code>CC_BYNCND_2_0</at:op-code> + <at:start.use>2004-05-25</at:start.use> + <atold:op-code>CC_BYNCND_2_0</atold:op-code> + <dc:identifier>CC_BYNCND_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-ND 2.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND-NC 2.0 is the most restrictive of the six main licences of Creative Commons, only allowing others to download the works and share them with others as long as they credit the author, but they can’t change them in any way or use them commercially.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND-NC 2.0 est la plus restrictive des six licences principales de Creative Commons, n’autorisant les autres qu’à télécharger les œuvres de l’auteur/autrice et à les partager tant qu’on le/la crédite en citant son nom, mais on ne peut les modifier de quelque façon que ce soit ni les utiliser à des fins commerciales.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCND_2_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни-Некомерсиално 2.5 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně–Nezpracovávejte 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Ingen afledninger 2.5 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Keine Bearbeitung 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Όχι Παράγωγα Έργα 2.5 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–NoDerivs 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–SinDerivadas 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Tuletatud teoste keeld 2.5 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–EiMuutoksia 2.5 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 2.5 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Bez prerada 2.5 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Ne változtasd! 2.5 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Non opere derivate 2.5 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Jokių išvestinių darbų 2.5 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nepārveidojot 2.5 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-EbdaDerivattivi 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GeenAfgeleideWerken 2.5 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Bez utworów zależnych 2.5 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–SemDerivações 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–FărăModificări 2.5 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Bez Odvodeného Obsahu 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Brez predelav 2.5 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–Ickekommersiell–IngaBearbetningar 2.5 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNCND_2_5</at:authority-code> + <at:op-code>CC_BYNCND_2_5</at:op-code> + <at:start.use>2005-06-01</at:start.use> + <atold:op-code>CC_BYNCND_2_5</atold:op-code> + <dc:identifier>CC_BYNCND_2_5</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-ND 2.5</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND-NC 2.5 is the most restrictive of the six main licences of Creative Commons, only allowing others to download the works and share them with others as long as they credit the author, but they can’t change them in any way or use them commercially.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND-NC 2.5 est la plus restrictive des six licences principales de Creative Commons, n’autorisant les autres qu’à télécharger les œuvres de l’auteur/autrice et à les partager tant qu’on le/la crédite en citant son nom, mais on ne peut les modifier de quelque façon que ce soit ni les utiliser à des fins commerciales.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.5/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCND_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Без производни 3.0 Нелокализиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně–Nezpracovávejte 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Ingen afledninger 3.0 Ikke porteret</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Keine Bearbeitung 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Όχι Παράγωγα Έργα 3.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–NoDerivs 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–SinDerivadas 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Tuletatud teoste keeld 3.0 Jurisdiktsiooniga sidumata</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–EiMuutoksia 3.0 Ei sovitettu</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 3.0 non transposé</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Bez prerada 3.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Ne változtasd! 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Non opere derivate 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Jokių išvestinių darbų 3.0 Nepritaikyta jurisdikcijai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nepārveidojot 3.0 Nepārnesta</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-EbdaDerivattivi 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GeenAfgeleideWerken 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Bez utworów zależnych 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–SemDerivações 3.0 Não Adaptada</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–FărăModificări 3.0 Ne-adaptată</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Bez Odvodeného Obsahu 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Brez predelav 3.0 Nedoločena</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–Ickekommersiell–IngaBearbetningar 3.0 Unported</skos:prefLabel> + <at:authority-code>CC_BYNCND_3_0</at:authority-code> + <at:op-code>CC_BYNCND_3_0</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BYNCND_3_0</atold:op-code> + <dc:identifier>CC_BYNCND_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-ND 3.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND-NC 3.0 is the most restrictive of the six main licences of Creative Commons, only allowing others to download the works and share them with others as long as they credit the author, but they can’t change them in any way or use them commercially.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND-NC 3.0 est la plus restrictive des six licences principales de Creative Commons, n’autorisant les autres qu’à télécharger les œuvres de l’auteur/autrice et à les partager tant qu’on le/la crédite en citant son nom, mais on ne peut les modifier de quelque façon que ce soit ni les utiliser à des fins commerciales.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:historyNote xml:lang="en">Unported licences are licences that are not associated with any specific jurisdiction, e.g. country.</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCND_4_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně–Nezpracovávejte 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell – Keine Bearbeitungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Όχι Παράγωγα Έργα 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–NoDerivatives 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–SinDerivar 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–EiMuutoksia 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d'Utilisation Commerciale – Pas de Modification 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Bez prerada 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Ne változtasd! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Non opere derivate 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Jokių išvestinių darbų 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties, nekomerciāli, nepārveidojot 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GeenAfgeleideWerken 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Bez utworów zależnych 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–SemDerivações 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–FărăDerivate 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–Ickekommersiell–IngaBearbetningar 4.0 Internationell</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Без производни 4.0 Международен</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Ingen afledninger 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Tuletatud teoste keeld 4.0 Rahvusvaheline</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-EbdaDerivattivi 4.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Žiadne Odvodené Diela 4.0 Medzinárodný</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Brez predelav 4.0 Mednarodna</skos:prefLabel> + <at:authority-code>CC_BYNCND_4_0</at:authority-code> + <at:op-code>CC_BYNCND_4_0</at:op-code> + <at:start.use>2013-11-26</at:start.use> + <atold:op-code>CC_BYNCND_4_0</atold:op-code> + <dc:identifier>CC_BYNCND_4_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-ND 4.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND-NC 4.0 is the most restrictive of the six main licences of Creative Commons, only allowing others to download the works and share them with others as long as they credit the author, but they can’t change them in any way or use them commercially.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND-NC 4.0 est la plus restrictive des six licences principales de Creative Commons, n’autorisant les autres qu’à télécharger les œuvres de l’auteur/autrice et à les partager tant qu’on le/la crédite en citant son nom, mais on ne peut les modifier de quelque façon que ce soit ni les utiliser à des fins commerciales.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-nd/4.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCSA" + at:deprecated="true"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte dílo komerčně–Zachovejte licenci 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Navngivelse–IkkeKommerciel–DelPåSammeVilkår 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Weitergabe unter gleichen Bedingungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Παρόμοια Διανομή 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–ShareAlike 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–CompartirIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–JaaSamoin 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Dijeli pod istim uvjetima 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Condividi allo stesso modo 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Analogiškas platinimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nemainot licenci 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GelijkDelen 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Na tych samych warunkach 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–CompartilhaIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–Distribuire în Condiţii Identice 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell–DelaLika 4.0 Internationell</skos:prefLabel> + <at:authority-code>CC_BYNCSA</at:authority-code> + <at:op-code>CC_BYNCSA</at:op-code> + <at:start.use>2013-11-25</at:start.use> + <atold:op-code>CC_BYNCSA</atold:op-code> + <dc:identifier>CC_BYNCSA</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-SA 4.0</skos:altLabel> + <skos:definition xml:lang="en">This licence lets others remix, tweak, and build upon the author’s work non-commercially, as long as they credit the author and licence their new creations under the identical terms.</skos:definition> + <skos:definition xml:lang="fr">Cette licence permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales tant qu’on le/la crédite en citant son nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions.</skos:definition> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2013-11-26</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCSA_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Споделяне на споделеното 1.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte dílo komerčně–Zachovejte licenci 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Deling på samme vilkår 1.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Weitergabe unter gleichen Bedingungen 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Παρόμοια Διανομή 1.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–ShareAlike 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–CompartirIgual 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Jagamine samadel tingimustel 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–JaaSamoin 1.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 1.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Dijeli pod istim uvjetima 1.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 1.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Condividi allo stesso modo 1.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Analogiškas platinimas 1.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nemainot licenci 1.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-KondiviżjoniUgwali 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GelijkDelen 1.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Na tych samych warunkach 1.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–CompartilhaIgual 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–Distribuire în Condiţii Identice 1.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Rovnaké Šírenie 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 1.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell–DelaLika 1.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNCSA_1_0</at:authority-code> + <at:op-code>CC_BYNCSA_1_0</at:op-code> + <at:start.use>2002-12-15</at:start.use> + <atold:op-code>CC_BYNCSA_1_0</atold:op-code> + <dc:identifier>CC_BYNCSA_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-SA 1.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC-SA 1.0 lets others remix, tweak, and build upon the author’s work non-commercially, as long as they credit the author and licence their new creations under the identical terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC-SA 1.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales tant qu’on le/la crédite en citant son nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-sa/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-05-24</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCSA_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Споделяне на споделеното 2.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte dílo komerčně–Zachovejte licenci 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Deling på samme vilkår 2.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Weitergabe unter gleichen Bedingungen 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Παρόμοια Διανομή 2.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–ShareAlike 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–CompartirIgual 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Jagamine samadel tingimustel 2.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–JaaSamoin 2.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 2.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Dijeli pod istim uvjetima 2.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 2.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Condividi allo stesso modo 2.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Analogiškas platinimas 2.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nemainot licenci 2.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-KondiviżjoniUgwali 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GelijkDelen 2.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Na tych samych warunkach 2.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–CompartilhaIgual 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–Distribuire în Condiţii Identice 2.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Rovnaké Šírenie 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 2.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell–DelaLika 2.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNCSA_2_0</at:authority-code> + <at:op-code>CC_BYNCSA_2_0</at:op-code> + <at:start.use>2004-05-25</at:start.use> + <atold:op-code>CC_BYNCSA_2_0</atold:op-code> + <dc:identifier>CC_BYNCSA_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-SA 2.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC-SA 2.0 lets others remix, tweak, and build upon the author’s work non-commercially, as long as they credit the author and licence their new creations under the identical terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC-SA 2.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales tant qu’on le/la crédite en citant son nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCSA_2_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Споделяне на споделеното 2.5 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte dílo komerčně–Zachovejte licenci 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Deling på samme vilkår 2.5 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Weitergabe unter gleichen Bedingungen 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Παρόμοια Διανομή 2.5 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–ShareAlike 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–CompartirIgual 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Jagamine samadel tingimustel 2.5 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–JaaSamoin 2.5 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 2.5 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Dijeli pod istim uvjetima 2.5 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 2.5 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Condividi allo stesso modo 2.5 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Analogiškas platinimas 2.5 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nemainot licenci 2.5 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-KondiviżjoniUgwali 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GelijkDelen 2.5 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Na tych samych warunkach 2.5 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–CompartilhaIgual 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–Distribuire în Condiţii Identice 2.5 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Rovnaké Šírenie 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 2.5 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell–DelaLika 2.5 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNCSA_2_5</at:authority-code> + <at:op-code>CC_BYNCSA_2_5</at:op-code> + <at:start.use>2005-06-01</at:start.use> + <atold:op-code>CC_BYNCSA_2_5</atold:op-code> + <dc:identifier>CC_BYNCSA_2_5</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-SA 2.5</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC-SA 2.5 lets others remix, tweak, and build upon the author’s work non-commercially, as long as they credit the author and licence their new creations under the identical terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC-SA 2.5 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales tant qu’on le/la crédite en citant son nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.5/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCSA_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Споделяне на споделеното 3.0 Нелокализиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte dílo komerčně–Zachovejte licenci 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Deling på samme vilkår 3.0 Ikke porteret</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Weitergabe unter gleichen Bedingungen 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Παρόμοια Διανομή 3.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–ShareAlike 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–CompartirIgual 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Jagamine samadel tingimustel 3.0 Jurisdiktsiooniga sidumata</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–JaaSamoin 3.0 Ei sovitettu</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 3.0 non transposé</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Dijeli pod istim uvjetima 3.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Condividi allo stesso modo 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Analogiškas platinimas 3.0 Nepritaikyta jurisdikcijai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nemainot licenci 3.0 Nepārnesta</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-KondiviżjoniUgwali 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GelijkDelen 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Na tych samych warunkach 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–CompartilhaIgual 3.0 Não Adaptada</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–Distribuire în Condiţii Identice 3.0 Ne-adaptată</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Rovnaké Šírenie 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 3.0 Nedoločena</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell–DelaLika 3.0 Unported</skos:prefLabel> + <at:authority-code>CC_BYNCSA_3_0</at:authority-code> + <at:op-code>CC_BYNCSA_3_0</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BYNCSA_3_0</atold:op-code> + <dc:identifier>CC_BYNCSA_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-SA 3.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC-SA 3.0 lets others remix, tweak, and build upon the author’s work non-commercially, as long as they credit the author and licence their new creations under the identical terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC-SA 3.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales tant qu’on le/la crédite en citant son nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:historyNote xml:lang="en">Unported licences are licences that are not associated with any specific jurisdiction, e.g. country.</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNCSA_4_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte dílo komerčně–Zachovejte licenci 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht-kommerziell – Weitergabe unter gleichen Bedingungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση – Παρόμοια Διανομή 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial–ShareAlike 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial–CompartirIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen–JaaSamoin 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno–Dijeli pod istim uvjetima 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale – Condividi allo stesso modo 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas – Analogiškas platinimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli–Nemainot licenci 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel–GelijkDelen 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne–Na tych samych warunkach 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial–CompartilhaIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial–Distribuire în Condiţii Identice 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell–DelaLika 4.0 Internationell</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално-Споделяне на споделеното 4.0 Международен</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel-Deling på samme vilkår 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk–Jagamine samadel tingimustel 4.0 Rahvusvaheline</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali-KondiviżjoniUgwali 4.0 Internazzjonali</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie-Rovnaké Šírenie 4.0 Medzinárodný</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 4.0 Mednarodna</skos:prefLabel> + <at:authority-code>CC_BYNCSA_4_0</at:authority-code> + <at:op-code>CC_BYNCSA_4_0</at:op-code> + <at:start.use>2013-11-26</at:start.use> + <atold:op-code>CC_BYNCSA_4_0</atold:op-code> + <dc:identifier>CC_BYNCSA_4_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC-SA 4.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC-SA 4.0 lets others remix, tweak, and build upon the author’s work non-commercially, as long as they credit the author and licence their new creations under the identical terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC-SA 4.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales tant qu’on le/la crédite en citant son nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc-sa/4.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNC_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално 1.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel 1.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση 1.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen 1.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale 1.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno 1.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! 1.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale 1.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas 1.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli 1.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel 1.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne 1.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial 1.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno 1.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell 1.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNC_1_0</at:authority-code> + <at:op-code>CC_BYNC_1_0</at:op-code> + <at:start.use>2002-12-15</at:start.use> + <atold:op-code>CC_BYNC_1_0</atold:op-code> + <dc:identifier>CC_BYNC_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC 1.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC 1.0 lets others remix, tweak, and build upon the author’s work non-commercially, and although their new works must also acknowledge the author and be non-commercial, they don’t have to licence their derivative works on the same terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC 1.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales et, bien que les nouvelles œuvres doivent créditer l’auteur/autrice en citant son nom et ne pas constituer une utilisation commerciale, elles n’ont pas à être diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-05-24</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNC_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално 2.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel 2.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση 2.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk 2.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen 2.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale 2.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno 2.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! 2.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale 2.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas 2.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli 2.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel 2.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne 2.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial 2.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno 2.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell 2.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNC_2_0</at:authority-code> + <at:op-code>CC_BYNC_2_0</at:op-code> + <at:start.use>2004-05-25</at:start.use> + <atold:op-code>CC_BYNC_2_0</atold:op-code> + <dc:identifier>CC_BYNC_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC 2.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC 2.0 lets others remix, tweak, and build upon the author’s work non-commercially, and although their new works must also acknowledge the author and be non-commercial, they don’t have to licence their derivative works on the same terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC 2.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales et, bien que les nouvelles œuvres doivent créditer l’auteur/autrice en citant son nom et ne pas constituer une utilisation commerciale, elles n’ont pas à être diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNC_2_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално 2.5 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel 2.5 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση 2.5 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk 2.5 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen 2.5 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale 2.5 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno 2.5 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! 2.5 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale 2.5 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas 2.5 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli 2.5 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel 2.5 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne 2.5 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial 2.5 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno 2.5 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell 2.5 Generisk</skos:prefLabel> + <at:authority-code>CC_BYNC_2_5</at:authority-code> + <at:op-code>CC_BYNC_2_5</at:op-code> + <at:start.use>2005-06-01</at:start.use> + <atold:op-code>CC_BYNC_2_5</atold:op-code> + <dc:identifier>CC_BYNC_2_5</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC 2.5</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC 2.5</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC 2.5 lets others remix, tweak, and build upon the author’s work non-commercially, and although their new works must also acknowledge the author and be non-commercial, they don’t have to licence their derivative works on the same terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC 2.5 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales et, bien que les nouvelles œuvres doivent créditer l’auteur/autrice en citant son nom et ne pas constituer une utilisation commerciale, elles n’ont pas à être diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc/2.5/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNC_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално 3.0 Нелокализиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel 3.0 Ikke porteret</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση 3.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk 3.0 Jurisdiktsiooniga sidumata</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen 3.0 Ei sovitettu</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale 3.0 non transposé</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno 3.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas 3.0 Nepritaikyta jurisdikcijai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli 3.0 Nepārnesta</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial 3.0 Não Adaptada</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial 3.0 Ne-adaptată</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno 3.0 Nedoločena</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell 3.0 Unported</skos:prefLabel> + <at:authority-code>CC_BYNC_3_0</at:authority-code> + <at:op-code>CC_BYNC_3_0</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BYNC_3_0</atold:op-code> + <dc:identifier>CC_BYNC_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC 3.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC 3.0 lets others remix, tweak, and build upon the author’s work non-commercially, and although their new works must also acknowledge the author and be non-commercial, they don’t have to licence their derivative works on the same terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC 3.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales et, bien que les nouvelles œuvres doivent créditer l’auteur/autrice en citant son nom et ne pas constituer une utilisation commerciale, elles n’ont pas à être diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc/3.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:historyNote xml:lang="en">Unported licences are licences that are not associated with any specific jurisdiction, e.g. country.</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYNC_4_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Neužívejte komerčně 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Nicht kommerziell 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Μη Εμπορική Χρήση 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NonCommercial 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–NoComercial 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiKaupallinen 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas d’Utilisation Commerciale 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Nekomercijalno 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne add el! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non commerciale 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Nekomercinis platinimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nekomerciāli 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–NietCommercieel 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Użycie niekomercyjne 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–NãoComercial 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Necomercial 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IckeKommersiell 4.0 Internationell</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Некомерсиално 4.0 Международен</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ikkekommerciel 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Mitteäriline eesmärk 4.0 Rahvusvaheline</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-MhuxKummerċjali 4.0 Internazzjonali</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Nekomerčné Použitie 4.0 Medzinárodný</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Nekomercialno 4.0 Mednarodna</skos:prefLabel> + <at:authority-code>CC_BYNC_4_0</at:authority-code> + <at:op-code>CC_BYNC_4_0</at:op-code> + <at:start.use>2013-11-26</at:start.use> + <atold:op-code>CC_BYNC_4_0</atold:op-code> + <dc:identifier>CC_BYNC_4_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-NC 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-NC 4.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-NC 4.0 lets others remix, tweak, and build upon the author’s work non-commercially, and although their new works must also acknowledge the author and be non-commercial, they don’t have to licence their derivative works on the same terms.</skos:definition> + <skos:definition xml:lang="fr">CC BY-NC 4.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice à des fins non commerciales et, bien que les nouvelles œuvres doivent créditer l’auteur/autrice en citant son nom et ne pas constituer une utilisation commerciale, elles n’ont pas à être diffusées selon les mêmes conditions.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nc/4.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYND" + at:deprecated="true"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Navngivelse–IngenBearbejdelse 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivatives 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivar 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties, nepārveidojot 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa – Bez utworów zależnych 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–FărăDerivate 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar 4.0 Internationell</skos:prefLabel> + <at:authority-code>CC_BYND</at:authority-code> + <at:op-code>CC_BYND</at:op-code> + <at:start.use>2013-11-25</at:start.use> + <atold:op-code>CC_BYND</atold:op-code> + <dc:identifier>CC_BYND</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND 4.0</skos:altLabel> + <skos:definition xml:lang="en">This licence allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to the author.</skos:definition> + <skos:definition xml:lang="fr">Cette licence autorise la redistribution, à des fins commerciales ou non, tant que l’œuvre est diffusée sans modification et dans son intégralité, avec attribution et citation du nom de l’auteur/autrice.</skos:definition> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2013-11-26</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYND_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни 1.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ingen afledninger 1.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitung 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα 1.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivs 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivadas 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Tuletatud teoste keeld 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia 1.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification 1.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada 1.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! 1.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate 1.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų 1.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nepārveidojot 1.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-EbdaDerivattivi 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken 1.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Bez utworów zależnych 1.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–FărăModificări 1.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Bez Odvodeného Obsahu 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Brez predelav 1.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar 1.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYND_1_0</at:authority-code> + <at:op-code>CC_BYND_1_0</at:op-code> + <at:start.use>2002-12-15</at:start.use> + <atold:op-code>CC_BYND_1_0</atold:op-code> + <dc:identifier>CC_BYND_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND 1.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND 1.0 allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to the author.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND 1.0 autorise la redistribution, à des fins commerciales ou non, tant que l’œuvre est diffusée sans modification et dans son intégralité, avec attribution et citation du nom de l’auteur/autrice.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nd/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-05-24</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYND_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни 2.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ingen afledninger 2.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitung 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα 2.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivs 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivadas 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Tuletatud teoste keeld 2.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia 2.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification 2.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada 2.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! 2.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate 2.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų 2.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nepārveidojot 2.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-EbdaDerivattivi 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken 2.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Bez utworów zależnych 2.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–FărăModificări 2.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Bez Odvodeného Obsahu 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Brez predelav 2.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar 2.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYND_2_0</at:authority-code> + <at:op-code>CC_BYND_2_0</at:op-code> + <at:start.use>2004-05-25</at:start.use> + <atold:op-code>CC_BYND_2_0</atold:op-code> + <dc:identifier>CC_BYND_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND 2.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND 2.0 allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to the author.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND 2.0 autorise la redistribution, à des fins commerciales ou non, tant que l’œuvre est diffusée sans modification et dans son intégralité, avec attribution et citation du nom de l’auteur.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nd/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYND_2_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни 2.5 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ingen afledninger 2.5 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitung 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα 2.5 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivs 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivadas 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Tuletatud teoste keeld 2.5 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia 2.5 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification 2.5 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada 2.5 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! 2.5 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate 2.5 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų 2.5 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nepārveidojot 2.5 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-EbdaDerivattivi 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken 2.5 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Bez utworów zależnych 2.5 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–FărăModificări 2.5 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Bez Odvodeného Obsahu 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Brez predelav 2.5 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar 2.5 Generisk</skos:prefLabel> + <at:authority-code>CC_BYND_2_5</at:authority-code> + <at:op-code>CC_BYND_2_5</at:op-code> + <at:start.use>2005-06-01</at:start.use> + <atold:op-code>CC_BYND_2_5</atold:op-code> + <dc:identifier>CC_BYND_2_5</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND 2.5</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND 2.5</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND 2.5 allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to the author.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND 2.5 autorise la redistribution, à des fins commerciales ou non, tant que l’œuvre est diffusée sans modification et dans son intégralité, avec attribution et citation du nom de l’auteur/autrice.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nd/2.5/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYND_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни 3.0 Нелокализиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ingen afledninger 3.0 Ikke porteret</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitung 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα 3.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivs 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivadas 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Tuletatud teoste keeld 3.0 Jurisdiktsiooniga sidumata</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia 3.0 Ei sovitettu</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification 3.0 non transposé</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada 3.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų 3.0 Nepritaikyta jurisdikcijai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nepārveidojot 3.0 Nepārnesta</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-EbdaDerivattivi 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Bez utworów zależnych 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações 3.0 Não Adaptada</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire-FărăModificări 3.0 Ne-adaptată</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Bez Odvodeného Obsahu 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Brez predelav 3.0 Nedoločena</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar 3.0 Unported</skos:prefLabel> + <at:authority-code>CC_BYND_3_0</at:authority-code> + <at:op-code>CC_BYND_3_0</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BYND_3_0</atold:op-code> + <dc:identifier>CC_BYND_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND 3.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND 3.0 allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to the author.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND 3.0 autorise la redistribution, à des fins commerciales ou non, tant que l’œuvre est diffusée sans modification et dans son intégralité, avec attribution et citation du nom de l’auteur/autrice.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nd/3.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:historyNote xml:lang="en">Unported licences are licences that are not associated with any specific jurisdiction, e.g. country.</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYND_4_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Nezpracovávejte 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Keine Bearbeitungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Όχι Παράγωγα Έργα 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–NoDerivatives 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–SinDerivar 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–EiMuutoksia 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Pas de Modification 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Bez prerada 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Ne változtasd! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Non opere derivate 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Jokių išvestinių darbų 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties, nepārveidojot 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GeenAfgeleideWerken 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa – Bez utworów zależnych 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–SemDerivações 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–FărăDerivate 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–IngaBearbetningar 4.0 Internationell</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Без производни 4.0 Международен</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Ingen afledninger 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Tuletatud teoste keeld 4.0 Rahvusvaheline</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-EbdaDerivattivi 4.0 Internazzjonali</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Žiadne Odvodené Diela 4.0 Medzinárodný</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Brez predelav 4.0 Mednarodna</skos:prefLabel> + <at:authority-code>CC_BYND_4_0</at:authority-code> + <at:op-code>CC_BYND_4_0</at:op-code> + <at:start.use>2013-11-26</at:start.use> + <atold:op-code>CC_BYND_4_0</atold:op-code> + <dc:identifier>CC_BYND_4_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-ND 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-ND 4.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-ND 4.0 allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to the author.</skos:definition> + <skos:definition xml:lang="fr">CC BY-ND 4.0 autorise la redistribution, à des fins commerciales ou non, tant que l’œuvre est diffusée sans modification et dans son intégralité, avec attribution et citation du nom de l’auteur/autrice.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-nd/4.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA" + at:deprecated="true"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Zachovejte licenci 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Navngivelse–DelPåSammeVilkår 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Παρόμοια Διανομή 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–ShareAlike 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–CompartirIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–JaaSamoin 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Partage dans les Mêmes Conditions 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Dijeli pod istim uvjetima 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Így add tovább! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Condividi allo stesso modo 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Analogiškas platinimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nemainot licenci 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GelijkDelen 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Na tych samych warunkach 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–CompartilhaIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Distribuire în condiţii identice 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–DelaLika 4.0 Internationell</skos:prefLabel> + <at:authority-code>CC_BYSA</at:authority-code> + <at:op-code>CC_BYSA</at:op-code> + <at:start.use>2013-11-25</at:start.use> + <atold:op-code>CC_BYSA</atold:op-code> + <dc:identifier>CC_BYSA</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 4.0</skos:altLabel> + <skos:definition xml:lang="en">This licence lets others remix, tweak, and build upon the author's work even for commercial purposes, as long as they credit the author and licence their new creations under the identical terms. This licence is often compared to “copyleft” free and open source software licences. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use. This is the licence used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licenced projects.</skos:definition> + <skos:definition xml:lang="fr">Cette licence permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/l’autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/l’autrice en citant son nom et qu’on diffuse les nouvelles créations selon des conditions identiques. Cette licence est souvent comparée aux licences de logiciels libres, «open source» ou «copyleft». Toutes les nouvelles œuvres basées sur celles de l’auteur/autrice auront la même licence, et toute œuvre dérivée pourra être utilisée même à des fins commerciales. C’est la licence utilisée par Wikipédia; elle est recommandée pour des œuvres qui pourraient bénéficier de l’incorporation de contenu depuis Wikipédia et d’autres projets sous licence similaire.</skos:definition> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2013-11-26</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Споделяне на споделеното 1.0 Неадаптира</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Zachovejte licenci 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Deling på samme vilkår 1.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Παρόμοια Διανομή 1.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–ShareAlike 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–CompartirIgual 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Jagamine samadel tingimustel 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–JaaSamoin 1.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Partage dans les Mêmes Conditions 1.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Dijeli pod istim uvjetima 1.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Így add tovább! 1.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Condividi allo stesso modo 1.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Analogiškas platinimas 1.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nemainot licenci 1.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-KondiviżjoniUgwali 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GelijkDelen 1.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Na tych samych warunkach 1.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–CompartilhaIgual 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Distribuire în condiţii identice 1.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Rovnaké Šírenie 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 1.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–DelaLika 1.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYSA_1_0</at:authority-code> + <at:op-code>CC_BYSA_1_0</at:op-code> + <at:start.use>2002-12-15</at:start.use> + <atold:op-code>CC_BYSA_1_0</atold:op-code> + <dc:identifier>CC_BYSA_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 1.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-SA 1.0 lets others remix, tweak, and build upon the author’s work even for commercial purposes, as long as they credit the author and licence their new creations under the identical terms. This licence is often compared to “copyleft” free and open source software licences. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use. This is the licence used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licenced projects.</skos:definition> + <skos:definition xml:lang="fr">CC BY-SA 1.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom et qu’on diffuse les nouvelles créations selon des conditions identiques. Cette licence est souvent comparée aux licences de logiciels libres, «open source» ou «copyleft». Toutes les nouvelles œuvres basées sur celles de l’auteur/autrice auront la même licence, et toute œuvre dérivée pourra être utilisée même à des fins commerciales. C’est la licence utilisée par Wikipédia; elle est recommandée pour des œuvres qui pourraient bénéficier de l’incorporation de contenu depuis Wikipédia et d’autres projets sous licence similaire.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-sa/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-05-24</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Споделяне на споделеното 2.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Zachovejte licenci 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Deling på samme vilkår 2.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Παρόμοια Διανομή 2.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–ShareAlike 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–CompartirIgual 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Jagamine samadel tingimustel 2.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–JaaSamoin 2.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Partage dans les Mêmes Conditions 2.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Dijeli pod istim uvjetima 2.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Így add tovább! 2.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Condividi allo stesso modo 2.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Analogiškas platinimas 2.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nemainot licenci 2.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-KondiviżjoniUgwali 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GelijkDelen 2.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Na tych samych warunkach 2.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–CompartilhaIgual 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Distribuire în condiţii identice 2.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Rovnaké Šírenie 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 2.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–DelaLika 2.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BYSA_2_0</at:authority-code> + <at:op-code>CC_BYSA_2_0</at:op-code> + <at:start.use>2004-05-25</at:start.use> + <atold:op-code>CC_BYSA_2_0</atold:op-code> + <dc:identifier>CC_BYSA_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 2.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-SA 2.0 lets others remix, tweak, and build upon the author’s work even for commercial purposes, as long as they credit the author and licence their new creations under the identical terms. This licence is often compared to “copyleft” free and open source software licences. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use. This is the licence used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licenced projects.</skos:definition> + <skos:definition xml:lang="fr">CC BY-SA 2.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom et qu’on diffuse les nouvelles créations selon des conditions identiques. Cette licence est souvent comparée aux licences de logiciels libres, «open source» ou «copyleft». Toutes les nouvelles œuvres basées sur celles de l’auteur/autrice auront la même licence, et toute œuvre dérivée pourra être utilisée même à des fins commerciales. C’est la licence utilisée par Wikipédia; elle est recommandée pour des œuvres qui pourraient bénéficier de l’incorporation de contenu depuis Wikipédia et d’autres projets sous licence similaire.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA_2_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Споделяне на споделеното 2.5 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Zachovejte licenci 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Deling på samme vilkår 2.5 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Παρόμοια Διανομή 2.5 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–ShareAlike 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–CompartirIgual 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Jagamine samadel tingimustel 2.5 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–JaaSamoin 2.5 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Partage dans les Mêmes Conditions 2.5 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Dijeli pod istim uvjetima 2.5 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Így add tovább! 2.5 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Condividi allo stesso modo 2.5 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Analogiškas platinimas 2.5 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nemainot licenci 2.5 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-KondiviżjoniUgwali 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GelijkDelen 2.5 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Na tych samych warunkach 2.5 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–CompartilhaIgual 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Distribuire în condiţii identice 2.5 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Rovnaké Šírenie 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 2.5 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–DelaLika 2.5 Generisk</skos:prefLabel> + <at:authority-code>CC_BYSA_2_5</at:authority-code> + <at:op-code>CC_BYSA_2_5</at:op-code> + <at:start.use>2005-06-01</at:start.use> + <atold:op-code>CC_BYSA_2_5</atold:op-code> + <dc:identifier>CC_BYSA_2_5</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 2.5</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 2.5</skos:altLabel> + <skos:definition xml:lang="en">CC BY-SA 2.5 lets others remix, tweak, and build upon the author’s work even for commercial purposes, as long as they credit the author and licence their new creations under the identical terms. This licence is often compared to “copyleft” free and open source software licences. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use. This is the licence used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licenced projects.</skos:definition> + <skos:definition xml:lang="fr">CC BY-SA 2.5 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom et qu’on diffuse les nouvelles créations selon des conditions identiques. Cette licence est souvent comparée aux licences de logiciels libres, «open source» ou «copyleft». Toutes les nouvelles œuvres basées sur celles de l’auteur/autrice auront la même licence, et toute œuvre dérivée pourra être utilisée même à des fins commerciales. C’est la licence utilisée par Wikipédia; elle est recommandée pour des œuvres qui pourraient bénéficier de l’incorporation de contenu depuis Wikipédia et d’autres projets sous licence similaire.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Споделяне на споделеното 3.0 Нелокализиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Zachovejte licenci 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Deling på samme vilkår 3.0 Ikke porteret</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Παρόμοια Διανομή 3.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–ShareAlike 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–CompartirIgual 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Jagamine samadel tingimustel 3.0 Jurisdiktsiooniga sidumata</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–JaaSamoin 3.0 Ei sovitettu</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Partage dans les Mêmes Conditions 3.0 non transposé</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Dijeli pod istim uvjetima 3.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Így add tovább! 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Condividi allo stesso modo 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Analogiškas platinimas 3.0 Nepritaikyta jurisdikcijai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nemainot licenci 3.0 Nepārnesta</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-KondiviżjoniUgwali 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GelijkDelen 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Na tych samych warunkach 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–CompartilhaIgual 3.0 Não Adaptada</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Distribuire în condiţii identice 3.0 Ne-adaptată</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Rovnaké Šírenie 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 3.0 Nedoločena</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–DelaLika 3.0 Unported</skos:prefLabel> + <at:authority-code>CC_BYSA_3_0</at:authority-code> + <at:op-code>CC_BYSA_3_0</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BYSA_3_0</atold:op-code> + <dc:identifier>CC_BYSA_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 3.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-SA 3.0 lets others remix, tweak, and build upon the author’s work even for commercial purposes, as long as they credit the author and licence their new creations under the identical terms. This licence is often compared to “copyleft” free and open source software licences. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use. This is the licence used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licenced projects.</skos:definition> + <skos:definition xml:lang="fr">CC BY-SA 3.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom et qu’on diffuse les nouvelles créations selon des conditions identiques. Cette licence est souvent comparée aux licences de logiciels libres, «open source» ou «copyleft». Toutes les nouvelles œuvres basées sur les œuvres de l’auteur/autrice auront la même licence, et toute œuvre dérivée pourra être utilisée même à des fins commerciales. C’est la licence utilisée par Wikipédia; elle est recommandée pour des œuvres qui pourraient bénéficier de l’incorporation de contenu depuis Wikipédia et d’autres projets sous licence similaire.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:historyNote xml:lang="en">Unported licences are licences that are not associated with any specific jurisdiction, e.g. country.</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA_3_0_NL" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Признание-Споделяне на споделеното 3.0 Холандия</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Uveďte původ–Zachovejte licenci 3.0 Nizozemí</skos:prefLabel> + <skos:prefLabel xml:lang="da">Kreditering-Deling på samme vilkår 3.0 Holland</skos:prefLabel> + <skos:prefLabel xml:lang="de">Namensnennung – Weitergabe unter gleichen Bedingungen 3.0 Niederlande</skos:prefLabel> + <skos:prefLabel xml:lang="el">Αναφορά Δημιουργού – Παρόμοια Διανομή 3.0 Ολλανδία</skos:prefLabel> + <skos:prefLabel xml:lang="en">Attribution-ShareAlike 3.0 Netherlands </skos:prefLabel> + <skos:prefLabel xml:lang="es">Reconocimiento–CompartirIgual 3.0 Países Bajos</skos:prefLabel> + <skos:prefLabel xml:lang="et">Autorile viitamine–Jagamine samadel tingimustel 3.0 Holland</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Nimeä–JaaSamoin 3.0 Hollanti</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Attribution – Partage dans les Mêmes Conditions 3.0 Pays-Bas</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Imenovanje–Dijeli pod istim uvjetima 3.0 Nizozemska</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Nevezd meg! – Így add tovább! 3.0 Hollandia</skos:prefLabel> + <skos:prefLabel xml:lang="it">Attribuzione – Condividi allo stesso modo 3.0 Olanda</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Priskyrimas – Analogiškas platinimas 3.0 Nyderlandai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Attiecinājums–Dalīties līdzīgi 3.0 Nīderlande</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Attribuzzjoni-KondiviżjoniUgwali 3.0 Pajjiżi l-Baxxi</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Naamsvermelding–GelijkDelen 3.0 Nederland</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Uznanie autorstwa–Na tych samych warunkach 3.0 Holandia</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Atribuição–CompartilhaIgual 3.0 Holanda</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Atribuire – Distribuire în condiţii identice 3.0 Olanda</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Uvedenie Autora-Rovnaké Šírenie 3.0 Holandsko</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Priznanje avtorstva-Deljenje pod enakimi pogoji 3.0 Nizozemska</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Erkännande–DelaLika 3.0 Nederländerna</skos:prefLabel> + <at:authority-code>CC_BYSA_3_0_NL</at:authority-code> + <at:op-code>CC_BYSA_3_0_NL</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BYSA_3_0_NL</atold:op-code> + <dc:identifier>CC_BYSA_3_0_NL</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 3.0 NL</skos:altLabel> + <skos:definition xml:lang="en">Published by Creative Commons for Netherlands, Naamsvermelding-GelijkDelen 3.0 Nederland (CC BY-SA 3.0 NL) is a licence permitting any commercial and non-commercial use, as long as credit is given to the author for the original creation and new creations are licenced under the identical terms. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/nl/legalcode/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BYSA_4_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ–Zachovejte licenci 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού – Παρόμοια Διανομή 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution–ShareAlike 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución–CompartirIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä–JaaSamoin 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution – Partage dans les Mêmes Conditions 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje–Dijeli pod istim uvjetima 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! – Így add tovább! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione – Condividi allo stesso modo 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas – Analogiškas platinimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties–Nemainot licenci 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding–GelijkDelen 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa–Na tych samych warunkach 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição–CompartilhaIgual 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire–Distribuire în condiţii identice 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande–DelaLika 4.0 Internationell</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание-Споделяне на споделеното 4.0 Международен</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering-Deling på samme vilkår 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine–Jagamine samadel tingimustel 4.0 Rahvusvaheline</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni-KondiviżjoniUgwali 4.0 Internazzjonali</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora-Rovnaké Šírenie 4.0 Medzinárodný</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0 Mednarodna</skos:prefLabel> + <at:authority-code>CC_BYSA_4_0</at:authority-code> + <at:op-code>CC_BYSA_4_0</at:op-code> + <at:start.use>2013-11-26</at:start.use> + <atold:op-code>CC_BYSA_4_0</atold:op-code> + <dc:identifier>CC_BYSA_4_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY-SA 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY-SA 4.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY-SA 4.0 lets others remix, tweak, and build upon the author’s work even for commercial purposes, as long as they credit the author and licence their new creations under the identical terms. This licence is often compared to “copyleft” free and open source software licences. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use. This is the licence used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licenced projects.</skos:definition> + <skos:definition xml:lang="fr">CC BY-SA 4.0 permet aux autres de remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom et qu’on diffuse les nouvelles créations selon des conditions identiques. Cette licence est souvent comparée aux licences de logiciels libres, «open source» ou «copyleft». Toutes les nouvelles œuvres basées sur celles de l’auteur/autrice auront la même licence, et toute œuvre dérivée pourra être utilisée même à des fins commerciales. C’est la licence utilisée par Wikipédia; elle est recommandée pour des œuvres qui pourraient bénéficier de l’incorporation de contenu depuis Wikipédia et d’autres projets sous licence similaire.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание 1.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering 1.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού 1.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine 1.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä 1.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution 1.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje 1.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! 1.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione 1.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas 1.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties 1.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding 1.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa 1.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição 1.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire 1.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora 1.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva 1.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande 1.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BY_1_0</at:authority-code> + <at:op-code>CC_BY_1_0</at:op-code> + <at:start.use>2002-12-15</at:start.use> + <atold:op-code>CC_BY_1_0</atold:op-code> + <dc:identifier>CC_BY_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 1.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY 1.0 lets others distribute, remix, tweak, and build upon the author’s work, even commercially, as long as they credit the author for the original creation. This is the most accommodating of licences offered. Recommended for maximum dissemination and use of licenced materials.</skos:definition> + <skos:definition xml:lang="fr">CC BY 1.0 permet aux autres de distribuer, remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom. C’est le contrat le plus souple proposé. Recommandé pour la diffusion et l’utilisation maximales d’œuvres licenciées sous CC.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2004-05-24</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание 2.0 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering 2.0 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού 2.0 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine 2.0 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä 2.0 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution 2.0 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje 2.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! 2.0 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione 2.0 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas 2.0 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties 2.0 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding 2.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa 2.0 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição 2.0 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire 2.0 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora 2.0 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva 2.0 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande 2.0 Generisk</skos:prefLabel> + <at:authority-code>CC_BY_2_0</at:authority-code> + <at:op-code>CC_BY_2_0</at:op-code> + <at:start.use>2004-05-25</at:start.use> + <atold:op-code>CC_BY_2_0</atold:op-code> + <dc:identifier>CC_BY_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 2.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY 2.0 lets others distribute, remix, tweak, and build upon the author’s work, even commercially, as long as they credit the author for the original creation. This is the most accommodating of licences offered. Recommended for maximum dissemination and use of licenced materials.</skos:definition> + <skos:definition xml:lang="fr">CC BY 2.0 permet aux autres de distribuer, remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom. C’est le contrat le plus souple proposé. Recommandé pour la diffusion et l’utilisation maximales d’œuvres licenciées sous CC.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_2_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание 2.5 Неадаптиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering 2.5 Generisk</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού 2.5 Γενικό</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine 2.5 Üldine</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä 2.5 Yleinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution 2.5 Générique</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje 2.5 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! 2.5 Általános</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione 2.5 Generico</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas 2.5 Bendrasis</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties 2.5 Vispārīgs</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding 2.5 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa 2.5 Ogólny</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição 2.5 Genérica</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire 2.5 Generică</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora 2.5 Generic</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva 2.5 Generična</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande 2.5 Generisk</skos:prefLabel> + <at:authority-code>CC_BY_2_5</at:authority-code> + <at:op-code>CC_BY_2_5</at:op-code> + <at:start.use>2005-06-01</at:start.use> + <atold:op-code>CC_BY_2_5</atold:op-code> + <dc:identifier>CC_BY_2_5</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 2.5</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 2.5</skos:altLabel> + <skos:definition xml:lang="en">CC BY 2.5 lets others distribute, remix, tweak, and build upon the author’s work, even commercially, as long as they credit the author for the original creation. This is the most accommodating of licences offered. Recommended for maximum dissemination and use of licenced materials.</skos:definition> + <skos:definition xml:lang="fr">CC BY 2.5 permet aux autres de distribuer, remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom. C’est le contrat le plus souple proposé. Recommandé pour la diffusion et l’utilisation maximales d’œuvres licenciées sous CC.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by/2.5/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Creative Commons Признание 3.0 Нелокализиран</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering 3.0 Ikke porteret</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού 3.0 Μη εισαγόμενο</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine 3.0 Jurisdiktsiooniga sidumata</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä 3.0 Ei sovitettu</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution 3.0 non transposé</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje 3.0 nelokalizirana licenca</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas 3.0 Nepritaikyta jurisdikcijai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties 3.0 Nepārnesta</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição 3.0 Não Adaptada</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire 3.0 Ne-adaptată</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora 3.0 Unported</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva 3.0 Nedoločena</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande 3.0 Unported</skos:prefLabel> + <at:authority-code>CC_BY_3_0</at:authority-code> + <at:op-code>CC_BY_3_0</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BY_3_0</atold:op-code> + <dc:identifier>CC_BY_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 3.0</skos:altLabel> + <skos:definition xml:lang="en">CC BY 3.0 lets others distribute, remix, tweak, and build upon the author’s work, even commercially, as long as they credit the author for the original creation. This is the most accommodating of licences offered. Recommended for maximum dissemination and use of licenced materials.</skos:definition> + <skos:definition xml:lang="fr">CC BY 3.0 permet aux autres de distribuer, remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom. C’est le contrat le plus souple proposé. Recommandé pour la diffusion et l’utilisation maximales d’œuvres licenciées sous CC.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by/3.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:historyNote xml:lang="en">Unported licences are licences that are not associated with any specific jurisdiction, e.g. country.</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_3_0_AT" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Признание 3.0 Австрия</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Uveďte původ 3.0 Rakousko</skos:prefLabel> + <skos:prefLabel xml:lang="da">Kreditering 3.0 Østrig</skos:prefLabel> + <skos:prefLabel xml:lang="de">Namensnennung 3.0 Österreich</skos:prefLabel> + <skos:prefLabel xml:lang="el">Αναφορά Δημιουργού 3.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">Attribution 3.0 Austria</skos:prefLabel> + <skos:prefLabel xml:lang="es">Atribución 3.0 Austria</skos:prefLabel> + <skos:prefLabel xml:lang="et">Autorile viitamine 3.0 Austria</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Nimeä 3.0 Itävalta</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Attribution 3.0 Autriche</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Imenovanje 3.0 Austrija</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Nevezd meg! 3.0 Ausztria</skos:prefLabel> + <skos:prefLabel xml:lang="it">Attribuzione 3.0 Austria</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Priskyrimas 3.0 Austrija</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Attiecinājums 3.0 Austrija</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Attribuzzjoni 3.0 Awstrija</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Naamsvermelding 3.0 Oostenrijk</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Uznanie autorstwa 3.0 Austria</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Atribuição 3.0 Áustria</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Atribuire 3.0 Austria</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Uvedenie Autora 3.0 Rakúsko</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Priznanje avtorstva 3.0 Avstrija</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Erkännande 3.0 Österrike</skos:prefLabel> + <at:authority-code>CC_BY_3_0_AT</at:authority-code> + <at:op-code>CC_BY_3_0_AT</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BY_3_0_AT</atold:op-code> + <dc:identifier>CC_BY_3_0_AT</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 3.0 AT</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 3.0 AT</skos:altLabel> + <skos:definition xml:lang="en">Published by Creative Commons for Austria, Namensnennung 3.0 Österreich (CC BY 3.0 AT) is a licence permitting any commercial and non-commercial use as long as credit is given to the author for the original creation.</skos:definition> + <skos:exactMatch rdf:resource="https://creativecommons.org/licenses/by/3.0/at/legalcode"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_3_0_NL" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Признание 3.0 Холандия</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Uveďte původ 3.0 Nizozemí</skos:prefLabel> + <skos:prefLabel xml:lang="da">Kreditering 3.0 Holland</skos:prefLabel> + <skos:prefLabel xml:lang="de">Namensnennung 3.0 Niederlande</skos:prefLabel> + <skos:prefLabel xml:lang="el">Αναφορά Δημιουργού 3.0 Ολλανδία</skos:prefLabel> + <skos:prefLabel xml:lang="en">Attribution 3.0 Netherlands</skos:prefLabel> + <skos:prefLabel xml:lang="es">Atribución 3.0 Países Bajos</skos:prefLabel> + <skos:prefLabel xml:lang="et">Autorile viitamine 3.0 Holland</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Nimeä 3.0 Hollanti</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Attribution 3.0 Pays-Bas</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Imenovanje 3.0 Nizozemska</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Nevezd meg! 3.0 Hollandia</skos:prefLabel> + <skos:prefLabel xml:lang="it">Attribuzione 3.0 Olanda</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Priskyrimas 3.0 Nyderlandai</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Attiecinājums 3.0 Nīderlande</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Attribuzzjoni 3.0 Pajjiżi l-Baxxi</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Naamsvermelding 3.0 Nederland</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Uznanie autorstwa 3.0 Holandia</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Atribuição 3.0 Holanda</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Atribuire 3.0 Olanda</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Uvedenie Autora 3.0 Holandsko</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Priznanje avtorstva 3.0 Nizozemska</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Erkännande 3.0 Nederländerna</skos:prefLabel> + <at:authority-code>CC_BY_3_0_NL</at:authority-code> + <at:op-code>CC_BY_3_0_NL</at:op-code> + <at:start.use>2007-02-23</at:start.use> + <atold:op-code>CC_BY_3_0_NL</atold:op-code> + <dc:identifier>CC_BY_3_0_NL</dc:identifier> + <skos:altLabel xml:lang="es">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="bg">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 3.0 NL</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 3.0 NL</skos:altLabel> + <skos:definition xml:lang="en">Published by Creative Commons for Netherlands, Naamsvermelding 3.0 Nederland (CC BY 3.0 NL) is a licence permitting any commercial and non-commercial use as long as credit is given to the author for the original creation.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by/3.0/nl/legalcode"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_BY_4_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="cs">Creative Commons Uveďte původ 4.0 Mezinárodní</skos:prefLabel> + <skos:prefLabel xml:lang="de">Creative Commons Namensnennung 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="el">Creative Commons Αναφορά Δημιουργού 4.0 Διεθνές</skos:prefLabel> + <skos:prefLabel xml:lang="en">Creative Commons Attribution 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="es">Creative Commons Atribución 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Creative Commons Nimeä 4.0 Kansainvälinen</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Creative Commons Attribution 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Creative Commons Imenovanje 4.0 međunarodna</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Creative Commons Nevezd meg! 4.0 Nemzetközi</skos:prefLabel> + <skos:prefLabel xml:lang="it">Creative Commons Attribuzione 4.0 Internazionale</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Creative Commons Priskyrimas 4.0 Tarptautinė</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Creative Commons Atsaucoties 4.0 Internacionāls</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Creative Commons Naamsvermelding 4.0 Internationaal</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Creative Commons Uznanie autorstwa 4.0 Międzynarodowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Creative Commons Atribuição 4.0 Internacional</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Creative Commons Atribuire 4.0 Internațional</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Creative Commons Erkännande 4.0 Internationell</skos:prefLabel> + <skos:prefLabel xml:lang="bg">Creative Commons Признание 4.0 Международен</skos:prefLabel> + <skos:prefLabel xml:lang="da">Creative Commons Kreditering 4.0 International</skos:prefLabel> + <skos:prefLabel xml:lang="et">Creative Commons Autorile viitamine 4.0 Rahvusvaheline</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Creative Commons Attribuzzjoni 4.0 Internazzjonali</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Creative Commons Uvedenie Autora 4.0 Medzinárodný</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Creative Commons Priznanje avtorstva 4.0 Mednarodna</skos:prefLabel> + <at:authority-code>CC_BY_4_0</at:authority-code> + <at:op-code>CC_BY_4_0</at:op-code> + <at:start.use>2013-11-26</at:start.use> + <atold:op-code>CC_BY_4_0</atold:op-code> + <dc:identifier>CC_BY_4_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC BY 4.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC BY 4.0</skos:altLabel> + <skos:definition xml:lang="da">Denne licens tillader andre at videredistribuere, omarbejde, tilpasse og bygge videre på materialet, også kommercielt, så længe de krediterer skaberen af det oprindelige materiale. Dette er den mindst restriktive licens, creative commons udbyder. Anbefalet hvis man ønsker mest mulig videreformidling og brug af det licenserede materiale.</skos:definition> + <skos:definition xml:lang="en">CC BY 4.0 lets others distribute, remix, tweak, and build upon the author’s work, even commercially, as long as they credit the author for the original creation. This is the most accommodating of licences offered. Recommended for maximum dissemination and use of licenced materials.</skos:definition> + <skos:definition xml:lang="fr">CC BY 4.0 permet aux autres de distribuer, remixer, arranger, et adapter l’œuvre de l’auteur/autrice, même à des fins commerciales, tant qu’on accorde le mérite de la création originale à l’auteur/autrice en citant son nom. C’est le contrat le plus souple proposé. Recommandé pour la diffusion et l’utilisation maximales d’œuvres licenciées sous CC.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/licenses/by/4.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CC_PDM_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Public Domain Mark 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Označení volného díla 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="da">Public domain-mærke 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="de">Public Domain Mark 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="el">Σήμα Δημόσιου Τομέα 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">Public Domain Mark 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="es">Etiqueta de Dominio Público 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="et">Avaliku omandi märge 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Public Domain -merkintä 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Marque du Domaine Public 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Oznaka javnog dobra 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Közkincs megjelölés 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="it">Marchio di pubblico dominio 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Viešosios srities žymuo 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Sabiedrības īpašuma iezīme 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Public Domain Mark 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Public Domain Mark 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Znak domeny publicznej 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Marca de Domínio Público 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Marca Domeniului Public 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Public Domain Mark 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Oznaka javne domene 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Public domain-märke 1.0</skos:prefLabel> + <at:authority-code>CC_PDM_1_0</at:authority-code> + <at:op-code>CC_PDM_1_0</at:op-code> + <at:start.use>2010-10-01</at:start.use> + <atold:op-code>CC_PDM_1_0</atold:op-code> + <dc:identifier>CC_PDM_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CC PDM 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CC PDM 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://wiki.openmod-initiative.org/images/6/63/Jens-opendata_govdata.de_FraunhoferFokus.pdf</skos:changeNote> + <skos:definition xml:lang="en">Published by Creative Commons, Public Domain Mark (CC PDM 1.0) identifies a work as being free of known restrictions under copyright law, including all related and neighboring rights. The user can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.</skos:definition> + <skos:exactMatch rdf:resource="http://creativecommons.org/publicdomain/mark/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CDDL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Common Development and Distribution License 1.0</skos:prefLabel> + <at:authority-code>CDDL_1_0</at:authority-code> + <at:op-code>CDDL_1_0</at:op-code> + <at:start.use>2004-01-24</at:start.use> + <atold:op-code>CDDL_1_0</atold:op-code> + <dc:identifier>CDDL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CDDL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CDDL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/CDDL-1.0.html</skos:changeNote> + <skos:definition xml:lang="en">CDDL-1.0 is a free software licence approved by the Open Source Initiative. A moderated (or weak) copyleft licence used by SUN, including explicit patent grants, it is similar to MPL and EPL. Compiled object code can be distributed under any licence, but the original source code (and modified derivatives) must be made available, under the CDDL.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/CDDL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CECILL_2_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">CEA CNRS Inria Free Software License Agreement, v2.1 (CECILL-2.1)</skos:prefLabel> + <skos:prefLabel xml:lang="fr">CEA CNRS Inria Logiciel Libre License, version 2.1 (CECILL-2.1)</skos:prefLabel> + <at:authority-code>CECILL_2_1</at:authority-code> + <at:op-code>CECILL_2_1</at:op-code> + <at:start.use>2013-06-21</at:start.use> + <atold:op-code>CECILL_2_1</atold:op-code> + <dc:identifier>CECILL_2_1</dc:identifier> + <skos:altLabel xml:lang="bg">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="cs">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="da">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="de">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="el">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="en">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="es">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="et">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fi">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fr">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ga">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hr">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hu">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="it">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lt">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lv">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="mt">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="nl">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pl">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pt">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ro">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sk">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sl">CECILL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sv">CECILL-2.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/CeCILL</skos:changeNote> + <skos:definition xml:lang="en">CECILL-2.1 is a moderate copyleft licence initiated in France by CEA, CNRS and Inria and approved by the Open Source Initiative. It has a working value in English/French. It is widely compatible, since only the specific files source code must stay covered, and not the other files or components of a solution. It is therefore designed for components or libraries. Governed by French law.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/CECILL-2.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CLARIN_ACA_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Clarin Academic End-User Licence (ACA) 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="et">Clarin akadeemiline lõppkasutaja litsents (ACA) 1.0</skos:prefLabel> + <at:authority-code>CLARIN_ACA_1_0</at:authority-code> + <at:op-code>CLARIN_ACA_1_0</at:op-code> + <at:start.use>2014-12-12</at:start.use> + <atold:op-code>CLARIN_ACA_1_0</atold:op-code> + <dc:identifier>CLARIN_ACA_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CLARIN-EULA-ACA-v1.0</skos:altLabel> + <skos:definition xml:lang="en">The copyright holder grants the end-user a free, non-exclusive and perpetual (for the duration of the copyright) right to use and make copies of the resource for educational, teaching or research purposes as such, as modified, or as part of a compilation or derived work.</skos:definition> + <skos:exactMatch rdf:resource="https://www.clarin.eu/content/licenses-and-clarin-categories"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CNRI_PYTHON" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The CNRI portion of the multi-part Python License (CNRI-Python)</skos:prefLabel> + <at:authority-code>CNRI_PYTHON</at:authority-code> + <at:op-code>CNRI_PYTHON</at:op-code> + <at:start.use>2001-03-06</at:start.use> + <atold:op-code>CNRI_PYTHON</atold:op-code> + <dc:identifier>CNRI_PYTHON</dc:identifier> + <skos:altLabel xml:lang="bg">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="cs">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="da">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="de">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="el">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="en">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="es">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="et">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="fi">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="fr">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="ga">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="hr">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="hu">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="it">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="lt">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="lv">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="mt">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="nl">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="pl">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="pt">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="ro">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="sk">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="sl">CNRI-Python</skos:altLabel> + <skos:altLabel xml:lang="sv">CNRI-Python</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Python_Software_Foundation</skos:changeNote> + <skos:definition xml:lang="en">CNRI-Python is a permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/CNRI-Python"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/COM_REUSE" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">European Commission reuse notice</skos:prefLabel> + <at:authority-code>COM_REUSE</at:authority-code> + <at:op-code>COM_REUSE</at:op-code> + <at:start.use>2011-12-14</at:start.use> + <atold:op-code>COM_REUSE</atold:op-code> + <dc:identifier>COM_REUSE</dc:identifier> + <skos:definition xml:lang="en">According to the European Commission reuse notice, reuse is authorised, provided the source is acknowledged. The reuse policy of the European Commission is implemented by the Decision of 12 December 2011. The general principle of reuse can be subject to conditions which may be specified in individual copyright notices. Therefore users are advised to refer to the copyright notices of the individual websites maintained under Europa and of the individual documents. Reuse is not applicable to documents subject to intellectual property rights of third parties.</skos:definition> + <skos:exactMatch rdf:resource="http://data.europa.eu/eli/dec/2011/833/oj"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CPAL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Common Public Attribution License Version 1.0 (CPAL-1.0)</skos:prefLabel> + <at:authority-code>CPAL_1_0</at:authority-code> + <at:op-code>CPAL_1_0</at:op-code> + <at:start.use>2007-07-26</at:start.use> + <atold:op-code>CPAL_1_0</atold:op-code> + <dc:identifier>CPAL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CPAL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CPAL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Common_Public_Attribution_License; https://www.socialtext.net/open/cpal</skos:changeNote> + <skos:definition xml:lang="en">CPAL-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. Under this licence, it is possible to create a larger work by combining the program with other software code not governed by the terms of this licence, and distribute the larger work as a single product.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/CPAL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/CPL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Common Public License, version 1.0 (CPL-1.0)</skos:prefLabel> + <at:authority-code>CPL_1_0</at:authority-code> + <at:op-code>CPL_1_0</at:op-code> + <at:start.use>2001-05-01</at:start.use> + <atold:op-code>CPL_1_0</atold:op-code> + <dc:identifier>CPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">CPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">CPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Common_Public_License</skos:changeNote> + <skos:definition xml:lang="en">CPL-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. It is superseded by EPL-1.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/CPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2005-06-27</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/DLDE_BYNC_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="de">Datenlizenz Deutschland – Namensnennung – Version 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">Data licence Germany – attribution – non-commercial – Version 1.0</skos:prefLabel> + <at:authority-code>DLDE_BYNC_1_0</at:authority-code> + <at:op-code>DLDE_BYNC_1_0</at:op-code> + <at:start.use>2012-01-01</at:start.use> + <atold:op-code>DLDE_BYNC_1_0</atold:op-code> + <dc:identifier>DLDE_BYNC_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">DL-DE BY-NC 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">DL-DE BY-NC 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://wiki.openmod-initiative.org/images/6/63/Jens-opendata_govdata.de_FraunhoferFokus.pdf</skos:changeNote> + <skos:definition xml:lang="en">Published by Germany, DL-DE BY-NC 1.0 is a data licence permitting any non-commercial use, as long as credit is given to the author for the original creation. Changes must be marked as such in the source note. The provider mus make available the data, contents and services with the diligence necessary for the discharge of its public tasks.</skos:definition> + <skos:exactMatch rdf:resource="https://www.govdata.de/dl-de/by-nc-1-0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/DLDE_BY_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="de">Datenlizenz Deutschland – Namensnennung – Version 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">Data licence Germany – attribution – Version 1.0</skos:prefLabel> + <at:authority-code>DLDE_BY_1_0</at:authority-code> + <at:op-code>DLDE_BY_1_0</at:op-code> + <at:start.use>2013-01-31</at:start.use> + <atold:op-code>DLDE_BY_1_0</atold:op-code> + <dc:identifier>DLDE_BY_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">DL-DE BY 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">DL-DE BY 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://wiki.openmod-initiative.org/images/6/63/Jens-opendata_govdata.de_FraunhoferFokus.pdf</skos:changeNote> + <skos:definition xml:lang="en">Published by Germany, DL-DE BY 1.0 is a data licence permitting any use commercially and non-commercially, as long as credit is given to the author for the original creation. Changes must be marked as such in the source note. The provider mus make available the data, contents and services with the diligence necessary for the discharge of its public tasks.</skos:definition> + <skos:exactMatch rdf:resource="https://www.govdata.de/dl-de/by-1-0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/DLDE_BY_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="de">Datenlizenz Deutschland – Namensnennung – Version 2.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">Data licence Germany – attribution – Version 2.0</skos:prefLabel> + <at:authority-code>DLDE_BY_2_0</at:authority-code> + <at:op-code>DLDE_BY_2_0</at:op-code> + <at:start.use>2014-07-01</at:start.use> + <atold:op-code>DLDE_BY_2_0</atold:op-code> + <dc:identifier>DLDE_BY_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">DL-DE BY 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">DL-DE BY 2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://wiki.openmod-initiative.org/images/6/63/Jens-opendata_govdata.de_FraunhoferFokus.pdf</skos:changeNote> + <skos:definition xml:lang="en">Published by Germany, DL-DE BY 2.0 is a data licence permitting any use commercially and non-commercially, as long as credit is given to the author for the original creation. Changes must be marked as such in the source note.</skos:definition> + <skos:exactMatch rdf:resource="https://www.govdata.de/dl-de/by-2-0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/DLDE_ZERO_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="de">Datenlizenz Deutschland – Zero – Version 2.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">Data licence Germany – Zero – Version 2.0</skos:prefLabel> + <at:authority-code>DLDE_ZERO_2_0</at:authority-code> + <at:op-code>DLDE_ZERO_2_0</at:op-code> + <at:start.use>2014-07-01</at:start.use> + <atold:op-code>DLDE_ZERO_2_0</atold:op-code> + <dc:identifier>DLDE_ZERO_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">DL-DE ZERO 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">DL-DE ZERO 2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://wiki.openmod-initiative.org/images/6/63/Jens-opendata_govdata.de_FraunhoferFokus.pdf</skos:changeNote> + <skos:definition xml:lang="en">Published by Germany, DL-DE ZERO 2.0 is a data licence permitting any use without restrictions or conditions. The data and meta-data provided may be for commercial and non-commercial use.</skos:definition> + <skos:exactMatch rdf:resource="https://www.govdata.de/dl-de/by-2-0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ECL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Educational Community License version 1.0 (ECL-1.0)</skos:prefLabel> + <at:authority-code>ECL_1_0</at:authority-code> + <at:op-code>ECL_1_0</at:op-code> + <at:start.use>2005-03-15</at:start.use> + <atold:op-code>ECL_1_0</atold:op-code> + <dc:identifier>ECL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">ECL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">ECL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Sakai_(software</skos:changeNote> + <skos:definition xml:lang="en">ECL-1.0 is a permissive free software licence approved by the Open Source Initiative. It is similar to the Apache 1.2. It is superseded by ECL-2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/ECL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2007-04-14</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ECL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Educational Community License version 2.0 (ECL-2.0)</skos:prefLabel> + <at:authority-code>ECL_2_0</at:authority-code> + <at:op-code>ECL_2_0</at:op-code> + <at:start.use>2007-04-15</at:start.use> + <atold:op-code>ECL_2_0</atold:op-code> + <dc:identifier>ECL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">ECL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">ECL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://tldrlegal.com/license/educational-community-license,-version-2.0-(ecl-2.0)#fulltext</skos:changeNote> + <skos:definition xml:lang="en">ECL-2.0 is a permissive free software licence approved by the Open Source Initiative. It is similar to the Apache 1.2. Nothing in the licence prohibits re-licencing of a larger work under the EUPL.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/ECL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ECOS_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">eCos License version 2.0</skos:prefLabel> + <at:authority-code>ECOS_2_0</at:authority-code> + <at:op-code>ECOS_2_0</at:op-code> + <at:start.use>2002-05-15</at:start.use> + <atold:op-code>ECOS_2_0</atold:op-code> + <dc:identifier>ECOS_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">eCos-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">eCos-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://ecos.sourceware.org/license-overview.html</skos:changeNote> + <skos:definition xml:lang="en">Owned by the Free Software Foundation, eCos-2.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/eCos-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EFL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">The Eiffel Forum License, version 1 (EFL-1.0)</skos:prefLabel> + <at:authority-code>EFL_1_0</at:authority-code> + <at:op-code>EFL_1_0</at:op-code> + <at:start.use>2002-07-01</at:start.use> + <atold:op-code>EFL_1_0</atold:op-code> + <dc:identifier>EFL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">EFL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">EFL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Eiffel_Forum_License</skos:changeNote> + <skos:definition xml:lang="en">EFL-1.0 is a BSD-style, permissive free software licence approved by the Open Source Initiative. It is superseded by 2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/EFL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2008-01-01</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EFL_2" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Eiffel Forum License, version 2</skos:prefLabel> + <at:authority-code>EFL_2</at:authority-code> + <at:op-code>EFL_2</at:op-code> + <at:start.use>2008-01-02</at:start.use> + <atold:op-code>EFL_2</atold:op-code> + <dc:identifier>EFL_2</dc:identifier> + <skos:altLabel xml:lang="bg">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">EFL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">EFL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Eiffel_Forum_License</skos:changeNote> + <skos:definition xml:lang="en">EFL-2.0 is a BSD-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/EFL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ENTESSA" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Entessa Public License Version 1.0 (Entessa)</skos:prefLabel> + <at:authority-code>ENTESSA</at:authority-code> + <at:op-code>ENTESSA</at:op-code> + <at:start.use>2003-07-01</at:start.use> + <atold:op-code>ENTESSA</atold:op-code> + <dc:identifier>ENTESSA</dc:identifier> + <skos:altLabel xml:lang="bg">Entessa</skos:altLabel> + <skos:altLabel xml:lang="cs">Entessa</skos:altLabel> + <skos:altLabel xml:lang="da">Entessa</skos:altLabel> + <skos:altLabel xml:lang="de">Entessa</skos:altLabel> + <skos:altLabel xml:lang="el">Entessa</skos:altLabel> + <skos:altLabel xml:lang="en">Entessa</skos:altLabel> + <skos:altLabel xml:lang="es">Entessa</skos:altLabel> + <skos:altLabel xml:lang="et">Entessa</skos:altLabel> + <skos:altLabel xml:lang="fi">Entessa</skos:altLabel> + <skos:altLabel xml:lang="fr">Entessa</skos:altLabel> + <skos:altLabel xml:lang="ga">Entessa</skos:altLabel> + <skos:altLabel xml:lang="hr">Entessa</skos:altLabel> + <skos:altLabel xml:lang="hu">Entessa</skos:altLabel> + <skos:altLabel xml:lang="it">Entessa</skos:altLabel> + <skos:altLabel xml:lang="lt">Entessa</skos:altLabel> + <skos:altLabel xml:lang="lv">Entessa</skos:altLabel> + <skos:altLabel xml:lang="mt">Entessa</skos:altLabel> + <skos:altLabel xml:lang="nl">Entessa</skos:altLabel> + <skos:altLabel xml:lang="pl">Entessa</skos:altLabel> + <skos:altLabel xml:lang="pt">Entessa</skos:altLabel> + <skos:altLabel xml:lang="ro">Entessa</skos:altLabel> + <skos:altLabel xml:lang="sk">Entessa</skos:altLabel> + <skos:altLabel xml:lang="sl">Entessa</skos:altLabel> + <skos:altLabel xml:lang="sv">Entessa</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/entessa-1.0/</skos:changeNote> + <skos:definition xml:lang="en">Entessa 1.0 is a BSD-style, permissive free software licence approved by the Open Source Initiative. It imposes copyright acknowledgements that are compatible with the EUPL.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Entessa"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EPL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Eclipse Public License 1.0 (EPL-1.0)</skos:prefLabel> + <at:authority-code>EPL_1_0</at:authority-code> + <at:op-code>EPL_1_0</at:op-code> + <at:start.use>2005-06-28</at:start.use> + <atold:op-code>EPL_1_0</atold:op-code> + <dc:identifier>EPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">EPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">EPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/EPL-1.0.html</skos:changeNote> + <skos:definition xml:lang="en">EPL 1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. Made and mainly used by the Eclipse Foundation, it is similar to GPL but does not submit linking of the covered code to conditions or ”viral” extension of licence coverage to the other linked software. It is superseded by EPL 2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/EPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2017-08-23</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EPL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Eclipse Public License version 2.0</skos:prefLabel> + <at:authority-code>EPL_2_0</at:authority-code> + <at:op-code>EPL_2_0</at:op-code> + <at:start.use>2017-08-24</at:start.use> + <atold:op-code>EPL_2_0</atold:op-code> + <dc:identifier>EPL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">EPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">EPL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Eclipse_Public_License</skos:changeNote> + <skos:definition xml:lang="en">EPL 2.0 is a copyleft-style, free software licence approved by the Open Source Initiative. Made and mainly used by the Eclipse Foundation, it is similar to GPL but does not submit linking of the covered code to conditions or ”viral” extension of licence coverage to the other linked software.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/EPL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ETALAB_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Etalab Open Licence V 2.0</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence Ouverte Etalab V 2.0 </skos:prefLabel> + <at:authority-code>ETALAB_2_0</at:authority-code> + <at:op-code>ETALAB_2_0</at:op-code> + <at:start.use>2011-10-18</at:start.use> + <atold:op-code>ETALAB_2_0</atold:op-code> + <dc:identifier>ETALAB_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Etalab-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Etalab-2.0</skos:altLabel> + <skos:definition xml:lang="en">The Licence Ouverte / Open Licence is a French open licence published by Etalab for open data from the State of France. The licence was designed to be compatible with Creative Commons Licences, Open Government Licence and the Open Data Commons Attribution License.</skos:definition> + <skos:definition xml:lang="fr">La Licence ouverte / Open Licence, aussi appelée Licence Ouverte Etalab, est une licence libre française créée par la mission Etalab afin d’encadrer l’ouverture des données de l’État français. Cette licence a été voulue comme une licence compatible avec les licences Open Government Licence du Royaume-Uni, Open Data Commons Attribution de l’Open Knowledge Foundation et Creative Commons Attribution 2.0 de Creative Commons.</skos:definition> + <skos:exactMatch rdf:resource="https://www.etalab.gouv.fr/licence-ouverte-open-licence/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EUPL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Публичен лиценз на Европейския съюз версия v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Veřejná Licence Evropské Unie v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="da">Europæiske Unions Offentlige Licens v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="de">Open-Source-Lizenz für die Europäische Union v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="el">Άδεια δημόσιας χρήσης για την Ευρωπαϊκή Ένωση v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="en">European Union Public Licence v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="es">Licencia Pública de la Unión Europea v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="et">Euroopa Liidu tarkvara vaba kasutuse litsents v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Euroopan unionin yleinen lisenssi v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence Publique de l’Union européenne v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Javna licencija Europske unije v. 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Európai Uniós Nyílt Forráskódú Licenc v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="it">Licenza Pubblica dell'Unione europea v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Europos Sąjungos viešoji licencija V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Eiropas Savienības sabiedriskā licence V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Liċenzja Pubblika ta' l-Unjoni Ewropea V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Openbare licentie van de Europese Unie V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Licencja publiczna UE wersja 1.0</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Licença Pública da União Europeia V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Licenţa publică a Uniunii Europene v.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Verejná licencia Európskej únie V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Javna licenca Evropske unije V.1.0</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Licens till öppen källkod från Europeiska Unionen V.1.0</skos:prefLabel> + <at:authority-code>EUPL_1_0</at:authority-code> + <at:op-code>EUPL_1_0</at:op-code> + <at:start.use>2007-01-09</at:start.use> + <atold:op-code>EUPL_1_0</atold:op-code> + <dc:identifier>EUPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="da">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="de">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="el">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="en">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="es">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="et">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="it">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">EUPL v.1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">EUPL v.1.0</skos:altLabel> + <skos:definition xml:lang="en">Created as a tool for publishing any copyrighted work as open source on the initiative of the European Commission, EUPL v.1.0 is the first European Free/Open Source Software (F/OSS) licence. The final version (v.1.0) was officially approved on 9 January 2007 in three linguistic versions. By a second Decision of 9 January 2008, the European Commission validated the EUPL in all the official languages of the European Union.</skos:definition> + <skos:exactMatch rdf:resource="http://ec.europa.eu/idabc/en/document/7330.html"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EUPL_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Публичен лиценз на Европейския съюз версия v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Veřejná Licence Evropské Unie v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="da">Europæiske Unions Offentlige Licens v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="de">Open-Source-Lizenz für die Europäische Union v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="el">Άδεια δηµόσιας χρήσης για την Ευρωπαϊκή Ένωση V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="en">European Union Public Licence v. 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="es">Licencia Pública de la Unión Europea v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="et">Euroopa Liidu tarkvara vaba kasutuse litsents v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Euroopan unionin yleinen lisenssi v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence publique de l'Union européenne v. 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Javna licencija Europske unije v. 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Európai Uniós Nyílt Forráskódú Licenc V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="it">Licenza Pubblica dell'Unione europea v. 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Europos Sąjungos viešoji licencija V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Eiropas Savienības sabiedriskā licence V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Liċenzja Pubblika tal-Unjoni Ewropea V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Openbare licentie van de Europese Unie V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Licencja publiczna Unii Europejskiej v.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Licença Pública da União Europeia V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Licenţa publică a Uniunii Europene V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Verejná licencia Európskej únie V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Javna licenca Evropske unije V.1.1</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Licens till öppen källkod från Europeiska unionen v.1.1</skos:prefLabel> + <at:authority-code>EUPL_1_1</at:authority-code> + <at:op-code>EUPL_1_1</at:op-code> + <at:start.use>2009-01-09</at:start.use> + <atold:op-code>EUPL_1_1</atold:op-code> + <dc:identifier>EUPL_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="da">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="de">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="el">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="en">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="es">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="et">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="it">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">EUPL v.1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">EUPL v.1.1</skos:altLabel> + <skos:definition xml:lang="en">Created as a tool for publishing any copyrighted work as open source on the initiative of the European Commission, EUPL v.1.1 is the first European Free/Open Source Software (F/OSS) licence. The European Commission published the version 1.1 in all the official languages of the European Union by the Decision of 9 January 2009.</skos:definition> + <skos:exactMatch rdf:resource="https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EUPL_1_2" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Публичен лиценз на Европейския съюз версия v.1.2</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Veřejná Licence Evropské Unie v.1.2</skos:prefLabel> + <skos:prefLabel xml:lang="da">Europæiske Unions Offentlige Licens v.1.2</skos:prefLabel> + <skos:prefLabel xml:lang="de">Open-Source-Lizenz für die Europäische Union v.1.2</skos:prefLabel> + <skos:prefLabel xml:lang="el">Άδεια δημόσιας χρήσης για την Ευρωπαϊκή Ένωση v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="en">European Union Public Licence v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="es">Licencia Pública de la Unión Europea v.1.2</skos:prefLabel> + <skos:prefLabel xml:lang="et">Euroopa Liidu tarkvara vaba kasutuse litsents v.1.2</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Euroopan unionin yleisen lisenssi v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence publique de l'Union européenne v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Javna licencija Europske unije v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Európai Uniós Nyilvános Licenc 1.2. verzió</skos:prefLabel> + <skos:prefLabel xml:lang="it">Licenza Pubblica dell'Unione europea v 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Europos Sąjungos viešoji licencija v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Eiropas Savienības sabiedriskā licence 1.2. redakcija</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Liċenzja Pubblika tal-Unjoni Ewropea v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Openbare licentie van de Europese Unie v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Licencja publiczna Unii Europejskiej wersja 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Licença Pública da União Europeia v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Licență publică a Uniunii Europene V. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Verejná licencia Európskej únie v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Javna licenca Evropske unije v. 1.2</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Licens till öppen källkod från Europeiska unionen v. 1.2</skos:prefLabel> + <at:authority-code>EUPL_1_2</at:authority-code> + <at:op-code>EUPL_1_2</at:op-code> + <at:start.use>2017-05-19</at:start.use> + <atold:op-code>EUPL_1_2</atold:op-code> + <dc:identifier>EUPL_1_2</dc:identifier> + <skos:altLabel xml:lang="bg">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="cs">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="da">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="de">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="el">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="en">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="es">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="et">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="fi">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="fr">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="ga">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="hr">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="hu">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="it">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="lt">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="lv">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="mt">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="nl">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="pl">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="pt">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="ro">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="sk">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="sl">EUPL v1.2</skos:altLabel> + <skos:altLabel xml:lang="sv">EUPL v1.2</skos:altLabel> + <skos:definition xml:lang="en">Created as a tool for publishing any copyrighted work as open source, EUPL v.1.2 is legally consistent with the copyright law of all EU countries and is especially well-suited for public administrations sharing IT solutions. It is also widely used by the private sector. The text of the EUPL version 1.2 was published on 19 May 2017.</skos:definition> + <skos:definition xml:lang="fr">EUPL v.1.2 a été créée par la Commission en 2007. Elle a pour but de constituer une licence libre valable dans toutes les langues de l’Union, en tenant compte de ses spécificités juridiques et des questions de compatibilité entre licences libres. Il s’agit d’une licence dite «copyleft» dont le but est de garantir la nature «open source» des dérivés des logiciels.</skos:definition> + <skos:exactMatch rdf:resource="https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EUROGEO_2022" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">EuroGeographics Open Data Licence v.2022</skos:prefLabel> + <at:authority-code>EUROGEO_2022</at:authority-code> + <at:op-code>EUROGEO_2022</at:op-code> + <at:start.use>2013-01-01</at:start.use> + <atold:op-code>EUROGEO_2022</atold:op-code> + <dc:identifier>EUROGEO_2022</dc:identifier> + <skos:altLabel xml:lang="bg">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="cs">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="da">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="de">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="el">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="en">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="es">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="et">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="fi">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="fr">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="ga">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="hr">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="hu">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="it">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="lt">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="lv">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="mt">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="nl">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="pl">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="pt">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="ro">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="sk">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="sl">EuroGeographicsODL v.2022</skos:altLabel> + <skos:altLabel xml:lang="sv">EuroGeographicsODL v.2022</skos:altLabel> + <skos:definition xml:lang="en">free software licence approved by the EuroGeographics AISBL, letting others to reuse the work as long as credit is given to the author and new creations are licenced under the identical terms</skos:definition> + <skos:exactMatch rdf:resource="https://www.mapsforeurope.org/licence"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/EU_DATAGRID" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">EU DataGrid Software License (EUDatagrid)</skos:prefLabel> + <at:authority-code>EU_DATAGRID</at:authority-code> + <at:op-code>EU_DATAGRID</at:op-code> + <at:start.use>2001-06-30</at:start.use> + <atold:op-code>EU_DATAGRID</atold:op-code> + <dc:identifier>EU_DATAGRID</dc:identifier> + <skos:altLabel xml:lang="bg">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="cs">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="da">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="de">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="el">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="en">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="es">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="et">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="fi">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="fr">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="ga">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="hr">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="hu">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="it">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="lt">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="lv">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="mt">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="nl">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="pl">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="pt">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="ro">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="sk">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="sl">EUDatagrid</skos:altLabel> + <skos:altLabel xml:lang="sv">EUDatagrid</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/eu-datagrid/</skos:changeNote> + <skos:definition xml:lang="en">EUDatagrid is a permissive free software licence approved by the Open Source Initiative. It is a classic 3-clause licence. Nothing in this licence restricts redistribution of larger works under the EUPL.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/EUDatagrid"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/FAIR" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Fair License (Fair)</skos:prefLabel> + <at:authority-code>FAIR</at:authority-code> + <at:op-code>FAIR</at:op-code> + <at:start.use>2004-01-31</at:start.use> + <atold:op-code>FAIR</atold:op-code> + <dc:identifier>FAIR</dc:identifier> + <skos:altLabel xml:lang="bg">Fair</skos:altLabel> + <skos:altLabel xml:lang="cs">Fair</skos:altLabel> + <skos:altLabel xml:lang="da">Fair</skos:altLabel> + <skos:altLabel xml:lang="de">Fair</skos:altLabel> + <skos:altLabel xml:lang="el">Fair</skos:altLabel> + <skos:altLabel xml:lang="en">Fair</skos:altLabel> + <skos:altLabel xml:lang="es">Fair</skos:altLabel> + <skos:altLabel xml:lang="et">Fair</skos:altLabel> + <skos:altLabel xml:lang="fi">Fair</skos:altLabel> + <skos:altLabel xml:lang="fr">Fair</skos:altLabel> + <skos:altLabel xml:lang="ga">Fair</skos:altLabel> + <skos:altLabel xml:lang="hr">Fair</skos:altLabel> + <skos:altLabel xml:lang="hu">Fair</skos:altLabel> + <skos:altLabel xml:lang="it">Fair</skos:altLabel> + <skos:altLabel xml:lang="lt">Fair</skos:altLabel> + <skos:altLabel xml:lang="lv">Fair</skos:altLabel> + <skos:altLabel xml:lang="mt">Fair</skos:altLabel> + <skos:altLabel xml:lang="nl">Fair</skos:altLabel> + <skos:altLabel xml:lang="pl">Fair</skos:altLabel> + <skos:altLabel xml:lang="pt">Fair</skos:altLabel> + <skos:altLabel xml:lang="ro">Fair</skos:altLabel> + <skos:altLabel xml:lang="sk">Fair</skos:altLabel> + <skos:altLabel xml:lang="sl">Fair</skos:altLabel> + <skos:altLabel xml:lang="sv">Fair</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Fair_License</skos:changeNote> + <skos:definition xml:lang="en">Fair is a permissive free software licence approved by the Open Source Initiative. It gives complete freedom to use the given works, as long as this licence is included and a warranty is not placed.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Fair"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/FRAMEWORX_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Frameworx License 1.0 (Frameworx-1.0)</skos:prefLabel> + <at:authority-code>FRAMEWORX_1_0</at:authority-code> + <at:op-code>FRAMEWORX_1_0</at:op-code> + <at:start.use>2003-07-01</at:start.use> + <atold:op-code>FRAMEWORX_1_0</atold:op-code> + <dc:identifier>FRAMEWORX_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Frameworx-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Frameworx-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/frameworx-1.0/?_list_filters=q%3Dframeworx#essentials</skos:changeNote> + <skos:definition xml:lang="en">Frameworx-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Frameworx-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/GNU_FDL" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">GNU Free Documentation License</skos:prefLabel> + <at:authority-code>GNU_FDL</at:authority-code> + <at:op-code>GNU_FDL</at:op-code> + <at:start.use>2008-11-03</at:start.use> + <atold:op-code>GNU_FDL</atold:op-code> + <dc:identifier>GNU_FDL</dc:identifier> + <skos:altLabel xml:lang="bg">GFDL</skos:altLabel> + <skos:altLabel xml:lang="cs">GFDL</skos:altLabel> + <skos:altLabel xml:lang="da">GFDL</skos:altLabel> + <skos:altLabel xml:lang="de">GFDL</skos:altLabel> + <skos:altLabel xml:lang="el">GFDL</skos:altLabel> + <skos:altLabel xml:lang="en">GFDL</skos:altLabel> + <skos:altLabel xml:lang="es">GFDL</skos:altLabel> + <skos:altLabel xml:lang="et">GFDL</skos:altLabel> + <skos:altLabel xml:lang="fi">GFDL</skos:altLabel> + <skos:altLabel xml:lang="fr">GFDL</skos:altLabel> + <skos:altLabel xml:lang="ga">GFDL</skos:altLabel> + <skos:altLabel xml:lang="hr">GFDL</skos:altLabel> + <skos:altLabel xml:lang="hu">GFDL</skos:altLabel> + <skos:altLabel xml:lang="it">GFDL</skos:altLabel> + <skos:altLabel xml:lang="lt">GFDL</skos:altLabel> + <skos:altLabel xml:lang="lv">GFDL</skos:altLabel> + <skos:altLabel xml:lang="mt">GFDL</skos:altLabel> + <skos:altLabel xml:lang="nl">GFDL</skos:altLabel> + <skos:altLabel xml:lang="pl">GFDL</skos:altLabel> + <skos:altLabel xml:lang="pt">GFDL</skos:altLabel> + <skos:altLabel xml:lang="ro">GFDL</skos:altLabel> + <skos:altLabel xml:lang="sk">GFDL</skos:altLabel> + <skos:altLabel xml:lang="sl">GFDL</skos:altLabel> + <skos:altLabel xml:lang="sv">GFDL</skos:altLabel> + <skos:definition xml:lang="en">GNU Free Documentation License is a form of copyleft intended for use on a manual, textbook or other document to assure everyone the effective freedom to copy and redistribute it, with or without modifications, either commercially or non-commercially.</skos:definition> + <skos:definition xml:lang="fr">GNU Free Documentation License est une forme de copyleft destinée aux manuels, aux livres scolaires et autres documents. Son objectif est de garantir à tous la possibilité effective de copier et de redistribuer librement le document avec ou sans modification, et que ce soit ou non dans un but commercial.</skos:definition> + <skos:exactMatch rdf:resource="http://www.gnu.org/licenses/licenses.html"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2008-11-04</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/GNU_FDL_1_1" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">GNU Free Documentation License 1.1</skos:prefLabel> + <at:authority-code>GNU_FDL_1_1</at:authority-code> + <at:op-code>GNU_FDL_1_1</at:op-code> + <at:start.use>2000-03-01</at:start.use> + <atold:op-code>GNU_FDL_1_1</atold:op-code> + <dc:identifier>GNU_FDL_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="da">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="de">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="el">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="en">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="es">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="et">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="it">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">GNU FDL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">GNU FDL 1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.gnu.org/licenses/old-licenses/fdl-1.1</skos:changeNote> + <skos:definition xml:lang="en">GNU FDL 1.1 is a form of copyleft intended for use on a manual, textbook or other document to assure everyone the effective freedom to copy and redistribute it, with or without modifications, either commercially or non-commercially.</skos:definition> + <skos:exactMatch rdf:resource="https://gnu.org/licenses/old-licenses/fdl-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2007-06-28</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/GNU_FDL_1_2" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">GNU Free Documentation License 1.2</skos:prefLabel> + <at:authority-code>GNU_FDL_1_2</at:authority-code> + <at:op-code>GNU_FDL_1_2</at:op-code> + <at:start.use>2002-11-01</at:start.use> + <atold:op-code>GNU_FDL_1_2</atold:op-code> + <dc:identifier>GNU_FDL_1_2</dc:identifier> + <skos:altLabel xml:lang="bg">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="cs">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="da">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="de">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="el">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="en">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="es">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="et">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="fi">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="fr">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="ga">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="hr">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="hu">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="it">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="lt">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="lv">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="mt">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="nl">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="pl">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="pt">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="ro">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="sk">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="sl">GNU FDL 1.2</skos:altLabel> + <skos:altLabel xml:lang="sv">GNU FDL 1.2</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.gnu.org/licenses/old-licenses/fdl-1.2</skos:changeNote> + <skos:definition xml:lang="en">GNU FDL 1.2 is a form of copyleft intended for use on a manual, textbook or other document to assure everyone the effective freedom to copy and redistribute it, with or without modifications, either commercially or non-commercially.</skos:definition> + <skos:exactMatch rdf:resource="ttps://gnu.org/licenses/old-licenses/fdl-1.2"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2007-06-28</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/GNU_FDL_1_3" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">GNU Free Documentation License 1.3</skos:prefLabel> + <at:authority-code>GNU_FDL_1_3</at:authority-code> + <at:op-code>GNU_FDL_1_3</at:op-code> + <at:start.use>2008-11-04</at:start.use> + <atold:op-code>GNU_FDL_1_3</atold:op-code> + <dc:identifier>GNU_FDL_1_3</dc:identifier> + <skos:altLabel xml:lang="bg">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="bg">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="cs">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="cs">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="da">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="da">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="de">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="de">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="el">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="el">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="en">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="en">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="es">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="es">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="et">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="et">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="fi">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="fi">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="fr">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="fr">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="ga">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="ga">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="hr">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="hr">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="hu">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="hu">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="it">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="it">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="lt">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="lt">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="lv">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="lv">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="mt">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="mt">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="nl">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="nl">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="pl">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="pl">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="pt">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="pt">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="ro">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="ro">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="sk">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="sk">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="sl">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="sl">GNU FDL 1.3</skos:altLabel> + <skos:altLabel xml:lang="sv">GFDL-1.3</skos:altLabel> + <skos:altLabel xml:lang="sv">GNU FDL 1.3</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.gnu.org/licenses/fdl-1.3.html</skos:changeNote> + <skos:definition xml:lang="en">GNU FDL 1.3 is a form of copyleft intended for use on a manual, textbook or other document to assure everyone the effective freedom to copy and redistribute it, with or without modifications, either commercially or non-commercially.</skos:definition> + <skos:exactMatch rdf:resource="http://www.gnu.org/licenses/licenses.html"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/GPL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">GNU General Public License version 2</skos:prefLabel> + <skos:prefLabel xml:lang="et">GNU üldine vaba kasutuse litsents versioon 2</skos:prefLabel> + <at:authority-code>GPL_2_0</at:authority-code> + <at:op-code>GPL_2_0</at:op-code> + <at:start.use>1991-06-02</at:start.use> + <atold:op-code>GPL_2_0</atold:op-code> + <dc:identifier>GPL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">GPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">GPL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/GPL-2.0-only.html#licenseText</skos:changeNote> + <skos:definition xml:lang="en">GPL-2.0 is the ”historical” free software licence. It is supported by the Free Software Foundation. Copy, modification and distribution are authorised, changes/dates must be traced in source files. Any derivative must also be made available under the GPL along with build and install instructions. Lack of compatibility is a known GPL-2.0 issue when a project combines multiple sources and stakeholders.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/GPL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/GPL_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">GNU General Public License version 3</skos:prefLabel> + <skos:prefLabel xml:lang="et">GNU üldine vaba kasutuse litsents versioon 3</skos:prefLabel> + <at:authority-code>GPL_3_0</at:authority-code> + <at:op-code>GPL_3_0</at:op-code> + <at:start.use>2007-06-29</at:start.use> + <atold:op-code>GPL_3_0</atold:op-code> + <dc:identifier>GPL_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="da">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="de">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="el">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="en">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="es">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="et">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="it">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">GPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">GPL-3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.tatanka.com/administrative/licenses/fsf_gpl_3.0_license.html</skos:changeNote> + <skos:definition xml:lang="en">GPL-3.0 is supported by the Free Software Foundation. Under this licence, software can be copied, distributed and modified as long as changes/dates are tracked in source files. Any derivative including (i.e. via compiler) GPL-licenced code must also be made available under the GPL-3.0 along with build and install instructions.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/GPL-3.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/HPND" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Historical Permission Notice and Disclaimer (HPND)</skos:prefLabel> + <at:authority-code>HPND</at:authority-code> + <at:op-code>HPND</at:op-code> + <at:start.use>2002-11-29</at:start.use> + <atold:op-code>HPND</atold:op-code> + <dc:identifier>HPND</dc:identifier> + <skos:altLabel xml:lang="bg">HPND</skos:altLabel> + <skos:altLabel xml:lang="cs">HPND</skos:altLabel> + <skos:altLabel xml:lang="da">HPND</skos:altLabel> + <skos:altLabel xml:lang="de">HPND</skos:altLabel> + <skos:altLabel xml:lang="el">HPND</skos:altLabel> + <skos:altLabel xml:lang="en">HPND</skos:altLabel> + <skos:altLabel xml:lang="es">HPND</skos:altLabel> + <skos:altLabel xml:lang="et">HPND</skos:altLabel> + <skos:altLabel xml:lang="fi">HPND</skos:altLabel> + <skos:altLabel xml:lang="fr">HPND</skos:altLabel> + <skos:altLabel xml:lang="ga">HPND</skos:altLabel> + <skos:altLabel xml:lang="hr">HPND</skos:altLabel> + <skos:altLabel xml:lang="hu">HPND</skos:altLabel> + <skos:altLabel xml:lang="it">HPND</skos:altLabel> + <skos:altLabel xml:lang="lt">HPND</skos:altLabel> + <skos:altLabel xml:lang="lv">HPND</skos:altLabel> + <skos:altLabel xml:lang="mt">HPND</skos:altLabel> + <skos:altLabel xml:lang="nl">HPND</skos:altLabel> + <skos:altLabel xml:lang="pl">HPND</skos:altLabel> + <skos:altLabel xml:lang="pt">HPND</skos:altLabel> + <skos:altLabel xml:lang="ro">HPND</skos:altLabel> + <skos:altLabel xml:lang="sk">HPND</skos:altLabel> + <skos:altLabel xml:lang="sl">HPND</skos:altLabel> + <skos:altLabel xml:lang="sv">HPND</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Historical_Permission_Notice_and_Disclaimer</skos:changeNote> + <skos:definition xml:lang="en">Deprecated by the author, HPND is a template that provides some protection for the author. The work itself is not restricted by the permissive licence.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/HPND"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2015-01-01</at:end.use> + <skos:historyNote xml:lang="en">The source of the deprecation date: https://www.fsf.org/blogs/licensing/historical-permission-notice-and-disclaimer-added-to-license-list</skos:historyNote> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/HROD" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Licence – The Republic of Croatia</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Objavljena hrvatska dozvola (licenca)</skos:prefLabel> + <at:authority-code>HROD</at:authority-code> + <at:op-code>HROD</at:op-code> + <at:start.use>2017-07-01</at:start.use> + <atold:op-code>HROD</atold:op-code> + <dc:identifier>HROD</dc:identifier> + <skos:altLabel xml:lang="bg">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="cs">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="da">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="de">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="el">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="en">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="es">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="et">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="fi">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="fr">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="ga">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="hr">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="hu">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="it">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="lt">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="lv">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="mt">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="nl">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="pl">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="pt">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="ro">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="sk">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="sl">HR-OD</skos:altLabel> + <skos:altLabel xml:lang="sv">HR-OD</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.pristupinfo.hr/objavljena-hrvatska-dozvola-licenca-za-otvorene-podatke/</skos:changeNote> + <skos:definition xml:lang="en">Published by the Republic of Croatia, HR-OD grants the re-user any re-use of the Information subject to the licence, including a spatially and temporally unrestricted, free-of-charge, non-exclusive and personal right to re-use the Information under this licence.</skos:definition> + <skos:exactMatch rdf:resource="http://data.gov.hr/open-licence-republic-croatia"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/IODL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Italian Open Data License v1.0</skos:prefLabel> + <at:authority-code>IODL_1_0</at:authority-code> + <at:op-code>IODL_1_0</at:op-code> + <at:start.use>2010-10-01</at:start.use> + <atold:op-code>IODL_1_0</atold:op-code> + <dc:identifier>IODL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">IODL 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">IODL 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://it.wikipedia.org/wiki/Italian_Open_Data_License</skos:changeNote> + <skos:definition xml:lang="en">Published by Italy, IODL 1.0 aims at providing the Italian public sector with a licence facilitating the re-use of public sector information. Even commercial reuse of data is allowed, as long as credit is given to the author and new creations are licenced under the identical terms. All new works based on the original work will carry the same licence, so any derivatives will also allow commercial use.</skos:definition> + <skos:exactMatch rdf:resource="http://www.formez.it/iodl/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/IODL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Italian Open Data License v2.0</skos:prefLabel> + <at:authority-code>IODL_2_0</at:authority-code> + <at:op-code>IODL_2_0</at:op-code> + <at:start.use>2012-03-02</at:start.use> + <atold:op-code>IODL_2_0</atold:op-code> + <dc:identifier>IODL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">IODL 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">IODL 2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://it.wikipedia.org/wiki/Italian_Open_Data_License</skos:changeNote> + <skos:definition xml:lang="en">Published by Italy, IODL 2.0 aims at providing the Italian public sector with a licence facilitating the re-use of public sector information. It allows distribution and building upon the author’s work, even commercially, as long as credit is given to the author for the original creation.</skos:definition> + <skos:exactMatch rdf:resource="https://www.dati.gov.it/content/italian-open-data-license-v20"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/IPA" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">IPA Font License (IPA)</skos:prefLabel> + <at:authority-code>IPA</at:authority-code> + <at:op-code>IPA</at:op-code> + <at:start.use>2014-09-30</at:start.use> + <atold:op-code>IPA</atold:op-code> + <dc:identifier>IPA</dc:identifier> + <skos:altLabel xml:lang="bg">IPA</skos:altLabel> + <skos:altLabel xml:lang="cs">IPA</skos:altLabel> + <skos:altLabel xml:lang="da">IPA</skos:altLabel> + <skos:altLabel xml:lang="de">IPA</skos:altLabel> + <skos:altLabel xml:lang="el">IPA</skos:altLabel> + <skos:altLabel xml:lang="en">IPA</skos:altLabel> + <skos:altLabel xml:lang="es">IPA</skos:altLabel> + <skos:altLabel xml:lang="et">IPA</skos:altLabel> + <skos:altLabel xml:lang="fi">IPA</skos:altLabel> + <skos:altLabel xml:lang="fr">IPA</skos:altLabel> + <skos:altLabel xml:lang="ga">IPA</skos:altLabel> + <skos:altLabel xml:lang="hr">IPA</skos:altLabel> + <skos:altLabel xml:lang="hu">IPA</skos:altLabel> + <skos:altLabel xml:lang="it">IPA</skos:altLabel> + <skos:altLabel xml:lang="lt">IPA</skos:altLabel> + <skos:altLabel xml:lang="lv">IPA</skos:altLabel> + <skos:altLabel xml:lang="mt">IPA</skos:altLabel> + <skos:altLabel xml:lang="nl">IPA</skos:altLabel> + <skos:altLabel xml:lang="pl">IPA</skos:altLabel> + <skos:altLabel xml:lang="pt">IPA</skos:altLabel> + <skos:altLabel xml:lang="ro">IPA</skos:altLabel> + <skos:altLabel xml:lang="sk">IPA</skos:altLabel> + <skos:altLabel xml:lang="sl">IPA</skos:altLabel> + <skos:altLabel xml:lang="sv">IPA</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.fsf.org/blogs/licensing/ipa-font-license-added-to-license-list</skos:changeNote> + <skos:definition xml:lang="en">The IPA licence applies only to font programs and allows for a great deal of freedom in distributing them, both commercially and non-commercially. The name of redistributed versions of the original software cannot be changed and must include a copy of the license.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/IPA"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/IPL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">IBM Public License Version 1.0 (IPL-1.0)</skos:prefLabel> + <at:authority-code>IPL_1_0</at:authority-code> + <at:op-code>IPL_1_0</at:op-code> + <at:start.use>1999-08-31</at:start.use> + <atold:op-code>IPL_1_0</atold:op-code> + <dc:identifier>IPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">IPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">IPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/IBM_Public_License</skos:changeNote> + <skos:definition xml:lang="en">The IPL-1.0 is the open-source licence IBM uses for some of its software. Supposed to facilitate commercial use of said software, is very clear on the specifics of liability. It also grants explicit patent rights.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/IPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ISA_OML" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">ISA Open Metadata Licence 1.1</skos:prefLabel> + <at:authority-code>ISA_OML</at:authority-code> + <at:op-code>ISA_OML</at:op-code> + <at:start.use>2011-01-01</at:start.use> + <atold:op-code>ISA_OML</atold:op-code> + <dc:identifier>ISA_OML</dc:identifier> + <skos:altLabel xml:lang="bg">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="da">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="de">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="el">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="en">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="en">ISA Open Metadata Licence 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="et">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="it">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">ISA OMdL 1.1</skos:altLabel> + <skos:definition xml:lang="en">The ISA Open metadata licence 1.1 is a permissive open licence created by the European Commission to support the publication of technical and semantic specifications. Users are allowed to distribute, copy, adapt or modify the licenced work for any commercial and non-commercial purpose with only a limited set of conditions.</skos:definition> + <skos:exactMatch rdf:resource="https://joinup.ec.europa.eu/licence/isa-open-metadata-licence-v11"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2012-04-19</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ISA_OML_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">ISA Open Metadata Licence 1.1</skos:prefLabel> + <at:authority-code>ISA_OML_1_1</at:authority-code> + <at:op-code>ISA_OML_1_1</at:op-code> + <at:start.use>2012-04-18</at:start.use> + <atold:op-code>ISA_OML_1_1</atold:op-code> + <dc:identifier>ISA_OML_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="da">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="de">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="el">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="en">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="es">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="et">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="it">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">ISA OMdL 1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">ISA OMdL 1.1</skos:altLabel> + <skos:definition xml:lang="en">The ISA Open metadata licence 1.1 is a permissive open licence created by the European Commission to support the publication of technical and semantic specifications. Users are allowed to distribute, copy, adapt or modify the licenced work for any commercial and non-commercial purpose with only a limited set of conditions.</skos:definition> + <skos:exactMatch rdf:resource="https://joinup.ec.europa.eu/licence/isa-open-metadata-licence-v11"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ISC" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">ISC License (ISC)</skos:prefLabel> + <at:authority-code>ISC</at:authority-code> + <at:op-code>ISC</at:op-code> + <at:start.use>1995-06-30</at:start.use> + <atold:op-code>ISC</atold:op-code> + <dc:identifier>ISC</dc:identifier> + <skos:altLabel xml:lang="bg">ISC</skos:altLabel> + <skos:altLabel xml:lang="cs">ISC</skos:altLabel> + <skos:altLabel xml:lang="da">ISC</skos:altLabel> + <skos:altLabel xml:lang="de">ISC</skos:altLabel> + <skos:altLabel xml:lang="el">ISC</skos:altLabel> + <skos:altLabel xml:lang="en">ISC</skos:altLabel> + <skos:altLabel xml:lang="es">ISC</skos:altLabel> + <skos:altLabel xml:lang="et">ISC</skos:altLabel> + <skos:altLabel xml:lang="fi">ISC</skos:altLabel> + <skos:altLabel xml:lang="fr">ISC</skos:altLabel> + <skos:altLabel xml:lang="ga">ISC</skos:altLabel> + <skos:altLabel xml:lang="hr">ISC</skos:altLabel> + <skos:altLabel xml:lang="hu">ISC</skos:altLabel> + <skos:altLabel xml:lang="it">ISC</skos:altLabel> + <skos:altLabel xml:lang="lt">ISC</skos:altLabel> + <skos:altLabel xml:lang="lv">ISC</skos:altLabel> + <skos:altLabel xml:lang="mt">ISC</skos:altLabel> + <skos:altLabel xml:lang="nl">ISC</skos:altLabel> + <skos:altLabel xml:lang="pl">ISC</skos:altLabel> + <skos:altLabel xml:lang="pt">ISC</skos:altLabel> + <skos:altLabel xml:lang="ro">ISC</skos:altLabel> + <skos:altLabel xml:lang="sk">ISC</skos:altLabel> + <skos:altLabel xml:lang="sl">ISC</skos:altLabel> + <skos:altLabel xml:lang="sv">ISC</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/isc/?_list_filters=q%3Disc; https://en.wikipedia.org/wiki/ISC_license</skos:changeNote> + <skos:definition xml:lang="en">ISC is a short and permissive software permissive licence (like MIT and BSD). Main obligation is to include the original copyright notice. For reducing licence proliferation, it is advised to use the MIT licence instead.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/ISC"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LGPL_2_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">GNU Lesser General Public License version 2.1</skos:prefLabel> + <at:authority-code>LGPL_2_1</at:authority-code> + <at:op-code>LGPL_2_1</at:op-code> + <at:start.use>1999-02-15</at:start.use> + <atold:op-code>LGPL_2_1</atold:op-code> + <dc:identifier>LGPL_2_1</dc:identifier> + <skos:altLabel xml:lang="bg">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="cs">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="da">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="de">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="el">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="en">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="es">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="et">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fi">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fr">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ga">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hr">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hu">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="it">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lt">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lv">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="mt">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="nl">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pl">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pt">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ro">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sk">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sl">LGPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sv">LGPL-2.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/LGPL-2.1</skos:changeNote> + <skos:definition xml:lang="en">LGPL 2.1 is supported by the Free Software Foundation for libraries. Works made by using the covered software could be distributed under any licence. Distribution of derivatives (code modifications) must be done under LGPL. Reverse engineering must be allowed.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LGPL-2.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LGPL_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">GNU Lesser General Public License version 3</skos:prefLabel> + <at:authority-code>LGPL_3_0</at:authority-code> + <at:op-code>LGPL_3_0</at:op-code> + <at:start.use>2007-06-29</at:start.use> + <atold:op-code>LGPL_3_0</atold:op-code> + <dc:identifier>LGPL_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="da">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="de">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="el">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="en">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="es">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="et">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="it">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">LGPL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">LGPL-3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/LGPL-3.0</skos:changeNote> + <skos:definition xml:lang="en">LGPL-3.0 was produced by the Free Software Foundation for libraries. Works made by using the covered software could be distributed under any licence. Distribution of derivatives (code modifications) must be done under LGPL. Reverse engineering must be allowed.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LGPL-3.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LILIQ_P_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Québec Free and Open-Source Licence – Permissive (LiLiQ-P) version 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence Libre du Québec – Permissive (LiLiQ-P) version 1.1</skos:prefLabel> + <at:authority-code>LILIQ_P_1_1</at:authority-code> + <at:op-code>LILIQ_P_1_1</at:op-code> + <at:start.use>2016-01-31</at:start.use> + <atold:op-code>LILIQ_P_1_1</atold:op-code> + <dc:identifier>LILIQ_P_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">LiLiQ-P-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">LiLiQ-P-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://forge.gouv.qc.ca/licence/</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, LiLiQ-P-1.1 is a permissive licence produced by the State of Quebec (Canada).</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LiLiQ-P-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LILIQ_RPLUS_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Québec Free and Open-Source Licence – Strong Reciprocity (LiLiQ-R+) version 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence Libre du Québec – Réciprocité forte (LiLiQ-R+) version 1.1</skos:prefLabel> + <at:authority-code>LILIQ_RPLUS_1_1</at:authority-code> + <at:op-code>LILIQ_RPLUS_1_1</at:op-code> + <at:start.use>2016-01-31</at:start.use> + <atold:op-code>LILIQ_RPLUS_1_1</atold:op-code> + <dc:identifier>LILIQ_RPLUS_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">LiLiQ-Rplus-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://forge.gouv.qc.ca/licence/</skos:changeNote> + <skos:definition xml:lang="en">LiLiQ-Rplus-1.1 is a reciprocate (copyleft) licence produced by the State of Quebec (Canada). Other reciprocal licences GPL-2.0-or-later and the EUPL are expressly listed as compatible, meaning that the covered code can be reused in other projects covered by these licences. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LiLiQ-Rplus-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LILIQ_R_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Québec Free and Open-Source Licence – Reciprocity (LiLiQ-R) version 1.1</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Licence Libre du Québec – Réciprocité (LiLiQ-R) version 1.1</skos:prefLabel> + <at:authority-code>LILIQ_R_1_1</at:authority-code> + <at:op-code>LILIQ_R_1_1</at:op-code> + <at:start.use>2016-01-31</at:start.use> + <atold:op-code>LILIQ_R_1_1</atold:op-code> + <dc:identifier>LILIQ_R_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">LiLiQ-R-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">LiLiQ-R-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://forge.gouv.qc.ca/licence/</skos:changeNote> + <skos:definition xml:lang="en">LiLiQ-R 1.1 is a moderately reciprocate licence produced by the State of Quebec (Canada). A list of liences with similar level of reciprocity is declared compatible, including GPL, EUPL, MPL, LGPL etc., meaning that the covered code can be reused in other projects covered by these licences. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LiLiQ-R-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LPL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Lucent Public License, Plan 9, version 1.0 (LPL-1.0)</skos:prefLabel> + <at:authority-code>LPL_1_0</at:authority-code> + <at:op-code>LPL_1_0</at:op-code> + <at:start.use>2003-01-01</at:start.use> + <atold:op-code>LPL_1_0</atold:op-code> + <dc:identifier>LPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">LPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">LPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/lucent-pl-1.0/?_list_filters=q%3Dlucent</skos:changeNote> + <skos:definition xml:lang="en">LPL-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. It is superseded by LPL-1.02.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2003-06-30</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LPL_1_02" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Lucent Public License Version 1.02 (LPL-1.02)</skos:prefLabel> + <at:authority-code>LPL_1_02</at:authority-code> + <at:op-code>LPL_1_02</at:op-code> + <at:start.use>2003-07-01</at:start.use> + <atold:op-code>LPL_1_02</atold:op-code> + <dc:identifier>LPL_1_02</dc:identifier> + <skos:altLabel xml:lang="bg">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="cs">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="da">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="de">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="el">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="en">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="es">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="et">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="fi">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="fr">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="ga">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="hr">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="hu">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="it">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="lt">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="lv">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="mt">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="nl">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="pl">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="pt">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="ro">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="sk">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="sl">LPL-1.02</skos:altLabel> + <skos:altLabel xml:lang="sv">LPL-1.02</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/lucent-pl-1.02/?_list_filters=q%3Dlucent</skos:changeNote> + <skos:definition xml:lang="en">LPL-1.02 is a copyleft-style, free software licence approved by the Open Source Initiative. Similar to the Common Public License, this licence makes liability rules very clear.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LPL-1.02"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/LPPL_1_3C" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">LaTeX Project Public License v1.3c (LPPL-1.3c)</skos:prefLabel> + <at:authority-code>LPPL_1_3C</at:authority-code> + <at:op-code>LPPL_1_3C</at:op-code> + <at:start.use>2008-05-04</at:start.use> + <atold:op-code>LPPL_1_3C</atold:op-code> + <dc:identifier>LPPL_1_3C</dc:identifier> + <skos:altLabel xml:lang="bg">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="cs">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="da">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="de">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="el">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="en">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="es">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="et">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="fi">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="fr">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="ga">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="hr">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="hu">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="it">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="lt">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="lv">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="mt">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="nl">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="pl">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="pt">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="ro">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="sk">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="sl">LPPL-1.3c</skos:altLabel> + <skos:altLabel xml:lang="sv">LPPL-1.3c</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/LaTeX_Project_Public_License</skos:changeNote> + <skos:definition xml:lang="en">LPPL-1.3c is a very specific, non-copyleft licence. It organises rights of the ”maintainer” of a work V/S other distributors who have to comply with documentation requirements and to communicate the original code (or report where it can be available).</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/LPPL-1.3c"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MIROS" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">MirOS License (MirOS)</skos:prefLabel> + <at:authority-code>MIROS</at:authority-code> + <at:op-code>MIROS</at:op-code> + <at:start.use>2006-12-11</at:start.use> + <atold:op-code>MIROS</atold:op-code> + <dc:identifier>MIROS</dc:identifier> + <skos:altLabel xml:lang="bg">MirOS</skos:altLabel> + <skos:altLabel xml:lang="cs">MirOS</skos:altLabel> + <skos:altLabel xml:lang="da">MirOS</skos:altLabel> + <skos:altLabel xml:lang="de">MirOS</skos:altLabel> + <skos:altLabel xml:lang="el">MirOS</skos:altLabel> + <skos:altLabel xml:lang="en">MirOS</skos:altLabel> + <skos:altLabel xml:lang="es">MirOS</skos:altLabel> + <skos:altLabel xml:lang="et">MirOS</skos:altLabel> + <skos:altLabel xml:lang="fi">MirOS</skos:altLabel> + <skos:altLabel xml:lang="fr">MirOS</skos:altLabel> + <skos:altLabel xml:lang="ga">MirOS</skos:altLabel> + <skos:altLabel xml:lang="hr">MirOS</skos:altLabel> + <skos:altLabel xml:lang="hu">MirOS</skos:altLabel> + <skos:altLabel xml:lang="it">MirOS</skos:altLabel> + <skos:altLabel xml:lang="lt">MirOS</skos:altLabel> + <skos:altLabel xml:lang="lv">MirOS</skos:altLabel> + <skos:altLabel xml:lang="mt">MirOS</skos:altLabel> + <skos:altLabel xml:lang="nl">MirOS</skos:altLabel> + <skos:altLabel xml:lang="pl">MirOS</skos:altLabel> + <skos:altLabel xml:lang="pt">MirOS</skos:altLabel> + <skos:altLabel xml:lang="ro">MirOS</skos:altLabel> + <skos:altLabel xml:lang="sk">MirOS</skos:altLabel> + <skos:altLabel xml:lang="sl">MirOS</skos:altLabel> + <skos:altLabel xml:lang="sv">MirOS</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/MirOS_Licence</skos:changeNote> + <skos:definition xml:lang="en">MirOS is a BSD-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MS-RL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MIT" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The MIT License</skos:prefLabel> + <skos:prefLabel xml:lang="et">MIT litsents</skos:prefLabel> + <at:authority-code>MIT</at:authority-code> + <at:op-code>MIT</at:op-code> + <at:start.use>1988-08-14</at:start.use> + <atold:op-code>MIT</atold:op-code> + <dc:identifier>MIT</dc:identifier> + <skos:altLabel xml:lang="bg">MIT</skos:altLabel> + <skos:altLabel xml:lang="cs">MIT</skos:altLabel> + <skos:altLabel xml:lang="da">MIT</skos:altLabel> + <skos:altLabel xml:lang="de">MIT</skos:altLabel> + <skos:altLabel xml:lang="el">MIT</skos:altLabel> + <skos:altLabel xml:lang="en">MIT</skos:altLabel> + <skos:altLabel xml:lang="es">MIT</skos:altLabel> + <skos:altLabel xml:lang="et">MIT</skos:altLabel> + <skos:altLabel xml:lang="fi">MIT</skos:altLabel> + <skos:altLabel xml:lang="fr">MIT</skos:altLabel> + <skos:altLabel xml:lang="ga">MIT</skos:altLabel> + <skos:altLabel xml:lang="hr">MIT</skos:altLabel> + <skos:altLabel xml:lang="hu">MIT</skos:altLabel> + <skos:altLabel xml:lang="it">MIT</skos:altLabel> + <skos:altLabel xml:lang="lt">MIT</skos:altLabel> + <skos:altLabel xml:lang="lv">MIT</skos:altLabel> + <skos:altLabel xml:lang="mt">MIT</skos:altLabel> + <skos:altLabel xml:lang="nl">MIT</skos:altLabel> + <skos:altLabel xml:lang="pl">MIT</skos:altLabel> + <skos:altLabel xml:lang="pt">MIT</skos:altLabel> + <skos:altLabel xml:lang="ro">MIT</skos:altLabel> + <skos:altLabel xml:lang="sk">MIT</skos:altLabel> + <skos:altLabel xml:lang="sl">MIT</skos:altLabel> + <skos:altLabel xml:lang="sv">MIT</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.com/article/19/4/history-mit-license; https://webcache.googleusercontent.com/search?q=cache:GAPzrOqxGoMJ:https://libexpat.github.io/doc/news/+&cd=3&hl=en&ct=clnk&gl=lu</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, MIT is the most recommended permissive licence: short and very popular. Everything is allowed as long as the original copyright and licence notice is included in any copy of the software/source.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MIT"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MOTOSOTO" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Motosoto Open Source License – Version 0.9.1 (Motosoto)</skos:prefLabel> + <at:authority-code>MOTOSOTO</at:authority-code> + <at:op-code>MOTOSOTO</at:op-code> + <at:start.use>1995-01-01</at:start.use> + <atold:op-code>MOTOSOTO</atold:op-code> + <dc:identifier>MOTOSOTO</dc:identifier> + <skos:altLabel xml:lang="bg">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="cs">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="da">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="de">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="el">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="en">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="es">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="et">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="fi">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="fr">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="ga">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="hr">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="hu">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="it">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="lt">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="lv">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="mt">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="nl">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="pl">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="pt">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="ro">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="sk">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="sl">Motosoto</skos:altLabel> + <skos:altLabel xml:lang="sv">Motosoto</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://www.worldlii.org/int/other/PubRL/1995/8.html</skos:changeNote> + <skos:definition xml:lang="en">Motosoto is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Motosoto"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MPL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">The Mozilla Public License (MPL), version 1.0 (MPL-1.0)</skos:prefLabel> + <at:authority-code>MPL_1_0</at:authority-code> + <at:op-code>MPL_1_0</at:op-code> + <at:start.use>1998-01-01</at:start.use> + <atold:op-code>MPL_1_0</atold:op-code> + <dc:identifier>MPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">MPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">MPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Mozilla_Public_License</skos:changeNote> + <skos:definition xml:lang="en">MPL-1.0 is a weak copyleft licence, characterised as a middle ground between permissive free software licences and the GNU General Public License that seeks to balance the concerns of proprietary and open source developers. As such, it allows re-licencing. It is approved by the Open Source Initiative. It has been superseded by v2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2012-01-02</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MPL_1_1" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Mozilla Public License (MPL), version 1.1 (MPL-1.1)</skos:prefLabel> + <at:authority-code>MPL_1_1</at:authority-code> + <at:op-code>MPL_1_1</at:op-code> + <at:start.use>1999-01-01</at:start.use> + <atold:op-code>MPL_1_1</atold:op-code> + <dc:identifier>MPL_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">MPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">MPL-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikisource.org/wiki/Mozilla_Public_License</skos:changeNote> + <skos:definition xml:lang="en">MPL-1.1 is a weak copyleft licence, characterised as a middle ground between permissive free software licences and the GNU General Public License that seeks to balance the concerns of proprietary and open source developers. As such, it allows re-licencing. It is approved by the Open Source Initiative. It has been superseded by v2.0.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MPL-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2012-01-02</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MPL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Mozilla Public License (MPL), version 2.0 (MPL-2.0)</skos:prefLabel> + <at:authority-code>MPL_2_0</at:authority-code> + <at:op-code>MPL_2_0</at:op-code> + <at:start.use>2012-01-03</at:start.use> + <atold:op-code>MPL_2_0</atold:op-code> + <dc:identifier>MPL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">MPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">MPL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Mozilla_Public_License#cite_note-17</skos:changeNote> + <skos:definition xml:lang="en">MPL-2.0 is a weak copyleft licence, characterised as a middle ground between permissive free software licences and the GNU General Public License that seeks to balance the concerns of proprietary and open source developers. As such, it allows re-licencing. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MPL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MS_PL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Microsoft Public License (MS-PL)</skos:prefLabel> + <at:authority-code>MS_PL</at:authority-code> + <at:op-code>MS_PL</at:op-code> + <at:start.use>2007-10-12</at:start.use> + <atold:op-code>MS_PL</atold:op-code> + <dc:identifier>MS_PL</dc:identifier> + <skos:altLabel xml:lang="bg">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="cs">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="da">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="de">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="el">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="en">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="es">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="et">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="fi">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="fr">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="ga">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="hr">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="hu">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="it">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="lt">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="lv">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="mt">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="nl">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="pl">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="pt">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="ro">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="sk">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="sl">MS-PL</skos:altLabel> + <skos:altLabel xml:lang="sv">MS-PL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Shared_Source_Initiative#Microsoft_Public_License_(Ms-PL)</skos:changeNote> + <skos:definition xml:lang="en">MS-PL is a BSD-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MS-PL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MS_RL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Microsoft Reciprocal License (MS-RL)</skos:prefLabel> + <at:authority-code>MS_RL</at:authority-code> + <at:op-code>MS_RL</at:op-code> + <at:start.use>2007-08-10</at:start.use> + <atold:op-code>MS_RL</atold:op-code> + <dc:identifier>MS_RL</dc:identifier> + <skos:altLabel xml:lang="bg">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="cs">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="da">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="de">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="el">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="en">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="es">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="et">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="fi">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="fr">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="ga">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="hr">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="hu">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="it">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="lt">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="lv">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="mt">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="nl">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="pl">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="pt">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="ro">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="sk">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="sl">MS-RL</skos:altLabel> + <skos:altLabel xml:lang="sv">MS-RL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://de.wikipedia.org/wiki/Microsoft_Reciprocal_License</skos:changeNote> + <skos:definition xml:lang="en">MS-RL is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/MS-RL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/MULTICS" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Multics License (Multics)</skos:prefLabel> + <at:authority-code>MULTICS</at:authority-code> + <at:op-code>MULTICS</at:op-code> + <at:start.use>2006-07-01</at:start.use> + <atold:op-code>MULTICS</atold:op-code> + <dc:identifier>MULTICS</dc:identifier> + <skos:altLabel xml:lang="bg">Multics</skos:altLabel> + <skos:altLabel xml:lang="cs">Multics</skos:altLabel> + <skos:altLabel xml:lang="da">Multics</skos:altLabel> + <skos:altLabel xml:lang="de">Multics</skos:altLabel> + <skos:altLabel xml:lang="el">Multics</skos:altLabel> + <skos:altLabel xml:lang="en">Multics</skos:altLabel> + <skos:altLabel xml:lang="es">Multics</skos:altLabel> + <skos:altLabel xml:lang="et">Multics</skos:altLabel> + <skos:altLabel xml:lang="fi">Multics</skos:altLabel> + <skos:altLabel xml:lang="fr">Multics</skos:altLabel> + <skos:altLabel xml:lang="ga">Multics</skos:altLabel> + <skos:altLabel xml:lang="hr">Multics</skos:altLabel> + <skos:altLabel xml:lang="hu">Multics</skos:altLabel> + <skos:altLabel xml:lang="it">Multics</skos:altLabel> + <skos:altLabel xml:lang="lt">Multics</skos:altLabel> + <skos:altLabel xml:lang="lv">Multics</skos:altLabel> + <skos:altLabel xml:lang="mt">Multics</skos:altLabel> + <skos:altLabel xml:lang="nl">Multics</skos:altLabel> + <skos:altLabel xml:lang="pl">Multics</skos:altLabel> + <skos:altLabel xml:lang="pt">Multics</skos:altLabel> + <skos:altLabel xml:lang="ro">Multics</skos:altLabel> + <skos:altLabel xml:lang="sk">Multics</skos:altLabel> + <skos:altLabel xml:lang="sl">Multics</skos:altLabel> + <skos:altLabel xml:lang="sv">Multics</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/multics/?_list_filters=q%3Dmultics</skos:changeNote> + <skos:definition xml:lang="en">Multics is a permissive free software licence approved by the Open Source Initiative. The legal text of this licence is only a paragraph long and both protects the authors' trademarks and requires users to include this licence.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Multics"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NASA_1_3" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">NASA Open Source Agreement v1.3 (NASA-1.3)</skos:prefLabel> + <at:authority-code>NASA_1_3</at:authority-code> + <at:op-code>NASA_1_3</at:op-code> + <at:start.use>2012-01-01</at:start.use> + <atold:op-code>NASA_1_3</atold:op-code> + <dc:identifier>NASA_1_3</dc:identifier> + <skos:altLabel xml:lang="bg">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="cs">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="da">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="de">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="el">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="en">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="es">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="et">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="fi">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="fr">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="ga">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="hr">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="hu">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="it">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="lt">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="lv">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="mt">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="nl">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="pl">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="pt">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="ro">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="sk">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="sl">NASA-1.3</skos:altLabel> + <skos:altLabel xml:lang="sv">NASA-1.3</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/NASA_Open_Source_Agreement; http://openvsp.org/learn.shtml</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, NASA-1.3 is a licence used by NASA containing an obligation to register with the government when receiving the software and to tell a specified agency how the modifications are used.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/NASA-1.3"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NAUMEN" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">NAUMEN Public License (Naumen)</skos:prefLabel> + <at:authority-code>NAUMEN</at:authority-code> + <at:op-code>NAUMEN</at:op-code> + <at:start.use>2001-12-01</at:start.use> + <atold:op-code>NAUMEN</atold:op-code> + <dc:identifier>NAUMEN</dc:identifier> + <skos:altLabel xml:lang="bg">Naumen</skos:altLabel> + <skos:altLabel xml:lang="cs">Naumen</skos:altLabel> + <skos:altLabel xml:lang="da">Naumen</skos:altLabel> + <skos:altLabel xml:lang="de">Naumen</skos:altLabel> + <skos:altLabel xml:lang="el">Naumen</skos:altLabel> + <skos:altLabel xml:lang="en">Naumen</skos:altLabel> + <skos:altLabel xml:lang="es">Naumen</skos:altLabel> + <skos:altLabel xml:lang="et">Naumen</skos:altLabel> + <skos:altLabel xml:lang="fi">Naumen</skos:altLabel> + <skos:altLabel xml:lang="fr">Naumen</skos:altLabel> + <skos:altLabel xml:lang="ga">Naumen</skos:altLabel> + <skos:altLabel xml:lang="hr">Naumen</skos:altLabel> + <skos:altLabel xml:lang="hu">Naumen</skos:altLabel> + <skos:altLabel xml:lang="it">Naumen</skos:altLabel> + <skos:altLabel xml:lang="lt">Naumen</skos:altLabel> + <skos:altLabel xml:lang="lv">Naumen</skos:altLabel> + <skos:altLabel xml:lang="mt">Naumen</skos:altLabel> + <skos:altLabel xml:lang="nl">Naumen</skos:altLabel> + <skos:altLabel xml:lang="pl">Naumen</skos:altLabel> + <skos:altLabel xml:lang="pt">Naumen</skos:altLabel> + <skos:altLabel xml:lang="ro">Naumen</skos:altLabel> + <skos:altLabel xml:lang="sk">Naumen</skos:altLabel> + <skos:altLabel xml:lang="sl">Naumen</skos:altLabel> + <skos:altLabel xml:lang="sv">Naumen</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://ru.wikipedia.org/wiki/Naumen; http://licenseit.ru/wiki/index.php/Naumen_Public_License</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, Naumen is a fairly restrictive free software licence, but provides good protection for the author of the software.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Naumen"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NCSA" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The University of Illinois/NCSA Open Source License (NCSA)</skos:prefLabel> + <at:authority-code>NCSA</at:authority-code> + <at:op-code>NCSA</at:op-code> + <at:start.use>2002-03-28</at:start.use> + <atold:op-code>NCSA</atold:op-code> + <dc:identifier>NCSA</dc:identifier> + <skos:altLabel xml:lang="bg">NCSA</skos:altLabel> + <skos:altLabel xml:lang="cs">NCSA</skos:altLabel> + <skos:altLabel xml:lang="da">NCSA</skos:altLabel> + <skos:altLabel xml:lang="de">NCSA</skos:altLabel> + <skos:altLabel xml:lang="el">NCSA</skos:altLabel> + <skos:altLabel xml:lang="en">NCSA</skos:altLabel> + <skos:altLabel xml:lang="es">NCSA</skos:altLabel> + <skos:altLabel xml:lang="et">NCSA</skos:altLabel> + <skos:altLabel xml:lang="fi">NCSA</skos:altLabel> + <skos:altLabel xml:lang="fr">NCSA</skos:altLabel> + <skos:altLabel xml:lang="ga">NCSA</skos:altLabel> + <skos:altLabel xml:lang="hr">NCSA</skos:altLabel> + <skos:altLabel xml:lang="hu">NCSA</skos:altLabel> + <skos:altLabel xml:lang="it">NCSA</skos:altLabel> + <skos:altLabel xml:lang="lt">NCSA</skos:altLabel> + <skos:altLabel xml:lang="lv">NCSA</skos:altLabel> + <skos:altLabel xml:lang="mt">NCSA</skos:altLabel> + <skos:altLabel xml:lang="nl">NCSA</skos:altLabel> + <skos:altLabel xml:lang="pl">NCSA</skos:altLabel> + <skos:altLabel xml:lang="pt">NCSA</skos:altLabel> + <skos:altLabel xml:lang="ro">NCSA</skos:altLabel> + <skos:altLabel xml:lang="sk">NCSA</skos:altLabel> + <skos:altLabel xml:lang="sl">NCSA</skos:altLabel> + <skos:altLabel xml:lang="sv">NCSA</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/University_of_Illinois/NCSA_Open_Source_License</skos:changeNote> + <skos:definition xml:lang="en">NCSA Open Source License is a BSD-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/NCSA"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NGPL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Nethack General Public License (NGPL)</skos:prefLabel> + <at:authority-code>NGPL</at:authority-code> + <at:op-code>NGPL</at:op-code> + <at:start.use>1989-07-31</at:start.use> + <atold:op-code>NGPL</atold:op-code> + <dc:identifier>NGPL</dc:identifier> + <skos:altLabel xml:lang="bg">NGPL</skos:altLabel> + <skos:altLabel xml:lang="cs">NGPL</skos:altLabel> + <skos:altLabel xml:lang="da">NGPL</skos:altLabel> + <skos:altLabel xml:lang="de">NGPL</skos:altLabel> + <skos:altLabel xml:lang="el">NGPL</skos:altLabel> + <skos:altLabel xml:lang="en">NGPL</skos:altLabel> + <skos:altLabel xml:lang="es">NGPL</skos:altLabel> + <skos:altLabel xml:lang="et">NGPL</skos:altLabel> + <skos:altLabel xml:lang="fi">NGPL</skos:altLabel> + <skos:altLabel xml:lang="fr">NGPL</skos:altLabel> + <skos:altLabel xml:lang="ga">NGPL</skos:altLabel> + <skos:altLabel xml:lang="hr">NGPL</skos:altLabel> + <skos:altLabel xml:lang="hu">NGPL</skos:altLabel> + <skos:altLabel xml:lang="it">NGPL</skos:altLabel> + <skos:altLabel xml:lang="lt">NGPL</skos:altLabel> + <skos:altLabel xml:lang="lv">NGPL</skos:altLabel> + <skos:altLabel xml:lang="mt">NGPL</skos:altLabel> + <skos:altLabel xml:lang="nl">NGPL</skos:altLabel> + <skos:altLabel xml:lang="pl">NGPL</skos:altLabel> + <skos:altLabel xml:lang="pt">NGPL</skos:altLabel> + <skos:altLabel xml:lang="ro">NGPL</skos:altLabel> + <skos:altLabel xml:lang="sk">NGPL</skos:altLabel> + <skos:altLabel xml:lang="sl">NGPL</skos:altLabel> + <skos:altLabel xml:lang="sv">NGPL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/NetHack</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, NGPL is a very old licence used for the game NetHack. It allows users to freely share their modifications, in exchange for several restrictions and little protection for the authors.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/NGPL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NLOD_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Norwegian Licence for Open Government Data 1.0</skos:prefLabel> + <at:authority-code>NLOD_1_0</at:authority-code> + <at:op-code>NLOD_1_0</at:op-code> + <at:start.use>2012-01-01</at:start.use> + <atold:op-code>NLOD_1_0</atold:op-code> + <dc:identifier>NLOD_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">NLOD 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">NLOD 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://github.com/difi/veileder-opnedata/blob/master/build/html/en/_sources/Hvordan-aapne-opp-data/index.txt</skos:changeNote> + <skos:definition xml:lang="en">Published by Norway, NLOD 1.0 grants the user the right to copy, use and distribute information, provided the user acknowledges the contributors and complies with the terms and conditions stipulated in this licence.</skos:definition> + <skos:exactMatch rdf:resource="http://data.norge.no/nlod/en/1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NLOD_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Norwegian Licence for Open Government Data (NLOD) 2.0</skos:prefLabel> + <at:authority-code>NLOD_2_0</at:authority-code> + <at:op-code>NLOD_2_0</at:op-code> + <at:start.use>2016-09-01</at:start.use> + <atold:op-code>NLOD_2_0</atold:op-code> + <dc:identifier>NLOD_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">NLOD 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">NLOD 2.0</skos:altLabel> + <skos:definition xml:lang="en">Published by Norway, NLOD 2.0 grants the user the right to copy, use and distribute information, provided the user acknowledges the contributors and complies with the terms and conditions stipulated in this licence.</skos:definition> + <skos:exactMatch rdf:resource="https://data.norge.no/nlod/en/2.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NOKIA" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Nokia Open Source License Version 1.0a (NOKIA)</skos:prefLabel> + <at:authority-code>NOKIA</at:authority-code> + <at:op-code>NOKIA</at:op-code> + <at:start.use>2006-01-01</at:start.use> + <atold:op-code>NOKIA</atold:op-code> + <dc:identifier>NOKIA</dc:identifier> + <skos:altLabel xml:lang="bg">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="cs">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="da">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="de">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="el">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="en">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="es">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="et">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="fi">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="fr">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="ga">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="hr">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="hu">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="it">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="lt">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="lv">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="mt">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="nl">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="pl">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="pt">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="ro">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="sk">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="sl">NOKIA</skos:altLabel> + <skos:altLabel xml:lang="sv">NOKIA</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://www.kansai-u.ac.jp/riss/rcss/conf/confdocs/3rdRCSS_ueda.pdf; https://opensource.org/minutes20060208</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, NOKIA is a slightly altered variant on the Mozilla Public License specified for Nokia. It requires including a notice in each source file. Disputes must be settled through a Finnish arbitration process.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/NOKIA"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NPOSL_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Non-Profit Open Software License version 3.0 (NPOSL-3.0)</skos:prefLabel> + <at:authority-code>NPOSL_3_0</at:authority-code> + <at:op-code>NPOSL_3_0</at:op-code> + <at:start.use>2007-09-20</at:start.use> + <atold:op-code>NPOSL_3_0</atold:op-code> + <dc:identifier>NPOSL_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="da">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="de">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="el">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="en">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="es">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="et">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="it">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">NPOSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">NPOSL-3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://lists.debian.org/debian-legal/2008/04/msg00055.html; https://trustee.ietf.org/licenses.html</skos:changeNote> + <skos:definition xml:lang="en">A variant of the Open Software License 3.0, NPOSL-3.0 requires that the organisation using it is a non-profit and that no revenue is generated from sale of the software, support or services. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/NPOSL-3.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/NTP" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">NTP License (NTP)</skos:prefLabel> + <at:authority-code>NTP</at:authority-code> + <at:op-code>NTP</at:op-code> + <at:start.use>2008-08-01</at:start.use> + <atold:op-code>NTP</atold:op-code> + <dc:identifier>NTP</dc:identifier> + <skos:altLabel xml:lang="bg">NTP</skos:altLabel> + <skos:altLabel xml:lang="cs">NTP</skos:altLabel> + <skos:altLabel xml:lang="da">NTP</skos:altLabel> + <skos:altLabel xml:lang="de">NTP</skos:altLabel> + <skos:altLabel xml:lang="el">NTP</skos:altLabel> + <skos:altLabel xml:lang="en">NTP</skos:altLabel> + <skos:altLabel xml:lang="es">NTP</skos:altLabel> + <skos:altLabel xml:lang="et">NTP</skos:altLabel> + <skos:altLabel xml:lang="fi">NTP</skos:altLabel> + <skos:altLabel xml:lang="fr">NTP</skos:altLabel> + <skos:altLabel xml:lang="ga">NTP</skos:altLabel> + <skos:altLabel xml:lang="hr">NTP</skos:altLabel> + <skos:altLabel xml:lang="hu">NTP</skos:altLabel> + <skos:altLabel xml:lang="it">NTP</skos:altLabel> + <skos:altLabel xml:lang="lt">NTP</skos:altLabel> + <skos:altLabel xml:lang="lv">NTP</skos:altLabel> + <skos:altLabel xml:lang="mt">NTP</skos:altLabel> + <skos:altLabel xml:lang="nl">NTP</skos:altLabel> + <skos:altLabel xml:lang="pl">NTP</skos:altLabel> + <skos:altLabel xml:lang="pt">NTP</skos:altLabel> + <skos:altLabel xml:lang="ro">NTP</skos:altLabel> + <skos:altLabel xml:lang="sk">NTP</skos:altLabel> + <skos:altLabel xml:lang="sl">NTP</skos:altLabel> + <skos:altLabel xml:lang="sv">NTP</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://lists.opensource.org/pipermail/license-review_lists.opensource.org/2008-March/000099.html; https://opensource.org/node/1015</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, NTP is a simple licence, written as a template, that provides protection for the author while giving users full rights to the software.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/NTP"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OCLC_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The OCLC Research Public License 2.0 License (OCLC-2.0)</skos:prefLabel> + <at:authority-code>OCLC_2_0</at:authority-code> + <at:op-code>OCLC_2_0</at:op-code> + <at:start.use>2002-05-31</at:start.use> + <atold:op-code>OCLC_2_0</atold:op-code> + <dc:identifier>OCLC_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OCLC-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OCLC-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/OCLC-2.0</skos:changeNote> + <skos:definition xml:lang="en">While OCLC Research now uses the Apache 2.0 licence, OCLC-2.0 is a relatively strong copyleft licence with fairly lenient restrictions and built-in protection for the author. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OCLC-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ODC_BL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Data Commons Open Database License v1.0</skos:prefLabel> + <at:authority-code>ODC_BL</at:authority-code> + <at:op-code>ODC_BL</at:op-code> + <at:start.use>2009-01-01</at:start.use> + <atold:op-code>ODC_BL</atold:op-code> + <dc:identifier>ODC_BL</dc:identifier> + <skos:altLabel xml:lang="bg">ODbL</skos:altLabel> + <skos:altLabel xml:lang="cs">ODbL</skos:altLabel> + <skos:altLabel xml:lang="da">ODbL</skos:altLabel> + <skos:altLabel xml:lang="de">ODbL</skos:altLabel> + <skos:altLabel xml:lang="el">ODbL</skos:altLabel> + <skos:altLabel xml:lang="en">ODbL</skos:altLabel> + <skos:altLabel xml:lang="es">ODbL</skos:altLabel> + <skos:altLabel xml:lang="et">ODbL</skos:altLabel> + <skos:altLabel xml:lang="fi">ODbL</skos:altLabel> + <skos:altLabel xml:lang="fr">ODbL</skos:altLabel> + <skos:altLabel xml:lang="ga">ODbL</skos:altLabel> + <skos:altLabel xml:lang="hr">ODbL</skos:altLabel> + <skos:altLabel xml:lang="hu">ODbL</skos:altLabel> + <skos:altLabel xml:lang="it">ODbL</skos:altLabel> + <skos:altLabel xml:lang="lt">ODbL</skos:altLabel> + <skos:altLabel xml:lang="lv">ODbL</skos:altLabel> + <skos:altLabel xml:lang="mt">ODbL</skos:altLabel> + <skos:altLabel xml:lang="nl">ODbL</skos:altLabel> + <skos:altLabel xml:lang="pl">ODbL</skos:altLabel> + <skos:altLabel xml:lang="pt">ODbL</skos:altLabel> + <skos:altLabel xml:lang="ro">ODbL</skos:altLabel> + <skos:altLabel xml:lang="sk">ODbL</skos:altLabel> + <skos:altLabel xml:lang="sl">ODbL</skos:altLabel> + <skos:altLabel xml:lang="sv">ODbL</skos:altLabel> + <skos:definition xml:lang="en">ODbL is a licence agreement intended to allow users to freely share, modify, and use the database concerned while maintaining this same freedom for others. Some jurisdictions, mainly in the European Union, have specific rights that cover databases, and so this licence addresses these rights, too. This licence is also an agreement in contract for users of this database to act in certain ways in return for accessing the database concerned.</skos:definition> + <skos:definition xml:lang="fr">ODbL est un contrat de licence ayant pour objet d’autoriser les utilisateurs à partager, modifier et utiliser librement la base de données initiale tout en maintenant ces mêmes libertés pour les autres. De nombreuses bases de données étant protégées par des droits d’auteur, les présentes règles ont pour objet de céder ces droits. Certains États, principalement au sein de l’Union européenne, prévoient des droits spécifiques régissant les bases de données, de ce fait ces droits sont également concernés par cette licence. Cette licence est aussi un contrat en ce que les utilisateurs de la base de données initiale s’engagent à respecter certaines obligations en contrepartie de l’autorisation d’accéder à ladite base de données initiale.</skos:definition> + <skos:exactMatch rdf:resource="http://opendatacommons.org/licenses/odbl/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ODC_BY" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Data Commons Attribution License v1.0</skos:prefLabel> + <at:authority-code>ODC_BY</at:authority-code> + <at:op-code>ODC_BY</at:op-code> + <at:start.use>2010-10-24</at:start.use> + <atold:op-code>ODC_BY</atold:op-code> + <dc:identifier>ODC_BY</dc:identifier> + <skos:altLabel xml:lang="bg">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">ODC-By-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">ODC-By-1.0</skos:altLabel> + <skos:definition xml:lang="en">ODC-By-1.0 is a licence agreement intended to allow users to freely share, modify, and use the database concerned subject only to the attribution requirements set out in Section 4 (notices, no sublicensing). Databases can contain a wide variety of types of content, and so this licence only governs the rights over the database, and not the contents of the database individually.</skos:definition> + <skos:exactMatch rdf:resource="http://opendatacommons.org/licenses/by/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ODC_PDDL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Data Commons Public Domain Dedication and License 1.0</skos:prefLabel> + <at:authority-code>ODC_PDDL</at:authority-code> + <at:op-code>ODC_PDDL</at:op-code> + <at:start.use>2008-03-01</at:start.use> + <atold:op-code>ODC_PDDL</atold:op-code> + <dc:identifier>ODC_PDDL</dc:identifier> + <skos:altLabel xml:lang="bg">PDDL</skos:altLabel> + <skos:altLabel xml:lang="cs">PDDL</skos:altLabel> + <skos:altLabel xml:lang="da">PDDL</skos:altLabel> + <skos:altLabel xml:lang="de">PDDL</skos:altLabel> + <skos:altLabel xml:lang="el">PDDL</skos:altLabel> + <skos:altLabel xml:lang="en">PDDL</skos:altLabel> + <skos:altLabel xml:lang="es">PDDL</skos:altLabel> + <skos:altLabel xml:lang="et">PDDL</skos:altLabel> + <skos:altLabel xml:lang="fi">PDDL</skos:altLabel> + <skos:altLabel xml:lang="fr">PDDL</skos:altLabel> + <skos:altLabel xml:lang="ga">PDDL</skos:altLabel> + <skos:altLabel xml:lang="hr">PDDL</skos:altLabel> + <skos:altLabel xml:lang="hu">PDDL</skos:altLabel> + <skos:altLabel xml:lang="it">PDDL</skos:altLabel> + <skos:altLabel xml:lang="lt">PDDL</skos:altLabel> + <skos:altLabel xml:lang="lv">PDDL</skos:altLabel> + <skos:altLabel xml:lang="mt">PDDL</skos:altLabel> + <skos:altLabel xml:lang="nl">PDDL</skos:altLabel> + <skos:altLabel xml:lang="pl">PDDL</skos:altLabel> + <skos:altLabel xml:lang="pt">PDDL</skos:altLabel> + <skos:altLabel xml:lang="ro">PDDL</skos:altLabel> + <skos:altLabel xml:lang="sk">PDDL</skos:altLabel> + <skos:altLabel xml:lang="sl">PDDL</skos:altLabel> + <skos:altLabel xml:lang="sv">PDDL</skos:altLabel> + <skos:changeNote xml:lang="en">https://www.geeklawblog.com/2010/10/creative-commons-releases-public-domain.html</skos:changeNote> + <skos:definition xml:lang="en">ODC PDDL is a document intended to allow the user to freely share, modify, and use this work for any purpose and without any restrictions. It is intended for use on databases or their contents (“data”), either together or individually.</skos:definition> + <skos:exactMatch rdf:resource="http://opendatacommons.org/licenses/pddl/1.0/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OFL_1_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">SIL Open Font License (OFL-1.1)</skos:prefLabel> + <at:authority-code>OFL_1_1</at:authority-code> + <at:op-code>OFL_1_1</at:op-code> + <at:start.use>2007-02-26</at:start.use> + <atold:op-code>OFL_1_1</atold:op-code> + <dc:identifier>OFL_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">OFL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">OFL-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL</skos:changeNote> + <skos:definition xml:lang="en">The SIL Open Font License 1.1 is one of the major open font licences, which allows embedding of the font in commercially sold products. It is a free and open source licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OFL-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OGL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Government Licence 1.0</skos:prefLabel> + <at:authority-code>OGL_1_0</at:authority-code> + <at:op-code>OGL_1_0</at:op-code> + <at:start.use>2010-09-01</at:start.use> + <atold:op-code>OGL_1_0</atold:op-code> + <dc:identifier>OGL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OGL 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OGL 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Open_Government_Licence</skos:changeNote> + <skos:definition xml:lang="en">Developed and maintained by the National Archives, OGL-1.0 is a copyright licence for Crown Copyright works published by the UK government consisting of a simple set of terms and conditions facilitating the re-use of a wide range of public sector information free of charge. The OGL terms are compatible with the latest versions of the Creative Commons Attribution Licence and the Open Data Commons Attribution Licence. The OGL is a perpetual licence so any past and continuing use of information authorised under v1.0 or v2.0 may continue.</skos:definition> + <skos:exactMatch rdf:resource="http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OGL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Government Licence 2.0</skos:prefLabel> + <at:authority-code>OGL_2_0</at:authority-code> + <at:op-code>OGL_2_0</at:op-code> + <at:start.use>2013-06-28</at:start.use> + <atold:op-code>OGL_2_0</atold:op-code> + <dc:identifier>OGL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="da">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="de">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="el">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="en">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="es">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="et">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="it">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OGL 2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OGL 2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Open_Government_Licence</skos:changeNote> + <skos:definition xml:lang="en">Developed and maintained by the National Archives, OGL-2.0 is a copyright licence for Crown Copyright works published by the UK government consisting of a simple set of terms and conditions facilitating the re-use of a wide range of public sector information free of charge. The OGL terms are compatible with the latest versions of the Creative Commons Attribution Licence and the Open Data Commons Attribution Licence. The OGL is a perpetual licence so any past and continuing use of information authorised under v1.0 or v2.0 may continue.</skos:definition> + <skos:exactMatch rdf:resource="http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OGL_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Government Licence 3.0</skos:prefLabel> + <at:authority-code>OGL_3_0</at:authority-code> + <at:op-code>OGL_3_0</at:op-code> + <at:start.use>2014-10-31</at:start.use> + <atold:op-code>OGL_3_0</atold:op-code> + <dc:identifier>OGL_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="da">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="de">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="el">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="en">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="es">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="et">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="it">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OGL 3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OGL 3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Open_Government_Licence</skos:changeNote> + <skos:definition xml:lang="en">Developed and maintained by the National Archives, OGL-3.0 is a copyright licence for Crown Copyright works published by the UK government consisting of a simple set of terms and conditions facilitating the re-use of a wide range of public sector information free of charge. The OGL terms are compatible with the latest versions of the Creative Commons Attribution Licence and the Open Data Commons Attribution Licence. The OGL is a perpetual licence so any past and continuing use of information authorised under v1.0 or v2.0 may continue.</skos:definition> + <skos:exactMatch rdf:resource="http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OGL_NC" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Non-Commercial Government Licence</skos:prefLabel> + <at:authority-code>OGL_NC</at:authority-code> + <at:op-code>OGL_NC</at:op-code> + <at:start.use>2013-06-28</at:start.use> + <atold:op-code>OGL_NC</atold:op-code> + <dc:identifier>OGL_NC</dc:identifier> + <skos:altLabel xml:lang="bg">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="cs">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="da">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="de">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="el">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="en">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="es">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="et">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="fi">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="fr">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="ga">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="hr">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="hu">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="it">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="lt">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="lv">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="mt">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="nl">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="pl">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="pt">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="ro">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="sk">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="sl">OGL-NC</skos:altLabel> + <skos:altLabel xml:lang="sv">OGL-NC</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Open_Government_Licence</skos:changeNote> + <skos:definition xml:lang="en">Developed and maintained by the National Archives, the Non-Commercial Government Licence (OGL-NC) may be used by public sector bodies that have a Delegation of Authority to licence Crown copyright material non-commercially. It may also be used by public sector bodies holding non-Crown copyright information in accordance with the PSI Regulations 2015.</skos:definition> + <skos:exactMatch rdf:resource="http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/non-commercial-government-licence.htm"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OGL_ROU_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Non-Commercial Government Licence 1.0</skos:prefLabel> + <at:authority-code>OGL_ROU_1_0</at:authority-code> + <at:op-code>OGL_ROU_1_0</at:op-code> + <at:start.use>2010-09-01</at:start.use> + <atold:op-code>OGL_ROU_1_0</atold:op-code> + <dc:identifier>OGL_ROU_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="da">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="de">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="el">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="en">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="es">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="et">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="it">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OGL-ROU 1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OGL-ROU 1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Open_Government_Licence</skos:changeNote> + <skos:definition xml:lang="en">Having a working value in Romanian, the Non-Commercial Government Licence 1.0 (OGL-ROU 1.0) consists of a simple set of terms and conditions facilitating the re-use of a wide range of public sector information free of charge. The OGL terms are compatible with the latest versions of the Creative Commons Attribution Licence and the Open Data Commons Attribution Licence.</skos:definition> + <skos:exactMatch rdf:resource="http://data.gov.ro/base/images/logoinst/OGL-ROU-1.0.pdf"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OGTSL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Open Group Test Suite License (OGTSL)</skos:prefLabel> + <at:authority-code>OGTSL</at:authority-code> + <at:op-code>OGTSL</at:op-code> + <at:start.use>2007-04-01</at:start.use> + <atold:op-code>OGTSL</atold:op-code> + <dc:identifier>OGTSL</dc:identifier> + <skos:altLabel xml:lang="bg">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="cs">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="da">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="de">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="el">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="en">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="es">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="et">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="fi">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="fr">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="ga">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="hr">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="hu">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="it">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="lt">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="lv">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="mt">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="nl">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="pl">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="pt">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="ro">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="sk">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="sl">OGTSL</skos:altLabel> + <skos:altLabel xml:lang="sv">OGTSL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://appaji.livejournal.com/53826.html</skos:changeNote> + <skos:definition xml:lang="en">OGTSL was meant to facilitate software testing, without placing severe restrictions on use of the software except in terms of including original versions of the software. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OGTSL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OPL_2_1" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">OSET Public License version 2.1</skos:prefLabel> + <at:authority-code>OPL_2_1</at:authority-code> + <at:op-code>OPL_2_1</at:op-code> + <at:start.use>2015-08-31</at:start.use> + <atold:op-code>OPL_2_1</atold:op-code> + <dc:identifier>OPL_2_1</dc:identifier> + <skos:altLabel xml:lang="bg">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="cs">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="da">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="de">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="el">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="en">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="es">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="et">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fi">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fr">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ga">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hr">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hu">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="it">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lt">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lv">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="mt">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="nl">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pl">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pt">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ro">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sk">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sl">OPL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sv">OPL-2.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://libraries.io/search?licenses=OSET-PL-2.1&order=desc&page=4&sort=latest_release_published_at</skos:changeNote> + <skos:definition xml:lang="en">OSET Public License 2.1 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OPL-2.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OP_DATPRO" + at:deprecated="false"> + <skos:prefLabel xml:lang="bg">Неокончателни данни</skos:prefLabel> + <skos:prefLabel xml:lang="cs">Předběžné údaje</skos:prefLabel> + <skos:prefLabel xml:lang="da">Midlertidige data</skos:prefLabel> + <skos:prefLabel xml:lang="de">Vorläufige Daten</skos:prefLabel> + <skos:prefLabel xml:lang="el">Προσωρινά δεδομένα</skos:prefLabel> + <skos:prefLabel xml:lang="en">Provisional data</skos:prefLabel> + <skos:prefLabel xml:lang="es">Datos provisionales</skos:prefLabel> + <skos:prefLabel xml:lang="et">Esialgsed andmed</skos:prefLabel> + <skos:prefLabel xml:lang="fi">Alustavat tiedot</skos:prefLabel> + <skos:prefLabel xml:lang="fr">Données provisoires</skos:prefLabel> + <skos:prefLabel xml:lang="ga">Sonraí sealadacha</skos:prefLabel> + <skos:prefLabel xml:lang="hr">Privremeni podaci</skos:prefLabel> + <skos:prefLabel xml:lang="hu">Ideiglenes adatok</skos:prefLabel> + <skos:prefLabel xml:lang="it">Dati provvisori</skos:prefLabel> + <skos:prefLabel xml:lang="lt">Laikinieji duomenys</skos:prefLabel> + <skos:prefLabel xml:lang="lv">Provizoriski dati</skos:prefLabel> + <skos:prefLabel xml:lang="mt">Dejta provviżorja</skos:prefLabel> + <skos:prefLabel xml:lang="nl">Voorlopige gegevens</skos:prefLabel> + <skos:prefLabel xml:lang="pl">Dane tymczasowe</skos:prefLabel> + <skos:prefLabel xml:lang="pt">Dados provisórios</skos:prefLabel> + <skos:prefLabel xml:lang="ro">Date provizorii</skos:prefLabel> + <skos:prefLabel xml:lang="sk">Predbežné údaje</skos:prefLabel> + <skos:prefLabel xml:lang="sl">Začasni podatki</skos:prefLabel> + <skos:prefLabel xml:lang="sv">Tillfälliga uppgifter</skos:prefLabel> + <at:authority-code>OP_DATPRO</at:authority-code> + <at:op-code>OP_DATPRO</at:op-code> + <at:start.use>1952-07-23</at:start.use> + <atold:op-code>OP_DATPRO</atold:op-code> + <dc:identifier>OP_DATPRO</dc:identifier> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OSL_1_0" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Open Software License, version 1.0 (OSL-1.0)</skos:prefLabel> + <at:authority-code>OSL_1_0</at:authority-code> + <at:op-code>OSL_1_0</at:op-code> + <at:start.use>2002-08-31</at:start.use> + <atold:op-code>OSL_1_0</atold:op-code> + <dc:identifier>OSL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OSL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://old.computerra.ru/2002/466/200189/</skos:changeNote> + <skos:definition xml:lang="en">Open Software License 1.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OSL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2005-11-30</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OSL_2_1" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">The Open Software License, version 2.1 (OSL-2.1)</skos:prefLabel> + <at:authority-code>OSL_2_1</at:authority-code> + <at:op-code>OSL_2_1</at:op-code> + <at:start.use>2003-10-31</at:start.use> + <atold:op-code>OSL_2_1</atold:op-code> + <dc:identifier>OSL_2_1</dc:identifier> + <skos:altLabel xml:lang="bg">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="cs">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="da">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="de">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="el">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="en">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="es">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="et">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fi">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="fr">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ga">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hr">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="hu">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="it">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lt">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="lv">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="mt">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="nl">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pl">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="pt">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="ro">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sk">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sl">OSL-2.1</skos:altLabel> + <skos:altLabel xml:lang="sv">OSL-2.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://lists.debian.org/debian-legal/2003/11/msg00181.html</skos:changeNote> + <skos:definition xml:lang="en">Open Software License 2.1 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OSL-2.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2005-11-30</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/OSL_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Open Software License, version 3.0 (OSL-3.0)</skos:prefLabel> + <at:authority-code>OSL_3_0</at:authority-code> + <at:op-code>OSL_3_0</at:op-code> + <at:start.use>2005-12-01</at:start.use> + <atold:op-code>OSL_3_0</atold:op-code> + <dc:identifier>OSL_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="da">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="de">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="el">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="en">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="es">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="et">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="it">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">OSL-3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">OSL-3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://rosenlaw.com/OSL3.0-explained.htm; https://lwn.net/Articles/147660/</skos:changeNote> + <skos:definition xml:lang="en">Open Software License 3.0 is a copyleft-style, free software licence approved by the Open Source Initiative. Similar to the AGPL, the OSL requires the user to disclose the source code when communicating software.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/OSL-3.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/PHP_3_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The PHP License 3.0 (PHP-3.0)</skos:prefLabel> + <at:authority-code>PHP_3_0</at:authority-code> + <at:op-code>PHP_3_0</at:op-code> + <at:start.use>2002-07-21</at:start.use> + <atold:op-code>PHP_3_0</atold:op-code> + <dc:identifier>PHP_3_0</dc:identifier> + <skos:altLabel xml:lang="bg">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="cs">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="da">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="de">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="el">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="en">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="es">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="et">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="fi">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="fr">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="ga">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="hr">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="hu">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="it">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="lt">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="lv">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="mt">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="nl">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="pl">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="pt">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="ro">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="sk">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="sl">PHP-3.0</skos:altLabel> + <skos:altLabel xml:lang="sv">PHP-3.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://lists.opensource.org/pipermail/license-review_lists.opensource.org/2020-March/004716.html</skos:changeNote> + <skos:definition xml:lang="en">The PHP License 3.0 is a permissive free software licence approved by the Open Source Initiative. It has minimal, clear requirements, and explicitly bars the use of the PHP name to endorse the software.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/PHP-3.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/POSTGRE_SQL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The PostgreSQL Licence (PostgreSQL)</skos:prefLabel> + <at:authority-code>POSTGRE_SQL</at:authority-code> + <at:op-code>POSTGRE_SQL</at:op-code> + <at:start.use>1996-07-08</at:start.use> + <atold:op-code>POSTGRE_SQL</atold:op-code> + <dc:identifier>POSTGRE_SQL</dc:identifier> + <skos:altLabel xml:lang="bg">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="cs">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="da">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="de">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="el">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="en">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="es">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="et">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="fi">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="fr">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="ga">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="hr">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="hu">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="it">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="lt">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="lv">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="mt">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="nl">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="pl">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="pt">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="ro">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="sk">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="sl">PostgreSQL</skos:altLabel> + <skos:altLabel xml:lang="sv">PostgreSQL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/PostgreSQL</skos:changeNote> + <skos:definition xml:lang="en">PostgreSQL is a BSD-style permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/PostgreSQL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/PSEUL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">INSPIRE End User Licence</skos:prefLabel> + <at:authority-code>PSEUL</at:authority-code> + <at:op-code>PSEUL</at:op-code> + <at:start.use>2013-08-01</at:start.use> + <atold:op-code>PSEUL</atold:op-code> + <dc:identifier>PSEUL</dc:identifier> + <skos:altLabel xml:lang="bg">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="cs">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="da">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="de">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="el">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="en">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="es">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="et">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="fi">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="fr">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="ga">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="hr">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="hu">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="it">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="lt">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="lv">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="mt">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="nl">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="pl">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="pt">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="ro">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="sk">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="sl">PSEUL</skos:altLabel> + <skos:altLabel xml:lang="sv">PSEUL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://data.blog.gov.uk/2013/08/23/new-psma-end-user-licences-for-inspire/</skos:changeNote> + <skos:definition xml:lang="en">The INSPIRE End User Licence (PSEUL) aims to enable the sharing of environmental spatial information amongst public sector organisations. Licenced data under PSEUL is limited to data created (derived) by the user using Ordnance Survey (OS) licenced data.</skos:definition> + <skos:exactMatch rdf:resource="https://www.ordnancesurvey.co.uk/documents/licensing/inspire-end-user-licence.pdf"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/PYTHON_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Python License (Python-2.0)</skos:prefLabel> + <at:authority-code>PYTHON_2_0</at:authority-code> + <at:op-code>PYTHON_2_0</at:op-code> + <at:start.use>2000-09-01</at:start.use> + <atold:op-code>PYTHON_2_0</atold:op-code> + <dc:identifier>PYTHON_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Python-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Python-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://www.slideshare.net/kanchilug/python-quick-guide1; https://en.wikipedia.org/wiki/Python_License</skos:changeNote> + <skos:definition xml:lang="en">Python 2.0 is a permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Python-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/QPL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Q Public License Version (QPL-1.0)</skos:prefLabel> + <at:authority-code>QPL_1_0</at:authority-code> + <at:op-code>QPL_1_0</at:op-code> + <at:start.use>1999-03-04</at:start.use> + <atold:op-code>QPL_1_0</atold:op-code> + <dc:identifier>QPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">QPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">QPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://blog.hermit4.info/2013/01/qt-news-title.html</skos:changeNote> + <skos:definition xml:lang="en">The Q Public License Version 1.0 is a copyleft-style, free software licence approved by the Open Source Initiative. It was designed by the Norwegian firm Trolltech to govern the distribution of its software, the Qt Toolkit.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/QPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/RPL_1_1" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">Reciprocal Public License, version 1.1</skos:prefLabel> + <at:authority-code>RPL_1_1</at:authority-code> + <at:op-code>RPL_1_1</at:op-code> + <at:start.use>2002-11-01</at:start.use> + <atold:op-code>RPL_1_1</atold:op-code> + <dc:identifier>RPL_1_1</dc:identifier> + <skos:altLabel xml:lang="bg">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="cs">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="da">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="de">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="el">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="en">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="es">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="et">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fi">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="fr">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ga">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hr">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="hu">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="it">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lt">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="lv">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="mt">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="nl">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pl">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="pt">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="ro">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sk">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sl">RPL-1.1</skos:altLabel> + <skos:altLabel xml:lang="sv">RPL-1.1</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://cc.com.au/files/acquisition_of_open-source_software_-_text.pdf</skos:changeNote> + <skos:definition xml:lang="en">The Reciprocal Public License, version 1.1 is a copyleft-style, free software licence approved by the Open Source Initiative. It contains rules on redistribution.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/RPL-1.1"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2007-07-14</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/RPL_1_5" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Reciprocal Public License 1.5 (RPL-1.5)</skos:prefLabel> + <at:authority-code>RPL_1_5</at:authority-code> + <at:op-code>RPL_1_5</at:op-code> + <at:start.use>2007-07-15</at:start.use> + <atold:op-code>RPL_1_5</atold:op-code> + <dc:identifier>RPL_1_5</dc:identifier> + <skos:altLabel xml:lang="bg">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="cs">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="da">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="de">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="el">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="en">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="es">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="et">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="fi">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="fr">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="ga">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="hr">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="hu">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="it">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="lt">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="lv">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="mt">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="nl">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="pl">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="pt">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="ro">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="sk">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="sl">RPL-1.5</skos:altLabel> + <skos:altLabel xml:lang="sv">RPL-1.5</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/RPL-1.5.html</skos:changeNote> + <skos:definition xml:lang="en">The Reciprocal Public License 1.5 is a copyleft-style, free software licence approved by the Open Source Initiative with detailed liability protection and numerous requirements, created to close a loophole in the GPL which let users sell modified software without ”fairly” distributing it.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/RPL-1.5"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/RPSL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">RealNetworks Public Source License Version 1.0 (RPSL-1.0)</skos:prefLabel> + <at:authority-code>RPSL_1_0</at:authority-code> + <at:op-code>RPSL_1_0</at:op-code> + <at:start.use>2002-10-28</at:start.use> + <atold:op-code>RPSL_1_0</atold:op-code> + <dc:identifier>RPSL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">RPSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">RPSL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/RPSL-1.0.html</skos:changeNote> + <skos:definition xml:lang="en">Published by RealNetworks, RPSL-1.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/RPSL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/RSCPL" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Ricoh Source Code Public License (RSCPL)</skos:prefLabel> + <at:authority-code>RSCPL</at:authority-code> + <at:op-code>RSCPL</at:op-code> + <at:start.use>1995-12-01</at:start.use> + <atold:op-code>RSCPL</atold:op-code> + <dc:identifier>RSCPL</dc:identifier> + <skos:altLabel xml:lang="bg">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="cs">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="da">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="de">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="el">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="en">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="es">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="et">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="fi">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="fr">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="ga">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="hr">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="hu">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="it">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="lt">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="lv">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="mt">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="nl">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="pl">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="pt">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="ro">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="sk">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="sl">RSCPL</skos:altLabel> + <skos:altLabel xml:lang="sv">RSCPL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://ploug22.free.fr/doc/oss-market-structure-urope.pdf; https://spdx.org/licenses/RSCPL.html</skos:changeNote> + <skos:definition xml:lang="en">The Ricoh Source Code Public License (RSCPL) is a copyleft-style, free software licence approved by the Open Source Initiative with much built-in protection for the author.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/RSCPL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/SIMPL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Simple Public License (SimPL-2.0)</skos:prefLabel> + <at:authority-code>SIMPL_2_0</at:authority-code> + <at:op-code>SIMPL_2_0</at:op-code> + <at:start.use>2007-11-01</at:start.use> + <atold:op-code>SIMPL_2_0</atold:op-code> + <dc:identifier>SIMPL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">SimPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">SimPL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/node/228</skos:changeNote> + <skos:definition xml:lang="en">Simple Public License 2.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/SimPL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/SLEEPYCAT" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Sleepycat License (Sleepycat)</skos:prefLabel> + <at:authority-code>SLEEPYCAT</at:authority-code> + <at:op-code>SLEEPYCAT</at:op-code> + <at:start.use>1990-01-01</at:start.use> + <atold:op-code>SLEEPYCAT</atold:op-code> + <dc:identifier>SLEEPYCAT</dc:identifier> + <skos:altLabel xml:lang="bg">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="cs">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="da">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="de">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="el">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="en">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="es">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="et">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="fi">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="fr">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="ga">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="hr">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="hu">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="it">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="lt">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="lv">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="mt">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="nl">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="pl">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="pt">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="ro">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="sk">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="sl">Sleepycat</skos:altLabel> + <skos:altLabel xml:lang="sv">Sleepycat</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Talk%3ASleepycat_License</skos:changeNote> + <skos:definition xml:lang="en">The Sleepycat License is a BSD plus-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Sleepycat"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/SPL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Sun Public License Version 1.0 (SPL-1.0)</skos:prefLabel> + <at:authority-code>SPL_1_0</at:authority-code> + <at:op-code>SPL_1_0</at:op-code> + <at:start.use>1995-01-01</at:start.use> + <atold:op-code>SPL_1_0</atold:op-code> + <dc:identifier>SPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">SPL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">SPL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://enterprise.dejacode.com/licenses/public/spl-1.0/?_list_filters=q%3DSun%2BPublic%2BLicense</skos:changeNote> + <skos:definition xml:lang="en">Sun Public License 1.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/SPL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/UCL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">Upstream Compatibility License v1.0</skos:prefLabel> + <at:authority-code>UCL_1_0</at:authority-code> + <at:op-code>UCL_1_0</at:op-code> + <at:start.use>2017-02-01</at:start.use> + <atold:op-code>UCL_1_0</atold:op-code> + <dc:identifier>UCL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">UCL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">UCL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://lists.opensource.org/pipermail/license-review_lists.opensource.org/2017-February/002983.html</skos:changeNote> + <skos:definition xml:lang="en">Upstream Compatibility License v1.0 is a copyleft-style, free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/UCL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/UPL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Universal Permissive License (UPL), Version 1.0</skos:prefLabel> + <at:authority-code>UPL_1_0</at:authority-code> + <at:op-code>UPL_1_0</at:op-code> + <at:start.use>2015-02-01</at:start.use> + <atold:op-code>UPL_1_0</atold:op-code> + <dc:identifier>UPL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">UPL</skos:altLabel> + <skos:altLabel xml:lang="cs">UPL</skos:altLabel> + <skos:altLabel xml:lang="da">UPL</skos:altLabel> + <skos:altLabel xml:lang="de">UPL</skos:altLabel> + <skos:altLabel xml:lang="el">UPL</skos:altLabel> + <skos:altLabel xml:lang="en">UPL</skos:altLabel> + <skos:altLabel xml:lang="es">UPL</skos:altLabel> + <skos:altLabel xml:lang="et">UPL</skos:altLabel> + <skos:altLabel xml:lang="fi">UPL</skos:altLabel> + <skos:altLabel xml:lang="fr">UPL</skos:altLabel> + <skos:altLabel xml:lang="ga">UPL</skos:altLabel> + <skos:altLabel xml:lang="hr">UPL</skos:altLabel> + <skos:altLabel xml:lang="hu">UPL</skos:altLabel> + <skos:altLabel xml:lang="it">UPL</skos:altLabel> + <skos:altLabel xml:lang="lt">UPL</skos:altLabel> + <skos:altLabel xml:lang="lv">UPL</skos:altLabel> + <skos:altLabel xml:lang="mt">UPL</skos:altLabel> + <skos:altLabel xml:lang="nl">UPL</skos:altLabel> + <skos:altLabel xml:lang="pl">UPL</skos:altLabel> + <skos:altLabel xml:lang="pt">UPL</skos:altLabel> + <skos:altLabel xml:lang="ro">UPL</skos:altLabel> + <skos:altLabel xml:lang="sk">UPL</skos:altLabel> + <skos:altLabel xml:lang="sl">UPL</skos:altLabel> + <skos:altLabel xml:lang="sv">UPL</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://oss.oracle.com/licenses/upl/</skos:changeNote> + <skos:definition xml:lang="en">The Universal Permissive License 1.0 is an attribution+patent-style, permissive free software licence issued by Oracle and approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/UPL"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/VSL_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Vovida Software License v. 1.0 (VSL-1.0)</skos:prefLabel> + <at:authority-code>VSL_1_0</at:authority-code> + <at:op-code>VSL_1_0</at:op-code> + <at:start.use>2000-01-01</at:start.use> + <atold:op-code>VSL_1_0</atold:op-code> + <dc:identifier>VSL_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">VSL-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">VSL-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://spdx.org/licenses/VSL-1.0.html#licenseText</skos:changeNote> + <skos:definition xml:lang="en">The Vovida Software License v. 1.0 is a BSD plus-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/VSL-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/W3C" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The W3C Software Notice and License (W3C)</skos:prefLabel> + <at:authority-code>W3C</at:authority-code> + <at:op-code>W3C</at:op-code> + <at:start.use>2002-12-31</at:start.use> + <atold:op-code>W3C</atold:op-code> + <dc:identifier>W3C</dc:identifier> + <skos:altLabel xml:lang="bg">W3C</skos:altLabel> + <skos:altLabel xml:lang="cs">W3C</skos:altLabel> + <skos:altLabel xml:lang="da">W3C</skos:altLabel> + <skos:altLabel xml:lang="de">W3C</skos:altLabel> + <skos:altLabel xml:lang="el">W3C</skos:altLabel> + <skos:altLabel xml:lang="en">W3C</skos:altLabel> + <skos:altLabel xml:lang="es">W3C</skos:altLabel> + <skos:altLabel xml:lang="et">W3C</skos:altLabel> + <skos:altLabel xml:lang="fi">W3C</skos:altLabel> + <skos:altLabel xml:lang="fr">W3C</skos:altLabel> + <skos:altLabel xml:lang="ga">W3C</skos:altLabel> + <skos:altLabel xml:lang="hr">W3C</skos:altLabel> + <skos:altLabel xml:lang="hu">W3C</skos:altLabel> + <skos:altLabel xml:lang="it">W3C</skos:altLabel> + <skos:altLabel xml:lang="lt">W3C</skos:altLabel> + <skos:altLabel xml:lang="lv">W3C</skos:altLabel> + <skos:altLabel xml:lang="mt">W3C</skos:altLabel> + <skos:altLabel xml:lang="nl">W3C</skos:altLabel> + <skos:altLabel xml:lang="pl">W3C</skos:altLabel> + <skos:altLabel xml:lang="pt">W3C</skos:altLabel> + <skos:altLabel xml:lang="ro">W3C</skos:altLabel> + <skos:altLabel xml:lang="sk">W3C</skos:altLabel> + <skos:altLabel xml:lang="sl">W3C</skos:altLabel> + <skos:altLabel xml:lang="sv">W3C</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/W3C_Software_Notice_and_License</skos:changeNote> + <skos:definition xml:lang="en">The W3C Software Notice and License is a permissive free software licence used by software released by the World Wide Web Consortium. It is a permissive licence, compatible with the GNU General Public License and approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/W3C"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/WATCOM_1_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Sybase Open Source Licence (Watcom-1.0)</skos:prefLabel> + <at:authority-code>WATCOM_1_0</at:authority-code> + <at:op-code>WATCOM_1_0</at:op-code> + <at:start.use>2002-05-19</at:start.use> + <atold:op-code>WATCOM_1_0</atold:op-code> + <dc:identifier>WATCOM_1_0</dc:identifier> + <skos:altLabel xml:lang="bg">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="cs">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="da">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="de">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="el">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="en">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="es">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="et">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="fi">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="fr">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="ga">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="hr">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="hu">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="it">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="lt">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="lv">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="mt">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="nl">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="pl">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="pt">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="ro">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="sk">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="sl">Watcom-1.0</skos:altLabel> + <skos:altLabel xml:lang="sv">Watcom-1.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: http://howlingmad.gmxhome.de/watcom_new_en.html</skos:changeNote> + <skos:definition xml:lang="en">Watcom-1.0 is a proprietary+patent-style, strong copyleft software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Watcom-1.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/WXWINDOWS" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">The wxWindows Library Licence (wxWindows)</skos:prefLabel> + <at:authority-code>WXWINDOWS</at:authority-code> + <at:op-code>WXWINDOWS</at:op-code> + <at:start.use>1998-07-01</at:start.use> + <atold:op-code>WXWINDOWS</atold:op-code> + <dc:identifier>WXWINDOWS</dc:identifier> + <skos:altLabel xml:lang="bg">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="cs">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="da">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="de">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="el">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="en">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="es">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="et">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="fi">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="fr">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="ga">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="hr">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="hu">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="it">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="lt">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="lv">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="mt">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="nl">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="pl">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="pt">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="ro">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="sk">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="sl">wxWindows</skos:altLabel> + <skos:altLabel xml:lang="sv">wxWindows</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/WXwindows</skos:changeNote> + <skos:definition xml:lang="en">Approved by the Open Source Initiative, wxWindows is a copyleft-style, free software licence created for wxWidgets.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/WXwindows"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2007-06-28</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/XNET" + at:deprecated="true"> + <skos:prefLabel xml:lang="en">The X.Net, Inc. License (Xnet)</skos:prefLabel> + <at:authority-code>XNET</at:authority-code> + <at:op-code>XNET</at:op-code> + <at:start.use>2000-07-01</at:start.use> + <atold:op-code>XNET</atold:op-code> + <dc:identifier>XNET</dc:identifier> + <skos:altLabel xml:lang="bg">Xnet</skos:altLabel> + <skos:altLabel xml:lang="cs">Xnet</skos:altLabel> + <skos:altLabel xml:lang="da">Xnet</skos:altLabel> + <skos:altLabel xml:lang="de">Xnet</skos:altLabel> + <skos:altLabel xml:lang="el">Xnet</skos:altLabel> + <skos:altLabel xml:lang="en">Xnet</skos:altLabel> + <skos:altLabel xml:lang="es">Xnet</skos:altLabel> + <skos:altLabel xml:lang="et">Xnet</skos:altLabel> + <skos:altLabel xml:lang="fi">Xnet</skos:altLabel> + <skos:altLabel xml:lang="fr">Xnet</skos:altLabel> + <skos:altLabel xml:lang="ga">Xnet</skos:altLabel> + <skos:altLabel xml:lang="hr">Xnet</skos:altLabel> + <skos:altLabel xml:lang="hu">Xnet</skos:altLabel> + <skos:altLabel xml:lang="it">Xnet</skos:altLabel> + <skos:altLabel xml:lang="lt">Xnet</skos:altLabel> + <skos:altLabel xml:lang="lv">Xnet</skos:altLabel> + <skos:altLabel xml:lang="mt">Xnet</skos:altLabel> + <skos:altLabel xml:lang="nl">Xnet</skos:altLabel> + <skos:altLabel xml:lang="pl">Xnet</skos:altLabel> + <skos:altLabel xml:lang="pt">Xnet</skos:altLabel> + <skos:altLabel xml:lang="ro">Xnet</skos:altLabel> + <skos:altLabel xml:lang="sk">Xnet</skos:altLabel> + <skos:altLabel xml:lang="sl">Xnet</skos:altLabel> + <skos:altLabel xml:lang="sv">Xnet</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://opensource.org/licenses/Xnet</skos:changeNote> + <skos:definition xml:lang="en">Xnet is a MIT-style, permissive free software licence approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Xnet"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <at:end.use>2020-01-01</at:end.use> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ZLIB" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The zlib/libpng License (Zlib)</skos:prefLabel> + <at:authority-code>ZLIB</at:authority-code> + <at:op-code>ZLIB</at:op-code> + <at:start.use>1995-05-01</at:start.use> + <atold:op-code>ZLIB</atold:op-code> + <dc:identifier>ZLIB</dc:identifier> + <skos:altLabel xml:lang="bg">Zlib</skos:altLabel> + <skos:altLabel xml:lang="cs">Zlib</skos:altLabel> + <skos:altLabel xml:lang="da">Zlib</skos:altLabel> + <skos:altLabel xml:lang="de">Zlib</skos:altLabel> + <skos:altLabel xml:lang="el">Zlib</skos:altLabel> + <skos:altLabel xml:lang="en">Zlib</skos:altLabel> + <skos:altLabel xml:lang="es">Zlib</skos:altLabel> + <skos:altLabel xml:lang="et">Zlib</skos:altLabel> + <skos:altLabel xml:lang="fi">Zlib</skos:altLabel> + <skos:altLabel xml:lang="fr">Zlib</skos:altLabel> + <skos:altLabel xml:lang="ga">Zlib</skos:altLabel> + <skos:altLabel xml:lang="hr">Zlib</skos:altLabel> + <skos:altLabel xml:lang="hu">Zlib</skos:altLabel> + <skos:altLabel xml:lang="it">Zlib</skos:altLabel> + <skos:altLabel xml:lang="lt">Zlib</skos:altLabel> + <skos:altLabel xml:lang="lv">Zlib</skos:altLabel> + <skos:altLabel xml:lang="mt">Zlib</skos:altLabel> + <skos:altLabel xml:lang="nl">Zlib</skos:altLabel> + <skos:altLabel xml:lang="pl">Zlib</skos:altLabel> + <skos:altLabel xml:lang="pt">Zlib</skos:altLabel> + <skos:altLabel xml:lang="ro">Zlib</skos:altLabel> + <skos:altLabel xml:lang="sk">Zlib</skos:altLabel> + <skos:altLabel xml:lang="sl">Zlib</skos:altLabel> + <skos:altLabel xml:lang="sv">Zlib</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: https://en.wikipedia.org/wiki/Zlib</skos:changeNote> + <skos:definition xml:lang="en">Zlib is designed to be a free, general-purpose, legally unencumbered – not covered by any patents – lossless data-compression library for use on virtually any computer hardware and operating system. It is approved by the Open Source Initiative.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/Zlib"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> + <skos:Concept rdf:about="http://publications.europa.eu/resource/authority/licence/ZPL_2_0" + at:deprecated="false"> + <skos:prefLabel xml:lang="en">The Zope Public License Version 2.0 (ZPL-2.0)</skos:prefLabel> + <at:authority-code>ZPL_2_0</at:authority-code> + <at:op-code>ZPL_2_0</at:op-code> + <at:start.use>2002-02-01</at:start.use> + <atold:op-code>ZPL_2_0</atold:op-code> + <dc:identifier>ZPL_2_0</dc:identifier> + <skos:altLabel xml:lang="bg">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="cs">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="da">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="de">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="el">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="en">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="es">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="et">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fi">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="fr">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ga">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hr">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="hu">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="it">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lt">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="lv">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="mt">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="nl">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pl">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="pt">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="ro">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sk">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sl">ZPL-2.0</skos:altLabel> + <skos:altLabel xml:lang="sv">ZPL-2.0</skos:altLabel> + <skos:changeNote xml:lang="en">The source of the start-use date: Open Source Software: From Open Science to New Marketing Model, p. 116</skos:changeNote> + <skos:definition xml:lang="en">The Zope Public License Version 2.0 is a free software licence approved by the Open Source Initiative, used primarily for the Zope application server software. It is similar to the well-known BSD license, however the ZPL also adds clauses prohibiting trademark use and requiring documentation of all changes.</skos:definition> + <skos:exactMatch rdf:resource="https://opensource.org/licenses/ZPL-2.0"/> + <skos:inScheme rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + <skos:topConceptOf rdf:resource="http://publications.europa.eu/resource/authority/licence"/> + </skos:Concept> +</rdf:RDF> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/eu-dcat-ap-hvd-core.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/eu-dcat-ap-hvd-core.xsl new file mode 100644 index 00000000000..d526fc6ac14 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/eu-dcat-ap-hvd-core.xsl @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" + xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" + xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" + xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:skos="http://www.w3.org/2004/02/skos/core#" + xmlns:dcatap="http://data.europa.eu/r5r/" + xmlns:eli="http://data.europa.eu/eli/ontology" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + <xsl:import href="../eu-dcat-ap/eu-dcat-ap-core.xsl"/> + + <xsl:variable name="hvdCategoryThesaurusKey" + select="'http://data.europa.eu/bna/asd487ae75'"/> + + <xsl:variable name="euHvdDataCategories" + select="document('vocabularies/high-value-dataset-category.rdf')"/> + + <xsl:template mode="iso19115-3-to-dcat-resource" + match="mdb:MD_Metadata"> + <xsl:call-template name="iso19115-3-to-dcat-ap-resource"/> + + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="mdb:identificationInfo/*/mri:resourceConstraints/mco:MD_LegalConstraints/mco:reference"/> + </xsl:template> + + + <!-- + Dataset + + conforms to Standard 0..* An implementing rule or other specification. The provided information should enable to the verification whether the detailed information requirements by the HVD is satisfied. For more usage suggestions see section on specific data requirements. Link A + contact point Kind 0..* Contact information that can be used for sending comments about the Dataset. Link A + dataset distribution Distribution 1..* An available Distribution for the Dataset. The HVD IR is a quality improvement of existing datasets. The intention is that HVD datasets are publicly and open accessible. Therefore a Distribution is expected to be present. (Article 3.1) Link A + + DataService + + contact point Kind 1..* Contact information that can be used for sending comments about the Data Service. Article 3.4 requires the designation of a point of contact for an API. Link P + documentation Document 1..* A page that provides additional information about the Data Service. Quality of service covers a broad spectrum of aspects. The HVD regulation does not list any mandatory topic. Therefore quality of service information is considered part of the generic documentation of a Data Service. P + endpoint description Resource 0..* A description of the services available via the end-points, including their operations, parameters etc. The property gives specific details of the actual endpoint instances, while dct:conformsTo is used to indicate the general standard or specification that the endpoints implement. + Article 3.3 requires to provide API documentation in a Union or internationally recognised open, human-readable and machine-readable format. Link E + endpoint URL Resource 1..* The root location or primary endpoint of the service (an IRI). The endpoint URL SHOULD be persistent. This means that publishers should do everything in their power to maintain the value stable and existing. Link E + HVD category Concept 1..* The HVD category to which this Data Service belongs. P + licence Licence Document 0..1 A licence under which the Data service is made available. Article 3.3 specifies that the terms of use should be provided. According to the guidelines for legal Information in DCAT-AP HVD this is fullfilled by providing by preference a licence. As alternative rights can be used. Link E + rights Rights statement 0..* A statement that specifies rights associated with the Distribution. Article 3.3 specifies that the terms of use should be provided. According to the guidelines for legal Information in DCAT-AP HVD this is fullfilled by providing by preference a licence. As alternative rights can be used. P + serves dataset Dataset 1..* This property refers to a collection of data that this data service can distribute. An API in the context of HVD is not a standalone resource. It is used to open up HVD datasets. Therefore each Data Service is at least tightly connected with a Dataset. Link E + + + Distribution + + access service Data Service 0..* A data service that gives access to the distribution of the dataset Link A + access URL Resource 1..* A URL that gives access to a Distribution of the Dataset. The resource at the access URL contains information about how to get the Dataset. In accordance to the DCAT guidelines it is preferred to also set the downloadURL property if the URL is a reference to a downloadable resource. Link A + applicable legislation Legal Resource 1..* The legislation that mandates the creation or management of the Distribution For HVD the value must include the ELI http://data.europa.eu/eli/reg_impl/2023/138/oj. + As multiple legislations may apply to the resource the maximum cardinality is not limited. P + licence Licence Document 0..1 A licence under which the Distribution is made available. Article 4.3 specifies that High-value datasets should be made available for reuse. According to the guidelines for legal Information in DCAT-AP HVD this is fullfilled by providing by preference a licence. As alternative rights can be used. Link E + linked schemas Standard 0..* An established schema to which the described Distribution conforms. The provided information should enable to the verification whether the detailed information requirements by the HVD is satisfied. For more usage suggestions see section on specific data requirements. Link A + rights Rights statement 0..* A statement that specifies rights associated with the Distribution. Article 4.3 specifies that High-value datasets should be made available for reuse. According to the guidelines for legal Information in DCAT-AP HVD this is fullfilled by providing by preference a licence. As alternative rights can be used. Link E + --> + + <!-- + HVD Category Concept 1..* The HVD category to which this Dataset belongs. P + --> + <xsl:template mode="iso19115-3-to-dcat" + match="mri:descriptiveKeywords[*/mri:thesaurusName/*/cit:title/*/@xlink:href = $hvdCategoryThesaurusKey]"> + <xsl:for-each select="*/mri:keyword[*/text() != '']"> + + <xsl:variable name="category" + as="xs:string?" + select="current()/*/text()"/> + <xsl:variable name="hvdCategory" + select="$euHvdDataCategories/rdf:RDF/*[skos:prefLabel/normalize-space(.) = $category]"/> + <xsl:if test="$hvdCategory"> + <dcatap:hvdCategory> + <skos:Concept rdf:about="{$hvdCategory/@rdf:about}"> + <xsl:copy-of select="$hvdCategory/skos:prefLabel[@xml:lang = $languages/@iso2code]"/> + </skos:Concept> + </dcatap:hvdCategory> + </xsl:if> + </xsl:for-each> + </xsl:template> + + + <!-- + applicable legislation Legal Resource 1..* The legislation that mandates the creation or management of the Data Service. + **For HVD the value MUST include the ELI http://data.europa.eu/eli/reg_impl/2023/138/oj.** + As multiple legislations may apply to the resource the maximum cardinality is not limited. + + See DCAT-AP + applicable legislation Legal Resource 0..* The legislation that mandates the creation or management of the Catalog. + + To create valid HVD document, a keyword anchor or a title href of mri:resourceConstraints/mco:MD_LegalConstraints/mco:reference + in the ISO record MUST define the ELI http://data.europa.eu/eli/reg_impl/2023/138/oj. + --> + + + <xsl:template mode="iso19115-3-to-dcat" + match="mdb:distributionInfo//mrd:onLine"> + <xsl:call-template name="iso19115-3-to-dcat-distribution"> + <xsl:with-param name="additionalProperties"> + <xsl:if test="$isCopyingDatasetInfoToDistribution"> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="ancestor::mdb:MD_Metadata/mdb:identificationInfo/*/mri:resourceConstraints/mco:MD_LegalConstraints/mco:reference"/> + </xsl:if> + </xsl:with-param> + </xsl:call-template> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/view.xsl new file mode 100644 index 00000000000..0cf08e810f6 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/view.xsl @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" + xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" + xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dct="http://purl.org/dc/terms/" + exclude-result-prefixes="#all"> + <!-- https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/ --> + <xsl:import href="eu-dcat-ap-hvd-core.xsl"/> + + <xsl:template match="/" + priority="2"> + <rdf:RDF> + <xsl:call-template name="create-namespaces-eu-dcat-ap"/> + <xsl:apply-templates mode="iso19115-3-to-dcat" + select="root/mdb:MD_Metadata|mdb:MD_Metadata"/> + </rdf:RDF> + </xsl:template> +</xsl:stylesheet> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/eu-applicable-legislation.rdf b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/eu-applicable-legislation.rdf new file mode 100644 index 00000000000..7502cb45ba2 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/eu-applicable-legislation.rdf @@ -0,0 +1,572 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dct="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:skos="http://www.w3.org/2004/02/skos/core#"> + <skos:ConceptScheme rdf:about="http://data.europa.eu/r5r/applicableLegislation"> + <dct:title xml:lang="en">EU applicable legislations</dct:title> + <dct:title xml:lang="fr">Législations applicables dans l'UE</dct:title> + <dct:description xml:lang="fr">Législation sectorielle qui prescrit la création ou la gestion de la ressource. + Liste non exhaustive.</dct:description> + </dct:description> + </skos:ConceptScheme> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg_impl/2023/138/oj"> + <skos:prefLabel xml:lang="en">2023/138</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2023/138</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a + list of specific high-value datasets and the arrangements for their publication and re-use + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement d’exécution (UE) 2023/138 de la Commission du 21 décembre 2022 + établissant une liste d’ensembles de données de forte valeur spécifiques et les modalités de leur + publication et de leur réutilisation + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2013/1306/oj"> + <skos:prefLabel xml:lang="en">1306/2013</skos:prefLabel> + <skos:prefLabel xml:lang="fr">1306/2013</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) No 1306/2013 of the European Parliament and of the Council of 17 + December 2013 on the financing, management and monitoring of the common agricultural policy and repealing + Council Regulations (EEC) No 352/78, (EC) No 165/94, (EC) No 2799/98, (EC) No 814/2000, (EC) No 1290/2005 + and (EC) No 485/2008 + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) n ° 1306/2013 du Parlement européen et du Conseil du 17 décembre + 2013 relatif au financement, à la gestion et au suivi de la politique agricole commune et abrogeant les + règlements (CEE) n ° 352/78, (CE) n ° 165/94, (CE) n ° 2799/98, (CE) n ° 814/2000, (CE) n ° 1200/2005 et n ° + 485/2008 du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2008/50/oj"> + <skos:prefLabel xml:lang="en">2008/50/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2008/50/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2008/50/EC of the European Parliament and of the Council of 21 May 2008 + on ambient air quality and cleaner air for Europe + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2008/50/CE du Parlement européen et du Conseil du 21 mai 2008 concernant + la qualité de l’air ambiant et un air pur pour l’Europe + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2004/107/oj"> + <skos:prefLabel xml:lang="en">2004/107/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2004/107/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2004/107/EC of the European Parliament and of the Council of 15 December + 2004 relating to arsenic, cadmium, mercury, nickel and polycyclic aromatic hydrocarbons in ambient air + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2004/107/CE du Parlement européen et du Conseil du 15 décembre 2004 + concernant l'arsenic, le cadmium, le mercure, le nickel et les hydrocarbures aromatiques polycycliques dans + l'air ambiant + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2002/49/oj"> + <skos:prefLabel xml:lang="en">2002/49/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2002/49/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2002/49/EC of the European Parliament and of the Council of 25 June 2002 + relating to the assessment and management of environmental noise - Declaration by the Commission in the + Conciliation Committee on the Directive relating to the assessment and management of environmental noise + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2002/49/CE du Parlement européen et du Conseil du 25 juin 2002 relative + à l'évaluation et à la gestion du bruit dans l'environnement - Déclaration de la Commission au sein du + comité de conciliation concernant la directive relative à l'évaluation et à la gestion du bruit ambiant + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2015/359/oj"> + <skos:prefLabel xml:lang="en">2015/359</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2015/359</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Regulation (EU) 2015/359 of 4 March 2015 implementing Regulation (EC) + No 1338/2008 of the European Parliament and of the Council as regards statistics on healthcare expenditure + and financing + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2015/359 de la Commission du 4 mars 2015 portant mise en œuvre du + règlement (CE) n ° 1338/2008 du Parlement européen et du Conseil en ce qui concerne les statistiques sur les + dépenses de santé et leur financement + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/1999/31/oj"> + <skos:prefLabel xml:lang="en">1999/31/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">1999/31/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Council Directive 1999/31/EC of 26 April 1999 on the landfill of waste + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 1999/31/CE du Conseil du 26 avril 1999 concernant la mise en décharge + des déchets + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2002/2150/oj"> + <skos:prefLabel xml:lang="en">2150/2002</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2150/2002</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EC) No 2150/2002 of the European Parliament and of the Council of 25 + November 2002 on waste statistics + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (CE) n° 2150/2002 du Parlement européen et du Conseil du 25 novembre + 2002 relatif aux statistiques sur les déchets + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2006/21/oj"> + <skos:prefLabel xml:lang="en">2006/21/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2006/21/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2006/21/EC of the European Parliament and of the Council of 15 March + 2006 on the management of waste from extractive industries and amending Directive 2004/35/EC - Statement by + the European Parliament, the Council and the Commission + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2006/21/CE du Parlement européen et du Conseil du 15 mars 2006 + concernant la gestion des déchets de l'industrie extractive et modifiant la directive 2004/35/CE - + Déclaration du Parlement européen, du Conseil et de la Commission + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/1986/278/oj"> + <skos:prefLabel xml:lang="en">86/278/EEC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">86/278/EEC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Council Directive 86/278/EEC of 12 June 1986 on the protection of the environment, + and in particular of the soil, when sewage sludge is used in agriculture + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 86/278/CEE du Conseil du 12 juin 1986 relative à la protection de + l'environnement et notamment des sols, lors de l'utilisation des boues d'épuration en agriculture + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg_impl/2019/2180/oj"> + <skos:prefLabel xml:lang="en">2019/2180</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2019/2180</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Implementing Regulation (EU) 2019/2180 of 16 December 2019 specifying + the detailed arrangements and content for the quality reports pursuant to Regulation (EU) 2019/1700 of the + European Parliament and of the Council + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement d’Exécution (UE) 2019/2180 de la Commission du 16 décembre 2019 + spécifiant les modalités et le contenu détaillés pour les rapports de qualité au titre du règlement (UE) + 2019/1700 du Parlement européen et du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2019/1021/oj"> + <skos:prefLabel xml:lang="en">2019/1021</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2019/1021</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2019/1021 of the European Parliament and of the Council of 20 June + 2019 on persistent organic pollutants (recast) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2019/1021 du Parlement européen et du Conseil du 20 juin 2019 + concernant les polluants organiques persistants (refonte) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reco/2014/70/oj"> + <skos:prefLabel xml:lang="en">2014/70/EU</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2014/70/EU</skos:prefLabel> + <skos:scopeNote xml:lang="en">2014/70/EU: Commission Recommendation of 22 January 2014 on minimum principles for + the exploration and production of hydrocarbons (such as shale gas) using high-volume hydraulic fracturing + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">2014/70/UE: Recommandation de la Commission du 22 janvier 2014 relative aux + principes minimaux applicables à l’exploration et à la production d’hydrocarbures (tels que le gaz de + schiste) par fracturation hydraulique à grands volumes + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2006/7/oj"> + <skos:prefLabel xml:lang="en">2006/7/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2006/7/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2006/7/EC of the European Parliament and of the Council of 15 February + 2006 concerning the management of bathing water quality and repealing Directive 76/160/EEC + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2006/7/CE du Parlement européen et du Conseil du 15 février 2006 + concernant la gestion de la qualité des eaux de baignade et abrogeant la directive 76/160/CEE + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2000/60/oj"> + <skos:prefLabel xml:lang="en">2000/60/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2000/60/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2000/60/EC of the European Parliament and of the Council of 23 October + 2000 establishing a framework for Community action in the field of water policy + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2000/60/CE du Parlement européen et du Conseil du 23 octobre 2000 + établissant un cadre pour une politique communautaire dans le domaine de l'eau + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg_impl/2019/2181/oj"> + <skos:prefLabel xml:lang="en">2019/2181</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2019/2181</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Implementing Regulation (EU) 2019/2181 of 16 December 2019 specifying + technical characteristics as regards items common to several datasets pursuant to Regulation (EU) 2019/1700 + of the European Parliament and of the Council + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement d’exécution (UE) 2019/2181 de la Commission du 16 décembre 2019 + spécifiant les caractéristiques techniques en ce qui concerne les éléments communs à plusieurs ensembles de + données au titre du règlement (UE) 2019/1700 du Parlement européen et du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2006/118/oj"> + <skos:prefLabel xml:lang="en">2006/118/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2006/118/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2006/118/EC of the European Parliament and of the Council of 12 December + 2006 on the protection of groundwater against pollution and deterioration + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2006/118/CE du Parlement européen et du Conseil du 12 décembre 2006 sur + la protection des eaux souterraines contre la pollution et la détérioration + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2008/105/oj"> + <skos:prefLabel xml:lang="en">2008/105/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2008/105/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2008/105/EC of the European Parliament and of the Council of 16 December + 2008 on environmental quality standards in the field of water policy, amending and subsequently repealing + Council Directives 82/176/EEC, 83/513/EEC, 84/156/EEC, 84/491/EEC, 86/280/EEC and amending Directive + 2000/60/EC of the European Parliament and of the Council + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2008/105/CE du Parlement européen et du Conseil du 16 décembre 2008 + établissant des normes de qualité environnementale dans le domaine de l'eau, modifiant et abrogeant les + directives du Conseil 82/176/CEE, 83/513/CEE, 84/156/CEE, 84/491/CEE, 86/280/CEE et modifiant la directive + 2000/60/CE + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2007/60/oj"> + <skos:prefLabel xml:lang="en">2007/60/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2007/60/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2007/60/EC of the European Parliament and of the Council of 23 October + 2007 on the assessment and management of flood risks + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2007/60/CE du Parlement Européen et du Conseil du 23 octobre 2007 + relative à l’évaluation et à la gestion des risques d’inondation + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg_impl/2019/2242/oj"> + <skos:prefLabel xml:lang="en">2019/2242</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2019/2242</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Implementing Regulation (EU) 2019/2242 of 16 December 2019 specifying + the technical items of data sets, establishing the technical formats and specifying the detailed + arrangements and content of the quality reports on the organisation of a sample survey in the income and + living conditions domain pursuant to Regulation (EU) 2019/1700 of the European Parliament and of the Council + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement d’Exécution (UE) 2019/2242 de la Commission du 16 décembre 2019 + spécifiant les éléments techniques des ensembles de données, établissant les formats techniques et + spécifiant les modalités et le contenu détaillés des rapports de qualité concernant l’organisation d’une + enquête par sondage dans le domaine du revenu et des conditions de vie au titre du règlement (UE) 2019/1700 + du Parlement européen et du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2008/56/oj"> + <skos:prefLabel xml:lang="en">2008/56/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2008/56/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2008/56/EC of the European Parliament and of the Council of 17 June 2008 + establishing a framework for community action in the field of marine environmental policy (Marine Strategy + Framework Directive) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2008/56/CE du Parlement Européen et du Conseil du 17 juin 2008 + établissant un cadre d’action communautaire dans le domaine de la politique pour le milieu marin + (directive-cadre stratégie pour le milieu marin) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2016/792/oj"> + <skos:prefLabel xml:lang="en">2016/792</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2016/792</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2016/792 of the European Parliament and of the Council of 11 May + 2016 on harmonised indices of consumer prices and the house price index, and repealing Council Regulation + (EC) No 2494/95 + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2016/792 du Parlement européen et du Conseil du 11 mai 2016 relatif + aux indices des prix à la consommation harmonisés et à l'indice des prix des logements, et abrogeant le + règlement (CE) n° 2494/95 du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2013/1260/oj"> + <skos:prefLabel xml:lang="en">1260/2013</skos:prefLabel> + <skos:prefLabel xml:lang="fr">1260/2013</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) No 1260/2013 of the European Parliament and of the Council of 20 + November 2013 on European demographic statistics + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) n ° 1260/2013 du Parlement européen et du Conseil du 20 novembre + 2013 relatif aux statistiques démographiques européennes + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2005/44/oj"> + <skos:prefLabel xml:lang="en">2005/44/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2005/44/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2005/44/EC of the European Parliament and of the Council of 7 September + 2005 on harmonised river information services (RIS) on inland waterways in the Community + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2005/44/CE du Parlement européen et du Conseil du 7 septembre 2005 + relative à des services d'information fluviale (SIF) harmonisés sur les voies navigables communautaires + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg_impl/2020/1197/oj"> + <skos:prefLabel xml:lang="en">2020/1197</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2020/1197</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Implementing Regulation (EU) 2020/1197 of 30 July 2020 laying down + technical specifications and arrangements pursuant to Regulation (EU) 2019/2152 of the European Parliament + and of the Council on European business statistics repealing 10 legal acts in the field of business + statistics + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement d’exécution (UE) 2020/1197 de la Commission du 30 juillet 2020 + établissant des spécifications techniques et des modalités d’exécution en application du règlement (UE) + 2019/2152 du Parlement européen et du Conseil relatif aux statistiques européennes d’entreprises, abrogeant + dix actes juridiques dans le domaine des statistiques d’entreprises + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2019/2152/oj"> + <skos:prefLabel xml:lang="en">2019/2152</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2019/2152</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2019/2152 of the European Parliament and of the Council of 27 + November 2019 on European business statistics, repealing 10 legal acts in the field of business statistics + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2019/2152 du Parlement européen et du Conseil du 27 novembre 2019 + relatif aux statistiques européennes d’entreprises, abrogeant dix actes juridiques dans le domaine des + statistiques d’entreprises + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2013/34/oj"> + <skos:prefLabel xml:lang="en">2013/34/EU</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2013/34/EU</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2013/34/EU of the European Parliament and of the Council of 26 June 2013 + on the annual financial statements, consolidated financial statements and related reports of certain types + of undertakings, amending Directive 2006/43/EC of the European Parliament and of the Council and repealing + Council Directives 78/660/EEC and 83/349/EEC + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2013/34/UE du Parlement européen et du Conseil du 26 juin 2013 relative + aux états financiers annuels, aux états financiers consolidés et aux rapports y afférents de certaines + formes d'entreprises, modifiant la directive 2006/43/CE du Parlement européen et du Conseil et abrogeant les + directives 78/660/CEE et 83/349/CEE du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2011/691/oj"> + <skos:prefLabel xml:lang="en">691/2011</skos:prefLabel> + <skos:prefLabel xml:lang="fr">691/2011</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) No 691/2011 of the European Parliament and of the Council of 6 + July 2011 on European environmental economic accounts + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) n ° 691/2011 du Parlement européen et du Conseil du 6 juillet 2011 + relatif aux comptes économiques européens de l’environnement + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2019/1700/oj"> + <skos:prefLabel xml:lang="en">2019/1700</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2019/1700</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2019/1700 of the European Parliament and of the Council of 10 + October 2019 establishing a common framework for European statistics relating to persons and households, + based on data at individual level collected from samples, amending Regulations (EC) No 808/2004, (EC) No + 452/2008 and (EC) No 1338/2008 of the European Parliament and of the Council, and repealing Regulation (EC) + No 1177/2003 of the European Parliament and of the Council and Council Regulation (EC) No 577/98 + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2019/1700 du Parlement européen et du Conseil du 10 octobre 2019 + établissant un cadre commun pour des statistiques européennes relatives aux personnes et aux ménages fondées + sur des données au niveau individuel collectées à partir d’échantillons, modifiant les règlements (CE) no + 808/2004, (CE) no 452/2008 et (CE) no 1338/2008 du Parlement européen et du Conseil, et abrogeant le + règlement (CE) no 1177/2003 du Parlement européen et du Conseil et le règlement (CE) no 577/98 du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2013/549/oj"> + <skos:prefLabel xml:lang="en">549/2013</skos:prefLabel> + <skos:prefLabel xml:lang="fr">549/2013</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) No 549/2013 of the European Parliament and of the Council of 21 + May 2013 on the European system of national and regional accounts in the European Union + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) n ° 549/2013 du Parlement européen et du Conseil du 21 mai 2013 + relatif au système européen des comptes nationaux et régionaux dans l'Union européenne + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2007/2/oj"> + <skos:prefLabel xml:lang="en">2007/2/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2007/2/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2007/2/EC of the European Parliament and of the Council of 14 March 2007 + establishing an Infrastructure for Spatial Information in the European Community (INSPIRE) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2007/2/CE du Parlement européen et du Conseil du 14 mars 2007 + établissant une infrastructure d'information géographique dans la Communauté européenne (INSPIRE) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2018/1999/oj"> + <skos:prefLabel xml:lang="en">2018/1999</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2018/1999</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2018/1999 of the European Parliament and of the Council of 11 + December 2018 on the Governance of the Energy Union and Climate Action, amending Regulations (EC) No + 663/2009 and (EC) No 715/2009 of the European Parliament and of the Council, Directives 94/22/EC, 98/70/EC, + 2009/31/EC, 2009/73/EC, 2010/31/EU, 2012/27/EU and 2013/30/EU of the European Parliament and of the Council, + Council Directives 2009/119/EC and (EU) 2015/652 and repealing Regulation (EU) No 525/2013 of the European + Parliament and of the Council + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2018/1999 du Parlement européen et du Conseil du 11 décembre 2018 + sur la gouvernance de l'union de l'énergie et de l'action pour le climat, modifiant les règlements (CE) n° + 663/2009 et (CE) n° 715/2009 du Parlement européen et du Conseil, les directives 94/22/CE, 98/70/CE, + 2009/31/CE, 2009/73/CE, 2010/31/UE, 2012/27/UE et 2013/30/UE du Parlement européen et du Conseil, les + directives 2009/119/CE et (UE) 2015/652 du Conseil et abrogeant le règlement (UE) n° 525/2013 du Parlement + européen et du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2009/1005/oj"> + <skos:prefLabel xml:lang="en">1005/2009</skos:prefLabel> + <skos:prefLabel xml:lang="fr">1005/2009</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EC) No 1005/2009 of the European Parliament and of the Council of 16 + September 2009 on substances that deplete the ozone layer (recast) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (CE) n o 1005/2009 du Parlement européen et du Conseil du 16 septembre + 2009 relatif à des substances qui appauvrissent la couche d’ozone (refonte) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2009/479/oj"> + <skos:prefLabel xml:lang="en">479/2009</skos:prefLabel> + <skos:prefLabel xml:lang="fr">479/2009</skos:prefLabel> + <skos:scopeNote xml:lang="en">Council Regulation (EC) No 479/2009 of 25 May 2009 on the application of the + Protocol on the excessive deficit procedure annexed to the Treaty establishing the European Community + (Codified version) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (CE) n o 479/2009 du Conseil du 25 mai 2009 relatif à l’application du + protocole sur la procédure concernant les déficits excessifs annexé au traité instituant la Communauté + européenne (version codifiée) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2006/166/oj"> + <skos:prefLabel xml:lang="en">166/2006</skos:prefLabel> + <skos:prefLabel xml:lang="fr">166/2006</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EC) No 166/2006 of the European Parliament and of the Council of 18 + January 2006 concerning the establishment of a European Pollutant Release and Transfer Register and amending + Council Directives 91/689/EEC and 96/61/EC + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (CE) n o 166/2006 du Parlement européen et du Conseil du 18 janvier 2006 + concernant la création d'un registre européen des rejets et des transferts de polluants, et modifiant les + directives 91/689/CEE et 96/61/CE du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2004/109/oj"> + <skos:prefLabel xml:lang="en">2004/109/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2004/109/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2004/109/EC of the European Parliament and of the Council of 15 December + 2004 on the harmonisation of transparency requirements in relation to information about issuers whose + securities are admitted to trading on a regulated market and amending Directive 2001/34/EC + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2004/109/CE du Parlement européen et du Conseil du 15 décembre 2004 sur + l'harmonisation des obligations de transparence concernant l'information sur les émetteurs dont les valeurs + mobilières sont admises à la négociation sur un marché réglementé et modifiant la directive 2001/34/CE + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2017/852/oj"> + <skos:prefLabel xml:lang="en">2017/852</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2017/852</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2017/852 of the European Parliament and of the Council of 17 May + 2017 on mercury, and repealing Regulation (EC) No 1102/2008 + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2017/852 du Parlement européen et du Conseil du 17 mai 2017 relatif + au mercure et abrogeant le règlement (CE) n° 1102/2008 + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2008/1338/oj"> + <skos:prefLabel xml:lang="en">1338/2008</skos:prefLabel> + <skos:prefLabel xml:lang="fr">1338/2008</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EC) No 1338/2008 of the European Parliament and of the Council of 16 + December 2008 on Community statistics on public health and health and safety at work + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (CE) n o 1338/2008 du Parlement européen et du Conseil du 16 décembre + 2008 relatif aux statistiques communautaires de la santé publique et de la santé et de la sécurité au + travail + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2016/2284/oj"> + <skos:prefLabel xml:lang="en">2016/2284</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2016/2284</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive (EU) 2016/2284 of the European Parliament and of the Council of 14 + December 2016 on the reduction of national emissions of certain atmospheric pollutants, amending Directive + 2003/35/EC and repealing Directive 2001/81/EC + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive (EU) 2016/2284 du Parlement européen et du Conseil du 14 décembre 2016 + concernant la réduction des émissions nationales de certains polluants atmosphériques, modifiant la + directive 2003/35/CE et abrogeant la directive 2001/81/CE + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2009/147/oj"> + <skos:prefLabel xml:lang="en">2009/147/EC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2009/147/EC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2009/147/EC of the European Parliament and of the Council of 30 November + 2009 on the conservation of wild birds (Codified version) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2009/147/CE du Parlement européen et du Conseil du 30 novembre 2009 + concernant la conservation des oiseaux sauvages (Version codifiée) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2014/1143/oj"> + <skos:prefLabel xml:lang="en">1143/2014</skos:prefLabel> + <skos:prefLabel xml:lang="fr">1143/2014</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) No 1143/2014 of the European Parliament and of the Council of 22 + October 2014 on the prevention and management of the introduction and spread of invasive alien species + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) n ° 1143/2014 du Parlement européen et du Conseil du 22 octobre + 2014 relatif à la prévention et à la gestion de l'introduction et de la propagation des espèces exotiques + envahissantes + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2010/75/oj"> + <skos:prefLabel xml:lang="en">2010/75/EU</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2010/75/EU</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2010/75/EU of the European Parliament and of the Council of 24 November + 2010 on industrial emissions (integrated pollution prevention and control) (recast) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2010/75/UE du Parlement européen et du Conseil du 24 novembre 2010 + relative aux émissions industrielles (prévention et réduction intégrées de la pollution) (refonte) + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2012/18/oj"> + <skos:prefLabel xml:lang="en">2012/18/EU</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2012/18/EU</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive 2012/18/EU of the European Parliament and of the Council of 4 July 2012 + on the control of major-accident hazards involving dangerous substances, amending and subsequently repealing + Council Directive 96/82/EC + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 2012/18/UE du Parlement européen et du Conseil du 4 juillet 2012 + concernant la maîtrise des dangers liés aux accidents majeurs impliquant des substances dangereuses, + modifiant puis abrogeant la directive 96/82/CE du Conseil + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg/2021/2116/oj"> + <skos:prefLabel xml:lang="en">2021/2116/EU</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2021/2116/EU</skos:prefLabel> + <skos:scopeNote xml:lang="en">Regulation (EU) 2021/2116 of the European Parliament and of the Council of 2 + December 2021 on the financing, management and monitoring of the common agricultural policy and repealing + Regulation (EU) No 1306/2013 + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement (UE) 2021/2116 du Parlement européen et du Conseil du 2 décembre 2021 + relatif au financement, à la gestion et au suivi de la politique agricole commune et abrogeant le règlement + (UE) no 1306/2013 + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/reg_del/2022/1172/oj"> + <skos:prefLabel xml:lang="en">2022/1172/EU</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2022/1172/EU</skos:prefLabel> + <skos:scopeNote xml:lang="en">Commission Delegated Regulation (EU) 2022/1172 of 4 May 2022 supplementing + Regulation (EU) 2021/2116 of the European Parliament and of the Council with regard to the integrated + administration and control system in the common agricultural policy and the application and calculation of + administrative penalties for conditionality + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Règlement délégué (UE) 2022/1172 de la Commission du 4 mai 2022 complétant le + règlement (UE) 2021/2116 du Parlement européen et du Conseil en ce qui concerne le système intégré de + gestion et de contrôle lié à la politique agricole commune et l’application et le calcul des sanctions + administratives en matière de conditionnalité + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/1991/271/oj"> + <skos:prefLabel xml:lang="en">91/271/EEC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">91/271/EEC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Council Directive 91/271/EEC of 21 May 1991 concerning urban waste-water + treatment + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 91/271/CEE du Conseil, du 21 mai 1991, relative au traitement des eaux + urbaines résiduaires + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/1991/676/oj"> + <skos:prefLabel xml:lang="en">91/676/EEC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">91/676/EEC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Council Directive 91/676/EEC of 12 December 1991 concerning the protection of + waters against pollution caused by nitrates from agricultural sources + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 91/676/CEE du Conseil, du 12 décembre 1991, concernant la protection des + eaux contre la pollution par les nitrates à partir de sources agricoles + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/1992/43/oj"> + <skos:prefLabel xml:lang="en">92/43/EEC</skos:prefLabel> + <skos:prefLabel xml:lang="fr">92/43/EEC</skos:prefLabel> + <skos:scopeNote xml:lang="en">Council Directive 92/43/EEC of 21 May 1992 on the conservation of natural habitats + and of wild fauna and flora + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive 92/43/CEE du Conseil, du 21 mai 1992, concernant la conservation des + habitats naturels ainsi que de la faune et de la flore sauvages + </skos:scopeNote> + </skos:Concept> + <skos:Concept rdf:about="http://data.europa.eu/eli/dir/2020/2184/oj"> + <skos:prefLabel xml:lang="en">2020/2184</skos:prefLabel> + <skos:prefLabel xml:lang="fr">2020/2184</skos:prefLabel> + <skos:scopeNote xml:lang="en">Directive (EU) 2020/2184 of the European Parliament and of the Council of 16 + December 2020 on the quality of water intended for human consumption (recast) + </skos:scopeNote> + <skos:scopeNote xml:lang="fr">Directive (UE) 2020/2184 du Parlement européen et du Conseil du 16 décembre 2020 + relative à la qualité des eaux destinées à la consommation humaine (refonte) + </skos:scopeNote> + </skos:Concept> +</rdf:RDF> diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/high-value-dataset-category.rdf b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/high-value-dataset-category.rdf new file mode 100644 index 00000000000..59c469d468b --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-hvd/vocabularies/high-value-dataset-category.rdf @@ -0,0 +1,315 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rdf:RDF + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + + <rdf:Description rdf:about="http://data.europa.eu/bna/asd487ae75"> + <startDate xmlns="http://publications.europa.eu/ontology/euvoc#" + rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2019-07-06 + </startDate> + <created xmlns="http://purl.org/dc/terms/" rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2023-09-05</created> + <issued xmlns="http://purl.org/dc/terms/" rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2023-09-27</issued> + <modified xmlns="http://purl.org/dc/terms/" rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2023-09-07 + </modified> + <title xmlns="http://purl.org/dc/terms/" xml:lang="en">High-value dataset categories + + High-value dataset categories + 1.0 + + + + 2019-07-06 + + 2023-09-05 + 2023-09-13 + + + Метеорологични данни + Meteorologie + Meteorologiske data + Meteorologie + Μετεωρολογικές πληροφορίες + Meteorological + Meteorología + Meteoroloogiateave + Säätiedot + Météorologiques + Meitéareolaíoch + Meteorološki podatci + Meteorológiai adatok + Dati meteorologici + Meteorologiniai duomenys + Meteoroloģijas datu kopas + Data meteoroloġika + Meteorologische data + Dane meteorologiczne + Meteorológicas + Domeniul meteorologic + Meteorológia + Meteorološki podatki + Meteorologiska data + 3 + + data sets as described in Commission + Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use, Annex, Section 3 + + + + + + + 2019-07-06 + + 2023-09-05 + 2023-09-13 + + + Дружества и собственост на дружествата + + Společnosti a vlastnictví společností + + Virksomheder og virksomhedsejerskab + + Unternehmen und Eigentümerschaft von + Unternehmen + + Εταιρείες και ιδιοκτησιακό καθεστώς + εταιρειών + + Companies and company ownership + Sociedades y propiedad de sociedades + + Äriühingud ja äriühingu omandisuhted + + Yritys- ja yritysten omistustiedot + Entreprises et propriété d'entreprises + + Cuideachtaí agus úinéireacht cuideachtaí + + Trgovačka društva i vlasništvo nad trgovačkim + društvima + + Vállalati és vállalattulajdonosi adatok + + Dati relativi alle imprese e alla proprietà + delle imprese + + Bendrovės ir bendrovių valdymas nuosavybės + teise + + Uzņēmumi un uzņēmumu īpašumtiesības + + Data dwar il-kumpanniji u l-proprjetà + tal-kumpanniji + + Bedrijven en eigendom van bedrijven + + Dane dotyczące przedsiębiorstw i ich + własności + + Empresas e propriedade de empresas + Domeniul Societăți și structura de proprietate + a societăților + + Spoločnosti a vlastníctvo spoločností + + Družbe in lastništvo družb + Företag och företagsägande + 5 + + data sets as described in Commission + Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use, Annex, Section 5 + + + + + + + 2019-07-06 + + 2023-09-05 + 2023-09-13 + + + Геопространствени данни + Geoprostorové údaje + Geospatiale data + Georaum + Γεωχωρικές πληροφορίες + Geospatial + Geoespacial + Georuumilised andmed + Paikkatiedot + Géospatiales + Geospásúil + Geoprostorni podatci + Térinformatikai adatok + Dati geospaziali + Geoerdviniai duomenys + Ģeotelpisko datu kopas + Data ġeospazjali + Geospatiale data + Dane geoprzestrzenne + Geoespaciais + Domeniul geospațial + Geopriestorové údaje + Geoprostorski podatki + Geospatiala data + 1 + + data sets as described in Commission + Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use, Annex, Section 1 + + + + + + + 2019-07-06 + + 2023-09-05 + 2023-09-13 + + + Мобилност + Mobilita + Mobilitet + Mobilität + Κινητικότητα + Mobility + Movilidad + Liikuvus + Liikkuvuustiedot + Mobilité + Soghluaisteacht + Mobilnost + Mobilitási adatok + Dati relativi alla mobilità + Judumas + Mobilitāte + Data dwar il-mobbiltà + Mobiliteit + Dane dotyczące mobilności + Mobilidade + Domeniul Mobilitate + Mobilita + Mobilnost + Rörlighet + 6 + + data sets as described in Commission + Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use, Annex, Section 6 + + + + + + + 2019-07-06 + + 2023-09-05 + 2023-09-13 + + + Наблюдение на Земята и околната среда + + Země a životní prostředí + Jordobservation og miljø + Erdbeobachtung und Umwelt + Γεωσκόπηση και περιβάλλον + Earth observation and environment + Observación de la Tierra y medio ambiente + + Maa seire ja keskkond + Maan havainnointi ja ympäristö + Observation de la terre et environnement + + Faire na cruinne agus an comhshaol + Promatranje Zemlje i okoliš + Földmegfigyelési és környezeti adatok + + Dati relativi all'osservazione della terra e + all'ambiente + + Žemės stebėjimas ir aplinka + Zemes novērošana un vide + Data dwar l-osservazzjoni tad-dinja u + l-ambjent + + Aardobservatie en milieu + Dane dotyczące obserwacji Ziemi i środowiska + + Observação da Terra e do ambiente + Domeniul Observarea Pământului și mediu + + Pozorovanie Zeme a životné prostredie + + Opazovanje zemlje in okolje + Jordobservation och miljö + 2 + + data sets as described in Commission + Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use, Annex, Section 2 + + + + + + + 2019-07-06 + + 2023-09-05 + 2023-09-13 + + + Статистика + Statistika + Statistik + Statistik + Στατιστικές + Statistics + Estadística + Statistika + Tilastotiedot + Statistiques + Staidreamh + Statistički podatci + Statisztikák + Dati statistici + Statistika + Statistika + Data statistika + Statistiek + Dane statystyczne + Estatísticas + Domeniul statistic + Štatistika + Statistični podatki + Statistik + 4 + + data sets as described in Commission + Implementing Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use, Annex, Section 4 + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core-distribution.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core-distribution.xsl new file mode 100644 index 00000000000..3987315744b --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core-distribution.xsl @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core.xsl new file mode 100644 index 00000000000..66509009a7d --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/mobility-dcat-ap-core.xsl @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/view.xsl new file mode 100644 index 00000000000..645740ba123 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap-mobility/view.xsl @@ -0,0 +1,23 @@ + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core-dataset.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core-dataset.xsl new file mode 100644 index 00000000000..7985121d7d5 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core-dataset.xsl @@ -0,0 +1,302 @@ + + + + + + + + + + http://inspire.ec.europa.eu/theme/af + farming + + + http://inspire.ec.europa.eu/theme/cp + http://inspire.ec.europa.eu/theme/lu + http://inspire.ec.europa.eu/theme/mr + http://inspire.ec.europa.eu/theme/pf + economy + planningCadastre + + + + http://inspire.ec.europa.eu/theme/er + http://inspire.ec.europa.eu/theme/mr + + + http://inspire.ec.europa.eu/theme/hy + http://inspire.ec.europa.eu/theme/ps + http://inspire.ec.europa.eu/theme/lc + http://inspire.ec.europa.eu/theme/am + http://inspire.ec.europa.eu/theme/ac + http://inspire.ec.europa.eu/theme/br + http://inspire.ec.europa.eu/theme/ef + http://inspire.ec.europa.eu/theme/hb + http://inspire.ec.europa.eu/theme/lu + http://inspire.ec.europa.eu/theme/mr + http://inspire.ec.europa.eu/theme/nz + http://inspire.ec.europa.eu/theme/of + http://inspire.ec.europa.eu/theme/sr + http://inspire.ec.europa.eu/theme/so + http://inspire.ec.europa.eu/theme/sd + http://inspire.ec.europa.eu/theme/mf + biota + environment + inlandWaters + oceans + climatologyMeteorologyAtmosphere + + + http://inspire.ec.europa.eu/theme/au + http://inspire.ec.europa.eu/theme/us + + + http://inspire.ec.europa.eu/theme/hh + health + + + + + + http://inspire.ec.europa.eu/theme/ad + http://inspire.ec.europa.eu/theme/rs + http://inspire.ec.europa.eu/theme/gg + http://inspire.ec.europa.eu/theme/cp + http://inspire.ec.europa.eu/theme/gn + http://inspire.ec.europa.eu/theme/el + http://inspire.ec.europa.eu/theme/ge + http://inspire.ec.europa.eu/theme/oi + http://inspire.ec.europa.eu/theme/bu + planningCadastre + boundaries + elevation + imageryBaseMapsEarthCover + + + http://inspire.ec.europa.eu/theme/pd + http://inspire.ec.europa.eu/theme/su + location + society + disaster + intelligenceMilitary + extraTerrestrial + + + http://inspire.ec.europa.eu/theme/hy + http://inspire.ec.europa.eu/theme/ge + http://inspire.ec.europa.eu/theme/oi + http://inspire.ec.europa.eu/theme/mf + geoscientificInformation + + + http://inspire.ec.europa.eu/theme/tn + structure + transportation + utilitiesCommunication + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core.xsl new file mode 100644 index 00000000000..c566e2a76d7 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/eu-dcat-ap-core.xsl @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/view.xsl new file mode 100644 index 00000000000..360c114b099 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/view.xsl @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/vocabularies/data-theme-skos.rdf b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/vocabularies/data-theme-skos.rdf new file mode 100644 index 00000000000..78aa07048dd --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-dcat-ap/vocabularies/data-theme-skos.rdf @@ -0,0 +1,546 @@ + + + + Data theme + Data theme + 20220715-0 + Data theme + + + Селско стопанство, рибарство, горско стопанство и храни + Zemědělství, rybolov, lesnictví a výživa + Landbrug, fiskeri, skovbrug og fødevarer + Landwirtschaft, Fischerei, Forstwirtschaft und Nahrungsmittel + Γεωργία, αλιεία, δασοκομία και τρόφιμα + Agriculture, fisheries, forestry and food + Agricultura, pesca, silvicultura y alimentación + Põllumajandus, kalandus, metsandus ja toiduained + Maatalous, kalastus, metsätalous ja elintarvikkeet + Agriculture, pêche, sylviculture et alimentation + Talmhaíocht, iascach, foraoiseacht agus bia + Poljoprivreda, ribarstvo, šumarstvo i hrana + Mezőgazdaság, halászat, erdészet és élelmiszer + Agricoltura, pesca, silvicoltura e prodotti alimentari + Žemės ūkis, žuvininkystė, miškininkystė ir maistas + Lauksaimniecība, zivsaimniecība, mežsaimniecība un pārtika + Agrikoltura, sajd, forestrija u ikel + Jordbruk, fiskeri, skogbruk og mat + Landbouw, visserij, bosbouw en voeding + Jordbruk, fiskeri, skogbruk og mat + Jordbruk, fiskeri, skogbruk og mat + Rolnictwo, rybołówstwo, leśnictwo i żywność + Agricultura, pesca, silvicultura e alimentação + Agricultură, pescuit, silvicultură şi hrană + Poľnohospodárstvo, rybné hospodárstvo, lesníctvo a potravinárstvo + Kmetijstvo, ribištvo, gozdarstvo in prehrana + Jordbruk, fiske, skogsbruk och livsmedel + AGRI + AGRI + 2015-10-01 + AGRI + AGRI + This concept identifies datasets covering such domains as agriculture, fisheries, forestry or food. Agriculture is the science and art of cultivating plants and livestock. Fisheries are activities leading to harvesting of fish; may involve capture of wild fish or raising of fish through aquaculture. Forestry is the science and craft of creating, managing, using, conserving and repairing forests, woodlands and associated resources for human and environmental benefits. Food is any substance consumed to provide nutritional support for an organism. Dataset examples: Agricultural and Vegetable Catalogue; The Community Fishing Fleet Register; Pan-European Map of Forest Biomass Increment; Food composition database for nutrient intake: selected vitamins and minerals in selected European countries. + + + + + Икономика и финанси + Hospodářství a finance + Økonomi og finanser + Wirtschaft und Finanzen + Οικονομία και χρηματοοικονομικά θέματα + Economy and finance + Economía y finanzas + Majandus ja rahandus + Talous ja raha-asiat + Économie et finances + Geilleagar agus airgeadas + Ekonomija i financije + Gazdaság és pénzügy + Economia e finanze + Ekonomika ir finansai + Ekonomika un finanses + Ekonomija u finanzi + Økonomi og finans + Economie en financiën + Økonomi og finans + Økonomi og finans + Gospodarka i finanse + Economia e finanças + Economie şi finanţe + Hospodárstvo a financie + Gospodarstvo in finance + Ekonomi och finans + ECON + ECON + 2015-10-01 + ECON + ECON + This concept identifies datasets covering such domains as economy or finance. Economy is the area of the production, distribution and trade, as well as consumption of goods and services by different agents. In its broadest sense, the economy is defined as a social domain that emphasize the practices, discourses and material expressions associated with the production, use, and management of resources. Finance is the study of money and how it is used. Specifically, it deals with the questions of how an individual, company or government acquires the money needed and how they then spend or invest that money. Dataset examples: Tenders Electronic Daily (TED) - public procurement notices from the EU and beyond; General government deficit (-) and surplus (+) - quarterly data. + + + + + Образование, култура и спорт + Vzdělávání, kultura a sport + Uddannelse, kultur og sport + Bildung, Kultur und Sport + Παιδεία, πολιτιστικά θέματα και αθλητισμός + Education, culture and sport + Educación, cultura y deportes + Haridus, kultuur ja sport + Koulutus, kulttuuri ja urheilu + Éducation, culture et sport + Oideachas, cultúr agus spórt + Obrazovanje, kultura i sport + Oktatás, kultúra és sport + Istruzione, cultura e sport + Švietimas, kultūra ir sportas + Izglītība, kultūra un sports + Edukazzjoni, kultura u sport + Utdanning, kultur og sport + Onderwijs, cultuur en sport + Utdanning, kultur og sport + Utdanning, kultur og sport + Edukacja, kultura i sport + Educação, cultura e desporto + Educaţie, cultură şi sport + Vzdelávanie, kultúra a šport + Izobraževanje, kultura in šport + Utbildning, kultur och sport + EDUC + EDUC + 2015-10-01 + EDUC + EDUC + This concept identifies datasets covering such domains as education, culture or sport. Education is the process of facilitating learning, or the acquisition of knowledge, skills, values, beliefs and habits. Culture encompasses the social behavior and norms found in human societies, as well as the knowledge, beliefs, arts, laws, customs, capabilities and habits of the individuals in these groups. Sport includes all forms of competitive physical activity or games which maintain or improve physical ability and skills while providing enjoyment to participants, and in some cases, entertainment for spectators. Dataset examples: European Skills, Competences, Qualifications and Occupations (ESCO); EU Member States and international human rights obligations; Participation in any cultural or sport activities in the last 12 months by sex, age and educational attainment level. + + + + + Енергетика + Energie + Energi + Energie + Ενέργεια + Energy + Energía + Energeetika + Energia + Énergie + Fuinneamh + Energetika + Energia + Energia + Energetika + Enerģētika + Enerġija + Energi + Energie + Energi + Energi + Energia + Energia + Energie + Energetika + Energetika + Energi + ENER + ENER + 2015-10-01 + ENER + ENER + This concept identifies datasets covering the domain of energy. Energy is the quantitative property that must be transferred to an object in order to perform work on, or to heat, the object. Living organisms require energy to stay alive; human civilisation requires energy to function. Dataset examples: European gas market reports; Electricity prices by type of user. + + + + + Околна среда + Životní prostředí + Miljø + Umwelt + Περιβάλλον + Environment + Medio ambiente + Keskkond + Ympäristö + Environnement + Comhshaol + Okoliš + Környezet + Ambiente + Aplinka + Vide + Ambjent + Miljø + Milieu + Miljø + Miljø + Środowisko + Ambiente + Mediu + Životné prostredie + Okolje + Miljö + ENVI + ENVI + 2015-10-01 + ENVI + ENVI + This concept identifies datasets covering the domain of environment. The natural environment encompasses the interaction of all living species, climate, weather and natural resources that affect human survival and economic activity. Dataset examples: Attitudes of European citizens towards the environment; Pollutant emissions from transport. + + + + + Правителство и публичен сектор + Vláda a veřejný sektor + Regeringen og den offentlige sektor + Regierung und öffentlicher Sektor + Κυβέρνηση και δημόσιος τομέας + Government and public sector + Gobierno y sector público + Valitsus ja avalik sektor + Valtioneuvosto ja julkinen sektori + Gouvernement et secteur public + Rialtas agus earnáil phoiblí + Vlada i javni sektor + Kormányzat és közszféra + Governo e settore pubblico + Vyriausybė ir viešasis sektorius + Valdība un sabiedriskais sektors + Gvern u settur pubbliku + Forvaltning og offentlig sektor + Overheid en publieke sector + Forvaltning og offentleg sektor + Forvaltning og offentlig sektor + Rząd i sektor publiczny + Governo e setor público + Guvern şi sector public + Vláda a verejný sektor + Vlada in javni sektor + Regeringen och den offentliga sektorn + GOVE + GOVE + 2015-10-01 + GOVE + GOVE + This concept identifies datasets covering such domains as government or public sector. A government is the system or group of people governing an organised community, often a state. The public sector is the part of the economy composed of both public services and public enterprises. Public sector services and enterprises can be controlled by central government, regional or local authorities. Organisations that are not part of the public sector are either a part of the private sector or voluntary sector. Dataset examples: Candidate countries and potential candidates: Government statistics; Transparency Register. + + + + + Здраве + Zdraví + Sundhed + Gesundheit + Υγεία + Health + Salud + Tervis + Terveys + Santé + Sláinte + Zdravlje + Egészségügy + Salute + Sveikata + Veselība + Saħħa + Helse + Gezondheid + Helse + Helse + Zdrowie + Saúde + Sănătate + Zdravotníctvo + Zdravje + Hälsa + HEAL + HEAL + 2015-10-01 + HEAL + HEAL + This concept identifies datasets covering the domain of health. Health is a state of physical, mental and social well-being in which disease and infirmity are absent. Dataset examples: COVID-19 Coronavirus data; European Cancer Information System. + + + + + Международни въпроси + Mezinárodní otázky + Internationale spørgsmål + Internationale Themen + Διεθνή θέματα + International issues + Asuntos internacionales + Rahvusvahelised küsimused + Kansainväliset kysymykset + Questions internationales + Saincheisteanna idirnáisiúnta + Međunarodni pitanja + Nemzetközi ügyek + Tematiche internazionali + Tarptautiniai klausimai + Starptautiski jautājumi + Kwistjonijiet internazzjonali + Internasjonale temaer + Internationale vraagstukken + Internasjonale tema + Internasjonale temaer + Kwestie międzynarodowe + Questões internacionais + Chestiuni internaționale + Medzinárodné otázky + Mednarodna vprašanja + Internationella frågor + INTR + INTR + 2015-10-01 + INTR + INTR + This concept identifies datasets covering the domain of international issues. An issue – important topic or problem for debate or discussion – is international when the participants represent at least two countries. Dataset examples: Consolidated list of persons, groups and entities subject to EU financial sanctions; European Commission — DG DEVCO – development and humanitarian assistance to Afghanistan. + + + + + Правосъдие, съдебна система и обществена безопасност + Spravedlnost, právní systém a veřejná bezpečnost + Retfærdighed, retssystem og offentlig sikkerhed + Justiz, Rechtssystem und öffentliche Sicherheit + Δικαιoσύνη, νομικό σύστημα και δημόσια ασφάλεια + Justice, legal system and public safety + Justicia, sistema judicial y seguridad pública + Õigusemõistmine, õigussüsteem ja avalik turvalisus + Oikeus, oikeusjärjestelmä ja yleinen turvallisuus + Justice, système juridique et sécurité publique + Ceartas, córas dlí agus sábháilteacht an phobail + Pravosuđe, pravni sustav i javna sigurnost + Igazságügy, jogrendszer és közbiztonság + Giustizia, sistema giuridico e sicurezza pubblica + Teisingumas, teisės sistema ir visuomenės sauga + Tieslietas, tiesību sistēma un sabiedrības drošība + Ġustizzja, sistema legali u sigurtà pubblika + Justis, rettssystem og allmenn sikkerhet + Justitie, rechtsstelsel en openbare veiligheid + Justis, rettssystem og allmenn tryggleik + Justis, rettssystem og allmenn sikkerhet + Sprawiedliwość, ustrój sądów i bezpieczeństwo publiczne + Justiça, sistema judiciário e segurança pública + Justiție, sistem juridic și siguranță publică + Spravodlivosť, právny systém a verejná bezpečnosť + Pravosodje, pravni sistem in javna varnost + Rättvisa, rättsliga system och allmän säkerhet + JUST + JUST + 2015-10-01 + JUST + JUST + This concept identifies datasets covering such domains as justice, legal system or public safety. Justice includes both the attainment of that which is just and the philosophical discussion of that which is just; here it mainly means the procedural justice as found in the study and application of the law. The contemporary legal systems of the world are generally based on one of four basic systems: civil law, common law, statutory law, religious law or combinations of these. Public safety is the function of governments which ensures the protection of citizens, persons in their territory, organisations and institutions against threats to their well-being – and to the prosperity of their communities. Dataset examples: EU case-law; Information on Member States Law; European Data Protection Supervisor register of processing operations. + + + + + Неокончателни данни + Předběžné údaje + Midlertidige data + Vorläufige Daten + Προσωρινά δεδομένα + Provisional data + Datos provisionales + Esialgsed andmed + Alustavat tiedot + Données provisoires + Sonraí sealadacha + Privremeni podaci + Ideiglenes adatok + Dati provvisori + Laikinieji duomenys + Provizoriski dati + Dejta provviżorja + Voorlopige gegevens + Dane tymczasowe + Dados provisórios + Date provizorii + Predbežné údaje + Začasni podatki + Tillfälliga uppgifter + OP_DATPRO + OP_DATPRO + 1952-07-23 + OP_DATPRO + OP_DATPRO + + + + + Региони и градове + Regiony a města + Regioner og byer + Regionen und Städte + Περιφέρειες και πόλεις + Regions and cities + Regiones y ciudades + Piirkonnad ja linnad + Alueet ja kaupungit + Régions et villes + Réigiúin agus cathracha + Regije i gradovi + Régiók és városok + Regioni e città + Regionai ir miestai + Reģioni un pilsētas + Reġjuni u bliet + Regioner og byer + Regio's en steden + Regionar og byar + Regioner og byer + Regiony i miasta + Regiões e cidades + Regiuni şi orașe + Regióny a mestá + Regije in mesta + Regioner och städer + REGI + REGI + 2015-10-01 + REGI + REGI + This concept identifies datasets covering such domains as regions or cities. In the field of political geography, regions tend to be based on political units such as sovereign states; subnational units such as administrative regions, provinces, states, counties, townships, territories, etc.; and multinational groupings. A city is a large human settlement. Dataset examples: NUTS - Nomenclature of territorial units for statistics classification; UDP - GDP per capita by metro regions, 2000 - 2060. + + + + + Население и общество + Populace a společnost + Befolkning og samfund + Bevölkerung und Gesellschaft + Πληθυσμός και κοινωνία + Population and society + Población y sociedad + Elanikkond ja ühiskond + Väestö ja yhteiskunta + Population et société + Daonra agus sochaí + Stanovništvo i društvo + Népesség és társadalom + Popolazione e società + Gyventojų skaičius ir visuomenė + Iedzīvotāji un sabiedrība + Popolazzjoni u soċjetà + Befolkning og samfunn + Bevolking en samenleving + Befolkning og samfunn + Befolkning og samfunn + Ludność i społeczeństwo + População e sociedade + Populaţie şi societate + Obyvateľstvo a spoločnosť + Prebivalstvo in družba + Befolkning och samhälle + SOCI + SOCI + 2015-10-01 + SOCI + SOCI + This concept identifies datasets covering such domains as population or society. Population is a collection of humans and their entire race; it is the number of people in a city or town, region, country or world. A society is a group of individuals involved in persistent social interaction, or a large social group sharing the same spatial or social territory, typically subject to the same political authority and dominant cultural expectations. Dataset examples: Population density by NUTS 2 region; Violence against Women: An EU-wide survey. + + + + + Наука и tехнологии + Věda a technika + Videnskab og teknologi + Wissenschaft und Technologie + Επιστήμη και τεχνολογία + Science and technology + Ciencia y tecnología + Teadus ja tehnoloogia + Tiede ja teknologia + Science et technologie + Eolaíocht agus teicneolaíocht + Znanost i tehnologija + Tudomány és technológia + Scienza e tecnologia + Mokslas ir technologijos + Zinātne un tehnoloģija + Xjenza u teknoloġija + Vitenskap og teknologi + Wetenschap en technologie + Vitskap og teknologi + Vitenskap og teknologi + Nauka i technologia + Ciência e tecnologia + Ştiinţă şi tehnologie + Veda a technika + Znanost in tehnologija + Vetenskap och teknik + TECH + TECH + 2015-10-01 + TECH + TECH + This concept identifies datasets covering such domains as science or technology. Science is a systematic enterprise that builds and organises knowledge in the form of testable explanations and predictions. Modern science is typically divided into three major branches that consist of the natural sciences, which study nature in the broadest sense; the social sciences, which study individuals and societies; and the formal sciences, which study abstract concepts. Technology is the sum of techniques, skills, methods and processes used in the production of goods or services or in the accomplishment of objectives, such as scientific investigation. Dataset examples: CORDIS - EU research projects under Horizon 2020 (2014-2020); Take-up of mobile broadband (subscriptions/100 people). + + + + + Транспорт + Doprava + Transport + Verkehr + Μεταφορές + Transport + Transporte + Transport + Liikenne + Transports + Iompar + Promet + Közlekedés + Trasporti + Transportas + Transports + Trasport + Transport + Vervoer + Transport + Transport + Transport + Transportes + Transport + Doprava + Transport + Transport + TRAN + TRAN + 2015-10-01 + TRAN + TRAN + This concept identifies datasets covering the domain of transport. Transport is the movement of humans, animals and goods from one location to another. Modes of transport include air, land (rail and road), water, cable, pipeline and space. Dataset examples: Total length of motorways; Airport traffic data by reporting airport and airlines. + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap-semiceu/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap-semiceu/view.xsl new file mode 100644 index 00000000000..26e21574956 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap-semiceu/view.xsl @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-core.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-core.xsl new file mode 100644 index 00000000000..e06d4ce146f --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-core.xsl @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-variables.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-variables.xsl new file mode 100644 index 00000000000..9f4f5f138a4 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/eu-geodcat-ap-variables.xsl @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + series + dataset + nonGeographicDataset + service + + + + author + publisher + pointOfContact + owner + custodian + distributor + originator + principalInvestigator + processor + resourceProvider + user + + + + ucs2 + ucs4 + utf7 + utf8 + utf16 + 8859part1 + 8859part2 + 8859part3 + 8859part4 + 8859part5 + 8859part6 + 8859part7 + 8859part8 + 8859part9 + 8859part10 + 8859part11 + 8859part12 + 8859part13 + 8859part14 + 8859part15 + 8859part16 + + jis + shiftJIS + eucJP + usAscii + + ebcdic + eucKR + big5 + GB2312 + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/view.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/view.xsl new file mode 100644 index 00000000000..e44aa7c054c --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/formatter/eu-geodcat-ap/view.xsl @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-full.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-core.xsl similarity index 88% rename from schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-full.xsl rename to schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-core.xsl index 534d8dabef3..2dbaa3c0dd3 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-full.xsl +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-core.xsl @@ -1,7 +1,6 @@ - - - - - + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-brief.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat.xsl similarity index 100% rename from schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-brief.xsl rename to schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat.xsl diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-hvd.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-hvd.xsl new file mode 100644 index 00000000000..5fa84c146f1 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-hvd.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-mobility.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-mobility.xsl new file mode 100644 index 00000000000..b9168b58b97 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap-mobility.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap.xsl new file mode 100644 index 00000000000..1541e24dae0 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-dcat-ap.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap-semiceu.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap-semiceu.xsl new file mode 100644 index 00000000000..f6a3f2910a2 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap-semiceu.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap.xsl b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap.xsl new file mode 100644 index 00000000000..e0578159f69 --- /dev/null +++ b/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/eu-geodcat-ap.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19115-3.2018/src/main/resources/config-spring-geonetwork.xml b/schemas/iso19115-3.2018/src/main/resources/config-spring-geonetwork.xml index ee08ec080ca..390c62c2c68 100644 --- a/schemas/iso19115-3.2018/src/main/resources/config-spring-geonetwork.xml +++ b/schemas/iso19115-3.2018/src/main/resources/config-spring-geonetwork.xml @@ -6,6 +6,21 @@ + + + + + + + + + + + + + + + mdb:identificationInfo/*/mri:citation/*/cit:title/gco:CharacterString diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/dcat-utils.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/dcat-utils.xsl new file mode 100644 index 00000000000..9aa863776e7 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/dcat-utils.xsl @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/view.xsl new file mode 100644 index 00000000000..940cd64952c --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/dcat/view.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap-hvd/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap-hvd/view.xsl new file mode 100644 index 00000000000..a372d9bbf85 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap-hvd/view.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap/view.xsl new file mode 100644 index 00000000000..5bc18c30aa1 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-dcat-ap/view.xsl @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap-semiceu/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap-semiceu/view.xsl new file mode 100644 index 00000000000..c35678edac8 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap-semiceu/view.xsl @@ -0,0 +1,4362 @@ + + + + + + + + + + + + + + + + core + extended + http://data.europa.eu/r5r/ + http://data.europa.eu/930/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + + + + + + + + + + + enabled + + + disabled + + + + + + + + + abcdefghijklmnopqrstuvwxyz + ABCDEFGHIJKLMNOPQRSTUVWXYZ + + + + http://www.opengis.net/def/crs/EPSG/0 + urn:ogc:def:crs:EPSG + EPSG Coordinate Reference Systems + http://www.opengis.net/def/crs/OGC + urn:ogc:def:crs:OGC + OGC Coordinate Reference Systems + + + + + + + + + + + + + + + + + + + + + LonLat + + + + + http://www.w3.org/ns/dcat# + http://purl.org/dc/terms/ + http://purl.org/dc/dcmitype/ + http://xmlns.com/foaf/0.1/ + http://data.europa.eu/930/ + http://www.opengis.net/ont/geosparql# + http://www.w3.org/ns/prov# + http://www.w3.org/2004/02/skos/core# + http://www.w3.org/2006/vcard/ns# + http://www.w3.org/2001/XMLSchema# + + + + + + + + + + http://publications.europa.eu/resource/authority/ + + + + + + + + + + + + + + https://www.iana.org/assignments/ + + + + + + + + + + + http://www.qudt.org/vocab/unit + + + http://www.wurvoc.org/vocabularies/om-1.8 + http://www.ontology-of-units-of-measure.org/resource/om-2 + + + + + + + + + + + + http://inspire.ec.europa.eu/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ResourceUri is . Ignored: . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bg + + + cs + + + da + + + de + + + el + + + en + + + es + + + et + + + fi + + + fr + + + ga + + + hr + + + it + + + lv + + + lt + + + hu + + + mt + + + nl + + + pl + + + pt + + + ru + + + sk + + + sl + + + sv + + + + + + + + + + + + + + + + + + + + + + + + + + + bg + + + cs + + + da + + + de + + + el + + + en + + + es + + + et + + + fi + + + fr + + + ga + + + hr + + + it + + + lv + + + lt + + + hu + + + mt + + + nl + + + pl + + + pt + + + ru + + + sk + + + sl + + + sv + + + + + + + + + + + + + + + + + + + + + dataset + + + + + + + + + + + + + + + + + + dct:title + + + + + + + + + + + dct:description + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:title + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + N/A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foaf:name + + + + + + + + + vcard:fn + + + + + + + + + + + + + + + + + + + + + + + + + + + foaf:name + + + + + + + + + vcard:organization-name + + + + + + + + + vcard:fn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <gml:Envelope srsName=""><gml:lowerCorner> </gml:lowerCorner><gml:upperCorner> </gml:upperCorner></gml:Envelope> + <gml:Envelope srsName=""><gml:lowerCorner> </gml:lowerCorner><gml:upperCorner> </gml:upperCorner></gml:Envelope> + <gml:Envelope srsName=""><gml:lowerCorner> </gml:lowerCorner><gml:upperCorner> </gml:upperCorner></gml:Envelope> + + + + + + + + POLYGON(( , , , , )) + <> POLYGON(( , , , , )) + <> POLYGON(( , , , , )) + + + + + + + + + + {"type":"Polygon","coordinates":[[[,],[,],[,],[,],[,]]]} + + {"type":"Polygon","crs":{"type":"name","properties":{"name":""}},"coordinates":[[[,],[,],[,],[,],[,]]]} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gYear + + + date + + + dateTime + + + date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + dct:description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dct:title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dcat:keyword + + + + + + + + + dc:subject + + + + + + + + + + dcat:keyword + + + + + + + + + + + + + + + + + skos:prefLabel + + + + + + + + + + + + + + + skos:prefLabel + + + + + + + + + + + + + + skos:prefLabel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Spatial resolution (distance):   + + + + + + + + + + + + + + + + + + + + + + + + + Spatial resolution (equivalent scale): + + + + + + + + + + + + + + ISO-10646-UCS-2 + + + ISO-10646-UCS-4 + + + UTF-7 + + + UTF-8 + + + UTF-16 + + + ISO-8859-1 + + + ISO-8859-2 + + + ISO-8859-3 + + + ISO-8859-4 + + + ISO-8859-5 + + + ISO-8859-6 + + + ISO-8859-7 + + + ISO-8859-8 + + + ISO-8859-9 + + + ISO-8859-10 + + + ISO-8859-11 + + + ISO-8859-12 + + + ISO-8859-13 + + + ISO-8859-14 + + + ISO-8859-15 + + + ISO-8859-16 + + + + JIS_Encoding + + + Shift_JIS + + + EUC-JP + + + US-ASCII + + + + IBM037 + + + EUC-KR + + + Big5 + + + GB2312 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ETRS89 - European Terrestrial Reference System 1989 + ETRS89 - European Terrestrial Reference System 1989 + + + + + + + + + + + + + + + + + + + + CRS84 + CRS84 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bg + + + cs + + + da + + + de + + + el + + + en + + + es + + + et + + + fi + + + fr + + + ga + + + hr + + + it + + + lv + + + lt + + + hu + + + mt + + + nl + + + pl + + + pt + + + ru + + + sk + + + sl + + + sv + + + + + + + + + + + + + + + + yes + + + no + + + + + + + + + + + csw + + + csw + + + sos + + + sos + + + sps + + + sps + + + wcs + + + wcs + + + wfs + + + wfs + + + wms + + + wms + + + wmts + + + wmts + + + wps + + + wps + + + + + + + + + http://www.opengeospatial.org/standards/cat + + + http://www.opengeospatial.org/standards/sos + + + http://www.opengeospatial.org/standards/sps + + + http://www.opengeospatial.org/standards/wcs + + + http://www.opengeospatial.org/standards/wfs + + + http://www.opengeospatial.org/standards/wms + + + http://www.opengeospatial.org/standards/wmts + + + http://www.opengeospatial.org/standards/wps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap/view.xsl b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap/view.xsl new file mode 100644 index 00000000000..cfc878ef7de --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/formatter/eu-geodcat-ap/view.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-summary.xsl b/schemas/iso19139/src/main/plugin/iso19139/present/csw/dcat-core.xsl similarity index 88% rename from schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-summary.xsl rename to schemas/iso19139/src/main/plugin/iso19139/present/csw/dcat-core.xsl index 534d8dabef3..2dbaa3c0dd3 100644 --- a/schemas/iso19115-3.2018/src/main/plugin/iso19115-3.2018/present/csw/dcat-summary.xsl +++ b/schemas/iso19139/src/main/plugin/iso19139/present/csw/dcat-core.xsl @@ -1,7 +1,6 @@ - - - - - + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-hvd.xsl b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-hvd.xsl new file mode 100644 index 00000000000..5fa84c146f1 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-hvd.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-mobility.xsl b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-mobility.xsl new file mode 100644 index 00000000000..b9168b58b97 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap-mobility.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap.xsl b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap.xsl new file mode 100644 index 00000000000..1541e24dae0 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-dcat-ap.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap-semiceu.xsl b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap-semiceu.xsl new file mode 100644 index 00000000000..f6a3f2910a2 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap-semiceu.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap.xsl b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap.xsl new file mode 100644 index 00000000000..e0578159f69 --- /dev/null +++ b/schemas/iso19139/src/main/plugin/iso19139/present/csw/eu-geodcat-ap.xsl @@ -0,0 +1,27 @@ + + + + + diff --git a/schemas/iso19139/src/main/resources/config-spring-geonetwork.xml b/schemas/iso19139/src/main/resources/config-spring-geonetwork.xml index 2f93be95697..97e8f27ea91 100644 --- a/schemas/iso19139/src/main/resources/config-spring-geonetwork.xml +++ b/schemas/iso19139/src/main/resources/config-spring-geonetwork.xml @@ -31,6 +31,21 @@ + + + + + + + + + + + + + + + gmd:identificationInfo/*/gmd:citation/*/gmd:title/gco:CharacterString diff --git a/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/CSWPlugin.java b/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/CSWPlugin.java index 02d8a1d8dfb..260acdb957a 100644 --- a/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/CSWPlugin.java +++ b/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/CSWPlugin.java @@ -23,7 +23,6 @@ package org.fao.geonet.kernel.schema; -import org.jdom.Element; import org.jdom.Namespace; import java.util.Map; @@ -33,4 +32,5 @@ public interface CSWPlugin { * Return the list of typenames and corresponding namespace for the plugin. */ Map getCswTypeNames(); + } diff --git a/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/SchemaPlugin.java b/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/SchemaPlugin.java index a2396ae937a..605358b1a45 100644 --- a/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/SchemaPlugin.java +++ b/schemas/schema-core/src/main/java/org/fao/geonet/kernel/schema/SchemaPlugin.java @@ -29,17 +29,18 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.util.*; -/** - * Created by francois on 6/16/14. - */ public abstract class SchemaPlugin implements CSWPlugin { public static final String LOGGER_NAME = "geonetwork.schema-plugin"; + /** + * List of output schemas supported by the CSW for this plugin. + * The key correspond to the XSLT filename to use for the corresponding value (usually URI). + * XSLT are in the folder present/csw/{key-?(brief|summary|full)?}.xsl + */ + private Map outputSchemas = new HashMap<>(); + protected SchemaPlugin(String identifier, ImmutableSet allNamespaces) { this.identifier = identifier; @@ -126,4 +127,12 @@ public List getAnalyzedLinks() { public Element processElement(Element el, String attributeName, String parsedAttributeName, String attributeValue) { return el; }; + + public Map getOutputSchemas() { + return outputSchemas; + } + + public void setOutputSchemas(Map outputSchemas) { + this.outputSchemas = outputSchemas; + } } diff --git a/services/pom.xml b/services/pom.xml index e0ccd7873f1..c0c9b6071ad 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -116,6 +116,11 @@ org.springframework spring-test + + org.xmlunit + xmlunit-core + test + com.h2database h2 @@ -232,11 +237,14 @@ powermock-api-mockito test - org.apache.commons commons-csv + + commons-codec + commons-codec + co.elastic.clients elasticsearch-java diff --git a/services/src/main/java/org/fao/geonet/api/records/formatters/FormatType.java b/services/src/main/java/org/fao/geonet/api/records/formatters/FormatType.java index 81796022bf1..c2f1e5a1f36 100644 --- a/services/src/main/java/org/fao/geonet/api/records/formatters/FormatType.java +++ b/services/src/main/java/org/fao/geonet/api/records/formatters/FormatType.java @@ -62,4 +62,21 @@ public static FormatType find(String acceptHeader) { } return null; } + + public static FormatType findByFormatterKey(String formatterId) { + if (formatterId == null) { + return null; + } + + if (formatterId.contains("dcat")) { + return FormatType.xml; + } + for (FormatType c : FormatType.values()) { + if (formatterId.contains(c.name())) { + return c; + } + } + + return null; + } } diff --git a/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java b/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java index 068c63f60c7..96092a3a118 100644 --- a/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/formatters/FormatterApi.java @@ -232,6 +232,9 @@ public void getRecordFormattedBy( if (MediaType.ALL_VALUE.equals(acceptHeader)) { acceptHeader = MediaType.TEXT_HTML_VALUE; } + if (formatType == null) { + formatType = FormatType.findByFormatterKey(formatterId); + } if (formatType == null) { formatType = FormatType.find(acceptHeader); } diff --git a/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterAdminApiIntegrationTest.java b/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterAdminApiIntegrationTest.java index e25b8015b4a..149c5703e1f 100644 --- a/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterAdminApiIntegrationTest.java +++ b/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterAdminApiIntegrationTest.java @@ -59,8 +59,8 @@ public void testExec() throws Exception { serviceConfig.setValue(FormatterConstants.USER_XSL_DIR, dataDirectory.getWebappDir() + "/formatters"); listService.init(dataDirectory.getWebappDir(), serviceConfig); - assertFormattersForSchema(true, "iso19139", listService, "datacite", "eu-po-doi", "jsonld", "iso19115-3.2018"); - assertFormattersForSchema(false, "iso19139", listService, "datacite", "eu-po-doi", "jsonld", "xsl-view", "citation", "iso19115-3.2018"); + assertFormattersForSchema(true, "iso19139", listService, "datacite", "eu-po-doi", "jsonld", "iso19115-3.2018", "dcat", "eu-dcat-ap", "eu-dcat-ap-hvd", "eu-geodcat-ap", "eu-geodcat-ap-semiceu"); + assertFormattersForSchema(false, "iso19139", listService, "datacite", "eu-po-doi", "jsonld", "xsl-view", "citation", "iso19115-3.2018", "dcat", "eu-dcat-ap", "eu-dcat-ap-hvd", "eu-geodcat-ap", "eu-geodcat-ap-semiceu"); assertFormattersForSchema(true, "dublin-core", listService); } diff --git a/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterApiTest.java b/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterApiTest.java index e0780b4f723..4d0f3c79c31 100644 --- a/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterApiTest.java +++ b/services/src/test/java/org/fao/geonet/api/records/formatters/FormatterApiTest.java @@ -22,11 +22,25 @@ */ package org.fao.geonet.api.records.formatters; +import java.io.File; import jeeves.server.context.ServiceContext; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.jena.graph.Graph; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.riot.Lang; +import org.apache.jena.riot.RDFDataMgr; +import org.apache.jena.shacl.ShaclValidator; +import org.apache.jena.shacl.Shapes; +import org.apache.jena.shacl.ValidationReport; +import org.apache.jena.shacl.lib.ShLib; import org.fao.geonet.domain.AbstractMetadata; import org.fao.geonet.services.AbstractServiceIntegrationTest; +import org.fao.geonet.utils.Xml; import org.jdom.Element; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; @@ -36,12 +50,17 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.StreamUtils; import org.springframework.web.context.WebApplicationContext; +import org.xmlunit.builder.DiffBuilder; +import org.xmlunit.builder.Input; +import org.xmlunit.diff.DefaultNodeMatcher; +import org.xmlunit.diff.Diff; +import org.xmlunit.diff.ElementSelectors; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -55,17 +74,26 @@ public class FormatterApiTest extends AbstractServiceIntegrationTest { public static Collection data() throws Exception { ArrayList data = new ArrayList<>(); - data.add(new String[]{"citation", "?format=?", "iso19139", "formats.txt"}); - data.add(new String[]{"citation", "?format=ris", "iso19139", "ris.txt"}); - data.add(new String[]{"citation", "?format=bibtex", "iso19139", "bibtex.txt"}); - data.add(new String[]{"citation", "?format=text", "iso19139", "text.txt"}); - data.add(new String[]{"citation", "?format=html", "iso19139", "html.html"}); - data.add(new String[]{"citation", "?format=?", "iso19115-3.2018", "formats.txt"}); - data.add(new String[]{"citation", "?format=ris", "iso19115-3.2018", "ris.txt"}); - data.add(new String[]{"citation", "?format=bibtex", "iso19115-3.2018", "bibtex.txt"}); - data.add(new String[]{"citation", "?format=text", "iso19115-3.2018", "text.txt"}); - data.add(new String[]{"citation", "?format=html", "iso19115-3.2018", "html.html"}); - data.add(new String[]{"citation", "?format=text&authorRoles=processor&publisherRoles=owner,custodian", "iso19115-3.2018", "text-custom-role.txt"}); + data.add(new String[]{"iso19139", "citation", "?format=?", "iso19139", "formats.txt"}); + data.add(new String[]{"iso19139", "citation", "?format=ris", "iso19139", "ris.txt"}); + data.add(new String[]{"iso19139", "citation", "?format=bibtex", "iso19139", "bibtex.txt"}); + data.add(new String[]{"iso19139", "citation", "?format=text", "iso19139", "text.txt"}); + data.add(new String[]{"iso19139", "citation", "?format=html", "iso19139", "html.html"}); + data.add(new String[]{"iso19139", "citation", "?format=?", "iso19115-3.2018", "formats.txt"}); + data.add(new String[]{"iso19115-3.2018", "citation", "?format=ris", "iso19115-3.2018", "ris.txt"}); + data.add(new String[]{"iso19115-3.2018", "citation", "?format=bibtex", "iso19115-3.2018", "bibtex.txt"}); + data.add(new String[]{"iso19115-3.2018", "citation", "?format=text", "iso19115-3.2018", "text.txt"}); + data.add(new String[]{"iso19115-3.2018", "citation", "?format=html", "iso19115-3.2018", "html.html"}); + data.add(new String[]{"iso19115-3.2018", "citation", "?format=text&authorRoles=processor&publisherRoles=owner,custodian", "iso19115-3.2018", "text-custom-role.txt"}); + + data.add(new String[]{"iso19115-3.2018-dcat-dataset.xml", "dcat", "", "iso19115-3.2018", "dataset-core.rdf"}); + data.add(new String[]{"iso19115-3.2018-dcat-dataset.xml", "eu-dcat-ap", "", "iso19115-3.2018", "dataset-core.rdf"}); + data.add(new String[]{"iso19115-3.2018-dcat-dataset.xml", "eu-dcat-ap", "?multipleAccrualPeriodicityAllowed=true", "iso19115-3.2018", "dataset-core-multipleAccrualPeriodicityAllowed.rdf"}); + data.add(new String[]{"iso19115-3.2018-dcat-dataset.xml", "eu-geodcat-ap", "", "iso19115-3.2018", "dataset-core.rdf"}); + data.add(new String[]{"iso19115-3.2018-dcat-dataset.xml", "eu-dcat-ap-mobility", "", "iso19115-3.2018", "dataset-core.rdf"}); + data.add(new String[]{"iso19115-3.2018-dcat-dataset.xml", "eu-dcat-ap-hvd", "", "iso19115-3.2018", "dataset-core.rdf"}); + data.add(new String[]{"iso19115-3.2018-dcat-service.xml", "dcat", "", "iso19115-3.2018", "service-core.rdf"}); + return data; } @@ -81,47 +109,196 @@ public void checkFormatter() throws Exception { MockHttpSession mockHttpSession = loginAsAdmin(); for (String[] testParameter : data()) { - String formatter = testParameter[0]; - String urlParams = testParameter[1]; - String schema = testParameter[2]; - String checkfile = testParameter[3]; + String testFile = testParameter[0]; + String formatter = testParameter[1]; + String urlParams = testParameter[2]; + String schema = testParameter[3]; + String checkfile = testParameter[4]; String url = "/srv/api/records/" - + testDataUuidBySchema.get(schema) - + "/formatters/" + formatter + urlParams; + + testDataUuidBySchema.get(testFile) + + "/formatters/" + formatter + urlParams; try { MvcResult result = mockMvc.perform(get(url) - .session(mockHttpSession) - .accept(MediaType.ALL_VALUE)) - .andExpect(status().isOk()) - .andReturn(); - - assertEquals( - url, - StreamUtils.copyToString( - FormatterApiTest.class.getResourceAsStream( - String.format("%s-%s-%s", - schema, formatter, checkfile) - ), - StandardCharsets.UTF_8) + .session(mockHttpSession) + .accept(MediaType.ALL_VALUE)) + .andExpect(status().isOk()) + .andReturn(); + + String expected = StreamUtils.copyToString( + FormatterApiTest.class.getResourceAsStream( + String.format("%s-%s-%s", + schema, formatter, checkfile) + ), + StandardCharsets.UTF_8) .trim() - .replace("{uuid}", testDataUuidBySchema.get(schema)), - result.getResponse().getContentAsString() - .replaceAll("\\r\\n?", "\n") - ); + .replace("{uuid}", testDataUuidBySchema.get(testFile)); + + String actual = result.getResponse().getContentAsString(); + + boolean isRdf = checkfile.endsWith(".rdf"); + boolean isXml = checkfile.endsWith(".xml"); + + if (isXml || isRdf) { + if (isRdf) { + try { + Model model = ModelFactory.createMemModelMaker().createDefaultModel(); + RDFDataMgr.read(model, + IOUtils.toInputStream(actual, StandardCharsets.UTF_8), + Lang.RDFXML); + } catch (Exception rdfException) { + fail(String.format("%s. Checked with %s. RDF model error. %s. Checked with: %s", + url, checkfile, rdfException.getMessage(), actual)); + } + } + + +// FileUtils.writeStringToFile(new File("/tmp/services/src/test/resources/org/fao/geonet/api/records/formatters/new/" + String.format("%s-%s-%s", +// schema, formatter, checkfile)), actual.replaceFirst("urn:uuid/.*", "urn:uuid/{uuid}"), StandardCharsets.UTF_8); + + Diff diff = DiffBuilder + .compare(Input.fromString(actual)) + .withTest(Input.fromString(expected)) + .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)) + .normalizeWhitespace() + .ignoreComments() + .checkForSimilar() + .build(); + assertFalse( + String.format("%s. Checked with %s. Differences: %s", url, checkfile, diff.toString()), + diff.hasDifferences()); + + if (isRdf) { + String[] shaclValidation = {}; + if ("eu-dcat-ap".equalsIgnoreCase(formatter)) { + // https://github.com/ISAITB/validator-resources-dcat-ap/blob/master/resources/config.properties#L117-L128 +// shaclValidation = new String[]{ +// "shacl/eu-dcat-ap-3.0.0/shapes.ttl", +// "shacl/eu-dcat-ap-3.0.0/range.ttl", +// "shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl", +// "shacl/eu-dcat-ap-3.0.0/imports.ttl", +// "shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl"}; +// } else if("eu-dcat-ap-hvd".equalsIgnoreCase(formatter)){ +// shaclValidation = new String[]{"shacl/dcat-ap-hvd-2.2.0-SHACL.ttl"}; +// } else if("eu-geodcat-ap".equalsIgnoreCase(formatter)){ +// shaclValidation = new String[]{"shacl/geodcat-ap-2.0.1-SHACL.ttl"}; + } + for (String shaclShapes : shaclValidation) { + applyShaclValidation(formatter, schema, checkfile, url, shaclShapes); + } + } + } else { + assertEquals( + url, + expected, + actual.replaceAll("\\r\\n?", "\n") + ); + } } catch (Exception e) { - fail(url); + fail(String.format("Failure on %s. Error is: %s", url, e.getMessage())); } } } + + @Test + @Ignore + public void quickTestToValidateRdfModelAndShaclRules() throws IOException { + String formatter = "eu-dcat-ap"; + String schema = "iso19115-3.2018"; + String checkfile = "dataset-core.rdf"; + String file = String.format("%s-%s-%s", schema, formatter, checkfile); + String expected = StreamUtils.copyToString( + FormatterApiTest.class.getResourceAsStream(file), + StandardCharsets.UTF_8); + try { + Model model = ModelFactory.createMemModelMaker().createDefaultModel(); + RDFDataMgr.read(model, + IOUtils.toInputStream(expected, StandardCharsets.UTF_8), + Lang.RDFXML); + } catch (Exception rdfException) { + fail(String.format("%s. RDF model error. %s.", + file, rdfException.getMessage())); + } +// String[] shaclValidation = new String[]{"shacl/dcat-ap-2.1.1-base-SHACL.ttl"}; + String[] shaclValidation = new String[]{ + "shacl/eu-dcat-ap-3.0.0/shapes.ttl", + "shacl/eu-dcat-ap-3.0.0/range.ttl", + "shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl", + "shacl/eu-dcat-ap-3.0.0/imports.ttl", + "shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl" + }; +// String[] shaclValidation = new String[]{"dcat-ap-hvd-2.2.0-SHACL.ttl"}; +// String[] shaclValidation = new String[]{"geodcat-ap-2.0.1-SHACL.ttl"}; + for (String shaclShapes : shaclValidation) { + applyShaclValidation(formatter, schema, checkfile, "", shaclShapes); + } + } + + private static void applyShaclValidation(String formatter, String schema, String checkfile, String url, String shaclShapes) { + String SHAPES = FormatterApiTest.class.getResource(shaclShapes).getFile(); + if (SHAPES.startsWith("/")) { + SHAPES.replaceFirst("/", ""); + } + + //Load document to validate. + String DATA = FormatterApiTest.class.getResource( + String.format("%s-%s-%s", + schema, formatter, checkfile) + ).getFile(); + if (DATA.startsWith("/")) { + DATA.replaceFirst("/", ""); + } + Graph shapesGraph; + Shapes shapes; + try { + shapesGraph = RDFDataMgr.loadGraph(SHAPES); + shapes = Shapes.parse(shapesGraph); + } catch (Exception e) { + fail(String.format( + "%s. Checked with %s [%s]. SHACL graph error. Error is: %s", + url, checkfile, shaclShapes, e.getMessage())); + return; + } + + Graph dataGraph = RDFDataMgr.loadGraph(DATA); + + ValidationReport report = ShaclValidator.get().validate(shapes, dataGraph); + + if (!report.conforms()) { + long count = report.getEntries().stream() + .filter(e -> e.severity().level().getURI().equals("http://www.w3.org/ns/shacl#Violation")) + .count(); + + ShLib.printReport(report); + System.out.println(); + RDFDataMgr.write(System.out, report.getModel(), Lang.TTL); + fail(String.format("%s. Checked with %s [%s]. Invalid DCAT-AP document. %d violations found. See report in the test console output.", + url, checkfile, shaclShapes, count)); + } + } + private void createTestData() throws Exception { loginAsAdmin(context); - loadFile(getSampleISO19139MetadataXml()); - loadFile(getSampleISO19115MetadataXml()); + + Set testFiles = new HashSet<>(); + for (String[] testParameter : data()) { + testFiles.add(testParameter[0]); + } + for (String file : testFiles) { + if (file.equals("iso19139")) { + loadFile("iso19139", getSampleISO19139MetadataXml()); + } else if (file.equals("iso19115-3.2018")) { + loadFile("iso19115-3.2018", getSampleISO19115MetadataXml()); + } else { + loadFile(file, + Xml.loadStream( + FormatterApiTest.class.getResourceAsStream(file))); + } + } } - private void loadFile(Element sampleMetadataXml) throws Exception { + private void loadFile(String key, Element sampleMetadataXml) throws Exception { AbstractMetadata metadata = injectMetadataInDbDoNotRefreshHeader(sampleMetadataXml, context); - testDataUuidBySchema.put(metadata.getDataInfo().getSchemaId(), metadata.getUuid()); + testDataUuidBySchema.put(key, metadata.getUuid()); } } diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset-core.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset-core.rdf new file mode 100644 index 00000000000..92696f2fcde --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset-core.rdf @@ -0,0 +1,558 @@ + + + + + + + Dataset + + + + + dataset + + + + + + urn:uuid:{uuid} + 2023-12-08T12:26:19.337626Z + 2019-04-02T12:33:24 + Plan de secteur en vigueur (version coordonnée vectorielle) + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + Complete metadata + All information about the resource + + + Plan de secteur en vigueur (version coordonnée vectorielle) + 2023-03-31 + 2023-02-21 + 1.0 + http://geodata.wallonie.be/id/7fe2f305-1302-4297-b67e-792f55acd834 + BE.SPW.INFRASIG.CARTON/DGATLPE__PDS + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + Mis à jour continue + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + + + Thierry Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + custodian + + + + + + + + + + + Jean Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + custodian + + + + + + + + + Service public de Wallonie (SPW) + + https://geoportail.wallonie.be + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + espace + zones naturelles, paysages, écosystèmes + législation + géographie + agriculture + aménagement du paysage + réseau ferroviaire + planification écologique + plan d'aménagement + extraction + habitat rural + gestion et planification rurale + secteur d'activité + infrastructure + plan de gestion + planification rurale + planification économique + plan + développement du territoire + infrastructure routière + plan d'occupation des sols + activité économique + réseau routier + planification urbaine + loisirs + canalisation + habitat urbain + mesure d'aménagement du territoire + territoire + planification régionale + habitat + PanierTelechargementGeoportail + Open Data + WalOnMap + Extraction_DIG + BDInfraSIGNO + aménagement du territoire + plan de secteur + point remarquable + PDS + CoDT + Point de vue + centre d'enfouissement + servitude + Code du Développement Territorial + + + Altitude + + + + + Caractéristiques géographiques + météorologiques + + + + + Caractéristiques géographiques + océanographiques + + + + + Conditions atmosphériques + + + + + Dénominations géographiques + + + + + Géologie + + + + + Hydrographie + + + + + Installations agricoles et aquacoles + + + + + Régions maritimes + + + + + Répartition des espèces + + + + + Ressources minérales + + + + + Santé et sécurité des personnes + + + Mobilité + Observation de la terre et environnement + + + 1143/2014 + + + + + + + + No limitations to public access + + + + + + + + + + + + + + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + 2014-04-17 + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + 0.01 + 30 + 0.3048 + P0Y2M0DT0H0M0S + + + + + + + + + + + + + Région wallonne + + + + + 2023-12-06 + 2023-12-08 + + + + + + + + + + + + + + + + + pds_codt_pic + + + + + 2023-12-08T00:00:00 + + + 10485760 + + + ESRI Shapefile (.shp) + + + + + + + + + + Application de consultation des données de la DGO4 - Plan de secteur + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + Application WalOnMap - Toute la Wallonie à la carte + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + Service de visualisation ESRI-REST + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation ESRI-REST + + + + + + + + Service de visualisation WMS + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation WMS + + + + + + + + + + + Base de données du Plan de secteur + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + Inventaire des données géographiques de la DGO4 + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + La Direction de l'Aménagement Régional + Site de la Direction de l'Aménagement Régional (DAR) + + + + + Plan de Secteur au format SHP + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset.xml b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset.xml new file mode 100644 index 00000000000..c62fe2febcb --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-dataset.xml @@ -0,0 +1,1904 @@ + + + + + 7fe2f305-1302-4297-b67e-792f55acd834 + + + urn:uuid + + + + + + + + + + + + + + + + + + + + Collection de données thématiques + + + + + + + + + + + + Direction de la gestion des informations territoriales (SPW - Territoire, Logement, + Patrimoine, Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction de la + gestion des informations territoriales) + + + + + + + + donnees.dgo4@spw.wallonie.be + + + + + + + + + + + + + 2023-12-08T12:26:19.337626Z + + + + + + + + + + 2019-04-02T12:33:24 + + + + + + + + + + ISO 19115 + + + 2003/Cor 1:2006 + + + + + + + + https://metawal.wallonie.be/geonetwork/srv/api/records/7fe2f305-1302-4297-b67e-792f55acd834 + + + + Complete metadata + + + All information about the resource + + + + + + + + + + + + EPSG:31370 + + + Belge 1972 / Belgian Lambert 72 (EPSG:31370) + + + + + + + + + + + + + + Plan de secteur en vigueur (version coordonnée vectorielle) + + + PDS + + + + + 2023-03-31 + + + + + + + + + + 2023-02-21 + + + + + + + + 1.0 + + + + + 7fe2f305-1302-4297-b67e-792f55acd834 + + + http://geodata.wallonie.be/id/ + + + + + + + DGATLPE__PDS + + + BE.SPW.INFRASIG.CARTON + + + + + + + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + developpement.territorial@spw.wallonie.be + + + + + + + + + Thierry Berthet + + + + + + + Jean Berthet + + + + + + + jean.b@spw.org + + + + + + + + + https://orcid.org/jb98765 + + + + + + + + + + + + + + + + + + + + + Service public de Wallonie (SPW) + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + https://geoportail.wallonie.be + + + WWW:LINK + + + Géoportail de la Wallonie + + + Géoportail de la Wallonie + + + + + + + + + + + + + + + + + + + + + 10000 + + + + + + + + + 1 + + + + + + + 30 + + + + + + + 1 + + + + + P0Y2M0DT0H0M0S + + + planningCadastre + + + imageryBaseMapsEarthCover + + + location + + + + + Région wallonne + + + + + 2.75 + + + 6.50 + + + 49.45 + + + 50.85 + + + + + + + + + + https://en.wikipedia.org/wiki/Wallonia + + + + + + + + + + + + Région wallonne + + + + + + + + + + + + 2023-12-06 + + + + + 2023-12-08 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P0Y0M0DT0H15M0S + + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des + dossiers abrogés se font au fur et à mesure de la réception des informations. + + + + + + + + + https://metawal.wallonie.be/geonetwork/srv/api/records/7fe2f305-1302-4297-b67e-792f55acd834/attachments/pds_codt.png + + + + pds_codt_pic + + + png + + + + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + + + + + + + Thèmes du + géoportail wallon + + + + + + 2014-06-26 + + + + + + + + + + + geonetwork.thesaurus.external.theme.Themes_geoportail_wallon_hierarchy + + + + + + + + + + + + espace + + + zones naturelles, paysages, écosystèmes + + + législation + + + géographie + + + agriculture + + + + + + + + GEMET themes + + + + + 2009-09-22 + + + + + + + + + + + geonetwork.thesaurus.external.theme.gemet-theme + + + + + + + + + + + + aménagement du paysage + + + réseau ferroviaire + + + planification écologique + + + plan d'aménagement + + + extraction + + + habitat rural + + + gestion et planification rurale + + + secteur d'activité + + + infrastructure + + + plan de gestion + + + planification rurale + + + planification économique + + + plan + + + développement du territoire + + + infrastructure routière + + + plan d'occupation des sols + + + activité économique + + + réseau routier + + + planification urbaine + + + loisirs + + + canalisation + + + habitat urbain + + + mesure d'aménagement du territoire + + + territoire + + + planification régionale + + + habitat + + + + + + + + GEMET + + + + + 2009-09-22 + + + + + + + + + + + geonetwork.thesaurus.external.theme.gemet + + + + + + + + + + + + PanierTelechargementGeoportail + + + Open Data + + + WalOnMap + + + Extraction_DIG + + + BDInfraSIGNO + + + + + + + + Mots-clés InfraSIG + + + + + 2022-10-03 + + + + + + + + + + + geonetwork.thesaurus.external.theme.infraSIG + + + + + + + + + + + + aménagement du territoire + + + plan de secteur + + + point remarquable + + + PDS + + + CoDT + + + Point de vue + + + centre d'enfouissement + + + servitude + + + Code du Développement Territorial + + + + + + + + + + Altitude + + + Caractéristiques géographiques + météorologiques + + + + Caractéristiques géographiques + océanographiques + + + + Conditions atmosphériques + + + Dénominations géographiques + + + Géologie + + + Hydrographie + + + Installations agricoles et aquacoles + + + + Régions maritimes + + + Répartition des espèces + + + Ressources minérales + + + Santé et sécurité des personnes + + + + + + + + GEMET - INSPIRE themes, version 1.0 + + + + + + 2008-01-01 + + + + + + + + + + 2008-06-01 + + + + + + + + + + + geonetwork.thesaurus.external.theme.httpinspireeceuropaeutheme-theme + + + + + + + + + + + + Mobilité + + + Observation de la terre et environnement + + + + + + + + High-value dataset categories + + + + + 2023-10-05 + + + + + + + + + + 2023-10-05 + + + + + + + + + + + geonetwork.thesaurus.external.theme.high-value-dataset-category + + + + + + + + + + + + 1143/2014 + + + + + + + + High-value dataset applicable + legislations + + + + + + 2024-04-04 + + + + + + + + + + 2024-04-04 + + + + + + + + + + + geonetwork.thesaurus.external.theme.high-value-dataset-applicable-legislation + + + + + + + + + + + + + + + No + limitations to public access + + + + + + + + + + + No limitations to public access + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + Les + conditions générales d'utilisation s'appliquent. + + + + Les + conditions générales d'accès s’appliquent. + + + + + Les conditions générales d'utilisation s'appliquent et sont étendues par les conditions particulières de + type A. + + + + BSL + + + https://opensource.org/licenses/CATOSL-1.1 + + + + + + + + + Commission Implementing + Regulation (EU) 2023/138 of 21 December 2022 laying down a list of specific high-value datasets and + the arrangements for their publication and re-use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ESRI Shapefile + (.shp) + + + + + - + + + + + + + + + + + ESRI File + Geodatabase (.fgdb) + + + + + 10.x + + + + + + + + + + + + + + + + Service public de Wallonie (SPW) + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + 2023-12-08T00:00:00 + + + Il est conseillé d'utiliser les liens référencés dans les ressources associés dans + le cas où la demande de téléchargement porte sur l'entièreté du territoire concerné par le jeu de + données. + + Si votre demande porte sur un format spécifique de donnée ou une partie spécifique du territoire, + veuillez suivre les instructions d'obtention d'une copie physique d’une donnée détaillées sur + https://geoportail.wallonie.be/telecharger. L’utilisation des géoservices est à privilégier. + + Cette ressource est une série de couches de données. En la commandant, l'ensemble des couches + constitutives de cette série vous sera automatiquement fourni. + + + + + + + + + + + + + + + + + 10 + + + + + https://data.monde.org/secteur.shp + + + WWW:DOWNLOAD:ESRI Shapefile (.shp) + + + + + + + + + + + + + + + + + + GeoPackage + + + + + ZIP + + + + + + + + + + + + + http://geoapps.wallonie.be/webgisdgo4/#CTX=PDS + + + WWW:LINK + + + Application de consultation des données de la DGO4 - Plan de secteur + + + + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + + + + + + + + https://geoportail.wallonie.be/walonmap/#ADU=https://geoservices.wallonie.be/arcgis/rest/services/AMENAGEMENT_TERRITOIRE/PDS/MapServer + + + + WWW:LINK + + + WalOnMap + + + Application WalOnMap - Toute la Wallonie à la carte + + + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + + + + + + + + https://geoservices.wallonie.be/arcgis/rest/services/AMENAGEMENT_TERRITOIRE/PDS/MapServer + + + + ESRI:REST + + + Service de visualisation ESRI-REST + + + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + + + + + + + + https://geoservices.wallonie.be/arcgis/services/AMENAGEMENT_TERRITOIRE/PDS/MapServer/WMSServer?request=GetCapabilities&service=WMS + + + + OGC:WMS + + + Service de visualisation WMS + + + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + + + + + + + http://spw.wallonie.be/dgo4/site_thema/index.php?thema=modif_ps + + + + WWW:LINK + + + Base de données du Plan de secteur + + + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + + + + + + + https://lampspw.wallonie.be/dgo4/site_thema/index.php/synthese + + + + WWW:LINK + + + Inventaire des données géographiques de la DGO4 + + + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + + + + + + + http://spw.wallonie.be/dgo4/site_amenagement/site/directions/dar + + + + WWW:LINK + + + La Direction de l'Aménagement Régional + + + Site de la Direction de l'Aménagement Régional (DAR) + + + + + + + + + + + http://geoservices.wallonie.be/geotraitement/spwdatadownload/get/7fe2f305-1302-4297-b67e-792f55acd834/PDS_SHAPE_31370.zip + + + + WWW:DOWNLOAD-1.0-http--download + + + Plan de Secteur au format SHP + + + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + + + + + + + + + + + + + + + + + + + Série de couches de données thématiques + + + + + + + + + + + + + RÈGLEMENT (UE) N o 1089/2010 + DE LA COMMISSION du 23 novembre 2010 portant modalités d'application de la directive 2007/2/CE du + Parlement européen et du Conseil en ce qui concerne l'interopérabilité des séries et des services + de données géographiques + + + + + + 2010-12-08 + + + + + + + + + + Voir la spécification référencée + + + false + + + + + + + + + + + + + RÈGLEMENT (UE) N o 1089/2010 DE LA + COMMISSION du 23 novembre 2010 portant modalités d'application de la directive 2007/2/CE du + Parlement européen et du Conseil en ce qui concerne l'interopérabilité des séries et des services + de données géographiques + + + + + + 2010-12-08 + + + + + + + + + + Voir la spécification référencée + + + true + + + + + + + + + + + + + INSPIRE Data Specification + on Transport Networks – Technical Guidelines, version 3.2 + + + + + + 2014-04-17 + + + + + + + + + + Voir la spécification référencée + + + true + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + + + + + + 2014-04-17 + + + + + + + + + + Voir la spécification référencée + + + true + + + + + + + + + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + + + + + + + + + + + + + + + + + Légende du Plan de secteur + + + + + + https://geoservices.wallonie.be/arcgis/rest/services/AMENAGEMENT_TERRITOIRE/PDS/MapServer/legend + + + + WWW:LINK + + + Légende associée au plan de secteur (sur base du service de visualisation) + + + + + + + + + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service-core.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service-core.rdf new file mode 100644 index 00000000000..2d6dff1525b --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service-core.rdf @@ -0,0 +1,386 @@ + + + + + + + Service + + + + + service + + + + + + urn:uuid:{uuid} + 2023-12-11T07:25:51.082626Z + 2019-04-02T12:35:21 + INSPIRE - Sites protégés en Wallonie (BE) - Service de téléchargement + + + + INSPIRE - Protected site in Walloon region (BE) - Download + service + Ce service de téléchargement ATOM Feed donne accès aux couches de données du thème INSPIRE + "Sites protégés" au sein du territoire wallon (Belgique). + + Ce service de téléchargement simple est fourni par le Service public de Wallonie (SPW) et permet le + téléchargement direct des couches de données géographiques constitutives du thème "sites protégés" de la + Directive INSPIRE (Annexe 1.9) sur l'ensemble du territoire wallon. Il utilise la technologie de flux de + données ATOM Feed. + + Le service est conforme aux spécifications de la Directive INSPIRE en la matière. + + Ce service de téléchargement simple permet d’accéder en téléchargement aux couches de données présentes dans + le thème "Sites protégés". Via ce service, les informations suivantes sont téléchargeables : + - "INSPIRE - Sites protégés en Wallonie" : série de couches de données regroupant l'ensemble des sites + protégés en Wallonie; + - "INSPIRE - Sites protégés Natura 2000 en Wallonie" : série de couches de données présentant uniquement les + sites classés selon le mécanisme de désignation Natura 2000; + - "INSPIRE - Sites protégés par type IUCN en Wallonie" : série de couches de données présentant uniquement les + sites classés selon le mécanisme de désignation IUCN; + - "INSPIRE - Sites protégés UNESCO en Wallonie" : série de couches de données présentant uniquement les sites + classés selon le mécanisme de désignation UNESCO; + - "INSPIRE - Sites protégés Monument National en Wallonie" : série de couches de données présentant uniquement + les sites classés selon le mécanisme de désignation Monument National + + Le service propose les opérations suivantes : + - Accéder aux métadonnées du service de téléchargement; + - Décrire la série de couche de données géographiques relative au thème "Sites protégés" ainsi que les séries + dérivées selon le mécanisme de désignation; + - Accéder aux séries de couches de données géographiques relatives au thème "Sites protégés" et aux sites de + désignation par site protégé. + + + + + + + + + INSPIRE - Sites protégés en Wallonie (BE) - Service de téléchargement + + + + INSPIRE - Protected site in Walloon region (BE) - Download + service + 2017-11-15 + http://geodata.wallonie.be/id/3dbe0017-a71f-4923-9b44-fdb5afef5778 + Ce service de téléchargement ATOM Feed donne accès aux couches de données du thème INSPIRE + "Sites protégés" au sein du territoire wallon (Belgique). + + Ce service de téléchargement simple est fourni par le Service public de Wallonie (SPW) et permet le + téléchargement direct des couches de données géographiques constitutives du thème "sites protégés" de la + Directive INSPIRE (Annexe 1.9) sur l'ensemble du territoire wallon. Il utilise la technologie de flux de + données ATOM Feed. + + Le service est conforme aux spécifications de la Directive INSPIRE en la matière. + + Ce service de téléchargement simple permet d’accéder en téléchargement aux couches de données présentes dans + le thème "Sites protégés". Via ce service, les informations suivantes sont téléchargeables : + - "INSPIRE - Sites protégés en Wallonie" : série de couches de données regroupant l'ensemble des sites + protégés en Wallonie; + - "INSPIRE - Sites protégés Natura 2000 en Wallonie" : série de couches de données présentant uniquement les + sites classés selon le mécanisme de désignation Natura 2000; + - "INSPIRE - Sites protégés par type IUCN en Wallonie" : série de couches de données présentant uniquement les + sites classés selon le mécanisme de désignation IUCN; + - "INSPIRE - Sites protégés UNESCO en Wallonie" : série de couches de données présentant uniquement les sites + classés selon le mécanisme de désignation UNESCO; + - "INSPIRE - Sites protégés Monument National en Wallonie" : série de couches de données présentant uniquement + les sites classés selon le mécanisme de désignation Monument National + + Le service propose les opérations suivantes : + - Accéder aux métadonnées du service de téléchargement; + - Décrire la série de couche de données géographiques relative au thème "Sites protégés" ainsi que les séries + dérivées selon le mécanisme de désignation; + - Accéder aux séries de couches de données géographiques relatives au thème "Sites protégés" et aux sites de + désignation par site protégé. + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + + + + + Direction de l'Intégration des géodonnées (SPW - Secrétariat général - SPW Digital + - Département de la Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + custodian + + + + + + + + + Service public de Wallonie (SPW) + + + + https://geoportail.wallonie.be + + + + + + + Nature et environnement + + + + + + + Faune et flore + + + + + + + Sites protégés + + + + + zones naturelles, paysages, écosystèmes + + + politique environnementale + + + biologie + + + site naturel + + + écologie + + + évaluation du patrimoine naturel + + + politique de conservation de la nature + + + monument historique + + + parc naturel + + + espace naturel + + + législation en matière de préservation de la nature + + + conservation des ressources naturelles + + + site naturel protégé + + + archéologie + + + milieu naturel + + + patrimoine naturel + + + paysage + + + géologie + + + monument + + + conservation + + + espace protégé + + + patrimoine culturel + + + Reporting INSPIRE + + + natura2000 + + + N2K + + + biodiversité + + + protected sites + + + site protégé + + + aire protégée + + + inspire + + + téléchargement + + + Feed + + + ATOM + + + IUCN + + + ProtectedSite + + + + + Service d’accès aux produits + + + + + Location of sites (Habitats Directive) + + + + + Régional + + + + + + + + + + + + + Conditions d'utilisation spécifiques + + + + + + + + + + + Ce service de téléchargement simple INSPIRE basé sur ATOM est au standard Atom RFC 4287, à + la spécification GeoRSS Simple et à la spécification OpenSearch (pour les éléments concernés). + + + + + + + + + + + INSPIRE_PS_DS_PIC + + + + + + + INSPIRE Sites Protégés - Service de téléchargement + + + Adresse de connexion au service de téléchargement ATOM Feed des couches de données + du thème "Sites protégés". + + + + + + + INSPIRE Sites Protégés - Service de téléchargement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service.xml b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service.xml new file mode 100644 index 00000000000..9ac12ef8315 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-dcat-service.xml @@ -0,0 +1,1728 @@ + + + + + + 3dbe0017-a71f-4923-9b44-fdb5afef5778 + + + urn:uuid + + + + + + + + + + + + + + + + + + + + Service + + + Service + + + + + + + + + + + + + + Direction de l'Intégration des géodonnées (SPW - Secrétariat général - SPW Digital - + Département de la Géomatique - Direction de l'Intégration des géodonnées) + + + + Direction de l'Intégration des géodonnées (SPW - Secrétariat + général - SPW Digital - Département de la Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + 2023-12-11T07:25:51.082626Z + + + + + + + + + + 2019-04-02T12:35:21 + + + + + + + + + + ISO 19119 + + + ISO 19119 + + + + + 2005/Amd.1:2008 + + + + + + + + + + + + + + + + + + https://metawal.wallonie.be/geonetwork/srv/api/records/3dbe0017-a71f-4923-9b44-fdb5afef5778 + + + + + + + + + + + + + EPSG:31370 + + + Belge 1972 / Belgian Lambert 72 (EPSG:31370) + + + Belge 1972 / Belgian Lambert 72 (EPSG:31370) + + + + + + + + + + + + + + + + + EPSG:4258 + + + ETRS89 (EPSG:4258) + + + ETRS89 (EPSG:4258) + + + + + + + + + + + + + + + + EPSG:3035 + + + ETRS89 / LAEA Europe (EPSG:3035) + + + ETRS89 / LAEA Europe (EPSG:3035) + + + + + + + + + + + + + + + + + EPSG:3812 + + + ETRS89 / Belgian Lambert 2008 (EPSG:3812) + + + ETRS89 / Belgian Lambert 2008 (EPSG:3812) + + + + + + + + + + + + + + + + + INSPIRE - Sites protégés en Wallonie (BE) - Service de téléchargement + + + + INSPIRE - Sites protégés en Wallonie (BE) - Service de + téléchargement + + + + INSPIRE - Protected site in Walloon region (BE) - Download + service + + + + + + + + 2017-11-15 + + + + + + + + + + 3dbe0017-a71f-4923-9b44-fdb5afef5778 + + + http://geodata.wallonie.be/id/ + + + + + + + Ce service de téléchargement ATOM Feed donne accès aux couches de données du thème INSPIRE + "Sites protégés" au sein du territoire wallon (Belgique). + + Ce service de téléchargement simple est fourni par le Service public de Wallonie (SPW) et permet le + téléchargement direct des couches de données géographiques constitutives du thème "sites protégés" de la + Directive INSPIRE (Annexe 1.9) sur l'ensemble du territoire wallon. Il utilise la technologie de flux de + données ATOM Feed. + + Le service est conforme aux spécifications de la Directive INSPIRE en la matière. + + Ce service de téléchargement simple permet d’accéder en téléchargement aux couches de données présentes dans + le thème "Sites protégés". Via ce service, les informations suivantes sont téléchargeables : + - "INSPIRE - Sites protégés en Wallonie" : série de couches de données regroupant l'ensemble des sites + protégés en Wallonie; + - "INSPIRE - Sites protégés Natura 2000 en Wallonie" : série de couches de données présentant uniquement les + sites classés selon le mécanisme de désignation Natura 2000; + - "INSPIRE - Sites protégés par type IUCN en Wallonie" : série de couches de données présentant uniquement les + sites classés selon le mécanisme de désignation IUCN; + - "INSPIRE - Sites protégés UNESCO en Wallonie" : série de couches de données présentant uniquement les sites + classés selon le mécanisme de désignation UNESCO; + - "INSPIRE - Sites protégés Monument National en Wallonie" : série de couches de données présentant uniquement + les sites classés selon le mécanisme de désignation Monument National + + Le service propose les opérations suivantes : + - Accéder aux métadonnées du service de téléchargement; + - Décrire la série de couche de données géographiques relative au thème "Sites protégés" ainsi que les séries + dérivées selon le mécanisme de désignation; + - Accéder aux séries de couches de données géographiques relatives au thème "Sites protégés" et aux sites de + désignation par site protégé. + + + + Ce service de téléchargement ATOM Feed donne accès aux couches de + données du thème INSPIRE + "Sites protégés" au sein du territoire wallon (Belgique). + + Ce service de téléchargement simple est fourni par le Service public de Wallonie (SPW) et permet le + téléchargement direct des couches de données géographiques constitutives du thème "sites protégés" de la + Directive INSPIRE (Annexe 1.9) sur l'ensemble du territoire wallon. Il utilise la technologie de flux de + données ATOM Feed. + + Le service est conforme aux spécifications de la Directive INSPIRE en la matière. + + Ce service de téléchargement simple permet d’accéder en téléchargement aux couches de données présentes + dans + le thème "Sites protégés". Via ce service, les informations suivantes sont téléchargeables : + - "INSPIRE - Sites protégés en Wallonie" : série de couches de données regroupant l'ensemble des sites + protégés en Wallonie; + - "INSPIRE - Sites protégés Natura 2000 en Wallonie" : série de couches de données présentant uniquement + les + sites classés selon le mécanisme de désignation Natura 2000; + - "INSPIRE - Sites protégés par type IUCN en Wallonie" : série de couches de données présentant uniquement + les + sites classés selon le mécanisme de désignation IUCN; + - "INSPIRE - Sites protégés UNESCO en Wallonie" : série de couches de données présentant uniquement les + sites + classés selon le mécanisme de désignation UNESCO; + - "INSPIRE - Sites protégés Monument National en Wallonie" : série de couches de données présentant + uniquement + les sites classés selon le mécanisme de désignation Monument National + + Le service propose les opérations suivantes : + - Accéder aux métadonnées du service de téléchargement; + - Décrire la série de couche de données géographiques relative au thème "Sites protégés" ainsi que les + séries + dérivées selon le mécanisme de désignation; + - Accéder aux séries de couches de données géographiques relatives au thème "Sites protégés" et aux sites + de + désignation par site protégé. + + + + + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW + Digital - Département de la Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + + + Direction de l'Intégration des géodonnées (SPW - Secrétariat général - SPW Digital + - Département de la Géomatique - Direction de l'Intégration des géodonnées) + + + + Direction de l'Intégration des géodonnées (SPW - + Secrétariat général - SPW Digital - Département de la Géomatique - Direction de l'Intégration des + géodonnées) + + + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + + + Service public de Wallonie (SPW) + + + Service public de Wallonie (SPW) + + + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + https://geoportail.wallonie.be + + + https://geoportail.wallonie.be + + + + + + WWW:LINK + + + Géoportail de la Wallonie + + + Géoportail de la Wallonie + + + + + + Géoportail de la Wallonie + + + Géoportail de la Wallonie + + + + + + + + + + + + + + + + + + + Région wallonne + + + Région wallonne + + + + + + + 2.75 + + + 6.50 + + + 49.45 + + + 50.85 + + + + + + + + + + https://metawal.wallonie.be/geonetwork/srv/api/records/3dbe0017-a71f-4923-9b44-fdb5afef5778/attachments/download_Inspire_20190430.png + + + + INSPIRE_PS_DS_PIC + + + INSPIRE_PS_DS_PIC + + + + + PNG + + + + + + + + Nature et environnement + + + + Nature et environnement + + + + + + Faune et flore + + + + Faune et flore + + + + + + + + + + Thèmes du + géoportail wallon + + + + Thèmes du géoportail wallon + + + + + + + + 2014-06-26 + + + + + + + + + + + geonetwork.thesaurus.external.theme.Themes_geoportail_wallon_hierarchy + + + + + + + + + + + + Sites protégés + + + Sites protégés + + + + + + + + + + GEMET - INSPIRE themes, version 1.0 + + + + GEMET - INSPIRE themes, version 1.0 + + + + + + + + 2008-06-01 + + + + + + + + + + + geonetwork.thesaurus.external.theme.httpinspireeceuropaeutheme-theme + + + + + + + + + + + + zones naturelles, paysages, écosystèmes + + + zones naturelles, paysages, écosystèmes + + + + + + politique environnementale + + + politique environnementale + + + + + biologie + + + biologie + + + + + + + + + + GEMET themes + + + GEMET themes + + + + + + + 2009-09-22 + + + + + + + + + + + geonetwork.thesaurus.external.theme.gemet-theme + + + + + + + + + + + + site naturel + + + site naturel + + + + + écologie + + + écologie + + + + + évaluation du patrimoine naturel + + + évaluation du patrimoine naturel + + + + + + politique de conservation de la nature + + + politique de conservation de la nature + + + + + + monument historique + + + monument historique + + + + + parc naturel + + + parc naturel + + + + + espace naturel + + + espace naturel + + + + + législation en matière de préservation de la nature + + + législation en matière de préservation de la nature + + + + + + conservation des ressources naturelles + + + conservation des ressources naturelles + + + + + + site naturel protégé + + + site naturel protégé + + + + + archéologie + + + archéologie + + + + + milieu naturel + + + milieu naturel + + + + + patrimoine naturel + + + patrimoine naturel + + + + + paysage + + + paysage + + + + + géologie + + + géologie + + + + + monument + + + monument + + + + + conservation + + + conservation + + + + + espace protégé + + + espace protégé + + + + + patrimoine culturel + + + patrimoine culturel + + + + + + + + + + GEMET + + + GEMET + + + + + + + 2009-09-22 + + + + + + + + + + + geonetwork.thesaurus.external.theme.gemet + + + + + + + + + + + + Reporting INSPIRE + + + Reporting INSPIRE + + + + + + + + + + Mots-clés InfraSIG + + + Mots-clés InfraSIG + + + + + + + 2022-10-03 + + + + + + + + + + + geonetwork.thesaurus.external.theme.infraSIG + + + + + + + + + + + + natura2000 + + + natura2000 + + + + + N2K + + + N2K + + + + + biodiversité + + + biodiversité + + + + + protected sites + + + protected sites + + + + + site protégé + + + site protégé + + + + + aire protégée + + + aire protégée + + + + + inspire + + + inspire + + + + + téléchargement + + + téléchargement + + + + + Feed + + + Feed + + + + + ATOM + + + ATOM + + + + + IUCN + + + IUCN + + + + + ProtectedSite + + + ProtectedSite + + + + + + + + + + + + + Service d’accès aux produits + + + + Service d’accès aux produits + + + + + + + + + + + Classification of spatial data services + + + + Classification of spatial data services + + + + + + + + 2008-12-03 + + + + + + + + + + + geonetwork.thesaurus.external.theme.httpinspireeceuropaeumetadatacodelistSpatialDataServiceCategory-SpatialDataServiceCategory + + + + + + + + + + + + Location of sites (Habitats Directive) + + + Location of sites (Habitats Directive) + + + + + + + + INSPIRE priority data set + + + INSPIRE priority data set + + + + + + + 2017-11-16 + + + + + + + + + + + + + + Régional + + + + Régional + + + + + + + + + + Champ géographique + + + + Champ géographique + + + + + + + 2019-05-22 + + + + + + + + + + + geonetwork.thesaurus.external.theme.httpinspireeceuropaeumetadatacodelistSpatialScope-SpatialScope + + + + + + + + + + + + + + + No + limitations to public access + + + + No + limitations to public access + + + + + + + + + + Conditions d'utilisation spécifiques + + + Conditions d'utilisation spécifiques + + + + + + + + + Les + conditions d'utilisation du service sont régies par les conditions d’accès et d’utilisation des services + web géographiques de visualisation du Service public de Wallonie. + + + + Les + conditions d'utilisation du service sont régies par les conditions d’accès et d’utilisation des + services + web géographiques de visualisation du Service public de Wallonie. + + + + + + + + download + + + + + + + + + GetOpenSearchDescription + + + + + + + + https://geoservices.wallonie.be/inspire/atom/PS_Opensearch.xml + + + + + https://geoservices.wallonie.be/inspire/atom/PS_Opensearch.xml + + + + + + INSPIRE Atom + + + Point de connection GetOpenSearchDescription + + + Point de connection GetOpenSearchDescription + + + + + + download, operation: GetOpenSearchDescription + + + download, operation: GetOpenSearchDescription + + + + + + + + + + + + + + + GetServiceATOMFeed + + + + + + + + https://geoservices.wallonie.be/inspire/atom/PS_Service.xml + + + + https://geoservices.wallonie.be/inspire/atom/PS_Service.xml + + + + + + INSPIRE Atom + + + Point de connection GetServiceATOMFeed + + + Point de connection GetServiceATOMFeed + + + + + + download, operation: GetServiceATOMFeed + + + download, operation: GetServiceATOMFeed + + + + + + + + + + + + + + + GetCapabilities + + + + + + + + https://geoservices.wallonie.be/wms/PS_Service + + + https://geoservices.wallonie.be/wms/PS_Service + + + + + + GetCapabilities + + + + + + + + + + + + + + + + + + + + + + + + + + + Service public de Wallonie (SPW) + + + Service public de Wallonie (SPW) + + + + + + + + + + helpdesk.carto@spw.wallonie.be + + + + + + + + + + + + + + + + + https://geoservices.wallonie.be/inspire/atom/PS_Service.xml + + + atom:feed + + + INSPIRE Sites Protégés - Service de téléchargement + + + INSPIRE Sites Protégés - Service de téléchargement + + + + + + Adresse de connexion au service de téléchargement ATOM Feed des couches de données + du thème "Sites protégés". + + + + Adresse de connexion au service de téléchargement ATOM + Feed des couches de données + du thème "Sites protégés". + + + + + + + + + + + + + + + + + + + + + + + + Service + + + Service + + + + + + + + + + + + + + + Règlement (CE) n o 976/2009 de la + Commission du 19 octobre 2009 portant modalités d’application de la directive 2007/2/CE du + Parlement européen et du Conseil en ce qui concerne les services en réseau + + + + Règlement (CE) n o 976/2009 de la Commission du 19 + octobre 2009 portant modalités d’application de la directive 2007/2/CE du Parlement européen + et du Conseil en ce qui concerne les services en réseau + + + + + + + + 2009-10-19 + + + + + + + + + + Voir la spécification référencée + + + Voir la spécification référencée + + + + + + true + + + + + + + + + + + + + RÈGLEMENT (UE) N o 1089/2010 DE LA + COMMISSION du 23 novembre 2010 portant modalités d'application de la directive 2007/2/CE du + Parlement européen et du Conseil en ce qui concerne l'interopérabilité des séries et des services + de données géographiques + + + + RÈGLEMENT (UE) N o 1089/2010 DE LA COMMISSION du 23 + novembre 2010 portant modalités d'application de la directive 2007/2/CE du Parlement européen + et du Conseil en ce qui concerne l'interopérabilité des séries et des services de données + géographiques + + + + + + + + 2010-12-08 + + + + + + + + + + Voir la spécification référencée + + + Voir la spécification référencée + + + + + + true + + + + + + + + + + + Ce service de téléchargement simple INSPIRE basé sur ATOM est au standard Atom RFC 4287, à + la spécification GeoRSS Simple et à la spécification OpenSearch (pour les éléments concernés). + + + + Ce service de téléchargement simple INSPIRE basé sur ATOM est au + standard Atom RFC 4287, à + la spécification GeoRSS Simple et à la spécification OpenSearch (pour les éléments concernés). + + + + + + + + + + + + + Service + + + Service + + + + + + + + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core-multipleAccrualPeriodicityAllowed.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core-multipleAccrualPeriodicityAllowed.rdf new file mode 100644 index 00000000000..680cea59e8a --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core-multipleAccrualPeriodicityAllowed.rdf @@ -0,0 +1,603 @@ + + + + + + + Dataset + + + + + + urn:uuid:{uuid} + 2023-12-08T12:26:19.337626Z + 2019-04-02T12:33:24 + Plan de secteur en vigueur (version coordonnée vectorielle) + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + + + + + ISO 19115 + 2003/Cor 1:2006 + + + + + + + + + + + + + Complete metadata + All information about the resource + + + Plan de secteur en vigueur (version coordonnée vectorielle) + 2023-03-31 + 2023-02-21 + 1.0 + http://geodata.wallonie.be/id/7fe2f305-1302-4297-b67e-792f55acd834 + + + + DGATLPE__PDS + BE.SPW.INFRASIG.CARTON + + + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + Mis à jour continue + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + + + Thierry Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + custodian + + + + + + + + + + + Jean Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + custodian + + + + + + + + + Service public de Wallonie (SPW) + + https://geoportail.wallonie.be + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + espace + zones naturelles, paysages, écosystèmes + législation + géographie + agriculture + aménagement du paysage + réseau ferroviaire + planification écologique + plan d'aménagement + extraction + habitat rural + gestion et planification rurale + secteur d'activité + infrastructure + plan de gestion + planification rurale + planification économique + plan + développement du territoire + infrastructure routière + plan d'occupation des sols + activité économique + réseau routier + planification urbaine + loisirs + canalisation + habitat urbain + mesure d'aménagement du territoire + territoire + planification régionale + habitat + PanierTelechargementGeoportail + Open Data + WalOnMap + Extraction_DIG + BDInfraSIGNO + aménagement du territoire + plan de secteur + point remarquable + PDS + CoDT + Point de vue + centre d'enfouissement + servitude + Code du Développement Territorial + + + Altitude + + + + + Caractéristiques géographiques + météorologiques + + + + + Caractéristiques géographiques + océanographiques + + + + + Conditions atmosphériques + + + + + Dénominations géographiques + + + + + Géologie + + + + + Hydrographie + + + + + Installations agricoles et aquacoles + + + + + Régions maritimes + + + + + Répartition des espèces + + + + + Ressources minérales + + + + + Santé et sécurité des personnes + + + Mobilité + Observation de la terre et environnement + + + + + + + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + 2014-04-17 + + + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + + + + + Agriculture, pêche, sylviculture et alimentation + + + + + Économie et finances + + + + + Énergie + + + + + Environnement + + + + + Santé + + + + + Régions et villes + + + + + Population et société + + + + + Science et technologie + + + 0.01 + P0Y2M0DT0H0M0S + + + + + + + + + + + + + Région wallonne + + + + + 2023-12-06 + 2023-12-08 + + + + + + + + + + + + + + + + + pds_codt_pic + + + + + 2023-12-08T00:00:00 + + + 10485760 + + + ESRI Shapefile (.shp) + + + + + + + + + + Application de consultation des données de la DGO4 - Plan de secteur + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + Application WalOnMap - Toute la Wallonie à la carte + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + Service de visualisation ESRI-REST + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation ESRI-REST + + + + + + + + Service de visualisation WMS + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation WMS + + + + + + + + + + + Base de données du Plan de secteur + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + Inventaire des données géographiques de la DGO4 + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + La Direction de l'Aménagement Régional + Site de la Direction de l'Aménagement Régional (DAR) + + + + + Plan de Secteur au format SHP + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core.rdf new file mode 100644 index 00000000000..f6d3f12c631 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-dataset-core.rdf @@ -0,0 +1,594 @@ + + + + + + + Dataset + + + + + + urn:uuid:{uuid} + 2023-12-08T12:26:19.337626Z + 2019-04-02T12:33:24 + Plan de secteur en vigueur (version coordonnée vectorielle) + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + + + + + ISO 19115 + 2003/Cor 1:2006 + + + + + + + + + + + + + Complete metadata + All information about the resource + + + Plan de secteur en vigueur (version coordonnée vectorielle) + 2023-03-31 + 2023-02-21 + 1.0 + http://geodata.wallonie.be/id/7fe2f305-1302-4297-b67e-792f55acd834 + + + + DGATLPE__PDS + BE.SPW.INFRASIG.CARTON + + + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + Mis à jour continue + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + + + Thierry Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + custodian + + + + + + + + + + + Jean Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + custodian + + + + + + + + + Service public de Wallonie (SPW) + + https://geoportail.wallonie.be + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + espace + zones naturelles, paysages, écosystèmes + législation + géographie + agriculture + aménagement du paysage + réseau ferroviaire + planification écologique + plan d'aménagement + extraction + habitat rural + gestion et planification rurale + secteur d'activité + infrastructure + plan de gestion + planification rurale + planification économique + plan + développement du territoire + infrastructure routière + plan d'occupation des sols + activité économique + réseau routier + planification urbaine + loisirs + canalisation + habitat urbain + mesure d'aménagement du territoire + territoire + planification régionale + habitat + PanierTelechargementGeoportail + Open Data + WalOnMap + Extraction_DIG + BDInfraSIGNO + aménagement du territoire + plan de secteur + point remarquable + PDS + CoDT + Point de vue + centre d'enfouissement + servitude + Code du Développement Territorial + + + Altitude + + + + + Caractéristiques géographiques + météorologiques + + + + + Caractéristiques géographiques + océanographiques + + + + + Conditions atmosphériques + + + + + Dénominations géographiques + + + + + Géologie + + + + + Hydrographie + + + + + Installations agricoles et aquacoles + + + + + Régions maritimes + + + + + Répartition des espèces + + + + + Ressources minérales + + + + + Santé et sécurité des personnes + + + Mobilité + Observation de la terre et environnement + + + + + + + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + 2014-04-17 + + + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + + + + + Agriculture, pêche, sylviculture et alimentation + + + + + Économie et finances + + + + + Énergie + + + + + Environnement + + + + + Santé + + + + + Régions et villes + + + + + Population et société + + + + + Science et technologie + + + 0.01 + P0Y2M0DT0H0M0S + + + + + + + + + + + + + Région wallonne + + + + + 2023-12-06 + 2023-12-08 + + + + + + + + pds_codt_pic + + + + + 2023-12-08T00:00:00 + + + 10485760 + + + ESRI Shapefile (.shp) + + + + + + + + + + Application de consultation des données de la DGO4 - Plan de secteur + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + Application WalOnMap - Toute la Wallonie à la carte + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + Service de visualisation ESRI-REST + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation ESRI-REST + + + + + + + + Service de visualisation WMS + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation WMS + + + + + + + + + + + Base de données du Plan de secteur + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + Inventaire des données géographiques de la DGO4 + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + La Direction de l'Aménagement Régional + Site de la Direction de l'Aménagement Régional (DAR) + + + + + Plan de Secteur au format SHP + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-hvd-dataset-core.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-hvd-dataset-core.rdf new file mode 100644 index 00000000000..122e264643b --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-hvd-dataset-core.rdf @@ -0,0 +1,604 @@ + + + + + + + Dataset + + + + + + urn:uuid:{uuid} + 2023-12-08T12:26:19.337626Z + 2019-04-02T12:33:24 + Plan de secteur en vigueur (version coordonnée vectorielle) + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + + + + + ISO 19115 + 2003/Cor 1:2006 + + + + + + + + + + + + + Complete metadata + All information about the resource + + + Plan de secteur en vigueur (version coordonnée vectorielle) + 2023-03-31 + 2023-02-21 + 1.0 + http://geodata.wallonie.be/id/7fe2f305-1302-4297-b67e-792f55acd834 + + + + DGATLPE__PDS + BE.SPW.INFRASIG.CARTON + + + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + Mis à jour continue + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + + + Thierry Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + custodian + + + + + + + + + + + Jean Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + custodian + + + + + + + + + Service public de Wallonie (SPW) + + https://geoportail.wallonie.be + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + espace + zones naturelles, paysages, écosystèmes + législation + géographie + agriculture + aménagement du paysage + réseau ferroviaire + planification écologique + plan d'aménagement + extraction + habitat rural + gestion et planification rurale + secteur d'activité + infrastructure + plan de gestion + planification rurale + planification économique + plan + développement du territoire + infrastructure routière + plan d'occupation des sols + activité économique + réseau routier + planification urbaine + loisirs + canalisation + habitat urbain + mesure d'aménagement du territoire + territoire + planification régionale + habitat + PanierTelechargementGeoportail + Open Data + WalOnMap + Extraction_DIG + BDInfraSIGNO + aménagement du territoire + plan de secteur + point remarquable + PDS + CoDT + Point de vue + centre d'enfouissement + servitude + Code du Développement Territorial + + + Altitude + + + + + Caractéristiques géographiques + météorologiques + + + + + Caractéristiques géographiques + océanographiques + + + + + Conditions atmosphériques + + + + + Dénominations géographiques + + + + + Géologie + + + + + Hydrographie + + + + + Installations agricoles et aquacoles + + + + + Régions maritimes + + + + + Répartition des espèces + + + + + Ressources minérales + + + + + Santé et sécurité des personnes + + + + + Mobilité + + + + + Observation de la terre et environnement + + + + + + + + + + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + 2014-04-17 + + + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + + + + + Agriculture, pêche, sylviculture et alimentation + + + + + Économie et finances + + + + + Énergie + + + + + Environnement + + + + + Santé + + + + + Régions et villes + + + + + Population et société + + + + + Science et technologie + + + + 0.01 + P0Y2M0DT0H0M0S + + + + + + + + + + + + + Région wallonne + + + + + 2023-12-06 + 2023-12-08 + + + + + + + + pds_codt_pic + + + + + 2023-12-08T00:00:00 + + + 10485760 + + + ESRI Shapefile (.shp) + + + + + + + + + + Application de consultation des données de la DGO4 - Plan de secteur + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + Application WalOnMap - Toute la Wallonie à la carte + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + Service de visualisation ESRI-REST + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation ESRI-REST + + + + + + + + Service de visualisation WMS + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation WMS + + + + + + + + + + + Base de données du Plan de secteur + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + Inventaire des données géographiques de la DGO4 + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + La Direction de l'Aménagement Régional + Site de la Direction de l'Aménagement Régional (DAR) + + + + + Plan de Secteur au format SHP + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-mobility-dataset-core.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-mobility-dataset-core.rdf new file mode 100644 index 00000000000..8aab00adcb8 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-dcat-ap-mobility-dataset-core.rdf @@ -0,0 +1,598 @@ + + + + + + + Dataset + + + + + + urn:uuid:{uuid} + 2023-12-08T12:26:19.337626Z + 2019-04-02T12:33:24 + Plan de secteur en vigueur (version coordonnée vectorielle) + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + + + + + ISO 19115 + 2003/Cor 1:2006 + + + + + + + + + + + + + Complete metadata + All information about the resource + + + Plan de secteur en vigueur (version coordonnée vectorielle) + 2023-03-31 + 2023-02-21 + 1.0 + http://geodata.wallonie.be/id/7fe2f305-1302-4297-b67e-792f55acd834 + + + + DGATLPE__PDS + BE.SPW.INFRASIG.CARTON + + + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + Mis à jour continue + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + + + + Thierry Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + custodian + + + + + + + + + + + Jean Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + custodian + + + + + + + + + Service public de Wallonie (SPW) + + https://geoportail.wallonie.be + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + espace + zones naturelles, paysages, écosystèmes + législation + géographie + agriculture + aménagement du paysage + réseau ferroviaire + planification écologique + plan d'aménagement + extraction + habitat rural + gestion et planification rurale + secteur d'activité + infrastructure + plan de gestion + planification rurale + planification économique + plan + développement du territoire + infrastructure routière + plan d'occupation des sols + activité économique + réseau routier + planification urbaine + loisirs + canalisation + habitat urbain + mesure d'aménagement du territoire + territoire + planification régionale + habitat + PanierTelechargementGeoportail + Open Data + WalOnMap + Extraction_DIG + BDInfraSIGNO + aménagement du territoire + plan de secteur + point remarquable + PDS + CoDT + Point de vue + centre d'enfouissement + servitude + Code du Développement Territorial + + + Altitude + + + + + Caractéristiques géographiques + météorologiques + + + + + Caractéristiques géographiques + océanographiques + + + + + Conditions atmosphériques + + + + + Dénominations géographiques + + + + + Géologie + + + + + Hydrographie + + + + + Installations agricoles et aquacoles + + + + + Régions maritimes + + + + + Répartition des espèces + + + + + Ressources minérales + + + + + Santé et sécurité des personnes + + + Mobilité + Observation de la terre et environnement + + + + + + + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + 2014-04-17 + + + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + + + + + Agriculture, pêche, sylviculture et alimentation + + + + + Économie et finances + + + + + Énergie + + + + + Environnement + + + + + Santé + + + + + Régions et villes + + + + + Population et société + + + + + Science et technologie + + + + + + 0.01 + P0Y2M0DT0H0M0S + + + + + + + + + + + + + Région wallonne + + + + + 2023-12-06 + 2023-12-08 + + + + + + + + pds_codt_pic + + + + + 2023-12-08T00:00:00 + + + 10485760 + + + ESRI Shapefile (.shp) + + + + + + + + + + Application de consultation des données de la DGO4 - Plan de secteur + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + Application WalOnMap - Toute la Wallonie à la carte + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + Service de visualisation ESRI-REST + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation ESRI-REST + + + + + + + + Service de visualisation WMS + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation WMS + + + + + + + + + + + Base de données du Plan de secteur + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + Inventaire des données géographiques de la DGO4 + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + La Direction de l'Aménagement Régional + Site de la Direction de l'Aménagement Régional (DAR) + + + + + Plan de Secteur au format SHP + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-geodcat-ap-dataset-core.rdf b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-geodcat-ap-dataset-core.rdf new file mode 100644 index 00000000000..2d8e2baf0ad --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/iso19115-3.2018-eu-geodcat-ap-dataset-core.rdf @@ -0,0 +1,606 @@ + + + + + + + Dataset + + + + + + + urn:uuid:{uuid} + 2023-12-08T12:26:19.337626Z + 2019-04-02T12:33:24 + Plan de secteur en vigueur (version coordonnée vectorielle) + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + + + + + UTF-8 + + + + ISO 19115 + 2003/Cor 1:2006 + + + + + + + + + + Direction de la gestion des informations territoriales (SPW - Territoire, Logement, + Patrimoine, Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction de la + gestion des informations territoriales) + + + + + + + + + + + + + + + + + Complete metadata + All information about the resource + + + Plan de secteur en vigueur (version coordonnée vectorielle) + 2023-03-31 + 2023-02-21 + 1.0 + http://geodata.wallonie.be/id/7fe2f305-1302-4297-b67e-792f55acd834 + + + + DGATLPE__PDS + BE.SPW.INFRASIG.CARTON + + + Le plan de secteur est un outil réglementaire d'aménagement du territoire et d'urbanisme + régional wallon constitué de plusieurs couches de données spatiales. + + Le plan de secteur organise l'espace territorial wallon et en définit les différentes affectations afin + d'assurer le développement des activités humaines de manière harmonieuse et d'éviter la consommation abusive + d'espace. Il dispose d'une pleine valeur réglementaire et constitue ainsi la colonne vertébrale d’un + développement territorial efficace, cohérent et concerté. Cet aspect est renforcé par la réforme engendrée par + l'entrée en vigueur du Code du Développement Territorial (CoDT). + + La Région wallonne est couverte par 23 plans de secteur, adoptés entre 1977 et 1987. + + Le plan de secteur est divisé en zones destinées à l'urbanisation (zone d'habitat, de loisirs, d'activité + économique, etc.) et en zones non destinées à l'urbanisation (zones agricoles, forestières, espaces verts, + etc.). Plusieurs couches de données spatiales constituent le plan de secteur. Elles sont définies dans le + CoDT. Outre la détermination des différentes zones d'affectation du territoire wallon, il contient : + - les limites communales du PdS; + - les révisions (infrastructures en révision, périmètres de révisions partielles du PdS, mesures + d'aménagement, prescriptions supplémentaires); + - les infrastructures (réseau routier, ferroviaire, voies navigables, lignes électriques haute tension, + canalisations); + - les périmètres de protection (périmètres de liaison écologique, d'intérêt paysager, d'intérêt culture, + historique ou esthétique, les points de vue remarquable et leur périmètre, les réservations d'infrastructure + principale, les extension de zone d'extraction); + - la référence au Plan de Secteur d'origine; + - les étiquettes des secteurs d'aménagement de 1978. + + Ces différentes couches de données sont présentées sous format vectoriel (point, ligne ou polygone). + + Si le plan de secteur a valeur réglementaire, il n’est pas figé pour autant. Les modalités de révision sont + formalisées dans des procédures qui ont été simplifiées et rationalisées dans le CoDT. Cette version constitue + la version la plus récente des couches de données et intègre les mises à jour faisant suite à la mise en œuvre + du CoDT. + + A ce jour, la gestion du plan de secteur relève de la Direction de l’Aménagement régional (DAR) qui est en + charge de l'outil "plan de secteur" : évolution au regard des objectifs régionaux, notamment du développement + économique dans une perspective durable, information, sensibilisation, lien avec la planification stratégique + régionale et avec les outils communaux. Les révisions sont instruites par la DAR, à l'exception de celles qui + ont été attribuées à la cellule de développement territorial (CDT), également dénommée "ESPACE", dont la + création a été décidée par le Gouvernement wallon le 19 septembre 2005. + + + Mis à jour continue + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Helpdesk carto du SPW (SPW - Secrétariat général - SPW Digital - Département de la + Géomatique - Direction de l'Intégration des géodonnées) + + + + + + + + + Thierry Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + + Jean Berthet + + + Direction du Développement territorial (SPW - Territoire, Logement, Patrimoine, + Énergie - Département de l'Aménagement du territoire et de l'Urbanisme - Direction du Développement + territorial) + + + + + + + + + + Service public de Wallonie (SPW) + + https://geoportail.wallonie.be + + + + + Agriculture + + + + + Société et activités + + + + + Aménagement du territoire + + + + + Plans et règlements + + + espace + zones naturelles, paysages, écosystèmes + législation + géographie + agriculture + aménagement du paysage + réseau ferroviaire + planification écologique + plan d'aménagement + extraction + habitat rural + gestion et planification rurale + secteur d'activité + infrastructure + plan de gestion + planification rurale + planification économique + plan + développement du territoire + infrastructure routière + plan d'occupation des sols + activité économique + réseau routier + planification urbaine + loisirs + canalisation + habitat urbain + mesure d'aménagement du territoire + territoire + planification régionale + habitat + PanierTelechargementGeoportail + Open Data + WalOnMap + Extraction_DIG + BDInfraSIGNO + aménagement du territoire + plan de secteur + point remarquable + PDS + CoDT + Point de vue + centre d'enfouissement + servitude + Code du Développement Territorial + + + Altitude + + + + + Caractéristiques géographiques + météorologiques + + + + + Caractéristiques géographiques + océanographiques + + + + + Conditions atmosphériques + + + + + Dénominations géographiques + + + + + Géologie + + + + + Hydrographie + + + + + Installations agricoles et aquacoles + + + + + Régions maritimes + + + + + Répartition des espèces + + + + + Ressources minérales + + + + + Santé et sécurité des personnes + + + Mobilité + Observation de la terre et environnement + + + + + + + + + + + + + Conditions d'accès et d'utilisation spécifiques + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Transport Networks – Technical Guidelines, + version 3.2 + 2014-04-17 + + + + + La version numérique vectorielle du plan de secteur se base sur la version papier originale + digitalisée par l'Institut Wallon en juin 1994 (fond de plan au 1/10.000) qui a été complétée en mai 2001 par + ce même institut. La donnée intègre la légende actuellement en vigueur et est mise à jour en continu par la + DGO4 depuis 2001. + + L'intégration des nouveaux dossiers, la correction d'erreurs et la suppression des dossiers abrogés se font au + fur et à mesure de la réception des informations. Les données publiées sont mises à jour mensuellement sur + base des données de travail. + + Depuis leur adoption, les plans de secteur ont fait l’objet de nombreuses révisions. Le Gouvernement wallon a + en effet estimé nécessaire de les adapter pour y inscrire de nouveaux projets: routes, lignes électriques à + haute tension, tracé TGV, nouvelles zones d'activité économique, zones d’extraction, etc. + + La procédure de révision et la légende ont été modifiées à plusieurs reprises. + + Suite à l'entrée en vigueur du CoDT, des changements sont à noter : + - Trois nouvelles zones destinées à l'urbanisation : Zone de dépendance d’extraction destinée à accueillir les + dépôts et dépendances industrielles (transformation des matières) à l’activité d’extraction, la zone d'enjeu + communal (ZEC) et la zone d'enjeu régional (ZER). Les ZEC et ZER sont toutes deux accompagnées d'une carte + d'affectation des sols à valeur indicative + - une nouvelle zone non destinée à l'urbanisation : zone d'extraction (ZE). + + + + + Agriculture, pêche, sylviculture et alimentation + + + + + Économie et finances + + + + + Énergie + + + + + Environnement + + + + + Santé + + + + + Régions et villes + + + + + Population et société + + + + + Science et technologie + + + + + + + + + + + + + + 0.01 + P0Y2M0DT0H0M0S + + + + + + + + + + + + + Région wallonne + + + + + 2023-12-06 + 2023-12-08 + + + + + + + + pds_codt_pic + + + + + 2023-12-08T00:00:00 + + + 10485760 + + + ESRI Shapefile (.shp) + + + + + + + + + + Application de consultation des données de la DGO4 - Plan de secteur + Application dédiée à la consultation des couches de données relatives au Plan de + secteur. Cette application constitue un thème de l'application de consultation des données de la DGO4. + + + + + Application WalOnMap - Toute la Wallonie à la carte + Application cartographique du Geoportail (WalOnMap) qui permet de découvrir les + données géographiques de la Wallonie. + + + + + Service de visualisation ESRI-REST + Ce service ESRI-REST permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation ESRI-REST + + + + + + + + Service de visualisation WMS + Ce service WMS permet de visualiser la série de couches de données "Plan de + secteur" + + + + + Service de visualisation WMS + + + + + + + + + + + Base de données du Plan de secteur + Site permettant la recherche de Plans de secteur et des modifications dans la base + de données + + + + + Inventaire des données géographiques de la DGO4 + Inventaire des données géographiques produites ou exploitées à la DGO4. + + + + + La Direction de l'Aménagement Régional + Site de la Direction de l'Aménagement Régional (DAR) + + + + + Plan de Secteur au format SHP + Dossier compressé contenant le jeu de données du Plan de Secteur au format + shapefile en coordonnées Lambert 72 + + + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/mobilitydcat-ap_shacl_shapes.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/mobilitydcat-ap_shacl_shapes.ttl new file mode 100644 index 00000000000..7fc10e5f229 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/mobilitydcat-ap_shacl_shapes.ttl @@ -0,0 +1,411 @@ +@prefix : . +@prefix mobilitydcatap: . +@prefix adms: . +@prefix bibo: . +@prefix dcat: . +@prefix dcatap: . +@prefix dct: . +@prefix dqv: . +@prefix foaf: . +@prefix locn: . +@prefix vcard: . +@prefix owl: . +@prefix rdf: . +@prefix oa: . +@prefix skos: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + + + a owl:Ontology , adms:Asset ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:versionIRI ; + adms:status ; + dcatap:availability dcatap:stable ; + dct:conformsTo ; + rdfs:isDefinedBy ; + dct:license ; + dct:created "2023-08-14"^^xsd:date ; + dct:issued "2023-08-14"^^xsd:date ; + dct:modified "2023-10-19"^^xsd:date ; + dct:dateCopyrighted "2023"^^xsd:gYear ; + dct:title "The constraints of mobilityDCAT-AP Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "1.0.0" ; + dct:description "This document specifies the constraints on properties and classes expressed by mobilityDCAT-AP in SHACL."@en ; + bibo:editor [ + a foaf:Person ; + owl:sameAs ; + owl:sameAs ; + foaf:name "Lina Molinas Comet" + ] ; + dct:creator [ a foaf:Group ; + foaf:name "NAPCORE SWG 4.4" ; + foaf:page ] ; + dct:publisher ; + dct:rightsHolder ; + dcat:distribution [ a adms:AssetDistribution ; + dct:format , + ; + dct:title "SHACL (Turtle)"@en ; + dcat:downloadURL ; + dcat:mediaType "text/turtle"^^dct:IMT + ] ; + . + +#------------------------------------------------------------------------- +# The shapes in this file complement the DCAT-AP ones to cover all classes +# in mobilityDCAT-AP 1.0.0. +#------------------------------------------------------------------------- + +:Address_Agent_Shape + a sh:NodeShape ; + sh:name "Address (Agent)"@en ; + sh:property [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:adminUnitL2 ; + sh:name "administrative area" ; + sh:description "The administrative area of an Address of the Agent. Depending on the country, this corresponds to a province, a county, a region, or a state." ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:postName ; + sh:name "city" ; + sh:description "The city of an Address of the Agent." ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:adminUnitL1 ; + sh:name "country" ; + sh:description "The country of an Address of the Agent." ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:postCode ; + sh:name "postal code" ; + sh:description "The postal code of an Address of the Agent." ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:thoroughfare ; + sh:name "street address" ; + sh:description "In mobilityDCAT-AP, this is a recommended property to be used for Address (Agent)" ; + sh:severity sh:Violation + ] ; + sh:targetClass locn:Address . + +:Agent_Shape + a sh:NodeShape ; + sh:name "Agent"@en ; + sh:property [ + sh:maxCount 1 ; + sh:class owl:Thing ; + sh:path foaf:mbox ; + sh:name "email" ; + sh:description "This property SHOULD be used to provide the email address of the Agent, specified using fully qualified mailto: URI scheme [RFC6068]. The email SHOULD be used to establish a communication channel to the agent." ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:class rdfs:Resource ; + sh:path foaf:workplaceHomepage ; + sh:name "URL" ; + sh:description "This property MAY be used to specify the Web site of the Agent." ; + sh:severity sh:Violation + ]; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + sh:name "Catalogue Record"@en ; + sh:property [ + sh:minCount 1 ; + sh:maxCount 1 ; + sh:path dct:created ; + sh:or ( + [ + sh:datatype xsd:date ; + ] + [ + sh:datatype xsd:dateTime ; + ] + ); + sh:name "creation date" ; + sh:description "This property contains the date stamp (date and time) when the metadata entry was created for the first time. It SHOULD be generated by the system, whenever a platform user enters the metadata entry. " ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Dataset_Shape + a sh:NodeShape ; + sh:name "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:class skos:Concept ; + sh:path mobilitydcatap:mobilityTheme ; + sh:name "mobility theme" ; + sh:description "This property refers to the mobility-related theme (i.e., a specific subject, category, or type) of the delivered content. A dataset may be associated with multiple themes. A theme is important for data seekers who are interested in a particular type of data content. " ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path mobilitydcatap:georeferencingMethod ; + sh:name "georeferencing method" ; + sh:description "This property SHOULD be used to specify the georeferencing method used in the dataset." ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path mobilitydcatap:networkCoverage ; + sh:name "network coverage" ; + sh:description "This property describes the part of the transport network that is covered by the delivered content. For road traffic, the property SHOULD refer to the network classification for which the data is provided. As a minimum, an international or higher-level classification, e.g., via functional road classes, is recommended to allow data search across different countries. In addition, national classifications are allowed." ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:name "reference system" ; + sh:description "This property SHOULD be used to specify the spatial reference system used in the dataset. Spatial reference systems SHOULD be specified by using the corresponding URIs from the “EPSG coordinate reference systems” register operated by OGC." ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:rightsHolder ; + sh:name "rights holder" ; + sh:description "This property refers to an entity that legally owns or holds the rights of the data provided in a dataset. This entity is legally responsible for the content of the data. It is also responsible for any statements about the data quality (if applicable, see property dqv:hasQualityAnnotation) and/or the relevance to legal frameworks (if applicable, see property dcatap:applicableLegislation)." ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path mobilitydcatap:transportMode ; + sh:name "transport mode" ; + sh:description "This property describes the transport mode that is covered by the delivered content. Data can be valid for more than one mode, so a multiple choice should be applied. " ; + sh:severity sh:Violation + ]; + sh:targetClass dcat:Dataset . + +:Distribution_Shape + a sh:NodeShape ; + sh:name "Distribution"@en ; + sh:property [ + sh:class skos:Concept ; + sh:minCount 1 ; + sh:maxCount 1 ; + sh:path mobilitydcatap:mobilityDataStandard ; + sh:name "mobility data standard" ; + sh:description "This property describes the mobility data standard, as applied for the delivered content within the Distribution. A mobility data standard, e.g., DATEX II, combines syntax and semantic definitions of entities in a certain domain (e.g., for DATEX II: road traffic information), and optionally adds technical rules for data exchange. " ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path mobilitydcatap:applicationLayerProtocol ; + sh:name "application layer protocol" ; + sh:description "This property describes the transmitting channel, i.e., the Application Layer Protocol, of the distribution." ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + +:Kind_Shape + a sh:NodeShape ; + sh:name "Kind"@en ; + sh:property [ + sh:class owl:Thing ; + sh:minCount 1 ; + sh:path vcard:hasEmail ; + sh:name "email" ; + sh:description "This property contains an email address of the Kind, specified using fully qualified mailto: URI scheme [RFC6068]. " ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path vcard:fn ; + sh:minCount 1 ; + sh:name "name" ; + sh:description "This property contains a name of the Kind. This property can be repeated for different versions of the name (e.g., the name in different languages) - see § 8. Accessibility and Multilingual Aspects." ; + sh:severity sh:Violation + ], [ + sh:class owl:Thing ; + sh:path vcard:hasURL ; + sh:maxCount 1 ; + sh:name "URL" ; + sh:description "This property points to a Web site of the Kind." ; + sh:severity sh:Violation + ]; + sh:targetClass vcard:Kind . + +:LicenseDocument_Shape + a sh:NodeShape ; + sh:name "License Document"@en ; + sh:property [ + sh:class skos:Concept ; + sh:maxCount 1 ; + sh:path dct:identifier ; + sh:name "Standard licence" ; + sh:description "This property MAY be be used to link to a concrete standard license. A controlled vocabulary § 5.2 Controlled vocabularies to be used is provided. " ; + sh:severity sh:Violation + ]; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + sh:name "Location"@en ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:path skos:inScheme ; + sh:maxCount 1 ; + sh:name "gazetteer" ; + sh:description "This property MAY be used to specify the gazetteer to which the Location belongs. " ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:identifier ; + sh:name "geographic identifier" ; + sh:description "This property contains the geographic identifier for the Location, e.g., the URI or other unique identifier in the context of the relevant gazetteer." ; + sh:severity sh:Violation + ]; + sh:targetClass dct:Location . + +:RightsStatement_Shape + a sh:NodeShape ; + sh:name "Rights Statement"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:maxCount 1 ; + sh:name "conditions for access and usage" ; + sh:description "This property SHOULD be used to indicate the conditions if any contracts, licences and/or are applied for the use of the dataset. The conditions are declared on an aggregated level: whether a free and unrestricted use is possible, a contract has to be concluded and/or a licence has to be agreed on to use a dataset. " ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path rdfs:label ; + sh:name "Additional information for access and usage" ; + sh:description "This property MAY describes in a textual form any additional access, usage or licensing information, besides other information under classes dct:RightsStatement and dct:LicenseDocument. " ; + sh:severity sh:Violation + ]; + sh:targetClass dct:RightsStatement . + +#------------------------------------------------------------------------- +# Concepts from controlled vocabularies defined and used in mobilityDCAT-AP. +#------------------------------------------------------------------------- + + a skos:ConceptScheme ; + skos:prefLabel "Data model"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Data content category"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Update frequency"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Georeferencing method"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Network coverage"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Transport mode"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Service category"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Grammar"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Application layer protocol"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Communication method"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Conditions for access and usage"@en ; +. + +#------------------------------------------------------------------------- +# Concepts from additional controlled vocabularies used in mobilityDCAT-AP. +#------------------------------------------------------------------------- + + a skos:ConceptScheme ; + skos:prefLabel "Data Themes"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Dataset Theme Vocabulary"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Access right"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Frequency"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "OGC EPSG Coordinate Reference Systems Register"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "File Type"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Language"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Corporate body"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Continents"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Countries"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "Places"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "GeoNames"@en ; +. + + a skos:ConceptScheme; + skos:prefLabel "NUTS (Nomenclature of Territorial Units for Statistics)"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "ADMS publisher type"@en ; +. + + a skos:ConceptScheme ; + skos:prefLabel "European Legislation Identifier (ELI)"@en ; +. \ No newline at end of file diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-2.1.1-base-SHACL.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-2.1.1-base-SHACL.ttl new file mode 100644 index 00000000000..1e5ab9d194f --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-2.1.1-base-SHACL.ttl @@ -0,0 +1,7771 @@ +# FROM https://www.itb.ec.europa.eu/shacl/dcat-ap/upload +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcam: . +@prefix dcat: . +@prefix dcatap: . +@prefix dcterms: . +@prefix dctype: . +@prefix doap: . +@prefix foaf: . +@prefix geo: . +@prefix gsp: . +@prefix j.0: . +@prefix locn: . +@prefix odrl: . +@prefix org: . +@prefix owl: . +@prefix prov: . +@prefix rdf: . +@prefix rdfs: . +@prefix rec: . +@prefix sdo: . +@prefix sf: . +@prefix sh: . +@prefix sioc: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vann: . +@prefix vcard: . +@prefix voaf: . +@prefix vs: . +@prefix wdsr: . +@prefix xsd: . + +prov:entity rdf:type owl:ObjectProperty ; + rdfs:domain prov:EntityInfluence ; + rdfs:isDefinedBy ; + rdfs:label "entity" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:influencer ; + prov:category "qualified" ; + prov:editorialNote "This property behaves in spirit like rdf:object; it references the object of a prov:wasInfluencedBy triple."@en ; + prov:editorsDefinition "The prov:entity property references an prov:Entity which influenced a resource. This property applies to an prov:EntityInfluence, which is given by a subproperty of prov:qualifiedInfluence from the influenced prov:Entity, prov:Activity or prov:Agent." ; + prov:inverse "entityOfInfluence" . + +spdx:relationshipType_packageOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "To be used when SPDXRef-A is used as a package as part of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +dcat:DataService rdf:type owl:Class ; + rdfs:comment "A site or end-point providing operations related to the discovery of, access to, or processing functions on, data or related resources."@en , "Umístění či přístupový bod poskytující operace související s hledáním, přistupem k, či výkonem funkcí na datech či souvisejících zdrojích."@cs , "Et websted eller endpoint der udstiller operationer relateret til opdagelse af, adgang til eller behandlende funktioner på data eller relaterede ressourcer."@da , "Un sitio o end-point que provee operaciones relacionadas a funciones de descubrimiento, acceso, o procesamiento de datos o recursos relacionados."@es , "Un sito o end-point che fornisce operazioni relative alla scoperta, all'accesso o all'elaborazione di funzioni su dati o risorse correlate."@it ; + rdfs:label "Servizio di dati"@it , "Data service"@en , "Servicio de datos"@es , "Datatjeneste"@da ; + rdfs:subClassOf dctype:Service , dcat:Resource ; + skos:altLabel "Dataservice"@da ; + skos:changeNote "New class added in DCAT 2.0."@en , "Nová třída přidaná ve verzi DCAT 2.0."@cs , "Ny klasse tilføjet i DCAT 2.0."@da , "Nueva clase añadida en DCAT 2.0."@es , "Nuova classe aggiunta in DCAT 2.0."@it ; + skos:definition "Umístění či přístupový bod poskytující operace související s hledáním, přistupem k, či výkonem funkcí na datech či souvisejících zdrojích."@cs , "Un sitio o end-point que provee operaciones relacionadas a funciones de descubrimiento, acceso, o procesamiento de datos o recursos relacionados."@es , "A site or end-point providing operations related to the discovery of, access to, or processing functions on, data or related resources."@en , "Et site eller endpoint der udstiller operationer relateret til opdagelse af, adgang til eller behandlende funktioner på data eller relaterede ressourcer."@da , "Un sito o end-point che fornisce operazioni relative alla scoperta, all'accesso o all'elaborazione di funzioni su dati o risorse correlate."@it ; + skos:scopeNote "Pokud je dcat:DataService navázána na jednu či více Datových sad, jsou tyto indikovány vlstností dcat:servesDataset."@cs , "El tipo de servicio puede indicarse usando la propiedad dct:type. Su valor puede provenir de un vocabulario controlado, como por ejemplo el vocabulario de servicios de datos espaciales de INSPIRE."@es , "Hvis en dcat:DataService er bundet til en eller flere specifikke datasæt kan dette indikeres ved hjælp af egenskaben dcat:servesDataset. "@da , "Druh služby může být indikován vlastností dct:type. Její hodnota může být z řízeného slovníku, kterým je například slovník typů prostorových datových služeb INSPIRE."@cs , "If a dcat:DataService is bound to one or more specified Datasets, they are indicated by the dcat:servesDataset property."@en , "Si un dcat:DataService está asociado con uno o más conjuntos de datos especificados, dichos conjuntos de datos pueden indicarse con la propiedad dcat:servesDataset."@es , "Il tipo di servizio può essere indicato usando la proprietà dct:type. Il suo valore può essere preso da un vocabolario controllato come il vocabolario dei tipi di servizi per dati spaziali di INSPIRE."@it , "Se un dcat:DataService è associato a uno o più Dataset specificati, questi sono indicati dalla proprietà dcat:serveDataset."@it , "The kind of service can be indicated using the dct:type property. Its value may be taken from a controlled vocabulary such as the INSPIRE spatial data service type vocabulary."@en , "Datatjenestetypen kan indikeres ved hjælp af egenskaben dct:type. Værdien kan tages fra kontrollerede udfaldsrum såsom INSPIRE spatial data service vocabulary."@da . + +spdx:relationshipType + rdf:type owl:ObjectProperty ; + rdfs:comment "Describes the type of relationship between two SPDX elements."@en ; + rdfs:domain spdx:Relationship ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_amendment ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_ancestorOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_buildToolOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_containedBy ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_contains ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_copyOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_dataFile ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_dataFileOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_descendantOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_describedBy ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_describes ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_distributionArtifact ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_documentation ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_dynamicLink ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_expandedFromArchive ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_fileAdded ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_fileDeleted ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_fileModified ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_generatedFrom ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_generates ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_hasPrerequisite ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_metafileOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_optionalComponentOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_other ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_packageOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_patchApplied ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_patchFor ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_prerequisiteFor ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_staticLink ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_testcaseOf ; + owl:onProperty spdx:relationshipType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:relationshipType_variantOf ; + owl:onProperty spdx:relationshipType + ] + ) + ] ; + vs:term_status "stable"@en . + +spdx:packageName rdf:type owl:DatatypeProperty ; + rdfs:comment "Identify the full name of the package as given by Package Originator."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + rdfs:subPropertyOf spdx:name ; + vs:term_status "stable"@en . + +spdx:licenseInfoFromFiles + rdf:type owl:ObjectProperty ; + rdfs:comment "The licensing information that was discovered directly within the package. There will be an instance of this property for each distinct value of alllicenseInfoInFile properties of all files contained in the package.\n\nIf the licenseInfoFromFiles field is not present for a package and filesAnalyzed property for that same pacakge is true or omitted, it implies an equivalent meaning to NOASSERTION."@en ; + rdfs:domain spdx:Package ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( spdx:AnyLicenseInfo + [ rdf:type owl:Restriction ; + owl:hasValue spdx:noassertion ; + owl:onProperty spdx:licenseInfoFromFiles + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:none ; + owl:onProperty spdx:licenseInfoFromFiles + ] + ) + ] ; + vs:term_status "stable"@en . + +vcard:Msg rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Msg"@en ; + rdfs:subClassOf vcard:TelephoneType ; + owl:deprecated true . + +[ rdf:type owl:AllDifferent ; + owl:distinctMembers ( spdx:annotationType_other spdx:annotationType_review ) +] . + +vcard:Intl rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Intl"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + +spdx:licenseComments rdf:type owl:DatatypeProperty ; + rdfs:comment "The licenseComments property allows the preparer of the SPDX document to describe why the licensing in spdx:licenseConcluded was chosen."@en ; + rdfs:domain spdx:SpdxItem ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:packageVerificationCodeValue + rdf:type owl:DatatypeProperty ; + rdfs:comment "The actual package verification code as a hex encoded value."@en ; + rdfs:domain spdx:PackageVerificationCode ; + rdfs:range xsd:hexBinary ; + vs:term_status "stable"@en . + +dcterms:creator rdf:type rdf:Property ; + rdfs:comment "An entity responsible for making the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Creator"@en ; + rdfs:subPropertyOf dcterms:contributor , dc:creator ; + dcam:rangeIncludes dcterms:Agent ; + dcterms:description "Recommended practice is to identify the creator with a URI. If this is not possible or feasible, a literal value that identifies the creator may be provided."@en ; + dcterms:issued "2008-01-14"^^xsd:date ; + owl:equivalentProperty foaf:maker . + +dcterms:contributor rdf:type rdf:Property ; + rdfs:comment "An entity responsible for making contributions to the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Contributor"@en ; + rdfs:subPropertyOf dc:contributor ; + dcam:rangeIncludes dcterms:Agent ; + dcterms:description "The guidelines for using names of persons or organizations as creators apply to contributors."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:Car rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Car"@en ; + rdfs:subClassOf vcard:TelephoneType ; + owl:deprecated true . + +spdx:ListedLicense rdf:type owl:Class ; + rdfs:comment "A license which is included in the SPDX License List (http://spdx.org/licenses)."@en ; + rdfs:subClassOf spdx:License ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:deprecatedVersion + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:isDeprecatedLicenseId + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseTextHtml + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:standardLicenseHeaderHtml + ] ; + vs:term_status "stable"@en . + +vcard:hasValue rdf:type owl:ObjectProperty ; + rdfs:comment "Used to indicate the resource value of an object property that requires property parameters"@en ; + rdfs:isDefinedBy ; + rdfs:label "has value"@en . + +vcard:n rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "name"@en ; + owl:equivalentProperty vcard:hasName . + +vcard:honorific-suffix + rdf:type owl:DatatypeProperty ; + rdfs:comment "The honorific suffix of the name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "honorific suffix"@en ; + rdfs:range xsd:string . + +dcterms:dateSubmitted + rdf:type rdf:Property ; + rdfs:comment "Date of submission of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Submitted"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty. Examples of resources to which a 'Date Submitted' may be relevant include a thesis (submitted to a university department) or an article (submitted to a journal)."@en ; + dcterms:issued "2002-07-13"^^xsd:date . + +prov:editorsDefinition + rdf:type owl:AnnotationProperty ; + rdfs:comment "When the prov-o term does not have a definition drawn from prov-dm, and the prov-o editor provides one."@en ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf prov:definition . + +dcat:compressFormat rdf:type rdf:Property , owl:ObjectProperty ; + rdfs:comment "Il formato di compressione della distribuzione nel quale i dati sono in forma compressa, ad es. per ridurre le dimensioni del file da scaricare."@it , "Formát komprese souboru, ve kterém jsou data poskytována v komprimované podobě, např. ke snížení velikosti souboru ke stažení."@cs , "The compression format of the distribution in which the data is contained in a compressed form, e.g. to reduce the size of the downloadable file."@en , "Kompressionsformatet for distributionen som indeholder data i et komprimeret format, fx for at reducere størrelsen af downloadfilen."@da , "El formato de la distribución en el que los datos están en forma comprimida, e.g. para reducir el tamaño del archivo a bajar."@es ; + rdfs:domain dcat:Distribution ; + rdfs:isDefinedBy ; + rdfs:label "compression format"@en , "kompressionsformat"@da , "formato de compresión"@es , "formato di compressione"@it , "formát komprese"@cs ; + rdfs:range dcterms:MediaType ; + rdfs:subPropertyOf dcterms:format ; + skos:changeNote "Ny egenskab tilføjet i DCAT 2.0."@da , "Nueva propiedad agregada en DCAT 2.0."@es , "Nuova proprietà aggiunta in DCAT 2.0."@it , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "New property added in DCAT 2.0."@en ; + skos:definition "Kompressionsformatet for distributionen som indeholder data i et komprimeret format, fx for at reducere størrelsen af downloadfilen."@da , "Formát komprese souboru, ve kterém jsou data poskytována v komprimované podobě, např. ke snížení velikosti souboru ke stažení."@cs , "El formato de la distribución en el que los datos están en forma comprimida, e.g. para reducir el tamaño del archivo a bajar."@es , "Il formato di compressione della distribuzione nel quale i dati sono in forma compressa, ad es. per ridurre le dimensioni del file da scaricare."@it , "The compression format of the distribution in which the data is contained in a compressed form, e.g. to reduce the size of the downloadable file."@en ; + skos:scopeNote "Questa proprietà deve essere utilizzata quando i file nella distribuzione sono compressi, ad es. in un file ZIP. Il formato DOVREBBE essere espresso usando un tipo di media come definito dal registro dei tipi di media IANA https://www.iana.org/assignments/media-types/, se disponibile."@it , "Denne egenskab kan anvendes når filerne i en distribution er blevet komprimeret, fx i en ZIP-fil. Formatet BØR udtrykkes ved en medietype som defineret i 'IANA media types registry', hvis der optræder en relevant medietype dér: https://www.iana.org/assignments/media-types/."@da , "This property is to be used when the files in the distribution are compressed, e.g. in a ZIP file. The format SHOULD be expressed using a media type as defined by IANA media types registry https://www.iana.org/assignments/media-types/, if available."@en , "Tato vlastnost se použije, když jsou soubory v distribuci komprimovány, např. v ZIP souboru. Formát BY MĚL být vyjádřen pomocí typu média definovaného v registru IANA https://www.iana.org/assignments/media-types/, pokud existuje."@cs , "Esta propiedad se debe usar cuando los archivos de la distribución están comprimidos, por ejemplo en un archivo ZIP. El formato DEBERÍA expresarse usando un 'media type', tales como los definidos en el registro IANA de 'media types' https://www.iana.org/assignments/media-types/, si está disponibles."@es . + +dcat:keyword rdf:type rdf:Property , owl:DatatypeProperty ; + rdfs:comment "Una parola chiave o un'etichetta per descrivere la risorsa."@it , "Et nøgleord eller tag til beskrivelse af en ressource."@da , "Μία λέξη-κλειδί ή μία ετικέτα που περιγράφει το σύνολο δεδομένων."@el , "Un mot-clé ou étiquette décrivant une ressource."@fr , "Una palabra clave o etiqueta que describe un recurso."@es , "Klíčové slovo nebo značka popisující zdroj."@cs , "A keyword or tag describing a resource."@en , "データセットを記述しているキーワードまたはタグ。"@ja , "كلمة مفتاحيه توصف قائمة البيانات"@ar ; + rdfs:isDefinedBy ; + rdfs:label "كلمة مفتاحية "@ar , "mot-clés "@fr , "λέξη-κλειδί"@el , "キーワード/タグ"@ja , "nøgleord"@da , "palabra clave"@es , "keyword"@en , "parola chiave"@it , "klíčové slovo"@cs ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dcterms:subject ; + skos:definition "Klíčové slovo nebo značka popisující zdroj."@cs , "データセットを記述しているキーワードまたはタグ。"@ja , "Un mot-clé ou étiquette décrivant une ressource."@fr , "A keyword or tag describing a resource."@en , "Una palabra clave o etiqueta que describe un recurso."@es , "Et nøgleord eller tag til beskrivelse af en ressource."@da , "كلمة مفتاحيه توصف قائمة البيانات"@ar , "Μία λέξη-κλειδί ή μία ετικέτα που περιγράφει το σύνολο δεδομένων."@el , "Una parola chiave o un'etichetta per descrivere la risorsa."@it . + +[ rdf:type owl:Axiom ; + owl:annotatedProperty rdfs:range ; + owl:annotatedSource prov:wasInfluencedBy ; + owl:annotatedTarget [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + prov:definition "influencer: an identifier (o1) for an ancestor entity, activity, or agent that the former depends on;" ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence" +] . + +vcard:sort-string rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the string to be used for national-language-specific sorting. Used as a property parameter only."@en ; + rdfs:isDefinedBy ; + rdfs:label "sort as"@en ; + rdfs:range xsd:string . + +dcat:centroid rdf:type owl:DatatypeProperty , rdf:Property ; + rdfs:domain dcterms:Location ; + rdfs:label "centroid"@cs , "centroide"@it , "centroide"@es , "centroid"@en , "geometrisk tyngdepunkt"@da ; + rdfs:range rdfs:Literal ; + skos:altLabel "centroide"@da ; + skos:changeNote "Ny egenskab tilføjet i DCAT 2.0."@da , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "Nuova proprietà aggiunta in DCAT 2.0."@it , "Nueva propiedad agregada en DCAT 2.0."@es , "New property added in DCAT 2.0."@en ; + skos:definition "Il centro geografico (centroide) di una risorsa."@it , "Geografický střed (centroid) zdroje."@cs , "Det geometrisk tyngdepunkt (centroid) for en ressource."@da , "El centro geográfico (centroide) de un recurso."@es , "The geographic center (centroid) of a resource."@en ; + skos:scopeNote "Rækkevidden for denne egenskab er bevidst generisk definere med det formål at tillade forskellige geokodninger. Geometrien kan eksempelvis repræsenteres som WKT (geosparql:asWKT [GeoSPARQL]) eller [GML] (geosparql:asGML [GeoSPARQL])."@da , "The range of this property is intentionally generic, with the purpose of allowing different geometry encodings. E.g., the geometry could be encoded with as WKT (geosparql:wktLiteral [GeoSPARQL]) or [GML] (geosparql:asGML [GeoSPARQL])."@en , "Obor hodnot této vlastnosti je úmyslně obecný, aby umožnil různé kódování geometrií. Geometrie by kupříkladu mohla být kódována jako WKT (geosparql:wktLiteral [GeoSPARQL]) či [GML] (geosparql:asGML [GeoSPARQL])."@cs , "El rango de esta propiedad es intencionalmente genérico con el objetivo de permitir distintas codificaciones geométricas. Por ejemplo, la geometría puede codificarse como WKT (geosparql:wktLiteral [GeoSPARQL]) o [GML] (geosparql:asGML [GeoSPARQL])."@es , "Il range di questa proprietà è volutamente generica, con lo scopo di consentire diverse codifiche geometriche. Ad esempio, la geometria potrebbe essere codificata con WKT (geosparql:wktLiteral [GeoSPARQL]) o [GML] (geosparql:asGML [GeoSPARQL])."@it . + +spdx:relationshipType_dataFile + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a data file used in SPDXRef-B. Replaced by relationshipType_dataFileOf"@en ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +dcterms:hasVersion rdf:type rdf:Property ; + rdfs:comment "A related resource that is a version, edition, or adaptation of the described resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Has Version"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "Changes in version imply substantive changes in content rather than differences in format. This property is intended to be used with non-literal values. This property is an inverse property of Is Version Of."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +skos:changeNote rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "change note"@en ; + rdfs:subPropertyOf skos:note ; + skos:definition "A note about a modification to a concept."@en . + +spdx:relationshipType_ancestorOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_ancestorOf expresses that an SPDXElement is an ancestor of (same lineage but pre-dates) the relatedSPDXElement. For example, an upstream File is an ancestor of a modified downstream File"@en ; + vs:term_status "stable"@en . + +vcard:hasUID rdf:type owl:ObjectProperty ; + rdfs:comment "To specify a value that represents a globally unique identifier corresponding to the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has uid"@en . + +prov:Usage rdf:type owl:Class ; + rdfs:comment "An instance of prov:Usage provides additional descriptions about the binary prov:used relation from some prov:Activity to an prov:Entity that it used. For example, :keynote prov:used :podium; prov:qualifiedUsage [ a prov:Usage; prov:entity :podium; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Usage" ; + rdfs:subClassOf prov:InstantaneousEvent , prov:EntityInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Usage is the beginning of utilizing an entity by an activity. Before usage, the activity had not begun to utilize this entity and could not have been affected by the entity."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Usage"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Usage"^^xsd:anyURI ; + prov:unqualifiedForm prov:used . + +time:TRS rdf:type owl:Class ; + rdfs:comment "A temporal reference system, such as a temporal coordinate system (with an origin, direction, and scale), a calendar-clock combination, or a (possibly hierarchical) ordinal system. \n\nThis is a stub class, representing the set of all temporal reference systems."@en , "Un sistema de referencia temporal, tal como un sistema de coordenadas temporales (con un origen, una dirección y una escala), una combinación calendario-reloj, o un sistema ordinal (posiblemente jerárquico).\n Esta clase comodín representa el conjunto de todos los sistemas de referencia temporal."@es ; + rdfs:label "Temporal Reference System"@en , "sistema de referencia temporal"@es ; + skos:definition "A temporal reference system, such as a temporal coordinate system (with an origin, direction, and scale), a calendar-clock combination, or a (possibly hierarchical) ordinal system. \n\nThis is a stub class, representing the set of all temporal reference systems."@en , "Un sistema de referencia temporal, tal como un sistema de coordenadas temporales (con un origen, una dirección y una escala), una combinación calendario-reloj, o un sistema ordinal (posiblemente jerárquico).\n Esta clase comodín representa el conjunto de todos los sistemas de referencia temporal."@es ; + skos:note "A taxonomy of temporal reference systems is provided in ISO 19108:2002 [ISO19108], including (a) calendar + clock systems; (b) temporal coordinate systems (i.e. numeric offset from an epoch); (c) temporal ordinal reference systems (i.e. ordered sequence of named intervals, not necessarily of equal duration)."@en , "En el ISO 19108:2002 [ISO19108] se proporciona una taxonomía de sistemas de referencia temporal, incluyendo (a) sistemas de calendario + reloj; (b) sistemas de coordenadas temporales (es decir, desplazamiento numérico a partir de una época); (c) sistemas de referencia ordinales temporales (es decir, secuencia ordenada de intervalos nombrados, no necesariamente de igual duración)."@es . + +vcard:given-name rdf:type owl:DatatypeProperty ; + rdfs:comment "The given name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "given name"@en ; + rdfs:range xsd:string . + +dcterms:source rdf:type rdf:Property ; + rdfs:comment "A related resource from which the described resource is derived."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Source"@en ; + rdfs:subPropertyOf dc:source , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. The described resource may be derived from the related resource in whole or in part. Best practice is to identify the related resource by means of a URI or a string conforming to a formal identification system."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:checksumAlgorithm_blake2b384 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was BLAKE2b-384."@en ; + vs:term_status "stable"@en . + +spdx:licenseExceptionText + rdf:type owl:DatatypeProperty ; + rdfs:comment "Full text of the license exception."@en ; + rdfs:domain spdx:LicenseException ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +dcterms:PhysicalMedium + rdf:type rdfs:Class ; + rdfs:comment "A physical material or carrier."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Physical Medium"@en ; + rdfs:subClassOf dcterms:MediaType ; + dcterms:description "Examples include paper, canvas, or DVD."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:relationshipType_testOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is used for testing SPDXRef-B."@en ; + vs:term_status "stable"@en . + +vcard:value rdf:type owl:DatatypeProperty ; + rdfs:comment "Used to indicate the literal value of a data property that requires property parameters"@en ; + rdfs:isDefinedBy ; + rdfs:label "value"@en . + +spdx:relationshipType_generates + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_generates expresses that an SPDXElement generates the relatedSPDXElement. For example, a source File generates a binary File."@en ; + vs:term_status "stable"@en . + +spdx:referenceCategory + rdf:type owl:ObjectProperty ; + rdfs:comment "Category for the external reference"@en ; + rdfs:domain spdx:ExternalRef ; + rdfs:range spdx:ReferenceCategory ; + vs:term_status "stable"@en . + +spdx:relationshipType_fileDeleted + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_fileDeleted expresses that the SPDXElement is a package where the relatedSPDXElement file has been removed. For example, a package has been patched to remove a file a file (the relatedSPDXElement resulting in the patched package (the SPDXElement). This relationship is typically used to express the result of a patched package when the actual patchfile is not present."@en ; + vs:term_status "stable"@en . + +spdx:checksumAlgorithm_md6 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was MD6"@en ; + vs:term_status "stable" . + +dcat:temporalResolution + rdf:type owl:DatatypeProperty ; + rdfs:comment "minimum time period resolvable in a dataset."@en , "minimální doba trvání rozlišitelná v datové sadě."@cs , "período de tiempo mínimo en el conjunto de datos."@es , "mindste tidsperiode der kan resolveres i datasættet."@da , "periodo di tempo minimo risolvibile in un set di dati."@it ; + rdfs:label "resolución temporal"@es , "tidslig opløsning"@da , "temporal resolution"@en , "časové rozlišení"@cs , "risoluzione temporale"@it ; + rdfs:range xsd:duration ; + skos:changeNote "Nueva propiedad añadida en DCAT 2.0."@es , "New property added in DCAT 2.0."@en , "Nuova proprietà aggiunta in DCAT 2.0."@it , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs ; + skos:definition "minimální doba trvání rozlišitelná v datové sadě."@cs , "período de tiempo mínimo en el conjunto de datos."@es , "minimum time period resolvable in a dataset."@en , "periodo di tempo minimo risolvibile in un set di dati."@it , "mindste tidsperiode der kan resolveres i datasættet."@da ; + skos:editorialNote "Může se vyskytnout v popisu Datové sady nebo Distribuce, takže nebyl specifikován definiční obor."@cs , "Might appear in the description of a Dataset or a Distribution, so no domain is specified."@en , "Kan optræde i forbindelse med beskrivelse af datasættet eller datasætditributionen, så der er ikke angivet et domæne for egenskaben."@da ; + skos:scopeNote "Alternative temporal resolutions might be provided as different dataset distributions."@en , "Různá časová rozlišení mohou být poskytována jako různé distribuce datové sady."@cs , "Si el conjunto de datos es una serie temporal, debe corresponder al espaciado de los elementos de la serie. Para otro tipo de conjuntos de datos, esta propiedad indicará usualmente la menor diferencia de tiempo entre elementos en el dataset."@es , "Alternative tidslige opløsninger kan leveres som forskellige datasætdistributioner."@da , "Pokud je datová sada časovou řadou, měla by tato vlastnost odpovídat rozestupu položek v řadě. Pro ostatní druhy datových sad bude tato vlastnost obvykle indikovat nejmenší časovou vzdálenost mezi položkami této datové sady."@cs , "Distintas distribuciones del conjunto de datos pueden tener resoluciones temporales diferentes."@es , "If the dataset is a time-series this should correspond to the spacing of items in the series. For other kinds of dataset, this property will usually indicate the smallest time difference between items in the dataset."@en , "Se il set di dati è una serie temporale, questo dovrebbe corrispondere alla spaziatura degli elementi della serie. Per altri tipi di set di dati, questa proprietà di solito indica la più piccola differenza di tempo tra gli elementi nel set di dati."@it , "Hvis datasættet er en tidsserie, så bør denne egenskab svare til afstanden mellem elementerne i tidsserien. For andre typer af datasæt indikerer denne egenskab den mindste tidsforskel mellem elementer i datasættet."@da , "Risoluzioni temporali alternative potrebbero essere fornite come diverse distribuzioni di set di dati."@it . + +spdx:externalReferenceSite + rdf:type owl:DatatypeProperty ; + rdfs:comment "Website for the maintainers of the external reference site"@en ; + rdfs:domain spdx:ReferenceType ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +spdx:relationshipType_testcaseOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a test case used in testing SPDXRef-B."@en ; + vs:term_status "stable"@en . + +time:intervalAfter rdf:type owl:ObjectProperty ; + rdfs:comment "If a proper interval T1 is intervalAfter another proper interval T2, then the beginning of T1 is after the end of T2."@en , "Si un intervalo propio T1 es posterior a otro intervalo propio T2, entonces el principio de T1 está después que el final de T2." ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval after"@en , "intervalo posterior"@es ; + rdfs:range time:ProperInterval ; + rdfs:subPropertyOf time:after , time:intervalDisjoint ; + owl:inverseOf time:intervalBefore ; + skos:definition "If a proper interval T1 is intervalAfter another proper interval T2, then the beginning of T1 is after the end of T2."@en , "Si un intervalo propio T1 es posterior a otro intervalo propio T2, entonces el principio de T1 está después que el final de T2."@es . + +spdx:none rdf:type owl:NamedIndividual ; + rdfs:comment "Individual to indicate that no value is applicable for the Object." . + +locn:postCode rdf:type rdf:Property ; + rdfs:comment "The post code (a.k.a postal code, zip code etc.). Post codes are common elements in many countries' postal address systems. The domain of locn:postCode is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "post code"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:postCode" ; + vs:term_status "testing"@en . + +vcard:X400 rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "X400"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + +spdx:checksumAlgorithm_sha3_256 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA3-256."@en ; + vs:term_status "stable"@en . + +spdx:relationshipType_distributionArtifact + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_distributionArtifact expresses that distributing the SPDXElement requires that the relatedSPDXElement also be distributed. For example, distributing a binary File may require that a source tarball (another File) be made available with the distribuiton. "@en ; + vs:term_status "stable"@en . + +vcard:hasLanguage rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the language data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has language"@en . + +vcard:Work rdf:type owl:Class ; + rdfs:comment "This implies that the property is related to an individual's work place"@en ; + rdfs:isDefinedBy ; + rdfs:label "Work"@en ; + rdfs:subClassOf vcard:Type . + +time:DateTimeInterval + rdf:type owl:Class ; + rdfs:comment "DateTimeInterval is a subclass of ProperInterval, defined using the multi-element DateTimeDescription."@en , "'intervalo de fecha-hora' es una subclase de 'intervalo propio', definida utilizando el multi-elemento 'descripción de fecha-hora'."@es ; + rdfs:label "intervalo de fecha-hora"@es , "Date-time interval"@en ; + rdfs:subClassOf time:ProperInterval ; + skos:definition "DateTimeInterval is a subclass of ProperInterval, defined using the multi-element DateTimeDescription."@en , "'intervalo de fecha-hora' es una subclase de 'intervalo propio', definida utilizando el multi-elemento 'descripción de fecha-hora'."@es ; + skos:note ":DateTimeInterval can only be used for an interval whose limits coincide with a date-time element aligned to the calendar and timezone indicated. For example, while both have a duration of one day, the 24-hour interval beginning at midnight at the beginning of 8 May in Central Europe can be expressed as a :DateTimeInterval, but the 24-hour interval starting at 1:30pm cannot."@en , "'intervalo de fecha-hora' se puede utilizar sólo para un intervalo cuyos límites coinciden con un elemento de fecha-hora alineados con el calendario y la zona horaria indicados. Por ejemplo, aunque ambos tienen una duración de un día, el intervalo de 24 horas que empieza en la media noche del comienzo del 8 mayo en Europa Central se puede expresar como un 'intervalo de fecha-hora', el intervalo de 24 horas que empieza a las 1:30pm no."@es . + +vcard:org rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped. Use the organization-name data property."@en ; + rdfs:isDefinedBy ; + rdfs:label "organization"@en ; + owl:equivalentProperty vcard:organization-name . + +rdfs:isDefinedBy rdf:type owl:AnnotationProperty . + +vcard:Tel rdf:type owl:Class ; + rdfs:comment "This class is deprecated. Use the hasTelephone object property."@en ; + rdfs:isDefinedBy ; + rdfs:label "Tel"@en ; + owl:deprecated true . + +prov:wasAssociatedWith + rdf:type owl:ObjectProperty ; + rdfs:comment "An prov:Agent that had some (unspecified) responsibility for the occurrence of this prov:Activity."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "wasAssociatedWith" ; + rdfs:range prov:Agent ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedAssociation prov:agent ) ; + owl:propertyChainAxiom ( prov:qualifiedAssociation prov:agent ) ; + prov:category "starting-point" ; + prov:component "agents-responsibility" ; + prov:inverse "wasAssociateFor" ; + prov:qualifiedForm prov:Association , prov:qualifiedAssociation . + +vcard:PCS rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "PCS"@en ; + rdfs:subClassOf vcard:TelephoneType ; + owl:deprecated true . + +prov:Generation rdf:type owl:Class ; + rdfs:comment "An instance of prov:Generation provides additional descriptions about the binary prov:wasGeneratedBy relation from a generated prov:Entity to the prov:Activity that generated it. For example, :cake prov:wasGeneratedBy :baking; prov:qualifiedGeneration [ a prov:Generation; prov:activity :baking; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Generation" ; + rdfs:subClassOf prov:ActivityInfluence , prov:InstantaneousEvent ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Generation is the completion of production of a new entity by an activity. This entity did not exist before generation and becomes available for usage after this generation."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Generation"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Generation"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasGeneratedBy . + +dcterms:isRequiredBy rdf:type rdf:Property ; + rdfs:comment "A related resource that requires the described resource to support its function, delivery, or coherence."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Is Required By"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Requires."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +dcterms:mediator rdf:type rdf:Property ; + rdfs:comment "An entity that mediates access to the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Mediator"@en ; + rdfs:subPropertyOf dcterms:audience ; + dcam:rangeIncludes dcterms:AgentClass ; + dcterms:description "In an educational context, a mediator might be a parent, teacher, teaching assistant, or care-giver."@en ; + dcterms:issued "2001-05-21"^^xsd:date . + +adms:Identifier rdf:type owl:Class ; + rdfs:comment "This is based on the UN/CEFACT Identifier class."@en ; + rdfs:isDefinedBy ; + rdfs:label "Identifier"@en . + +dcterms:URI rdf:type rdfs:Datatype ; + rdfs:comment "The set of identifiers constructed according to the generic syntax for Uniform Resource Identifiers as specified by the Internet Engineering Task Force."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "URI"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +locn:adminUnitL2 rdf:type rdf:Property ; + rdfs:comment "The region of the address, usually a county, state or other such area that typically encompasses several localities. The domain of locn:adminUnitL2 is locn:Address and the range is a literal, conceptually defined by the INSPIRE Geographical Name data type."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "admin unit level 2"@en ; + dcterms:identifier "locn:adminUnitL2" ; + vs:term_status "testing"@en . + +dcterms:rights rdf:type rdf:Property ; + rdfs:comment "Information about rights held in and over the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Rights"@en ; + rdfs:subPropertyOf dc:rights ; + dcam:rangeIncludes dcterms:RightsStatement ; + dcterms:description "Typically, rights information includes a statement about various property rights associated with the resource, including intellectual property rights. Recommended practice is to refer to a rights statement with a URI. If this is not possible or feasible, a literal value (name, label, or short text) may be provided."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:nickname rdf:type owl:DatatypeProperty ; + rdfs:comment "The nick name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "nickname"@en ; + rdfs:range xsd:string . + +spdx:relationshipType_fileModified + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_fileModified expresses that the SPDXElement is a file which is a modified version of the relatedSPDXElement file. For example, a file (the SPDXElement) has been patched to modify the contents of the original file (the SPDXElement). This relationship is typically used to express the result of a patched package when the actual patchfile is not present."@en ; + vs:term_status "stable"@en . + +adms:status rdf:type owl:ObjectProperty ; + rdfs:comment "The status of the Asset in the context of a particular workflow process."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "status"@en ; + rdfs:range skos:Concept . + +prov:Agent rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Agent" ; + owl:disjointWith prov:InstantaneousEvent ; + prov:category "starting-point" ; + prov:component "agents-responsibility" ; + prov:definition "An agent is something that bears some form of responsibility for an activity taking place, for the existence of an entity, or for another agent's activity. "@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Agent"^^xsd:anyURI . + +spdx:ChecksumAlgorithm + rdf:type owl:Class ; + rdfs:comment "Algorighm for Checksums."@en ; + vs:term_status "stable"@en . + +skos:narrowMatch rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "has narrower match"@en ; + rdfs:subPropertyOf skos:mappingRelation , skos:narrower ; + owl:inverseOf skos:broadMatch ; + skos:definition "skos:narrowMatch is used to state a hierarchical mapping link between two conceptual resources in different concept schemes."@en . + +dcat:themeTaxonomy rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "Il sistema di organizzazione della conoscenza (KOS) usato per classificare i dataset del catalogo."@it , "The knowledge organization system (KOS) used to classify catalog's datasets."@en , "Le systhème d'ogranisation de connaissances utilisé pour classifier les jeux de données du catalogue."@fr , "El sistema de organización del conocimiento utilizado para clasificar conjuntos de datos de catálogos."@es , "Vidensorganiseringssystem (KOS) som anvendes til at klassificere datasæt i kataloget."@da , "Systém organizace znalostí (KOS) použitý pro klasifikaci datových sad v katalogu."@cs , "カタログのデータセットを分類するために用いられる知識組織化体系(KOS;knowledge organization system)。"@ja , "لائحة التصنيفات المستخدمه لتصنيف قوائم البيانات ضمن الفهرس"@ar , "Το σύστημα οργάνωσης γνώσης που χρησιμοποιείται για την κατηγοριοποίηση των συνόλων δεδομένων του καταλόγου."@el ; + rdfs:domain dcat:Catalog ; + rdfs:isDefinedBy ; + rdfs:label "taxonomie de thèmes"@fr , "tassonomia dei temi"@it , "テーマ"@ja , "theme taxonomy"@en , "قائمة التصنيفات"@ar , "Ταξινομία θεματικών κατηγοριών."@el , "emnetaksonomi"@da , "taxonomie témat"@cs , "taxonomía de temas"@es ; + rdfs:range rdfs:Resource ; + sdo:rangeIncludes skos:ConceptScheme , owl:Ontology , skos:Collection ; + skos:altLabel "temataksonomi"@da ; + skos:definition "Vidensorganiseringssystem (KOS) som anvendes til at klassificere datasæt i kataloget."@da , "لائحة التصنيفات المستخدمه لتصنيف قوائم البيانات ضمن الفهرس"@ar , "El sistema de organización del conocimiento utilizado para clasificar conjuntos de datos de catálogos."@es , "Systém organizace znalostí (KOS) použitý pro klasifikaci datových sad v katalogu."@cs , "カタログのデータセットを分類するために用いられる知識組織化体系(KOS;knowledge organization system)。"@ja , "The knowledge organization system (KOS) used to classify catalog's datasets."@en , "Il sistema di organizzazione della conoscenza (KOS) usato per classificare i dataset del catalogo."@it , "Το σύστημα οργάνωσης γνώσης που χρησιμοποιείται για την κατηγοριοποίηση των συνόλων δεδομένων του καταλόγου."@el , "Le systhème d'ogranisation de connaissances utilisé pour classifier les jeux de données du catalogue."@fr ; + skos:scopeNote "Det anbefales at taksonomien organiseres i et skos:ConceptScheme, skos:Collection, owl:Ontology eller lignende, som giver mulighed for at ethvert medlem af taksonomien kan forsynes med en IRI og udgives som linked-data."@da , "It is recommended that the taxonomy is organized in a skos:ConceptScheme, skos:Collection, owl:Ontology or similar, which allows each member to be denoted by an IRI and published as linked-data."@en , "Je doporučeno, aby byla taxonomie vyjádřena jako skos:ConceptScheme, skos:Collection, owl:Ontology nebo podobné, aby mohla být každá položka identifikována pomocí IRI a publikována jako propojená data."@cs , "Se recomienda que la taxonomía se organice como un skos:ConceptScheme, skos:Collection, owl:Ontology o similar, los cuáles permiten que cada miembro se denote con una IRI y se publique como datos enlazados."@es , "Si raccomanda che la tassonomia sia organizzata in uno skos:ConceptScheme, skos:Collection, owl:Ontology o simili, che permette ad ogni membro di essere indicato da un IRI e pubblicato come linked-data."@it . + +spdx:packageFileName rdf:type owl:DatatypeProperty ; + rdfs:comment "The base name of the package file name. For example, zlib-1.2.5.tar.gz."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +prov:influenced rdf:type owl:ObjectProperty ; + rdfs:isDefinedBy ; + rdfs:label "influenced" ; + owl:inverseOf prov:wasInfluencedBy ; + prov:category "expanded" ; + prov:component "agents-responsibility" ; + prov:inverse "wasInfluencedBy" ; + prov:sharesDefinitionWith prov:Influence . + +[ rdf:type owl:Axiom ; + rdfs:comment "Attribution is a particular case of trace (see http://www.w3.org/TR/prov-dm/#concept-trace), in the sense that it links an entity to the agent that ascribed it." ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasAttributedTo ; + owl:annotatedTarget prov:wasInfluencedBy ; + prov:definition "IF wasAttributedTo(e2,ag1,aAttr) holds, THEN wasInfluencedBy(e2,ag1) also holds. " +] . + +dcterms:accessRights rdf:type rdf:Property ; + rdfs:comment "Information about who access the resource or an indication of its security status."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Access Rights"@en ; + rdfs:subPropertyOf dc:rights , dcterms:rights ; + dcam:rangeIncludes dcterms:RightsStatement ; + dcterms:description "Access Rights may include information regarding access or restrictions based on privacy, security, or other policies."@en ; + dcterms:issued "2003-02-15"^^xsd:date . + +spdx:checksumAlgorithm_sha384 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA384"@en ; + vs:term_status "stable"@en . + +[ rdf:type owl:Axiom ; + rdfs:comment "Quotation is a particular case of derivation (see http://www.w3.org/TR/prov-dm/#term-quotation) in which an entity is derived from an original entity by copying, or \"quoting\", some or all of it. " ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasQuotedFrom ; + owl:annotatedTarget prov:wasDerivedFrom +] . + +skos:hiddenLabel rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:comment "The range of skos:hiddenLabel is the class of RDF plain literals."@en , "skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise disjoint properties."@en ; + rdfs:isDefinedBy ; + rdfs:label "hidden label"@en ; + rdfs:subPropertyOf rdfs:label ; + skos:definition "A lexical label for a resource that should be hidden when generating visual displays of the resource, but should still be accessible to free text search operations."@en . + +prov:Plan rdf:type owl:Class ; + rdfs:comment "There exist no prescriptive requirement on the nature of plans, their representation, the actions or steps they consist of, or their intended goals. Since plans may evolve over time, it may become necessary to track their provenance, so plans themselves are entities. Representing the plan explicitly in the provenance can be useful for various tasks: for example, to validate the execution as represented in the provenance record, to manage expectation failures, or to provide explanations."@en ; + rdfs:isDefinedBy ; + rdfs:label "Plan" ; + rdfs:subClassOf prov:Entity ; + prov:category "expanded" , "qualified" ; + prov:component "agents-responsibility" ; + prov:definition "A plan is an entity that represents a set of actions or steps intended by one or more agents to achieve some goals." ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Association"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Association"^^xsd:anyURI . + +vcard:anniversary rdf:type owl:DatatypeProperty ; + rdfs:comment "The date of marriage, or equivalent, of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "anniversary"@en ; + rdfs:range [ rdf:type rdfs:Datatype ; + owl:unionOf ( xsd:dateTime xsd:gYear ) + ] . + +prov:inverse rdf:type owl:AnnotationProperty ; + rdfs:comment "PROV-O does not define all property inverses. The directionalities defined in PROV-O should be given preference over those not defined. However, if users wish to name the inverse of a PROV-O property, the local name given by prov:inverse should be used."@en ; + rdfs:isDefinedBy ; + rdfs:seeAlso . + +dcterms:accrualPeriodicity + rdf:type rdf:Property ; + rdfs:comment "The frequency with which items are added to a collection."@en ; + rdfs:domain dctype:Collection ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Accrual Periodicity"@en ; + dcam:rangeIncludes dcterms:Frequency ; + dcterms:description "Recommended practice is to use a value from the Collection Description Frequency Vocabulary [[DCMI-COLLFREQ](https://dublincore.org/groups/collections/frequency/)]."@en ; + dcterms:issued "2005-06-13"^^xsd:date . + +vs:term_status rdf:type owl:AnnotationProperty . + +skos:ConceptScheme rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Concept Scheme"@en ; + owl:disjointWith skos:Concept ; + skos:definition "A set of concepts, optionally including statements about semantic relationships between those concepts."@en ; + skos:example "Thesauri, classification schemes, subject heading lists, taxonomies, 'folksonomies', and other types of controlled vocabulary are all examples of concept schemes. Concept schemes are also embedded in glossaries and terminologies."@en ; + skos:scopeNote "A concept scheme may be defined to include concepts from different sources."@en . + +dcterms:ProvenanceStatement + rdf:type rdfs:Class ; + rdfs:comment "Any changes in ownership and custody of a resource since its creation that are significant for its authenticity, integrity, and interpretation."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Provenance Statement"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcterms:identifier rdf:type rdf:Property ; + rdfs:comment "An unambiguous reference to the resource within a given context."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Identifier"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:identifier ; + dcterms:description "Recommended practice is to identify the resource by means of a string conforming to an identification system. Examples include International Standard Book Number (ISBN), Digital Object Identifier (DOI), and Uniform Resource Name (URN). Persistent identifiers should be provided as HTTP URIs."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +time:hasTRS rdf:type owl:FunctionalProperty , owl:ObjectProperty ; + rdfs:comment "El sistema de referencia temporal utilizado por una posición temporal o descripción de extensión."@es , "The temporal reference system used by a temporal position or extent description. "@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( time:TemporalPosition time:GeneralDurationDescription ) + ] ; + rdfs:label "sistema de referencia temporal utilizado"@es , "Temporal reference system used"@en ; + rdfs:range time:TRS ; + skos:definition "The temporal reference system used by a temporal position or extent description. "@en , "El sistema de referencia temporal utilizado por una posición temporal o descripción de extensión."@es . + +spdx:timestamp rdf:type owl:DatatypeProperty ; + rdfs:comment "Timestamp"@en ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:dateTime . + +spdx:standardLicenseHeaderHtml + rdf:type owl:DatatypeProperty ; + rdfs:comment "HTML representation of the standard license header"@en ; + rdfs:domain spdx:ListedLicense ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +vcard:Organization rdf:type owl:Class ; + rdfs:comment "An object representing an organization. An organization is a single entity, and might represent a business or government, a department or division within a business or government, a club, an association, or the like.\n"@en ; + rdfs:isDefinedBy ; + rdfs:label "Organization"@en ; + rdfs:subClassOf vcard:Kind . + +spdx:Review rdf:type owl:Class ; + rdfs:comment "This class has been deprecated in favor of an Annotation with an Annotation type of review."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:dateTime ; + owl:onProperty spdx:reviewDate ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:reviewer + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment + ] ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +spdx:checksumAlgorithm_sha224 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA224"@en ; + vs:term_status "stable"@en . + +spdx:checksumAlgorithm_sha1 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA-1" ; + vs:term_status "stable" . + +prov:aq rdf:type owl:AnnotationProperty ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + +spdx:Snippet rdf:type owl:Class ; + rdfs:comment "The set of bytes in a file. The name of the snippet is the name of the file appended with the byte range in parenthesis (ie: \"./file/name(2145:5532)\")"@en ; + rdfs:subClassOf spdx:SpdxItem ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:licenseInfoInSnippet + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass ; + owl:onProperty spdx:range + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:File ; + owl:onProperty spdx:snippetFromFile ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +time:inXSDDateTimeStamp + rdf:type owl:DatatypeProperty ; + rdfs:comment "Position of an instant, expressed using xsd:dateTimeStamp"@en , "Posición de un instante, expresado utilizando xsd:dateTimeStamp."@es ; + rdfs:domain time:Instant ; + rdfs:label "in XSD Date-Time-Stamp"@en , "en fecha-sello de tiempo XSD"@es ; + rdfs:range xsd:dateTimeStamp ; + skos:definition "Position of an instant, expressed using xsd:dateTimeStamp"@en , "Posición de un instante, expresado utilizando xsd:dateTimeStamp."@es . + +dcat:bbox rdf:type rdf:Property , owl:DatatypeProperty ; + rdfs:domain dcterms:Location ; + rdfs:label "bounding box"@da , "bounding box"@en , "cuadro delimitador"@es , "ohraničení oblasti"@cs , "quadro di delimitazione"@it ; + rdfs:range rdfs:Literal ; + skos:changeNote "Ny egenskab tilføjet i DCAT 2.0."@da , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "Propiedad nueva agregada en DCAT 2.0."@es , "New property added in DCAT 2.0."@en , "Nuova proprietà aggiunta in DCAT 2.0."@it ; + skos:definition "Den geografiske omskrevne firkant af en ressource."@da , "Il riquadro di delimitazione geografica di una risorsa."@it , "Ohraničení geografické oblasti zdroje."@cs , "El cuadro delimitador geográfico para un recurso."@es , "The geographic bounding box of a resource."@en ; + skos:scopeNote "El rango de esta propiedad es intencionalmente genérico con el propósito de permitir distintas codificaciones geométricas. Por ejemplo, la geometría puede ser codificada como WKT (geosparql:wktLiteral [GeoSPARQL]) o [GML] (geosparql:asGML [GeoSPARQL])."@es , "The range of this property is intentionally generic, with the purpose of allowing different geometry encodings. E.g., the geometry could be encoded with as WKT (geosparql:wktLiteral [GeoSPARQL]) or [GML] (geosparql:asGML [GeoSPARQL])."@en , "Il range di questa proprietà è volutamente generica, con lo scopo di consentire diverse codifiche geometriche. Ad esempio, la geometria potrebbe essere codificata con WKT (geosparql:wktLiteral [GeoSPARQL]) o [GML] (geosparql:asGML [GeoSPARQL])."@it , "Obor hodnot této vlastnosti je úmyslně obecný, aby umožnil různé kódování geometrií. Geometrie by kupříkladu mohla být kódována jako WKT (geosparql:wktLiteral [GeoSPARQL]) či [GML] (geosparql:asGML [GeoSPARQL])."@cs , "Rækkevidden for denne egenskab er bevidst generisk defineret med det formål at tillade forskellige kodninger af geometrier. Geometrien kan eksempelvis repræsenteres som WKT (geosparql:asWKT [GeoSPARQL]) eller [GML] (geosparql:asGML [GeoSPARQL])."@da . + +spdx:SimpleLicensingInfo + rdf:type owl:Class ; + rdfs:comment "The SimpleLicenseInfo class includes all resources that represent simple, atomic, licensing information."@en ; + rdfs:subClassOf spdx:AnyLicenseInfo ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:CrossRef ; + owl:onProperty spdx:crossRef + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI ; + owl:onProperty rdfs:seeAlso + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseId ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:name + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment + ] ; + vs:term_status "stable"@en . + +locn:Geometry rdf:type rdfs:Class ; + rdfs:comment "The locn:Geometry class provides the means to identify a location as a point, line, polygon, etc. expressed using coordinates in some coordinate reference system."@en ; + rdfs:isDefinedBy ; + rdfs:label "Geometry"@en ; + dcterms:identifier "locn:Geometry" ; + vann:usageNote "This class defines the notion of \"geometry\" at the conceptual level, and it shall be encoded by using different formats (see usage note of the locn:geometry property)."@en ; + vs:term_status "unstable"@en . + +time:intervalDuring rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 está durante otro intervalo propio T2, entonces del principio de T1 está después del principio de T2, y el final de T1 está antes que el final de T2."@es , "If a proper interval T1 is intervalDuring another proper interval T2, then the beginning of T1 is after the beginning of T2, and the end of T1 is before the end of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo durante"@es , "interval during"@en ; + rdfs:range time:ProperInterval ; + rdfs:subPropertyOf time:intervalIn ; + owl:inverseOf time:intervalContains ; + skos:definition "Si un intervalo propio T1 está durante otro intervalo propio T2, entonces del principio de T1 está después del principio de T2, y el final de T1 está antes que el final de T2."@es , "If a proper interval T1 is intervalDuring another proper interval T2, then the beginning of T1 is after the beginning of T2, and the end of T1 is before the end of T2."@en . + +spdx:relationshipType_contains + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_contains expresses that an SPDXElement contains the relatedSPDXElement. For example, a Package contains a File. (relationshipType_contains introduced in SPDX 2.0 deprecates property 'hasFile' from SPDX 1.2)"@en ; + vs:term_status "stable"@en . + +dcat:catalog rdf:type owl:ObjectProperty ; + rdfs:comment "Un catálogo cuyo contenido es de interés en el contexto del catálogo que está siendo descripto."@es , "Un catalogo i cui contenuti sono di interesse nel contesto di questo catalogo."@it , "Et katalog hvis indhold er relevant i forhold til det aktuelle katalog."@da , "Katalog, jehož obsah je v kontextu tohoto katalogu zajímavý."@cs , "A catalog whose contents are of interest in the context of this catalog."@en ; + rdfs:domain dcat:Catalog ; + rdfs:label "catálogo"@es , "catalogo"@it , "katalog"@cs , "katalog"@da , "catalog"@en ; + rdfs:range dcat:Catalog ; + rdfs:subPropertyOf rdfs:member , dcterms:hasPart ; + skos:altLabel "har delkatalog"@da ; + skos:changeNote "Nuova proprietà aggiunta in DCAT 2.0."@it , "New property added in DCAT 2.0."@en , "Nueva propiedad agregada en DCAT 2.0."@es , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs ; + skos:definition "Un catalogo i cui contenuti sono di interesse nel contesto di questo catalogo."@it , "Katalog, jehož obsah je v kontextu tohoto katalogu zajímavý."@cs , "Et katalog hvis indhold er relevant i forhold til det aktuelle katalog."@da , "Un catálogo cuyo contenido es de interés en el contexto del catálogo que está siendo descripto."@es , "A catalog whose contents are of interest in the context of this catalog."@en . + +time:weeks rdf:type owl:DatatypeProperty ; + rdfs:comment "length of, or element of the length of, a temporal extent expressed in weeks"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en semanas."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "weeks duration"@en , "duración en semanas"@es ; + rdfs:range xsd:decimal . + + + rdf:type sh:NodeShape ; + sh:name "Catalog Record"@en ; + sh:property [ sh:maxCount 1 ; + sh:minCount 1 ; + sh:node ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:source ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:language ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path adms:status ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcterms:description ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcterms:title ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:minCount 1 ; + sh:node ; + sh:path dcterms:modified ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:conformsTo ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:issued ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +spdx:SpdxElement rdf:type owl:Class ; + rdfs:comment "An SpdxElement is any thing described in SPDX, either a document or an SpdxItem. SpdxElements can be related to other SpdxElements."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Annotation ; + owl:onProperty spdx:annotation + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Relationship ; + owl:onProperty spdx:relationship + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:name ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment + ] ; + vs:term_status "stable" . + +time:monthOfYear rdf:type owl:ObjectProperty ; + rdfs:comment "The month of the year, whose value is a member of the class time:MonthOfYear"@en , "El mes del año, cuyo valor es un miembro de la clase 'mes del año'."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "month of year"@en , "mes del año"@es ; + rdfs:range time:MonthOfYear ; + skos:definition "The month of the year, whose value is a member of the class time:MonthOfYear"@en , "El mes del año, cuyo valor es un miembro de la clase 'mes del año'."@es ; + skos:editorialNote "Característica arriesgada - añadida en la revisión de 2017, y todavía no ampliamente utilizada."@es , "Feature at risk - added in 2017 revision, and not yet widely used. "@en . + +skos:member rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:domain skos:Collection ; + rdfs:isDefinedBy ; + rdfs:label "has member"@en ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( skos:Concept skos:Collection ) + ] ; + skos:definition "Relates a collection to one of its members."@en . + +vcard:organization-name + rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the organizational name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "organization name"@en ; + rdfs:range xsd:string . + +dcterms:hasPart rdf:type rdf:Property ; + rdfs:comment "A related resource that is included either physically or logically in the described resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Has Part"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Is Part Of."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +prov:qualifiedPrimarySource + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Entity prov:hadPrimarySource Entity :e, then it can qualify how using prov:qualifiedPrimarySource [ a prov:PrimarySource; prov:entity :e; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedPrimarySource" ; + rdfs:range prov:PrimarySource ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "qualifiedSourceOf" ; + prov:sharesDefinitionWith prov:PrimarySource ; + prov:unqualifiedForm prov:hadPrimarySource . + +time:hour rdf:type owl:DatatypeProperty ; + rdfs:comment "Hour position in a calendar-clock system."@en , "Posición de hora en un sistema calendario-reloj."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "hour"@en , "hora"@es ; + rdfs:range xsd:nonNegativeInteger ; + skos:definition "Hour position in a calendar-clock system."@en , "Posición de hora en un sistema calendario-reloj."@es . + +dcat:endDate rdf:type rdf:Property , owl:DatatypeProperty ; + rdfs:domain dcterms:PeriodOfTime ; + rdfs:label "data di fine"@it , "datum konce"@cs , "slutdato"@da , "end date"@en , "fecha final"@es ; + rdfs:range rdfs:Literal ; + skos:altLabel "sluttidspunkt"@da ; + skos:changeNote "New property added in DCAT 2.0."@en , "Nueva propiedad agregada en DCAT 2.0."@es , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "Nuova proprietà aggiunta in DCAT 2.0."@it , "Ny egenskab i DCAT 2.0."@da ; + skos:definition "El fin del período."@es , "Slutningen på perioden."@da , "La fine del periodo."@it , "Konec doby trvání."@cs , "The end of the period."@en ; + skos:scopeNote "La range di questa proprietà è volutamente generico, con lo scopo di consentire diversi livelli di precisione temporale per specificare la fine di un periodo. Ad esempio, può essere espresso con una data (xsd:date), una data e un'ora (xsd:dateTime), o un anno (xsd:gYear)."@it , "Obor hodnot této vlastnosti je úmyslně obecný, aby umožnil různé úrovně časového rozlišení pro specifikaci konce doby trvání. Ten může být kupříkladu vyjádřen datumem (xsd:date), datumem a časem (xsd:dateTime) či rokem (xsd:gYear)."@cs , "Rækkeviden for denne egenskab er bevidst generisk defineret med det formål at tillade forskellige niveauer af tidslig præcision ifm. angivelse af slutdatoen for en periode. Den kan eksempelvis udtrykkes som en dato (xsd:date), en dato og et tidspunkt (xsd:dateTime), eller et årstal (xsd:gYear)."@da , "El rango de esta propiedad es intencionalmente genérico con el propósito de permitir distintos niveles de precisión temporal para especificar el fin del período. Por ejemplo, puede expresarse como una fecha (xsd:date), una fecha y un tiempo (xsd:dateTime), o un año (xsd:gYear)."@es , "The range of this property is intentionally generic, with the purpose of allowing different level of temporal precision for specifying the end of a period. E.g., it can be expressed with a date (xsd:date), a date and time (xsd:dateTime), or a year (xsd:gYear)."@en . + +prov:End rdf:type owl:Class ; + rdfs:comment "An instance of prov:End provides additional descriptions about the binary prov:wasEndedBy relation from some ended prov:Activity to an prov:Entity that ended it. For example, :ball_game prov:wasEndedBy :buzzer; prov:qualifiedEnd [ a prov:End; prov:entity :buzzer; :foo :bar; prov:atTime '2012-03-09T08:05:08-05:00'^^xsd:dateTime ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "End" ; + rdfs:subClassOf prov:EntityInfluence , prov:InstantaneousEvent ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "End is when an activity is deemed to have been ended by an entity, known as trigger. The activity no longer exists after its end. Any usage, generation, or invalidation involving an activity precedes the activity's end. An end may refer to a trigger entity that terminated the activity, or to an activity, known as ender that generated the trigger."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-End"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-End"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasEndedBy . + +prov:invalidatedAtTime + rdf:type owl:DatatypeProperty ; + rdfs:comment "The time at which an entity was invalidated (i.e., no longer usable)."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "invalidatedAtTime" ; + rdfs:range xsd:dateTime ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:editorialNote "It is the intent that the property chain holds: (prov:qualifiedInvalidation o prov:atTime) rdfs:subPropertyOf prov:invalidatedAtTime."@en ; + prov:qualifiedForm prov:atTime , prov:Invalidation . + +time:after rdf:type owl:ObjectProperty ; + rdfs:comment "Gives directionality to time. If a temporal entity T1 is after another temporal entity T2, then the beginning of T1 is after the end of T2."@en , "Asume una dirección en el tiempo. Si una entidad temporal T1 está después de otra entidad temporal T2, entonces el principio de T1 está después del final de T2."@es ; + rdfs:domain time:TemporalEntity ; + rdfs:label "después"@es , "after"@en ; + rdfs:range time:TemporalEntity ; + owl:inverseOf time:before ; + skos:definition "Asume una dirección en el tiempo. Si una entidad temporal T1 está después de otra entidad temporal T2, entonces el principio de T1 está después del final de T2."@es , "Gives directionality to time. If a temporal entity T1 is after another temporal entity T2, then the beginning of T1 is after the end of T2."@en . + +prov:agent rdf:type owl:ObjectProperty ; + rdfs:domain prov:AgentInfluence ; + rdfs:isDefinedBy ; + rdfs:label "agent" ; + rdfs:range prov:Agent ; + rdfs:subPropertyOf prov:influencer ; + prov:category "qualified" ; + prov:editorialNote "This property behaves in spirit like rdf:object; it references the object of a prov:wasInfluencedBy triple."@en ; + prov:editorsDefinition "The prov:agent property references an prov:Agent which influenced a resource. This property applies to an prov:AgentInfluence, which is given by a subproperty of prov:qualifiedInfluence from the influenced prov:Entity, prov:Activity or prov:Agent."@en ; + prov:inverse "agentOfInfluence" . + +rdfs:seeAlso rdf:type owl:AnnotationProperty , owl:DatatypeProperty ; + rdfs:comment ""@en , "rdfs:seeAlso fully represents the ISA Programme Location Core Vocabulary concept of a geographic identifier."@en ; + rdfs:isDefinedBy rdfs: ; + rdfs:label "geographic identifier"@en ; + dcterms:identifier "rdfs:seeAlso" ; + vann:usageNote "Used in the ISA Programme Location Core Vocabulary to provide a URI that identifies the location. This should be expressed using the rdfs:seeAlso property unless the identifier is already the subject of the description. Examples include URIs from GeoNames.org and DBpedia such as http://dbpedia.org/resource/ISO_3166-2:XX where XX is the ISO 3166 two character code for a country."@en ; + vs:term_status "unstable"@en . + +vcard:fn rdf:type owl:DatatypeProperty ; + rdfs:comment "The formatted text corresponding to the name of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "formatted name"@en ; + rdfs:range xsd:string . + +skos:definition rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "definition"@en ; + rdfs:subPropertyOf skos:note ; + skos:definition "A statement or formal explanation of the meaning of a concept."@en . + +time:TemporalPosition + rdf:type owl:Class ; + rdfs:comment "A position on a time-line"@en , "Una posición sobre una línea de tiempo."@es ; + rdfs:label "Temporal position"@en , "posición temporal"@es ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:hasTRS + ] ; + skos:definition "A position on a time-line"@en , "Una posición sobre una línea de tiempo."@es . + +spdx:DisjunctiveLicenseSet + rdf:type owl:Class ; + rdfs:comment "A DisjunctiveLicenseSet represents a set of licensing information where only one license applies at a time. This class implies that the recipient gets to choose one of these licenses they would prefer to use."@en ; + rdfs:subClassOf spdx:AnyLicenseInfo , rdfs:Container ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "2"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:member + ] ; + vs:term_status "stable"@en . + + + rdf:type sh:NodeShape ; + sh:name "Licence Document"@en ; + sh:property [ sh:path dcterms:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dcterms:LicenseDocument . + +spdx:relationshipType_buildToolOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "To be used when SPDXRef-A is used to to build SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:originator rdf:type owl:DatatypeProperty ; + rdfs:comment "The name and, optionally, contact information of the person or organization that originally created the package. Values of this property must conform to the agent and tool syntax."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string . + +dcterms:MediaType rdf:type rdfs:Class ; + rdfs:comment "A file format or physical medium."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Media Type"@en ; + rdfs:subClassOf dcterms:MediaTypeOrExtent ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:SpdxDocument rdf:type owl:Class ; + rdfs:comment "An SpdxDocument is a summary of the contents, provenance, ownership and licensing analysis of a specific software package. This is, effectively, the top level of SPDX information."@en ; + rdfs:subClassOf spdx:SpdxElement ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:ExternalDocumentRef ; + owl:onProperty spdx:externalDocumentRef + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Package ; + owl:onProperty spdx:describesPackage + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:specVersion ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Review ; + owl:onProperty spdx:reviewed + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:CreationInfo ; + owl:onProperty spdx:creationInfo ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:hasValue ; + owl:onProperty spdx:dataLicense + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:dataLicense ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:ExtractedLicensingInfo ; + owl:onProperty spdx:hasExtractedLicensingInfo + ] ; + vs:term_status "stable" . + +skos:related rdf:type owl:ObjectProperty , owl:SymmetricProperty , rdf:Property ; + rdfs:comment "skos:related is disjoint with skos:broaderTransitive"@en ; + rdfs:isDefinedBy ; + rdfs:label "has related"@en ; + rdfs:subPropertyOf skos:semanticRelation ; + skos:definition "Relates a concept to a concept with which there is an associative semantic relationship."@en . + +vcard:category rdf:type owl:DatatypeProperty ; + rdfs:comment "The category information about the object, also known as tags"@en ; + rdfs:isDefinedBy ; + rdfs:label "category"@en ; + rdfs:range xsd:string . + +[ rdf:type owl:Axiom ; + rdfs:comment "A collection is an entity that provides a structure to some constituents, which are themselves entities. These constituents are said to be member of the collections."@en ; + owl:annotatedProperty rdfs:range ; + owl:annotatedSource prov:hadMember ; + owl:annotatedTarget prov:Entity ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-collection" +] . + +vcard:Child rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Child"@en ; + rdfs:subClassOf vcard:RelatedType . + +spdx:licenseId rdf:type owl:DatatypeProperty ; + rdfs:comment "A human readable short form license identifier for a license. The license ID is either on the standard license list or the form \"LicenseRef-[idString]\" where [idString] is a unique string containing letters, numbers, \".\" or \"-\". When used within a license expression, the license ID can optionally include a reference to an external document in the form \"DocumentRef-[docrefIdString]:LicenseRef-[idString]\" where docRefIdString is an ID for an external document reference."@en ; + rdfs:domain spdx:SimpleLicensingInfo ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:annotator rdf:type owl:DatatypeProperty ; + rdfs:comment "This field identifies the person, organization, or tool that has commented on a file, package, snippet, or the entire document." ; + rdfs:domain spdx:Annotation ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +time:intervalDisjoint + rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 es disjunto con otro intervalo propio T2, entonces el principio de T1 está después del final de T2, o el final de T1 está antes que el principio de T2, es decir, los intervalos no se solapan de ninguna forma, aunque su relación de orden no se conozca."@es , "If a proper interval T1 is intervalDisjoint another proper interval T2, then the beginning of T1 is after the end of T2, or the end of T1 is before the beginning of T2, i.e. the intervals do not overlap in any way, but their ordering relationship is not known."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval disjoint"@en , "intervalo disjunto"@es ; + rdfs:range time:ProperInterval ; + skos:definition "If a proper interval T1 is intervalDisjoint another proper interval T2, then the beginning of T1 is after the end of T2, or the end of T1 is before the beginning of T2, i.e. the intervals do not overlap in any way, but their ordering relationship is not known."@en , "Si un intervalo propio T1 es disjunto con otro intervalo propio T2, entonces el principio de T1 está después del final de T2, o el final de T1 está antes que el principio de T2, es decir, los intervalos no se solapan de ninguna forma, aunque su relación de orden no se conozca."@es ; + skos:note "This interval relation is not included in the 13 basic relationships defined in Allen (1984), but is defined in (T.3) as the union of :intervalBefore v :intervalAfter . However, that is outside OWL2 expressivity, so is implemented as an explicit property, with :intervalBefore , :intervalAfter as sub-properties"@en , "Esta relación entre intervalos no estaba incluida en las 13 relaciones básicas definidas por Allen (1984), pero está definida en T.3 como la unión de 'intervalo anterior' con 'intervalo posterior'. Sin embargo, esto está fuera de la expresividad de OWL2, por tanto, está implementado como una propiedad explícita, con 'intervalo anterior' e 'intervalo posterior' como sub-propiedades."@es . + + + rdf:type owl:DatatypeProperty ; + rdfs:domain ; + rdfs:range xsd:positiveInteger ; + vs:term_status "stable"@en . + +time:Duration rdf:type owl:Class ; + rdfs:comment "Duration of a temporal extent expressed as a number scaled by a temporal unit"@en , "Duración de una extensión temporal expresada como un número escalado por una unidad temporal."@es ; + rdfs:label "duración de tiempo" , "Time duration"@en ; + rdfs:subClassOf time:TemporalDuration ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:unitType + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:numericDuration + ] ; + skos:definition "Duration of a temporal extent expressed as a number scaled by a temporal unit"@en , "Duración de una extensión temporal expresada como un número escalado por una unidad temporal."@es ; + skos:note "Alternative to time:DurationDescription to support description of a temporal duration other than using a calendar/clock system."@en , "Alternativa a 'descripción de tiempo' para proporcionar descripción soporte a una duración temporal diferente a utilizar un sistema de calendario/reloj."@es . + +locn:address rdf:type rdf:Property ; + rdfs:comment "The locn:address property relationship associates any resource with the locn:Address class "@en ; + rdfs:isDefinedBy ; + rdfs:label "address"@en ; + rdfs:range locn:Address ; + dcterms:identifier "locn:address" ; + vs:term_status "testing"@en . + +dcterms:ISO639-3 rdf:type rdfs:Datatype ; + rdfs:comment "The set of three-letter codes listed in ISO 639-3 for the representation of names of languages."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "ISO 639-3"@en ; + rdfs:seeAlso ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:fileName rdf:type owl:DatatypeProperty ; + rdfs:comment "The name of the file relative to the root of the package."@en ; + rdfs:domain spdx:File ; + rdfs:range xsd:string ; + rdfs:subPropertyOf spdx:name ; + vs:term_status "stable"@en . + +time:days rdf:type owl:DatatypeProperty ; + rdfs:comment "length of, or element of the length of, a temporal extent expressed in days"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en días."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "days duration"@en , "duración en días"@es ; + rdfs:range xsd:decimal ; + skos:definition "length of, or element of the length of, a temporal extent expressed in days"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en días."@es . + +dcterms:isPartOf rdf:type rdf:Property ; + rdfs:comment "A related resource in which the described resource is physically or logically included."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Is Part Of"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Has Part."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:hasOrganizationUnit + rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the organization unit name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has organization unit name"@en . + +spdx:versionInfo rdf:type owl:DatatypeProperty ; + rdfs:comment "Provides an indication of the version of the package that is described by this SpdxDocument."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +vcard:hasAddress rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the components of the delivery address for the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has address"@en ; + rdfs:range vcard:Address . + +prov:Bundle rdf:type owl:Class ; + rdfs:comment "Note that there are kinds of bundles (e.g. handwritten letters, audio recordings, etc.) that are not expressed in PROV-O, but can be still be described by PROV-O."@en ; + rdfs:isDefinedBy ; + rdfs:label "Bundle" ; + rdfs:subClassOf prov:Entity ; + prov:category "expanded" ; + prov:definition "A bundle is a named set of provenance descriptions, and is itself an Entity, so allowing provenance of provenance to be expressed."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-bundle-entity"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-bundle-declaration"^^xsd:anyURI . + + + rdf:type owl:ObjectProperty ; + rdfs:domain ; + vs:term_status "stable"@en . + +time:intervalOverlaps + rdf:type owl:ObjectProperty ; + rdfs:comment "If a proper interval T1 is intervalOverlaps another proper interval T2, then the beginning of T1 is before the beginning of T2, the end of T1 is after the beginning of T2, and the end of T1 is before the end of T2."@en , "Si un intervalo propio T1 se solapa con otro intervalo propio T2, entonces el principio de T1 es anterior al principio de T2, el final de T1 es posterior al principio de T2, y el final de T1 es anterior al final de T2."@es , "Asume una dirección en el tiempo. Si una entidad temporal T1 está después de otra entidad temporal T2, entonces el principio de T1 está después del final de T2."@es ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval overlaps"@en , "intervalo se solapa"@es ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalOverlappedBy ; + skos:definition "If a proper interval T1 is intervalOverlaps another proper interval T2, then the beginning of T1 is before the beginning of T2, the end of T1 is after the beginning of T2, and the end of T1 is before the end of T2."@en , "Si un intervalo propio T1 se solapa con otro intervalo propio T2, entonces el principio de T1 es anterior al principio de T2, el final de T1 es posterior al principio de T2, y el final de T1 es anterior al final de T2."@es . + +time:hasEnd rdf:type owl:ObjectProperty ; + rdfs:comment "End of a temporal entity."@en , "Final de una entidad temporal."@es ; + rdfs:domain time:TemporalEntity ; + rdfs:label "tiene fin"@es , "has end"@en ; + rdfs:range time:Instant ; + rdfs:subPropertyOf time:hasTime ; + skos:definition "Final de una entidad temporal."@es , "End of a temporal entity."@en . + +spdx:checksumAlgorithm_sha3_512 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA3-512."@en ; + vs:term_status "stable"@en . + +skos:altLabel rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:comment "The range of skos:altLabel is the class of RDF plain literals."@en , "skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise disjoint properties."@en ; + rdfs:isDefinedBy ; + rdfs:label "alternative label"@en ; + rdfs:subPropertyOf rdfs:label ; + skos:definition "An alternative lexical label for a resource."@en ; + skos:example "Acronyms, abbreviations, spelling variants, and irregular plural/singular forms may be included among the alternative labels for a concept. Mis-spelled terms are normally included as hidden labels (see skos:hiddenLabel)."@en . + +spdx:purpose_device rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package refers to a chipset, processor, or electronic board."@en ; + vs:term_status "stable"@en . + +spdx:standardLicenseHeader + rdf:type owl:DatatypeProperty ; + rdfs:comment "License author's preferred text to indicated that a file is covered by the license."@en ; + rdfs:domain spdx:License ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +vcard:locality rdf:type owl:DatatypeProperty ; + rdfs:comment "The locality (e.g. city or town) associated with the address of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "locality"@en ; + rdfs:range xsd:string . + +time:unitMonth rdf:type time:TemporalUnit ; + rdfs:label "Month (unit of temporal duration)"@en ; + skos:prefLabel "month"@en , "mese"@it , "mois"@fr , "mes"@es , "한달"@kr , "один месяц"@ru , "Monat"@de , "maand"@nl , "miesiąc"@pl , "一個月"@zh , "شهر واحد"@ar , "一か月"@jp ; + time:days "0"^^xsd:decimal ; + time:hours "0"^^xsd:decimal ; + time:minutes "0"^^xsd:decimal ; + time:months "1"^^xsd:decimal ; + time:seconds "0"^^xsd:decimal ; + time:weeks "0"^^xsd:decimal ; + time:years "0"^^xsd:decimal . + +vcard:Coresident rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Coresident"@en ; + rdfs:subClassOf vcard:RelatedType . + + + rdf:type sh:NodeShape ; + sh:name "Agent"@en ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:type ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path foaf:name ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +prov:invalidated rdf:type owl:ObjectProperty ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "invalidated" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:influenced ; + owl:inverseOf prov:wasInvalidatedBy ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:editorialNote "prov:invalidated is one of few inverse property defined, to allow Activity-oriented assertions in addition to Entity-oriented assertions."@en ; + prov:inverse "wasInvalidatedBy" ; + prov:sharesDefinitionWith prov:Invalidation . + +vcard:Group rdf:type owl:Class ; + rdfs:comment "Object representing a group of persons or entities. A group object will usually contain hasMember properties to specify the members of the group."@en ; + rdfs:isDefinedBy ; + rdfs:label "Group"@en ; + rdfs:subClassOf vcard:Kind ; + owl:disjointWith vcard:Individual , vcard:Location , vcard:Organization ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:hasMember ; + owl:someValuesFrom vcard:Kind + ] + [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass vcard:Kind ; + owl:onProperty vcard:hasMember + ] + ) + ] . + +spdx:reviewed rdf:type owl:ObjectProperty , owl:NamedIndividual ; + rdfs:comment "This property has been deprecated since SPDX version 2.0. It has been replaced by an Annotation with an annotation type review."@en , "Reviewed" ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range spdx:Review ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +skos:scopeNote rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "scope note"@en ; + rdfs:subPropertyOf skos:note ; + skos:definition "A note that helps to clarify the meaning and/or the use of a concept."@en . + +prov:ActivityInfluence + rdf:type owl:Class ; + rdfs:comment "It is not recommended that the type ActivityInfluence be asserted without also asserting one of its more specific subclasses."@en , "ActivityInfluence provides additional descriptions of an Activity's binary influence upon any other kind of resource. Instances of ActivityInfluence use the prov:activity property to cite the influencing Activity."@en ; + rdfs:isDefinedBy ; + rdfs:label "ActivityInfluence" ; + rdfs:seeAlso prov:activity ; + rdfs:subClassOf prov:Influence ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty prov:hadActivity + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty prov:hadActivity + ] ; + owl:disjointWith prov:EntityInfluence ; + prov:category "qualified" ; + prov:editorsDefinition "ActivitiyInfluence is the capacity of an activity to have an effect on the character, development, or behavior of another by means of generation, invalidation, communication, or other."@en . + +spdx:annotationType_review + rdf:type owl:NamedIndividual , spdx:AnnotationType ; + rdfs:comment "A Review represents an audit and signoff by an individual, organization or tool on the information for an SpdxElement."@en ; + vs:term_status "stable"@en . + +spdx:order rdf:type owl:DatatypeProperty ; + rdfs:comment "The ordinal order of this element within a list"@en ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:nonNegativeInteger . + +spdx:filesAnalyzed rdf:type owl:DatatypeProperty ; + rdfs:comment "Indicates whether the file content of this package has been available for or subjected to analysis when creating the SPDX document. If false indicates packages that represent metadata or URI references to a project, product, artifact, distribution or a component. If set to false, the package must not contain any files."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:boolean ; + vs:term_status "stable"@en . + +spdx:relationshipType_requirementDescriptionFor + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A describes, illustrates, or specifies a requirement statement for SPDXRef-B."@en ; + vs:term_status "stable"@en . + +vcard:RelatedType rdf:type owl:Class ; + rdfs:comment "Used for relation type codes. The URI of the relation type code must be used as the value for the Relation Type."@en ; + rdfs:isDefinedBy ; + rdfs:label "Relation Type"@en . + +prov:Invalidation rdf:type owl:Class ; + rdfs:comment "An instance of prov:Invalidation provides additional descriptions about the binary prov:wasInvalidatedBy relation from an invalidated prov:Entity to the prov:Activity that invalidated it. For example, :uncracked_egg prov:wasInvalidatedBy :baking; prov:qualifiedInvalidation [ a prov:Invalidation; prov:activity :baking; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Invalidation" ; + rdfs:subClassOf prov:ActivityInfluence , prov:InstantaneousEvent ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Invalidation is the start of the destruction, cessation, or expiry of an existing entity by an activity. The entity is no longer available for use (or further invalidation) after invalidation. Any generation or usage of an entity precedes its invalidation." ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Invalidation"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Invalidation"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasInvalidatedBy . + +[ owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ] . + +vcard:Parcel rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Parcel"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + + + rdf:type owl:Class ; + rdfs:subClassOf ; + vs:term_status "stable" . + +vcard:Female rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Female"@en ; + rdfs:subClassOf vcard:Gender . + +skos:example rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "example"@en ; + rdfs:subPropertyOf skos:note ; + skos:definition "An example of the use of a concept."@en . + +spdx:annotationType rdf:type owl:ObjectProperty ; + rdfs:comment "Type of the annotation."@en ; + rdfs:domain spdx:Annotation ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Restriction ; + owl:hasValue spdx:annotationType_other ; + owl:onProperty spdx:annotationType + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:annotationType_review ; + owl:onProperty spdx:annotationType + ] + ) + ] ; + vs:term_status "stable"@en . + +prov:hadPrimarySource + rdf:type owl:ObjectProperty ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "hadPrimarySource" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasDerivedFrom ; + owl:propertyChainAxiom ( prov:qualifiedPrimarySource prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedPrimarySource prov:entity ) ; + prov:category "expanded" ; + prov:component "derivations" ; + prov:inverse "wasPrimarySourceOf" ; + prov:qualifiedForm prov:PrimarySource , prov:qualifiedPrimarySource . + +prov:wasQuotedFrom rdf:type owl:ObjectProperty ; + rdfs:comment "An entity is derived from an original entity by copying, or 'quoting', some or all of it."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "wasQuotedFrom" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasDerivedFrom ; + owl:propertyChainAxiom ( prov:qualifiedQuotation prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedQuotation prov:entity ) ; + prov:category "expanded" ; + prov:component "derivations" ; + prov:inverse "quotedAs" ; + prov:qualifiedForm prov:qualifiedQuotation , prov:Quotation . + +dcterms:instructionalMethod + rdf:type rdf:Property ; + rdfs:comment "A process, used to engender knowledge, attitudes and skills, that the described resource is designed to support."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Instructional Method"@en ; + dcam:rangeIncludes dcterms:MethodOfInstruction ; + dcterms:description "Instructional Method typically includes ways of presenting instructional materials or conducting instructional activities, patterns of learner-to-learner and learner-to-instructor interactions, and mechanisms by which group and individual levels of learning are measured. Instructional methods include all aspects of the instruction and learning processes from planning and implementation through evaluation and feedback."@en ; + dcterms:issued "2005-06-13"^^xsd:date . + +skos:hasTopConcept rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:domain skos:ConceptScheme ; + rdfs:isDefinedBy ; + rdfs:label "has top concept"@en ; + rdfs:range skos:Concept ; + owl:inverseOf skos:topConceptOf ; + skos:definition "Relates, by convention, a concept scheme to a concept which is topmost in the broader/narrower concept hierarchies for that scheme, providing an entry point to these hierarchies."@en . + +prov:influencer rdf:type owl:ObjectProperty ; + rdfs:comment "Subproperties of prov:influencer are used to cite the object of an unqualified PROV-O triple whose predicate is a subproperty of prov:wasInfluencedBy (e.g. prov:used, prov:wasGeneratedBy). prov:influencer is used much like rdf:object is used."@en ; + rdfs:domain prov:Influence ; + rdfs:isDefinedBy ; + rdfs:label "influencer" ; + rdfs:range owl:Thing ; + prov:category "qualified" ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence"^^xsd:anyURI ; + prov:editorialNote "This property and its subproperties are used in the same way as the rdf:object property, i.e. to reference the object of an unqualified prov:wasInfluencedBy or prov:influenced triple."@en ; + prov:editorsDefinition "This property is used as part of the qualified influence pattern. Subclasses of prov:Influence use these subproperties to reference the resource (Entity, Agent, or Activity) whose influence is being qualified."@en ; + prov:inverse "hadInfluence" . + +time:timeZone rdf:type owl:ObjectProperty ; + rdfs:comment "The time zone for clock elements in the temporal position"@en ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "in time zone"@en , "en huso horario"@es ; + rdfs:range time:TimeZone ; + skos:historyNote "En la versión original de OWL-Time de 2006, el rango de 'en huso horario' se definió en un espacio de nombres diferente \"http://www.w3.org/2006/timezone#\".\n Un axioma de alineación permite que los datos codificados de acuerdo con la versión anterior sean consistentes con la ontología actualizada."@es , "In the original 2006 version of OWL-Time, the range of time:timeZone was a TimeZone class in a separate namespace \"http://www.w3.org/2006/timezone#\". \nAn alignment axiom \n\ttzont:TimeZone rdfs:subClassOf time:TimeZone . \nallows data encoded according to the previous version to be consistent with the updated ontology. " ; + skos:note "IANA maintains a database of timezones. These are well maintained and generally considered authoritative, but individual items are not available at individual URIs, so cannot be used directly in data expressed using OWL-Time.\n\nDBPedia provides a set of resources corresponding to the IANA timezones, with a URI for each (e.g. http://dbpedia.org/resource/Australia/Eucla). The World Clock service also provides a list of time zones with the description of each available as an individual webpage with a convenient individual URI (e.g. https://www.timeanddate.com/time/zones/acwst). These or other, similar, resources might be used as a value of the time:timeZone property." , "IANA mantiene una base de datos de husos horarios. Éstas están bien mantenidas y generalmente se consideran autorizadas, pero los ítems individuales no están disponibles en URIs individuales, por tanto, no se pueden utilizar directamente en datos expresados utilizando OWL-Time.\n La BDPedia proporciona un conjunto de recursos correspondientes a los husos horarios de IANA, con una URI para cada uno (por ejemplo, http://dbpedia.org/resource/Australia/Eucla). El Servicio de Reloj Mundial también proporciona una lista de husos horarios con la descripción de cada uno de los disponibles como una página Web individual con una URI adecuada individual (por ejemplo, https://www.timeanddate.com/time/zones/acwst). Éstos, y otros recursos similares, se puden usar como un valor de la propiedad 'huso horario'."@es . + +locn:locatorName rdf:type rdf:Property ; + rdfs:comment "Proper noun(s) applied to the real world entity identified by the locator. The locator name could be the name of the property or complex, of the building or part of the building, or it could be the name of a room inside a building. \n "@en ; + rdfs:isDefinedBy ; + rdfs:label "locator name"@en ; + dcterms:identifier "locn:locatorName" ; + vs:term_status "testing"@en . + +spdx:referenceCategory_persistentId + rdf:type owl:NamedIndividual , spdx:ReferenceCategory ; + rdfs:comment "These point to objects present in the Software Heritage archive by the means of persistent identifiers that are guaranteed to remain stable (persistent) over time."@en ; + vs:term_status "stable"@en . + +dcterms:references rdf:type rdf:Property ; + rdfs:comment "A related resource that is referenced, cited, or otherwise pointed to by the described resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "References"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Is Referenced By."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:relatedSpdxElement + rdf:type owl:ObjectProperty ; + rdfs:comment "A related SpdxElement."@en ; + rdfs:domain spdx:Relationship ; + rdfs:range spdx:SpdxElement ; + vs:term_status "stable"@en . + +prov:hadRole rdf:type owl:ObjectProperty ; + rdfs:comment "The _optional_ Role that an Entity assumed in the context of an Activity. For example, :baking prov:used :spoon; prov:qualified [ a prov:Usage; prov:entity :spoon; prov:hadRole roles:mixing_implement ]."@en , "This property has multiple RDFS domains to suit multiple OWL Profiles. See
PROV-O OWL Profile." ; + rdfs:domain prov:Influence ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Association prov:InstantaneousEvent ) + ] ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Association prov:InstantaneousEvent ) + ] ; + rdfs:isDefinedBy ; + rdfs:label "hadRole" ; + rdfs:range prov:Role ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:editorsDefinition "prov:hadRole references the Role (i.e. the function of an entity with respect to an activity), in the context of an instantaneous usage, generation, association, start, and end."@en ; + prov:inverse "wasRoleIn" ; + prov:sharesDefinitionWith prov:Role . + +dcterms:MethodOfAccrual + rdf:type rdfs:Class ; + rdfs:comment "A method by which resources are added to a collection."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Method of Accrual"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:Sweetheart rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Sweetheart"@en ; + rdfs:subClassOf vcard:RelatedType . + +prov:wasInfluencedBy rdf:type owl:ObjectProperty ; + rdfs:comment "This property has multiple RDFS domains to suit multiple OWL Profiles. See PROV-O OWL Profile." , "Because prov:wasInfluencedBy is a broad relation, its more specific subproperties (e.g. prov:wasInformedBy, prov:actedOnBehalfOf, prov:wasEndedBy, etc.) should be used when applicable."@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + rdfs:isDefinedBy ; + rdfs:label "wasInfluencedBy" ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:editorialNote "The sub-properties of prov:wasInfluencedBy can be elaborated in more detail using the Qualification Pattern. For example, the binary relation :baking prov:used :spoon can be qualified by asserting :baking prov:qualifiedUsage [ a prov:Usage; prov:entity :spoon; prov:atLocation :kitchen ] .\n\nSubproperties of prov:wasInfluencedBy may also be asserted directly without being qualified.\n\nprov:wasInfluencedBy should not be used without also using one of its subproperties. \n"@en ; + prov:inverse "influenced" ; + prov:qualifiedForm prov:Influence , prov:qualifiedInfluence ; + prov:sharesDefinitionWith prov:Influence . + +time:Thursday rdf:type time:DayOfWeek ; + rdfs:label "Thursday"@en ; + skos:prefLabel "Четверг"@ru , "الخميس"@ar , "Donnerstag"@de , "Czwartek"@pl , "Donderdag"@nl , "Jeudi"@fr , "Quinta-feira"@pt , "Jueves"@es , "星期四"@zh , "Thursday"@en , "木曜日"@ja , "Giovedì"@it . + +time:inXSDDateTime rdf:type owl:DeprecatedProperty , owl:DatatypeProperty ; + rdfs:comment "Posición de un instante, expresado utilizando xsd:dateTime."@es , "Position of an instant, expressed using xsd:dateTime"@en ; + rdfs:domain time:Instant ; + rdfs:label "en fecha-tiempo XSD"@es , "in XSD Date-Time"@en ; + rdfs:range xsd:dateTime ; + owl:deprecated true ; + skos:definition "Posición de un instante, expresado utilizando xsd:dateTime."@es , "Position of an instant, expressed using xsd:dateTime"@en ; + skos:note "La propiedad 'en fecha-hora XSD' ha sido reemplazada por 'en fecha-sello de tiempo XSD' que hace obligatorio el campo 'huso horario'."@es , "The property :inXSDDateTime is replaced by :inXSDDateTimeStamp which makes the time-zone field mandatory."@en . + +dcterms:LinguisticSystem + rdf:type rdfs:Class ; + rdfs:comment "A system of signs, symbols, sounds, gestures, or rules used in communication."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Linguistic System"@en ; + dcterms:description "Written, spoken, sign, and computer languages are linguistic systems."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:ConjunctiveLicenseSet + rdf:type owl:Class ; + rdfs:comment "A ConjunctiveLicenseSet represents a set of licensing information all of which apply."@en ; + rdfs:subClassOf spdx:AnyLicenseInfo , rdfs:Container ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "2"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:member + ] ; + vs:term_status "stable"@en . + +vcard:Label rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Label"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + +vcard:logo rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "logo"@en ; + owl:equivalentProperty vcard:hasLogo . + +spdx:snippetName rdf:type owl:DatatypeProperty ; + rdfs:comment "Identify a specific snippet in a human convenient manner."@en ; + rdfs:domain spdx:Snippet ; + rdfs:range xsd:string ; + rdfs:subPropertyOf spdx:name ; + vs:term_status "stable"@en . + +spdx:relationshipType_exampleOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is an example of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +dcat:downloadURL rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "URL til fil der kan downloades i et bestemt format. Fx en CSV-fil eller en RDF-fil. Formatet for distributionen angives ved hjælp af egenskaberne dct:format og/eller dcat:mediaType."@da , "The URL of the downloadable file in a given format. E.g. CSV file or RDF file. The format is indicated by the distribution's dct:format and/or dcat:mediaType."@en , "Ceci est un lien direct à un fichier téléchargeable en un format donnée. Exple fichier CSV ou RDF. Le format est décrit par les propriétés de distribution dct:format et/ou dcat:mediaType."@fr , "La URL de un archivo descargable en el formato dato. Por ejemplo, archivo CSV o archivo RDF. El formato se describe con las propiedades de la distribución dct:format y/o dcat:mediaType."@es , "Questo è un link diretto al file scaricabile in un dato formato. E.g. un file CSV o un file RDF. Il formato è descritto dal dct:format e/o dal dcat:mediaType della distribuzione."@it , "URL souboru ke stažení v daném formátu, například CSV nebo RDF soubor. Formát je popsán vlastností distribuce dct:format a/nebo dcat:mediaType."@cs , "dcat:downloadURLはdcat:accessURLの特定の形式です。しかし、DCATプロファイルが非ダウンロード・ロケーションに対してのみaccessURLを用いる場合には、より強い分離を課すことを望む可能性があるため、この含意を強化しないように、DCATは、dcat:downloadURLをdcat:accessURLのサブプロパティーであると定義しません。"@ja , "Είναι ένας σύνδεσμος άμεσης μεταφόρτωσης ενός αρχείου σε μια δεδομένη μορφή. Π.χ. ένα αρχείο CSV ή RDF. Η μορφη αρχείου περιγράφεται από τις ιδιότητες dct:format ή/και dcat:mediaType της διανομής."@el , "رابط مباشر لملف يمكن تحميله. نوع الملف يتم توصيفه باستخدام الخاصية dct:format dcat:mediaType "@ar ; + rdfs:domain dcat:Distribution ; + rdfs:isDefinedBy ; + rdfs:label "downloadURL"@da , "URL de descarga"@es , "رابط تحميل"@ar , "ダウンロードURL"@ja , "URL di scarico"@it , "download URL"@en , "URL souboru ke stažení"@cs , "URL μεταφόρτωσης"@el , "URL de téléchargement"@fr ; + rdfs:range rdfs:Resource ; + skos:definition "Ceci est un lien direct à un fichier téléchargeable en un format donnée. Exple fichier CSV ou RDF. Le format est décrit par les propriétés de distribution dct:format et/ou dcat:mediaType."@fr , "dcat:downloadURLはdcat:accessURLの特定の形式です。しかし、DCATプロファイルが非ダウンロード・ロケーションに対してのみaccessURLを用いる場合には、より強い分離を課すことを望む可能性があるため、この含意を強化しないように、DCATは、dcat:downloadURLをdcat:accessURLのサブプロパティーであると定義しません。"@ja , "Questo è un link diretto al file scaricabile in un dato formato. E.g. un file CSV o un file RDF. Il formato è descritto dal dct:format e/o dal dcat:mediaType della distribuzione."@it , "The URL of the downloadable file in a given format. E.g. CSV file or RDF file. The format is indicated by the distribution's dct:format and/or dcat:mediaType."@en , "رابط مباشر لملف يمكن تحميله. نوع الملف يتم توصيفه باستخدام الخاصية dct:format dcat:mediaType "@ar , "URL souboru ke stažení v daném formátu, například CSV nebo RDF soubor. Formát je popsán vlastností distribuce dct:format a/nebo dcat:mediaType."@cs , "Είναι ένας σύνδεσμος άμεσης μεταφόρτωσης ενός αρχείου σε μια δεδομένη μορφή. Π.χ. ένα αρχείο CSV ή RDF. Η μορφη αρχείου περιγράφεται από τις ιδιότητες dct:format ή/και dcat:mediaType της διανομής."@el , "URL til fil der kan downloades i et bestemt format. Fx en CSV-fil eller en RDF-fil. Formatet for distributionen angives ved hjælp af egenskaberne dct:format og/eller dcat:mediaType."@da , "La URL de un archivo descargable en el formato dato. Por ejemplo, archivo CSV o archivo RDF. El formato se describe con las propiedades de la distribución dct:format y/o dcat:mediaType."@es ; + skos:editorialNote "Status: English Definition text modified by DCAT revision team, Italian, Spanish and Czech translation updated, other translations pending."@en , "rdfs:label, rdfs:comment and/or skos:scopeNote have been modified. Non-english versions must be updated."@en ; + skos:scopeNote "La valeur est une URL."@fr , "dcat:downloadURL SHOULD be used for the address at which this distribution is available directly, typically through a HTTP Get request."@en , "dcat:downloadURL BY MĚLA být použita pro adresu, ze které je distribuce přímo přístupná, typicky skrze požadavek HTTP Get."@cs , "dcat:downloadURL DOVREBBE essere utilizzato per l'indirizzo a cui questa distribuzione è disponibile direttamente, in genere attraverso una richiesta Get HTTP."@it , "El valor es una URL."@es , "dcat:downloadURL BØR anvendes til angivelse af den adresse hvor distributionen er tilgængelig direkte, typisk gennem et HTTP Get request."@da , "Η τιμή είναι ένα URL."@el . + +spdx:referenceType rdf:type owl:ObjectProperty ; + rdfs:comment "Type of the external reference. These are definined in an appendix in the SPDX specification."@en ; + rdfs:domain spdx:ExternalRef ; + rdfs:range spdx:ReferenceType ; + vs:term_status "stable"@en . + +adms:translation rdf:type owl:ObjectProperty ; + rdfs:comment "Links Assets that are translations of each other."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "translation"@en ; + rdfs:range rdfs:Resource . + +vcard:tel rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "telephone"@en ; + owl:equivalentProperty vcard:hasTelephone . + +spdx:referenceCategory_packageManager + rdf:type owl:NamedIndividual , spdx:ReferenceCategory ; + vs:term_status "stable"@en . + +spdx:RelationshipType + rdf:type owl:Class ; + rdfs:comment "Type of relationship."@en ; + vs:term_status "stable"@en . + +vcard:hasRole rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the role data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has role"@en . + +dcterms:relation rdf:type rdf:Property ; + rdfs:comment "A related resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Relation"@en ; + rdfs:subPropertyOf dc:relation ; + dcterms:description "Recommended practice is to identify the related resource by means of a URI. If this is not possible or feasible, a string conforming to a formal identification system may be provided."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcat:landingPage rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "Una página web que puede ser visitada en un explorador Web para tener acceso el catálogo, un conjunto de datos, sus distribuciones y/o información adicional."@es , "A Web page that can be navigated to in a Web browser to gain access to the catalog, a dataset, its distributions and/or additional information."@en , "Μία ιστοσελίδα πλοηγίσιμη μέσω ενός φυλλομετρητή (Web browser) που δίνει πρόσβαση στο σύνολο δεδομένων, τις διανομές αυτού ή/και επιπρόσθετες πληροφορίες."@el , "Una pagina web che può essere navigata per ottenere l'accesso al catalogo, ad un dataset, alle distribuzioni del dataset e/o ad informazioni addizionali."@it , "データセット、その配信および(または)追加情報にアクセスするためにウエブ・ブラウザでナビゲートできるウェブページ。"@ja , "صفحة وب يمكن من خلالها الوصول الى قائمة البيانات أو إلى معلومات إضافية متعلقة بها "@ar , "En webside som der kan navigeres til i en webbrowser for at få adgang til kataloget, et datasæt, dets distributioner og/eller yderligere information."@da , "Webová stránka, na kterou lze pro získání přístupu ke katalogu, datové sadě, jejím distribucím a/nebo dalším informacím přistoupit webovým prohlížečem."@cs , "Une page Web accessible par un navigateur Web donnant accès au catalogue, un jeu de données, ses distributions et/ou des informations additionnelles."@fr ; + rdfs:isDefinedBy ; + rdfs:label "página de destino"@es , "landing page"@en , "vstupní stránka"@cs , "destinationsside"@da , "ランディング・ページ"@ja , "page d'atterrissage"@fr , "صفحة وصول"@ar , "pagina di destinazione"@it , "ιστοσελίδα αρχικής πρόσβασης"@el ; + rdfs:range foaf:Document ; + rdfs:subPropertyOf foaf:page ; + skos:definition "Una pagina web che può essere navigata per ottenere l'accesso al catalogo, ad un dataset, alle distribuzioni del dataset e/o ad informazioni addizionali."@it , "A Web page that can be navigated to in a Web browser to gain access to the catalog, a dataset, its distributions and/or additional information."@en , "Una página web que puede ser visitada en un explorador Web para tener acceso el catálogo, un conjunto de datos, sus distribuciones y/o información adicional."@es , "صفحة وب يمكن من خلالها الوصول الى قائمة البيانات أو إلى معلومات إضافية متعلقة بها "@ar , "En webside som en webbrowser kan navigeres til for at få adgang til kataloget, et datasæt, dets distritbutioner og/eller yderligere information."@da , "Webová stránka, na kterou lze pro získání přístupu ke katalogu, datové sadě, jejím distribucím a/nebo dalším informacím přistoupit webovým prohlížečem."@cs , "Μία ιστοσελίδα πλοηγίσιμη μέσω ενός φυλλομετρητή (Web browser) που δίνει πρόσβαση στο σύνολο δεδομένων, τις διανομές αυτού ή/και επιπρόσθετες πληροφορίες."@el , "Une page Web accessible par un navigateur Web donnant accès au catalogue, un jeu de données, ses distributions et/ou des informations additionnelles."@fr , "データセット、その配信および(または)追加情報にアクセスするためにウエブ・ブラウザでナビゲートできるウェブページ。"@ja ; + skos:scopeNote "Hvis en eller flere distributioner kun er tilgængelige via en destinationsside (dvs. en URL til direkte download er ikke kendt), så bør destinationssidelinket gentages som adgangsadresse for en distribution."@da , "Si la distribución es accesible solamente través de una página de aterrizaje (i.e., no se conoce una URL de descarga directa), entonces el enlance a la página de aterrizaje debe ser duplicado como accessURL sobre la distribución."@es , "ランディング・ページを通じてしか配信にアクセスできない場合(つまり、直接的なダウンロードURLが不明)には、配信におけるaccessURLとしてランディング・ページのリンクをコピーすべきです(SHOULD)。"@ja , "If the distribution(s) are accessible only through a landing page (i.e. direct download URLs are not known), then the landing page link should be duplicated as accessURL on a distribution."@en , "Αν η/οι διανομή/ές είναι προσβάσιμη/ες μόνο μέσω μίας ιστοσελίδας αρχικής πρόσβασης (δηλαδή αν δεν υπάρχουν γνωστές διευθύνσεις άμεσης μεταφόρτωσης), τότε ο σύνδεσμος της ιστοσελίδας αρχικής πρόσβασης πρέπει να αναπαραχθεί ως accessURL σε μία διανομή."@el , "Pokud je distribuce dostupná pouze přes vstupní stránku, t.j. přímý URL odkaz ke stažení není znám, URL přístupové stránky by mělo být duplikováno ve vlastnosti distribuce accessURL."@cs , "Se la distribuzione è accessibile solo attraverso una pagina di destinazione (cioè, un URL di download diretto non è noto), il link alla pagina di destinazione deve essere duplicato come accessURL sulla distribuzione."@it , "Si la distribution est seulement accessible à travers une page d'atterrissage (exple. pas de connaissance d'URLS de téléchargement direct ), alors le lien de la page d'atterrissage doit être dupliqué comme accessURL sur la distribution."@fr . + +dcterms:RFC1766 rdf:type rdfs:Datatype ; + rdfs:comment "The set of tags, constructed according to RFC 1766, for the identification of languages."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "RFC 1766"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +dcat:Role rdf:type owl:Class ; + rdfs:comment "Role je funkce zdroje či agenta ve vztahu k jinému zdroji, v kontextu přiřazení zdrojů či vztahů mezi zdroji."@cs , "A role is the function of a resource or agent with respect to another resource, in the context of resource attribution or resource relationships."@en , "Un rol es la función de un recurso o agente con respecto a otro recuros, en el contexto de atribución del recurso o de las relaciones entre recursos."@es , "En rolle er den funktion en ressource eller aktør har i forhold til en anden ressource, i forbindelse med ressourcekreditering eller ressourcerelationer."@da , "Un ruolo è la funzione di una risorsa o di un agente rispetto ad un'altra risorsa, nel contesto dell'attribuzione delle risorse o delle relazioni tra risorse."@it ; + rdfs:label "Rolle"@da , "Rol"@es , "Ruolo"@it , "Role"@cs , "Role"@en ; + rdfs:seeAlso dcat:hadRole ; + rdfs:subClassOf skos:Concept ; + skos:changeNote "Nuova classe aggiunta in DCAT 2.0."@it , "Nueva clase agregada en DCAT 2.0."@es , "Ny klasse tilføjet i DCAT 2.0."@en , "Nová třída přidaná ve verzi DCAT 2.0."@cs , "New class added in DCAT 2.0."@en ; + skos:definition "Role je funkce zdroje či agenta ve vztahu k jinému zdroji, v kontextu přiřazení zdrojů či vztahů mezi zdroji."@cs , "A role is the function of a resource or agent with respect to another resource, in the context of resource attribution or resource relationships."@en , "Un ruolo è la funzione di una risorsa o di un agente rispetto ad un'altra risorsa, nel contesto dell'attribuzione delle risorse o delle relazioni tra risorse."@it , "Un rol es la función de un recurso o agente con respecto a otro recuros, en el contexto de atribución del recurso o de las relaciones entre recursos."@es , "En rolle er den funktion en ressource eller aktør har i forhold til en anden ressource, i forbindelse med ressourcekreditering eller ressourcerelationer."@da ; + skos:editorialNote "Introduced into DCAT to complement prov:Role (whose use is limited to roles in the context of an activity, as the range of prov:hadRole)."@en , "Introduceret i DCAT for at supplere prov:Role (hvis anvendelse er begrænset til roller i forbindelse med en aktivitet, som er rækkevidde for prov:hadRole)."@da , "Přidáno do DCAT pro doplnění třídy prov:Role (jejíž užití je omezeno na role v kontextu aktivit, jakožto obor hodnot vlastnosti prov:hadRole)."@cs , "Introdotta in DCAT per completare prov:Role (il cui uso è limitato ai ruoli nel contesto di un'attività, in conseguenza alla definizione del codominio di prov:hadRole)."@it , "Incluída en DCAT para complementar prov:Role (cuyo uso está limitado a roles en el contexto de una actividad, ya que es el rango es prov:hadRole)."@es ; + skos:scopeNote "Se usa en una relación cualificada para especificar el rol de una Entidad con respecto a otra Entidad. Se recomienda que los valores se administren como los valores de un vocabulario controlado de roles de entidad como por ejemplo: ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode; IANA Registry of Link Relations https://www.iana.org/assignments/link-relation; el esquema de metadatos de DataCite; MARC relators https://id.loc.gov/vocabulary/relators."@es , "Used in a qualified-attribution to specify the role of an Agent with respect to an Entity. It is recommended that the values be managed as a controlled vocabulary of agent roles, such as http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@en , "Anvendes i forbindelse med kvalificerede krediteringer til at angive aktørens rolle i forhold til en entitet. Det anbefales at værdierne styres som et kontrolleret udfaldsrum med aktørroller, såsom http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@da , "Used in a qualified-relation to specify the role of an Entity with respect to another Entity. It is recommended that the values be managed as a controlled vocabulary of entity roles such as: ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode; IANA Registry of Link Relations https://www.iana.org/assignments/link-relation; DataCite metadata schema; MARC relators https://id.loc.gov/vocabulary/relators."@en , "Použito v kvalifikovaném přiřazení pro specifikaci role Agenta ve vztahu k Entitě. Je doporučeno množinu hodnot spravovat jako řízený slovník rolí agentů, jako například http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@cs , "Se usa en una atribución cualificada para especificar el rol de un Agente con respecto a una Entidad. Se recomienda que los valores se administren como un vocabulario controlado de roles de agente, como por ejemplo http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@es , "Utilizzato in un'attribuzione qualificata per specificare il ruolo di un agente rispetto a un'entità. Si consiglia di attribuire i valori considerando un vocabolario controllato dei ruoli dell'agente, ad esempio http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@it , "Utilizzato in una relazione qualificata per specificare il ruolo di un'entità rispetto a un'altra entità. Si raccomanda che il valore sia preso da un vocabolario controllato di ruoli di entità come ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode, IANA Registry of Link Relations https://www.iana.org/assignments/link-relation, DataCite metadata schema, o MARC relators https://id.loc.gov/vocabulary/relators."@it , "Anvendes i forbindelse med kvalificerede relationer til at specificere en entitets rolle i forhold til en anden entitet. Det anbefales at værdierne styres med et kontrolleret udfaldsrum for for entitetsroller såsom: ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode; IANA Registry of Link Relations https://www.iana.org/assignments/link-relation; DataCite metadata schema; MARC relators https://id.loc.gov/vocabulary/relators."@da , "Použito v kvalifikovaném vztahu pro specifikaci role Entity ve vztahu k jiné Entitě. Je doporučeno množinu hodnot spravovat jako řízený slovník rolí entit, jako například ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode, IANA Registry of Link Relations https://www.iana.org/assignments/link-relation, DataCite metadata schema, či MARC relators https://id.loc.gov/vocabulary/relators."@cs . + +dcterms:available rdf:type rdf:Property ; + rdfs:comment "Date that the resource became or will become available."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Available"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +time:hours rdf:type owl:DatatypeProperty ; + rdfs:comment "length of, or element of the length of, a temporal extent expressed in hours"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en horas."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "hours duration"@en , "duración en horas"@es ; + rdfs:range xsd:decimal ; + skos:definition "length of, or element of the length of, a temporal extent expressed in hours"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en horas."@es . + +spdx:checksumAlgorithm_md5 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was MD5"@en ; + vs:term_status "stable"@en . + +spdx:member rdf:type owl:ObjectProperty ; + rdfs:comment "A license, or other licensing information, that is a member of the subject license set."@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( spdx:ConjunctiveLicenseSet spdx:DisjunctiveLicenseSet spdx:WithExceptionOperator ) + ] ; + rdfs:range spdx:AnyLicenseInfo ; + vs:term_status "stable"@en . + +spdx:checksumAlgorithm_blake3 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was BLAKE3."@en ; + vs:term_status "stable"@en . + +doap:homepage rdf:type owl:DatatypeProperty ; + rdfs:domain spdx:Package ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +time:TemporalEntity rdf:type owl:Class ; + rdfs:comment "A temporal interval or instant."@en , "Un intervalo temporal o un instante."@es ; + rdfs:label "Temporal entity"@en , "entidad temporal"@es ; + rdfs:subClassOf owl:Thing ; + owl:unionOf ( time:Instant time:Interval ) ; + skos:definition "A temporal interval or instant."@en , "Un intervalo temporal o un instante."@es . + +vcard:Spouse rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Spouse"@en ; + rdfs:subClassOf vcard:RelatedType . + +spdx:validUntilDate rdf:type owl:DatatypeProperty ; + rdfs:comment "This field provides a place for recording the end of the support period for a package from the supplier."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf spdx:date ; + vs:term_status "stable"@en . + +time:minute rdf:type owl:DatatypeProperty ; + rdfs:comment "Minute position in a calendar-clock system."@en , "Posición de minuto en un sistema calendario-reloj."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "minute"@en , "minuto"@es ; + rdfs:range xsd:nonNegativeInteger ; + skos:definition "Minute position in a calendar-clock system."@en , "Posición de minuto en un sistema calendario-reloj."@es . + +spdx:isLive rdf:type owl:DatatypeProperty ; + rdfs:comment "Indicate a URL is still a live accessible location on the public internet"@en ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:boolean . + +dcterms:educationLevel + rdf:type rdf:Property ; + rdfs:comment "A class of agents, defined in terms of progression through an educational or training context, for which the described resource is intended."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Audience Education Level"@en ; + rdfs:subPropertyOf dcterms:audience ; + dcam:rangeIncludes dcterms:AgentClass ; + dcterms:issued "2002-07-13"^^xsd:date . + +vcard:key rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "key"@en ; + owl:equivalentProperty vcard:hasKey . + +skos:prefLabel rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:comment "A resource has no more than one value of skos:prefLabel per language tag, and no more than one value of skos:prefLabel without language tag."@en , "The range of skos:prefLabel is the class of RDF plain literals."@en , "skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise\n disjoint properties."@en ; + rdfs:isDefinedBy ; + rdfs:label "preferred label"@en ; + rdfs:subPropertyOf rdfs:label ; + skos:definition "The preferred lexical label for a resource, in a given language."@en . + +dcterms:valid rdf:type rdf:Property ; + rdfs:comment "Date (often a range) of validity of a resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Valid"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:hasGender rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the sex or gender identity of the object. URIs are recommended to enable interoperable sex and gender codes to be used."@en ; + rdfs:isDefinedBy ; + rdfs:label "has gender"@en . + +vcard:Individual rdf:type owl:Class ; + rdfs:comment "An object representing a single person or entity"@en ; + rdfs:isDefinedBy ; + rdfs:label "Individual"@en ; + rdfs:subClassOf vcard:Kind ; + owl:disjointWith vcard:Location , vcard:Organization . + +dcterms:DDC rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of conceptual resources specified by the Dewey Decimal Classification."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "DDC"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:standardLicenseHeaderTemplate + rdf:type owl:DatatypeProperty ; + rdfs:comment "License template which describes sections of the license header which can be varied. See License Template section of the specification for format information."@en ; + rdfs:domain spdx:License ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +vcard:label rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "label"@en ; + owl:deprecated true . + +vcard:Muse rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Muse"@en ; + rdfs:subClassOf vcard:RelatedType . + +vcard:Email rdf:type owl:Class ; + rdfs:comment "To specify the electronic mail address for communication with the object the vCard represents. Use the hasEmail object property."@en ; + rdfs:isDefinedBy ; + rdfs:label "Email"@en ; + owl:deprecated true . + +[ rdf:type owl:Axiom ; + rdfs:comment "Revision is a derivation (see http://www.w3.org/TR/prov-dm/#term-Revision). Moreover, according to \nhttp://www.w3.org/TR/2013/REC-prov-constraints-20130430/#term-Revision 23 April 2012 'wasRevisionOf is a strict sub-relation of wasDerivedFrom since two entities e2 and e1 may satisfy wasDerivedFrom(e2,e1) without being a variant of each other.'" ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasRevisionOf ; + owl:annotatedTarget prov:wasDerivedFrom +] . + +spdx:packageVerificationCode + rdf:type owl:ObjectProperty ; + rdfs:comment "A manifest based verification code (the algorithm is defined in section 3.9.4 of the full specification) of the package. This allows consumers of this data and/or database to determine if a package they have in hand is identical to the package from which the data was produced. This algorithm works even if the SPDX document is included in the package."@en ; + rdfs:domain spdx:Package ; + rdfs:range spdx:PackageVerificationCode ; + vs:term_status "stable"@en . + +locn:adminUnitL1 rdf:type rdf:Property ; + rdfs:comment "The uppermost administrative unit for the address, almost always a country. The domain of locn:adminUnitL1 is locn:Address and the range is a literal, conceptually defined by the INSPIRE Geographical Name data type."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "admin unit level 1"@en ; + dcterms:identifier "locn:adminUnitL1" ; + vann:usageNote "Best practice is to use the ISO 3166-1 code but if this is inappropriate for the context, country names should be provided in a consistent manner to reduce ambiguity. For example, either write 'United Kingdom' or 'UK' consistently throughout the data set and avoid mixing the two."@en ; + vs:term_status "testing"@en . + +dcat:Dataset rdf:type rdfs:Class , owl:Class ; + rdfs:comment "1つのエージェントによって公開またはキュレートされ、1つ以上の形式でアクセスまたはダウンロードできるデータの集合。"@ja , "Raccolta di dati, pubblicati o curati da un'unica fonte, disponibili per l'accesso o il download in uno o più formati."@it , "Μία συλλογή από δεδομένα, δημοσιευμένη ή επιμελημένη από μία και μόνο πηγή, διαθέσιμη δε προς πρόσβαση ή μεταφόρτωση σε μία ή περισσότερες μορφές."@el , "قائمة بيانات منشورة أو مجموعة من قبل مصدر ما و متاح الوصول إليها أو تحميلها"@ar , "A collection of data, published or curated by a single source, and available for access or download in one or more representations."@en , "Une collection de données, publiée ou élaborée par une seule source, et disponible pour accès ou téléchargement dans un ou plusieurs formats."@fr , "Kolekce dat poskytovaná či řízená jedním zdrojem, která je k dispozici pro přístup či stažení v jednom či více formátech."@cs , "Una colección de datos, publicados o conservados por una única fuente, y disponibles para ser accedidos o descargados en uno o más formatos."@es , "En samling af data, udgivet eller udvalgt og arrangeret af en enkelt kilde og som er til råde for adgang til eller download af i en eller flere repræsentationer."@da ; + rdfs:isDefinedBy ; + rdfs:label "データセット"@ja , "Dataset"@en , "Dataset"@it , "قائمة بيانات"@ar , "Conjunto de datos"@es , "Σύνολο Δεδομένων"@el , "Jeu de données"@fr , "Datová sada"@cs , "Datasæt"@da ; + rdfs:subClassOf dcat:Resource ; + skos:altLabel "Datasamling"@da ; + skos:changeNote "2018-02 - subklasse af dctype:Dataset fjernet da scope af dcat:Dataset omfatter flere forskellige typer fra dctype-vokabularet."@da , "2018-02 - odstraněno tvrzení o podtřídě dctype:Dataset, jelikož rozsah dcat:Dataset zahrnuje několik dalších typů ze slovníku dctype."@cs , "2018-02 - subclass of dctype:Dataset removed because scope of dcat:Dataset includes several other types from the dctype vocabulary."@en , "2018-02 - se eliminó el axioma de subclase con dctype:Dataset porque el alcance de dcat:Dataset incluye muchos otros tipos del vocabulario dctype."@es , "2018-02 - sottoclasse di dctype:Dataset rimosso perché l'ambito di dcat:Dataset include diversi altri tipi dal vocabolario dctype."@it ; + skos:definition "Une collection de données, publiée ou élaborée par une seule source, et disponible pour accès ou téléchargement dans un ou plusieurs formats."@fr , "قائمة بيانات منشورة أو مجموعة من قبل مصدر ما و متاح الوصول إليها أو تحميلها"@ar , "Una colección de datos, publicados o conservados por una única fuente, y disponibles para ser accedidos o descargados en uno o más formatos."@es , "Raccolta di dati, pubblicati o curati da un'unica fonte, disponibili per l'accesso o il download in uno o più formati."@it , "Kolekce dat poskytovaná či řízená jedním zdrojem, která je k dispozici pro přístup či stažení v jednom či více formátech."@cs , "En samling a data, udgivet eller udvalgt og arrangeret af en enkelt kilde og som der er adgang til i en eller flere repræsentationer."@da , "1つのエージェントによって公開またはキュレートされ、1つ以上の形式でアクセスまたはダウンロードできるデータの集合。"@ja , "Μία συλλογή από δεδομένα, δημοσιευμένη ή επιμελημένη από μία και μόνο πηγή, διαθέσιμη δε προς πρόσβαση ή μεταφόρτωση σε μία ή περισσότερες μορφές."@el , "A collection of data, published or curated by a single source, and available for access or download in one or more represenations."@en ; + skos:editorialNote "2020-03-16 A new scopenote added and need to be translated"@en ; + skos:scopeNote "Questa classe rappresenta il dataset come pubblicato dall’editore. Nel caso in cui sia necessario operare una distinzione fra i metadati originali del dataset e il record dei metadati ad esso associato nel catalogo (ad esempio, per distinguere la data di modifica del dataset da quella del dataset nel catalogo) si può impiegare la classe catalog record."@it , "Cette classe représente le jeu de données publié par le fournisseur de données. Dans les cas où une distinction est nécessaire entre le jeu de donénes et son entrée dans le catalogue, la classe registre de données peut être utilisée pour ce dernier."@fr , "Esta clase representa el conjunto de datos publicados. En los casos donde es necesario distinguir entre el conjunto de datos y su entrada en el catálogo de datos, se debe utilizar la clase 'registro del catálogo'."@es , "Η κλάση αυτή αναπαριστά το σύνολο δεδομένων αυτό καθ'εαυτό, όπως έχει δημοσιευθεί από τον εκδότη. Σε περιπτώσεις όπου είναι απαραίτητος ο διαχωρισμός μεταξύ του συνόλου δεδομένων και της καταγραφής αυτού στον κατάλογο (γιατί μεταδεδομένα όπως η ημερομηνία αλλαγής και ο συντηρητής μπορεί να διαφέρουν) η κλάση της καταγραφής καταλόγου μπορεί να χρησιμοποιηθεί για το τελευταίο."@el , "This class represents the actual dataset as published by the dataset provider. In cases where a distinction between the actual dataset and its entry in the catalog is necessary (because metadata such as modification date and maintainer might differ), the catalog record class can be used for the latter."@en , "Tato třída reprezentuje datovou sadu tak, jak je publikována poskytovatelem dat. V případě potřeby rozlišení datové sady a jejího katalogizačního záznamu (jelikož metadata jako datum modifikace se mohou lišit) pro něj může být použita třída \"katalogizační záznam\"."@cs , "Questa classe descrive il dataset dal punto di vista concettuale. Possono essere disponibili una o più rappresentazioni, con diversi layout e formati schematici o serializzazioni."@it , "This class describes the conceptual dataset. One or more representations might be available, with differing schematic layouts and formats or serializations."@en , "このクラスは、データセットの公開者が公開する実際のデータセットを表わします。カタログ内の実際のデータセットとそのエントリーとの区別が必要な場合(修正日と維持者などのメタデータが異なるかもしれないので)は、後者にcatalog recordというクラスを使用できます。"@ja , "The notion of dataset in DCAT is broad and inclusive, with the intention of accommodating resource types arising from all communities. Data comes in many forms including numbers, text, pixels, imagery, sound and other multi-media, and potentially other types, any of which might be collected into a dataset."@en , "Denne klasse beskriver det konceptuelle datasæt. En eller flere repræsentationer kan være tilgængelige med forskellige skematiske opsætninger, formater eller serialiseringer."@da , "Denne klasse repræsenterer det konkrete datasæt som det udgives af datasætleverandøren. I de tilfælde hvor det er nødvendigt at skelne mellem det konkrete datasæt og dets registrering i kataloget (fordi metadata såsom ændringsdato og vedligeholder er forskellige), så kan klassen katalogpost anvendes. "@da . + +dcterms:description rdf:type rdf:Property ; + rdfs:comment "An account of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Description"@en ; + rdfs:subPropertyOf dc:description ; + dcterms:description "Description may include but is not limited to: an abstract, a table of contents, a graphical representation, or a free-text account of the resource."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:Contact rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Contact"@en ; + rdfs:subClassOf vcard:RelatedType . + +dcterms:issued rdf:type rdf:Property ; + rdfs:comment "Date of formal issuance of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Issued"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +[ rdf:type owl:Axiom ; + owl:annotatedProperty rdfs:domain ; + owl:annotatedSource prov:wasInfluencedBy ; + owl:annotatedTarget [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + prov:definition "influencee: an identifier (o2) for an entity, activity, or agent; " ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence" +] . + +skos:mappingRelation rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "These concept mapping relations mirror semantic relations, and the data model defined below is similar (with the exception of skos:exactMatch) to the data model defined for semantic relations. A distinct vocabulary is provided for concept mapping relations, to provide a convenient way to differentiate links within a concept scheme from links between concept schemes. However, this pattern of usage is not a formal requirement of the SKOS data model, and relies on informal definitions of best practice."@en ; + rdfs:isDefinedBy ; + rdfs:label "is in mapping relation with"@en ; + rdfs:subPropertyOf skos:semanticRelation ; + skos:definition "Relates two concepts coming, by convention, from different schemes, and that have comparable meanings"@en . + +vcard:title rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the position or job of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "title"@en ; + rdfs:range xsd:string . + +vcard:organization-unit + rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the organizational unit name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "organizational unit name"@en ; + rdfs:range xsd:string ; + rdfs:subPropertyOf vcard:organization-name . + +vcard:hasEmail rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the electronic mail address for communication with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has email"@en ; + rdfs:range vcard:Email . + +spdx:annotation rdf:type owl:ObjectProperty ; + rdfs:comment "Provide additional information about an SpdxElement."@en ; + rdfs:domain spdx:SpdxElement ; + rdfs:range spdx:Annotation ; + vs:term_status "stable" . + +spdx:relationshipType_dataFileOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a data file used in SPDXRef-B."@en ; + vs:term_status "stable"@en . + +dcterms:RFC3066 rdf:type rdfs:Datatype ; + rdfs:comment "The set of tags constructed according to RFC 3066 for the identification of languages."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "RFC 3066"@en ; + rdfs:seeAlso ; + dcterms:description "RFC 3066 has been obsoleted by RFC 4646."@en ; + dcterms:issued "2002-07-13"^^xsd:date . + +[ rdf:type owl:Axiom ; + rdfs:comment "hadPrimarySource property is a particular case of wasDerivedFrom (see http://www.w3.org/TR/prov-dm/#term-original-source) that aims to give credit to the source that originated some information." ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:hadPrimarySource ; + owl:annotatedTarget prov:wasDerivedFrom +] . + +spdx:reviewer rdf:type owl:DatatypeProperty ; + rdfs:comment "The name and, optionally, contact information of the person who performed the review. Values of this property must conform to the agent and tool syntax. The reviewer property is deprecated in favor of Annotation with an annotationType review."@en ; + rdfs:domain spdx:Review ; + rdfs:range xsd:string ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +dcterms:spatial rdf:type rdf:Property ; + rdfs:comment "Spatial characteristics of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Spatial Coverage"@en ; + rdfs:subPropertyOf dc:coverage , dcterms:coverage ; + dcam:rangeIncludes dcterms:Location ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:Address rdf:type owl:Class ; + rdfs:comment "To specify the components of the delivery address for the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "Address"@en ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:country-name ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:country-name + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:locality ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:locality + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:postal-code ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:postal-code + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:region ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:region + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:street-address ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:street-address + ] + ) + ] + ) + ] . + +time:year rdf:type owl:DatatypeProperty ; + rdfs:comment "Year position in a calendar-clock system.\n\nThe range of this property is not specified, so can be replaced by any specific representation of a calendar year from any calendar. "@en , "Posición de año en un sistema calendario-reloj.\n\nl rango de esta propiedad no está especificado, por tanto, se puede reemplazar por cualquier representación específica de un año de calendario de un calendario cualquiera."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "year"@en . + +dcterms:MethodOfInstruction + rdf:type rdfs:Class ; + rdfs:comment "A process that is used to engender knowledge, attitudes, and skills."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Method of Instruction"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcterms:PhysicalResource + rdf:type rdfs:Class ; + rdfs:comment "A material thing."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Physical Resource"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:geo rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "geo"@en ; + owl:equivalentProperty vcard:hasGeo . + +time:DurationDescription + rdf:type owl:Class ; + rdfs:comment "Description of temporal extent structured with separate values for the various elements of a calendar-clock system. The temporal reference system is fixed to Gregorian Calendar, and the range of each of the numeric properties is restricted to xsd:decimal"@en , "Descripción de extensión temporal estructurada con valores separados para los distintos elementos de un sistema de horario-calendario. El sistema de referencia temporal se fija al calendario gregoriano, y el intervalo de cada una de las propiedades numéricas se restringe a xsd:decimal."@es ; + rdfs:label "descripción de duración"@es , "Duration description"@en ; + rdfs:subClassOf time:GeneralDurationDescription ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:minutes + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:days + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:seconds + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:hasValue ; + owl:onProperty time:hasTRS + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:weeks + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:hours + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:years + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:decimal ; + owl:onProperty time:months + ] ; + skos:definition "Description of temporal extent structured with separate values for the various elements of a calendar-clock system. The temporal reference system is fixed to Gregorian Calendar, and the range of each of the numeric properties is restricted to xsd:decimal"@en , "Descripción de extensión temporal estructurada con valores separados para los distintos elementos de un sistema de horario-calendario. El sistema de referencia temporal se fija al calendario gregoriano, y el intervalo de cada una de las propiedades numéricas se restringe a xsd:decimal."@es ; + skos:note "In the Gregorian calendar the length of the month is not fixed. Therefore, a value like \"2.5 months\" cannot be exactly compared with a similar duration expressed in terms of weeks or days."@en , "En el calendario gregoriano la longitud de los meses no es fija. Por lo tanto, un valor como \"2,5 meses\" no se puede comparar exactamente con una duración similar expresada en términos de semanas o días."@es . + +vcard:Unknown rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Unknown"@en ; + rdfs:subClassOf vcard:Gender . + +[ rdf:type owl:Axiom ; + owl:annotatedProperty rdfs:range ; + owl:annotatedSource prov:wasInfluencedBy ; + owl:annotatedTarget [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + prov:definition "influencer: an identifier (o1) for an ancestor entity, activity, or agent that the former depends on;" ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence" +] . + +dcterms:MediaTypeOrExtent + rdf:type rdfs:Class ; + rdfs:comment "A media type or extent."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Media Type or Extent"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +skos:broaderTransitive + rdf:type owl:ObjectProperty , owl:TransitiveProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "has broader transitive"@en ; + rdfs:subPropertyOf skos:semanticRelation ; + owl:inverseOf skos:narrowerTransitive ; + skos:definition "skos:broaderTransitive is a transitive superproperty of skos:broader." ; + skos:scopeNote "By convention, skos:broaderTransitive is not used to make assertions. Rather, the properties can be used to draw inferences about the transitive closure of the hierarchical relation, which is useful e.g. when implementing a simple query expansion algorithm in a search application."@en . + + + rdfs:label "Class and property diagram of the LOCN vocabulary" . + +dcterms:DCMIType rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of classes specified by the DCMI Type Vocabulary, used to categorize the nature or genre of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "DCMI Type Vocabulary"@en ; + rdfs:seeAlso dctype: ; + dcterms:issued "2000-07-11"^^xsd:date . + +time:unitWeek rdf:type time:TemporalUnit ; + rdfs:label "Week (unit of temporal duration)"@en ; + skos:prefLabel "一週間"@jp , "week"@nl , "week"@en , "settimana"@it , "semana"@es , "semana"@pt , "одна неделя"@ru , "tydzień"@pl , "일주일"@kr , "一周"@zh , "semaine"@fr , "Woche"@de , "سبوع واحد"@ar ; + time:days "0"^^xsd:decimal ; + time:hours "0"^^xsd:decimal ; + time:minutes "0"^^xsd:decimal ; + time:months "0"^^xsd:decimal ; + time:seconds "0"^^xsd:decimal ; + time:weeks "1"^^xsd:decimal ; + time:years "0"^^xsd:decimal . + +prov:qualifiedInvalidation + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Entity prov:wasInvalidatedBy Activity :a, then it can qualify how it was invalidated using prov:qualifiedInvalidation [ a prov:Invalidation; prov:activity :a; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedInvalidation" ; + rdfs:range prov:Invalidation ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:inverse "qualifiedInvalidationOf" ; + prov:sharesDefinitionWith prov:Invalidation ; + prov:unqualifiedForm prov:wasInvalidatedBy . + +prov:qualifiedForm rdf:type owl:AnnotationProperty ; + rdfs:comment "This annotation property links a subproperty of prov:wasInfluencedBy with the subclass of prov:Influence and the qualifying property that are used to qualify it. \n\nExample annotation:\n\n prov:wasGeneratedBy prov:qualifiedForm prov:qualifiedGeneration, prov:Generation .\n\nThen this unqualified assertion:\n\n :entity1 prov:wasGeneratedBy :activity1 .\n\ncan be qualified by adding:\n\n :entity1 prov:qualifiedGeneration :entity1Gen .\n :entity1Gen \n a prov:Generation, prov:Influence;\n prov:activity :activity1;\n :customValue 1337 .\n\nNote how the value of the unqualified influence (prov:wasGeneratedBy :activity1) is mirrored as the value of the prov:activity (or prov:entity, or prov:agent) property on the influence class."@en ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + +[ rdf:type owl:Axiom ; + rdfs:comment "Attribution is a particular case of trace (see http://www.w3.org/TR/prov-dm/#concept-trace), in the sense that it links an entity to the agent that ascribed it." ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasAttributedTo ; + owl:annotatedTarget prov:wasInfluencedBy ; + prov:definition "IF wasAttributedTo(e2,ag1,aAttr) holds, THEN wasInfluencedBy(e2,ag1) also holds. " +] . + +vcard:Neighbor rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Neighbor"@en ; + rdfs:subClassOf vcard:RelatedType . + +vcard:language rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the language that may be used for contacting the object. May also be used as a property parameter."@en ; + rdfs:isDefinedBy ; + rdfs:label "language"@en . + +prov:Delegation rdf:type owl:Class ; + rdfs:comment "An instance of prov:Delegation provides additional descriptions about the binary prov:actedOnBehalfOf relation from a performing prov:Agent to some prov:Agent for whom it was performed. For example, :mixing prov:wasAssociatedWith :toddler . :toddler prov:actedOnBehalfOf :mother; prov:qualifiedDelegation [ a prov:Delegation; prov:entity :mother; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Delegation" ; + rdfs:subClassOf prov:AgentInfluence ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:definition "Delegation is the assignment of authority and responsibility to an agent (by itself or by another agent) to carry out a specific activity as a delegate or representative, while the agent it acts on behalf of retains some responsibility for the outcome of the delegated work.\n\nFor example, a student acted on behalf of his supervisor, who acted on behalf of the department chair, who acted on behalf of the university; all those agents are responsible in some way for the activity that took place but we do not say explicitly who bears responsibility and to what degree."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-delegation"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-delegation"^^xsd:anyURI ; + prov:unqualifiedForm prov:actedOnBehalfOf . + +dcterms:ISO3166 rdf:type rdfs:Datatype ; + rdfs:comment "The set of codes listed in ISO 3166-1 for the representation of names of countries."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "ISO 3166"@en ; + rdfs:seeAlso , ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:annotationDate rdf:type owl:DatatypeProperty ; + rdfs:comment "Identify when the comment was made. This is to be specified according to the combined date and time in the UTC format, as specified in the ISO 8601 standard."@en ; + rdfs:domain spdx:Annotation ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf spdx:date ; + vs:term_status "stable" . + +adms:AssetRepository rdf:type owl:Class ; + rdfs:comment "A system or service that provides facilities for storage and maintenance of descriptions of Assets and Asset Distributions, and functionality that allows users to search and access these descriptions. An Asset Repository will typically contain descriptions of several Assets and related Asset Distributions."@en ; + rdfs:isDefinedBy ; + rdfs:label "Asset repository"@en . + +skos:broader rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "Broader concepts are typically rendered as parents in a concept hierarchy (tree)."@en ; + rdfs:isDefinedBy ; + rdfs:label "has broader"@en ; + rdfs:subPropertyOf skos:broaderTransitive ; + owl:inverseOf skos:narrower ; + skos:definition "Relates a concept to a concept that is more general in meaning."@en ; + skos:scopeNote "By convention, skos:broader is only used to assert an immediate (i.e. direct) hierarchical link between two conceptual resources."@en . + +spdx:relationshipType_providedDependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a to be provided dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:exceptionTextHtml + rdf:type owl:DatatypeProperty ; + rdfs:comment "HTML representation of the License Exception Text"@en ; + rdfs:domain spdx:ListedLicenseException ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + + + rdf:type sh:NodeShape ; + sh:name "Location"@en ; + sh:property [ sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:geometry ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:centroid ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:bbox ; + sh:severity sh:Violation + ] ; + sh:targetClass dcterms:Location . + +dcat:accessURL rdf:type rdf:Property , owl:ObjectProperty ; + rdfs:comment "A URL of a resource that gives access to a distribution of the dataset. E.g. landing page, feed, SPARQL endpoint. Use for all cases except a simple download link, in which case downloadURL is preferred."@en , "Puede ser cualquier tipo de URL que de acceso a una distribución del conjunto de datos, e.g., página de destino, descarga, URL feed, punto de acceso SPARQL. Esta propriedad se debe usar cuando su catálogo de datos no tiene información sobre donde está o cuando no se puede descargar."@es , "En URL for en ressource som giver adgang til en repræsentation af datsættet. Fx destinationsside, feed, SPARQL-endpoint. Anvendes i alle sammenhænge undtagen til angivelse af et simpelt download link hvor anvendelse af egenskaben downloadURL foretrækkes."@da , "URL zdroje, přes které je přístupná distribuce datové sady. Příkladem může být vstupní stránka, RSS kanál či SPARQL endpoint. Použijte ve všech případech kromě URL souboru ke stažení, pro které je lepší použít dcat:downloadURL."@cs , "Μπορεί να είναι οποιουδήποτε είδους URL που δίνει πρόσβαση στη διανομή ενός συνόλου δεδομένων. Π.χ. ιστοσελίδα αρχικής πρόσβασης, μεταφόρτωση, feed URL, σημείο διάθεσης SPARQL. Να χρησιμοποιείται όταν ο κατάλογος δεν περιέχει πληροφορίες εαν πρόκειται ή όχι για μεταφορτώσιμο αρχείο."@el , "Un URL di una risorsa che consente di accedere a una distribuzione del set di dati. Per esempio, pagina di destinazione, feed, endpoint SPARQL. Da utilizzare per tutti i casi, tranne quando si tratta di un semplice link per il download nel qual caso è preferito downloadURL."@it , "データセットの配信にアクセス権を与えるランディング・ページ、フィード、SPARQLエンドポイント、その他の種類の資源。"@ja , "Ceci peut être tout type d'URL qui donne accès à une distribution du jeu de données. Par exemple, un lien à une page HTML contenant un lien au jeu de données, un Flux RSS, un point d'accès SPARQL. Utilisez le lorsque votre catalogue ne contient pas d'information sur quoi il est ou quand ce n'est pas téléchargeable."@fr , "أي رابط يتيح الوصول إلى البيانات. إذا كان الرابط هو ربط مباشر لملف يمكن تحميله استخدم الخاصية downloadURL"@ar ; + rdfs:domain dcat:Distribution ; + rdfs:isDefinedBy ; + rdfs:label "přístupová adresa"@cs , "URL d'accès"@fr , "アクセスURL"@ja , "access address"@en , "URL πρόσβασης"@el , "رابط وصول"@ar , "URL de acceso"@es , "indirizzo di accesso"@it , "adgangsadresse"@da ; + rdfs:range rdfs:Resource ; + owl:propertyChainAxiom ( dcat:accessService dcat:endpointURL ) ; + skos:altLabel "adgangsURL"@da ; + skos:definition "En URL for en ressource som giver adgang til en repræsentation af datsættet. Fx destinationsside, feed, SPARQL-endpoint. Anvendes i alle sammenhænge undtagen til angivelse af et simpelt download link hvor anvendelse af egenskaben downloadURL foretrækkes."@da , "データセットの配信にアクセス権を与えるランディング・ページ、フィード、SPARQLエンドポイント、その他の種類の資源。"@ja , "A URL of a resource that gives access to a distribution of the dataset. E.g. landing page, feed, SPARQL endpoint. Use for all cases except a simple download link, in which case downloadURL is preferred."@en , "Ceci peut être tout type d'URL qui donne accès à une distribution du jeu de données. Par exemple, un lien à une page HTML contenant un lien au jeu de données, un Flux RSS, un point d'accès SPARQL. Utilisez le lorsque votre catalogue ne contient pas d'information sur quoi il est ou quand ce n'est pas téléchargeable."@fr , "Un URL di una risorsa che consente di accedere a una distribuzione del set di dati. Per esempio, pagina di destinazione, feed, endpoint SPARQL. Da utilizzare per tutti i casi, tranne quando si tratta di un semplice link per il download nel qual caso è preferito downloadURL."@it , "Μπορεί να είναι οποιουδήποτε είδους URL που δίνει πρόσβαση στη διανομή ενός συνόλου δεδομένων. Π.χ. ιστοσελίδα αρχικής πρόσβασης, μεταφόρτωση, feed URL, σημείο διάθεσης SPARQL. Να χρησιμοποιείται όταν ο κατάλογος δεν περιέχει πληροφορίες εαν πρόκειται ή όχι για μεταφορτώσιμο αρχείο."@el , "Puede ser cualquier tipo de URL que de acceso a una distribución del conjunto de datos, e.g., página de destino, descarga, URL feed, punto de acceso SPARQL. Esta propriedad se debe usar cuando su catálogo de datos no tiene información sobre donde está o cuando no se puede descargar."@es , "URL zdroje, přes které je přístupná distribuce datové sady. Příkladem může být vstupní stránka, RSS kanál či SPARQL endpoint. Použijte ve všech případech kromě URL souboru ke stažení, pro které je lepší použít dcat:downloadURL."@cs , "أي رابط يتيح الوصول إلى البيانات. إذا كان الرابط هو ربط مباشر لملف يمكن تحميله استخدم الخاصية downloadURL"@ar ; + skos:editorialNote "rdfs:label, rdfs:comment and skos:scopeNote have been modified. Non-english versions except for Italian must be updated."@en , "Status: English Definition text modified by DCAT revision team, updated Italian and Czech translation provided, translations for other languages pending."@en ; + skos:scopeNote "Se le distribuzioni sono accessibili solo attraverso una pagina web (ad esempio, gli URL per il download diretto non sono noti), allora il link della pagina web deve essere duplicato come accessURL sulla distribuzione."@it , "Hvis en eller flere distributioner kun er tilgængelige via en destinationsside (dvs. en URL til direkte download er ikke kendt), så bør destinationssidelinket gentages som adgangsadresse for distributionen."@da , "Pokud jsou distribuce přístupné pouze přes vstupní stránku (tj. URL pro přímé stažení nejsou známa), pak by URL přístupové stránky mělo být duplikováno ve vlastnosti distribuce accessURL."@cs , "El rango es una URL. Si la distribución es accesible solamente través de una página de destino (es decir, si no se conoce una URL de descarga directa), entonces el enlance a la página de destino debe ser duplicado como accessURL en la distribución."@es , "Η τιμή είναι ένα URL. Αν η/οι διανομή/ές είναι προσβάσιμη/ες μόνο μέσω μίας ιστοσελίδας αρχικής πρόσβασης (δηλαδή αν δεν υπάρχουν γνωστές διευθύνσεις άμεσης μεταφόρτωσης), τότε ο σύνδεσμος της ιστοσελίδας αρχικής πρόσβασης πρέπει να αναπαραχθεί ως accessURL σε μία διανομή."@el , "La valeur est une URL. Si la distribution est accessible seulement au travers d'une page d'atterrissage (c-à-dire on n'ignore une URL de téléchargement direct), alors le lien à la page d'atterrissage doit être dupliqué comee accessURL sur la distribution."@fr , "確実にダウンロードでない場合や、ダウンロードかどうかが不明である場合は、downloadURLではなく、accessURLを用いてください。ランディング・ページを通じてしか配信にアクセスできない場合(つまり、直接的なダウンロードURLが不明)は、配信におけるaccessURLとしてランディング・ページのリンクをコピーすべきです(SHOULD)。"@ja , "If the distribution(s) are accessible only through a landing page (i.e. direct download URLs are not known), then the landing page link should be duplicated as accessURL on a distribution."@en . + +spdx:snippetFromFile rdf:type owl:ObjectProperty ; + rdfs:comment "File containing the SPDX element (e.g. the file contaning a snippet)."@en ; + rdfs:domain spdx:Snippet ; + rdfs:range spdx:File ; + vs:term_status "stable"@en . + +prov:Communication rdf:type owl:Class ; + rdfs:comment "An instance of prov:Communication provides additional descriptions about the binary prov:wasInformedBy relation from an informed prov:Activity to the prov:Activity that informed it. For example, :you_jumping_off_bridge prov:wasInformedBy :everyone_else_jumping_off_bridge; prov:qualifiedCommunication [ a prov:Communication; prov:activity :everyone_else_jumping_off_bridge; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Communication" ; + rdfs:subClassOf prov:ActivityInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Communication is the exchange of an entity by two activities, one activity using the entity generated by the other." ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Communication"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-wasInformedBy"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasInformedBy . + +vcard:email rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "email"@en ; + owl:equivalentProperty vcard:hasEmail . + +prov:qualifiedGeneration + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Activity prov:generated Entity :e, then it can qualify how it performed the Generation using prov:qualifiedGeneration [ a prov:Generation; prov:entity :e; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedGeneration" ; + rdfs:range prov:Generation ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:inverse "qualifiedGenerationOf" ; + prov:sharesDefinitionWith prov:Generation ; + prov:unqualifiedForm prov:wasGeneratedBy . + +dcterms:BibliographicResource + rdf:type rdfs:Class ; + rdfs:comment "A book, article, or other documentary resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Bibliographic Resource"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:fileType_audio rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "The file is associated with an audio file (MIME type of audio/* , ie. .mp3 ); \nIMAGE if the file is assoicated with an picture image file (MIME type of image/*, ie. .jpg, .gif )"@en ; + vs:term_status "stable"@en . + +prov:wasInformedBy rdf:type owl:ObjectProperty ; + rdfs:comment "An activity a2 is dependent on or informed by another activity a1, by way of some unspecified entity that is generated by a1 and used by a2."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "wasInformedBy" ; + rdfs:range prov:Activity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedCommunication prov:activity ) ; + owl:propertyChainAxiom ( prov:qualifiedCommunication prov:activity ) ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:inverse "informed" ; + prov:qualifiedForm prov:qualifiedCommunication , prov:Communication . + +dcat:CatalogRecord rdf:type owl:Class , rdfs:Class ; + rdfs:comment "A record in a data catalog, describing the registration of a single dataset or data service."@en , "1つのデータセットを記述したデータ・カタログ内のレコード。"@ja , "En post i et datakatalog der beskriver registreringen af et enkelt datasæt eller en datatjeneste."@da , "Záznam v datovém katalogu popisující jednu datovou sadu či datovou službu."@cs , "Un registre du catalogue ou une entrée du catalogue, décrivant un seul jeu de données."@fr , "Un registro en un catálogo de datos que describe un solo conjunto de datos o un servicio de datos."@es , "Un record in un catalogo di dati che descrive un singolo dataset o servizio di dati."@it , "Μία καταγραφή ενός καταλόγου, η οποία περιγράφει ένα συγκεκριμένο σύνολο δεδομένων."@el ; + rdfs:isDefinedBy ; + rdfs:label "カタログ・レコード"@ja , "Καταγραφή καταλόγου"@el , "سجل"@ar , "Registro del catálogo"@es , "Record di catalogo"@it , "Catalog Record"@en , "Katalogizační záznam"@cs , "Katalogpost"@da , "Registre du catalogue"@fr ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom dcat:Resource ; + owl:onProperty foaf:primaryTopic + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty foaf:primaryTopic + ] ; + skos:definition "Un record in un catalogo di dati che descrive un singolo dataset o servizio di dati."@it , "Záznam v datovém katalogu popisující jednu datovou sadu či datovou službu."@cs , "Un registro en un catálogo de datos que describe un solo conjunto de datos o un servicio de datos."@es , "En post i et datakatalog der beskriver registreringen af et enkelt datasæt eller en datatjeneste."@da , "1つのデータセットを記述したデータ・カタログ内のレコード。"@ja , "A record in a data catalog, describing the registration of a single dataset or data service."@en , "Μία καταγραφή ενός καταλόγου, η οποία περιγράφει ένα συγκεκριμένο σύνολο δεδομένων."@el , "Un registre du catalogue ou une entrée du catalogue, décrivant un seul jeu de données."@fr ; + skos:editorialNote "English definition updated in this revision. Multilingual text not yet updated except the Spanish one and the Czech one and Italian one."@en ; + skos:scopeNote "このクラスはオプションで、すべてのカタログがそれを用いるとは限りません。これは、データセットに関するメタデータとカタログ内のデータセットのエントリーに関するメタデータとで区別が行われるカタログのために存在しています。例えば、データセットの公開日プロパティーは、公開機関が情報を最初に利用可能とした日付を示しますが、カタログ・レコードの公開日は、データセットがカタログに追加された日付です。両方の日付が異っていたり、後者だけが分かっている場合は、カタログ・レコードに対してのみ公開日を指定すべきです。W3CのPROVオントロジー[prov-o]を用いれば、データセットに対する特定の変更に関連するプロセスやエージェントの詳細などの、さらに詳しい来歴情報の記述が可能となることに注意してください。"@ja , "Questa classe è opzionale e non tutti i cataloghi la utilizzeranno. Esiste per cataloghi in cui si opera una distinzione tra i metadati relativi al dataset ed i metadati relativi alla gestione del dataset nel catalogo. Ad esempio, la proprietà per indicare la data di pubblicazione del dataset rifletterà la data in cui l'informazione è stata originariamente messa a disposizione dalla casa editrice, mentre la data di pubblicazione per il record nel catalogo rifletterà la data in cui il dataset è stato aggiunto al catalogo. Nei casi dove solo quest'ultima sia nota, si utilizzerà esclusivamente la data di pubblicazione relativa al record del catalogo. Si noti che l'Ontologia W3C PROV permette di descrivere ulteriori informazioni sulla provenienza, quali i dettagli del processo, la procedura e l'agente coinvolto in una particolare modifica di un dataset."@it , "Tato třída je volitelná a ne všechny katalogy ji využijí. Existuje pro katalogy, ve kterých se rozlišují metadata datové sady či datové služby a metadata o záznamu o datové sadě či datové službě v katalogu. Například datum publikace datové sady odráží datum, kdy byla datová sada původně zveřejněna poskytovatelem dat, zatímco datum publikace katalogizačního záznamu je datum zanesení datové sady do katalogu. V případech kdy se obě data liší, nebo je známo jen to druhé, by mělo být specifikováno jen datum publikace katalogizačního záznamu. Všimněte si, že ontologie W3C PROV umožňuje popsat další informace o původu jako například podrobnosti o procesu konkrétní změny datové sady a jeho účastnících."@cs , "Esta clase es opcional y no todos los catálogos la utilizarán. Esta clase existe para catálogos que hacen una distinción entre los metadatos acerca de un conjunto de datos o un servicio de datos y los metadatos acerca de una entrada en ese conjunto de datos en el catálogo. Por ejemplo, la propiedad sobre la fecha de la publicación de los datos refleja la fecha en que la información fue originalmente publicada, mientras que la fecha de publicación del registro del catálogo es la fecha en que los datos se agregaron al mismo. En caso en que ambas fechas fueran diferentes, o en que sólo la fecha de publicación del registro del catálogo estuviera disponible, sólo debe especificarse en el registro del catálogo. Tengan en cuenta que la ontología PROV de W3C permite describir otra información sobre la proveniencia de los datos, como por ejemplo detalles del proceso y de los agentes involucrados en algún cambio específico a los datos."@es , "This class is optional and not all catalogs will use it. It exists for catalogs where a distinction is made between metadata about a dataset or data service and metadata about the entry for the dataset or data service in the catalog. For example, the publication date property of the dataset reflects the date when the information was originally made available by the publishing agency, while the publication date of the catalog record is the date when the dataset was added to the catalog. In cases where both dates differ, or where only the latter is known, the publication date should only be specified for the catalog record. Notice that the W3C PROV Ontology allows describing further provenance information such as the details of the process and the agent involved in a particular change to a dataset."@en , "Αυτή η κλάση είναι προαιρετική και δεν χρησιμοποιείται από όλους τους καταλόγους. Υπάρχει για τις περιπτώσεις καταλόγων όπου γίνεται διαχωρισμός μεταξύ των μεταδεδομένων για το σύνολο των δεδομένων και των μεταδεδομένων για την καταγραφή του συνόλου δεδομένων εντός του καταλόγου. Για παράδειγμα, η ιδιότητα της ημερομηνίας δημοσίευσης του συνόλου δεδομένων δείχνει την ημερομηνία κατά την οποία οι πληροφορίες έγιναν διαθέσιμες από τον φορέα δημοσίευσης, ενώ η ημερομηνία δημοσίευσης της καταγραφής του καταλόγου δείχνει την ημερομηνία που το σύνολο δεδομένων προστέθηκε στον κατάλογο. Σε περιπτώσεις που οι δύο ημερομηνίες διαφέρουν, ή που μόνο η τελευταία είναι γνωστή, η ημερομηνία δημοσίευσης θα πρέπει να δίνεται για την καταγραφή του καταλόγου. Να σημειωθεί πως η οντολογία W3C PROV επιτρέπει την περιγραφή επιπλέον πληροφοριών ιστορικού όπως λεπτομέρειες για τη διαδικασία και τον δράστη που εμπλέκονται σε μία συγκεκριμένη αλλαγή εντός του συνόλου δεδομένων."@el , "C'est une classe facultative et tous les catalogues ne l'utiliseront pas. Cette classe existe pour les catalogues\tayant une distinction entre les métadonnées sur le jeu de données et les métadonnées sur une entrée du jeu de données dans le catalogue."@fr , "Denne klasse er valgfri og ikke alle kataloger vil anvende denne klasse. Den kan anvendes i de kataloger hvor der skelnes mellem metadata om datasættet eller datatjenesten og metadata om selve posten til registreringen af datasættet eller datatjenesten i kataloget. Udgivelsesdatoen for datasættet afspejler for eksempel den dato hvor informationerne oprindeligt blev gjort tilgængelige af udgiveren, hvorimod udgivelsesdatoen for katalogposten er den dato hvor datasættet blev føjet til kataloget. I de tilfælde hvor de to datoer er forskellige eller hvor blot sidstnævnte er kendt, bør udgivelsesdatoen kun angives for katalogposten. Bemærk at W3Cs PROV ontologi gør til muligt at tilføje yderligere proveniensoplysninger eksempelvis om processen eller aktøren involveret i en given ændring af datasættet."@da . + +spdx:isValid rdf:type owl:DatatypeProperty ; + rdfs:comment "True if the URL is a valid well formed URL"@en ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:boolean . + + + rdf:type owl:ObjectProperty ; + rdfs:domain ; + rdfs:range ; + vs:term_status "stable"@en . + +skos:Collection rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Collection"@en ; + owl:disjointWith skos:Concept , skos:ConceptScheme ; + skos:definition "A meaningful collection of concepts."@en ; + skos:scopeNote "Labelled collections can be used where you would like a set of concepts to be displayed under a 'node label' in the hierarchy."@en . + +doap:Project rdf:type owl:Class . + +dcterms:modified rdf:type rdf:Property ; + rdfs:comment "Date on which the resource was changed."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Modified"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +adms:supportedSchema rdf:type owl:ObjectProperty ; + rdfs:comment "A schema according to which the Asset Repository can provide data about its content, e.g. ADMS."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "supported schema"@en ; + rdfs:range adms:Asset . + +adms:versionNotes rdf:type owl:DatatypeProperty ; + rdfs:comment "A description of changes between this version and the previous version of the Asset."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "version notes"@en ; + rdfs:range rdfs:Literal . + +spdx:purpose_install rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package is used to install software on disk."@en ; + vs:term_status "stable"@en . + +prov:hadActivity rdf:type owl:ObjectProperty ; + rdfs:comment "The _optional_ Activity of an Influence, which used, generated, invalidated, or was the responsibility of some Entity. This property is _not_ used by ActivityInfluence (use prov:activity instead)."@en , "This property has multiple RDFS domains to suit multiple OWL Profiles. See PROV-O OWL Profile." ; + rdfs:domain prov:Influence ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Delegation prov:Derivation prov:End prov:Start ) + ] ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Delegation prov:Derivation prov:End prov:Start ) + ] ; + rdfs:isDefinedBy ; + rdfs:label "hadActivity" ; + rdfs:range prov:Activity ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:editorialNote "The multiple rdfs:domain assertions are intended. One is simpler and works for OWL-RL, the union is more specific but is not recognized by OWL-RL."@en ; + prov:inverse "wasActivityOfInfluence" ; + prov:sharesDefinitionWith prov:Activity . + +vcard:hasFamilyName rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the family name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has family name"@en . + +time:dayOfWeek rdf:type owl:ObjectProperty ; + rdfs:comment "The day of week, whose value is a member of the class time:DayOfWeek"@en , "El día de la semana, cuyo valor es un miembro de la clase 'día de la semana'." ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "day of week"@en , "día de la semana"@es ; + rdfs:range time:DayOfWeek ; + skos:definition "The day of week, whose value is a member of the class time:DayOfWeek"@en , "El día de la semana, cuyo valor es un miembro de la clase 'día de la semana'."@es . + +spdx:relationshipType_devDependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a development dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +time:intervalMeets rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 se encuentra con otro intervalo propio T2, entonces el final de T1 coincide con el principio de T2."@es , "If a proper interval T1 is intervalMeets another proper interval T2, then the end of T1 is coincident with the beginning of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo se encuentra"@es , "interval meets"@en ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalMetBy ; + skos:definition "If a proper interval T1 is intervalMeets another proper interval T2, then the end of T1 is coincident with the beginning of T2."@en , "Si un intervalo propio T1 se encuentra con otro intervalo propio T2, entonces el final de T1 coincide con el principio de T2."@es . + +time:unitSecond rdf:type time:TemporalUnit ; + rdfs:label "Second (unit of temporal duration)"@en ; + skos:prefLabel "segundo"@pt , "segundo"@es , "seconde"@fr , "seconde"@nl , "Sekunde"@de , "second"@en , "ثانية واحدة"@ar , "一秒"@jp , "一秒"@zh , "일초"@kr , "Sekundę"@pl , "secondo"@it ; + time:days "0"^^xsd:decimal ; + time:hours "0"^^xsd:decimal ; + time:minutes "0"^^xsd:decimal ; + time:months "0"^^xsd:decimal ; + time:seconds "1"^^xsd:decimal ; + time:weeks "0"^^xsd:decimal ; + time:years "0"^^xsd:decimal . + +spdx:created rdf:type owl:DatatypeProperty ; + rdfs:comment "Identify when the SPDX document was originally created. The date is to be specified according to combined date and time in UTC format as specified in ISO 8601 standard."@en ; + rdfs:domain spdx:CreationInfo ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf spdx:date ; + vs:term_status "stable" . + +dcterms:ISO639-2 rdf:type rdfs:Datatype ; + rdfs:comment "The three-letter alphabetic codes listed in ISO639-2 for the representation of names of languages."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "ISO 639-2"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +skos:historyNote rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "history note"@en ; + rdfs:subPropertyOf skos:note ; + skos:definition "A note about the past state/use/meaning of a concept."@en . + + + rdf:type owl:Class ; + rdfs:subClassOf ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass ; + owl:onProperty ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass ; + owl:onProperty ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable" . + +vcard:Name rdf:type owl:Class ; + rdfs:comment "To specify the components of the name of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "Name"@en ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:additional-name ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:minCardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:additional-name + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:family-name ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:family-name + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:given-name ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:given-name + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:honorific-prefix ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:minCardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:honorific-prefix + ] + ) + ] + [ rdf:type owl:Class ; + owl:intersectionOf ( [ rdf:type owl:Restriction ; + owl:onProperty vcard:honorific-suffix ; + owl:someValuesFrom xsd:string + ] + [ rdf:type owl:Restriction ; + owl:minCardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty vcard:honorific-suffix + ] + ) + ] + ) + ] . + + + rdf:type owl:Ontology ; + rdfs:comment "Ontology for vCard based on RFC6350"@en ; + rdfs:label "Ontology for vCard"@en ; + owl:versionInfo "Final"@en . + +vcard:tz rdf:type owl:DatatypeProperty ; + rdfs:comment "To indicate time zone information that is specific to the object. May also be used as a property parameter."@en ; + rdfs:isDefinedBy ; + rdfs:label "time zone"@en ; + rdfs:range xsd:string . + +vcard:Pref rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Pref"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + +spdx:algorithm rdf:type owl:ObjectProperty ; + rdfs:comment "Identifies the algorithm used to produce the subject Checksum. Currently, SHA-1 is the only supported algorithm. It is anticipated that other algorithms will be supported at a later time."@en ; + rdfs:domain spdx:Checksum ; + vs:term_status "stable" . + + + rdf:type owl:Class ; + vs:term_status "stable" . + +spdx:ListedLicenseException + rdf:type owl:Class ; + rdfs:comment "License exception specific to ListedLicenses" ; + rdfs:subClassOf spdx:LicenseException ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:exceptionTextHtml + ] . + +vcard:family-name rdf:type owl:DatatypeProperty ; + rdfs:comment "The family name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "family name"@en ; + rdfs:range xsd:string . + +spdx:standardLicenseTemplate + rdf:type owl:DatatypeProperty ; + rdfs:comment "License template which describes sections of the license which can be varied. See License Template section of the specification for format information."@en ; + rdfs:domain spdx:License ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:spdxDocument rdf:type owl:ObjectProperty ; + rdfs:comment "A property containing an SPDX document."@en ; + rdfs:domain spdx:ExternalDocumentRef ; + rdfs:range spdx:SpdxDocument ; + vs:term_status "stable"@en . + +prov:Role rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Role" ; + rdfs:seeAlso prov:hadRole ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:definition "A role is the function of an entity or agent with respect to an activity, in the context of a usage, generation, invalidation, association, start, and end."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-attribute-role"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-attribute"^^xsd:anyURI . + +spdx:SpdxItem rdf:type owl:Class ; + rdfs:comment "An SpdxItem is a potentially copyrightable work."@en ; + rdfs:subClassOf spdx:SpdxElement ; + rdfs:subClassOf [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Restriction ; + owl:hasValue spdx:noassertion ; + owl:onProperty spdx:licenseConcluded + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:none ; + owl:onProperty spdx:licenseConcluded + ] + [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:licenseConcluded + ] + ) + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:licenseInfoFromFiles + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:attributionText + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:copyrightText + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseComments + ] ; + vs:term_status "stable"@en . + +prov:qualifiedAttribution + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Entity prov:wasAttributedTo Agent :ag, then it can qualify how it was influenced using prov:qualifiedAttribution [ a prov:Attribution; prov:agent :ag; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedAttribution" ; + rdfs:range prov:Attribution ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:inverse "qualifiedAttributionOf" ; + prov:sharesDefinitionWith prov:Attribution ; + prov:unqualifiedForm prov:wasAttributedTo . + +adms:includedAsset rdf:type owl:ObjectProperty ; + rdfs:comment "An Asset that is contained in the Asset being described, e.g. when there are several vocabularies defined in a single document."@en ; + rdfs:domain adms:Asset ; + rdfs:isDefinedBy ; + rdfs:label "included asset"@en ; + rdfs:range adms:Asset . + +prov:definition rdf:type owl:AnnotationProperty ; + rdfs:comment "A definition quoted from PROV-DM or PROV-CONSTRAINTS that describes the concept expressed with this OWL term."@en ; + rdfs:isDefinedBy . + +time:week rdf:type owl:DatatypeProperty ; + rdfs:comment "Week number within the year."@en , "Número de semana en el año."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "week"@en , "semana"@es ; + rdfs:range xsd:nonNegativeInteger ; + skos:note "Weeks are numbered differently depending on the calendar in use and the local language or cultural conventions (locale). ISO-8601 specifies that the first week of the year includes at least four days, and that Monday is the first day of the week. In that system, week 1 is the week that contains the first Thursday in the year."@en ; + skos:scopeNote "Las semanas están numeradas de forma diferente dependiendo del calendario en uso y de las convenciones lingüísticas y culturales locales (locale en inglés). El ISO-8601 especifica que la primera semana del año incluye al menos cuatro días, y que el lunes es el primer día de la semana. En ese sistema, la semana 1 es la semana que contiene el primer jueves del año."@es . + +spdx:builtDate rdf:type owl:DatatypeProperty ; + rdfs:comment "This field provides a place for recording the actual date the package was built."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf spdx:date ; + vs:term_status "stable"@en . + +prov:category rdf:type owl:AnnotationProperty ; + rdfs:comment "Classify prov-o terms into three categories, including 'starting-point', 'qualifed', and 'extended'. This classification is used by the prov-o html document to gently introduce prov-o terms to its users. "@en ; + rdfs:isDefinedBy . + +vcard:Acquaintance rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Acquaintance"@en ; + rdfs:subClassOf vcard:RelatedType . + +dcterms:FileFormat rdf:type rdfs:Class ; + rdfs:comment "A digital resource format."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "File Format"@en ; + rdfs:subClassOf dcterms:MediaType ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:relationshipType_runtimeDependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a dependency required for the execution of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +time:intervalBefore rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 está antes que otro intervalo propio T2, entonces el final de T1 está antes que el principio de T2."@es , "If a proper interval T1 is intervalBefore another proper interval T2, then the end of T1 is before the beginning of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval before"@en , "intervalo anterior"@es ; + rdfs:range time:ProperInterval ; + rdfs:subPropertyOf time:intervalDisjoint , time:before ; + owl:inverseOf time:intervalAfter ; + skos:definition "Si un intervalo propio T1 está antes que otro intervalo propio T2, entonces el final de T1 está antes que el principio de T2."@es , "If a proper interval T1 is intervalBefore another proper interval T2, then the end of T1 is before the beginning of T2."@en . + +time:intervalContains + rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 contiene otro intervalo propio T2, entonces el principio de T1 está antes que el principio de T2, y el final de T1 está después del final de T2."@es , "If a proper interval T1 is intervalContains another proper interval T2, then the beginning of T1 is before the beginning of T2, and the end of T1 is after the end of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo contiene"@es , "interval contains"@en ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalDuring ; + skos:definition "Si un intervalo propio T1 contiene otro intervalo propio T2, entonces el principio de T1 está antes que el principio de T2, y el final de T1 está después del final de T2."@es , "If a proper interval T1 is intervalContains another proper interval T2, then the beginning of T1 is before the beginning of T2, and the end of T1 is after the end of T2."@en . + +time:DateTimeDescription + rdf:type owl:Class ; + rdfs:comment "Descripción de fecha y tiempo estructurada con valores separados para los diferentes elementos de un sistema calendario-reloj. El sistema de referencia temporal está fijado al calendario gregoriano, y el rango de las propiedades año, mes, día restringidas a los correspondientes tipos del XML Schema xsd:gYear, xsd:gMonth y xsd:gDay respectivamente."@es , "Description of date and time structured with separate values for the various elements of a calendar-clock system. The temporal reference system is fixed to Gregorian Calendar, and the range of year, month, day properties restricted to corresponding XML Schema types xsd:gYear, xsd:gMonth and xsd:gDay, respectively."@en ; + rdfs:label "descripción de fecha-tiempo"@es , "Date-Time description"@en ; + rdfs:subClassOf time:GeneralDateTimeDescription ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:gMonth ; + owl:onProperty time:month + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:gYear ; + owl:onProperty time:year + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:hasValue ; + owl:onProperty time:hasTRS + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:allValuesFrom xsd:gDay ; + owl:onProperty time:day + ] ; + skos:definition "Descripción de fecha y tiempo estructurada con valores separados para los diferentes elementos de un sistema calendario-reloj. El sistema de referencia temporal está fijado al calendario gregoriano, y el rango de las propiedades año, mes, día restringidas a los correspondientes tipos del XML Schema xsd:gYear, xsd:gMonth y xsd:gDay respectivamente."@es , "Description of date and time structured with separate values for the various elements of a calendar-clock system. The temporal reference system is fixed to Gregorian Calendar, and the range of year, month, day properties restricted to corresponding XML Schema types xsd:gYear, xsd:gMonth and xsd:gDay, respectively."@en . + + + dcterms:title "Core Vocabularies Specification" . + +spdx:contextualExample + rdf:type owl:DatatypeProperty ; + rdfs:comment "Example for use of the external repository identifier"@en ; + rdfs:domain spdx:ReferenceType ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +locn:geographicName rdf:type rdf:Property ; + rdfs:comment "\nA geographic name is a proper noun applied to a spatial object. Taking the example used in the relevant INSPIRE data specification (page 18), the following are all valid geographic names for the Greek capital:\n- Αθήνα (the Greek endonym written in the Greek script)\n- Athína (the standard Romanisation of the endonym)\n- Athens (the English language exonym)\nFor INSPIRE-conformant data, provide the metadata for the geographic name using a skos:Concept as a datatype.\n"@en ; + rdfs:isDefinedBy ; + rdfs:label "geographic name"@en ; + dcterms:identifier "locn:geographicName" ; + vs:term_status "testing"@en ; + wdsr:describedby . + +time:TimeZone rdf:type owl:Class ; + rdfs:comment "Un huso horario especifica la cantidad en que la hora local está desplazada con respecto a UTC.\n Un huso horario normalmente se denota geográficamente (p.ej. el horario de verano del este de Australia), con un valor constante en una región dada.\n La región donde aplica y el desplazamiento desde UTC las especifica una autoridad gubernamental localmente reconocida."@es , "A Time Zone specifies the amount by which the local time is offset from UTC. \n\tA time zone is usually denoted geographically (e.g. Australian Eastern Daylight Time), with a constant value in a given region. \nThe region where it applies and the offset from UTC are specified by a locally recognised governing authority."@en ; + rdfs:label "Time Zone"@en , "huso horario"@es ; + skos:definition "Un huso horario especifica la cantidad en que la hora local está desplazada con respecto a UTC.\n Un huso horario normalmente se denota geográficamente (p.ej. el horario de verano del este de Australia), con un valor constante en una región dada.\n La región donde aplica y el desplazamiento desde UTC las especifica una autoridad gubernamental localmente reconocida."@es , "A Time Zone specifies the amount by which the local time is offset from UTC. \n\tA time zone is usually denoted geographically (e.g. Australian Eastern Daylight Time), with a constant value in a given region. \nThe region where it applies and the offset from UTC are specified by a locally recognised governing authority."@en ; + skos:historyNote "En la versión original de OWL-Time de 2006, se definió, en un espacio de nombres diferente \"http://www.w3.org/2006/timezone#\", la clase 'huso horario', con varias propiedades específicas correspondientes a un modelo específico de huso horario.\n En la versión actual hay una clase con el mismo nombre local en el espacio de nombres de OWL-Time, eliminando la dependencia del espacio de nombres externo.\n Un axioma de alineación permite que los datos codificados de acuerdo con la versión anterior sean consistentes con la ontología actualizada."@es , "In the original 2006 version of OWL-Time, the TimeZone class, with several properties corresponding to a specific model of time-zones, was defined in a separate namespace \"http://www.w3.org/2006/timezone#\". \n\nIn the current version a class with same local name is put into the main OWL-Time namespace, removing the dependency on the external namespace. \n\nAn alignment axiom \n\ttzont:TimeZone rdfs:subClassOf time:TimeZone . \nallows data encoded according to the previous version to be consistent with the updated ontology. " ; + skos:note "A designated timezone is associated with a geographic region. However, for a particular region the offset from UTC often varies seasonally, and the dates of the changes may vary from year to year. The timezone designation usually changes for the different seasons (e.g. Australian Eastern Standard Time vs. Australian Eastern Daylight Time). Furthermore, the offset for a timezone may change over longer timescales, though its designation might not. \n\nDetailed guidance about working with time zones is given in http://www.w3.org/TR/timezone/ ."@en , "An ontology for time zone descriptions was described in [owl-time-20060927] and provided as RDF in a separate namespace tzont:. However, that ontology was incomplete in scope, and the example datasets were selective. Furthermore, since the use of a class from an external ontology as the range of an ObjectProperty in OWL-Time creates a dependency, reference to the time zone class has been replaced with the 'stub' class in the normative part of this version of OWL-Time."@en , "Un huso horario designado está asociado con una región geográfica. Sin embargo, para una región particular el desplazamiento desde UTC a menudo varía según las estaciones, y las fechas de los cambios pueden variar de un año a otro. La designación de huso horario normalmente cambia de una estación a otra (por ejemplo, el horario estándar frente al horario de verano ambos del este de Australia). Además, del desplazamiento para un huso horario puede cambiar sobre escalas de tiempo mayores, aunque su designación no lo haga.\n Se puede encontrar una guía detallada sobre el funcionamiento de husos horarios en http://www.w3.org/TR/timezone/.\"@es , \"En [owl-time-20060927] se describió una ontología para descripciones de husos horarios, y se proporcionó en un espacio de nombres separado tzont:. Sin embargo, dicha ontología estaba incompleta en su alcance, y el ejemplo de conjuntos de datos (datasets) era selectivo. Además, puesto que el uso de una clase de una ontología externa como el rango de una propiedad de objeto en OWL-Time crea una dependencia, la referencia a la clase huso horario se ha reemplazado por una clase que viene a ser un \"cajón de sastre\" en la en la parte normativa de esta versión de OWL-Time."@es ; + skos:scopeNote "En esta implementación 'huso horario' no tiene definidas propiedades. Se debería pensar como una superclase \"abstracta\" de todas las implementaciones de huso horario específicas."@es , "In this implementation TimeZone has no properties defined. It should be thought of as an 'abstract' superclass of all specific timezone implementations." . + +vcard:latitude rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated. See hasGeo"@en ; + rdfs:isDefinedBy ; + rdfs:label "latitude"@en ; + owl:deprecated true . + + + rdf:type owl:Ontology ; + rdfs:comment "This document is published by the Provenance Working Group (http://www.w3.org/2011/prov/wiki/Main_Page). \n\nIf you wish to make comments regarding this document, please send them to public-prov-comments@w3.org (subscribe public-prov-comments-request@w3.org, archives http://lists.w3.org/Archives/Public/public-prov-comments/). All feedback is welcome."@en ; + rdfs:label "W3C PROVenance Interchange Ontology (PROV-O)"@en ; + rdfs:seeAlso , ; + owl:versionIRI ; + owl:versionInfo "Recommendation version 2013-04-30"@en ; + prov:specializationOf ; + prov:wasRevisionOf . + +spdx:FileType rdf:type owl:Class ; + rdfs:comment "Type of file."@en ; + vs:term_status "stable"@en . + +rdfs:comment rdf:type owl:AnnotationProperty , owl:DatatypeProperty ; + rdfs:comment ""@en ; + rdfs:isDefinedBy ; + rdfs:range xsd:string . + +spdx:purpose_framework + rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package is a software framework."@en ; + vs:term_status "stable"@en . + +spdx:specVersion rdf:type owl:DatatypeProperty ; + rdfs:comment "Provide a reference number that can be used to understand how to parse and interpret the rest of the file. It will enable both future changes to the specification and to support backward compatibility. The version number consists of a major and minor version indicator. The major field will be incremented when incompatible changes between versions are made (one or more sections are created, modified or deleted). The minor field will be incremented when backwards compatible changes are made."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range xsd:string . + +dcterms:RFC5646 rdf:type rdfs:Datatype ; + rdfs:comment "The set of tags constructed according to RFC 5646 for the identification of languages."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "RFC 5646"@en ; + rdfs:seeAlso ; + dcterms:description "RFC 5646 obsoletes RFC 4646."@en ; + dcterms:issued "2010-10-11"^^xsd:date . + +skos:narrower rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "Narrower concepts are typically rendered as children in a concept hierarchy (tree)."@en ; + rdfs:isDefinedBy ; + rdfs:label "has narrower"@en ; + rdfs:subPropertyOf skos:narrowerTransitive ; + owl:inverseOf skos:broader ; + skos:definition "Relates a concept to a concept that is more specific in meaning."@en ; + skos:scopeNote "By convention, skos:broader is only used to assert an immediate (i.e. direct) hierarchical link between two conceptual resources."@en . + +spdx:ExternalDocumentRef + rdf:type owl:Class ; + rdfs:comment "Information about an external SPDX document reference including the checksum. This allows for verification of the external references."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:Checksum ; + owl:onProperty spdx:checksum ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:SpdxDocument ; + owl:onProperty spdx:spdxDocument ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:externalDocumentId ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +skos:memberList rdf:type owl:ObjectProperty , owl:FunctionalProperty , rdf:Property ; + rdfs:comment "For any resource, every item in the list given as the value of the\n skos:memberList property is also a value of the skos:member property."@en ; + rdfs:domain skos:OrderedCollection ; + rdfs:isDefinedBy ; + rdfs:label "has member list"@en ; + rdfs:range rdf:List ; + skos:definition "Relates an ordered collection to the RDF list containing its members."@en . + +spdx:purpose_other rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package doesn't fit into other purpose defined terms."@en ; + vs:term_status "stable"@en . + +prov:atLocation rdf:type owl:ObjectProperty ; + rdfs:comment "The Location of any resource."@en , "This property has multiple RDFS domains to suit multiple OWL Profiles. See PROV-O OWL Profile." ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity prov:InstantaneousEvent ) + ] ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity prov:InstantaneousEvent ) + ] ; + rdfs:isDefinedBy ; + rdfs:label "atLocation" ; + rdfs:range prov:Location ; + prov:category "expanded" ; + prov:editorialNote "This property is not functional because the many values could be at a variety of granularies (In this building, in this room, in that chair)."@en , "The naming of prov:atLocation parallels prov:atTime, and is not named prov:hadLocation to avoid conflicting with the convention that prov:had* properties are used on prov:Influence classes."@en ; + prov:inverse "locationOf" ; + prov:sharesDefinitionWith prov:Location . + +foaf:primaryTopic rdf:type owl:ObjectProperty ; + rdfs:comment "This axiom needed so that Protege loads DCAT2 without errors." . + +adms:last rdf:type owl:ObjectProperty ; + rdfs:comment "A link to the current or latest version of the Asset."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "last"@en ; + rdfs:range rdfs:Resource ; + rdfs:subPropertyOf . + +dcterms:replaces rdf:type rdf:Property ; + rdfs:comment "A related resource that is supplanted, displaced, or superseded by the described resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Replaces"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Is Replaced By."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:hasSource rdf:type owl:ObjectProperty ; + rdfs:comment "To identify the source of directory information of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has source"@en . + +vcard:Location rdf:type owl:Class ; + rdfs:comment "An object representing a named geographical place"@en ; + rdfs:isDefinedBy ; + rdfs:label "Location"@en ; + rdfs:subClassOf vcard:Kind ; + owl:disjointWith vcard:Organization . + +spdx:ReferenceType rdf:type owl:Class ; + rdfs:comment "Types used to external reference identifiers."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:contextualExample ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:documentation ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:externalReferenceSite ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +spdx:artifactOf rdf:type owl:ObjectProperty ; + rdfs:comment "Deprecated as of version 2.1"@en , "Indicates the project in which the SpdxElement originated. Tools must preserve doap:homepage and doap:name properties and the URI (if one is known) of doap:Project resources that are values of this property. All other properties of doap:Projects are not directly supported by SPDX and may be dropped when translating to or from some SPDX formats."@en ; + rdfs:domain spdx:SpdxElement ; + rdfs:range doap:Project ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +spdx:licenseListVersion + rdf:type owl:DatatypeProperty , owl:FunctionalProperty ; + rdfs:comment "An optional field for creators of the SPDX file to provide the version of the SPDX License List used when the SPDX file was created."@en ; + rdfs:domain spdx:CreationInfo ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:copyrightText rdf:type owl:DatatypeProperty ; + rdfs:comment "The text of copyright declarations recited in the package, file or snippet.\n\nIf the copyrightText field is not present, it implies an equivalent meaning to NOASSERTION."@en ; + rdfs:domain spdx:SpdxItem ; + rdfs:range rdfs:Literal , xsd:string ; + vs:term_status "stable"@en . + + + rdf:type owl:Class ; + rdfs:subClassOf ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:positiveInteger ; + owl:onProperty ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable" . + +spdx:OrLaterOperator rdf:type owl:Class ; + rdfs:comment "A license with an or later operator indicating this license version or any later version of the license"@en ; + rdfs:subClassOf spdx:AnyLicenseInfo ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:SimpleLicensingInfo ; + owl:onProperty spdx:member ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +dcterms:Policy rdf:type rdfs:Class ; + rdfs:comment "A plan or course of action by an authority, intended to influence and determine decisions, actions, and other matters."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Policy"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + + + rdf:type sh:NodeShape ; + sh:name "Relationship"@en ; + sh:property [ sh:minCount 1 ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:path dcterms:relation ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +dcat:servesDataset rdf:type owl:ObjectProperty ; + rdfs:comment "Una colección de datos que este Servicio de Datos puede distribuir."@es , "En samling af data som denne datatjeneste kan distribuere."@da , "Una raccolta di dati che questo DataService può distribuire."@it , "Kolekce dat, kterou je tato Datová služba schopna poskytnout."@cs , "A collection of data that this DataService can distribute."@en ; + rdfs:domain dcat:DataService ; + rdfs:label "serve set di dati"@it , "datatjeneste for datasæt"@da , "poskytuje datovou sadu"@cs , "serves dataset"@en , "provee conjunto de datos"@es ; + rdfs:range dcat:Dataset ; + skos:altLabel "udstiller"@da , "ekspederer"@da , "distribuerer"@da ; + skos:changeNote "New property in DCAT 2.0."@en , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "Nuova proprietà in DCAT 2.0."@it , "Nueva propiedad agregada en DCAT 2.0."@es ; + skos:definition "En samling af data som denne datatjeneste kan distribuere."@da , "Una raccolta di dati che questo DataService può distribuire."@it , "A collection of data that this DataService can distribute."@en , "Una colección de datos que este Servicio de Datos puede distribuir."@es , "Kolekce dat, kterou je tato Datová služba schopna poskytnout."@cs . + +dcterms:Standard rdf:type rdfs:Class ; + rdfs:comment "A reference point against which other things can be evaluated or compared."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Standard"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +time:Tuesday rdf:type time:DayOfWeek ; + rdfs:label "Tuesday"@en ; + skos:prefLabel "Dienstag"@de , "Terça-feira"@pt , "الثلاثاء"@ar , "Mardi"@fr , "Вторник"@ru , "Dinsdag"@nl , "火曜日"@ja , "Wtorek"@pl , "Tuesday"@en , "Martes"@es , "星期二"@zh , "Martedì"@it . + +spdx:relationshipType_optionalDependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is an optional dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +time:hasDuration rdf:type owl:ObjectProperty ; + rdfs:comment "Duration of a temporal entity, expressed as a scaled value or nominal value"@en , "Duración de una entidad temporal, expresada como un valor escalado o un valor nominal."@es ; + rdfs:label "has duration"@en , "tiene duración"@es ; + rdfs:range time:Duration ; + rdfs:subPropertyOf time:hasTemporalDuration ; + skos:definition "Duration of a temporal entity, event or activity, or thing, expressed as a scaled value"@en , "Duración de una entidad temporal, evento o actividad, o cosa, expresada como un valor escalado."@es . + +dcterms:PeriodOfTime rdf:type rdfs:Class ; + rdfs:comment "An interval of time that is named or defined by its start and end dates."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Period of Time"@en ; + rdfs:subClassOf dcterms:LocationPeriodOrJurisdiction ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:WithExceptionOperator + rdf:type owl:Class ; + rdfs:comment "Sometimes a set of license terms apply except under special circumstances. In this case, use the binary \"WITH\" operator to construct a new license expression to represent the special exception situation. A valid is where the left operand is a value and the right operand is a that represents the special exception terms."@en ; + rdfs:subClassOf spdx:AnyLicenseInfo ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:LicenseException ; + owl:onProperty spdx:licenseException ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:SimpleLicensingInfo ; + owl:onProperty spdx:member ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +vcard:hasRegion rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the region data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has region"@en . + +[ rdf:type owl:AllDisjointClasses ; + owl:members ( spdx:Annotation spdx:Relationship spdx:SpdxElement ) +] . + +spdx:externalRef rdf:type owl:ObjectProperty ; + rdfs:comment "An External Reference allows a Package to reference an external source of additional information, metadata, enumerations, asset identifiers, or downloadable content believed to be relevant to the Package."@en ; + rdfs:domain spdx:Package ; + rdfs:range spdx:ExternalRef ; + vs:term_status "stable"@en . + +vcard:hasGeo rdf:type owl:ObjectProperty ; + rdfs:comment "To specify information related to the global positioning of the object. May also be used as a property parameter."@en ; + rdfs:isDefinedBy ; + rdfs:label "has geo"@en . + +vcard:Postal rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Postal"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + +time:GeneralDurationDescription + rdf:type owl:Class ; + rdfs:comment "Descripción de extensión temporal estructurada con valores separados para los distintos elementos de un sistema de horario-calendario."@es , "Description of temporal extent structured with separate values for the various elements of a calendar-clock system."@en ; + rdfs:label "descripción de duración generalizada"@es , "Generalized duration description"@en ; + rdfs:subClassOf time:TemporalDuration ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:minutes + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:weeks + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:hasTRS + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:hours + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:years + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:days + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:seconds + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:months + ] ; + skos:definition "Description of temporal extent structured with separate values for the various elements of a calendar-clock system."@en , "Descripción de extensión temporal estructurada con valores separados para los distintos elementos de un sistema de horario-calendario."@es ; + skos:note "La extensión de una duración de tiempo expresada como una 'descripción de duración general' depende del Sistema de Referencia Temporal. En algunos calendarios la longitud de la semana o del mes no es constante a lo largo del año. Por tanto, un valor como \"25 meses\" puede no ser necesariamente ser comparado con un duración similar expresada en términos de semanas o días. Cuando se consideran calendarios que no están basados en el movimiento de la Tierra, se deben tomar incluso más precauciones en la comparación de duraciones."@es , "The extent of a time duration expressed as a GeneralDurationDescription depends on the Temporal Reference System. In some calendars the length of the week or month is not constant within the year. Therefore, a value like \"2.5 months\" may not necessarily be exactly compared with a similar duration expressed in terms of weeks or days. When non-earth-based calendars are considered even more care must be taken in comparing durations."@en . + +prov:Activity rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Activity" ; + owl:disjointWith prov:Entity ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "An activity is something that occurs over a period of time and acts upon or with entities; it may include consuming, processing, transforming, modifying, relocating, using, or generating entities." ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Activity"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Activity"^^xsd:anyURI . + +time:Interval rdf:type owl:Class ; + rdfs:comment "A temporal entity with an extent or duration"@en , "Una entidad temporal con una extensión o duración."@es ; + rdfs:label "Time interval"@en , "intervalo de tiempo"@es ; + rdfs:subClassOf time:TemporalEntity ; + skos:definition "A temporal entity with an extent or duration"@en , "Una entidad temporal con una extensión o duración."@es . + +vcard:Voice rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Voice"@en ; + rdfs:subClassOf vcard:TelephoneType . + +vcard:hasFN rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the formatted name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has formatted name"@en . + +vcard:street-address rdf:type owl:DatatypeProperty ; + rdfs:comment "The street address associated with the address of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "street address"@en ; + rdfs:range xsd:string . + +dcterms:LCSH rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of labeled concepts specified by the Library of Congress Subject Headings."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "LCSH"@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +time:hasDurationDescription + rdf:type owl:ObjectProperty ; + rdfs:comment "Duration of a temporal entity, expressed using a structured description"@en , "Duración de una entidad temporal, expresada utilizando una descripción estructurada."@es ; + rdfs:label "has duration description"@en , "tiene descripción de duración"@es ; + rdfs:range time:GeneralDurationDescription ; + rdfs:subPropertyOf time:hasTemporalDuration ; + skos:definition "Duration of a temporal entity, expressed using a structured description"@en , "Duración de una entidad temporal, expresada utilizando una descripción estructurada."@es . + +vcard:role rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the function or part played in a particular situation by the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "role"@en ; + rdfs:range xsd:string . + +time:generalDay rdf:type rdfs:Datatype ; + rdfs:comment "Day of month - formulated as a text string with a pattern constraint to reproduce the same lexical form as gDay, except that values up to 99 are permitted, in order to support calendars with more than 31 days in a month. \nNote that the value-space is not defined, so a generic OWL2 processor cannot compute ordering relationships of values of this type."@en , "Día del mes - formulado como una cadena de texto con una restricción patrón para reproducir la misma forma léxica que gDay, excepto que se permiten valores hasta el 99, con el propósito de proporcionar soporte a calendarios con meses con más de 31 días.\n Nótese que el espacio de valores no está definido, por tanto, un procesador genérico de OWL2 no puede computar relaciones de orden de valores de este tipo."@es ; + rdfs:label "Generalized day"@en , "Día generalizado"@es ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( [ xsd:pattern "---(0[1-9]|[1-9][0-9])(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?" ] + ) ; + skos:definition "Day of month - formulated as a text string with a pattern constraint to reproduce the same lexical form as gDay, except that values up to 99 are permitted, in order to support calendars with more than 31 days in a month. \nNote that the value-space is not defined, so a generic OWL2 processor cannot compute ordering relationships of values of this type."@en , "Día del mes - formulado como una cadena de texto con una restricción patrón para reproducir la misma forma léxica que gDay, excepto que se permiten valores hasta el 99, con el propósito de proporcionar soporte a calendarios con meses con más de 31 días.\n Nótese que el espacio de valores no está definido, por tanto, un procesador genérico de OWL2 no puede computar relaciones de orden de valores de este tipo."@es . + +spdx:isDeprecatedLicenseId + rdf:type owl:DatatypeProperty ; + rdfs:domain spdx:ListedLicense ; + rdfs:range xsd:boolean . + +spdx:checksumAlgorithm_md4 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was MD4" ; + vs:term_status "stable" . + +spdx:relationshipType_other + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "to be used for a relationship which has not been defined in the formal SPDX specification. A description of the relationship should be included in the Relationship comments field."@en ; + vs:term_status "stable"@en . + +vcard:Me rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Me"@en ; + rdfs:subClassOf vcard:RelatedType . + +spdx:licenseExceptionId + rdf:type owl:DatatypeProperty ; + rdfs:comment "Short form license exception identifier in Appendix I.2 of the SPDX specification."@en ; + rdfs:domain spdx:LicenseException ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +dcterms:bibliographicCitation + rdf:type rdf:Property ; + rdfs:comment "A bibliographic reference for the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Bibliographic Citation"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:identifier , dcterms:identifier ; + dcterms:description "Recommended practice is to include sufficient bibliographic detail to identify the resource as unambiguously as possible."@en ; + dcterms:issued "2003-02-15"^^xsd:date . + +prov:generated rdf:type owl:ObjectProperty ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "generated" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:influenced ; + owl:inverseOf prov:wasGeneratedBy ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:editorialNote "prov:generated is one of few inverse property defined, to allow Activity-oriented assertions in addition to Entity-oriented assertions."@en ; + prov:inverse "wasGeneratedBy" ; + prov:sharesDefinitionWith prov:Generation . + +vcard:bday rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the birth date of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "birth date"@en ; + rdfs:range [ rdf:type rdfs:Datatype ; + owl:unionOf ( xsd:dateTime xsd:dateTimeStamp xsd:gYear ) + ] . + +dcterms:language rdf:type rdf:Property ; + rdfs:comment "A language of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Language"@en ; + rdfs:subPropertyOf dc:language ; + dcam:rangeIncludes dcterms:LinguisticSystem ; + dcterms:description "Recommended practice is to use either a non-literal value representing a language from a controlled vocabulary such as ISO 639-2 or ISO 639-3, or a literal value consisting of an IETF Best Current Practice 47 [[IETF-BCP47](https://tools.ietf.org/html/bcp47)] language tag."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +prov:hadGeneration rdf:type owl:ObjectProperty ; + rdfs:comment "The _optional_ Generation involved in an Entity's Derivation."@en ; + rdfs:domain prov:Derivation ; + rdfs:isDefinedBy ; + rdfs:label "hadGeneration" ; + rdfs:range prov:Generation ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "generatedAsDerivation" ; + prov:sharesDefinitionWith prov:Generation . + +spdx:relationshipType_copyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_copyOf expresses that the SPDXElement is an exact copy of the relatedSDPXElement. For example, a downstream distribution of a binary library which was copied from the upstream package."@en ; + vs:term_status "stable"@en . + +time:intervalIn rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 es un intervalo interior a otro intervalo propio T2, entonces el principio de T1 está después del principio de T2 o coincide con el principio de T2, y el final de T1 está antes que el final de T2, o coincide con el final de T2, excepto que el final de T1 puede no coincidir con el final de T2 si el principio de T1 coincide con el principio de T2."@es , "If a proper interval T1 is intervalIn another proper interval T2, then the beginning of T1 is after the beginning of T2 or is coincident with the beginning of T2, and the end of T1 is before the end of T2, or is coincident with the end of T2, except that end of T1 may not be coincident with the end of T2 if the beginning of T1 is coincident with the beginning of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval in"@en , "intervalo interior"@es ; + rdfs:range time:ProperInterval ; + owl:propertyDisjointWith time:intervalEquals ; + skos:definition "If a proper interval T1 is intervalIn another proper interval T2, then the beginning of T1 is after the beginning of T2 or is coincident with the beginning of T2, and the end of T1 is before the end of T2, or is coincident with the end of T2, except that end of T1 may not be coincident with the end of T2 if the beginning of T1 is coincident with the beginning of T2."@en , "Si un intervalo propio T1 es un intervalo interior a otro intervalo propio T2, entonces el principio de T1 está después del principio de T2 o coincide con el principio de T2, y el final de T1 está antes que el final de T2, o coincide con el final de T2, excepto que el final de T1 puede no coincidir con el final de T2 si el principio de T1 coincide con el principio de T2."@es ; + skos:note "This interval relation is not included in the 13 basic relationships defined in Allen (1984), but is referred to as 'an important relationship' in Allen and Ferguson (1997). It is the disjoint union of :intervalStarts v :intervalDuring v :intervalFinishes . However, that is outside OWL2 expressivity, so is implemented as an explicit property, with :intervalStarts , :intervalDuring , :intervalFinishes as sub-properties"@en , "Esta relación entre intervalos no estaba incluida en las 13 relaciones básicas definidas por Allen (1984), pero se hace referencia a ella como \"una relación importante\" en Allen y Ferguson (1997). Es la unión disjunta de 'intervalo empieza', 'intervalo durante' y con 'intervalo termina'. Sin embargo, esto está fuera de la expresividad de OWL2, por tanto, se implementa como una propiedad explícita, con 'intervalo empieza', 'intervalo durante' e 'intervalo termina' como sub-propiedades."@es . + +adms:Asset rdf:type owl:Class ; + rdfs:comment "An abstract entity that reflects the intellectual content of the asset and represents those characteristics of the asset that are independent of its physical embodiment. This abstract entity combines the FRBR entities work (a distinct intellectual or artistic creation) and expression (the intellectual or artistic realization of a work)"@en ; + rdfs:isDefinedBy ; + rdfs:label "Asset"@en . + +vcard:Crush rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Crush"@en ; + rdfs:subClassOf vcard:RelatedType . + +spdx:checksumAlgorithm_adler32 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was ADLER32."@en ; + vs:term_status "stable"@en . + +vcard:hasSound rdf:type owl:ObjectProperty ; + rdfs:comment "To specify a digital sound content information that annotates some aspect of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has sound"@en ; + owl:equivalentProperty vcard:sound . + +spdx:primaryPackagePurpose + rdf:type owl:ObjectProperty ; + rdfs:comment "This field provides information about the primary purpose of the identified package. Package Purpose is intrinsic to how the package is being used rather than the content of the package."@en ; + rdfs:domain spdx:Package ; + rdfs:range spdx:Purpose ; + vs:term_status "stable"@en . + +owl:Thing rdf:type owl:Class . + + + rdf:type sh:NodeShape ; + sh:name "Category"@en ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path skos:prefLabel ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:Concept . + +spdx:relationshipType_descendantOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_descendantOf expresses that an SPDXElement is a descendant of (same lineage but post-dates) the relatedSPDXElement. For example, an downstream File that was modified is a descendant of an upstream File"@en ; + vs:term_status "stable"@en . + +dcterms:license rdf:type rdf:Property ; + rdfs:comment "A legal document giving official permission to do something with the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "License"@en ; + rdfs:subPropertyOf dc:rights , dcterms:rights ; + dcam:rangeIncludes dcterms:LicenseDocument ; + dcterms:description "Recommended practice is to identify the license document with a URI. If this is not possible or feasible, a literal value that identifies the license may be provided."@en ; + dcterms:issued "2004-06-14"^^xsd:date . + +spdx:File rdf:type owl:Class ; + rdfs:comment "A File represents a named sequence of information that is contained in a software package."@en ; + rdfs:subClassOf spdx:SpdxItem ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Checksum ; + owl:onProperty spdx:checksum + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass doap:Project ; + owl:onProperty spdx:artifactOf + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:fileContributor + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:noticeText + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:fileName ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:File ; + owl:onProperty spdx:fileDependency + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:licenseInfoInFile + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:FileType ; + owl:onProperty spdx:fileType + ] ; + owl:disjointWith spdx:Snippet ; + vs:term_status "stable"@en . + +dcatap:shacl_shapes cc:attributionURL ; + dcatap:availability dcatap:stable ; + dcterms:conformsTo ; + dcterms:creator [ rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ] ; + dcterms:creator [ rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ] ; + dcterms:creator [ rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ] ; + dcterms:creator [ rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dcterms:creator [ rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ] ; + dcterms:creator [ rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ] ; + dcterms:description "This document specifies the constraints on properties and classes expressed by DCAT-AP in SHACL."@en ; + dcterms:format ; + dcterms:license ; + dcterms:modified "2021-12-01"^^xsd:date ; + dcterms:publisher ; + dcterms:relation ; + dcterms:title "The constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + dcat:accessURL ; + dcat:downloadURL ; + foaf:homepage ; + foaf:maker [ foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + +prov:sharesDefinitionWith + rdf:type owl:AnnotationProperty ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + + + rdf:type owl:Ontology ; + rdfs:label "OWL-Time"@en , "Tiempo en OWL"@es ; + rdfs:seeAlso , , ; + dcterms:contributor , ; + dcterms:created "2006-09-27"^^xsd:date ; + dcterms:creator , , ; + dcterms:isVersionOf ; + dcterms:license ; + dcterms:modified "2017-04-06"^^xsd:date ; + dcterms:rights "Copyright © 2006-2017 W3C, OGC. W3C and OGC liability, trademark and document use rules apply."@en ; + owl:priorVersion time:2006 ; + owl:versionIRI time:2016 ; + skos:changeNote "2016-06-15 - initial update of OWL-Time - modified to support arbitrary temporal reference systems. " , "2016-12-20 - adjust range of time:timeZone to time:TimeZone, moved up from the tzont ontology. " , "2017-02 - intervalIn, intervalDisjoint, monthOfYear added; TemporalUnit subclass of TemporalDuration" , "2016-12-20 - restore time:Year and time:January which were present in the 2006 version of the ontology, but now marked \"deprecated\". " , "2017-04-06 - hasTime, hasXSDDuration added; Number removed; all duration elements changed to xsd:decimal" ; + skos:historyNote "Update of OWL-Time ontology, extended to support general temporal reference systems. \n\nOntology engineering by Simon J D Cox"@en . + +spdx:relationshipType_describedBy + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used an SPDXRef-A is described by SPDXRef-Document."@en ; + vs:term_status "stable"@en . + +spdx:date rdf:type owl:DatatypeProperty ; + rdfs:comment "A date-time stamp."@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( spdx:Annotation spdx:CreationInfo ) + ] ; + rdfs:range xsd:dateTime ; + vs:term_status "stable"@en . + +time:unitMinute rdf:type time:TemporalUnit ; + rdfs:label "Minute (unit of temporal duration)"@en ; + skos:prefLabel "دقيقة واحدة"@ar , "minuut"@nl , "одна минута"@ru , "Minute"@de , "minuto"@es , "minuto"@it , "minuto"@pt , "분"@kr , "等一下"@zh , "一分"@jp , "minute"@en , "minute"@fr , "minuta"@pl ; + time:days "0"^^xsd:decimal ; + time:hours "0"^^xsd:decimal ; + time:minutes "1"^^xsd:decimal ; + time:months "0"^^xsd:decimal ; + time:seconds "0"^^xsd:decimal ; + time:weeks "0"^^xsd:decimal ; + time:years "0"^^xsd:decimal . + +dcat:service rdf:type owl:ObjectProperty ; + rdfs:comment "Umístění či přístupový bod registrovaný v katalogu."@cs , "A site or endpoint that is listed in the catalog."@en , "Un sito o endpoint elencato nel catalogo."@it , "Et websted eller et endpoint som er opført i kataloget."@da , "Un sitio o 'endpoint' que está listado en el catálogo."@es ; + rdfs:domain dcat:Catalog ; + rdfs:label "service"@en , "datatjeneste"@da , "servicio"@es , "servizio"@it , "služba"@cs ; + rdfs:range dcat:DataService ; + rdfs:subPropertyOf dcterms:hasPart , rdfs:member ; + skos:altLabel "har datatjeneste"@da ; + skos:changeNote "Nueva propiedad añadida en DCAT 2.0."@es , "Nuova proprietà aggiunta in DCAT 2.0."@it , "New property added in DCAT 2.0."@en , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs ; + skos:definition "Un sitio o 'endpoint' que está listado en el catálogo."@es , "Umístění či přístupový bod registrovaný v katalogu."@cs , "Et websted eller et endpoint som er opført i kataloget."@da , "A site or endpoint that is listed in the catalog."@en , "Un sito o endpoint elencato nel catalogo."@it . + +spdx:fileType_spdx rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "The file is an SPDX document."@en ; + vs:term_status "stable"@en . + +vcard:Kind rdf:type owl:Class ; + rdfs:comment "The parent class for all objects"@en ; + rdfs:isDefinedBy ; + rdfs:label "Kind"@en ; + owl:equivalentClass vcard:VCard ; + owl:equivalentClass [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty vcard:fn + ] . + +prov:used rdf:type owl:ObjectProperty ; + rdfs:comment "A prov:Entity that was used by this prov:Activity. For example, :baking prov:used :spoon, :egg, :oven ."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "used" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedUsage prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedUsage prov:entity ) ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:inverse "wasUsedBy" ; + prov:qualifiedForm prov:Usage , prov:qualifiedUsage . + +spdx:hasFile rdf:type owl:ObjectProperty ; + rdfs:comment "Indicates that a particular file belongs to a package."@en ; + rdfs:domain spdx:Package ; + rdfs:range spdx:File ; + vs:term_status "stable"@en . + +vcard:Modem rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Modem"@en ; + rdfs:subClassOf vcard:TelephoneType ; + owl:deprecated true . + +dcat:accessService rdf:type owl:ObjectProperty ; + rdfs:comment "A site or end-point that gives access to the distribution of the dataset."@en , "Un sito o end-point che dà accesso alla distribuzione del set di dati."@it , "Un sitio o end-point que da acceso a la distribución de un conjunto de datos."@es , "Umístění či přístupový bod zpřístupňující distribuci datové sady."@cs , "Et websted eller endpoint der giver adgang til en repræsentation af datasættet."@da ; + rdfs:label "služba pro přístup k datům"@cs , "data access service"@en , "servicio de acceso de datos"@es , "dataadgangstjeneste"@da , "servizio di accesso ai dati"@it ; + rdfs:range dcat:DataService ; + skos:changeNote "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "New property added in DCAT 2.0."@en , "Ny egenskab tilføjet i DCAT 2.0."@da , "Nueva propiedad agregada en DCAT 2.0."@es , "Nuova proprietà aggiunta in DCAT 2.0."@it ; + skos:definition "Umístění či přístupový bod zpřístupňující distribuci datové sady."@cs , "Un sito o end-point che dà accesso alla distribuzione del set di dati."@it , "Un sitio o end-point que da acceso a la distribución de un conjunto de datos."@es , "Et websted eller endpoint der giver adgang til en repræsentation af datasættet."@da , "A site or end-point that gives access to the distribution of the dataset."@en . + +time:Wednesday rdf:type time:DayOfWeek ; + rdfs:label "Wednesday"@en ; + skos:prefLabel "Mercoledì"@it , "Среда"@ru , "Woensdag"@nl , "Mercredi"@fr , "水曜日"@ja , "Quarta-feira"@pt , "Środa"@pl , "星期三"@zh , "الأربعاء"@ar , "Mittwoch"@de , "Miércoles"@es , "Wednesday"@en . + +time:intervalFinishes + rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 termina otro intervalo propio T2, entonces del principio de T1 está después del principio de T2, y el final de T1 coincide con el final de T2."@es , "If a proper interval T1 is intervalFinishes another proper interval T2, then the beginning of T1 is after the beginning of T2, and the end of T1 is coincident with the end of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo termina"@es , "interval finishes"@en ; + rdfs:range time:ProperInterval ; + rdfs:subPropertyOf time:intervalIn ; + owl:inverseOf time:intervalFinishedBy ; + skos:definition "If a proper interval T1 is intervalFinishes another proper interval T2, then the beginning of T1 is after the beginning of T2, and the end of T1 is coincident with the end of T2."@en , "Si un intervalo propio T1 termina otro intervalo propio T2, entonces del principio de T1 está después del principio de T2, y el final de T1 coincide con el final de T2."@es . + +skos:Concept rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Concept"@en ; + skos:definition "An idea or notion; a unit of thought."@en . + +time:unitDay rdf:type time:TemporalUnit ; + rdfs:label "Day (unit of temporal duration)"@en ; + skos:prefLabel "Tag"@de , "day"@en , "dag"@nl , "dia"@pt , "día"@es , "doba"@pl , "ある日"@jp , "يوماً ما"@ar , "giorno"@it , "언젠가"@kr , "jour"@fr , "一天"@zh ; + time:days "1"^^xsd:decimal ; + time:hours "0"^^xsd:decimal ; + time:minutes "0"^^xsd:decimal ; + time:months "0"^^xsd:decimal ; + time:seconds "0"^^xsd:decimal ; + time:weeks "0"^^xsd:decimal ; + time:years "0"^^xsd:decimal . + +spdx:relationshipType_optionalComponentOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "To be used when SPDXRef-A is an optional component of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:relationshipType_expandedFromArchive + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_expandedFromArchive expresses that the SPDXElement is a file which was epanded from a relatedSPDXElement file. For example, if there is an archive file xyz.tar.gz containing a file foo.c the archive file was expanded in a directory arch/xyz, the file arch/xyz/foo.c would have a relationshipType_expandedFromArchive with the file xyz.tar.gz."@en ; + vs:term_status "stable"@en . + + + dcterms:title "Process and Methodology for Developing Core Vocabularies" . + +dcterms:RFC4646 rdf:type rdfs:Datatype ; + rdfs:comment "The set of tags constructed according to RFC 4646 for the identification of languages."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "RFC 4646"@en ; + rdfs:seeAlso ; + dcterms:description "RFC 4646 obsoletes RFC 3066."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +adms:AssetDistribution + rdf:type owl:Class ; + rdfs:comment "A particular physical embodiment of an Asset, which is an example of the FRBR entity manifestation (the physical embodiment of an expression of a work)."@en ; + rdfs:isDefinedBy ; + rdfs:label "Asset Distribution"@en . + +dcterms:isReferencedBy + rdf:type rdf:Property ; + rdfs:comment "A related resource that references, cites, or otherwise points to the described resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Is Referenced By"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of References."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:fileType_video rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "The file is associated with a video file type (MIME type of video/*)."@en ; + vs:term_status "stable"@en . + +dcterms:extent rdf:type rdf:Property ; + rdfs:comment "The size or duration of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Extent"@en ; + rdfs:subPropertyOf dc:format , dcterms:format ; + dcam:rangeIncludes dcterms:SizeOrDuration ; + dcterms:description "Recommended practice is to specify the file size in megabytes and duration in ISO 8601 format."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +locn:locatorDesignator + rdf:type rdf:Property ; + rdfs:comment "A number or a sequence of characters that uniquely identifies the locator within the relevant scope(s). The full identification of the locator could include one or more locator designators.\n "@en ; + rdfs:isDefinedBy ; + rdfs:label "locator designator"@en ; + dcterms:identifier "locn:locatorDesignator" ; + vs:term_status "testing"@en . + +vcard:sound rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "sound"@en ; + owl:equivalentProperty vcard:hasSound . + +time:nominalPosition rdf:type owl:DatatypeProperty ; + rdfs:comment "The (nominal) value indicating temporal position in an ordinal reference system "@en , "El valor (nominal) que indica posición temporal en un sistema de referencia ordinal."@es ; + rdfs:domain time:TimePosition ; + rdfs:label "Name of temporal position"@en , "nombre de posición temporal"@es ; + rdfs:range xsd:string ; + skos:definition "The (nominal) value indicating temporal position in an ordinal reference system "@en , "El valor (nominal) que indica posición temporal en un sistema de referencia ordinal."@es . + +spdx:PackageVerificationCode + rdf:type owl:Class ; + rdfs:comment "A manifest based verification code (the algorithm is defined in section 4.7 of the full specification) of the SPDX Item. This allows consumers of this data and/or database to determine if an SPDX item they have in hand is identical to the SPDX item from which the data was produced. This algorithm works even if the SPDX document is included in the SPDX item."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:packageVerificationCodeExcludedFile + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:hexBinary ; + owl:onProperty spdx:packageVerificationCodeValue ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +dcterms:hasFormat rdf:type rdf:Property ; + rdfs:comment "A related resource that is substantially the same as the pre-existing described resource, but in another format."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Has Format"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Is Format Of."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +time:DayOfWeek rdf:type owl:Class ; + rdfs:comment "The day of week"@en , "El día de la semana"@es ; + rdfs:label "día de la semana"@es , "Day of week"@en ; + rdfs:subClassOf owl:Thing ; + skos:changeNote "Remove enumeration from definition, in order to allow other days to be used when required in other calendars. \nNOTE: existing days are still present as members of the class, but the class membership is now open. \n\nIn the original OWL-Time the following constraint appeared: \n owl:oneOf (\n time:Monday\n time:Tuesday\n time:Wednesday\n time:Thursday\n time:Friday\n time:Saturday\n time:Sunday\n ) ;"@en ; + skos:definition "The day of week"@en , "El día de la semana"@es ; + skos:note "Membership of the class :DayOfWeek is open, to allow for alternative week lengths and different day names."@en , "La pertenencia a la clase 'día de la semana' está abierta, para permitir longitudes de semana alternativas y diferentes nombres de días."@es . + +vcard:hasMember rdf:type owl:ObjectProperty ; + rdfs:comment "To include a member in the group this object represents. (This property can only be used by Group individuals)"@en ; + rdfs:domain vcard:Group ; + rdfs:isDefinedBy ; + rdfs:label "has member"@en ; + rdfs:range vcard:Kind . + +time:generalMonth rdf:type rdfs:Datatype ; + rdfs:comment "Month of year - formulated as a text string with a pattern constraint to reproduce the same lexical form as gMonth, except that values up to 20 are permitted, in order to support calendars with more than 12 months in the year. \nNote that the value-space is not defined, so a generic OWL2 processor cannot compute ordering relationships of values of this type."@en , "Mes del año - formulado como una cadena de texto con una restricción patrón para reproducir la misma forma léxica que gMonth, excepto que se permiten valores hasta el 20, con el propósito de proporcionar soporte a calendarios con años con más de 12 meses.\n Nótese que el espacio de valores no está definido, por tanto, un procesador genérico de OWL2 no puede computar relaciones de orden de valores de este tipo."@es ; + rdfs:label "Generalized month"@en , "Mes generalizado"@es ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( [ xsd:pattern "--(0[1-9]|1[0-9]|20)(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?" ] + ) ; + skos:definition "Month of year - formulated as a text string with a pattern constraint to reproduce the same lexical form as gMonth, except that values up to 20 are permitted, in order to support calendars with more than 12 months in the year. \nNote that the value-space is not defined, so a generic OWL2 processor cannot compute ordering relationships of values of this type."@en , "Mes del año - formulado como una cadena de texto con una restricción patrón para reproducir la misma forma léxica que gMonth, excepto que se permiten valores hasta el 20, con el propósito de proporcionar soporte a calendarios con años con más de 12 meses.\n Nótese que el espacio de valores no está definido, por tanto, un procesador genérico de OWL2 no puede computar relaciones de orden de valores de este tipo."@es . + +spdx:checksumAlgorithm_blake2b256 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was BLAKE2b-256."@en ; + vs:term_status "stable"@en . + +prov:value rdf:type owl:DatatypeProperty ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "value" ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:definition "Provides a value that is a direct representation of an entity."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-attribute-value"^^xsd:anyURI ; + prov:editorialNote "This property serves the same purpose as rdf:value, but has been reintroduced to avoid some of the definitional ambiguity in the RDF specification (specifically, 'may be used in describing structured values')."@en , "The editor's definition comes from http://www.w3.org/TR/rdf-primer/#rdfvalue" . + +spdx:fileType_documentation + rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "The file serves as documentation."@en ; + vs:term_status "stable"@en . + +spdx:relationshipType_patchFor + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_patchFor expresses that the SPDXElement is a 'patchfile' that is designed to patch (apply modifications to) the relatedSPDXElement. For example, relationship from a .diff File to a Package it is designed to patch. "@en ; + vs:term_status "stable"@en . + +spdx:noticeText rdf:type owl:DatatypeProperty ; + rdfs:comment "This field provides a place for the SPDX file creator to record potential legal notices found in the file. This may or may not include copyright statements."@en ; + rdfs:domain spdx:File ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +time:ProperInterval rdf:type owl:Class ; + rdfs:comment "A temporal entity with non-zero extent or duration, i.e. for which the value of the beginning and end are different"@en , "Una entidad temporal con extensión o duración distinta de cero, es decir, para la cual los valores de principio y fin del intervalo son diferentes."@es ; + rdfs:label "Proper interval"@en , "intervalo propio"@es ; + rdfs:subClassOf time:Interval ; + owl:disjointWith time:Instant ; + skos:definition "A temporal entity with non-zero extent or duration, i.e. for which the value of the beginning and end are different"@en , "Una entidad temporal con extensión o duración distinta de cero, es decir, para la cual los valores de principio y fin del intervalo son diferentes."@es . + +rdfs:Container rdf:type owl:Class . + +spdx:creationInfo rdf:type owl:ObjectProperty ; + rdfs:comment "The creationInfo property relates an SpdxDocument to a set of information about the creation of the SpdxDocument."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range spdx:CreationInfo ; + vs:term_status "stable" . + +time:intervalEquals rdf:type owl:ObjectProperty ; + rdfs:comment "If a proper interval T1 is intervalEquals another proper interval T2, then the beginning of T1 is coincident with the beginning of T2, and the end of T1 is coincident with the end of T2."@en , "Si un intervalo propio T1 es igual a otro intervalo propio T2, entonces el principio de T1 coincide con el principio de T2, y el final de T1 coincide con el final de T2."@es ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo igual"@es , "interval equals"@en ; + rdfs:range time:ProperInterval ; + owl:propertyDisjointWith time:intervalIn ; + skos:definition "If a proper interval T1 is intervalEquals another proper interval T2, then the beginning of T1 is coincident with the beginning of T2, and the end of T1 is coincident with the end of T2."@en , "Si un intervalo propio T1 es igual a otro intervalo propio T2, entonces el principio de T1 coincide con el principio de T2, y el final de T1 coincide con el final de T2."@es . + +vcard:adr rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "address"@en ; + owl:equivalentProperty vcard:hasAddress . + +dcterms:Agent rdf:type dcterms:AgentClass , rdfs:Class ; + rdfs:comment "A resource that acts or has the power to act."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Agent"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcterms:RightsStatement + rdf:type rdfs:Class ; + rdfs:comment "A statement about the intellectual property rights (IPR) held in or over a resource, a legal document giving official permission to do something with a resource, or a statement about access rights."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Rights Statement"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:reviewDate rdf:type owl:DatatypeProperty ; + rdfs:comment "Deprecated in favor of Annotation with an annotationType_review."@en , "The date and time at which the SpdxDocument was reviewed. This value must be in UTC and have 'Z' as its timezone indicator."@en ; + rdfs:domain spdx:Review ; + rdfs:range xsd:dateTime ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +[ rdf:type owl:Axiom ; + owl:annotatedProperty rdfs:domain ; + owl:annotatedSource prov:wasInfluencedBy ; + owl:annotatedTarget [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + prov:definition "influencee: an identifier (o2) for an entity, activity, or agent; " ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence" +] . + +prov:wasRevisionOf rdf:type owl:ObjectProperty , owl:AnnotationProperty ; + rdfs:comment "A revision is a derivation that revises an entity into a revised version."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "wasRevisionOf" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasDerivedFrom ; + owl:propertyChainAxiom ( prov:qualifiedRevision prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedRevision prov:entity ) ; + prov:category "expanded" ; + prov:component "derivations" ; + prov:inverse "hadRevision" ; + prov:qualifiedForm prov:Revision , prov:qualifiedRevision . + +time:January rdf:type owl:Class , owl:DeprecatedClass ; + rdfs:label "January" ; + rdfs:subClassOf time:DateTimeDescription ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:hasValue time:unitMonth ; + owl:onProperty time:unitType + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:hasValue "--01" ; + owl:onProperty time:month + ] ; + owl:deprecated true ; + skos:historyNote "This class was present in the 2006 version of OWL-Time. It was presented as an example of how DateTimeDescription could be specialized, but does not belong in the revised ontology. " . + +skos:note rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "note"@en ; + skos:definition "A general note, for any purpose."@en ; + skos:scopeNote "This property may be used directly, or as a super-property for more specific note types."@en . + +vcard:Fax rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Fax"@en ; + rdfs:subClassOf vcard:TelephoneType . + +prov:Person rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Person" ; + rdfs:subClassOf prov:Agent ; + prov:category "expanded" ; + prov:component "agents-responsibility" ; + prov:definition "Person agents are people."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-types"^^xsd:anyURI . + +vcard:hasInstantMessage + rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the instant messaging and presence protocol communications with the object. (Was called IMPP in RFC6350)"@en ; + rdfs:isDefinedBy ; + rdfs:label "has messaging"@en . + +vcard:hasNote rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the note data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has note"@en . + +dcat:spatialResolutionInMeters + rdf:type owl:DatatypeProperty ; + rdfs:comment "minimum spatial separation resolvable in a dataset, measured in metres."@en-GB , "minimum spatial separation resolvable in a dataset, measured in meters."@en-US , "mínima separacíon espacial disponible en un conjunto de datos, medida en metros."@es , "separazione spaziale minima risolvibile in un set di dati, misurata in metri."@it , "mindste geografiske afstand som kan erkendes i et datasæt, målt i meter."@da , "minimální prostorový rozestup rozeznatelný v datové sadě, měřeno v metrech."@cs ; + rdfs:label "spatial resolution (metres)"@en-GB , "resolución espacial (metros)"@es , "spatial resolution (meters)"@en-US , "prostorové rozlišení (metry)"@cs , "risoluzione spaziale (metros)"@it , "geografisk opløsning (meter)"@da ; + rdfs:range xsd:decimal ; + skos:changeNote "Nueva propiedad añadida en DCAT 2.0."@es , "Nuova proprietà aggiunta in DCAT 2.0."@it , "New property added in DCAT 2.0."@en , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "Ny genskab tilføjet i DCAT 2.0."@da ; + skos:definition "minimum spatial separation resolvable in a dataset, measured in meters."@en-US , "separazione spaziale minima risolvibile in un set di dati, misurata in metri."@it , "minimální prostorový rozestup rozeznatelný v datové sadě, měřeno v metrech."@cs , "minimum spatial separation resolvable in a dataset, measured in metres."@en-GB , "mínima separacíon espacial disponible en un conjunto de datos, medida en metros."@es , "mindste geografiske afstand som kan resolveres i et datasæt, målt i meter."@da ; + skos:editorialNote "Může se vyskytnout v popisu Datové sady nebo Distribuce, takže nebyl specifikován definiční obor."@cs , "Might appear in the description of a Dataset or a Distribution, so no domain is specified."@en , "Kan optræde i forbindelse med beskrivelse af datasættet eller datasætditributionen, så der er ikke angivet et domæne for egenskaben."@da ; + skos:scopeNote "Pokud je datová sada obraz či mřížka, měla by tato vlastnost odpovídat rozestupu položek. Pro ostatní druhy prostorových datových sad bude tato vlastnost obvykle indikovat nejmenší vzdálenost mezi položkami této datové sady."@cs , "Hvis datasættet udgøres af et billede eller et grid, så bør dette svare til afstanden mellem elementerne. For andre typer af spatiale datasæt, vil denne egenskab typisk indikere den mindste afstand mellem elementerne i datasættet."@da , "Různá prostorová rozlišení mohou být poskytována jako různé distribuce datové sady."@cs , "Distintas distribuciones de un conjunto de datos pueden tener resoluciones espaciales diferentes."@es , "Se il set di dati è un'immagine o una griglia, questo dovrebbe corrispondere alla spaziatura degli elementi. Per altri tipi di set di dati spaziali, questa proprietà di solito indica la distanza minima tra gli elementi nel set di dati."@it , "Alternative geografiske opløsninger kan leveres som forskellige datasætdistributioner."@da , "Alternative spatial resolutions might be provided as different dataset distributions."@en , "Risoluzioni spaziali alternative possono essere fornite come diverse distribuzioni di set di dati."@it , "Si el conjunto de datos es una imágen o grilla, esta propiedad corresponde al espaciado de los elementos. Para otro tipo de conjunto de datos espaciales, esta propieda usualmente indica la menor distancia entre los elementos de dichos datos."@es , "If the dataset is an image or grid this should correspond to the spacing of items. For other kinds of spatial dataset, this property will usually indicate the smallest distance between items in the dataset."@en . + +time:GeneralDateTimeDescription + rdf:type owl:Class ; + rdfs:comment "Descripción de fecha y hora estructurada con valores separados para los distintos elementos de un sistema calendario-reloj."@es , "Description of date and time structured with separate values for the various elements of a calendar-clock system"@en ; + rdfs:label "descripción de fecha-hora generalizada"@es , "Generalized date-time description"@en ; + rdfs:subClassOf time:TemporalPosition ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:month + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:dayOfWeek + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:minute + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:timeZone + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:monthOfYear + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:year + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:dayOfYear + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:unitType + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:hour + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:day + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:second + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxCardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:week + ] ; + skos:definition "Descripción de fecha y hora estructurada con valores separados para los distintos elementos de un sistema calendario-reloj." , "Description of date and time structured with separate values for the various elements of a calendar-clock system"@en ; + skos:note "Algunas combinaciones de propiedades son redundantes - por ejemplo, dentro de un 'año' especificado si se proporciona 'día del año' entonces 'día' y 'mes' se pueden computar, y viceversa. Los valores individuales deberían ser consistentes entre ellos y con el calendario, indicado a través del valor de la propiedad 'tiene TRS'."@es , "Some combinations of properties are redundant - for example, within a specified :year if :dayOfYear is provided then :day and :month can be computed, and vice versa. Individual values should be consistent with each other and the calendar, indicated through the value of the :hasTRS property." . + +time:numericPosition rdf:type owl:DatatypeProperty ; + rdfs:comment "The (numeric) value indicating position within a temporal coordinate system "@en , "El valor (numérico) que indica posición temporal en un sistema de referencia ordinal."@es ; + rdfs:domain time:TimePosition ; + rdfs:label "Numeric value of temporal position"@en , "valor numérico de posición temporal"@es ; + rdfs:range xsd:decimal ; + skos:definition "The (numeric) value indicating position within a temporal coordinate system "@en , "El valor (numérico) que indica posición temporal en un sistema de referencia ordinal."@es . + +dcterms:alternative rdf:type rdf:Property ; + rdfs:comment "An alternative name for the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Alternative Title"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:title , dcterms:title ; + dcterms:description "The distinction between titles and alternative titles is application-specific."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +prov:component rdf:type owl:AnnotationProperty ; + rdfs:comment "Classify prov-o terms into six components according to prov-dm, including 'agents-responsibility', 'alternate', 'annotations', 'collections', 'derivations', and 'entities-activities'. This classification is used so that readers of prov-o specification can find its correspondence with the prov-dm specification."@en ; + rdfs:isDefinedBy . + +dcterms: dcterms:modified "2012-06-14"^^xsd:date ; + dcterms:publisher ; + dcterms:title "DCMI Metadata Terms - other"@en . + +time:hasDateTimeDescription + rdf:type owl:ObjectProperty ; + rdfs:comment "Value of DateTimeInterval expressed as a structured value. The beginning and end of the interval coincide with the limits of the shortest element in the description."@en , "Valor de intervalo de fecha-hora expresado como un valor estructurado. El principio y el final del intervalo coincide con los límites del elemento más corto en la descripción."@es ; + rdfs:domain time:DateTimeInterval ; + rdfs:label "has Date-Time description"@en , "tiene descripción fecha-hora"@es ; + rdfs:range time:GeneralDateTimeDescription ; + skos:definition "Value of DateTimeInterval expressed as a structured value. The beginning and end of the interval coincide with the limits of the shortest element in the description."@en , "Valor de intervalo de fecha-hora expresado como un valor estructurado. El principio y el final del intervalo coincide con los límites del elemento más corto en la descripción."@es . + +dcat:Catalog rdf:type rdfs:Class , owl:Class ; + rdfs:comment "A curated collection of metadata about resources (e.g., datasets and data services in the context of a data catalog)."@en , "Una raccolta curata di metadati sulle risorse (ad es. sui dataset e relativi servizi nel contesto di cataloghi di dati)."@it , "Řízená kolekce metadat o datových sadách a datových službách"@cs , "Una colección curada de metadatos sobre recursos (por ejemplo, conjuntos de datos y servicios de datos en el contexto de un catálogo de datos)."@es , "Une collection élaborée de métadonnées sur les jeux de données"@fr , "Μια επιμελημένη συλλογή μεταδεδομένων περί συνόλων δεδομένων"@el , "مجموعة من توصيفات قوائم البيانات"@ar , "En udvalgt og arrangeret samling af metadata om ressourcer (fx datasæt og datatjenester i kontekst af et datakatalog). "@da , "データ・カタログは、データセットに関するキュレートされたメタデータの集合です。"@ja ; + rdfs:isDefinedBy ; + rdfs:label "Κατάλογος"@el , "Katalog"@cs , "Katalog"@da , "Catalogo"@it , "فهرس قوائم البيانات"@ar , "Catálogo"@es , "カタログ"@ja , "Catalog"@en , "Catalogue"@fr ; + rdfs:subClassOf dcat:Dataset ; + skos:definition "データ・カタログは、データセットに関するキュレートされたメタデータの集合です。"@ja , "Řízená kolekce metadat o datových sadách a datových službách."@cs , "Una raccolta curata di metadati sulle risorse (ad es. sui dataset e relativi servizi nel contesto di cataloghi di dati)."@it , "مجموعة من توصيفات قوائم البيانات"@ar , "Una colección curada de metadatos sobre recursos (por ejemplo, conjuntos de datos y servicios de datos en el contexto de un catálogo de datos)."@es , "Μια επιμελημένη συλλογή μεταδεδομένων περί συνόλων δεδομένων."@el , "Une collection élaborée de métadonnées sur les jeux de données."@fr , "En samling af metadata om ressourcer (fx datasæt og datatjenester i kontekst af et datakatalog)."@da , "A curated collection of metadata about resources (e.g., datasets and data services in the context of a data catalog)."@en ; + skos:editorialNote "English, Italian, Spanish definitions updated in this revision. Multilingual text not yet updated."@en ; + skos:scopeNote "Normalmente, un catálogo de datos disponible en la web se representa como una única instancia de esta clase."@es , "Et webbaseret datakatalog repræsenteres typisk ved en enkelt instans af denne klasse."@da , "Συνήθως, ένας κατάλογος δεδομένων στον Παγκόσμιο Ιστό αναπαρίσταται ως ένα στιγμιότυπο αυτής της κλάσης."@el , "Webový datový katalog je typicky reprezentován jako jedna instance této třídy."@cs , "A web-based data catalog is typically represented as a single instance of this class."@en , "Normalmente, un catalogo di dati nel web viene rappresentato come una singola istanza di questa classe."@it , "通常、ウェブ・ベースのデータ・カタログは、このクラスの1つのインスタンスとして表わされます。"@ja . + +prov:editorialNote rdf:type owl:AnnotationProperty ; + rdfs:comment "A note by the OWL development team about how this term expresses the PROV-DM concept, or how it should be used in context of semantic web or linked data."@en ; + rdfs:isDefinedBy . + +vcard:None rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "None"@en ; + rdfs:subClassOf vcard:Gender . + +spdx:ExtractedLicensingInfo + rdf:type owl:Class ; + rdfs:comment "An ExtractedLicensingInfo represents a license or licensing notice that was found in a package, file or snippet. Any license text that is recognized as a license may be represented as a License rather than an ExtractedLicensingInfo."@en ; + rdfs:subClassOf spdx:SimpleLicensingInfo ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:extractedText ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable" . + +[ rdf:type owl:Axiom ; + rdfs:comment "Derivation is a particular case of trace (see http://www.w3.org/TR/prov-dm/#term-trace), since it links an entity to another entity that contributed to its existence." ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasDerivedFrom ; + owl:annotatedTarget prov:wasInfluencedBy +] . + +spdx:fileType_application + rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment " The file is associated with a specific application type (MIME type of application/* )"@en ; + vs:term_status "stable"@en . + +locn:addressArea rdf:type rdf:Property ; + rdfs:comment "The name or names of a geographic area or locality that groups a number of addressable objects for addressing purposes, without being an administrative unit. This would typically be part of a city, a neighbourhood or village. The domain of locn:addressArea is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "address area"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:addressArea" ; + vs:term_status "testing"@en . + +spdx:checksumAlgorithm_sha256 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA256"@en ; + vs:term_status "stable"@en . + +spdx:relationshipType_testDependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a test dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +prov:qualifiedRevision + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Entity prov:wasRevisionOf Entity :e, then it can qualify how it was revised using prov:qualifiedRevision [ a prov:Revision; prov:entity :e; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedRevision" ; + rdfs:range prov:Revision ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "revisedEntity" ; + prov:sharesDefinitionWith prov:Revision ; + prov:unqualifiedForm prov:wasRevisionOf . + +dcterms:Box rdf:type rdfs:Datatype ; + rdfs:comment "The set of regions in space defined by their geographic coordinates according to the DCMI Box Encoding Scheme."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "DCMI Box"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:url rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "url"@en ; + owl:equivalentProperty vcard:hasURL . + +spdx:Annotation rdf:type owl:Class ; + rdfs:comment "An Annotation is a comment on an SpdxItem by an agent." ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:AnnotationType ; + owl:onProperty spdx:annotationType ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:dateTime ; + owl:onProperty spdx:annotationDate ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:annotator ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +vcard:hasTelephone rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the telephone number for telephony communication with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has telephone"@en ; + owl:equivalentProperty vcard:tel . + +spdx:relationshipType_dependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +vcard:longitude rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated. See hasGeo"@en ; + rdfs:isDefinedBy ; + rdfs:label "longitude"@en ; + owl:deprecated true . + +adms:schemaAgency rdf:type owl:DatatypeProperty ; + rdfs:comment "The name of the agency that issued the identifier."@en ; + rdfs:domain adms:Identifier ; + rdfs:isDefinedBy ; + rdfs:label "schema agency"@en ; + rdfs:range rdfs:Literal . + +spdx:description rdf:type owl:DatatypeProperty ; + rdfs:comment "Provides a detailed description of the package."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +time:intervalStartedBy + rdf:type owl:ObjectProperty ; + rdfs:comment "If a proper interval T1 is intervalStarted another proper interval T2, then the beginning of T1 is coincident with the beginning of T2, and the end of T1 is after the end of T2."@en , "Si un intervalo propio T1 es empezado por otro intervalo propio T2, entonces el principio de T1 coincide con el principio de T2, y el final de T1 es posterior al final de T2."@es ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval started by"@en ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalStarts ; + skos:definition "If a proper interval T1 is intervalStarted another proper interval T2, then the beginning of T1 is coincident with the beginning of T2, and the end of T1 is after the end of T2."@en , "Si un intervalo propio T1 es empezado por otro intervalo propio T2, entonces el principio de T1 coincide con el principio de T2, y el final de T1 es posterior al final de T2."@es . + +dcterms:Location rdf:type rdfs:Class ; + rdfs:comment "A spatial region or named place."@en , "dcterms:Location class fully represents the ISA Programme Location Core Vocabulary class of Location."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Location"@en ; + rdfs:subClassOf dcterms:LocationPeriodOrJurisdiction ; + dcterms:identifier "dcterms:Location" ; + dcterms:issued "2008-01-14"^^xsd:date ; + vann:usageNote "This is the key class for the ISA Programme Location Core Vocabulary and represents any location, irrespective of size or other restriction."@en ; + vs:term_status "testing"@en . + +skos:notation rdf:type owl:DatatypeProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "notation"@en ; + skos:definition "A notation, also known as classification code, is a string of characters such as \"T58.5\" or \"303.4833\" used to uniquely identify a concept within the scope of a given concept scheme."@en ; + skos:scopeNote "By convention, skos:notation is used with a typed literal in the object position of the triple."@en . + +vcard:hasLogo rdf:type owl:ObjectProperty ; + rdfs:comment "To specify a graphic image of a logo associated with the object "@en ; + rdfs:isDefinedBy ; + rdfs:label "has logo"@en ; + owl:equivalentProperty vcard:logo . + +prov:qualifiedDelegation + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Agent prov:actedOnBehalfOf Agent :ag, then it can qualify how with prov:qualifiedResponsibility [ a prov:Responsibility; prov:agent :ag; :foo :bar ]."@en ; + rdfs:domain prov:Agent ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedDelegation" ; + rdfs:range prov:Delegation ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:inverse "qualifiedDelegationOf" ; + prov:sharesDefinitionWith prov:Delegation ; + prov:unqualifiedForm prov:actedOnBehalfOf . + +dcterms:isVersionOf rdf:type rdf:Property ; + rdfs:comment "A related resource of which the described resource is a version, edition, or adaptation."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Is Version Of"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "Changes in version imply substantive changes in content rather than differences in format. This property is intended to be used with non-literal values. This property is an inverse property of Has Version."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +time:inTemporalPosition + rdf:type owl:ObjectProperty ; + rdfs:comment "Position of a time instant"@en , "Posición de un instante de tiempo."@es ; + rdfs:domain time:Instant ; + rdfs:label "Temporal position"@en , "posición temporal"@es ; + rdfs:range time:TemporalPosition ; + skos:definition "Position of a time instant"@en , "Posición de un instante de tiempo."@es . + +time:second rdf:type owl:DatatypeProperty ; + rdfs:comment "Second position in a calendar-clock system."@en , "Posición de segundo en un sistema calendario-reloj."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "second"@en , "segundo"@es ; + rdfs:range xsd:decimal . + +dcat:Distribution rdf:type owl:Class , rdfs:Class ; + rdfs:comment "En specifik repræsentation af et datasæt. Et datasæt kan være tilgængelig i mange serialiseringer der kan variere på forskellige vis, herunder sprog, medietype eller format, systemorganisering, tidslig- og geografisk opløsning, detaljeringsniveau eller profiler (der kan specificere en eller flere af ovenstående)."@da , "Représente une forme spécifique d'un jeu de données. Caque jeu de données peut être disponible sous différentes formes, celles-ci pouvant représenter différents formats du jeu de données ou différents endpoint. Des exemples de distribution sont des fichirs CSV, des API ou des flux RSS."@fr , "Αναπαριστά μία συγκεκριμένη διαθέσιμη μορφή ενός συνόλου δεδομένων. Κάθε σύνολο δεδομενων μπορεί να είναι διαθέσιμο σε διαφορετικές μορφές, οι μορφές αυτές μπορεί να αναπαριστούν διαφορετικές μορφές αρχείων ή διαφορετικά σημεία διάθεσης. Παραδείγματα διανομών συμπεριλαμβάνουν ένα μεταφορτώσιμο αρχείο μορφής CSV, ένα API ή ένα RSS feed."@el , "شكل محدد لقائمة البيانات يمكن الوصول إليه. قائمة بيانات ما يمكن أن تكون متاحه باشكال و أنواع متعددة. ملف يمكن تحميله أو واجهة برمجية يمكن من خلالها الوصول إلى البيانات هي أمثلة على ذلك."@ar , "Konkrétní reprezentace datové sady. Datová sada může být dostupná v různých serializacích, které se mohou navzájem lišit různými způsoby, mimo jiné přirozeným jazykem, media-typem či formátem, schematickou organizací, časovým a prostorovým rozlišením, úrovní detailu či profily (které mohou specifikovat některé či všechny tyto rozdíly)."@cs , "データセットの特定の利用可能な形式を表わします。各データセットは、異なる形式で利用できることがあり、これらの形式は、データセットの異なる形式や、異なるエンドポイントを表わす可能性があります。配信の例には、ダウンロード可能なCSVファイル、API、RSSフィードが含まれます。"@ja , "Rappresenta una forma disponibile e specifica del dataset. Ciascun dataset può essere disponibile in forme differenti, che possono rappresentare formati diversi o diversi punti di accesso per un dataset. Esempi di distribuzioni sono un file CSV scaricabile, una API o un RSS feed."@it , "A specific representation of a dataset. A dataset might be available in multiple serializations that may differ in various ways, including natural language, media-type or format, schematic organization, temporal and spatial resolution, level of detail or profiles (which might specify any or all of the above)."@en , "Una representación específica de los datos. Cada conjunto de datos puede estar disponible en formas diferentes, las cuáles pueden variar en distintas formas, incluyendo el idioma, 'media-type' o formato, organización esquemática, resolución temporal y espacial, nivel de detalle o perfiles (que pueden especificar cualquiera o todas las diferencias anteriores)."@es ; + rdfs:isDefinedBy ; + rdfs:label "التوزيع"@ar , "Διανομή"@el , "Distribuce"@cs , "Distribuzione"@it , "配信"@ja , "Distribution"@en , "Distribution"@fr , "Distribution"@da , "Distribución"@es ; + skos:altLabel "Datamanifestation"@da , "Datarepræsentation"@da , "Dataudstilling"@da , "Datadistribution"@da ; + skos:definition "Konkrétní reprezentace datové sady. Datová sada může být dostupná v různých serializacích, které se mohou navzájem lišit různými způsoby, mimo jiné přirozeným jazykem, media-typem či formátem, schematickou organizací, časovým a prostorovým rozlišením, úrovní detailu či profily (které mohou specifikovat některé či všechny tyto rozdíly)."@cs , "Rappresenta una forma disponibile e specifica del dataset. Ciascun dataset può essere disponibile in forme differenti, che possono rappresentare formati diversi o diversi punti di accesso per un dataset. Esempi di distribuzioni sono un file CSV scaricabile, una API o un RSS feed."@it , "Una representación específica de los datos. Cada conjunto de datos puede estar disponible en formas diferentes, las cuáles pueden variar en distintas formas, incluyendo el idioma, 'media-type' o formato, organización esquemática, resolución temporal y espacial, nivel de detalle o perfiles (que pueden especificar cualquiera o todas las diferencias anteriores)."@es , "Représente une forme spécifique d'un jeu de données. Caque jeu de données peut être disponible sous différentes formes, celles-ci pouvant représenter différents formats du jeu de données ou différents endpoint. Des exemples de distribution sont des fichirs CSV, des API ou des flux RSS."@fr , "A specific representation of a dataset. A dataset might be available in multiple serializations that may differ in various ways, including natural language, media-type or format, schematic organization, temporal and spatial resolution, level of detail or profiles (which might specify any or all of the above)."@en , "Αναπαριστά μία συγκεκριμένη διαθέσιμη μορφή ενός συνόλου δεδομένων. Κάθε σύνολο δεδομενων μπορεί να είναι διαθέσιμο σε διαφορετικές μορφές, οι μορφές αυτές μπορεί να αναπαριστούν διαφορετικές μορφές αρχείων ή διαφορετικά σημεία διάθεσης. Παραδείγματα διανομών συμπεριλαμβάνουν ένα μεταφορτώσιμο αρχείο μορφής CSV, ένα API ή ένα RSS feed."@el , "データセットの特定の利用可能な形式を表わします。各データセットは、異なる形式で利用できることがあり、これらの形式は、データセットの異なる形式や、異なるエンドポイントを表わす可能性があります。配信の例には、ダウンロード可能なCSVファイル、API、RSSフィードが含まれます。"@ja , "شكل محدد لقائمة البيانات يمكن الوصول إليه. قائمة بيانات ما يمكن أن تكون متاحه باشكال و أنواع متعددة. ملف يمكن تحميله أو واجهة برمجية يمكن من خلالها الوصول إلى البيانات هي أمثلة على ذلك."@ar , "En specifik repræsentation af et datasæt. Et datasæt kan være tilgængelig i mange serialiseringer der kan variere på forskellige vis, herunder sprog, medietype eller format, systemorganisering, tidslig- og geografisk opløsning, detaljeringsniveau eller profiler (der kan specificere en eller flere af ovenstående)."@da ; + skos:scopeNote "Esta clase representa una disponibilidad general de un conjunto de datos, e implica que no existe información acerca del método de acceso real a los datos, i.e., si es un enlace de descarga directa o a través de una página Web."@es , "これは、データセットの一般的な利用可能性を表わし、データの実際のアクセス方式に関する情報(つまり、直接ダウンロードなのか、APIなのか、ウェブページを介したものなのか)を意味しません。dcat:downloadURLプロパティーの使用は、直接ダウンロード可能な配信を意味します。"@ja , "Ceci représente une disponibilité générale du jeu de données, et implique qu'il n'existe pas d'information sur la méthode d'accès réelle des données, par exple, si c'est un lien de téléchargement direct ou à travers une page Web."@fr , "Denne klasse repræsenterer datasættets overordnede tilgængelighed og giver ikke oplysninger om hvilken metode der kan anvendes til at få adgang til data, dvs. om adgang til datasættet realiseres ved direkte download, API eller via et websted. Anvendelsen af egenskaben dcat:downloadURL indikerer at distributionen kan downloades direkte."@da , "Αυτό αναπαριστά μία γενική διαθεσιμότητα ενός συνόλου δεδομένων και δεν υπονοεί τίποτα περί του πραγματικού τρόπου πρόσβασης στα δεδομένα, αν είναι άμεσα μεταφορτώσιμα, μέσω API ή μέσω μίας ιστοσελίδας. Η χρήση της ιδιότητας dcat:downloadURL δείχνει μόνο άμεσα μεταφορτώσιμες διανομές."@el , "This represents a general availability of a dataset it implies no information about the actual access method of the data, i.e. whether by direct download, API, or through a Web page. The use of dcat:downloadURL property indicates directly downloadable distributions."@en , "Toto popisuje obecnou dostupnost datové sady. Neimplikuje žádnou informaci o skutečné metodě přístupu k datům, tj. zda jsou přímo ke stažení, skrze API či přes webovou stránku. Použití vlastnosti dcat:downloadURL indikuje přímo stažitelné distribuce."@cs , "Questa classe rappresenta una disponibilità generale di un dataset e non implica alcuna informazione sul metodo di accesso effettivo ai dati, ad esempio se si tratta di un accesso a download diretto, API, o attraverso una pagina Web. L'utilizzo della proprietà dcat:downloadURL indica distribuzioni direttamente scaricabili."@it . + +vcard:hasAdditionalName + rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the additional name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has additional name"@en . + +[ rdf:type owl:Axiom ; + rdfs:comment "Revision is a derivation (see http://www.w3.org/TR/prov-dm/#term-Revision). Moreover, according to \nhttp://www.w3.org/TR/2013/REC-prov-constraints-20130430/#term-Revision 23 April 2012 'wasRevisionOf is a strict sub-relation of wasDerivedFrom since two entities e2 and e1 may satisfy wasDerivedFrom(e2,e1) without being a variant of each other.'" ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasRevisionOf ; + owl:annotatedTarget prov:wasDerivedFrom +] . + +locn:thoroughfare rdf:type rdf:Property ; + rdfs:comment "An address component that represents the name of a passage or way through from one location to another. A thoroughfare is not necessarily a road, it might be a waterway or some other feature. The domain of locn:thoroughfare is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "thoroughfare"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:thoroughfare" ; + vs:term_status "testing"@en . + +locn:Address rdf:type rdfs:Class ; + rdfs:comment "An \"address representation\" as conceptually defined by the INSPIRE Address Representation data type. The locn:addressId property may be used to link this locn:Address to other representations."@en ; + rdfs:isDefinedBy ; + rdfs:label "Address"@en ; + dcterms:identifier "locn:Address" ; + vs:term_status "testing"@en ; + wdsr:describedby . + +dcat:mediaType rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "Il tipo di media della distribuzione come definito da IANA"@it , "このプロパティーは、配信のメディア・タイプがIANAで定義されているときに使用すべきで(SHOULD)、そうでない場合には、dct:formatを様々な値と共に使用できます(MAY)。"@ja , "Η ιδιότητα αυτή ΘΑ ΠΡΕΠΕΙ να χρησιμοποιείται όταν ο τύπος μέσου μίας διανομής είναι ορισμένος στο IANA, αλλιώς η ιδιότητα dct:format ΔΥΝΑΤΑΙ να χρησιμοποιηθεί με διαφορετικές τιμές."@el , "Cette propriété doit être utilisée quand c'est définit le type de média de la distribution en IANA, sinon dct:format DOIT être utilisé avec différentes valeurs."@fr , "The media type of the distribution as defined by IANA"@en , "يجب استخدام هذه الخاصية إذا كان نوع الملف معرف ضمن IANA"@ar , "Medietypen for distributionen som den er defineret af IANA."@da , "Typ média distribuce definovaný v IANA."@cs , "Esta propiedad debe ser usada cuando está definido el tipo de media de la distribución en IANA, de otra manera dct:format puede ser utilizado con diferentes valores"@es ; + rdfs:domain dcat:Distribution ; + rdfs:isDefinedBy ; + rdfs:label "tipo de media"@es , "media type"@en , "نوع الميديا"@ar , "typ média"@cs , "メディア・タイプ"@ja , "type de média"@fr , "τύπος μέσου"@el , "medietype"@da , "tipo di media"@it ; + rdfs:range dcterms:MediaType ; + rdfs:subPropertyOf dcterms:format ; + skos:changeNote "Obor hodnot dcat:mediaType byl zúžen v této revizi DCAT."@cs , "Il range di dcat:mediaType è stato ristretto come parte della revisione di DCAT."@it , "The range of dcat:mediaType has been tightened as part of the revision of DCAT."@en ; + skos:definition "يجب استخدام هذه الخاصية إذا كان نوع الملف معرف ضمن IANA"@ar , "Η ιδιότητα αυτή ΘΑ ΠΡΕΠΕΙ να χρησιμοποιείται όταν ο τύπος μέσου μίας διανομής είναι ορισμένος στο IANA, αλλιώς η ιδιότητα dct:format ΔΥΝΑΤΑΙ να χρησιμοποιηθεί με διαφορετικές τιμές."@el , "Cette propriété doit être utilisée quand c'est définit le type de média de la distribution en IANA, sinon dct:format DOIT être utilisé avec différentes valeurs."@fr , "Esta propiedad debe ser usada cuando está definido el tipo de media de la distribución en IANA, de otra manera dct:format puede ser utilizado con diferentes valores."@es , "Il tipo di media della distribuzione come definito da IANA."@it , "The media type of the distribution as defined by IANA."@en , "このプロパティーは、配信のメディア・タイプがIANAで定義されているときに使用すべきで(SHOULD)、そうでない場合には、dct:formatを様々な値と共に使用できます(MAY)。"@ja , "Typ média distribuce definovaný v IANA."@cs , "Medietypen for distributionen som den er defineret af IANA."@da ; + skos:editorialNote "Status: English Definition text modified by DCAT revision team, Italian and Czech translation provided, other translations pending. Note some inconsistency on def vs. usage."@en ; + skos:scopeNote "Questa proprietà DEVE essere usata quando il tipo di media della distribuzione è definito nel registro dei tipi di media IANA https://www.iana.org/assignments/media-types/, altrimenti dct:format PUO 'essere usato con differenti valori."@it , "Tato vlastnost BY MĚLA být použita, je-li typ média distribuce definován v registru IANA https://www.iana.org/assignments/media-types/. V ostatních případech MŮŽE být použita vlastnost dct:format s jinými hodnotami."@cs , "Esta propiedad DEBERÍA usarse cuando el 'media type' de la distribución está definido en el registro IANA de 'media types' https://www.iana.org/assignments/media-types/, de lo contrario, dct:format PUEDE usarse con distintos valores."@es , "This property SHOULD be used when the media type of the distribution is defined in the IANA media types registry https://www.iana.org/assignments/media-types/, otherwise dct:format MAY be used with different values."@en , "Denne egenskab BØR anvendes hvis distributionens medietype optræder i 'IANA media types registry' https://www.iana.org/assignments/media-types/, ellers KAN egenskaben dct:format anvendes med et andet udfaldsrum."@da . + +prov:qualifiedUsage rdf:type owl:ObjectProperty ; + rdfs:comment "If this Activity prov:used Entity :e, then it can qualify how it used it using prov:qualifiedUsage [ a prov:Usage; prov:entity :e; :foo :bar ]."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedUsage" ; + rdfs:range prov:Usage ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:inverse "qualifiedUsingActivity" ; + prov:sharesDefinitionWith prov:Usage ; + prov:unqualifiedForm prov:used . + +dcterms:AgentClass rdf:type rdfs:Class ; + rdfs:comment "A group of agents."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Agent Class"@en ; + rdfs:subClassOf rdfs:Class ; + dcterms:issued "2008-01-14"^^xsd:date . + +prov:Collection rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Collection" ; + rdfs:subClassOf prov:Entity ; + prov:category "expanded" ; + prov:component "collections" ; + prov:definition "A collection is an entity that provides a structure to some constituents, which are themselves entities. These constituents are said to be member of the collections."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-collection"^^xsd:anyURI . + +dcterms:W3CDTF rdf:type rdfs:Datatype ; + rdfs:comment "The set of dates and times constructed according to the W3C Date and Time Formats Specification."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "W3C-DTF"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:checksumAlgorithm_sha3_384 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA3-384."@en ; + vs:term_status "stable"@en . + +spdx:relationshipType_dynamicLink + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A dynamically links to SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:License rdf:type owl:Class ; + rdfs:comment "A License represents a copyright license. The SPDX license list website is annotated with these properties (using RDFa) to allow license data published there to be easily processed. The license list is populated in accordance with the License List fields guidelines. These guidelines are not normative and may change over time. SPDX tooling should not rely on values in the license list conforming to the current guidelines."@en ; + rdfs:subClassOf spdx:SimpleLicensingInfo ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:standardLicenseHeaderTemplate + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:standardLicenseHeader + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:isDeprecatedLicenseId + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:standardLicenseTemplate + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:isOsiApproved ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:isFsfLibre + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseText ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +vcard:post-office-box + rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "post office box"@en ; + owl:deprecated true . + +time:hasTemporalDuration + rdf:type owl:ObjectProperty ; + rdfs:comment "Duration of a temporal entity."@en , "Duración de una entidad temporal."@es ; + rdfs:domain time:TemporalEntity ; + rdfs:label "has temporal duration"@en , "tiene duración temporal"@es ; + rdfs:range time:TemporalDuration ; + skos:definition "Duration of a temporal entity."@en , "Duración de una entidad temporal."@es . + + + rdfs:label "RDF/XML version of the ISA Programme Location Core Vocabulary"@en ; + dcterms:format ; + dcat:mediaType "application/rdf+xml"^^dcterms:IMT . + +prov:Start rdf:type owl:Class ; + rdfs:comment "An instance of prov:Start provides additional descriptions about the binary prov:wasStartedBy relation from some started prov:Activity to an prov:Entity that started it. For example, :foot_race prov:wasStartedBy :bang; prov:qualifiedStart [ a prov:Start; prov:entity :bang; :foo :bar; prov:atTime '2012-03-09T08:05:08-05:00'^^xsd:dateTime ] ."@en ; + rdfs:isDefinedBy ; + rdfs:label "Start" ; + rdfs:subClassOf prov:EntityInfluence , prov:InstantaneousEvent ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Start is when an activity is deemed to have been started by an entity, known as trigger. The activity did not exist before its start. Any usage, generation, or invalidation involving an activity follows the activity's start. A start may refer to a trigger entity that set off the activity, or to an activity, known as starter, that generated the trigger."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Start"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Start"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasStartedBy . + +spdx:extractedText rdf:type owl:DatatypeProperty ; + rdfs:comment "Provide a copy of the actual text of the license reference extracted from the package, file or snippet that is associated with the License Identifier to aid in future analysis."@en ; + rdfs:domain spdx:ExtractedLicensingInfo ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +dcterms:tableOfContents + rdf:type rdf:Property ; + rdfs:comment "A list of subunits of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Table Of Contents"@en ; + rdfs:subPropertyOf dc:description , dcterms:description ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:range rdf:type owl:ObjectProperty ; + rdfs:comment "This field defines the byte range in the original host file (in X.2) that the snippet information applies to"@en ; + rdfs:domain spdx:Snippet ; + rdfs:range ; + vs:term_status "stable"@en . + +time:unitHour rdf:type time:TemporalUnit ; + rdfs:label "Hour (unit of temporal duration)"@en ; + skos:prefLabel "один час\"@ru" , "一時間"@jp , "godzina"@pl , "Stunde"@de , "一小時"@zh , "한 시간"@kr , "hora"@es , "hora"@pt , "ora"@it , "hour"@en , "ساعة واحدة"@ar , "uur"@nl , "heure"@fr ; + time:days "0"^^xsd:decimal ; + time:hours "1"^^xsd:decimal ; + time:minutes "0"^^xsd:decimal ; + time:months "0"^^xsd:decimal ; + time:seconds "0"^^xsd:decimal ; + time:weeks "0"^^xsd:decimal ; + time:years "0"^^xsd:decimal . + +prov:specializationOf + rdf:type owl:ObjectProperty , owl:AnnotationProperty ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "specializationOf" ; + rdfs:range prov:Entity ; + rdfs:seeAlso prov:alternateOf ; + rdfs:subPropertyOf prov:alternateOf ; + prov:category "expanded" ; + prov:component "alternate" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "An entity that is a specialization of another shares all aspects of the latter, and additionally presents more specific aspects of the same thing as the latter. In particular, the lifetime of the entity being specialized contains that of any specialization. Examples of aspects include a time period, an abstraction, and a context associated with the entity."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-specialization"^^xsd:anyURI ; + prov:inverse "generalizationOf" ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-specialization"^^xsd:anyURI . + +prov:qualifiedInfluence + rdf:type owl:ObjectProperty ; + rdfs:comment "Because prov:qualifiedInfluence is a broad relation, the more specific relations (qualifiedCommunication, qualifiedDelegation, qualifiedEnd, etc.) should be used when applicable."@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Activity prov:Agent prov:Entity ) + ] ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedInfluence" ; + rdfs:range prov:Influence ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "qualifiedInfluenceOf" ; + prov:sharesDefinitionWith prov:Influence ; + prov:unqualifiedForm prov:wasInfluencedBy . + +vcard:country-name rdf:type owl:DatatypeProperty ; + rdfs:comment "The country name associated with the address of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "country name"@en ; + rdfs:range xsd:string . + +vcard:Other rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Other"@en ; + rdfs:subClassOf vcard:Gender . + + + rdf:type sh:NodeShape ; + sh:name "Identifier"@en ; + sh:property [ sh:maxCount 1 ; + sh:path skos:notation ; + sh:severity sh:Violation + ] ; + sh:targetClass adms:Identifier . + +spdx:Purpose rdf:type owl:Class ; + rdfs:comment "Package Purpose is intrinsic to how the package is being used rather than the content of the package." ; + vs:term_status "stable" . + +spdx:isWayBackLink rdf:type owl:DatatypeProperty ; + rdfs:comment "True if the License SeeAlso URL points to a Wayback archive"@en ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:boolean . + +time:month rdf:type owl:DatatypeProperty ; + rdfs:comment "Month position in a calendar-clock system.\n\nThe range of this property is not specified, so can be replaced by any specific representation of a calendar month from any calendar. "@en , "Posición de mes en un sistema calendario-reloj.\n El rango de esta propiedad no está especificado, por tanto, se puede reemplazar por cualquier representación específica de un mes de calendario de un calendario cualquiera."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "month"@en , "mes"@es ; + skos:definition "Month position in a calendar-clock system.\n\nThe range of this property is not specified, so can be replaced by any specific representation of a calendar month from any calendar. "@en , "Posición de mes en un sistema calendario-reloj.\n El rango de esta propiedad no está especificado, por tanto, se puede reemplazar por cualquier representación específica de un mes de calendario de un calendario cualquiera."@es . + +time:seconds rdf:type owl:DatatypeProperty ; + rdfs:comment "length of, or element of the length of, a temporal extent expressed in seconds"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en segundos."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "seconds duration"@en , "duración en segundos"@es ; + rdfs:range xsd:decimal ; + rdfs:seeAlso . + +vcard:Agent rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Agent"@en ; + rdfs:subClassOf vcard:RelatedType . + +vcard:hasCalendarRequest + rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the calendar user address to which a scheduling request be sent for the object. (Was called CALADRURI in RFC6350)"@en ; + rdfs:isDefinedBy ; + rdfs:label "has calendar request"@en . + +dcterms:UDC rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of conceptual resources specified by the Universal Decimal Classification."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "UDC"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +locn:location rdf:type rdf:Property ; + rdfs:comment "The location property links any resource to the Location Class. Asserting the location relationship implies only that the domain has some connection to a Location in time or space. It does not imply that the resource is necessarily at that location at the time when the assertion is made."@en ; + rdfs:isDefinedBy ; + rdfs:label "location"@en ; + rdfs:range dcterms:Location ; + dcterms:identifier "locn:location" ; + vs:term_status "testing"@en . + +spdx:relationshipType_prerequisiteFor + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a prerequisite for SPDXRef-B"@en ; + vs:term_status "stable"@en . + +spdx:checksumAlgorithm_blake2b512 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was BLAKE2b-512."@en ; + vs:term_status "stable"@en . + +spdx:describesPackage + rdf:type owl:ObjectProperty ; + rdfs:comment "The describesPackage property relates an SpdxDocument to the package which it describes."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range spdx:Package ; + vs:term_status "stable"@en . + +vcard:hasName rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the components of the name of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has name"@en ; + rdfs:range vcard:Name ; + owl:equivalentProperty vcard:n . + +spdx:purpose_file rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package is a single file which can be independently distributed (configuration file, statically linked binary, Kubernetes deployment, etc)."@en ; + vs:term_status "stable"@en . + +time:day rdf:type owl:DatatypeProperty ; + rdfs:comment "Day position in a calendar-clock system.\n\nThe range of this property is not specified, so can be replaced by any specific representation of a calendar day from any calendar. "@en , "Posición de día en un sistema calendario-reloj."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "day"@en , "día"@es ; + skos:definition "Day position in a calendar-clock system.\n\nThe range of this property is not specified, so can be replaced by any specific representation of a calendar day from any calendar. "@en , "Posición de día en un sistema calendario-reloj.\n\nEl rango de esta propiedad no está especificado, por tanto, se puede reemplazar por una representación específica de un día de calendario de cualquier calendario."@es . + +dcterms:medium rdf:type rdf:Property ; + rdfs:comment "The material or physical carrier of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Medium"@en ; + rdfs:subPropertyOf dc:format , dcterms:format ; + dcam:domainIncludes dcterms:PhysicalResource ; + dcam:rangeIncludes dcterms:PhysicalMedium ; + dcterms:issued "2000-07-11"^^xsd:date . + + + rdf:type voaf:Vocabulary , owl:Ontology ; + rdfs:comment "This is a new version of the final draft published by the European Commission in May 2012, revised according to the results of the ISA Core Location Pilot (see Section Change History for the list of changes). It is currently under the control of the Locations and Addresses Community Group, but is not under active development or review. Comments and queries should be sent to that group via public-locadd@w3.org. Terms defined here may be deprecated by that or future groups but will not disappear or their definition change."@en ; + rdfs:label "ISA Programme Location Core Vocabulary"@en ; + cc:attributionName "European Commission"@en ; + cc:attributionURL ; + dcterms:abstract "The ISA Programme Location Core Vocabulary provides a minimum set of classes and properties for describing any place in terms of its name, address or geometry. The vocabulary is specifically designed to aid the publication of data that is interoperable with EU INSPIRE Directive. It is closely integrated with the Business and Person Core Vocabularies of the EU ISA Programme, now available in W3C space as, respectively, the Registered Organization vocabulary and ISA Person Core Vocabulary."@en ; + dcterms:conformsTo ; + dcterms:hasFormat , , ; + dcterms:issued "2013-11-25"^^xsd:date ; + dcterms:license ; + dcterms:mediator [ foaf:homepage ; + foaf:mbox ; + foaf:name "Locations and Addresses Community Group" + ] ; + dcterms:modified "2015-03-23"^^xsd:date ; + dcterms:rights "Copyright © European Union, 2012-2015."@en ; + dcterms:title "ISA Programme Location Core Vocabulary"@en ; + vann:changes "\n2015-03-23: Updates in the namespace document and in the RDF/XML and Turtle schemas:\n- Fixed copyright notice.\n- Added class and property diagram.\n- Updated GeoSPARQL (a) namespace URIs and (b) datatype names in the examples of property locn:geometry, based on version 1.0 of the GeoSPARQL specification, and added a note in the examples.\n - prefix ogc (http://www.opengis.net/rdf#) replaced with gsp (http://www.opengis.net/ont/geosparql#) and sf (http://www.opengis.net/ont/sf#)\n - ogc:WKTLiteral → gsp:wktLiteral\n - ogc:GMLLiteral → gsp:gmlLiteral\n- Added namespace declarations for all namespace prefixes used in LOCN namespace document, even though they are not used in class/property definitions.\n- Corrected the endonym of the Greek capital written in the Greek script in the definition of class locn:geographicName (Aθnνa → Αθήνα).\n- Fixed links and typos, minor revisions made to the textual descriptions.\n2013-12-21: (PhilA) Update in RDF/XML and Turtle schemas:\n- Updated voaf namespace.\n- Corrected links to different distributions of the schema.\n- Removed xml:base and used http://www/w3/org/ns/locn as the schema URI cf. original which used the namespace URI (with the final # character).\n2013-11-25: Changes since final draft version released by the EU ISA Programme Core Vocabularies Working Group (Location Task Force)\n- Revised usage note of class locn:Geometry. The text describing its recommended usage has been moved to usage note of property locn:geometry.\n- Dropped domain/range restriction for locn:geographicName.\n- Dropped domain/range restriction for locn:locatorDesignator. Free text definition updated accordingly.\n- Dropped domain/range restriction for locn:locatorName. Free text definition updated accordingly.\n- Corrected free text definition of property locn:geometry (its domain is \"any resource\", and not a \"location\").\n- Revised usage note of property locn:geometry to include text about recommended usage, formerly included in the usage note of class locn:Geometry.\n- Revised usage note and examples of property locn:geometry to include support to geocoded URIs (e.g., geo URIs, GeoHash URIs).\n- Added term status. All terms have been set to \"testing\", with the exception of class locn:Geometry and properties rdfs:seeAlso (geographic identifier) and locn:addressId.\n- Renamed subject in Turtle examples (ex:a → :Resource).\n- Fixed links and typos, minor revisions made to the textual descriptions.\n "@en ; + vann:preferredNamespacePrefix "locn" ; + vann:preferredNamespaceUri "http://www.w3.org/ns/locn#"^^xsd:anyURI ; + voaf:classNumber "3"^^xsd:nonNegativeInteger ; + voaf:propertyNumber "16"^^xsd:nonNegativeInteger ; + voaf:reliesOn dcterms: , rdfs: ; + rec:editor [ rdfs:seeAlso ; + sdo:affiliation [ foaf:homepage ; + foaf:name "European Commission - Joint Research Centre (JRC)"@en + ] ; + foaf:homepage ; + foaf:name "Andrea Perego" + ] ; + rec:editor [ rdfs:seeAlso ; + sdo:affiliation [ foaf:homepage ; + foaf:name "W3C/ERCIM" + ] ; + foaf:homepage ; + foaf:name "Phil Archer" + ] ; + rec:editor [ sdo:affiliation [ foaf:homepage ; + foaf:name "European Commission - Joint Research Centre (JRC)"@en + ] ; + foaf:name "Michael Lutz" + ] ; + owl:versionInfo "First version in w3.org/ns space"@en ; + wdsr:describedby ; + foaf:depiction ; + foaf:maker [ foaf:homepage ; + foaf:name "EU ISA Programme Core Vocabularies Working Group (Location Task Force)" + ] . + +vcard:Met rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Met"@en ; + rdfs:subClassOf vcard:RelatedType . + +skos:exactMatch rdf:type owl:ObjectProperty , owl:SymmetricProperty , owl:TransitiveProperty , rdf:Property ; + rdfs:comment "skos:exactMatch is disjoint with each of the properties skos:broadMatch and skos:relatedMatch."@en ; + rdfs:isDefinedBy ; + rdfs:label "has exact match"@en ; + rdfs:subPropertyOf skos:closeMatch ; + skos:definition "skos:exactMatch is used to link two concepts, indicating a high degree of confidence that the concepts can be used interchangeably across a wide range of information retrieval applications. skos:exactMatch is a transitive property, and is a sub-property of skos:closeMatch."@en . + +vcard:hasRelated rdf:type owl:ObjectProperty ; + rdfs:comment "To specify a relationship between another entity and the entity represented by this object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has related"@en . + +vcard:Text rdf:type owl:Class ; + rdfs:comment "Also called sms telephone"@en ; + rdfs:isDefinedBy ; + rdfs:label "Text"@en ; + rdfs:subClassOf vcard:TelephoneType . + +time:intervalOverlappedBy + rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 es 'intervalo solapado por' otro intervalo propio T2, entonces el principio de T1 es posterior al principio de T2, y el principio de T1 es anterior al final de T2, y el final de T1 es posterior al final de T2."@es , "If a proper interval T1 is intervalOverlappedBy another proper interval T2, then the beginning of T1 is after the beginning of T2, the beginning of T1 is before the end of T2, and the end of T1 is after the end of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo solapado por"@es , "interval overlapped by"@en ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalOverlaps ; + skos:definition "If a proper interval T1 is intervalOverlappedBy another proper interval T2, then the beginning of T1 is after the beginning of T2, the beginning of T1 is before the end of T2, and the end of T1 is after the end of T2."@en , "Si un intervalo propio T1 es 'intervalo solapado por' otro intervalo propio T2, entonces el principio de T1 es posterior al principio de T2, y el principio de T1 es anterior al final de T2, y el final de T1 es posterior al final de T2."@es . + +spdx:relationshipType_dependencyManifestOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a manifest file that lists a set of dependencies for SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:fileType_binary rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "Indicates the file is not a text file. spdx:filetype_archive is preferred for archive files even though they are binary."@en ; + vs:term_status "stable"@en . + +vcard:class rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "class"@en ; + owl:deprecated true . + +dcterms:IMT rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of media types specified by the Internet Assigned Numbers Authority."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "IMT"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +prov:qualifiedEnd rdf:type owl:ObjectProperty ; + rdfs:comment "If this Activity prov:wasEndedBy Entity :e1, then it can qualify how it was ended using prov:qualifiedEnd [ a prov:End; prov:entity :e1; :foo :bar ]."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedEnd" ; + rdfs:range prov:End ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:inverse "qualifiedEndOf" ; + prov:sharesDefinitionWith prov:End ; + prov:unqualifiedForm prov:wasEndedBy . + +prov:alternateOf rdf:type owl:ObjectProperty ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "alternateOf" ; + rdfs:range prov:Entity ; + rdfs:seeAlso prov:specializationOf ; + prov:category "expanded" ; + prov:component "alternate" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Two alternate entities present aspects of the same thing. These aspects may be the same or different, and the alternate entities may or may not overlap in time."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-alternate"^^xsd:anyURI ; + prov:inverse "alternateOf" ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-alternate"^^xsd:anyURI . + +vcard:hasPostalCode rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the postal code data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has postal code"@en . + +dcterms:isReplacedBy rdf:type rdf:Property ; + rdfs:comment "A related resource that supplants, displaces, or supersedes the described resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Is Replaced By"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Replaces."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:Parent rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Parent"@en ; + rdfs:subClassOf vcard:RelatedType . + +spdx:deprecatedVersion + rdf:type owl:DatatypeProperty ; + rdfs:comment "License list version where this license was decprecated"@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( spdx:ListedLicense spdx:ListedLicenseException ) + ] ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +vcard:hasCalendarLink + rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the calendar associated with the object. (Was called CALURI in RFC6350)"@en ; + rdfs:isDefinedBy ; + rdfs:label "has calendar link"@en . + +time:Friday rdf:type time:DayOfWeek ; + rdfs:label "Friday"@en ; + skos:prefLabel "Venerdì"@it , "Vendredi"@fr , "Viernes"@es , "Friday"@en , "Piątek"@pl , "Vrijdag"@nl , "Freitag"@de , "Пятница"@ru , "金曜日"@ja , "الجمعة"@ar , "星期五"@zh , "Sexta-feira"@pt . + +spdx:fileType rdf:type owl:ObjectProperty ; + rdfs:comment "The type of the file."@en ; + rdfs:domain spdx:File ; + vs:term_status "stable" . + +dcterms:type rdf:type rdf:Property ; + rdfs:comment "The nature or genre of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Type"@en ; + rdfs:subPropertyOf dc:type ; + dcterms:description "Recommended practice is to use a controlled vocabulary such as the DCMI Type Vocabulary [[DCMI-TYPE](http://dublincore.org/documents/dcmi-type-vocabulary/)]. To describe the file format, physical medium, or dimensions of the resource, use the property Format."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +prov:todo rdf:type owl:AnnotationProperty . + +prov:qualifiedQuotation + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Entity prov:wasQuotedFrom Entity :e, then it can qualify how using prov:qualifiedQuotation [ a prov:Quotation; prov:entity :e; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedQuotation" ; + rdfs:range prov:Quotation ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "qualifiedQuotationOf" ; + prov:sharesDefinitionWith prov:Quotation ; + prov:unqualifiedForm prov:wasQuotedFrom . + +prov:n rdf:type owl:AnnotationProperty ; + rdfs:comment "A reference to the principal section of the PROV-DM document that describes this concept."@en ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + +prov:wasEndedBy rdf:type owl:ObjectProperty ; + rdfs:comment "End is when an activity is deemed to have ended. An end may refer to an entity, known as trigger, that terminated the activity."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "wasEndedBy" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedEnd prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedEnd prov:entity ) ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:inverse "ended" ; + prov:qualifiedForm prov:qualifiedEnd , prov:End . + +spdx:relationshipType_metafileOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "To be used when SPDXRef-A is a metafile of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +dcterms:provenance rdf:type rdf:Property ; + rdfs:comment "A statement of any changes in ownership and custody of the resource since its creation that are significant for its authenticity, integrity, and interpretation."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Provenance"@en ; + dcam:rangeIncludes dcterms:ProvenanceStatement ; + dcterms:description "The statement may include a description of any changes successive custodians made to the resource."@en ; + dcterms:issued "2004-09-20"^^xsd:date . + +spdx:dataLicense rdf:type owl:ObjectProperty , owl:FunctionalProperty ; + rdfs:comment "Compliance with the SPDX specification includes populating the SPDX fields therein with data related to such fields (\"SPDX-Metadata\"). The SPDX specification contains numerous fields where an SPDX document creator may provide relevant explanatory text in SPDX-Metadata. Without opining on the lawfulness of \"database rights\" (in jurisdictions where applicable), such explanatory text is copyrightable subject matter in most Berne Convention countries. By using the SPDX specification, or any portion hereof, you hereby agree that any copyright rights (as determined by your jurisdiction) in any SPDX-Metadata, including without limitation explanatory text, shall be subject to the terms of the Creative Commons CC0 1.0 Universal license. For SPDX-Metadata not containing any copyright rights, you hereby agree and acknowledge that the SPDX-Metadata is provided to you \"as-is\" and without any representations or warranties of any kind concerning the SPDX-Metadata, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non-infringement, or the absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range [ rdf:type owl:Restriction ; + owl:hasValue ; + owl:onProperty spdx:dataLicense + ] ; + vs:term_status "stable" . + +vcard:agent rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "agent"@en ; + owl:deprecated true . + +spdx:relationship rdf:type owl:ObjectProperty ; + rdfs:comment "Defines a relationship between two SPDX elements. The SPDX element may be a Package, File, or SpdxDocument."@en ; + rdfs:domain spdx:SpdxElement ; + rdfs:range spdx:Relationship ; + vs:term_status "stable"@en . + +spdx:checksumAlgorithm_sha512 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was SHA512"@en ; + vs:term_status "stable"@en . + +prov:qualifiedCommunication + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Activity prov:wasInformedBy Activity :a, then it can qualify how it was influenced using prov:qualifiedCommunication [ a prov:Communication; prov:activity :a; :foo :bar ]."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedCommunication" ; + rdfs:range prov:Communication ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:inverse "qualifiedCommunicationOf" ; + prov:qualifiedForm prov:Communication ; + prov:sharesDefinitionWith prov:Communication . + +vcard:rev rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify revision information about the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "revision"@en ; + rdfs:range xsd:dateTime . + +spdx:documentation rdf:type owl:DatatypeProperty ; + rdfs:comment "Website containing the documentation related to the repository identifier"@en ; + rdfs:domain spdx:ReferenceType ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +time:before rdf:type owl:TransitiveProperty , owl:ObjectProperty ; + rdfs:comment "Asume una dirección en el tiempo. Si una entidad temporal T1 está antes que otra entidad temporal T2, entonces el final de T1 está antes que el principio de T2. Así, \"antes\" se puede considerar básica para instantes y derivada para intervalos."@es , "Gives directionality to time. If a temporal entity T1 is before another temporal entity T2, then the end of T1 is before the beginning of T2. Thus, \"before\" can be considered to be basic to instants and derived for intervals."@en ; + rdfs:domain time:TemporalEntity ; + rdfs:label "antes"@es , "before"@en ; + rdfs:range time:TemporalEntity ; + owl:inverseOf time:after ; + skos:definition "Gives directionality to time. If a temporal entity T1 is before another temporal entity T2, then the end of T1 is before the beginning of T2. Thus, \"before\" can be considered to be basic to instants and derived for intervals."@en , "Asume una dirección en el tiempo. Si una entidad temporal T1 está antes que otra entidad temporal T2, entonces el final de T1 está antes que el principio de T2. Así, \"antes\" se puede considerar básica para instantes y derivada para intervalos."@es . + +prov:Entity rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Entity" ; + owl:disjointWith prov:InstantaneousEvent ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "An entity is a physical, digital, conceptual, or other kind of thing with some fixed aspects; entities may be real or imaginary. "@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-entity"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Entity"^^xsd:anyURI . + +prov:AgentInfluence rdf:type owl:Class ; + rdfs:comment "AgentInfluence provides additional descriptions of an Agent's binary influence upon any other kind of resource. Instances of AgentInfluence use the prov:agent property to cite the influencing Agent."@en , "It is not recommended that the type AgentInfluence be asserted without also asserting one of its more specific subclasses."@en ; + rdfs:isDefinedBy ; + rdfs:label "AgentInfluence" ; + rdfs:seeAlso prov:agent ; + rdfs:subClassOf prov:Influence ; + prov:category "qualified" ; + prov:editorsDefinition "AgentInfluence is the capacity of an agent to have an effect on the character, development, or behavior of another by means of attribution, association, delegation, or other."@en . + +dcterms:created rdf:type rdf:Property ; + rdfs:comment "Date of creation of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Created"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:Cell rdf:type owl:Class ; + rdfs:comment "Also called mobile telephone"@en ; + rdfs:isDefinedBy ; + rdfs:label "Cell"@en ; + rdfs:subClassOf vcard:TelephoneType . + +prov:Location rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Location" ; + rdfs:seeAlso prov:atLocation ; + prov:category "expanded" ; + prov:definition "A location can be an identifiable geographic place (ISO 19112), but it can also be a non-geographic place such as a directory, row, or column. As such, there are numerous ways in which location can be expressed, such as by a coordinate, address, landmark, and so forth."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-attribute-location"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-attribute"^^xsd:anyURI . + +dcterms:temporal rdf:type rdf:Property ; + rdfs:comment "Temporal characteristics of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Temporal Coverage"@en ; + rdfs:subPropertyOf dc:coverage , dcterms:coverage ; + dcam:rangeIncludes dcterms:PeriodOfTime ; + dcterms:issued "2000-07-11"^^xsd:date . + + + rdf:type owl:ObjectProperty ; + rdfs:domain ; + rdfs:range ; + vs:term_status "stable"@en . + +dcat:endpointDescription + rdf:type owl:ObjectProperty ; + rdfs:comment "En beskrivelse af det pågældende tjenesteendpoint, inklusiv dets operationer, parametre etc."@da , "Una descripción del end-point del servicio, incluyendo sus operaciones, parámetros, etc."@es , "A description of the service end-point, including its operations, parameters etc."@en , "Una descrizione dell'endpoint del servizio, incluse le sue operazioni, parametri, ecc."@it , "Popis přístupového bodu služby včetně operací, parametrů apod."@cs ; + rdfs:domain dcat:DataService ; + rdfs:label "endpointbeskrivelse"@da , "descripción del end-point del servicio"@es , "description of service end-point"@en , "popis přístupového bodu služby"@cs , "descrizione dell'endpoint del servizio"@it ; + skos:changeNote "Nuova proprietà in DCAT 2.0."@it , "Nueva propiedad agregada en DCAT 2.0."@en , "Ny egenskab i DCAT 2.0."@da , "New property in DCAT 2.0."@en , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs ; + skos:definition "A description of the service end-point, including its operations, parameters etc."@en , "Una descrizione dell'endpoint del servizio, incluse le sue operazioni, parametri, ecc."@it , "En beskrivelse af det pågældende tjenesteendpoint, inklusiv dets operationer, parametre etc."@da , "Una descripción del end-point del servicio, incluyendo sus operaciones, parámetros, etc.."@es , "Popis přístupového bodu služby včetně operací, parametrů apod."@cs ; + skos:scopeNote "Una descrizione dell'endpoint può essere espressa in un formato leggibile dalla macchina, come una descrizione OpenAPI (Swagger), una risposta GetCapabilities OGC, una descrizione del servizio SPARQL, un documento OpenSearch o WSDL, una descrizione API Hydra, o con del testo o qualche altra modalità informale se una rappresentazione formale non è possibile."@it , "La descripción del endpoint brinda detalles específicos de la instancia del endpoint, mientras que dct:conformsTo se usa para indicar el estándar general o especificación que implementa el endpoint."@es , "Popis přístupového bodu dává specifické detaily jeho konkrétní instance, zatímco dct:conformsTo indikuje obecný standard či specifikaci kterou přístupový bod implementuje."@cs , "The endpoint description gives specific details of the actual endpoint instance, while dct:conformsTo is used to indicate the general standard or specification that the endpoint implements."@en , "Una descripción del endpoint del servicio puede expresarse en un formato que la máquina puede interpretar, tal como una descripción basada en OpenAPI (Swagger), una respuesta OGC GetCapabilities, una descripción de un servicio SPARQL, un documento OpenSearch o WSDL, una descripción con la Hydra API, o en texto u otro modo informal si la representación formal no es posible."@es , "La descrizione dell'endpoint fornisce dettagli specifici dell'istanza dell'endpoint reale, mentre dct:conformsTo viene utilizzato per indicare lo standard o le specifiche implementate dall'endpoint."@it , "En beskrivelse af et endpoint kan udtrykkes i et maskinlæsbart format, såsom OpenAPI (Swagger)-beskrivelser, et OGC GetCapabilities svar, en SPARQL tjenestebeskrivelse, en OpenSearch- eller et WSDL-dokument, en Hydra-API-beskrivelse, eller i tekstformat eller i et andet uformelt format, hvis en formel repræsentation ikke er mulig."@da , "Popis přístupového bodu může být vyjádřen ve strojově čitelné formě, například jako popis OpenAPI (Swagger), odpověď služby OGC getCapabilities, pomocí slovníku SPARQL Service Description, jako OpenSearch či WSDL document, jako popis API dle slovníku Hydra, a nebo textově nebo jiným neformálním způsobem, pokud není možno použít formální reprezentaci."@cs , "An endpoint description may be expressed in a machine-readable form, such as an OpenAPI (Swagger) description, an OGC GetCapabilities response, a SPARQL Service Description, an OpenSearch or WSDL document, a Hydra API description, else in text or some other informal mode if a formal representation is not possible."@en , "Endpointbeskrivelsen giver specifikke oplysninger om den konkrete endpointinstans, mens dct:conformsTo anvendes til at indikere den overordnede standard eller specifikation som endpointet er i overensstemmelse med."@da . + +vcard:Sibling rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Sibling"@en ; + rdfs:subClassOf vcard:RelatedType . + +skos:editorialNote rdf:type owl:AnnotationProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "editorial note"@en ; + rdfs:subPropertyOf skos:note ; + skos:definition "A note for an editor, translator or maintainer of the vocabulary."@en . + +[ rdf:type owl:AllDifferent ; + owl:distinctMembers ( spdx:noassertion spdx:none ) +] . + +spdx:licenseException + rdf:type owl:ObjectProperty ; + rdfs:comment "An exception to a license."@en ; + rdfs:domain spdx:WithExceptionOperator ; + rdfs:range spdx:LicenseException ; + vs:term_status "stable"@en . + +[ rdf:type owl:Axiom ; + rdfs:comment "hadPrimarySource property is a particular case of wasDerivedFrom (see http://www.w3.org/TR/prov-dm/#term-original-source) that aims to give credit to the source that originated some information." ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:hadPrimarySource ; + owl:annotatedTarget prov:wasDerivedFrom +] . + +spdx:creator rdf:type owl:DatatypeProperty ; + rdfs:comment "Identify who (or what, in the case of a tool) created the SPDX document. If the SPDX document was created by an individual, indicate the person's name. If the SPDX document was created on behalf of a company or organization, indicate the entity name. If the SPDX document was created using a software tool, indicate the name and version for that tool. If multiple participants or tools were involved, use multiple instances of this field. Person name or organization name may be designated as “anonymous” if appropriate."@en ; + rdfs:domain spdx:CreationInfo ; + rdfs:range xsd:string ; + vs:term_status "stable" . + +dcterms:rightsHolder rdf:type rdf:Property ; + rdfs:comment "A person or organization owning or managing rights over the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Rights Holder"@en ; + dcam:rangeIncludes dcterms:Agent ; + dcterms:description "Recommended practice is to refer to the rights holder with a URI. If this is not possible or feasible, a literal value that identifies the rights holder may be provided."@en ; + dcterms:issued "2004-06-14"^^xsd:date . + +prov:activity rdf:type owl:ObjectProperty ; + rdfs:domain prov:ActivityInfluence ; + rdfs:isDefinedBy ; + rdfs:label "activity" ; + rdfs:range prov:Activity ; + rdfs:subPropertyOf prov:influencer ; + prov:category "qualified" ; + prov:editorialNote "This property behaves in spirit like rdf:object; it references the object of a prov:wasInfluencedBy triple."@en ; + prov:editorsDefinition "The prov:activity property references an prov:Activity which influenced a resource. This property applies to an prov:ActivityInfluence, which is given by a subproperty of prov:qualifiedInfluence from the influenced prov:Entity, prov:Activity or prov:Agent." ; + prov:inverse "activityOfInfluence" . + +spdx:Checksum rdf:type owl:Class ; + rdfs:comment "A Checksum is value that allows the contents of a file to be authenticated. Even small changes to the content of the file will change its checksum. This class allows the results of a variety of checksum and cryptographic message digest algorithms to be represented."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:ChecksumAlgorithm ; + owl:onProperty spdx:algorithm ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:hexBinary ; + owl:onProperty spdx:checksumValue ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + +time:hasXSDDuration rdf:type owl:DatatypeProperty ; + rdfs:comment "Extensión de una entidad temporal, expresada utilizando xsd:duration."@es , "Extent of a temporal entity, expressed using xsd:duration"@en ; + rdfs:domain time:TemporalEntity ; + rdfs:label "has XSD duration"@en , "tiene duración XSD"@es ; + rdfs:range xsd:duration ; + skos:definition "Extensión de una entidad temporal, expresada utilizando xsd:duration."@es , "Extent of a temporal entity, expressed using xsd:duration"@en ; + skos:editorialNote "Característica arriesgada - añadida en la revisión de 2017, y todavía no ampliamente utilizada."@es , "Feature at risk - added in 2017 revision, and not yet widely used. "@en . + +prov:hadMember rdf:type owl:ObjectProperty ; + rdfs:domain prov:Collection ; + rdfs:isDefinedBy ; + rdfs:label "hadMember" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + prov:category "expanded" ; + prov:component "expanded" ; + prov:inverse "wasMemberOf" ; + prov:sharesDefinitionWith prov:Collection . + +spdx:relationshipType_patchApplied + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_patchApplied expresses that the SPDXElement is a 'patchfile' that was applied and produced the relatedSPDXElement. For example, a .diff File relates to a specific file where the diff was applied."@en ; + vs:term_status "stable"@en . + +spdx:referenceCategory_security + rdf:type owl:NamedIndividual , spdx:ReferenceCategory ; + vs:term_status "stable"@en . + +dcterms:LCC rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of conceptual resources specified by the Library of Congress Classification."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "LCC"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +dcterms:LicenseDocument + rdf:type rdfs:Class ; + rdfs:comment "A legal document giving official permission to do something with a resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "License Document"@en ; + rdfs:subClassOf dcterms:RightsStatement ; + dcterms:issued "2008-01-14"^^xsd:date . + +prov:Revision rdf:type owl:Class ; + rdfs:comment "An instance of prov:Revision provides additional descriptions about the binary prov:wasRevisionOf relation from some newer prov:Entity to an earlier prov:Entity. For example, :draft_2 prov:wasRevisionOf :draft_1; prov:qualifiedRevision [ a prov:Revision; prov:entity :draft_1; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Revision" ; + rdfs:subClassOf prov:Derivation ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:definition "A revision is a derivation for which the resulting entity is a revised version of some original. The implication here is that the resulting entity contains substantial content from the original. Revision is a particular case of derivation."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-revision"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Revision"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasRevisionOf . + +spdx:AnnotationType rdf:type owl:Class ; + rdfs:comment "This type describes the type of annotation. Annotations are usually created when someone reviews the file, and if this is the case the annotation type should be REVIEW."@en ; + vs:term_status "stable"@en . + +spdx:checksumValue rdf:type owl:DatatypeProperty , owl:FunctionalProperty ; + rdfs:comment "The checksumValue property provides a lower case hexidecimal encoded digest value produced using a specific algorithm."@en ; + rdfs:domain spdx:Checksum ; + rdfs:range xsd:hexBinary ; + vs:term_status "stable" . + +[ rdf:type owl:Axiom ; + rdfs:comment "Derivation is a particular case of trace (see http://www.w3.org/TR/prov-dm/#term-trace), since it links an entity to another entity that contributed to its existence." ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasDerivedFrom ; + owl:annotatedTarget prov:wasInfluencedBy +] . + +time:intervalFinishedBy + rdf:type owl:ObjectProperty ; + rdfs:comment "If a proper interval T1 is intervalFinishedBy another proper interval T2, then the beginning of T1 is before the beginning of T2, and the end of T1 is coincident with the end of T2."@en , "Si un intervalo propio T1 está terminado por otro intervalo propio T2, entonces el principio de T1 está antes que el principio de T2, y el final de T1 coincide con el final de T2."@es ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo terminado por"@es , "interval finished by"@en ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalFinishes ; + skos:definition "Si un intervalo propio T1 está terminado por otro intervalo propio T2, entonces el principio de T1 está antes que el principio de T2, y el final de T1 coincide con el final de T2."@es , "If a proper interval T1 is intervalFinishedBy another proper interval T2, then the beginning of T1 is before the beginning of T2, and the end of T1 is coincident with the end of T2."@en . + +spdx:relationshipType_testToolOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is used as a test tool for SPDXRef-B."@en ; + vs:term_status "stable"@en . + +prov:qualifiedStart rdf:type owl:ObjectProperty ; + rdfs:comment "If this Activity prov:wasStartedBy Entity :e1, then it can qualify how it was started using prov:qualifiedStart [ a prov:Start; prov:entity :e1; :foo :bar ]."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedStart" ; + rdfs:range prov:Start ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:inverse "qualifiedStartOf" ; + prov:sharesDefinitionWith prov:Start ; + prov:unqualifiedForm prov:wasStartedBy . + + + rdf:type sh:NodeShape ; + sh:name "Checksum"@en ; + sh:property [ sh:datatype xsd:hexBinary ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:checksumValue ; + sh:severity sh:Violation + ] ; + sh:property [ sh:hasValue spdx:checksumAlgorithm_sha1 ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:algorithm ; + sh:severity sh:Violation + ] ; + sh:targetClass spdx:Checksum . + +prov:Influence rdf:type owl:Class ; + rdfs:comment "An instance of prov:Influence provides additional descriptions about the binary prov:wasInfluencedBy relation from some influenced Activity, Entity, or Agent to the influencing Activity, Entity, or Agent. For example, :stomach_ache prov:wasInfluencedBy :spoon; prov:qualifiedInfluence [ a prov:Influence; prov:entity :spoon; :foo :bar ] . Because prov:Influence is a broad relation, the more specific relations (Communication, Delegation, End, etc.) should be used when applicable."@en , "Because prov:Influence is a broad relation, its most specific subclasses (e.g. prov:Communication, prov:Delegation, prov:End, prov:Revision, etc.) should be used when applicable."@en ; + rdfs:isDefinedBy ; + rdfs:label "Influence" ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:definition "Influence is the capacity of an entity, activity, or agent to have an effect on the character, development, or behavior of another by means of usage, start, end, generation, invalidation, communication, derivation, attribution, association, or delegation."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-influence"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasInfluencedBy . + +dcterms:conformsTo rdf:type rdf:Property ; + rdfs:comment "An established standard to which the described resource conforms."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Conforms To"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcam:rangeIncludes dcterms:Standard ; + dcterms:issued "2001-05-21"^^xsd:date . + +spdx:licenseDeclared rdf:type owl:ObjectProperty ; + rdfs:comment "The licensing that the creators of the software in the package, or the packager, have declared. Declarations by the original software creator should be preferred, if they exist."@en ; + rdfs:domain spdx:SpdxItem ; + rdfs:range spdx:AnyLicenseInfo ; + vs:term_status "stable"@en . + +spdx:relationshipType_amendment + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "To be used when SPDXRef-A amends the SPDX information in SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:example rdf:type owl:DatatypeProperty ; + rdfs:comment "Text for examples in describing an SPDX element."@en ; + rdfs:domain spdx:LicenseException ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:AnyLicenseInfo rdf:type owl:Class ; + rdfs:comment "The AnyLicenseInfo class includes all resources that represent licensing information." ; + rdfs:isDefinedBy "http://spdx.org/rdf/terms#AnyLicenseInfo" ; + vs:term_status "stable" . + +vcard:mailer rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "mailer"@en ; + owl:deprecated true . + +time:generalYear rdf:type rdfs:Datatype ; + rdfs:comment "Year number - formulated as a text string with a pattern constraint to reproduce the same lexical form as gYear, but not restricted to values from the Gregorian calendar. \nNote that the value-space is not defined, so a generic OWL2 processor cannot compute ordering relationships of values of this type."@en , "Número de año - formulado como una cadena de texto con una restricción patrón para reproducir la misma forma léxica que gYear, aunque no está restringido a valores del calendario gregoriano.\n Nótese que el espacio de valores no está definido, por tanto, un procesador genérico de OWL2 no puede computar relaciones de orden de valores de este tipo."@es ; + rdfs:label "Generalized year"@en , "Año generalizado"@es ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( [ xsd:pattern "-?([1-9][0-9]{3,}|0[0-9]{3})(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?" ] + ) ; + skos:definition "Year number - formulated as a text string with a pattern constraint to reproduce the same lexical form as gYear, but not restricted to values from the Gregorian calendar. \nNote that the value-space is not defined, so a generic OWL2 processor cannot compute ordering relationships of values of this type."@en , "Número de año - formulado como una cadena de texto con una restricción patrón para reproducir la misma forma léxica que gYear, aunque no está restringido a valores del calendario gregoriano.\n Nótese que el espacio de valores no está definido, por tanto, un procesador genérico de OWL2 no puede computar relaciones de orden de valores de este tipo."@es . + +skos:narrowerTransitive + rdf:type owl:ObjectProperty , owl:TransitiveProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "has narrower transitive"@en ; + rdfs:subPropertyOf skos:semanticRelation ; + owl:inverseOf skos:broaderTransitive ; + skos:definition "skos:narrowerTransitive is a transitive superproperty of skos:narrower." ; + skos:scopeNote "By convention, skos:narrowerTransitive is not used to make assertions. Rather, the properties can be used to draw inferences about the transitive closure of the hierarchical relation, which is useful e.g. when implementing a simple query expansion algorithm in a search application."@en . + +locn:postName rdf:type rdf:Property ; + rdfs:comment "The key postal division of the address, usually the city. (INSPIRE's definition is \"One or more names created and maintained for postal purposes to identify a subdivision of addresses and postal delivery points.\"). The domain of locn:postName is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "post name"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:postName" ; + vs:term_status "testing"@en . + +spdx:isOsiApproved rdf:type owl:DatatypeProperty ; + rdfs:comment "Indicates if the OSI has approved the license."@en ; + rdfs:domain spdx:License ; + rdfs:range xsd:boolean ; + vs:term_status "stable"@en . + +adms:interoperabilityLevel + rdf:type owl:ObjectProperty ; + rdfs:comment "The interoperability level for which the Asset is relevant."@en ; + rdfs:domain adms:Asset ; + rdfs:isDefinedBy ; + rdfs:label "interoperability level"@en ; + rdfs:range skos:Concept . + +time:Sunday rdf:type time:DayOfWeek ; + rdfs:label "Sunday"@en ; + skos:prefLabel "Zondag"@nl , "Sunday"@en , "Воскресенье"@ru , "Sonntag"@de , "Domingo"@es , "Domingo"@pt , "الأحد (يوم)"@ar , "Niedziela"@pl , "Dimanche"@fr , "Domenica"@it , "日曜日"@ja , "星期日"@zh . + +owl:qualifiedCardinality + rdf:type owl:AnnotationProperty . + +vcard:prodid rdf:type owl:DatatypeProperty ; + rdfs:comment "To specify the identifier for the product that created the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "product id"@en ; + rdfs:range xsd:string . + +spdx:CrossRef rdf:type owl:Class ; + rdfs:comment "Cross reference details for the a URL reference"@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:match + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:isWayBackLink + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:isValid + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:isLive + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:url ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:nonNegativeInteger ; + owl:onProperty spdx:order + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:dateTime ; + owl:onProperty spdx:timestamp + ] ; + vs:term_status "stable"@en . + +dcat:record rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "Συνδέει έναν κατάλογο με τις καταγραφές του."@el , "Un record che descrive la registrazione di un singolo set di dati o di un servizio dati che fa parte del catalogo."@it , "Relie un catalogue à ses registres."@fr , "Propojuje katalog a jeho záznamy."@cs , "تربط الفهرس بسجل ضمنه"@ar , "Záznam popisující registraci jedné datové sady či datové služby jakožto součásti katalogu."@cs , "Describe la registración de un conjunto de datos o un servicio de datos en el catálogo."@es , "En post der beskriver registreringen af et enkelt datasæt eller en datatjeneste som er opført i kataloget."@da , "A record describing the registration of a single dataset or data service that is part of the catalog."@en , "カタログの一部であるカタログ・レコード。"@ja ; + rdfs:domain dcat:Catalog ; + rdfs:isDefinedBy ; + rdfs:label "カタログ・レコード"@ja , "سجل"@ar , "registre"@fr , "záznam"@cs , "record"@en , "record"@it , "registro"@es , "καταγραφή"@el , "post"@da ; + rdfs:range dcat:CatalogRecord ; + skos:altLabel "har post"@da ; + skos:definition "Propojuje katalog a jeho záznamy."@cs , "Relie un catalogue à ses registres."@fr , "Záznam popisující registraci jedné datové sady či datové služby jakožto součásti katalogu."@cs , "En post der beskriver registreringen af et enkelt datasæt eller en datatjeneste som er opført i kataloget."@da , "Un record che descrive la registrazione di un singolo set di dati o di un servizio dati che fa parte del catalogo."@it , "Συνδέει έναν κατάλογο με τις καταγραφές του."@el , "カタログの一部であるカタログ・レコード。"@ja , "Describe la registración de un conjunto de datos o un servicio de datos en el catálogo."@es , "تربط الفهرس بسجل ضمنه"@ar , "A record describing the registration of a single dataset or data service that is part of the catalog."@en ; + skos:editorialNote "Status: English, Italian, Spanish and Czech Definitions modified by DCAT revision team, other translations pending."@en . + +time:unitType rdf:type owl:ObjectProperty ; + rdfs:comment "The temporal unit which provides the precision of a date-time value or scale of a temporal extent"@en , "La unidad de tiempo que proporciona la precisión de un valor fecha-hora o la escala de una extensión temporal."@es ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( time:GeneralDateTimeDescription time:Duration ) + ] ; + rdfs:label "temporal unit type"@en , "tipo de unidad temporal"@es ; + rdfs:range time:TemporalUnit . + +prov:generatedAtTime rdf:type owl:DatatypeProperty ; + rdfs:comment "The time at which an entity was completely created and is available for use."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "generatedAtTime" ; + rdfs:range xsd:dateTime ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:editorialNote "It is the intent that the property chain holds: (prov:qualifiedGeneration o prov:atTime) rdfs:subPropertyOf prov:generatedAtTime."@en ; + prov:qualifiedForm prov:atTime , prov:Generation . + +spdx:supplier rdf:type owl:DatatypeProperty ; + rdfs:comment "The name and, optionally, contact information of the person or organization who was the immediate supplier of this package to the recipient. The supplier may be different than originator when the software has been repackaged. Values of this property must conform to the agent and tool syntax."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:licenseTextHtml rdf:type owl:DatatypeProperty ; + rdfs:comment "License text in HTML format"@en ; + rdfs:domain spdx:ListedLicense ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +dcterms:NLM rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of conceptual resources specified by the National Library of Medicine Classification."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "NLM"@en ; + rdfs:seeAlso ; + dcterms:issued "2005-06-13"^^xsd:date . + +dcat:contactPoint rdf:type rdf:Property , owl:ObjectProperty ; + rdfs:comment "Relevante kontaktoplysninger for den katalogiserede ressource. Anvendelse af vCard anbefales."@da , "Relevant contact information for the catalogued resource. Use of vCard is recommended."@en , "Información relevante de contacto para el recurso catalogado. Se recomienda el uso de vCard."@es , "Relie un jeu de données à une information de contact utile en utilisant VCard."@fr , "Informazioni di contatto rilevanti per la risorsa catalogata. Si raccomanda l'uso di vCard."@it , "データセットを、VCardを用いて提供されている適切な連絡先情報にリンクします。"@ja , "تربط قائمة البيانات بعنوان اتصال موصف باستخدام VCard"@ar , "Συνδέει ένα σύνολο δεδομένων με ένα σχετικό σημείο επικοινωνίας, μέσω VCard."@el , "Relevantní kontaktní informace pro katalogizovaný zdroj. Doporučuje se použít slovník VCard."@cs ; + rdfs:isDefinedBy ; + rdfs:label "point de contact"@fr , "عنوان اتصال"@ar , "窓口"@ja , "contact point"@en , "σημείο επικοινωνίας"@el , "kontaktní bod"@cs , "punto di contatto"@it , "Punto de contacto"@es , "kontaktpunkt"@da ; + rdfs:range vcard:Kind ; + skos:definition "Relie un jeu de données à une information de contact utile en utilisant VCard."@fr , "Informazioni di contatto rilevanti per la risorsa catalogata. Si raccomanda l'uso di vCard."@it , "Συνδέει ένα σύνολο δεδομένων με ένα σχετικό σημείο επικοινωνίας, μέσω VCard."@el , "Relevant contact information for the catalogued resource. Use of vCard is recommended."@en , "Información relevante de contacto para el recurso catalogado. Se recomienda el uso de vCard."@es , "データセットを、VCardを用いて提供されている適切な連絡先情報にリンクします。"@ja , "Relevante kontaktoplysninger for den katalogiserede ressource. Anvendelse af vCard anbefales."@da , "تربط قائمة البيانات بعنوان اتصال موصف باستخدام VCard"@ar , "Relevantní kontaktní informace pro katalogizovaný zdroj. Doporučuje se použít slovník VCard."@cs ; + skos:editorialNote "Status: English Definition text modified by DCAT revision team, Italian, Spanish and Czech translations provided, other translations pending."@en . + +spdx:relationshipType_buildDependencyOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a build dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + + + rdf:type owl:Ontology ; + rdfs:comment "DCAT er et RDF-vokabular som har til formål at understøtte interoperabilitet mellem datakataloger udgivet på nettet. Ved at anvende DCAT til at beskrive datasæt i datakataloger, kan udgivere øge findbarhed og gøre det gøre det lettere for applikationer at anvende metadata fra forskellige kataloger. Derudover understøttes decentraliseret udstilling af kataloger og fødererede datasætsøgninger på tværs af websider. Aggregerede DCAT-metadata kan fungere som fortegnelsesfiler der kan understøtte digital bevaring. DCAT er defineret på http://www.w3.org/TR/vocab-dcat/. Enhver forskel mellem det normative dokument og dette schema er en fejl i dette schema."@da , "DCAT est un vocabulaire développé pour faciliter l'interopérabilité entre les jeux de données publiées sur le Web. En utilisant DCAT pour décrire les jeux de données dans les catalogues de données, les fournisseurs de données augmentent leur découverte et permettent que les applications facilement les métadonnées de plusieurs catalogues. Il permet en plus la publication décentralisée des catalogues et facilitent la recherche fédérée des données entre plusieurs sites. Les métadonnées DCAT aggrégées peuvent servir comme un manifeste pour faciliter la préservation digitale des ressources. DCAT est définie à l'adresse http://www.w3.org/TR/vocab-dcat/. Une quelconque version de ce document normatif et ce vocabulaire est une erreur dans ce vocabulaire."@fr , "DCAT je RDF slovník navržený pro zprostředkování interoperability mezi datovými katalogy publikovanými na Webu. Poskytovatelé dat používáním slovníku DCAT pro popis datových sad v datových katalozích zvyšují jejich dohledatelnost a umožňují aplikacím konzumovat metadata z více katalogů. Dále je umožňena decentralizovaná publikace katalogů a federované dotazování na datové sady napříč katalogy. Agregovaná DCAT metadata mohou také sloužit jako průvodka umožňující digitální uchování informace. DCAT je definován na http://www.w3.org/TR/vocab-dcat/. Jakýkoliv nesoulad mezi odkazovaným dokumentem a tímto schématem je chybou v tomto schématu."@cs , "هي أنطولوجية تسهل تبادل البيانات بين مختلف الفهارس على الوب. استخدام هذه الأنطولوجية يساعد على اكتشاف قوائم البيانات المنشورة على الوب و يمكن التطبيقات المختلفة من الاستفادة أتوماتيكيا من البيانات المتاحة من مختلف الفهارس."@ar , "DCATは、ウェブ上で公開されたデータ・カタログ間の相互運用性の促進を目的とするRDFの語彙です。このドキュメントでは、その利用のために、スキーマを定義し、例を提供します。データ・カタログ内のデータセットを記述するためにDCATを用いると、公開者が、発見可能性を増加させ、アプリケーションが複数のカタログのメタデータを容易に利用できるようになります。さらに、カタログの分散公開を可能にし、複数のサイトにまたがるデータセットの統合検索を促進します。集約されたDCATメタデータは、ディジタル保存を促進するためのマニフェスト・ファイルとして使用できます。"@ja , "DCAT is an RDF vocabulary designed to facilitate interoperability between data catalogs published on the Web. By using DCAT to describe datasets in data catalogs, publishers increase discoverability and enable applications easily to consume metadata from multiple catalogs. It further enables decentralized publishing of catalogs and facilitates federated dataset search across sites. Aggregated DCAT metadata can serve as a manifest file to facilitate digital preservation. DCAT is defined at http://www.w3.org/TR/vocab-dcat/. Any variance between that normative document and this schema is an error in this schema."@en , "DCAT es un vocabulario RDF diseñado para facilitar la interoperabilidad entre catálogos de datos publicados en la Web. Utilizando DCAT para describir datos disponibles en catálogos se aumenta la posibilidad de que sean descubiertos y se permite que las aplicaciones consuman fácilmente los metadatos de varios catálogos."@es , "Το DCAT είναι ένα RDF λεξιλόγιο που σχεδιάσθηκε για να κάνει εφικτή τη διαλειτουργικότητα μεταξύ καταλόγων δεδομένων στον Παγκόσμιο Ιστό. Χρησιμοποιώντας το DCAT για την περιγραφή συνόλων δεδομένων, οι εκδότες αυτών αυξάνουν την ανακαλυψιμότητα και επιτρέπουν στις εφαρμογές την εύκολη κατανάλωση μεταδεδομένων από πολλαπλούς καταλόγους. Επιπλέον, δίνει τη δυνατότητα για αποκεντρωμένη έκδοση και διάθεση καταλόγων και επιτρέπει δυνατότητες ενοποιημένης αναζήτησης μεταξύ διαφορετικών πηγών. Συγκεντρωτικά μεταδεδομένα που έχουν περιγραφεί με το DCAT μπορούν να χρησιμοποιηθούν σαν ένα δηλωτικό αρχείο (manifest file) ώστε να διευκολύνουν την ψηφιακή συντήρηση."@el , "DCAT è un vocabolario RDF progettato per facilitare l'interoperabilità tra i cataloghi di dati pubblicati nel Web. Utilizzando DCAT per descrivere i dataset nei cataloghi di dati, i fornitori migliorano la capacità di individuazione dei dati e abilitano le applicazioni al consumo di dati provenienti da cataloghi differenti. DCAT permette di decentralizzare la pubblicazione di cataloghi e facilita la ricerca federata dei dataset. L'aggregazione dei metadati federati può fungere da file manifesto per facilitare la conservazione digitale. DCAT è definito all'indirizzo http://www.w3.org/TR/vocab-dcat/. Qualsiasi scostamento tra tale definizione normativa e questo schema è da considerarsi un errore di questo schema."@it ; + rdfs:label "Slovník pro datové katalogy"@cs , "Il vocabolario del catalogo dei dati"@it , "Le vocabulaire des jeux de données"@fr , "El vocabulario de catálogo de datos"@es , "Datakatalogvokabular"@da , "أنطولوجية فهارس قوائم البيانات"@ar , "Το λεξιλόγιο των καταλόγων δεδομένων"@el , "データ・カタログ語彙(DCAT)"@ja , "The data catalog vocabulary"@en ; + dcterms:contributor [ rdfs:seeAlso ; + sdo:affiliation [ foaf:homepage ; + foaf:name "Science and Technology Facilities Council, UK" + ] ; + foaf:homepage ; + foaf:name "Alejandra Gonzalez-Beltran" + ] ; + dcterms:contributor [ rdfs:seeAlso ; + foaf:homepage ; + foaf:name "Jakub Klímek" + ] ; + dcterms:contributor [ foaf:name "Martin Alvarez-Espinar" ] ; + dcterms:contributor [ foaf:name "Richard Cyganiak" ] ; + dcterms:contributor [ rdfs:seeAlso ; + sdo:affiliation ; + foaf:homepage ; + foaf:name "Phil Archer" + ] ; + dcterms:contributor [ rdfs:seeAlso ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ] ; + dcterms:contributor [ sdo:affiliation [ foaf:homepage ; + foaf:name "Refinitiv" + ] ; + foaf:name "David Browning" + ] ; + dcterms:contributor [ sdo:affiliation [ foaf:homepage ; + foaf:name "Open Knowledge Foundation" + ] ; + foaf:name "Rufus Pollock" + ] ; + dcterms:contributor [ rdfs:seeAlso ; + foaf:homepage , ; + foaf:name "Riccardo Albertoni" + ] ; + dcterms:contributor [ foaf:homepage ; + foaf:name "Shuji Kamitsuna" + ] ; + dcterms:contributor [ rdfs:seeAlso ; + foaf:name "Ghislain Auguste Atemezing" + ] ; + dcterms:contributor [ foaf:name "Boris Villazón-Terrazas" ] ; + dcterms:contributor [ rdf:type foaf:Person ; + rdfs:seeAlso ; + sdo:affiliation [ foaf:homepage ; + foaf:name "Commonwealth Scientific and Industrial Research Organisation" + ] ; + foaf:name "Simon J D Cox" ; + foaf:workInfoHomepage + ] ; + dcterms:contributor [ foaf:name "Marios Meimaris" ] ; + dcterms:contributor [ rdfs:seeAlso ; + foaf:homepage ; + foaf:name "Andrea Perego" + ] ; + dcterms:contributor [ sdo:affiliation [ foaf:homepage ; + foaf:name "European Commission, DG DIGIT" + ] ; + foaf:name "Vassilios Peristeras" + ] ; + dcterms:creator [ foaf:name "John Erickson" ] ; + dcterms:creator [ rdfs:seeAlso ; + foaf:name "Fadi Maali" + ] ; + dcterms:license ; + dcterms:modified "2013-09-20"^^xsd:date , "2020-11-30"^^xsd:date , "2019" , "2012-04-24"^^xsd:date , "2021-09-14"^^xsd:date , "2013-11-28"^^xsd:date , "2017-12-19"^^xsd:date ; + owl:imports , , dcterms: ; + owl:versionInfo "Questa è una copia aggiornata del vocabolario DCAT v2.0 disponibile in https://www.w3.org/ns/dcat.ttl"@en , "This is an updated copy of v2.0 of the DCAT vocabulary, taken from https://www.w3.org/ns/dcat.ttl"@en , "Esta es una copia del vocabulario DCAT v2.0 disponible en https://www.w3.org/ns/dcat.ttl"@es , "Dette er en opdateret kopi af DCAT v. 2.0 som er tilgænglig på https://www.w3.org/ns/dcat.ttl"@da , "Toto je aktualizovaná kopie slovníku DCAT verze 2.0, převzatá z https://www.w3.org/ns/dcat.ttl"@cs ; + skos:editorialNote "English language definitions updated in this revision in line with ED. Multilingual text unevenly updated."@en ; + foaf:maker [ foaf:homepage ; + foaf:name "Government Linked Data WG" + ] . + +dcat:qualifiedRelation + rdf:type owl:ObjectProperty ; + rdfs:comment "Odkaz na popis vztahu s jiným zdrojem."@cs , "Link a una descrizione di una relazione con un'altra risorsa."@it , "Link to a description of a relationship with another resource."@en , "Enlace a una descripción de la relación con otro recurso."@es , "Reference til en beskrivelse af en relation til en anden ressource."@da ; + rdfs:domain dcat:Resource ; + rdfs:label "qualified relation"@en , "relazione qualificata"@it , "Kvalificeret relation"@da , "relación calificada"@es , "kvalifikovaný vztah"@cs ; + rdfs:range dcat:Relationship ; + skos:changeNote "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "New property added in DCAT 2.0."@en , "Propiedad nueva añadida en DCAT 2.0."@es , "Ny egenskab tilføjet i DCAT 2.0."@da , "Nuova proprietà aggiunta in DCAT 2.0."@it ; + skos:definition "Odkaz na popis vztahu s jiným zdrojem."@cs , "Reference til en beskrivelse af en relation til en anden ressource."@da , "Link a una descrizione di una relazione con un'altra risorsa."@it , "Enlace a una descripción de la relación con otro recurso."@es , "Link to a description of a relationship with another resource."@en ; + skos:editorialNote "Introduced into DCAT to complement the other PROV qualified relations. "@en , "Přidáno do DCAT k doplnění jiných kvalifikovaných vztahů ze slovníku PROV."@cs , "Se incluyó en DCAT para complementar las relaciones calificadas disponibles en PROV."@es , "Introdotta in DCAT per integrare le altre relazioni qualificate di PROV."@it , "Introduceret i DCAT med henblik på at supplere de øvrige kvalificerede relationer fra PROV. "@da ; + skos:scopeNote "Used to link to another resource where the nature of the relationship is known but does not match one of the standard Dublin Core properties (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) or PROV-O properties (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@en , "Anvendes til at referere til en anden ressource hvor relationens betydning er kendt men ikke matcher en af de standardiserede egenskaber fra Dublin Core (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) eller PROV-O-egenskaber (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@da , "Viene utilizzato per associarsi a un'altra risorsa nei casi per i quali la natura della relazione è nota ma non è alcuna delle proprietà fornite dallo standard Dublin Core (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat , dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:require, dct:isRequiredBy) o dalle proprietà fornite da PROV-O (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom , prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@it , "Použito pro odkazování na jiný zdroj, kde druh vztahu je znám, ale neodpovídá standardním vlastnostem ze slovníku Dublin Core (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) či slovníku PROV-O (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@cs , "Se usa para asociar con otro recurso para el cuál la naturaleza de la relación es conocida pero no es ninguna de las propiedades que provee el estándar Dublin Core (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) or PROV-O properties (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@es . + +time:hasTime rdf:type owl:ObjectProperty ; + rdfs:comment "Proporciona soporte a la asociación de una entidad temporal (instante o intervalo) a cualquier cosa."@es , "Supports the association of a temporal entity (instant or interval) to any thing"@en ; + rdfs:label "tiene tiempo"@es , "has time"@en ; + rdfs:range time:TemporalEntity ; + skos:definition "Proporciona soporte a la asociación de una entidad temporal (instante o intervalo) a cualquier cosa."@es , "Supports the association of a temporal entity (instant or interval) to any thing"@en ; + skos:editorialNote "Feature at risk - added in 2017 revision, and not yet widely used. "@en , "Característica arriesgada -añadida en la revisión del 2017 que no ha sido todavía utilizada de forma amplia."@es . + +spdx:licenseInfoInSnippet + rdf:type owl:ObjectProperty ; + rdfs:comment "Licensing information that was discovered directly in the subject snippet. This is also considered a declared license for the snippet.\n\nIf the licenseInfoInSnippet field is not present for a snippet, it implies an equivalent meaning to NOASSERTION."@en ; + rdfs:domain spdx:Snippet ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( spdx:AnyLicenseInfo + [ rdf:type owl:Restriction ; + owl:hasValue spdx:noassertion ; + owl:onProperty spdx:licenseInfoInFile + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:none ; + owl:onProperty spdx:licenseInfoInFile + ] + ) + ] ; + rdfs:subPropertyOf spdx:licenseInfoFromFiles ; + vs:term_status "stable"@en . + + + rdf:type sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ( [ sh:class dcat:Catalog ] + [ sh:class dcat:Dataset ] + [ sh:class dcat:DataService ] + ) . + +spdx:annotationType_other + rdf:type owl:NamedIndividual , spdx:AnnotationType ; + rdfs:comment "Type of annotation which does not fit in any of the pre-defined annotation types."@en ; + vs:term_status "stable"@en . + +prov: rdf:type owl:Ontology . + +vcard:note rdf:type owl:DatatypeProperty ; + rdfs:comment "A note associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "note"@en ; + rdfs:range xsd:string . + +skos:semanticRelation + rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:domain skos:Concept ; + rdfs:isDefinedBy ; + rdfs:label "is in semantic relation with"@en ; + rdfs:range skos:Concept ; + skos:definition "Links a concept to a concept related by meaning."@en ; + skos:scopeNote "This property should not be used directly, but as a super-property for all properties denoting a relationship of meaning between concepts."@en . + + + rdf:type owl:DatatypeProperty ; + rdfs:domain ; + rdfs:range xsd:positiveInteger ; + vs:term_status "stable"@en . + +prov:Quotation rdf:type owl:Class ; + rdfs:comment "An instance of prov:Quotation provides additional descriptions about the binary prov:wasQuotedFrom relation from some taken prov:Entity from an earlier, larger prov:Entity. For example, :here_is_looking_at_you_kid prov:wasQuotedFrom :casablanca_script; prov:qualifiedQuotation [ a prov:Quotation; prov:entity :casablanca_script; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Quotation" ; + rdfs:subClassOf prov:Derivation ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:definition "A quotation is the repeat of (some or all of) an entity, such as text or image, by someone who may or may not be its original author. Quotation is a particular case of derivation."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-quotation"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-quotation"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasQuotedFrom . + +prov:wasGeneratedBy rdf:type owl:ObjectProperty ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "wasGeneratedBy" ; + rdfs:range prov:Activity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedGeneration prov:activity ) ; + owl:propertyChainAxiom ( prov:qualifiedGeneration prov:activity ) ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:inverse "generated" ; + prov:qualifiedForm prov:Generation , prov:qualifiedGeneration . + +dcterms:title rdf:type rdf:Property ; + rdfs:comment "A name given to the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Title"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:title ; + dcterms:issued "2008-01-14"^^xsd:date . + +foaf:homepage rdf:type owl:ObjectProperty ; + rdfs:comment "This axiom needed so that Protege loads DCAT2 without errors." . + +spdx:fileDependency rdf:type owl:ObjectProperty ; + rdfs:comment "This field is deprecated since SPDX 2.0 in favor of using Section 7 which provides more granularity about relationships."@en ; + rdfs:domain spdx:File ; + rdfs:range spdx:File ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +vcard:hasCalendarBusy + rdf:type owl:ObjectProperty ; + rdfs:comment "To specify the busy time associated with the object. (Was called FBURL in RFC6350)"@en ; + rdfs:isDefinedBy ; + rdfs:label "has calendar busy"@en . + +spdx:purpose_source rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package is a collection of source files."@en ; + vs:term_status "stable"@en . + +spdx:hasExtractedLicensingInfo + rdf:type owl:ObjectProperty ; + rdfs:comment "Indicates that a particular ExtractedLicensingInfo was defined in the subject SpdxDocument."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range spdx:ExtractedLicensingInfo ; + vs:term_status "stable"@en . + +spdx:purpose_application + rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package is a software application."@en ; + vs:term_status "stable"@en . + +dcterms:coverage rdf:type rdf:Property ; + rdfs:comment "The spatial or temporal topic of the resource, spatial applicability of the resource, or jurisdiction under which the resource is relevant."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Coverage"@en ; + rdfs:subPropertyOf dc:coverage ; + dcam:rangeIncludes dcterms:Location , dcterms:Period , dcterms:Jurisdiction ; + dcterms:description "Spatial topic and spatial applicability may be a named place or a location specified by its geographic coordinates. Temporal topic may be a named period, date, or date range. A jurisdiction may be a named administrative entity or a geographic place to which the resource applies. Recommended practice is to use a controlled vocabulary such as the Getty Thesaurus of Geographic Names [[TGN](https://www.getty.edu/research/tools/vocabulary/tgn/index.html)]. Where appropriate, named places or time periods may be used in preference to numeric identifiers such as sets of coordinates or date ranges. Because coverage is so broadly defined, it is preferable to use the more specific subproperties Temporal Coverage and Spatial Coverage."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcterms:date rdf:type rdf:Property ; + rdfs:comment "A point or period of time associated with an event in the lifecycle of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date ; + dcterms:description "Date may be used to express temporal information at any level of granularity. Recommended practice is to express the date, date/time, or period of time according to ISO 8601-1 [[ISO 8601-1](https://www.iso.org/iso-8601-date-and-time-format.html)] or a published profile of the ISO standard, such as the W3C Note on Date and Time Formats [[W3CDTF](https://www.w3.org/TR/NOTE-datetime)] or the Extended Date/Time Format Specification [[EDTF](http://www.loc.gov/standards/datetime/)]. If the full date is unknown, month and year (YYYY-MM) or just year (YYYY) may be used. Date ranges may be specified using ISO 8601 period of time specification in which start and end dates are separated by a '/' (slash) character. Either the start or end date may be missing."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +time:unitYear rdf:type time:TemporalUnit ; + rdfs:label "Year (unit of temporal duration)"@en ; + skos:prefLabel "anno"@it , "سنة واحدة"@ar , "jaar"@nl , "一年"@zh , "Jahr"@de , "один год"@ru , "un año"@es , "year"@en , "an"@fr , "1 년"@kr , "1年"@jp , "ano"@pt , "rok"@pl ; + time:days "0"^^xsd:decimal ; + time:hours "0"^^xsd:decimal ; + time:minutes "0"^^xsd:decimal ; + time:months "0"^^xsd:decimal ; + time:seconds "0"^^xsd:decimal ; + time:weeks "0"^^xsd:decimal ; + time:years "1"^^xsd:decimal . + +spdx:fileType_image rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "The file is assoicated with an picture image file (MIME type of image/*, ie. .jpg, .gif )."@en ; + vs:term_status "stable"@en . + +prov:wasAttributedTo rdf:type owl:ObjectProperty ; + rdfs:comment "Attribution is the ascribing of an entity to an agent."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "wasAttributedTo" ; + rdfs:range prov:Agent ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedAttribution prov:agent ) ; + owl:propertyChainAxiom ( prov:qualifiedAttribution prov:agent ) ; + prov:category "starting-point" ; + prov:component "agents-responsibility" ; + prov:definition "Attribution is the ascribing of an entity to an agent."@en ; + prov:inverse "contributed" ; + prov:qualifiedForm prov:Attribution , prov:qualifiedAttribution . + +dcat:hadRole rdf:type owl:ObjectProperty ; + rdfs:comment "La función de una entidad o agente con respecto a otra entidad o recurso."@es , "La funzione di un'entità o un agente rispetto ad un'altra entità o risorsa."@it , "Den funktion en entitet eller aktør har i forhold til en anden ressource."@da , "Funkce entity či agenta ve vztahu k jiné entitě či zdroji."@cs , "The function of an entity or agent with respect to another entity or resource."@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( prov:Attribution dcat:Relationship ) + ] ; + rdfs:label "tiene rol"@it , "sehraná role"@cs , "hadRole"@en , "havde rolle"@da , "haRuolo"@it ; + rdfs:range dcat:Role ; + skos:changeNote "New property added in DCAT 2.0."@en , "Nueva propiedad agregada en DCAT 2.0."@es , "Nuova proprietà aggiunta in DCAT 2.0."@it , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs ; + skos:definition "Den funktion en entitet eller aktør har i forhold til en anden ressource."@da , "La funzione di un'entità o un agente rispetto ad un'altra entità o risorsa."@it , "The function of an entity or agent with respect to another entity or resource."@en , "La función de una entidad o agente con respecto a otra entidad o recurso."@es , "Funkce entity či agenta ve vztahu k jiné entitě či zdroji."@cs ; + skos:editorialNote "Přidáno do DCAT pro doplnění vlastnosti prov:hadRole (jejíž užití je omezeno na role v kontextu aktivity, s definičním oborem prov:Association)."@cs , "Introduceret i DCAT for at supplere prov:hadRole (hvis anvendelse er begrænset til roller i forbindelse med en aktivitet med domænet prov:Association)."@da , "Introduced into DCAT to complement prov:hadRole (whose use is limited to roles in the context of an activity, with the domain of prov:Association."@en , "Introdotta in DCAT per completare prov:hadRole (il cui uso è limitato ai ruoli nel contesto di un'attività, con il dominio di prov:Association."@it , "Agregada en DCAT para complementar prov:hadRole (cuyo uso está limitado a roles en el contexto de una actividad, con dominio prov:Association."@es ; + skos:scopeNote "Può essere utilizzata in una relazione qualificata per specificare il ruolo di un'entità rispetto a un'altra entità. Si raccomanda che il valore sia preso da un vocabolario controllato di ruoli di entità come ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode, IANA Registry of Link Relations https://www.iana.org/assignments/link-relation, DataCite metadata schema, o MARC relators https://id.loc.gov/vocabulary/relators."@it , "Může být použito v kvalifikovaném vztahu pro specifikaci role Entity ve vztahu k jiné Entitě. Je doporučeno použít hodnotu z řízeného slovníku rolí entit, jako například ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode, IANA Registry of Link Relations https://www.iana.org/assignments/link-relation, DataCite metadata schema, MARC relators https://id.loc.gov/vocabulary/relators."@cs , "May be used in a qualified-relation to specify the role of an Entity with respect to another Entity. It is recommended that the value be taken from a controlled vocabulary of entity roles such as: ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode; IANA Registry of Link Relations https://www.iana.org/assignments/link-relation; DataCite metadata schema; MARC relators https://id.loc.gov/vocabulary/relators."@en , "May be used in a qualified-attribution to specify the role of an Agent with respect to an Entity. It is recommended that the value be taken from a controlled vocabulary of agent roles, such as http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@en , "Může být použito v kvalifikovaném přiřazení pro specifikaci role Agenta ve vztahu k Entitě. Je doporučeno hodnotu vybrat z řízeného slovníku rolí agentů, jako například http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@cs , "Può essere utilizzato in un'attribuzione qualificata per specificare il ruolo di un agente rispetto a un'entità. Si raccomanda che il valore sia preso da un vocabolario controllato di ruoli di agente, come ad esempio http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@it , "Puede usarse en una atribución cualificada para especificar el rol de un Agente con respecto a una Entidad. Se recomienda que el valor sea de un vocabulario controlado de roles de agentes, como por ejemplo http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@es , "Kan vendes ved kvalificerede krediteringer til at angive en aktørs rolle i forhold en entitet. Det anbefales at værdierne styres som et kontrolleret udfaldsrum med aktørroller, såsom http://registry.it.csiro.au/def/isotc211/CI_RoleCode."@da , "Puede usarse en una atribución cualificada para especificar el rol de una Entidad con respecto a otra Entidad. Se recomienda que su valor se tome de un vocabulario controlado de roles de entidades como por ejemplo: ISO 19115 DS_AssociationTypeCode http://registry.it.csiro.au/def/isotc211/DS_AssociationTypeCode; IANA Registry of Link Relations https://www.iana.org/assignments/link-relation; esquema de metadatos de DataCite; MARC relators https://id.loc.gov/vocabulary/relators."@es . + +xsd:dateTimeStamp rdfs:label "sello de tiempo"@es . + +spdx:noassertion rdf:type owl:NamedIndividual ; + rdfs:comment "Individual to indicate the creator of the SPDX document does not assert any value for the object." . + +spdx:purpose_container + rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package refers to a container image which can be used by a container runtime application."@en ; + vs:term_status "stable"@en . + +prov:PrimarySource rdf:type owl:Class ; + rdfs:comment "An instance of prov:PrimarySource provides additional descriptions about the binary prov:hadPrimarySource relation from some secondary prov:Entity to an earlier, primary prov:Entity. For example, :blog prov:hadPrimarySource :newsArticle; prov:qualifiedPrimarySource [ a prov:PrimarySource; prov:entity :newsArticle; :foo :bar ] ."@en ; + rdfs:isDefinedBy ; + rdfs:label "PrimarySource" ; + rdfs:subClassOf prov:Derivation ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:definition "A primary source for a topic refers to something produced by some agent with direct experience and knowledge about the topic, at the time of the topic's study, without benefit from hindsight.\n\nBecause of the directness of primary sources, they 'speak for themselves' in ways that cannot be captured through the filter of secondary sources. As such, it is important for secondary sources to reference those primary sources from which they were derived, so that their reliability can be investigated.\n\nA primary source relation is a particular case of derivation of secondary materials from their primary sources. It is recognized that the determination of primary sources can be up to interpretation, and should be done according to conventions accepted within the application's domain."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-primary-source"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-original-source"^^xsd:anyURI ; + prov:unqualifiedForm prov:hadPrimarySource . + +skos:OrderedCollection + rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Ordered Collection"@en ; + rdfs:subClassOf skos:Collection ; + skos:definition "An ordered collection of concepts, where both the grouping and the ordering are meaningful."@en ; + skos:scopeNote "Ordered collections can be used where you would like a set of concepts to be displayed in a specific order, and optionally under a 'node label'."@en . + +prov:EntityInfluence rdf:type owl:Class ; + rdfs:comment "EntityInfluence provides additional descriptions of an Entity's binary influence upon any other kind of resource. Instances of EntityInfluence use the prov:entity property to cite the influencing Entity."@en , "It is not recommended that the type EntityInfluence be asserted without also asserting one of its more specific subclasses."@en ; + rdfs:isDefinedBy ; + rdfs:label "EntityInfluence" ; + rdfs:seeAlso prov:entity ; + rdfs:subClassOf prov:Influence ; + prov:category "qualified" ; + prov:editorsDefinition "EntityInfluence is the capacity of an entity to have an effect on the character, development, or behavior of another by means of usage, start, end, derivation, or other. "@en . + +spdx:relationshipType_variantOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_variantOf expresses that an SPDXElement is a variant of the relatedSPDXElement, but it is not clear which came first. For example, if the content of two Files differs by some edit, but there is no way to tell which came first (no reliable date information), then one File is a variant of the other File."@en ; + vs:term_status "stable"@en . + +dcterms:publisher rdf:type rdf:Property ; + rdfs:comment "An entity responsible for making the resource available."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Publisher"@en ; + rdfs:subPropertyOf dc:publisher ; + dcam:rangeIncludes dcterms:Agent ; + dcterms:issued "2008-01-14"^^xsd:date . + +time:inXSDDate rdf:type owl:DatatypeProperty ; + rdfs:comment "Position of an instant, expressed using xsd:date"@en , "Posición de un instante, expresado utilizando xsd:date."@es ; + rdfs:domain time:Instant ; + rdfs:label "in XSD date"@en , "en fecha XSD"@es ; + rdfs:range xsd:date ; + skos:definition "Position of an instant, expressed using xsd:date"@en , "Posición de un instante, expresado utilizando xsd:date."@es . + +dcterms:dateAccepted rdf:type rdf:Property ; + rdfs:comment "Date of acceptance of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Accepted"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty. Examples of resources to which a date of acceptance may be relevant are a thesis (accepted by a university department) or an article (accepted by a journal)."@en ; + dcterms:issued "2002-07-13"^^xsd:date . + +prov:dm rdf:type owl:AnnotationProperty ; + rdfs:comment "A reference to the principal section of the PROV-DM document that describes this concept."@en ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + +adms:sample rdf:type owl:ObjectProperty ; + rdfs:comment "Links to a sample of an Asset (which is itself an Asset)."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "sample"@en ; + rdfs:range rdfs:Resource . + +[ rdf:type owl:Axiom ; + rdfs:comment "A collection is an entity that provides a structure to some constituents, which are themselves entities. These constituents are said to be member of the collections."@en ; + owl:annotatedProperty rdfs:range ; + owl:annotatedSource prov:hadMember ; + owl:annotatedTarget prov:Entity ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-collection" +] . + +prov:endedAtTime rdf:type owl:DatatypeProperty ; + rdfs:comment "The time at which an activity ended. See also prov:startedAtTime."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "endedAtTime" ; + rdfs:range xsd:dateTime ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:editorialNote "It is the intent that the property chain holds: (prov:qualifiedEnd o prov:atTime) rdfs:subPropertyOf prov:endedAtTime."@en ; + prov:qualifiedForm prov:End , prov:atTime . + +time:Instant rdf:type owl:Class ; + rdfs:comment "A temporal entity with zero extent or duration"@en , "Una entidad temporal con una extensión o duración cero."@es ; + rdfs:label "Time instant"@en , "instante de tiempo."@es ; + rdfs:subClassOf time:TemporalEntity ; + skos:definition "A temporal entity with zero extent or duration"@en , "Una entidad temporal con una extensión o duración cero."@es . + +adms:identifier rdf:type owl:ObjectProperty ; + rdfs:comment "Links a resource to an adms:Identifier class."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "identifier"@en ; + rdfs:range adms:Identifier . + +prov:qualifiedDerivation + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Entity prov:wasDerivedFrom Entity :e, then it can qualify how it was derived using prov:qualifiedDerivation [ a prov:Derivation; prov:entity :e; :foo :bar ]."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedDerivation" ; + rdfs:range prov:Derivation ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "qualifiedDerivationOf" ; + prov:sharesDefinitionWith prov:Derivation ; + prov:unqualifiedForm prov:wasDerivedFrom . + +dcat:endpointURL rdf:type owl:ObjectProperty ; + rdfs:comment "La posición raíz o end-point principal del servicio (una IRI web)."@es , "La locazione principale o l'endpoint primario del servizio (un IRI risolvibile via web)."@it , "The root location or primary endpoint of the service (a web-resolvable IRI)."@en , "Kořenové umístění nebo hlavní přístupový bod služby (IRI přístupné přes Web)."@cs , "Rodplaceringen eller det primære endpoint for en tjeneste (en web-resolverbar IRI)."@da ; + rdfs:domain dcat:DataService ; + rdfs:label "end-point del servizio"@it , "service end-point"@en , "end-point del servicio"@es , "přístupový bod služby"@cs , "tjenesteendpoint"@da ; + rdfs:range rdfs:Resource ; + skos:changeNote "Nueva propiedad agregada en DCAT 2.0."@es , "Nuova proprietà in DCAT 2.0."@it , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "New property in DCAT 2.0."@en ; + skos:definition "Rodplaceringen eller det primære endpoint for en tjeneste (en web-resolverbar IRI)."@da , "The root location or primary endpoint of the service (a web-resolvable IRI)."@en , "La locazione principale o l'endpoint primario del servizio (un IRI risolvibile via web)."@it , "Kořenové umístění nebo hlavní přístupový bod služby (IRI přístupné přes Web)."@cs , "La posición raíz o end-point principal del servicio (una IRI web)."@es . + +skos:inScheme rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "is in scheme"@en ; + rdfs:range skos:ConceptScheme ; + skos:definition "Relates a resource (for example a concept) to a concept scheme in which it is included."@en ; + skos:scopeNote "A concept may be a member of more than one concept scheme."@en . + +time:minutes rdf:type owl:DatatypeProperty ; + rdfs:comment "length, or element of, a temporal extent expressed in minutes"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en minutos."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "minutes"@en , "minutos"@es ; + rdfs:range xsd:decimal ; + skos:definition "length, or element of, a temporal extent expressed in minutes"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en minutos."@es . + +prov:Association rdf:type owl:Class ; + rdfs:comment "An instance of prov:Association provides additional descriptions about the binary prov:wasAssociatedWith relation from an prov:Activity to some prov:Agent that had some responsiblity for it. For example, :baking prov:wasAssociatedWith :baker; prov:qualifiedAssociation [ a prov:Association; prov:agent :baker; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Association" ; + rdfs:subClassOf prov:AgentInfluence ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:definition "An activity association is an assignment of responsibility to an agent for an activity, indicating that the agent had a role in the activity. It further allows for a plan to be specified, which is the plan intended by the agent to achieve some goals in the context of this activity."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Association"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Association"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasAssociatedWith . + +prov:SoftwareAgent rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "SoftwareAgent" ; + rdfs:subClassOf prov:Agent ; + prov:category "expanded" ; + prov:component "agents-responsibility" ; + prov:definition "A software agent is running software."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-types"^^xsd:anyURI . + + + rdfs:label "Turtle version of the ISA Programme Location Core Vocabulary"@en ; + dcterms:format ; + dcat:mediaType "text/turtle"^^dcterms:IMT . + +vcard:hasTitle rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the title data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has title"@en . + +skos:broadMatch rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "has broader match"@en ; + rdfs:subPropertyOf skos:mappingRelation , skos:broader ; + owl:inverseOf skos:narrowMatch ; + skos:definition "skos:broadMatch is used to state a hierarchical mapping link between two conceptual resources in different concept schemes."@en . + +dcat:distribution rdf:type rdf:Property , owl:ObjectProperty ; + rdfs:comment "Connecte un jeu de données à des distributions disponibles."@fr , "Una distribución disponible del conjunto de datos."@es , "An available distribution of the dataset."@en , "En tilgængelig repræsentation af datasættet."@da , "Una distribuzione disponibile per il set di dati."@it , "تربط قائمة البيانات بطريقة أو بشكل يسمح الوصول الى البيانات"@ar , "データセットを、その利用可能な配信に接続します。"@ja , "Συνδέει ένα σύνολο δεδομένων με μία από τις διαθέσιμες διανομές του."@el , "Dostupná distribuce datové sady."@cs ; + rdfs:domain dcat:Dataset ; + rdfs:isDefinedBy ; + rdfs:label "データセット配信"@ja , "distribution"@en , "distribution"@fr , "distribution"@da , "distribuzione"@it , "διανομή"@el , "توزيع"@ar , "distribución"@es , "distribuce"@cs ; + rdfs:range dcat:Distribution ; + rdfs:subPropertyOf dcterms:relation ; + skos:altLabel "har distribution"@da ; + skos:definition "Συνδέει ένα σύνολο δεδομένων με μία από τις διαθέσιμες διανομές του."@el , "Connecte un jeu de données à des distributions disponibles."@fr , "Una distribución disponible del conjunto de datos."@es , "データセットを、その利用可能な配信に接続します。"@ja , "تربط قائمة البيانات بطريقة أو بشكل يسمح الوصول الى البيانات"@ar , "En tilgængelig repræsentation af datasættet."@da , "An available distribution of the dataset."@en , "Una distribuzione disponibile per il set di dati."@it , "Dostupná distribuce datové sady."@cs ; + skos:editorialNote "Status: English Definition text modified by DCAT revision team, translations pending (except for Italian, Spanish and Czech)."@en . + +rdfs:label rdf:type owl:AnnotationProperty ; + rdfs:comment ""@en ; + rdfs:isDefinedBy . + +dcat:packageFormat rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:comment "The package format of the distribution in which one or more data files are grouped together, e.g. to enable a set of related files to be downloaded together."@en , "Balíčkový formát souboru, ve kterém je jeden či více souborů seskupeno dohromady, např. aby bylo možné stáhnout sadu souvisejících souborů naráz."@cs , "Il formato di impacchettamento della distribuzione in cui uno o più file di dati sono raggruppati insieme, ad es. per abilitare un insieme di file correlati da scaricare insieme."@it , "El formato del archivo en que se agrupan uno o más archivos de datos, e.g. para permitir que un conjunto de archivos relacionados se bajen juntos."@es , "Format til pakning af data med henblik på distribution af en eller flere relaterede datafiler der samles til en enhed med henblik på samlet distribution. "@da ; + rdfs:domain dcat:Distribution ; + rdfs:isDefinedBy ; + rdfs:label "formát balíčku"@cs , "packaging format"@en , "formato di impacchettamento"@it , "pakkeformat"@da , "formato de empaquetado"@es ; + rdfs:range dcterms:MediaType ; + rdfs:subPropertyOf dcterms:format ; + skos:changeNote "Ny egenskab tilføjet i DCAT 2.0."@da , "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "New property added in DCAT 2.0."@en , "Nueva propiedad agregada en DCAT 2.0."@es , "Nuova proprietà aggiunta in DCAT 2.0."@it ; + skos:definition "Il formato di impacchettamento della distribuzione in cui uno o più file di dati sono raggruppati insieme, ad es. per abilitare un insieme di file correlati da scaricare insieme."@it , "The package format of the distribution in which one or more data files are grouped together, e.g. to enable a set of related files to be downloaded together."@en , "El formato del archivo en que se agrupan uno o más archivos de datos, e.g. para permitir que un conjunto de archivos relacionados se bajen juntos."@es , "Balíčkový formát souboru, ve kterém je jeden či více souborů seskupeno dohromady, např. aby bylo možné stáhnout sadu souvisejících souborů naráz."@cs ; + skos:scopeNote "Questa proprietà deve essere utilizzata quando i file nella distribuzione sono impacchettati, ad esempio in un file TAR, Frictionless Data Package o Bagit. Il formato DOVREBBE essere espresso utilizzando un tipo di supporto come definito dal registro dei tipi di media IANA https://www.iana.org/assignments/media-types/, se disponibili."@it , "Esta propiedad se debe usar cuando los archivos de la distribución están empaquetados, por ejemplo en un archivo TAR, Frictionless Data Package o Bagit. El formato DEBERÍA expresarse usando un 'media type', tales como los definidos en el registro IANA de 'media types' https://www.iana.org/assignments/media-types/, si está disponibles."@es , "Denne egenskab kan anvendes hvis filerne i en distribution er pakket, fx i en TAR-fil, en Frictionless Data Package eller en Bagit-fil. Formatet BØR udtrykkes ved en medietype som defineret i 'IANA media types registry', hvis der optræder en relevant medietype dér: https://www.iana.org/assignments/media-types/."@da , "This property to be used when the files in the distribution are packaged, e.g. in a TAR file, a Frictionless Data Package or a Bagit file. The format SHOULD be expressed using a media type as defined by IANA media types registry https://www.iana.org/assignments/media-types/, if available."@en , "Tato vlastnost se použije, když jsou soubory v distribuci zabaleny, např. v souboru TAR, v balíčku Frictionless Data Package nebo v souboru Bagit. Formát BY MĚL být vyjádřen pomocí typu média definovaného v registru IANA https://www.iana.org/assignments/media-types/, pokud existuje."@cs . + +time:inTimePosition rdf:type owl:ObjectProperty ; + rdfs:comment "Posición de un instante, expresada como una coordenada temporal o un valor nominal."@es , "Position of an instant, expressed as a temporal coordinate or nominal value"@en ; + rdfs:domain time:Instant ; + rdfs:label "posición de tiempo"@es , "Time position"@en ; + rdfs:range time:TimePosition ; + rdfs:subPropertyOf time:inTemporalPosition ; + skos:definition "Position of a time instant expressed as a TimePosition"@en , "Posición de un instante, expresada como una coordenada temporal o un valor nominal."@es . + +spdx:fileType_other rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "Indicates the file is not a source, archive or binary file."@en ; + vs:term_status "stable"@en . + +time:dayOfYear rdf:type owl:DatatypeProperty ; + rdfs:comment "The number of the day within the year"@en , "El número de día en el año."@es ; + rdfs:domain time:GeneralDateTimeDescription ; + rdfs:label "day of year"@en , "día del año"@es ; + rdfs:range xsd:nonNegativeInteger ; + skos:definition "The number of the day within the year"@en , "El número de día en el año."@es . + +dcterms:audience rdf:type rdf:Property ; + rdfs:comment "A class of agents for whom the resource is intended or useful."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Audience"@en ; + dcam:rangeIncludes dcterms:AgentClass ; + dcterms:description "Recommended practice is to use this property with non-literal values from a vocabulary of audience types."@en ; + dcterms:issued "2001-05-21"^^xsd:date . + + + rdf:type owl:NamedIndividual . + +spdx:purpose_firmware + rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package provides low level control over a device's hardware."@en ; + vs:term_status "stable"@en . + +time:hasBeginning rdf:type owl:ObjectProperty ; + rdfs:comment "Beginning of a temporal entity"@en , "Comienzo de una entidad temporal."@es ; + rdfs:domain time:TemporalEntity ; + rdfs:label "has beginning"@en , "tiene principio"@es ; + rdfs:range time:Instant ; + rdfs:subPropertyOf time:hasTime ; + skos:definition "Beginning of a temporal entity."@en , "Comienzo de una entidad temporal."@es . + +spdx:licenseText rdf:type owl:DatatypeProperty ; + rdfs:comment "Full text of the license."@en ; + rdfs:domain spdx:License ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +time:Saturday rdf:type time:DayOfWeek ; + rdfs:label "Saturday"@en ; + skos:prefLabel "السبت"@ar , "Sabato"@it , "土曜日"@ja , "Sábado"@es , "Sábado"@pt , "Zaterdag"@nl , "Суббота"@ru , "Sobota"@pl , "星期六"@zh , "Samedi"@fr , "Saturday"@en , "Samstag"@de . + +skos:topConceptOf rdf:type owl:ObjectProperty , rdf:Property ; + rdfs:domain skos:Concept ; + rdfs:isDefinedBy ; + rdfs:label "is top concept in scheme"@en ; + rdfs:range skos:ConceptScheme ; + rdfs:subPropertyOf skos:inScheme ; + owl:inverseOf skos:hasTopConcept ; + skos:definition "Relates a concept to the concept scheme that it is a top level concept of."@en . + +vcard:Male rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Male"@en ; + rdfs:subClassOf vcard:Gender . + +vcard:Colleague rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Colleague"@en ; + rdfs:subClassOf vcard:RelatedType . + +spdx:ExternalRef rdf:type owl:Class ; + rdfs:comment "An External Reference allows a Package to reference an external source of additional information, metadata, enumerations, asset identifiers, or downloadable content believed to be relevant to the Package."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:ReferenceCategory ; + owl:onProperty spdx:referenceCategory ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:ReferenceType ; + owl:onProperty spdx:referenceType ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:referenceLocator ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment + ] ; + vs:term_status "stable"@en . + +vcard:hasNickname rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the nickname data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has nickname"@en ; + rdfs:seeAlso vcard:nickname . + +spdx:url rdf:type owl:DatatypeProperty ; + rdfs:comment "URL Reference"@en ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:anyURI . + +prov:order rdf:type owl:AnnotationProperty ; + rdfs:comment "The position that this OWL term should be listed within documentation. The scope of the documentation (e.g., among all terms, among terms within a prov:category, among properties applying to a particular class, etc.) is unspecified."@en ; + rdfs:isDefinedBy . + +spdx:relationshipType_staticLink + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A statically links to SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:purpose_operatingSystem + rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package refers to an operating system."@en ; + vs:term_status "stable"@en . + +time:Year rdf:type owl:DeprecatedClass , owl:Class ; + rdfs:comment "Year duration" ; + rdfs:label "Year"@en ; + rdfs:subClassOf time:DurationDescription ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty time:years + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 0 ; + owl:onProperty time:hours + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 0 ; + owl:onProperty time:weeks + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 0 ; + owl:onProperty time:months + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 0 ; + owl:onProperty time:minutes + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 0 ; + owl:onProperty time:seconds + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality 0 ; + owl:onProperty time:days + ] ; + owl:deprecated true ; + skos:definition "Year duration" ; + skos:historyNote "Year was proposed in the 2006 version of OWL-Time as an example of how DurationDescription could be specialized to allow for a duration to be restricted to a number of years. \n\nIt is deprecated in this edition of OWL-Time. " ; + skos:prefLabel "Anno"@it , "سنة"@ar , "Rok"@pl , "Jaar"@nl , "Año"@es , "Jahr"@de , "Année (calendrier)"@fr , "Year"@en , "Год"@ru , "年"@ja , "年"@zh , "Ano"@pt . + + + rdf:type owl:Class ; + rdfs:subClassOf ; + vs:term_status "stable" . + +spdx:fileType_text rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "The file is human readable text file (MIME type of text/*)."@en ; + vs:term_status "stable"@en . + +spdx:match rdf:type owl:DatatypeProperty ; + rdfs:comment "Status of a License List SeeAlso URL reference if it refers to a website that matches the license text." ; + rdfs:domain spdx:CrossRef ; + rdfs:range xsd:string . + + + rdf:type sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a temporal value: date, dateTime, gYear or gYearMonth literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date, xsd:dateTime, xsd:gYear or xsd:gYearMonth" ; + sh:or ( [ sh:datatype xsd:date ] + [ sh:datatype xsd:dateTime ] + [ sh:datatype xsd:gYear ] + [ sh:datatype xsd:gYearMonth ] + ) . + +dcterms:accrualMethod + rdf:type rdf:Property ; + rdfs:comment "The method by which items are added to a collection."@en ; + rdfs:domain dctype:Collection ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Accrual Method"@en ; + dcam:rangeIncludes dcterms:MethodOfAccrual ; + dcterms:description "Recommended practice is to use a value from the Collection Description Accrual Method Vocabulary [[DCMI-ACCRUALMETHOD](https://dublincore.org/groups/collections/accrual-method/)]."@en ; + dcterms:issued "2005-06-13"^^xsd:date . + +vcard:Kin rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Kin"@en ; + rdfs:subClassOf vcard:RelatedType . + +dcat:byteSize rdf:type owl:DatatypeProperty , rdf:Property ; + rdfs:comment "الحجم بالبايتات "@ar , "Το μέγεθος μιας διανομής σε bytes."@el , "The size of a distribution in bytes."@en , "Velikost distribuce v bajtech."@cs , "バイトによる配信のサイズ。"@ja , "La taille de la distribution en octects"@fr , "Størrelsen af en distributionen angivet i bytes."@da , "La dimensione di una distribuzione in byte."@it , "El tamaño de una distribución en bytes."@es ; + rdfs:domain dcat:Distribution ; + rdfs:isDefinedBy ; + rdfs:label "μέγεθος σε bytes"@el , "velikost v bajtech"@cs , "byte size"@en , "tamaño en bytes"@es , "dimensione in byte"@it , "الحجم بالبايت"@ar , "バイト・サイズ"@ja , "taille en octects"@fr , "bytestørrelse"@da ; + rdfs:range rdfs:Literal ; + skos:definition "Το μέγεθος μιας διανομής σε bytes."@el , "Størrelsen af en distribution angivet i bytes."@da , "الحجم بالبايتات "@ar , "El tamaño de una distribución en bytes."@es , "Velikost distribuce v bajtech."@cs , "La dimensione di una distribuzione in byte."@it , "The size of a distribution in bytes."@en , "La taille de la distribution en octects."@fr , "バイトによる配信のサイズ。"@ja ; + skos:scopeNote "Το μέγεθος σε bytes μπορεί να προσεγγιστεί όταν η ακριβής τιμή δεν είναι γνωστή. Η τιμή της dcat:byteSize θα πρέπει να δίνεται με τύπο δεδομένων xsd:decimal."@el , "الحجم يمكن أن يكون تقريبي إذا كان الحجم الدقيق غير معروف"@ar , "Bytestørrelsen kan approximeres hvis den præcise størrelse ikke er kendt. Værdien af dcat:byteSize bør angives som xsd:decimal."@da , "Velikost v bajtech může být přibližná, pokud její přesná hodnota není známa. Literál s hodnotou dcat:byteSize by měl mít datový typ xsd:decimal."@cs , "El tamaño en bytes puede ser aproximado cuando se desconoce el tamaño exacto. El valor literal de dcat:byteSize debe tener tipo 'xsd:decimal'."@es , "正確なサイズが不明である場合、サイズは、バイトによる近似値を示すことができます。"@ja , "La taille en octects peut être approximative lorsque l'on ignore la taille réelle. La valeur littérale de dcat:byteSize doit être de type xsd:decimal."@fr , "The size in bytes can be approximated when the precise size is not known. The literal value of dcat:byteSize should by typed as xsd:decimal."@en , "La dimensione in byte può essere approssimata quando non si conosce la dimensione precisa. Il valore di dcat:byteSize dovrebbe essere espresso come un xsd:decimal."@it . + +locn:fullAddress rdf:type rdf:Property ; + rdfs:comment "The complete address written as a string, with or without formatting. The domain of locn:fullAddress is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "full address"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:fullAddress" ; + vs:term_status "testing"@en . + +time:xsdDateTime rdf:type owl:DeprecatedProperty , owl:DatatypeProperty ; + rdfs:comment "Valor de 'intervalo de fecha-hora' expresado como un valor compacto."@es , "Value of DateTimeInterval expressed as a compact value."@en ; + rdfs:domain time:DateTimeInterval ; + rdfs:label "has XSD date-time"@en , "tiene fecha-hora XSD"@es ; + rdfs:range xsd:dateTime ; + owl:deprecated true ; + skos:note "Utilizando xsd:dateTime en este lugar significa que la duración del intervalo está implícita: se corresponde con la longitud del elemento más pequeño distinto de cero del literal fecha-hora. Sin embargo, esta regla no se puede utilizar para intervalos cuya duración es mayor que un rango más pequeño que el tiempo de comienzo - p.ej. el primer minuto o segundo del día, la primera hora del mes, o el primer día del año. En estos casos el intervalo deseado no se puede distinguir del intervalo correspondiente al próximo rango más alto. Debido a esta ambigüedad esencial, no se recomienda el uso de esta propiedad y está desaprobada." , "Using xsd:dateTime in this place means that the duration of the interval is implicit: it corresponds to the length of the smallest non-zero element of the date-time literal. However, this rule cannot be used for intervals whose duration is more than one rank smaller than the starting time - e.g. the first minute or second of a day, the first hour of a month, or the first day of a year. In these cases the desired interval cannot be distinguished from the interval corresponding to the next rank up. Because of this essential ambiguity, use of this property is not recommended and it is deprecated."@en . + +vcard:hasGivenName rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the given name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has given name"@en . + +spdx:relationshipType_dependsOn + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A depends on SPDXRef-B."@en ; + vs:term_status "stable"@en . + +dcat:theme rdf:type rdf:Property , owl:ObjectProperty ; + rdfs:comment "La categoria principale della risorsa. Una risorsa può avere più temi."@it , "Hlavní téma zdroje. Zdroj může mít více témat."@cs , "La categoría principal del recurso. Un recurso puede tener varios temas."@es , "A main category of the resource. A resource can have multiple themes."@en , "التصنيف الرئيسي لقائمة البيانات. قائمة البيانات يمكن أن تملك أكثر من تصنيف رئيسي واحد."@ar , "Et centralt emne for ressourcen. En ressource kan have flere centrale emner."@da , "La catégorie principale de la ressource. Une ressource peut avoir plusieurs thèmes."@fr , "データセットの主要カテゴリー。データセットは複数のテーマを持つことができます。"@ja , "Η κύρια κατηγορία του συνόλου δεδομένων. Ένα σύνολο δεδομένων δύναται να έχει πολλαπλά θέματα."@el ; + rdfs:isDefinedBy ; + rdfs:label "emne"@da , "Θέμα"@el , "theme"@en , "tema"@es , "tema"@it , "テーマ/カテゴリー"@ja , "téma"@cs , "التصنيف"@ar , "thème"@fr ; + rdfs:range skos:Concept ; + rdfs:subPropertyOf dcterms:subject ; + skos:altLabel "tema"@da ; + skos:definition "Hlavní téma zdroje. Zdroj může mít více témat."@cs , "La catégorie principale de la ressource. Une ressource peut avoir plusieurs thèmes."@fr , "La categoría principal del recurso. Un recurso puede tener varios temas."@es , "Η κύρια κατηγορία του συνόλου δεδομένων. Ένα σύνολο δεδομένων δύναται να έχει πολλαπλά θέματα."@el , "La categoria principale della risorsa. Una risorsa può avere più temi."@it , "データセットの主要カテゴリー。データセットは複数のテーマを持つことができます。"@ja , "A main category of the resource. A resource can have multiple themes."@en , "Et centralt emne for ressourcen. En ressource kan have flere centrale emner."@da , "التصنيف الرئيسي لقائمة البيانات. قائمة البيانات يمكن أن تملك أكثر من تصنيف رئيسي واحد."@ar ; + skos:editorialNote "Status: English Definition text modified by DCAT revision team, all except for Italian and Czech translations are pending."@en ; + skos:scopeNote "El conjunto de skos:Concepts utilizados para categorizar los recursos están organizados en un skos:ConceptScheme que describe todas las categorías y sus relaciones en el catálogo."@es , "データセットを分類するために用いられるskos:Conceptの集合は、カタログのすべてのカテゴリーとそれらの関係を記述しているskos:ConceptSchemeで組織化されます。"@ja , "Sada instancí třídy skos:Concept použitá pro kategorizaci zdrojů je organizována do schématu konceptů skos:ConceptScheme, které popisuje všechny kategorie v katalogu a jejich vztahy."@cs , "Il set di concetti skos usati per categorizzare le risorse sono organizzati in skos:ConceptScheme che descrive tutte le categorie e le loro relazioni nel catalogo."@it , "Samlingen af begreber (skos:Concept) der anvendes til at emneinddele ressourcer organiseres i et begrebssystem (skos:ConceptScheme) som beskriver alle emnerne og deres relationer i kataloget."@da , "Un ensemble de skos:Concepts utilisés pour catégoriser les ressources sont organisés en un skos:ConceptScheme décrivant toutes les catégories et ses relations dans le catalogue."@fr , "The set of skos:Concepts used to categorize the resources are organized in a skos:ConceptScheme describing all the categories and their relations in the catalog."@en , "Το σετ των skos:Concepts που χρησιμοποιείται για να κατηγοριοποιήσει τα σύνολα δεδομένων είναι οργανωμένο εντός ενός skos:ConceptScheme που περιγράφει όλες τις κατηγορίες και τις σχέσεις αυτών στον κατάλογο."@el . + +time:TemporalUnit rdf:type owl:Class ; + rdfs:comment "A standard duration, which provides a scale factor for a time extent, or the granularity or precision for a time position."@en , "Una duración estándar, que proporciona un factor de escala para una extensión de tiempo, o la granularidad o precisión para una posición de tiempo."@es ; + rdfs:label "unidad de tiempo"@es , "Temporal unit"@en ; + rdfs:subClassOf time:TemporalDuration ; + skos:changeNote "Remove enumeration from definition, in order to allow other units to be used when required in other coordinate systems. \nNOTE: existing units are still present as members of the class, but the class membership is now open. \n\nIn the original OWL-Time the following constraint appeared: \n owl:oneOf (\n time:unitSecond\n time:unitMinute\n time:unitHour\n time:unitDay\n time:unitWeek\n time:unitMonth\n time:unitYear\n ) ;"@en ; + skos:definition "Una duración estándar, que proporciona un factor de escala para una extensión de tiempo, o la granularidad o precisión para una posición de tiempo."@es , "A standard duration, which provides a scale factor for a time extent, or the granularity or precision for a time position."@en ; + skos:note "La pertenencia de la clase 'unidad de tiempo' está abierta, para permitir otras unidades de tiempo utilizadas en algunas aplicaciones técnicas (por ejemplo, millones de años o el mes Baha'i)."@es , "Membership of the class TemporalUnit is open, to allow for other temporal units used in some technical applications (e.g. millions of years, Baha'i month)."@en . + +skos:relatedMatch rdf:type owl:ObjectProperty , owl:SymmetricProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "has related match"@en ; + rdfs:subPropertyOf skos:mappingRelation , skos:related ; + skos:definition "skos:relatedMatch is used to state an associative mapping link between two conceptual resources in different concept schemes."@en . + +dcterms:abstract rdf:type rdf:Property ; + rdfs:comment "A summary of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Abstract"@en ; + rdfs:subPropertyOf dc:description , dcterms:description ; + dcterms:issued "2000-07-11"^^xsd:date . + +dcat:dataset rdf:type rdf:Property , owl:ObjectProperty ; + rdfs:comment "Kolekce dat, která je katalogizována v katalogu."@cs , "Una raccolta di dati che è elencata nel catalogo."@it , "تربط الفهرس بقائمة بيانات ضمنه"@ar , "Un conjunto de datos que se lista en el catálogo."@es , "En samling af data som er opført i kataloget."@da , "A collection of data that is listed in the catalog."@en , "カタログの一部であるデータセット。"@ja , "Relie un catalogue à un jeu de données faisant partie de ce catalogue."@fr , "Συνδέει έναν κατάλογο με ένα σύνολο δεδομένων το οποίο ανήκει στον εν λόγω κατάλογο."@el ; + rdfs:domain dcat:Catalog ; + rdfs:isDefinedBy ; + rdfs:label "σύνολο δεδομένων"@el , "قائمة بيانات"@ar , "conjunto de datos"@es , "datová sada"@cs , "dataset"@en , "dataset"@it , "jeu de données"@fr , "データセット"@ja , "datasæt"@da ; + rdfs:range dcat:Dataset ; + rdfs:subPropertyOf rdfs:member , dcterms:hasPart ; + skos:altLabel "har datasæt"@da , "datasamling"@da ; + skos:definition "Συνδέει έναν κατάλογο με ένα σύνολο δεδομένων το οποίο ανήκει στον εν λόγω κατάλογο."@el , "カタログの一部であるデータセット。"@ja , "Kolekce dat, která je katalogizována v katalogu."@cs , "Relie un catalogue à un jeu de données faisant partie de ce catalogue."@fr , "Una raccolta di dati che è elencata nel catalogo."@it , "A collection of data that is listed in the catalog."@en , "تربط الفهرس بقائمة بيانات ضمنه"@ar , "En samling af data som er opført i kataloget."@da , "Un conjunto de datos que se lista en el catálogo."@es ; + skos:editorialNote "Status: English Definition text modified by DCAT revision team, Italian, Spanish and Czech translation provided, other translations pending."@en . + +spdx:CreationInfo rdf:type owl:Class ; + rdfs:comment "One instance is required for each SPDX file produced. It provides the necessary information for forward and backward compatibility for processing tools."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:creator + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:dateTimeStamp ; + owl:onProperty spdx:created ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseListVersion + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment + ] ; + vs:term_status "stable"@en . + +spdx:isFsfLibre rdf:type owl:DatatypeProperty ; + rdfs:domain spdx:License ; + rdfs:range xsd:boolean . + +spdx:referenceCategory_other + rdf:type owl:NamedIndividual , spdx:ReferenceCategory ; + vs:term_status "stable"@en . + +spdx:relationshipType_describes + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-DOCUMENT describes SPDXRef-A."@en ; + vs:term_status "stable" . + +vcard:Video rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Video"@en ; + rdfs:subClassOf vcard:TelephoneType . + +dcterms:format rdf:type rdf:Property ; + rdfs:comment "The file format, physical medium, or dimensions of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Format"@en ; + rdfs:subPropertyOf dc:format ; + dcam:rangeIncludes dcterms:Extent , dcterms:MediaType ; + dcterms:description "Recommended practice is to use a controlled vocabulary where available. For example, for file formats one could use the list of Internet Media Types [[MIME](https://www.iana.org/assignments/media-types/media-types.xhtml)]. Examples of dimensions include size and duration."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:Type rdf:type owl:Class ; + rdfs:comment "Used for type codes. The URI of the type code must be used as the value for Type."@en ; + rdfs:isDefinedBy ; + rdfs:label "Type"@en . + +locn:addressId rdf:type rdf:Property ; + rdfs:comment "The concept of adding a globally unique identifier for each instance of an address is a crucial part of the INSPIRE data spec. The domain of locn:addressId is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "address ID"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:addressId" ; + vs:term_status "unstable"@en . + +spdx:name rdf:type owl:DatatypeProperty ; + rdfs:comment "Identify name of this SpdxElement."@en ; + rdfs:domain spdx:SpdxElement ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:purpose_library rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package is a software library."@en ; + vs:term_status "stable"@en . + +prov:wasInvalidatedBy + rdf:type owl:ObjectProperty ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "wasInvalidatedBy" ; + rdfs:range prov:Activity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedInvalidation prov:activity ) ; + owl:propertyChainAxiom ( prov:qualifiedInvalidation prov:activity ) ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:inverse "invalidated" ; + prov:qualifiedForm prov:qualifiedInvalidation , prov:Invalidation . + +time:months rdf:type owl:DatatypeProperty ; + rdfs:comment "length of, or element of the length of, a temporal extent expressed in months"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en meses."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "months duration"@en , "duración en meses"@es ; + rdfs:range xsd:decimal ; + skos:definition "length of, or element of the length of, a temporal extent expressed in months"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en meses."@es . + +dcterms:subject rdf:type rdf:Property ; + rdfs:comment "A topic of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Subject"@en ; + rdfs:subPropertyOf dc:subject ; + dcterms:description "Recommended practice is to refer to the subject with a URI. If this is not possible or feasible, a literal value that identifies the subject may be provided. Both should preferably refer to a subject in a controlled vocabulary."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcterms:SizeOrDuration + rdf:type rdfs:Class ; + rdfs:comment "A dimension or extent, or a time taken to play or execute."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Size or Duration"@en ; + rdfs:subClassOf dcterms:MediaTypeOrExtent ; + dcterms:description "Examples include a number of pages, a specification of length, width, and breadth, or a period in hours, minutes, and seconds."@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +dcterms:LocationPeriodOrJurisdiction + rdf:type rdfs:Class ; + rdfs:comment "A location, period of time, or jurisdiction."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Location, Period, or Jurisdiction"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + +spdx:releaseDate rdf:type owl:DatatypeProperty ; + rdfs:comment "This field provides a place for recording the date the package was released."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf spdx:date ; + vs:term_status "stable"@en . + +time:Monday rdf:type time:DayOfWeek ; + rdfs:label "Monday"@en ; + skos:prefLabel "Monday"@en , "Lunes"@es , "Lundi"@fr , "Montag"@de , "الاثنين"@ar , "月曜日"@ja , "Lunedì"@it , "Понедельник"@ru , "Maandag"@nl , "Poniedziałek"@pl , "星期一"@zh , "Segunda-feira"@pt . + +vcard:postal-code rdf:type owl:DatatypeProperty ; + rdfs:comment "The postal code associated with the address of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "postal code"@en ; + rdfs:range xsd:string . + +spdx:licenseConcluded + rdf:type owl:ObjectProperty , owl:FunctionalProperty ; + rdfs:comment "The licensing that the preparer of this SPDX document has concluded, based on the evidence, actually applies to the SPDX Item.\n\nIf the licenseConcluded field is not present for an SPDX Item, it implies an equivalent meaning to NOASSERTION."@en ; + rdfs:domain spdx:SpdxItem ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( spdx:AnyLicenseInfo + [ rdf:type owl:Restriction ; + owl:hasValue spdx:noassertion ; + owl:onProperty spdx:licenseConcluded + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:none ; + owl:onProperty spdx:licenseConcluded + ] + ) + ] ; + vs:term_status "stable"@en . + +dcat:Relationship rdf:type owl:Class ; + rdfs:comment "Una clase de asociación para adjuntar información adicional a una relación entre recursos DCAT."@es , "Asociační třída pro připojení dodatečných informací ke vztahu mezi zdroji DCAT."@cs , "An association class for attaching additional information to a relationship between DCAT Resources."@en , "En associationsklasse til brug for tilknytning af yderligere information til en relation mellem DCAT-ressourcer."@da , "Una classe di associazione per il collegamento di informazioni aggiuntive a una relazione tra le risorse DCAT."@it ; + rdfs:label "Relazione"@it , "Relation"@da , "Vztah"@cs , "Relación"@es , "Relationship"@en ; + skos:changeNote "Nueva clase añadida en DCAT 2.0."@es , "Nuova classe aggiunta in DCAT 2.0."@it , "Nová třída přidaná ve verzi DCAT 2.0."@cs , "New class added in DCAT 2.0."@en , "Ny klasse i DCAT 2.0."@da ; + skos:definition "An association class for attaching additional information to a relationship between DCAT Resources."@en , "Una classe di associazione per il collegamento di informazioni aggiuntive a una relazione tra le risorse DCAT."@it , "En associationsklasse til brug for tilknytning af yderligere information til en relation mellem DCAT-ressourcer."@da , "Asociační třída pro připojení dodatečných informací ke vztahu mezi zdroji DCAT."@cs , "Una clase de asociación para adjuntar información adicional a una relación entre recursos DCAT."@es ; + skos:scopeNote "Se usa para caracterizar la relación entre conjuntos de datos, y potencialmente otros recursos, donde la naturaleza de la relación se conoce pero no está caracterizada adecuadamente con propiedades del estándar 'Dublin Core' (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) or PROV-O properties (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@es , "Use to characterize a relationship between datasets, and potentially other resources, where the nature of the relationship is known but is not adequately characterized by the standard Dublin Core properties (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) or PROV-O properties (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@en , "Anvendes til at karakterisere en relation mellem datasæt, og potentielt andre ressourcer, hvor relationen er kendt men ikke tilstrækkeligt beskrevet af de standardiserede egenskaber i Dublin Core (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) eller PROV-O-egenskaber (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@da , "Používá se pro charakterizaci vztahu mezi datovými sadami a případně i jinými zdroji, kde druh vztahu je sice znám, ale není přiměřeně charakterizován standardními vlastnostmi slovníku Dublin Core (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:requires, dct:isRequiredBy) či vlastnostmi slovníku PROV-O (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource, prov:alternateOf, prov:specializationOf)."@cs , "Viene utilizzato per caratterizzare la relazione tra insiemi di dati, e potenzialmente altri tipi di risorse, nei casi in cui la natura della relazione è nota ma non adeguatamente caratterizzata dalle proprietà dello standard 'Dublin Core' (dct:hasPart, dct:isPartOf, dct:conformsTo, dct:isFormatOf, dct:hasFormat, dct:isVersionOf, dct:hasVersion, dct:replaces, dct:isReplacedBy, dct:references, dct:isReferencedBy, dct:require, dct:isRequiredBy) o dalle propietà fornite da PROV-O (prov:wasDerivedFrom, prov:wasInfluencedBy, prov:wasQuotedFrom, prov:wasRevisionOf, prov: hadPrimarySource, prov:alternateOf, prov:specializationOf)."@it . + +prov:qualifiedAssociation + rdf:type owl:ObjectProperty ; + rdfs:comment "If this Activity prov:wasAssociatedWith Agent :ag, then it can qualify the Association using prov:qualifiedAssociation [ a prov:Association; prov:agent :ag; :foo :bar ]."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "qualifiedAssociation" ; + rdfs:range prov:Association ; + rdfs:subPropertyOf prov:qualifiedInfluence ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:inverse "qualifiedAssociationOf" ; + prov:sharesDefinitionWith prov:Association ; + prov:unqualifiedForm prov:wasAssociatedWith . + +dcterms:accrualPolicy + rdf:type rdf:Property ; + rdfs:comment "The policy governing the addition of items to a collection."@en ; + rdfs:domain dctype:Collection ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Accrual Policy"@en ; + dcam:rangeIncludes dcterms:Policy ; + dcterms:description "Recommended practice is to use a value from the Collection Description Accrual Policy Vocabulary [[DCMI-ACCRUALPOLICY](https://dublincore.org/groups/collections/accrual-policy/)]."@en ; + dcterms:issued "2005-06-13"^^xsd:date . + +spdx:checksumAlgorithm_md2 + rdf:type owl:NamedIndividual , spdx:ChecksumAlgorithm ; + rdfs:comment "Indicates the algorithm used was MD2" ; + vs:term_status "stable" . + +spdx:externalDocumentId + rdf:type owl:DatatypeProperty ; + rdfs:comment "externalDocumentId is a string containing letters, numbers, ., - and/or + which uniquely identifies an external document within this document."@en ; + rdfs:domain spdx:ExternalDocumentRef ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +vcard:BBS rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "BBS"@en ; + rdfs:subClassOf vcard:TelephoneType ; + owl:deprecated true . + +spdx:sourceInfo rdf:type owl:DatatypeProperty ; + rdfs:comment "Allows the producer(s) of the SPDX document to describe how the package was acquired and/or changed from the original source."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +vcard:Home rdf:type owl:Class ; + rdfs:comment "This implies that the property is related to an individual's personal life"@en ; + rdfs:isDefinedBy ; + rdfs:label "Home"@en ; + rdfs:subClassOf vcard:Type . + +adms:schemeAgency rdf:type owl:DatatypeProperty ; + rdfs:comment "The name of the agency that issued the identifier."@en , "This property is deprecated because in in HTML specification another URI was used." ; + rdfs:domain adms:Identifier ; + rdfs:isDefinedBy ; + rdfs:label "schema agency"@en ; + rdfs:range rdfs:Literal ; + dcterms:isReplacedBy adms:schemaAgency ; + owl:deprecated "true" ; + owl:equivalentProperty adms:schemaAgency . + +spdx:relationshipType_hasPrerequisite + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A has as a prerequisite SPDXRef-B."@en ; + vs:term_status "stable"@en . + + + rdf:type sh:NodeShape ; + sh:name "Category Scheme"@en ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcterms:title ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:ConceptScheme . + +dcterms:Period rdf:type rdfs:Datatype ; + rdfs:comment "The set of time intervals defined by their limits according to the DCMI Period Encoding Scheme."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "DCMI Period"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:hasHonorificPrefix + rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the honorific prefix data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has honorific prefix"@en . + +dcterms:MESH rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of labeled concepts specified by the Medical Subject Headings."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "MeSH"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +prov:Attribution rdf:type owl:Class ; + rdfs:comment "An instance of prov:Attribution provides additional descriptions about the binary prov:wasAttributedTo relation from an prov:Entity to some prov:Agent that had some responsible for it. For example, :cake prov:wasAttributedTo :baker; prov:qualifiedAttribution [ a prov:Attribution; prov:entity :baker; :foo :bar ]."@en ; + rdfs:isDefinedBy ; + rdfs:label "Attribution" ; + rdfs:subClassOf prov:AgentInfluence ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "Attribution is the ascribing of an entity to an agent.\n\nWhen an entity e is attributed to agent ag, entity e was generated by some unspecified activity that in turn was associated to agent ag. Thus, this relation is useful when the activity is not known, or irrelevant."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-attribution"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-attribution"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasAttributedTo . + +vcard:hasStreetAddress + rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the street address data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has street address"@en . + +time:numericDuration rdf:type owl:DatatypeProperty ; + rdfs:comment "Value of a temporal extent expressed as a decimal number scaled by a temporal unit"@en , "Valor de una extensión temporal expresada como un número decimal escalado por una unidad de tiempo."@es ; + rdfs:domain time:Duration ; + rdfs:label "Numeric value of temporal duration"@en , "valor numérico de duración temporal"@es ; + rdfs:range xsd:decimal ; + skos:definition "Value of a temporal extent expressed as a decimal number scaled by a temporal unit"@en , "Valor de una extensión temporal expresada como un número decimal escalado por una unidad de tiempo."@es . + +prov:hadUsage rdf:type owl:ObjectProperty ; + rdfs:comment "The _optional_ Usage involved in an Entity's Derivation."@en ; + rdfs:domain prov:Derivation ; + rdfs:isDefinedBy ; + rdfs:label "hadUsage" ; + rdfs:range prov:Usage ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:inverse "wasUsedInDerivation" ; + prov:sharesDefinitionWith prov:Usage . + +vcard:hasPhoto rdf:type owl:ObjectProperty ; + rdfs:comment "To specify an image or photograph information that annotates some aspect of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has photo"@en ; + owl:equivalentProperty vcard:photo . + +adms:prev rdf:type owl:ObjectProperty ; + rdfs:comment "A link to the previous version of the Asset."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "prev"@en ; + rdfs:range rdfs:Resource ; + rdfs:subPropertyOf . + +spdx:fileContributor rdf:type owl:DatatypeProperty ; + rdfs:comment "This field provides a place for the SPDX file creator to record file contributors. Contributors could include names of copyright holders and/or authors who may not be copyright holders yet contributed to the file content."@en ; + rdfs:domain spdx:File ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:fileType_source rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "Indicates the file is a source code file."@en ; + vs:term_status "stable"@en . + +time:TimePosition rdf:type owl:Class ; + rdfs:comment "A temporal position described using either a (nominal) value from an ordinal reference system, or a (numeric) value in a temporal coordinate system. "@en , "Una posición temporal descrita utilizando bien un valor (nominal) de un sistema de referencia ordinal, o un valor (numérico) en un sistema de coordenadas temporales."@es ; + rdfs:label "Time position"@en , "posición de tiempo"@es ; + rdfs:subClassOf time:TemporalPosition ; + rdfs:subClassOf [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:numericPosition + ] + [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:nominalPosition + ] + ) + ] ; + skos:definition "A temporal position described using either a (nominal) value from an ordinal reference system, or a (numeric) value in a temporal coordinate system. "@en , "Una posición temporal descrita utilizando bien un valor (nominal) de un sistema de referencia ordinal, o un valor (numérico) en un sistema de coordenadas temporales."@es . + +time:intervalMetBy rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 es 'intervalo encontrado por' otro intervalo propio T2, entonces el principio de T1 coincide con el final de T2."@es , "If a proper interval T1 is intervalMetBy another proper interval T2, then the beginning of T1 is coincident with the end of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "intervalo encontrado por"@es , "interval met by"@en ; + rdfs:range time:ProperInterval ; + owl:inverseOf time:intervalMeets ; + skos:definition "If a proper interval T1 is intervalMetBy another proper interval T2, then the beginning of T1 is coincident with the end of T2."@en , "Si un intervalo propio T1 es 'intervalo encontrado por' otro intervalo propio T2, entonces el principio de T1 coincide con el final de T2."@es . + +vcard:hasCategory rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the category data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has category"@en . + +time:inXSDgYear rdf:type owl:DatatypeProperty ; + rdfs:comment "Position of an instant, expressed using xsd:gYear"@en , "Posición de un instante, expresado utilizando xsd:gYear."@es ; + rdfs:domain time:Instant ; + rdfs:label "in XSD g-Year"@en , "en año gregoriano XSD"@es ; + rdfs:range xsd:gYear ; + skos:definition "Position of an instant, expressed using xsd:gYear"@en , "Posición de un instante, expresado utilizando xsd:gYear."@es . + + + rdf:type sh:NodeShape ; + sh:name "Distribution"@en ; + sh:property [ sh:maxCount 1 ; + sh:path adms:status ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:license ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ] ; + sh:property [ sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:rights ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:modified ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:language ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path foaf:page ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:format ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:accessURL ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcterms:title ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:issued ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ] ; + sh:property [ sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:byteSize ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:downloadURL ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcterms:description ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:conformsTo ; + sh:severity sh:Violation + ] ; + sh:property [ sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:accessService ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + + + rdf:type sh:NodeShape ; + sh:name "Data Service"@en ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:accessRights ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointDescription ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:servesDataset ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcterms:description ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcterms:title ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointURL ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:license ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + +vcard:VCard rdf:type owl:Class ; + rdfs:comment "The vCard class is equivalent to the new Kind class, which is the parent for the four explicit types of vCards (Individual, Organization, Location, Group)"@en ; + rdfs:isDefinedBy ; + rdfs:label "VCard"@en ; + owl:equivalentClass vcard:Kind . + +prov:InstantaneousEvent + rdf:type owl:Class ; + rdfs:comment "An instantaneous event, or event for short, happens in the world and marks a change in the world, in its activities and in its entities. The term 'event' is commonly used in process algebra with a similar meaning. Events represent communications or interactions; they are assumed to be atomic and instantaneous."@en ; + rdfs:isDefinedBy ; + rdfs:label "InstantaneousEvent" ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#dfn-event"^^xsd:anyURI ; + prov:definition "The PROV data model is implicitly based on a notion of instantaneous events (or just events), that mark transitions in the world. Events include generation, usage, or invalidation of entities, as well as starting or ending of activities. This notion of event is not first-class in the data model, but it is useful for explaining its other concepts and its semantics."@en . + +prov:startedAtTime rdf:type owl:DatatypeProperty ; + rdfs:comment "The time at which an activity started. See also prov:endedAtTime."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "startedAtTime" ; + rdfs:range xsd:dateTime ; + prov:category "starting-point" ; + prov:component "entities-activities" ; + prov:editorialNote "It is the intent that the property chain holds: (prov:qualifiedStart o prov:atTime) rdfs:subPropertyOf prov:startedAtTime."@en ; + prov:qualifiedForm prov:Start , prov:atTime . + +dcterms:isFormatOf rdf:type rdf:Property ; + rdfs:comment "A pre-existing related resource that is substantially the same as the described resource, but in another format."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Is Format Of"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Has Format."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:referenceLocator + rdf:type owl:DatatypeProperty ; + rdfs:comment "The unique string with no spaces necessary to access the package-specific information, metadata, or content within the target location. The format of the locator is subject to constraints defined by the ."@en ; + rdfs:domain spdx:ExternalRef ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +prov:Organization rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Organization" ; + rdfs:subClassOf prov:Agent ; + prov:category "expanded" ; + prov:component "agents-responsibility" ; + prov:definition "An organization is a social or legal institution such as a company, society, etc." ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-types"^^xsd:anyURI . + +vcard:hasCountryName rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the country name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has country name"@en . + +spdx:externalDocumentRef + rdf:type owl:ObjectProperty ; + rdfs:comment "Identify any external SPDX documents referenced within this SPDX document."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range spdx:ExternalDocumentRef ; + vs:term_status "stable"@en . + +dcterms:Jurisdiction rdf:type rdfs:Class ; + rdfs:comment "The extent or range of judicial, law enforcement, or other authority."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Jurisdiction"@en ; + rdfs:subClassOf dcterms:LocationPeriodOrJurisdiction ; + dcterms:issued "2008-01-14"^^xsd:date . + +vcard:ISDN rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "ISDN"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + + + rdf:type owl:Ontology ; + rdfs:label "adms"@en , "adms"@nl ; + dcterms:issued "2023-04-05" ; + dcterms:license ; + dcterms:mediator [ foaf:homepage ; + foaf:name "Semantic Interoperability Community (SEMIC)" + ] ; + rec:editor [ rdf:type foaf:Person ; + foaf:firstName "Bert" ; + foaf:lastName "Van Nuffelen" ; + foaf:mbox ; + j.0:affiliation [ foaf:name "TenForce" ] + ] ; + rec:editor [ rdf:type foaf:Person ; + foaf:firstName "Pavlina" ; + foaf:lastName "Fragkou" ; + j.0:affiliation [ foaf:name "SEMIC EU" ] + ] ; + rec:editor [ rdf:type foaf:Person ; + foaf:firstName "Natasa" ; + foaf:lastName "Sofou" + ] ; + rec:editor [ rdf:type foaf:Person ; + foaf:firstName "Makx" ; + foaf:lastName "Dekkers" + ] ; + foaf:maker [ rdf:type foaf:Person ; + foaf:firstName "Pavlina" ; + foaf:lastName "Fragkou" ; + j.0:affiliation [ foaf:name "SEMIC EU" ] + ] . + +time:TemporalDuration + rdf:type owl:Class ; + rdfs:comment "Time extent; duration of a time interval separate from its particular start position"@en , "Extensión de tiempo; duración de un intervalo de tiempo independiente de su posición de inicio particular."@es ; + rdfs:label "Temporal duration"@en , "duración temporal"@es ; + skos:definition "Time extent; duration of a time interval separate from its particular start position"@en , "Extensión de tiempo; duración de un intervalo de tiempo independiente de su posición de inicio particular."@es . + +vcard:Gender rdf:type owl:Class ; + rdfs:comment "Used for gender codes. The URI of the gender code must be used as the value for Gender."@en ; + rdfs:isDefinedBy ; + rdfs:label "Gender"@en . + +adms:representationTechnique + rdf:type owl:ObjectProperty ; + rdfs:comment "More information about the format in which an Asset Distribution is released. This is different from the file format as, for example, a ZIP file (file format) could contain an XML schema (representation technique)."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "representation technique"@en ; + rdfs:range skos:Concept . + +vcard:Coworker rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Coworker"@en ; + rdfs:subClassOf vcard:RelatedType . + +locn:geometry rdf:type rdf:Property ; + rdfs:comment "Associates any resource with the corresponding geometry."@en ; + rdfs:isDefinedBy ; + rdfs:label "geometry"@en ; + rdfs:range locn:Geometry ; + dcterms:identifier "locn:geometry" ; + vann:example "\nThe following are examples of equivalent statements using different geometry encodings. In the examples, prefix gsp is used for namespace URI http://www.opengis.net/ont/geosparql#, whereas prefix sf is used for namespace URI http://www.opengis.net/ont/sf#.\n- WKT (GeoSPARQL)\n:Resource locn:geometry\n \" Point(-0.001475 51.477811)\"^^gsp:wktLiteral .\n- GML\n:Resource locn:geometry\n \"\n -0.001475, 51.477811\"^^gsp:gmlLiteral .\n- RDF+WKT (GeoSPARQL)\n:Resource locn:geometry\n [ a sf:Point; gsp:asWKT \" Point(-0.001475 51.477811)\"^^gsp:wktLiteral ] .\n- RDF+GML (GeoSPARQL)\n:Resource locn:geometry\n [ a sf:Point; gsp:asGML\n \"\n -0.001475, 51.477811\"^^gsp:gmlLiteral ] .\n- RDF (WGS84 lat/long)\n:Resource locn:geometry [ a geo:Point; geo:lat \"51.477811\"; geo:long \"-0.001475\" ] .\n- RDF (schema.org)\n:Resource locn:geometry [ a schema:GeoCoordinates; schema:latitude \"51.477811\"; schema:longitude \"-0.001475\" ] .\n- geo URI\n:Resource locn:geometry .\n- GeoHash URI\n:Resource locn:geometry .\n "@en ; + vann:usageNote "\nDepending on how a geometry is encoded, the range of this property may be one of the following:\n- a literal (e.g., WKT - string literal -, GML, KML - XML literal)\n- a geometry class, as those defined in the OGC's GeoSPARQL specification, in the W3C's Basic Geo (WGS84 lat/long) vocabulary, and at schema.org;\n- geocoded URIs, as geo or GeoHash URIs, treated as URI references.\nFor interoperability reasons, it is recommended using one of the following:\n- Any geometry:\n - WKT, GML, and RDF+WKT/GML, as per the GeoSPARQL specification.\n - KML (Keyhole Markup Language) - note that KML supports the following geometries only: point, line string, linear ring, and polygon.\n - RDF as per the schema.org vocabulary (see classes schema:GeoCoordinates and schema:GeoShape).\n- Points: one of the above, or:\n - RDF as per the W3C Basic Geo (WGS84 lat/long) vocabulary.\n - GeoHash URIs.\n - geo URIs.\n "@en ; + vs:term_status "testing"@en ; + wdsr:describedby . + +time:intervalStarts rdf:type owl:ObjectProperty ; + rdfs:comment "Si un intervalo propio T1 empieza otro intervalo propio T2, entonces del principio de T1 con el principio de T2, y el final de T1 es anterior al final de T2."@es , "If a proper interval T1 is intervalStarts another proper interval T2, then the beginning of T1 is coincident with the beginning of T2, and the end of T1 is before the end of T2."@en ; + rdfs:domain time:ProperInterval ; + rdfs:label "interval starts"@en , "intervalo empieza"@es ; + rdfs:range time:ProperInterval ; + rdfs:subPropertyOf time:intervalIn ; + owl:inverseOf time:intervalStartedBy ; + skos:definition "If a proper interval T1 is intervalStarts another proper interval T2, then the beginning of T1 is coincident with the beginning of T2, and the end of T1 is before the end of T2."@en , "Si un intervalo propio T1 empieza otro intervalo propio T2, entonces del principio de T1 con el final de T2, y el final de T1 es anterior al final de T2."@es . + +vcard:Pager rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Pager"@en ; + rdfs:subClassOf vcard:TelephoneType . + + + rdf:type sh:NodeShape ; + sh:name "PeriodOfTime"@en ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcat:startDate ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcat:endDate ; + sh:severity sh:Violation + ] ; + sh:targetClass dcterms:PeriodOfTime . + +spdx:relationshipType_devToolOf + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A is a development dependency of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +vcard:hasLocality rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the locality data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has locality"@en . + + + rdf:type owl:Ontology ; + rdfs:seeAlso ; + dcterms:contributor "Dave Beckett" , "Nikki Rogers" , "Participants in W3C's Semantic Web Deployment Working Group." ; + dcterms:creator "Alistair Miles" , "Sean Bechhofer" ; + dcterms:description "An RDF vocabulary for describing the basic structure and content of concept schemes such as thesauri, classification schemes, subject heading lists, taxonomies, 'folksonomies', other types of controlled vocabulary, and also concept schemes embedded in glossaries and terminologies."@en ; + dcterms:title "SKOS Vocabulary"@en . + +dcterms:Point rdf:type rdfs:Datatype ; + rdfs:comment "The set of points in space defined by their geographic coordinates according to the DCMI Point Encoding Scheme."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "DCMI Point"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +vcard:photo rdf:type owl:ObjectProperty ; + rdfs:comment "This object property has been mapped"@en ; + rdfs:isDefinedBy ; + rdfs:label "photo"@en ; + owl:equivalentProperty vcard:hasPhoto . + + + rdfs:label "HTML version of the ISA Programme Location Core Vocabulary"@en ; + dcat:mediaType "text/html"^^dcterms:IMT . + +vcard:additional-name + rdf:type owl:DatatypeProperty ; + rdfs:comment "The additional name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "additional name"@en ; + rdfs:range xsd:string . + +spdx:licenseInfoInFile + rdf:type owl:ObjectProperty ; + rdfs:comment "Licensing information that was discovered directly in the subject file. This is also considered a declared license for the file.\n\nIf the licenseInfoInFile field is not present for a file, it implies an equivalent meaning to NOASSERTION."@en ; + rdfs:domain spdx:File ; + rdfs:range [ rdf:type owl:Class ; + owl:unionOf ( spdx:AnyLicenseInfo + [ rdf:type owl:Restriction ; + owl:hasValue spdx:noassertion ; + owl:onProperty spdx:licenseInfoInFile + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:none ; + owl:onProperty spdx:licenseInfoInFile + ] + ) + ] ; + rdfs:subPropertyOf spdx:licenseInfoFromFiles ; + vs:term_status "stable" . + +vcard:Friend rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Friend"@en ; + rdfs:subClassOf vcard:RelatedType . + +prov:hadPlan rdf:type owl:ObjectProperty ; + rdfs:comment "The _optional_ Plan adopted by an Agent in Association with some Activity. Plan specifications are out of the scope of this specification."@en ; + rdfs:domain prov:Association ; + rdfs:isDefinedBy ; + rdfs:label "hadPlan" ; + rdfs:range prov:Plan ; + prov:category "qualified" ; + prov:component "agents-responsibility" ; + prov:inverse "wasPlanOf" ; + prov:sharesDefinitionWith prov:Plan . + +spdx:LicenseException + rdf:type owl:Class ; + rdfs:comment "An exception to a license."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI ; + owl:onProperty rdfs:seeAlso + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:name ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:example + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseExceptionId ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseExceptionTemplate + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:licenseExceptionText ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable"@en . + + + cc:attributionName "European Commission"@en ; + cc:attributionURL ; + dcterms:title "ISA Open Metadata Licence v1.1" . + +time:inside rdf:type owl:ObjectProperty ; + rdfs:comment "An instant that falls inside the interval. It is not intended to include beginnings and ends of intervals."@en , "Un instante que cae dentro del intervalo. Se asume que no es ni el principio ni el final de ningún intervalo."@es ; + rdfs:domain time:Interval ; + rdfs:label "has time instant inside"@en , "tiene instante de tiempo dentro"@es ; + rdfs:range time:Instant ; + skos:definition "An instant that falls inside the interval. It is not intended to include beginnings and ends of intervals."@en , "Un instante que cae dentro del intervalo. Se asume que no es ni el principio ni el final de ningún intervalo."@es . + +prov:atTime rdf:type owl:DatatypeProperty ; + rdfs:comment "The time at which an InstantaneousEvent occurred, in the form of xsd:dateTime."@en ; + rdfs:domain prov:InstantaneousEvent ; + rdfs:isDefinedBy ; + rdfs:label "atTime" ; + rdfs:range xsd:dateTime ; + prov:category "qualified" ; + prov:component "entities-activities" ; + prov:sharesDefinitionWith prov:InstantaneousEvent ; + prov:unqualifiedForm prov:invalidatedAtTime , prov:startedAtTime , prov:generatedAtTime , prov:endedAtTime . + +prov:actedOnBehalfOf rdf:type owl:ObjectProperty ; + rdfs:comment "An object property to express the accountability of an agent towards another agent. The subordinate agent acted on behalf of the responsible agent in an actual activity. "@en ; + rdfs:domain prov:Agent ; + rdfs:isDefinedBy ; + rdfs:label "actedOnBehalfOf" ; + rdfs:range prov:Agent ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedDelegation prov:agent ) ; + owl:propertyChainAxiom ( prov:qualifiedDelegation prov:agent ) ; + prov:category "starting-point" ; + prov:component "agents-responsibility" ; + prov:inverse "hadDelegate" ; + prov:qualifiedForm prov:qualifiedDelegation , prov:Delegation . + + + rdf:type owl:Class ; + rdfs:subClassOf ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:positiveInteger ; + owl:onProperty ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable" . + +dcat:startDate rdf:type rdf:Property , owl:DatatypeProperty ; + rdfs:domain dcterms:PeriodOfTime ; + rdfs:label "data di inizio"@it , "datum začátku"@cs , "start date"@en , "startdato"@da ; + rdfs:range rdfs:Literal ; + skos:altLabel "starttidspunkt"@da ; + skos:changeNote "Nová vlastnost přidaná ve verzi DCAT 2.0."@cs , "New property added in DCAT 2.0."@en , "Ny egenskab tilføjet i DCAT 2.0."@da , "Nuova proprietà aggiunta in DCAT 2.0."@it , "Nueva propiedad agregada en DCAT 2.0."@es ; + skos:definition "El comienzo del período"@es , "Začátek doby trvání"@cs , "The start of the period"@en , "Start på perioden."@da , "L'inizio del periodo"@it ; + skos:scopeNote "Rækkeviden for denne egenskab er bevidst generisk defineret med det formål at tillade forskellige niveauer af tidslig præcision ifm. angivelse af startdatoen for en periode. Den kan eksempelvis udtrykkes som en dato (xsd:date), en dato og et tidspunkt (xsd:dateTime), eller et årstal (xsd:gYear)."@da , "The range of this property is intentionally generic, with the purpose of allowing different level of temporal precision for specifying the start of a period. E.g., it can be expressed with a date (xsd:date), a date and time (xsd:dateTime), or a year (xsd:gYear)."@en , "Obor hodnot této vlastnosti je úmyslně obecný, aby umožnil různé úrovně časového rozlišení pro specifikaci začátku doby trvání. Ten může být kupříkladu vyjádřen datumem (xsd:date), datumem a časem (xsd:dateTime) či rokem (xsd:gYear)."@cs , "Il range di questa proprietà è volutamente generico, con lo scopo di consentire diversi livelli di precisione temporale per specificare l'inizio di un periodo. Ad esempio, può essere espresso con una data (xsd:date), una data e un'ora (xsd:dateTime), o un anno (xsd:gYear)."@it , "El rango de esta propiedad es intencionalmente genérico con el propósito de permitir distintos niveles de precisión temporal para especificar el comienzo de un período. Por ejemplo, puede expresarse como una fecha (xsd:date), una fecha y un tiempo (xsd:dateTime), o un año (xsd:gYear)."@es . + +spdx:checksum rdf:type owl:ObjectProperty ; + rdfs:comment "The checksum property provides a mechanism that can be used to verify that the contents of a File or Package have not changed."@en ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( spdx:File spdx:Package ) + ] ; + rdfs:range spdx:Checksum ; + vs:term_status "stable"@en . + + + rdf:type owl:Class ; + rdfs:subClassOf ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:File ; + owl:onProperty ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + vs:term_status "stable" . + +dcterms:requires rdf:type rdf:Property ; + rdfs:comment "A related resource that is required by the described resource to support its function, delivery, or coherence."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Requires"@en ; + rdfs:subPropertyOf dc:relation , dcterms:relation ; + dcterms:description "This property is intended to be used with non-literal values. This property is an inverse property of Is Required By."@en ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:packageVerificationCodeExcludedFile + rdf:type owl:DatatypeProperty ; + rdfs:comment "A file that was excluded when calculating the package verification code. This is usually a file containing SPDX data regarding the package. If a package contains more than one SPDX file all SPDX files must be excluded from the package verification code. If this is not done it would be impossible to correctly calculate the verification codes in both files."@en ; + rdfs:domain spdx:PackageVerificationCode ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +skos:closeMatch rdf:type owl:ObjectProperty , owl:SymmetricProperty , rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "has close match"@en ; + rdfs:subPropertyOf skos:mappingRelation ; + skos:definition "skos:closeMatch is used to link two concepts that are sufficiently similar that they can be used interchangeably in some information retrieval applications. In order to avoid the possibility of \"compound errors\" when combining mappings across more than two concept schemes, skos:closeMatch is not declared to be a transitive property."@en . + +spdx:fileType_archive + rdf:type owl:NamedIndividual , spdx:FileType ; + rdfs:comment "Indicates the file is an archive file."@en ; + vs:term_status "stable"@en . + +locn:poBox rdf:type rdf:Property ; + rdfs:comment "The Post Office Box number. The domain of locn:poBox is locn:Address."@en ; + rdfs:domain locn:Address ; + rdfs:isDefinedBy ; + rdfs:label "PO box"@en ; + rdfs:range rdfs:Literal ; + dcterms:identifier "locn:poBox" ; + vs:term_status "testing"@en . + +dcterms:Frequency rdf:type rdfs:Class ; + rdfs:comment "A rate at which something recurs."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Frequency"@en ; + dcterms:issued "2008-01-14"^^xsd:date . + + + rdf:type sh:NodeShape ; + sh:name "Catalog"@en ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcterms:description ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:language ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:hasPart ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:isPartOf ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:modified ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:license ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dcterms:publisher ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:issued ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:rights ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:record ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:spatial ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:service ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcterms:title ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:catalog ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:dataset ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:creator ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + +adms:next rdf:type owl:ObjectProperty ; + rdfs:comment "A link to the next version of the Asset."@en ; + rdfs:domain rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:label "next"@en ; + rdfs:range rdfs:Resource ; + rdfs:subPropertyOf . + +spdx:referencesFile rdf:type owl:ObjectProperty ; + rdfs:comment "Indicates that a particular file belongs as part of the set of analyzed files in the SpdxDocument."@en , "This property has been replaced by a relationship between the SPDX document and file with a \"contains\" relationship type."@en ; + rdfs:domain spdx:SpdxDocument ; + rdfs:range spdx:File ; + owl:deprecated true ; + vs:term_status "deprecated"@en . + +owl:versionInfo rdf:type owl:AnnotationProperty . + +[ rdf:type owl:Axiom ; + rdfs:comment "Quotation is a particular case of derivation (see http://www.w3.org/TR/prov-dm/#term-quotation) in which an entity is derived from an original entity by copying, or \"quoting\", some or all of it. " ; + owl:annotatedProperty rdfs:subPropertyOf ; + owl:annotatedSource prov:wasQuotedFrom ; + owl:annotatedTarget prov:wasDerivedFrom +] . + +vcard:honorific-prefix + rdf:type owl:DatatypeProperty ; + rdfs:comment "The honorific prefix of the name associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "honorific prefix"@en ; + rdfs:range xsd:string . + +time:MonthOfYear rdf:type owl:Class ; + rdfs:comment "El mes del año."@es , "The month of the year"@en ; + rdfs:label "Month of year"@en , "mes del año"@es ; + rdfs:subClassOf time:DateTimeDescription ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty time:second + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty time:hour + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "1"^^xsd:nonNegativeInteger ; + owl:onProperty time:month + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:hasValue time:unitMonth ; + owl:onProperty time:unitType + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty time:week + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty time:year + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty time:day + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:cardinality "0"^^xsd:nonNegativeInteger ; + owl:onProperty time:minute + ] ; + skos:definition "The month of the year"@en , "El mes del año."@es ; + skos:editorialNote "Característica en riesgo - añadida en la revisión de 2017, y no utilizada todavía de forma amplia."@es , "Feature at risk - added in 2017 revision, and not yet widely used. "@en ; + skos:note "Membership of the class :MonthOfYear is open, to allow for alternative annual calendars and different month names."@en , "La pertenencia a la clase 'mes del año' está abierta, a permitir calendarios anuales alternativos y diferentes nombres de meses."@es . + +vcard:Emergency rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Emergency"@en ; + rdfs:subClassOf vcard:RelatedType . + +vcard:hasHonorificSuffix + rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the honorific suffix data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has honorific suffix"@en . + +dcat:Resource rdf:type owl:Class ; + rdfs:comment "Ressource udgivet eller udvalgt og arrangeret af en enkelt aktør."@da , "Recurso publicado o curado por un agente único."@es , "Risorsa pubblicata o curata da un singolo agente."@it , "Resource published or curated by a single agent."@en , "Zdroj publikovaný či řízený jediným činitelem."@cs ; + rdfs:label "Katalogizovaný zdroj"@cs , "Recurso catalogado"@es , "Risorsa catalogata"@it , "Katalogiseret ressource"@da , "Catalogued resource"@en ; + skos:changeNote "New class added in DCAT 2.0."@en , "Nuova classe aggiunta in DCAT 2.0."@it , "Ny klasse i DCAT 2.0."@da , "Nová třída přidaná ve verzi DCAT 2.0."@cs , "Nueva clase agregada en DCAT 2.0."@es ; + skos:definition "Resource published or curated by a single agent."@en , "Risorsa pubblicata o curata da un singolo agente."@it , "Ressource udgivet eller udvalgt og arrangeret af en enkelt aktør."@da , "Recurso publicado o curado por un agente único."@es , "Zdroj publikovaný či řízený jediným činitelem."@cs ; + skos:scopeNote "dcat:Resource es un punto de extensión que permite la definición de cualquier tipo de catálogo. Se pueden definir subclases adicionales en perfil de DCAT o una aplicación para catálogos de otro tipo de recursos."@es , "dcat:Resource je bod pro rozšíření umožňující definici různých druhů katalogů. Další podtřídy lze definovat v profilech DCAT či aplikacích pro katalogy zdrojů jiných druhů."@cs , "Třída všech katalogizovaných zdrojů, nadtřída dcat:Dataset, dcat:DataService, dcat:Catalog a všech ostatních členů dcat:Catalog. Tato třída nese vlastnosti společné všem katalogizovaným zdrojům včetně datových sad a datových služeb. Je silně doporučeno používat specifičtější podtřídy, pokud je to možné. Při popisu zdroje, který není ani dcat:Dataset, ani dcat:DataService se doporučuje vytvořit odpovídající podtřídu dcat:Resrouce a nebo použít dcat:Resource s vlastností dct:type pro určení konkrétního typu."@cs , "Klassen for alle katalogiserede ressourcer, den overordnede klasse for dcat:Dataset, dcat:DataService, dcat:Catalog og enhvert medlem af et dcat:Catalog. Denne klasse bærer egenskaber der gælder alle katalogiserede ressourcer, herunder dataset og datatjenester. Det anbefales kraftigt at mere specifikke subklasser oprettes. Når der beskrives ressourcer der ikke er dcat:Dataset eller dcat:DataService, anbefales det at oprette passende subklasser af dcat:Resource eller at dcat:Resource anvendes sammen med egenskaben dct:type til opmærkning med en specifik typeangivelse."@da , "dcat:Resource è un punto di estensione che consente la definizione di qualsiasi tipo di catalogo. Sottoclassi aggiuntive possono essere definite in un profilo DCAT o in un'applicazione per cataloghi di altri tipi di risorse."@it , "La classe di tutte le risorse catalogate, la Superclasse di dcat:Dataset, dcat:DataService, dcat:Catalog e qualsiasi altro membro di dcat:Catalog. Questa classe porta proprietà comuni a tutte le risorse catalogate, inclusi set di dati e servizi dati. Si raccomanda vivamente di utilizzare una sottoclasse più specifica. Quando si descrive una risorsa che non è un dcat:Dataset o dcat:DataService, si raccomanda di creare una sottoclasse di dcat:Resource appropriata, o utilizzare dcat:Resource con la proprietà dct:type per indicare il tipo specifico."@it , "The class of all catalogued resources, the Superclass of dcat:Dataset, dcat:DataService, dcat:Catalog and any other member of a dcat:Catalog. This class carries properties common to all catalogued resources, including datasets and data services. It is strongly recommended to use a more specific sub-class. When describing a resource which is not a dcat:Dataset or dcat:DataService, it is recommended to create a suitable sub-class of dcat:Resource, or use dcat:Resource with the dct:type property to indicate the specific type."@en , "La clase de todos los recursos catalogados, la superclase de dcat:Dataset, dcat:DataService, dcat:Catalog y cualquier otro miembro de un dcat:Catalog. Esta clase tiene propiedades comunes a todos los recursos catalogados, incluyendo conjuntos de datos y servicios de datos. Se recomienda fuertemente que se use una clase más específica. Cuando se describe un recurso que no es un dcat:Dataset o dcat:DataService, se recomienda crear una sub-clase apropiada de dcat:Resource, o usar dcat:Resource con la propiedad dct:type to indicar el tipo específico."@es , "dcat:Resource is an extension point that enables the definition of any kind of catalog. Additional subclasses may be defined in a DCAT profile or application for catalogs of other kinds of resources."@en , "dcat:Resource er et udvidelsespunkt der tillader oprettelsen af enhver type af kataloger. Yderligere subklasser kan defineres i en DCAT-profil eller i en applikation til kataloger med andre typer af ressourcer."@da . + +prov:EmptyCollection rdf:type owl:Class , owl:NamedIndividual ; + rdfs:isDefinedBy ; + rdfs:label "EmptyCollection"@en ; + rdfs:subClassOf prov:Collection ; + prov:category "expanded" ; + prov:component "collections" ; + prov:definition "An empty collection is a collection without members."@en . + +spdx:summary rdf:type owl:DatatypeProperty ; + rdfs:comment "Provides a short description of the package."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:downloadLocation + rdf:type owl:DatatypeProperty ; + rdfs:comment "The URI at which this package is available for download. Private (i.e., not publicly reachable) URIs are acceptable as values of this property. The values http://spdx.org/rdf/terms#none and http://spdx.org/rdf/terms#noassertion may be used to specify that the package is not downloadable or that no attempt was made to determine its download location, respectively."@en ; + rdfs:domain spdx:Package ; + rdfs:range xsd:anyURI ; + vs:term_status "stable"@en . + +spdx:purpose_archive rdf:type owl:NamedIndividual , spdx:Purpose ; + rdfs:comment "The package refers to an archived collection of files (.tar, .zip, etc)."@en ; + vs:term_status "stable"@en . + +prov:wasStartedBy rdf:type owl:ObjectProperty ; + rdfs:comment "Start is when an activity is deemed to have started. A start may refer to an entity, known as trigger, that initiated the activity."@en ; + rdfs:domain prov:Activity ; + rdfs:isDefinedBy ; + rdfs:label "wasStartedBy" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedStart prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedStart prov:entity ) ; + prov:category "expanded" ; + prov:component "entities-activities" ; + prov:inverse "started" ; + prov:qualifiedForm prov:qualifiedStart , prov:Start . + +prov:wasDerivedFrom rdf:type owl:ObjectProperty ; + rdfs:comment "The more specific subproperties of prov:wasDerivedFrom (i.e., prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource) should be used when applicable."@en ; + rdfs:domain prov:Entity ; + rdfs:isDefinedBy ; + rdfs:label "wasDerivedFrom" ; + rdfs:range prov:Entity ; + rdfs:subPropertyOf prov:wasInfluencedBy ; + owl:propertyChainAxiom ( prov:qualifiedDerivation prov:entity ) ; + owl:propertyChainAxiom ( prov:qualifiedDerivation prov:entity ) ; + prov:category "starting-point" ; + prov:component "derivations" ; + prov:definition "A derivation is a transformation of an entity into another, an update of an entity resulting in a new one, or the construction of a new entity based on a pre-existing entity."@en ; + prov:inverse "hadDerivation" ; + prov:qualifiedForm prov:Derivation , prov:qualifiedDerivation . + +vcard:region rdf:type owl:DatatypeProperty ; + rdfs:comment "The region (e.g. state or province) associated with the address of the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "region"@en ; + rdfs:range xsd:string . + +spdx:ReferenceCategory + rdf:type owl:Class ; + rdfs:comment "Category used for ExternalRef"@en ; + vs:term_status "stable"@en . + +vcard:TelephoneType rdf:type owl:Class ; + rdfs:comment "Used for telephone type codes. The URI of the telephone type code must be used as the value for the Telephone Type."@en ; + rdfs:isDefinedBy ; + rdfs:label "Phone"@en . + +dcterms:TGN rdf:type dcam:VocabularyEncodingScheme ; + rdfs:comment "The set of places specified by the Getty Thesaurus of Geographic Names."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "TGN"@en ; + rdfs:seeAlso ; + dcterms:issued "2000-07-11"^^xsd:date . + +spdx:relationshipType_fileAdded + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_fileAdded expresses that the SPDXElement is a file which has been added to the relatedSPDXElement package. For example, a package (the relatedSPDXElement) has been patched to remove a file (the SPDXElement). This relationship is typically used to express the result of a patched package when the actual patchfile is not present."@en ; + vs:term_status "stable"@en . + +time:inDateTime rdf:type owl:ObjectProperty ; + rdfs:comment "Position of an instant, expressed using a structured description"@en , "Posición de un instante, expresada utilizando una descripción estructurada."@es ; + rdfs:domain time:Instant ; + rdfs:label "in date-time description"@en , "en descripción de fecha-hora"@es ; + rdfs:range time:GeneralDateTimeDescription ; + rdfs:subPropertyOf time:inTemporalPosition ; + skos:definition "Posición de un instante, expresada utilizando una descripción estructurada."@es , "Position of an instant, expressed using a structured description"@en . + +spdx:relationshipType_generatedFrom + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_generatedFrom expresses that an SPDXElement was generated from the relatedSPDXElement. For example, a binary File might have been generated from a source File."@en ; + vs:term_status "stable"@en . + +xsd:date rdf:type rdfs:Datatype . + +vcard:hasKey rdf:type owl:ObjectProperty ; + rdfs:comment "To specify a public key or authentication certificate associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has key"@en ; + owl:equivalentProperty vcard:key . + +spdx:Package rdf:type owl:Class ; + rdfs:comment "A Package represents a collection of software files that are delivered as a single functional component."@en ; + rdfs:subClassOf spdx:SpdxItem ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:File ; + owl:onProperty spdx:hasFile + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean ; + owl:onProperty spdx:filesAnalyzed + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:originator + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Checksum ; + owl:onProperty spdx:checksum + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI ; + owl:onProperty doap:homepage + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:date ; + owl:onProperty spdx:validUntilDate + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:summary + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:sourceInfo + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass spdx:PackageVerificationCode ; + owl:onProperty spdx:packageVerificationCode + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:packageFileName + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:description + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onDataRange xsd:anyURI ; + owl:onProperty spdx:downloadLocation ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:supplier + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:minQualifiedCardinality "0"^^xsd:nonNegativeInteger ; + owl:onClass spdx:ExternalRef ; + owl:onProperty spdx:externalRef + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass spdx:Purpose ; + owl:onProperty spdx:primaryPackagePurpose + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty spdx:versionInfo + ] ; + rdfs:subClassOf [ rdf:type owl:Class ; + owl:unionOf ( [ rdf:type owl:Restriction ; + owl:hasValue spdx:noassertion ; + owl:onProperty spdx:licenseDeclared + ] + [ rdf:type owl:Restriction ; + owl:hasValue spdx:none ; + owl:onProperty spdx:licenseDeclared + ] + [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass spdx:AnyLicenseInfo ; + owl:onProperty spdx:licenseDeclared + ] + ) + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:date ; + owl:onProperty spdx:builtDate + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:date ; + owl:onProperty spdx:releaseDate + ] ; + vs:term_status "stable"@en . + + + rdf:type owl:Ontology ; + owl:imports , , , , , , , , , . + +prov:unqualifiedForm rdf:type owl:AnnotationProperty ; + rdfs:comment "Classes and properties used to qualify relationships are annotated with prov:unqualifiedForm to indicate the property used to assert an unqualified provenance relation."@en ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + +spdx:relationshipType_specificationFor + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "Is to be used when SPDXRef-A describes, illustrates, or defines a design specification for SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:crossRef rdf:type owl:ObjectProperty ; + rdfs:comment "Cross Reference Detail for a license SeeAlso URL"@en ; + rdfs:range spdx:SimpleLicensingInfo . + +vcard:Internet rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Internet"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + + + rdf:type sh:NodeShape ; + sh:name "Dataset"@en ; + sh:property [ sh:path dcterms:isVersionOf ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcterms:relation ; + sh:severity sh:Violation + ] ; + sh:property [ sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:creator ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dc:isReferencedBy ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:accessRights ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:provenance ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:publisher ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:spatial ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:hasVersion ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:distribution ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path adms:identifier ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:modified ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:conformsTo ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:path dcterms:accrualPeriodicity ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:type ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path adms:sample ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:source ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:theme ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:temporal ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path foaf:page ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcterms:language ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path adms:versionNotes ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:contactPoint ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:node ; + sh:path dcterms:issued ; + sh:severity sh:Violation + ] ; + sh:property [ sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ] ; + sh:property [ sh:nodeKind sh:Literal ; + sh:path dcterms:identifier ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:property [ sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path owl:versionInfo ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcterms:title ; + sh:severity sh:Violation + ] ; + sh:property [ sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcterms:description ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:landingPage ; + sh:severity sh:Violation + ] ; + sh:property [ sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + +vcard:TextPhone rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Text phone"@en ; + rdfs:subClassOf vcard:TelephoneType . + +vcard:Date rdf:type owl:Class ; + rdfs:isDefinedBy ; + rdfs:label "Date"@en ; + rdfs:subClassOf vcard:RelatedType . + +vcard:hasURL rdf:type owl:ObjectProperty ; + rdfs:comment "To specify a uniform resource locator associated with the object"@en ; + rdfs:isDefinedBy ; + rdfs:label "has url"@en ; + owl:equivalentProperty vcard:url . + +spdx:licenseExceptionTemplate + rdf:type owl:DatatypeProperty ; + rdfs:comment "Template for matching license exception text"@en ; + rdfs:domain spdx:LicenseException ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +spdx:relationshipType_documentation + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "To be used when SPDXRef-A provides documentation of SPDXRef-B."@en ; + vs:term_status "stable"@en . + +spdx:relationshipType_containedBy + rdf:type owl:NamedIndividual , spdx:RelationshipType ; + rdfs:comment "A Relationship of relationshipType_containedBy expresses that an SPDXElement is contained by the relatedSPDXElement. For example, a File contained by a Package. "@en ; + vs:term_status "stable"@en . + +vcard:extended-address + rdf:type owl:DatatypeProperty ; + rdfs:comment "This data property has been deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "extended address"@en ; + owl:deprecated true . + +vcard:Dom rdf:type owl:Class ; + rdfs:comment "This class is deprecated"@en ; + rdfs:isDefinedBy ; + rdfs:label "Dom"@en ; + rdfs:subClassOf vcard:Type ; + owl:deprecated true . + +spdx:attributionText rdf:type owl:DatatypeProperty ; + rdfs:comment "This field provides a place for the SPDX data creator to record acknowledgements that may be required to be communicated in some contexts. This is not meant to include the actual complete license text (see licenseConculded and licenseDeclared), and may or may not include copyright notices (see also copyrightText). The SPDX data creator may use this field to record other acknowledgements, such as particular clauses from license texts, which may be necessary or desirable to reproduce."@en ; + rdfs:domain spdx:SpdxItem ; + rdfs:range xsd:string ; + vs:term_status "stable"@en . + +time:inXSDgYearMonth rdf:type owl:DatatypeProperty ; + rdfs:comment "Position of an instant, expressed using xsd:gYearMonth"@en , "Posición de un instante, expresado utilizando xsd:gYearMonth."@es ; + rdfs:domain time:Instant ; + rdfs:label "in XSD g-YearMonth"@en , "en año-mes gregoriano XSD"@es ; + rdfs:range xsd:gYearMonth ; + skos:definition "Position of an instant, expressed using xsd:gYearMonth"@en , "Posición de un instante, expresado utilizando xsd:gYearMonth."@es . + +prov:Derivation rdf:type owl:Class ; + rdfs:comment "An instance of prov:Derivation provides additional descriptions about the binary prov:wasDerivedFrom relation from some derived prov:Entity to another prov:Entity from which it was derived. For example, :chewed_bubble_gum prov:wasDerivedFrom :unwrapped_bubble_gum; prov:qualifiedDerivation [ a prov:Derivation; prov:entity :unwrapped_bubble_gum; :foo :bar ]."@en , "The more specific forms of prov:Derivation (i.e., prov:Revision, prov:Quotation, prov:PrimarySource) should be asserted if they apply."@en ; + rdfs:isDefinedBy ; + rdfs:label "Derivation" ; + rdfs:subClassOf prov:EntityInfluence ; + prov:category "qualified" ; + prov:component "derivations" ; + prov:constraints "http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig"^^xsd:anyURI ; + prov:definition "A derivation is a transformation of an entity into another, an update of an entity resulting in a new one, or the construction of a new entity based on a pre-existing entity."@en ; + prov:dm "http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Derivation"^^xsd:anyURI ; + prov:n "http://www.w3.org/TR/2013/REC-prov-n-20130430/#Derivation-Relation"^^xsd:anyURI ; + prov:unqualifiedForm prov:wasDerivedFrom . + +spdx:Relationship rdf:type owl:Class ; + rdfs:comment "A Relationship represents a relationship between two SpdxElements."@en ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:SpdxElement ; + owl:onProperty spdx:relatedSpdxElement ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onClass spdx:RelationshipType ; + owl:onProperty spdx:relationshipType ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger + ] ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string ; + owl:onProperty rdfs:comment + ] ; + vs:term_status "stable"@en . + +dcterms:dateCopyrighted + rdf:type rdf:Property ; + rdfs:comment "Date of copyright of the resource."@en ; + rdfs:isDefinedBy dcterms: ; + rdfs:label "Date Copyrighted"@en ; + rdfs:range rdfs:Literal ; + rdfs:subPropertyOf dc:date , dcterms:date ; + dcterms:description "Typically a year. Recommended practice is to describe the date, date/time, or period of time as recommended for the property Date, of which this is a subproperty."@en ; + dcterms:issued "2002-07-13"^^xsd:date . + +time:years rdf:type owl:DatatypeProperty ; + rdfs:comment "length of, or element of the length of, a temporal extent expressed in years"@en , "Longitud de, o elemento de la longitud de, una extensión temporal expresada en años."@es ; + rdfs:domain time:GeneralDurationDescription ; + rdfs:label "years duration"@en , "duración en años"@es ; + rdfs:range xsd:decimal . + +vcard:hasOrganizationName + rdf:type owl:ObjectProperty ; + rdfs:comment "Used to support property parameters for the organization name data property"@en ; + rdfs:isDefinedBy ; + rdfs:label "has organization name"@en . + +prov:constraints rdf:type owl:AnnotationProperty ; + rdfs:comment "A reference to the principal section of the PROV-CONSTRAINTS document that describes this concept."@en ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso . + + + rdf:type owl:Ontology ; + rdfs:comment "This specification describes the SPDX® language, defined as a dictionary of named properties and classes using W3C's RDF Technology.\n\nSPDX® is an open standard for communicating software bill of material information, including components, licenses, copyrights, and security references. SPDX reduces redundant work by providing a common format for companies and communities to share important data, thereby streamlining and improving compliance.\n.\nKnown issues:\n- rdfs:comment and rdfs:seeAlso are used within the SPDX classes and causes a redefinition of these standard terms"@en ; + rdfs:label "SPDX 2.3" ; + owl:versionIRI ; + owl:versionInfo 2.3 . diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-hvd-2.2.0-SHACL.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-hvd-2.2.0-SHACL.ttl new file mode 100644 index 00000000000..36fccb764e5 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/dcat-ap-hvd-2.2.0-SHACL.ttl @@ -0,0 +1,712 @@ +@prefix dc: . +@prefix dcat: . +@prefix foaf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix shacl: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + rdfs:member , + , + , + , + , + , + , + , + , + , + , + , + , + , + . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + ; + shacl:targetClass dcat:CatalogRecord . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:name "primary topic"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path foaf:primaryTopic; + "The expected value for primary topic is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:minCount 1; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "Minimally 1 values are expected for primary topic"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#CatalogueRecord.primarytopic"; + shacl:class dcat:Resource; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "The range of primary topic must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:maxCount 1; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "Maximally 1 values allowed for primary topic"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + ; + shacl:targetClass dcat:Catalog . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Catalogue.dataset"; + shacl:description "A Dataset that is part of the Catalogue."@en; + shacl:name "dataset"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:dataset; + "The expected value for dataset is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Catalogue.record"; + shacl:class dcat:CatalogRecord; + shacl:description "A Catalogue Record that is part of the Catalogue"@en; + shacl:name "record"@en; + shacl:path dcat:record; + "The range of record must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Catalogue.record"; + shacl:description "A Catalogue Record that is part of the Catalogue"@en; + shacl:name "record"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:record; + "The expected value for record is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Catalogue.dataset"; + shacl:class dcat:Dataset; + shacl:description "A Dataset that is part of the Catalogue."@en; + shacl:name "dataset"@en; + shacl:path dcat:dataset; + "The range of dataset must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Catalogue.service"; + shacl:class dcat:DataService; + shacl:description "A site or end-point (Data Service) that is listed in the Catalogue."@en; + shacl:name "service"@en; + shacl:path dcat:service; + "The range of service must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Catalogue.service"; + shacl:description "A site or end-point (Data Service) that is listed in the Catalogue."@en; + shacl:name "service"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:service; + "The expected value for service is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:DataService . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.servesdataset"; + shacl:class dcat:Dataset; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:name "serves dataset"@en; + shacl:path dcat:servesDataset; + "The range of serves dataset must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.HVDcategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + "The range of HVD category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.endpointURL"; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:name "endpoint URL"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointURL; + "The expected value for endpoint URL is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for HVD category is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.endpointdescription"; + shacl:description "A description of the services available via the end-points, including their operations, parameters etc."@en; + shacl:name "endpoint description"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointDescription; + "The expected value for endpoint description is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.documentation"; + shacl:class foaf:Document; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:name "documentation"@en; + shacl:path foaf:Page; + "The range of documentation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:minCount 1; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "Minimally 1 values are expected for contact point"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.contactpoint"; + shacl:class vcard:Kind; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "The range of contact point must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.endpointURL"; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:minCount 1; + shacl:name "endpoint URL"@en; + shacl:path dcat:endpointURL; + "Minimally 1 values are expected for endpoint URL"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.documentation"; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:minCount 1; + shacl:name "documentation"@en; + shacl:path foaf:Page; + "Minimally 1 values are expected for documentation"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.rights"; + shacl:class dc:RightsStatement; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:path dc:rights; + "The range of rights must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.documentation"; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:name "documentation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path foaf:Page; + "The expected value for documentation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:name "contact point"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:contactPoint; + "The expected value for contact point is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.licence"; + shacl:description "A licence under which the Data service is made available."@en; + shacl:maxCount 1; + shacl:name "licence"@en; + shacl:path dc:license; + "Maximally 1 values allowed for licence"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.rights"; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:rights; + "The expected value for rights is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.servesdataset"; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:name "serves dataset"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:servesDataset; + "The expected value for serves dataset is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.licence"; + shacl:class dc:LicenseDocument; + shacl:description "A licence under which the Data service is made available."@en; + shacl:name "licence"@en; + shacl:path dc:license; + "The range of licence must be of type ."@en . + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.servesdataset"; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:minCount 1; + shacl:name "serves dataset"@en; + shacl:path dcat:servesDataset; + "Minimally 1 values are expected for serves dataset"@en . + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.licence"; + shacl:description "A licence under which the Data service is made available."@en; + shacl:name "licence"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:license; + "The expected value for licence is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:minCount 1; + shacl:name "HVD category"@en; + shacl:path ; + "Minimally 1 values are expected for HVD category"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:Dataset . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.conformsto"; + shacl:description "An implementing rule or other specification."@en; + shacl:name "conforms to"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:conformsTo; + "The expected value for conforms to is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.datasetdistribution"; + shacl:class dcat:Distribution; + shacl:description "An available Distribution for the Dataset."@en; + shacl:name "dataset distribution"@en; + shacl:path dcat:distribution; + "The range of dataset distribution must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.datasetdistribution"; + shacl:description "An available Distribution for the Dataset."@en; + shacl:minCount 1; + shacl:name "dataset distribution"@en; + shacl:path dcat:distribution; + "Minimally 1 values are expected for dataset distribution"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.contactpoint"; + shacl:class vcard:Kind; + shacl:description "Contact information that can be used for sending comments about the Dataset."@en; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "The range of contact point must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.HVDCategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:path ; + "The range of HVD Category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for HVD Category is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Dataset."@en; + shacl:name "contact point"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:contactPoint; + "The expected value for contact point is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:minCount 1; + shacl:name "HVD Category"@en; + shacl:path ; + "Minimally 1 values are expected for HVD Category"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.conformsto"; + shacl:class dc:Standard; + shacl:description "An implementing rule or other specification."@en; + shacl:name "conforms to"@en; + shacl:path dc:conformsTo; + "The range of conforms to must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.datasetdistribution"; + shacl:description "An available Distribution for the Dataset."@en; + shacl:name "dataset distribution"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:distribution; + "The expected value for dataset distribution is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:Distribution . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.linkedschemas"; + shacl:class dc:Standard; + shacl:description "An established schema to which the described Distribution conforms."@en; + shacl:name "linked schemas"@en; + shacl:path dc:conformsTo; + "The range of linked schemas must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.accessservice"; + shacl:description "A data service that gives access to the distribution of the dataset"@en; + shacl:name "access service"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:accessService; + "The expected value for access service is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.linkedschemas"; + shacl:description "An established schema to which the described Distribution conforms."@en; + shacl:name "linked schemas"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:conformsTo; + "The expected value for linked schemas is a rdfs:Resource (URI or blank node)"@en . + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.accessservice"; + shacl:class dcat:DataService; + shacl:description "A data service that gives access to the distribution of the dataset"@en; + shacl:name "access service"@en; + shacl:path dcat:accessService; + "The range of access service must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.rights"; + shacl:class dc:RightsStatement; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:path dc:rights; + "The range of rights must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.licence"; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:maxCount 1; + shacl:name "licence"@en; + shacl:path dc:license; + "Maximally 1 values allowed for licence"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.accessURL"; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:name "access URL"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:accessURL; + "The expected value for access URL is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.rights"; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:rights; + "The expected value for rights is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.licence"; + shacl:class dc:LicenseDocument; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:name "licence"@en; + shacl:path dc:license; + "The range of licence must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.accessURL"; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:minCount 1; + shacl:name "access URL"@en; + shacl:path dcat:accessURL; + "Minimally 1 values are expected for access URL"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.licence"; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:name "licence"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:license; + "The expected value for licence is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass foaf:Document . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + , + ; + shacl:targetClass vcard:Kind . + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Kind.email"; + shacl:description """A email address via which contact can be made."""@en; + shacl:name "email"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path vcard:hasEmail; + "The expected value for email is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Kind.contactpage"; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:name "contact page"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path vcard:hasURL; + "The expected value for contact page is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Kind.contactpage"; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:maxCount 1; + shacl:name "contact page"@en; + shacl:path vcard:hasURL; + "Maximally 1 values allowed for contact page"@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Kind.email"; + shacl:description """A email address via which contact can be made."""@en; + shacl:maxCount 1; + shacl:name "email"@en; + shacl:path vcard:hasEmail; + "Maximally 1 values allowed for email"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:LicenseDocument . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Literal . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:RightsStatement . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:Standard . + + + + rdfs:seeAlso "https://semiceu.github.io/uri.semic.eu-generated/DCAT-AP/releases/2.2.0-hvd/#Kind"; + shacl:description """It is recommended to provide at least either an email or a contact form from e.g. a service desk. """@en; + shacl:or ( + [ + shacl:path vcard:hasEmail; + shacl:minCount 1 ; + ] + [ + shacl:path vcard:hasURL; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass vcard:Kind ; + shacl:severity shacl:Warning ; + "It is recommended to provide at least either an email or a contact form from e.g. a service desk. "@en . + + + + rdfs:seeAlso "https://semiceu.github.io/uri.semic.eu-generated/DCAT-AP/releases/2.2.0-hvd/#c3"; + shacl:description """It is mandatory to provide legal information."""@en; + shacl:or ( + [ + shacl:path dc:license; + shacl:minCount 1 ; + ] + [ + shacl:path dc:rights; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dcat:Distribution; + "It is mandatory to provide legal information."@en . + + rdfs:seeAlso "https://semiceu.github.io/uri.semic.eu-generated/DCAT-AP/releases/2.2.0-hvd/#c3"; + shacl:description """It is mandatory to provide legal information."""@en; + shacl:or ( + [ + shacl:path dc:license; + shacl:minCount 1 ; + ] + [ + shacl:path dc:rights; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dcat:DataService; + "It is mandatory to provide legal information."@en . + + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Distribution.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdf:type owl:Ontology ; + owl:imports . + + + a shacl:NodeShape ; + rdfs:comment "HVD Category Restriction" ; + rdfs:label "HVD Category Restriction" ; + shacl:property [ + shacl:hasValue ; + shacl:minCount 1 ; + shacl:nodeKind shacl:IRI ; + shacl:path skos:inScheme + ] . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#Dataset.HVDcategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io//DCAT-AP/releases/2.2.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be of type ."@en . diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/README.md b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/README.md new file mode 100644 index 00000000000..c77c21496c7 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/README.md @@ -0,0 +1 @@ +SHACL from https://github.com/SEMICeu/DCAT-AP/tree/gh-pages/releases/3.0.0-draft/html/shacl \ No newline at end of file diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl new file mode 100644 index 00000000000..4f606ff14fe --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl @@ -0,0 +1,123 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + +#------------------------------------------------------------------------- +# The shapes in this file cover all URI changes that require attention +# by the catalogue owner. +# +# deprecated by the transition from version 1.x to 2.x +# +#------------------------------------------------------------------------- + +:PeriodOfTimeDeprecation_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime Deprecation properties"@en ; + sh:property [ + sh:path schema:endDate ; + sh:severity sh:Warning ; + sh:message "replace property schema:endDate with dcat:endDate"@en + ], [ + sh:path schema:startDate ; + sh:severity sh:Warning ; + sh:message "replace property schema:startDate with dcat:startDate"@en + ] ; + sh:targetClass dct:PeriodOfTime . + + +#------------------------------------------------------------------------- +# The shapes in this file cover all URI changes that require attention +# by the catalogue owner. +# +# deprecated by the transition from version 1.x to 2.x +# +#------------------------------------------------------------------------- + + +:DatasetDeprecation_Shape + a sh:NodeShape ; + rdfs:label "Dataset Deprecation properties"@en ; + sh:property [ + sh:path dct:hasVersion ; + sh:severity sh:Warning ; + sh:message "replace property dct:hasVersion with dcat:hasVersion"@en + + ], [ + sh:path dct:isVersionOf ; + sh:severity sh:Warning ; + sh:message "replace dct:isVersionOf with dcat:isVersionOf"@en + ], [ + sh:path owl:versionInfo ; + sh:severity sh:Warning ; + sh:message "replace owl:versionInfo with dcat:version"@en + ]; + sh:targetClass dcat:Dataset . + + +#------------------------------------------------------------------------- +# The shapes in this file cover all URI changes that require attention +# by the catalogue owner. +# +# deprecated by the transition from version 2.x to 3.x +# +#------------------------------------------------------------------------- + + +:DatasetInverseProperties_Shape + a sh:NodeShape ; + rdfs:label "Dataset Deprecation properties"@en ; + sh:property [ + sh:path dcat:isVersionOf ; + sh:severity sh:Warning ; + sh:message "dcat:isVersionOf is an inverse property and should only be used if dcat:hasVersion is present."@en + ]; + sh:targetClass dcat:Dataset . + + + + + rdf:type owl:Ontology ; + owl:imports . + + +:StatusRestrictionADMS + a sh:NodeShape ; + rdfs:comment "Status restriction" ; + rdfs:label "Status restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + + +:Distribution_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :StatusRestrictionADMS ; + sh:nodeKind sh:IRI ; + sh:path adms:status ; + sh:description "The codelist of adms:status has changed from DCAT-AP 2.1 to DCAT-AP 3.0.0" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution. \ No newline at end of file diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/imports.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/imports.ttl new file mode 100644 index 00000000000..47cc2efc350 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/imports.ttl @@ -0,0 +1,28 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +# +# This file provides the imports that are implicitly the result of reusing them in the DCAT-AP application profile. +# The imports point to the URL of the RDF serializations (mostly the turtle serializations) as not all ontology URIs have content negotation implemented. +# The RDF format is required for the ISA testbed validator. +# The following imports have been outcommented: +# owl:imports ; import is excluded because the shacl shape for Category applies to all instances of skos:Concept and the skos:Concepts in the ODRL do not comply to this. + + + + rdf:type owl:Ontology ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports + . + + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl new file mode 100644 index 00000000000..c2cbfb8043c --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl @@ -0,0 +1,440 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + + dcat:accessURL ; + dcat:downloadURL ; + dcatap:availability ; + dct:format ; + dct:conformsTo ; + dct:creator [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dct:license ; + cc:attributionURL ; + dct:modified "2021-12-01"^^xsd:date ; + dct:publisher ; + dct:relation ; + dct:description "This document specifies the controlled vocabulary constraints on properties expressed by DCAT-AP in SHACL."@en ; + dct:title "Controlled Vocabulary Constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + foaf:homepage ; + foaf:maker [ + foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + +:AvailabilityRestriction + a sh:NodeShape ; + rdfs:comment "Availability restriction" ; + rdfs:label "Availability restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:ContinentRestriction + a sh:NodeShape ; + rdfs:comment "Continent restriction" ; + rdfs:label "Continent restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:CorporateBodyRestriction + a sh:NodeShape ; + rdfs:comment "Corporate Body Restriction" ; + rdfs:label "Corporate Body Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:CountryRestriction + a sh:NodeShape ; + rdfs:comment "Country restriction" ; + rdfs:label "Country restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:DataThemeRestriction + a sh:NodeShape ; + rdfs:comment "Data Theme Restriction" ; + rdfs:label "Data Theme Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:AccessRightRestriction + a sh:NodeShape ; + rdfs:comment "Access Rights Restriction" ; + rdfs:label "Data Theme Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:DatasetTypeRestriction + a sh:NodeShape ; + rdfs:comment "Dataset Type Restriction" ; + rdfs:label "Dataset Type Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + + +:FileTypeRestriction + a sh:NodeShape ; + rdfs:comment "File Type Restriction" ; + rdfs:label "File Type Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:FrequencyRestriction + a sh:NodeShape ; + rdfs:comment "Frequency Restriction" ; + rdfs:label "Frequency Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:GeoNamesRestrictionRegexURI + rdfs:comment "Geonames restriction - base itself on URI structure" ; + rdfs:label "Geonames restriction" ; + a sh:NodeShape ; + sh:pattern "^https://sws.geonames.org" . + + +:LanguageRestriction + a sh:NodeShape ; + rdfs:comment "Language Restriction" ; + rdfs:label "Language Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:LicenceTypeRestriction + a sh:NodeShape ; + rdfs:comment "Licence type restriction" ; + rdfs:label "Licence type restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:PlaceRestriction + a sh:NodeShape ; + rdfs:comment "Place restriction" ; + rdfs:label "Place restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:PublisherTypeRestriction + a sh:NodeShape ; + rdfs:comment "Publisher type restriction" ; + rdfs:label "Publisher type restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:IANARestrictionRegexURI + rdfs:comment "IANA restriction - base itself on URL structure" ; + rdfs:label "IANA restriction" ; + a sh:NodeShape ; + sh:pattern "^http.*://www.iana.org/assignments/media-types/" . + +:StatusRestriction + a sh:NodeShape ; + rdfs:comment "Status restriction" ; + rdfs:label "Status restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:ChecksumAlgorithmRestriction + a sh:NodeShape ; + rdfs:comment "Checksum algorithm restriction" ; + rdfs:label "Checksum algorithm restriction" ; + sh:pattern "^https://spdx.org/rdf/terms" ; + sh:class . + +:Checksum_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :ChecksumAlgorithmRestriction ; + sh:nodeKind sh:IRI ; + sh:path spdx:algorithm + ] ; + sh:targetClass spdx:Checksum. + +:LicenseDocument_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :LicenceTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type + ] ; + sh:targetClass dct:LicenseDocument. + + + +:Catalog_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ], [ + sh:hasValue ; + sh:nodeKind sh:IRI ; + sh:path dcat:themeTaxonomy ; + sh:description "Multiple themes can be used but at least should be present" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Catalog. + +:Dataset_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FrequencyRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accrualPeriodicity ; + sh:description "A non EU managed concept is used to indicate the accrualPeriodicity frequency. If no corresponding can be found inform the maintainer of the EU frequency NAL" ; + sh:severity sh:Violation + ], [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ], [ + sh:node :DataThemeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:description "Multiple themes can be used but at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :DatasetTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type ; + sh:description "Multiple types can be used but it is recommended to also provide at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :AccessRightRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accessRights ; + sh:description "A non EU managed concept is used to indicate the access right. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset. + +# ------------------------------------------------------------------------------------------------------------------ +# The constraints for dcat:mediaType, dcat:compressFormat, dcat:packageFormat which are limited to the IANA codelist +# cannot be expressed in SHACL unless a copy in RDF for the IANA codelist is being created. +# A less formal check is provided based upon the assumption that the IANIA codelist is hosted on a known URL domain. +# This check is sensitive to the publication strategy of IANA. +# ------------------------------------------------------------------------------------------------------------------ +:Distribution_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FileTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:format ; + sh:description "A non EU managed concept is used to indicate the format of the distribution. If no corresponding can be found inform the maintainer of the fileformat NAL." ; + sh:severity sh:Violation + ], [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :StatusRestriction ; + sh:nodeKind sh:IRI ; + sh:path adms:status ; + sh:description "A non EU managed concept is used to indicate the status of the distribution. If no corresponding can be found inform the maintainer of the adms:status codelist." ; + sh:severity sh:Violation + ], [ + sh:node :AvailabilityRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcatap:availability ; + sh:description "A non EU managed concept is used to indicate the availability of the distribution. If no corresponding can be found inform the maintainer of the DCAT-AP availability codelist." ; + sh:severity sh:Violation + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:mediaType ; + sh:description "A mediaType expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Warning + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:compressFormat ; + sh:description "A compressFormat expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Warning + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:packageFormat ; + sh:description "A packageFormat expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution. + +:DataService_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :AccessRightRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accessRights ; + sh:description "A non EU managed concept is used to indicate the access right. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution. + + +:Publisher_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :PublisherTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type ; + sh:description "A non EU managed concept is used to indicate the type of the publisher. If no corresponding can be found inform the maintainer of the adms:publishertype codelist." ; + sh:severity sh:Violation + ] . diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl new file mode 100644 index 00000000000..a5363b31df8 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl @@ -0,0 +1,29 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +# +# This file provides the imports of the codelists recommended by the DCAT-AP application profile. +# http://publications.europa.eu/resource/authority/dataset-type (TODO) + + + + rdf:type owl:Ontology ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports +. + +# import of the checksum vocabulary +# owl:imports ; diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/range.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/range.ttl new file mode 100644 index 00000000000..2ce766d8519 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/range.ttl @@ -0,0 +1,449 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dct:description "This file contains the class range constraints for all properties in DCAT-AP"@en. + + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all class range constraints in DCAT-AP +# +# Depending on the exchange agreements these may be necessary to be part +# of the validation process. However they mostly figure in the semantical +# understanding of the ranges. +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:node :DcatResource_Shape ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class dcat:CatalogRecord ; + sh:path dct:source ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:class dct:Location ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dct:hasPart ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dct:isPartOf ; + sh:severity sh:Violation + ], [ + sh:class dct:RightsStatement ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:class dcat:CatalogRecord ; + sh:path dcat:record ; + sh:severity sh:Violation + ], [ + sh:class skos:ConceptScheme ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ], [ + sh:class dcat:DataService ; + sh:path dcat:service ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dcat:catalog ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dcat:dataset ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:class dct:RightsStatement ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class vcard:Kind ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaTypeOrExtent ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:path dct:publisher ; + sh:class foaf:Agent; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dcat:servesDataset ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcat:theme ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:class dct:RightsStatement ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class vcard:Kind ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:class dcat:Distribution ; + sh:path dcat:distribution ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:path dct:accrualPeriodicity; + sh:class dct:Frequency; + sh:severity sh:Violation + ], [ + sh:class dct:Location ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dct:hasVersion ; + sh:severity sh:Violation + ], [ + sh:class dcat:DatasetSeries ; + sh:path dcat:inSeries ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class adms:Identifier ; + sh:path adms:identifier ; + sh:severity sh:Violation + ], [ + sh:class dct:ProvenanceStatement ; + sh:path dct:provenance ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:class prov:Attribution ; + sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ], [ + sh:class dcat:Relationship ; + sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ], [ + sh:class dcat:Distribution ; + sh:path adms:sample ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:class dct:PeriodOfTime ; + sh:path dct:temporal ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ], [ + sh:class prov:Activity ; + sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset, DataService or Dataset Series" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset, DataService or a Dataset Series" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:class dcat:DataService ; + sh:path dcat:accessService ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ], [ + sh:class spdx:Checksum ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaTypeOrExtent ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:class odrl:Policy ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ], [ + sh:class dct:RightsStatement ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path adms:status ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:LicenseDocument . + + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:class time:Instant ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ], [ + sh:class time:Instant ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:PeriodOfTime . + +:Relationship_Shape + a sh:NodeShape ; + rdfs:label "Relationship"@en ; + sh:property [ + sh:node :DcatResource_Shape ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:class dcat:Role ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset Series"@en ; + sh:property [ + sh:class dcat:Dataset ; + sh:path [ sh:inversePath dcat:inSeries; ]; + sh:severity sh:Warning + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:path dcat:contactPoint; + sh:class vcard:Kind; + sh:severity sh:Violation + ], [ + sh:path dct:accrualPeriodicity; + sh:class dct:Frequency; + sh:severity sh:Violation + ], [ + sh:path dct:spatial; + sh:class dct:Location; + sh:severity sh:Violation + ], [ + sh:path dct:publisher ; + sh:class foaf:Agent; + sh:severity sh:Violation + ], [ + sh:path dct:temporal; + sh:class dct:PeriodOfTime; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DatasetSeries . \ No newline at end of file diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes.ttl new file mode 100644 index 00000000000..d179365472f --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes.ttl @@ -0,0 +1,746 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dct:format ; + dct:conformsTo ; + dct:description "This files specifies the core constraints on properties and classes expressed by DCAT-AP in SHACL."@en. + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all classes in DCAT-AP 3.0.0 +# It covers all constraints that must be satisfied except those verifying +# the class ranges. This can be found in a separate file. +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path foaf:name ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:node :DcatResource_Shape ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dct:modified ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:maxCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:nodeKind sh:IRI; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:hasPart ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:record ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:service ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:catalog ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:dataset ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + +:CategoryScheme_Shape + a sh:NodeShape ; + rdfs:label "Category Scheme"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:ConceptScheme . + +:Category_Shape + a sh:NodeShape ; + rdfs:label "Category"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path skos:prefLabel ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:Concept . + +:Checksum_Shape + a sh:NodeShape ; + rdfs:label "Checksum"@en ; + sh:property [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:algorithm ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:hexBinary ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:checksumValue ; + sh:severity sh:Violation + ] ; + sh:targetClass spdx:Checksum . + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path dct:accessRights ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:nodeKind sh:IRI; + sh:severity sh:Violation + ], [ + sh:path dct:conformsTo ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointURL ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointDescription ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:servesDataset ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:distribution ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:accrualPeriodicity; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:hasVersion ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:identifier ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:inSeries ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:isReferencedBy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:modified ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:identifier ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:provenance ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:issued ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:sample ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:temporal ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:type ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:version ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path adms:versionNotes ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + +:DateOrDateTimeDataType_Shape + a sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a temporal value: date, dateTime, gYear or gYearMonth literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date, xsd:dateTime, xsd:gYear or xsd:gYearMonth" ; + sh:or ([ + sh:datatype xsd:date + ] + [ + sh:datatype xsd:dateTime + ] + [ + sh:datatype xsd:gYear + ] + [ + sh:datatype xsd:gYearMonth + ] + ) . + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:accessService ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:accessURL ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:byteSize ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:downloadURL ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + +:Identifier_Shape + a sh:NodeShape ; + rdfs:label "Identifier"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path skos:notation ; + sh:severity sh:Violation + ] ; + sh:targetClass adms:Identifier . + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + rdfs:label "Location"@en ; + sh:property [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:bbox ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:centroid ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path lcon:geometry ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:Location . + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path dcat:endDate ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:maxCount 1 ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dcat:startDate ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ] ; + sh:targetClass dct:PeriodOfTime . + +:Relationship_Shape + a sh:NodeShape ; + rdfs:label "Relationship"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset Series"@en ; + sh:property [ + sh:minCount 1; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path [ sh:inversePath dcat:inSeries; ]; + sh:severity sh:Warning + ], [ + sh:nodeKind sh:IRI; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:contactPoint; + sh:severity sh:Violation + ], [ + sh:minCount 1; + sh:nodeKind sh:Literal; + sh:path dct:description; + sh:severity sh:Violation + ], [ + sh:maxCount 1; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:accrualPeriodicity; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:spatial; + sh:severity sh:Violation + ], [ + sh:node :DateOrDateTimeDataType_Shape ; + sh:maxCount 1; + sh:nodeKind sh:Literal; + sh:path dct:modified; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:node :DateOrDateTimeDataType_Shape ; + sh:maxCount 1; + sh:nodeKind sh:Literal; + sh:path dct:issued; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:temporal; + sh:severity sh:Violation + ], [ + sh:minCount 1; + sh:nodeKind sh:Literal; + sh:path dct:title; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DatasetSeries . \ No newline at end of file diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl new file mode 100644 index 00000000000..1764aee1546 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl @@ -0,0 +1,336 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dcat:accessURL ; + dcat:downloadURL ; + dcatap:availability ; + dct:format ; + dct:conformsTo ; + dct:creator [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dct:license ; + cc:attributionURL ; + dct:modified "2021-12-01"^^xsd:date ; + dct:publisher ; + dct:relation ; + dct:description "This document specifies the constraints on properties and classes expressed by DCAT-AP in SHACL."@en ; + dct:title "The constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + foaf:homepage ; + foaf:maker [ + foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all recommendations in DCAT-AP 2.1.1. +# +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:type ; + sh:severity sh:Warning + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:issued ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path adms:status ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:CatalogRecord . + + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:language ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:issued ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:license; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:spatial ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:modified ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path foaf:homepage ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Catalog . + +:Catalog_Shape2 + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:or ( + [ + sh:path dcat:dataset ; + sh:minCount 1 ; + ] + [ + sh:path dcat:service ; + sh:minCount 1 ; + ] + ) ; + sh:severity sh:Warning; + sh:targetClass dcat:Catalog . + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:servesDataset ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:endpointDescription ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:theme ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:keyword ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:distribution ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:keyword ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:spatial ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:temporal ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:theme ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Dataset . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DatasetSeries . + +:DateOrDateTimeDataType_Shape + a sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a date or a dateTime literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date or xsd:dateTime" ; + sh:or ([ + sh:datatype xsd:date + ] + [ + sh:datatype xsd:dateTime + ] + ) . + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:description ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcatap:availability ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:format ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:license ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution . + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:type ; + sh:severity sh:Warning + ] ; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + rdfs:label "Location"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:bbox ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:centroid ; + sh:severity sh:Warning + ] ; + sh:targetClass dct:Location . + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:endDate ; + sh:severity sh:Warning ; + ], [ + sh:minCount 1 ; + sh:path dcat:startDate ; + sh:severity sh:Warning ; + ] ; + sh:targetClass dct:PeriodOfTime . + diff --git a/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/geodcat-ap-2.0.1-SHACL.ttl b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/geodcat-ap-2.0.1-SHACL.ttl new file mode 100644 index 00000000000..2c281086575 --- /dev/null +++ b/services/src/test/resources/org/fao/geonet/api/records/formatters/shacl/geodcat-ap-2.0.1-SHACL.ttl @@ -0,0 +1,528 @@ +@prefix : . +@prefix adms: . +@prefix bibo: . +@prefix dcat: . +@prefix dcatap: . +@prefix dct: . +@prefix dqv: . +@prefix foaf: . +@prefix geodcat: . +@prefix locn: . +@prefix owl: . +@prefix prov: . +@prefix rdf: . +@prefix rdfs: . +@prefix sdmx-attribute: . +@prefix sh: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + + a owl:Ontology , adms:Asset ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:versionIRI ; + adms:status ; + dcatap:availability dcatap:stable ; + dct:conformsTo ; + rdfs:isDefinedBy ; + dct:license ; + dct:created "2020-12-23"^^xsd:date ; + dct:issued "2021-01-04"^^xsd:date ; + dct:modified "2021-04-12"^^xsd:date ; + dct:dateCopyrighted "2020"^^xsd:gYear ; + dct:title "The constraints of GeoDCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.0.0" ; + dct:description "This document specifies the constraints on properties and classes expressed by GeoDCAT-AP in SHACL."@en ; + bibo:editor [ + a foaf:Person ; + owl:sameAs ; + owl:sameAs ; + foaf:name "Andrea Perego" + ] ; + dct:creator [ + a foaf:Group ; + foaf:name "GeoDCAT-AP Working Group" ; + foaf:page + ] ; + dct:publisher ; + dct:rightsHolder ; + dcat:distribution [ a adms:AssetDistribution ; + dct:format , + ; + dct:title "SHACL (Turtle)"@en ; + dcat:downloadURL ; + dcat:mediaType "text/turtle"^^dct:IMT + ] ; +. + +#------------------------------------------------------------------------- +# The shapes in this file complement the DCAT-AP ones to cover all classes +# in GeoDCAT-AP 2.0.0. +#------------------------------------------------------------------------- + +geodcat:Activity_Shape + a sh:NodeShape ; + sh:name "Activity"@en ; + sh:property [ + sh:class prov:Entity ; + sh:minCount 1 ; + sh:path prov:generated ; + sh:severity sh:Violation + ], [ + sh:class prov:Association ; + sh:minCount 1 ; + sh:path prov:qualifiedAssociation ; + sh:severity sh:Violation + ] ; + sh:targetClass prov:Activity . + +geodcat:Address_Agent_Shape + a sh:NodeShape ; + sh:name "Address (Agent)"@en ; + sh:property [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:adminUnitL2 ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:postName ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:adminUnitL1 ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:postCode ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path locn:thoroughfare ; + sh:severity sh:Violation + ] ; + sh:targetClass locn:Address . + +geodcat:Address_Kind_Shape + a sh:NodeShape ; + sh:name "Address (Kind)"@en ; + sh:property [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path vcard:region ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path vcard:locality ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path vcard:country-name ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path vcard:postal-code ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path vcard:street-address ; + sh:severity sh:Violation + ] ; + sh:targetClass vcard:Address . + +geodcat:Attribution_Shape + a sh:NodeShape ; + sh:name "Attribution"@en ; + sh:property [ + sh:class prov:Agent ; + sh:minCount 1 ; + sh:path prov:agent ; + sh:severity sh:Violation + ], [ + sh:class dcat:Role ; + sh:minCount 1 ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass prov:Attribution . + +:Catalog_Shape + a sh:NodeShape ; + sh:name "Catalog"@en ; + sh:property [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:created ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + +:CatalogRecord_Shape + a sh:NodeShape ; + sh:name "Catalog"@en ; + sh:property [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:created ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:CategoryScheme_Shape + a sh:NodeShape ; + sh:name "Category Scheme"@en ; + sh:property [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:created ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:ConceptScheme . + +:DataService_Shape + a sh:NodeShape ; + sh:name "Data Service"@en ; + sh:property [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:created ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + sh:name "Dataset"@en ; + sh:property [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:created ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + +geodcat:QualityMeasurement_Shape + a sh:NodeShape ; + sh:name "Quality Measurement"@en ; + sh:property [ + sh:class dqv:Metric ; + sh:maxCount 1 ; + sh:path dqv:isMeasurementOf ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:maxCount 1 ; + sh:path sdmx-attribute:unitMeasure ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dqv:value ; + sh:severity sh:Violation + ] ; + sh:targetClass dqv:QualityMeasurement . + +geodcat:Standard_Shape + a sh:NodeShape ; + sh:name "Standard"@en ; + sh:property [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:Standard . + +#------------------------------------------------------------------------- +# Concepts from additional controlled vocabularies used in GeoDCAT-AP. +#------------------------------------------------------------------------- + +# Spatial representation type (ISO 19115) + + a skos:ConceptScheme ; + dct:title "Spatial representation types"@en ; +. + + a skos:Concept ; + skos:prefLabel "Vector"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Grid"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Text table"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "TIN"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Stereo model"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Video"@en ; + skos:inScheme ; +. + +# Maintenance frequency (ISO 19115) + + a skos:ConceptScheme ; + dct:title "Maintenance frequencies"@en ; +. + + a skos:Concept ; + skos:prefLabel "As needed"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Not planned"@en ; + skos:inScheme ; +. + +# INSPIRE Glossary + + a skos:ConceptScheme ; + dct:title "INSPIRE Glossary"@en ; +. + + a skos:Concept ; + skos:prefLabel "Spatial reference system"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Temporal reference system"@en ; + skos:inScheme ; +. + +# INSPIRE Themes + + a skos:ConceptScheme ; + dct:title "INSPIRE Themes"@en ; +. + + a skos:Concept ; + skos:prefLabel "Addresses"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Administrative units"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Agricultural and aquaculture facilities"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Area management/restriction/regulation zones and reporting units"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Atmospheric conditions"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Bio-geographical regions"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Buildings"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Cadastral parcels"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Coordinate reference systems"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Elevation"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Energy resources"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Environmental monitoring facilities"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Geographical grid systems"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Geographical names"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Geology"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Habitats and biotopes"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Human health and safety"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Hydrography"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Land cover"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Land use"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Meteorological geographical features"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Mineral resources"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Natural risk zones"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Oceanographic geographical features"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Orthoimagery"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Population distribution — demography"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Production and industrial facilities"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Protected sites"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Sea regions"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Soil"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Species distribution"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Statistical units"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Transport networks"@en ; + skos:inScheme ; +. + + a skos:Concept ; + skos:prefLabel "Utility and governmental services"@en ; + skos:inScheme ; +. diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/csw-test.html b/web-ui/src/main/resources/catalog/templates/admin/settings/csw-test.html index 36410627dc3..1be5c008285 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/settings/csw-test.html +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/csw-test.html @@ -69,6 +69,18 @@

cswSampleGetRequest

>GetRecordById +
  • + GetRecordById (with outputSchema) +
  • +
  • + GetRecords +