From d5761271fb9ed00d1bb0236a7a97779cb4ce1898 Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Tue, 16 May 2023 09:34:12 +0200 Subject: [PATCH 01/16] add MyData API to dataverse documentaion --- doc/sphinx-guides/source/api/native-api.rst | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 6f10b28f55b..09096667650 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4505,6 +4505,43 @@ A curl example using allowing access to a dataset's metadata Please see :ref:`dataverse.api.signature-secret` for the configuration option to add a shared secret, enabling extra security. + +MyData +----- + +The MyData API is used to get a list of just the datasets, dataverses or datafiles an authenticated user can edit. + +MyData API +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +List objects:: + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ROLE_IDS=6 + export DVOBJECT_TYPES=Dataset + export PUBLISHED_STATES=Unpublished + export PER_PAGE=10 + + curl -H GET http://$SERVER_URL/api/mydata/retrieve?key=$API_TOKEN&role_ids=$ROLE_IDS&dvobject_types=$DVOBJECT_TYPES&published_states=$PUBLISHED_STATES&per_page=$PER_PAGE + +``key`` is the user token, for this API is must not be passed in the header. +``role_id`` User roles, several possible values among: +- ``1`` = Admin +- ``2`` = File Downloader +- ``3`` = Dataverse + Dataset Creator +- ``4`` = Dataverse Creator +- ``5`` = Dataset Creator +- ``6`` = Contributor +- ``7`` = Curator +- ``8`` = Member +``dvobject_types`` Type of object, several possible values among: ``DataFile``, ``Dataset``& ``Dataverse`` +``published_states`` State of the object, several possible values among:``Published``, ``Unpublished``, ``Draft``, ``Deaccessioned`` & ``In+Review`` +``per_page`` Number of results returned per page + + .. _send-feedback: Send Feedback To Contact(s) From 17927026dbc9bf0148f68234f2c39ab58526f799 Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Tue, 16 May 2023 15:06:20 +0200 Subject: [PATCH 02/16] fix sphinx error --- doc/sphinx-guides/source/api/native-api.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 09096667650..20050219c2f 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4507,12 +4507,12 @@ security. MyData ------ +------ The MyData API is used to get a list of just the datasets, dataverses or datafiles an authenticated user can edit. MyData API -~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~ List objects:: From ccd295fa3fc43fbf2d6d0ab43e0ac8acaab4eedb Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Tue, 16 May 2023 15:25:45 +0200 Subject: [PATCH 03/16] fix layout --- doc/sphinx-guides/source/api/native-api.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 20050219c2f..83084411fa7 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4514,7 +4514,7 @@ The MyData API is used to get a list of just the datasets, dataverses or datafil MyData API ~~~~~~~~~~ -List objects:: +A curl example listing objects .. code-block:: bash @@ -4527,8 +4527,11 @@ List objects:: curl -H GET http://$SERVER_URL/api/mydata/retrieve?key=$API_TOKEN&role_ids=$ROLE_IDS&dvobject_types=$DVOBJECT_TYPES&published_states=$PUBLISHED_STATES&per_page=$PER_PAGE +Parameters: + ``key`` is the user token, for this API is must not be passed in the header. ``role_id`` User roles, several possible values among: + - ``1`` = Admin - ``2`` = File Downloader - ``3`` = Dataverse + Dataset Creator @@ -4537,9 +4540,10 @@ List objects:: - ``6`` = Contributor - ``7`` = Curator - ``8`` = Member -``dvobject_types`` Type of object, several possible values among: ``DataFile``, ``Dataset``& ``Dataverse`` -``published_states`` State of the object, several possible values among:``Published``, ``Unpublished``, ``Draft``, ``Deaccessioned`` & ``In+Review`` -``per_page`` Number of results returned per page + +``dvobject_types`` Type of object, several possible values among: ``DataFile``, ``Dataset``& ``Dataverse``. +``published_states`` State of the object, several possible values among:``Published``, ``Unpublished``, ``Draft``, ``Deaccessioned`` & ``In+Review``. +``per_page`` Number of results returned per page. .. _send-feedback: From 0587a7a80f664254a2cb635501fcc34e7b736d41 Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Tue, 16 May 2023 15:47:41 +0200 Subject: [PATCH 04/16] change position api documentation --- doc/sphinx-guides/source/api/native-api.rst | 57 +++++++++++---------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 83084411fa7..2380a5142da 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4506,6 +4506,33 @@ Please see :ref:`dataverse.api.signature-secret` for the configuration option to security. +.. _send-feedback: + +Send Feedback To Contact(s) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This API call allows sending an email to the contacts for a collection, dataset, or datafile or to the support email address when no object is specified. +The call is protected by the normal /admin API protections (limited to localhost or requiring a separate key), but does not otherwise limit the sending of emails. +Administrators should be sure only trusted applications have access to avoid the potential for spam. + +The call is a POST with a JSON object as input with four keys: +- "targetId" - the id of the collection, dataset, or datafile. Persistent ids and collection aliases are not supported. (Optional) +- "subject" - the email subject line +- "body" - the email body to send +- "fromEmail" - the email to list in the reply-to field. (Dataverse always sends mail from the system email, but does it "on behalf of" and with a reply-to for the specified user.) + +A curl example using an ``ID`` + +.. code-block:: bash + + export SERVER_URL=http://localhost + export JSON='{"targetId":24, "subject":"Data Question", "body":"Please help me understand your data. Thank you!", "fromEmail":"dataverseSupport@mailinator.com"}' + + curl -X POST -H 'Content-Type:application/json' -d "$JSON" $SERVER_URL/api/admin/feedback + +Note that this call could be useful in coordinating with dataset authors (assuming they are also contacts) as an alternative/addition to the functionality provided by :ref:`return-a-dataset`. + + MyData ------ @@ -4541,33 +4568,9 @@ Parameters: - ``7`` = Curator - ``8`` = Member -``dvobject_types`` Type of object, several possible values among: ``DataFile``, ``Dataset``& ``Dataverse``. -``published_states`` State of the object, several possible values among:``Published``, ``Unpublished``, ``Draft``, ``Deaccessioned`` & ``In+Review``. -``per_page`` Number of results returned per page. - - -.. _send-feedback: - -Send Feedback To Contact(s) -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This API call allows sending an email to the contacts for a collection, dataset, or datafile or to the support email address when no object is specified. -The call is protected by the normal /admin API protections (limited to localhost or requiring a separate key), but does not otherwise limit the sending of emails. -Administrators should be sure only trusted applications have access to avoid the potential for spam. - -The call is a POST with a JSON object as input with four keys: -- "targetId" - the id of the collection, dataset, or datafile. Persistent ids and collection aliases are not supported. (Optional) -- "subject" - the email subject line -- "body" - the email body to send -- "fromEmail" - the email to list in the reply-to field. (Dataverse always sends mail from the system email, but does it "on behalf of" and with a reply-to for the specified user.) +``dvobject_types`` Type of object, several possible values among: ``DataFile`` , ``Dataset`` & ``Dataverse`` . -A curl example using an ``ID`` - -.. code-block:: bash +``published_states`` State of the object, several possible values among:``Published`` , ``Unpublished`` , ``Draft`` , ``Deaccessioned`` & ``In+Review`` . - export SERVER_URL=http://localhost - export JSON='{"targetId":24, "subject":"Data Question", "body":"Please help me understand your data. Thank you!", "fromEmail":"dataverseSupport@mailinator.com"}' - - curl -X POST -H 'Content-Type:application/json' -d "$JSON" $SERVER_URL/api/admin/feedback +``per_page`` Number of results returned per page. -Note that this call could be useful in coordinating with dataset authors (assuming they are also contacts) as an alternative/addition to the functionality provided by :ref:`return-a-dataset`. From 58452dbdc41782054953dbbc45eaf7fb4751205a Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Thu, 1 Jun 2023 13:22:25 +0200 Subject: [PATCH 05/16] change description of Roles --- doc/sphinx-guides/source/api/native-api.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 2380a5142da..f663c1fb306 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4556,8 +4556,9 @@ A curl example listing objects Parameters: -``key`` is the user token, for this API is must not be passed in the header. -``role_id`` User roles, several possible values among: +``key`` Is the user token, for this API is must not be passed in the header. + +``role_id`` Roles are customizable. Standard roles include: - ``1`` = Admin - ``2`` = File Downloader From b80e3e95dc5f708712b1b37e6e7e6cfd55c4a250 Mon Sep 17 00:00:00 2001 From: sirineREKIK <110403723+sirineREKIK@users.noreply.github.com> Date: Fri, 2 Jun 2023 14:36:59 +0200 Subject: [PATCH 06/16] Update doc/sphinx-guides/source/api/native-api.rst Co-authored-by: Philip Durbin --- doc/sphinx-guides/source/api/native-api.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index f663c1fb306..2ec89c9bf14 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4538,9 +4538,6 @@ MyData The MyData API is used to get a list of just the datasets, dataverses or datafiles an authenticated user can edit. -MyData API -~~~~~~~~~~ - A curl example listing objects .. code-block:: bash From b14e06ad3420f601b760e83b371c69553cb48d94 Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Fri, 2 Jun 2023 16:43:58 +0200 Subject: [PATCH 07/16] curl url improvement --- doc/sphinx-guides/source/api/native-api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 2ec89c9bf14..6b1bc72fea1 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4549,7 +4549,7 @@ A curl example listing objects export PUBLISHED_STATES=Unpublished export PER_PAGE=10 - curl -H GET http://$SERVER_URL/api/mydata/retrieve?key=$API_TOKEN&role_ids=$ROLE_IDS&dvobject_types=$DVOBJECT_TYPES&published_states=$PUBLISHED_STATES&per_page=$PER_PAGE + curl "$SERVER_URL/api/mydata/retrieve?key=$API_TOKEN&role_ids=$ROLE_IDS&dvobject_types=$DVOBJECT_TYPES&published_states=$PUBLISHED_STATES&per_page=$PER_PAGE" Parameters: From 4bad9961847e4e636711e57136016c22d29aad1e Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Wed, 7 Jun 2023 16:14:45 +0200 Subject: [PATCH 08/16] add release note --- doc/release-notes/5042-add-mydata-doc-api.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 doc/release-notes/5042-add-mydata-doc-api.md diff --git a/doc/release-notes/5042-add-mydata-doc-api.md b/doc/release-notes/5042-add-mydata-doc-api.md new file mode 100644 index 00000000000..5a77e266725 --- /dev/null +++ b/doc/release-notes/5042-add-mydata-doc-api.md @@ -0,0 +1,2 @@ +An API named 'MyData' is supported by Dataverse. A documentation has been added describing its use (PR #9596) +This API is used to get a list of only the objects (datasets, dataverses or datafiles) that an authenticated user can modify. From fc710e2c3da95c1979793a2c268986d31baf2092 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 22 Jun 2023 12:45:52 -0400 Subject: [PATCH 09/16] remove temporary additions to json export --- .../edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index bb48d572f36..4720f399487 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -654,7 +654,7 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata) { .add("categories", getFileCategories(fileMetadata)) .add("embargo", embargo) //.add("released", df.isReleased()) - .add("restricted", df.isRestricted()) + //.add("restricted", df.isRestricted()) .add("storageIdentifier", df.getStorageIdentifier()) .add("originalFileFormat", df.getOriginalFileFormat()) .add("originalFormatLabel", df.getOriginalFormatLabel()) @@ -673,12 +673,8 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata) { //--------------------------------------------- .add("md5", getMd5IfItExists(df.getChecksumType(), df.getChecksumValue())) .add("checksum", getChecksumTypeAndValue(df.getChecksumType(), df.getChecksumValue())) - .add("fileMetadataId", fileMetadata.getId()) .add("tabularTags", getTabularFileTags(df)) - .add("creationDate", df.getCreateDateFormattedYYYYMMDD()) - .add("dataTables", df.getDataTables().isEmpty() ? null : JsonPrinter.jsonDT(df.getDataTables())) - .add("varGroups", fileMetadata.getVarGroups().isEmpty() - ? null: JsonPrinter.jsonVarGroup(fileMetadata.getVarGroups())); + .add("creationDate", df.getCreateDateFormattedYYYYMMDD()); } //Started from https://github.com/RENCI-NRIG/dataverse/, i.e. https://github.com/RENCI-NRIG/dataverse/commit/2b5a1225b42cf1caba85e18abfeb952171c6754a From 361e7547565ded1c110d713ea47ef82458578da3 Mon Sep 17 00:00:00 2001 From: Eryk Kulikowski Date: Mon, 26 Jun 2023 16:04:22 +0200 Subject: [PATCH 10/16] nullpointer fix --- .../java/edu/harvard/iq/dataverse/DatasetPage.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 3d608153ba3..5aed893ef8c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -2846,10 +2846,15 @@ public String refresh() { if (persistentId != null) { setIdByPersistentId(); - } - if (dataset.getId() != null) { - //retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionById(dataset.getId(), version); - dataset = datasetService.findDeep(dataset.getId()); + if (this.getId() == null) { + logger.warning("No such dataset: "+persistentId); + return permissionsWrapper.notFound(); + } + dataset = datasetService.findDeep(this.getId()); + if (dataset == null) { + logger.warning("No such dataset: "+persistentId); + return permissionsWrapper.notFound(); + } retrieveDatasetVersionResponse = datasetVersionService.selectRequestedVersion(dataset.getVersions(), version); } else if (versionId != null) { retrieveDatasetVersionResponse = datasetVersionService.retrieveDatasetVersionByVersionId(versionId); From 34c7c14be882c5b14a5b4c5f9a88dd3abc52f3d4 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 5 Jul 2023 16:21:32 -0400 Subject: [PATCH 11/16] handle missing restricted key, fix iteration --- .../edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index c0b39dd6101..29a59cea795 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -1712,7 +1712,7 @@ public static void createDataDscr(XMLStreamWriter xmlw, JsonArray fileDetails) t // we're not writing the opening tag until we find an actual // tabular datafile. for (int i=0;i Date: Wed, 5 Jul 2023 17:07:52 -0400 Subject: [PATCH 12/16] only include restricted key for export provider --- .../export/InternalExportDataProvider.java | 2 +- .../iq/dataverse/util/json/JsonPrinter.java | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java b/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java index efa2c0c9300..7c76c4972a8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java @@ -77,7 +77,7 @@ public JsonArray getDatasetFileDetails() { JsonArrayBuilder jab = Json.createArrayBuilder(); for (FileMetadata fileMetadata : dv.getFileMetadatas()) { DataFile dataFile = fileMetadata.getDataFile(); - jab.add(JsonPrinter.json(dataFile, fileMetadata)); + jab.add(JsonPrinter.json(dataFile, fileMetadata, true)); } return jab.build(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 4bc1e224977..97640aa226d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -617,7 +617,7 @@ public static JsonObjectBuilder json(FileMetadata fmd) { .add("version", fmd.getVersion()) .add("datasetVersionId", fmd.getDatasetVersion().getId()) .add("categories", getFileCategories(fmd)) - .add("dataFile", JsonPrinter.json(fmd.getDataFile(), fmd)); + .add("dataFile", JsonPrinter.json(fmd.getDataFile(), fmd, false)); } public static JsonObjectBuilder json(AuxiliaryFile auxFile) { @@ -633,10 +633,10 @@ public static JsonObjectBuilder json(AuxiliaryFile auxFile) { .add("dataFile", JsonPrinter.json(auxFile.getDataFile())); } public static JsonObjectBuilder json(DataFile df) { - return JsonPrinter.json(df, null); + return JsonPrinter.json(df, null, false); } - public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata) { + public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata, boolean forExportDataProvider) { // File names are no longer stored in the DataFile entity; // (they are instead in the FileMetadata (as "labels") - this way // the filename can change between versions... @@ -661,7 +661,7 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata) { JsonObjectBuilder embargo = df.getEmbargo() != null ? JsonPrinter.json(df.getEmbargo()) : null; - return jsonObjectBuilder() + NullSafeJsonBuilder builder = jsonObjectBuilder() .add("id", df.getId()) .add("persistentId", pidString) .add("pidURL", pidURL) @@ -672,7 +672,6 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata) { .add("categories", getFileCategories(fileMetadata)) .add("embargo", embargo) //.add("released", df.isReleased()) - //.add("restricted", df.isRestricted()) .add("storageIdentifier", df.getStorageIdentifier()) .add("originalFileFormat", df.getOriginalFileFormat()) .add("originalFormatLabel", df.getOriginalFormatLabel()) @@ -692,7 +691,16 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata) { .add("md5", getMd5IfItExists(df.getChecksumType(), df.getChecksumValue())) .add("checksum", getChecksumTypeAndValue(df.getChecksumType(), df.getChecksumValue())) .add("tabularTags", getTabularFileTags(df)) - .add("creationDate", df.getCreateDateFormattedYYYYMMDD()); + .add("creationDate", df.getCreateDateFormattedYYYYMMDD()); + /* + * The restricted state was not included prior to #9175 so to avoid backward + * incompatability, it is now only added when generating json for the + * InternalExportDataProvider fileDetails. + */ + if (forExportDataProvider) { + builder.add("restricted", df.isRestricted()); + } + return builder; } //Started from https://github.com/RENCI-NRIG/dataverse/, i.e. https://github.com/RENCI-NRIG/dataverse/commit/2b5a1225b42cf1caba85e18abfeb952171c6754a From fbf67ff496928399a447e4c49ef207b5bb0d5eae Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Jul 2023 10:27:02 -0400 Subject: [PATCH 13/16] don't assume dataTables for all tabular files --- .../iq/dataverse/export/ddi/DdiExportUtil.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 29a59cea795..020800a7d10 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -1733,8 +1733,8 @@ public static void createDataDscr(XMLStreamWriter xmlw, JsonArray fileDetails) t } } - - if (fileJson.containsKey("dataTables")) { + // originalFileFormat is one of several keys that only exist for tabular data + if (fileJson.containsKey("originalFileFormat")) { if (!tabularData) { xmlw.writeStartElement("dataDscr"); tabularData = true; @@ -1745,12 +1745,14 @@ public static void createDataDscr(XMLStreamWriter xmlw, JsonArray fileDetails) t createVarGroupDDI(xmlw, varGroups.getJsonObject(j)); } } - JsonObject dataTable = fileJson.getJsonArray("dataTables").getJsonObject(0); - JsonArray vars = dataTable.getJsonArray("dataVariables"); - if (vars != null) { - for (int j = 0; j < vars.size(); j++) { - createVarDDI(xmlw, vars.getJsonObject(j), fileJson.getJsonNumber("id").toString(), - fileJson.getJsonNumber("fileMetadataId").toString()); + if (fileJson.containsKey("dataTables")) { + JsonObject dataTable = fileJson.getJsonArray("dataTables").getJsonObject(0); + JsonArray vars = dataTable.getJsonArray("dataVariables"); + if (vars != null) { + for (int j = 0; j < vars.size(); j++) { + createVarDDI(xmlw, vars.getJsonObject(j), fileJson.getJsonNumber("id").toString(), + fileJson.getJsonNumber("fileMetadataId").toString()); + } } } } From e0428c2e9d75d7e026d7b7937925ca42fe434bce Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Jul 2023 10:38:43 -0400 Subject: [PATCH 14/16] change dataTable check in fileDscr not dataDscr --- .../dataverse/export/ddi/DdiExportUtil.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 020800a7d10..12b3c0d0c1e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -1733,8 +1733,7 @@ public static void createDataDscr(XMLStreamWriter xmlw, JsonArray fileDetails) t } } - // originalFileFormat is one of several keys that only exist for tabular data - if (fileJson.containsKey("originalFileFormat")) { + if (fileJson.containsKey("dataTables")) { if (!tabularData) { xmlw.writeStartElement("dataDscr"); tabularData = true; @@ -1745,14 +1744,12 @@ public static void createDataDscr(XMLStreamWriter xmlw, JsonArray fileDetails) t createVarGroupDDI(xmlw, varGroups.getJsonObject(j)); } } - if (fileJson.containsKey("dataTables")) { - JsonObject dataTable = fileJson.getJsonArray("dataTables").getJsonObject(0); - JsonArray vars = dataTable.getJsonArray("dataVariables"); - if (vars != null) { - for (int j = 0; j < vars.size(); j++) { - createVarDDI(xmlw, vars.getJsonObject(j), fileJson.getJsonNumber("id").toString(), - fileJson.getJsonNumber("fileMetadataId").toString()); - } + JsonObject dataTable = fileJson.getJsonArray("dataTables").getJsonObject(0); + JsonArray vars = dataTable.getJsonArray("dataVariables"); + if (vars != null) { + for (int j = 0; j < vars.size(); j++) { + createVarDDI(xmlw, vars.getJsonObject(j), fileJson.getJsonNumber("id").toString(), + fileJson.getJsonNumber("fileMetadataId").toString()); } } } @@ -2027,9 +2024,12 @@ private static void createFileDscr(XMLStreamWriter xmlw, JsonArray fileDetails) String dataverseUrl = SystemConfig.getDataverseSiteUrlStatic(); for (int i =0;i Date: Thu, 6 Jul 2023 10:49:27 -0400 Subject: [PATCH 15/16] catch additional use of dt when null --- .../java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 12b3c0d0c1e..73ba2d204ce 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -2074,7 +2074,7 @@ private static void createFileDscr(XMLStreamWriter xmlw, JsonArray fileDetails) // various notes: // this specially formatted note section is used to store the UNF // (Universal Numeric Fingerprint) signature: - if (dt.containsKey("UNF") && !dt.getString("UNF").isBlank()) { + if ((dt!=null) && (dt.containsKey("UNF") && !dt.getString("UNF").isBlank())) { xmlw.writeStartElement("notes"); writeAttribute(xmlw, "level", LEVEL_FILE); writeAttribute(xmlw, "type", NOTE_TYPE_UNF); From 1793b33534a9430ecb7dfd6197738b4a9a9a77aa Mon Sep 17 00:00:00 2001 From: sirineREKIK Date: Fri, 7 Jul 2023 09:18:22 +0200 Subject: [PATCH 16/16] add key in header api --- doc/sphinx-guides/source/api/native-api.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 6b1bc72fea1..11fb7c49c1c 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4549,12 +4549,10 @@ A curl example listing objects export PUBLISHED_STATES=Unpublished export PER_PAGE=10 - curl "$SERVER_URL/api/mydata/retrieve?key=$API_TOKEN&role_ids=$ROLE_IDS&dvobject_types=$DVOBJECT_TYPES&published_states=$PUBLISHED_STATES&per_page=$PER_PAGE" + curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/mydata/retrieve?role_ids=$ROLE_IDS&dvobject_types=$DVOBJECT_TYPES&published_states=$PUBLISHED_STATES&per_page=$PER_PAGE" Parameters: -``key`` Is the user token, for this API is must not be passed in the header. - ``role_id`` Roles are customizable. Standard roles include: - ``1`` = Admin