Skip to content

Commit f5ddcff

Browse files
committed
per review comments
1 parent 10939ce commit f5ddcff

File tree

6 files changed

+22
-11
lines changed

6 files changed

+22
-11
lines changed

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4612,7 +4612,7 @@ Updating File Metadata
46124612
46134613
Updates the file metadata for an existing file where ``ID`` is the database id of the file to update or ``PERSISTENT_ID`` is the persistent id (DOI or Handle) of the file. Requires a ``jsonString`` expressing the new metadata. No metadata from the previous version of this file will be persisted, so if you want to update a specific field first get the json with the above command and alter the fields you want.
46144614
4615-
Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &datasetVersionId=12345. This is to prevent stale data from being edited.
4615+
Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &sourceInternalVersionNumber=12345. This is to prevent stale data from being edited. The value for sourceInternalVersionNumber comes from ``datasetVersionId`` in the response to get $SERVER_URL/api/files/$ID API call
46164616
46174617
A curl example using an ``ID``
46184618
@@ -4645,15 +4645,15 @@ A curl example using a ``PERSISTENT_ID``
46454645
46464646
curl -H "X-Dataverse-key:$API_TOKEN" -X POST \
46474647
-F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \
4648-
"$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&datasetVersionId=$VERSION_ID"
4648+
"$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&sourceInternalVersionNumber=$VERSION_ID"
46494649
46504650
The fully expanded example above (without environment variables) looks like this:
46514651
46524652
.. code-block:: bash
46534653
46544654
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \
46554655
-F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \
4656-
"https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&datasetVersionId=12345"
4656+
"https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&sourceInternalVersionNumber=12345"
46574657
46584658
Note: To update the 'tabularTags' property of file metadata, use the 'dataFileTags' key when making API requests. This property is used to update the 'tabularTags' of the file metadata.
46594659

src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,15 @@ protected void validateInternalVersionNumberIsNotOutdated(Dataset dataset, int i
451451
}
452452
}
453453

454+
protected void validateInternalVersionNumberIsNotOutdated(DataFile dataFile, int internalVersion) throws WrappedResponse {
455+
logger.severe(">>>> internalVersion:"+internalVersion+" dataFile.getFileMetadata().getDatasetVersion().getId():"+dataFile.getFileMetadata().getDatasetVersion().getId());
456+
if (dataFile.getFileMetadata().getDatasetVersion().getId() > internalVersion) {
457+
throw new WrappedResponse(
458+
badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated", Collections.singletonList(Integer.toString(internalVersion))))
459+
);
460+
}
461+
}
462+
454463
protected DataFile findDataFileOrDie(String id) throws WrappedResponse {
455464
DataFile datafile;
456465
if (id.equals(PERSISTENT_ID_KEY)) {

src/main/java/edu/harvard/iq/dataverse/api/Files.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ public Response deleteFileInDataset(@Context ContainerRequestContext crc, @PathP
410410
@AuthRequired
411411
@Path("{id}/metadata")
412412
public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData,
413-
@PathParam("id") String fileIdOrPersistentId, @QueryParam("datasetVersionId") String datasetVersionId
413+
@PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionNumber") Integer sourceInternalVersionNumber
414414
) throws CommandException {
415415

416416
FileMetadata upFmd = null;
@@ -429,10 +429,12 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa
429429
return error(BAD_REQUEST, "Error attempting get the requested data file.");
430430
}
431431

432-
String latestDatasetVersion = String.valueOf(df.getFileMetadata().getDatasetVersion().getId());
433-
if (datasetVersionId != null && latestDatasetVersion != null &&
434-
!latestDatasetVersion.equals(datasetVersionId)) {
435-
return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError"));
432+
if (sourceInternalVersionNumber != null) {
433+
try {
434+
validateInternalVersionNumberIsNotOutdated(df, sourceInternalVersionNumber);
435+
} catch (WrappedResponse wr) {
436+
return wr.getResponse();
437+
}
436438
}
437439

438440
//You shouldn't be trying to edit a datafile that has been replaced

src/main/java/propertyFiles/Bundle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,6 @@ file.metaData.dataFile.dataTab.unf=UNF
19451945
file.metaData.dataFile.dataTab.variables=Variables
19461946
file.metaData.dataFile.dataTab.observations=Observations
19471947
file.metaData.fileAccess=File Access:
1948-
file.metadata.message.parallelUpdateError=Changes cannot be saved. This metadata has been edited since this page was opened. To continue, copy your changes, refresh the page to see the recent updates, and re-enter any changes you want to save.
19491948
file.addDescription=Add file description...
19501949
file.tags=Tags
19511950
file.editTags=Edit Tags
@@ -3206,3 +3205,4 @@ updateDatasetFieldsCommand.api.processDatasetUpdate.parseError=Error parsing dat
32063205

32073206
#AbstractApiBean.java
32083207
abstractApiBean.error.datasetInternalVersionNumberIsOutdated=Dataset internal version number {0} is outdated
3208+
abstractApiBean.error.datafileInternalVersionNumberIsOutdated=File Metadata internal version number {0} is outdated

src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3278,7 +3278,7 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() {
32783278
updateResponse.prettyPrint();
32793279
updateResponse.then().assertThat()
32803280
.body("status", equalTo(ApiConstants.STATUS_ERROR))
3281-
.body("message", startsWith(BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError")))
3281+
.body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated",Collections.singletonList(datasetVersionId))))
32823282
.statusCode(BAD_REQUEST.getStatusCode());
32833283

32843284
// Second user refreshes and updates. Should pass now

src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,7 @@ static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsStr
11001100
optionalQueryParam = "?persistentId=" + fileIdOrPersistentId;
11011101
}
11021102
if (datasetVersionId != null) {
1103-
optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "datasetVersionId=" + datasetVersionId;
1103+
optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "sourceInternalVersionNumber=" + datasetVersionId;
11041104
}
11051105
RequestSpecification requestSpecification = given()
11061106
.header(API_TOKEN_HTTP_HEADER, apiToken);

0 commit comments

Comments
 (0)