diff --git a/doc/release-notes/11130-update-dataverse-api-remove-metadatablocks.md b/doc/release-notes/11130-update-dataverse-api-remove-metadatablocks.md new file mode 100644 index 00000000000..e71a67142b3 --- /dev/null +++ b/doc/release-notes/11130-update-dataverse-api-remove-metadatablocks.md @@ -0,0 +1,8 @@ +### Fixes consequences for not adding some optional fields in update dataverse API + +Omitting optional fields inputLevels, facetIds, or metadataBlockNames caused data to be deleted. +This fix no longer deletes data for these fields. Two new flags have been added to the ``metadataBlocks`` Json object to signal the deletion of the data. +- ``inheritMetadataBlocksFromParent: true`` will remove ``metadataBlockNames`` and ``inputLevels`` if the Json objects are omitted. +- ``inheritFacetsFromParent: true`` will remove ``facetIds`` if the Json object is omitted. + +For more information, see issue [#11130](https://github.com/IQSS/dataverse/issues/11130) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 0eacd6b614c..17a878f494a 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -128,12 +128,23 @@ Note that setting any of these fields overwrites the previous configuration. When it comes to omitting these fields in the JSON: -- Omitting ``facetIds`` or ``metadataBlockNames`` causes the Dataverse collection to inherit the corresponding configuration from its parent. -- Omitting ``inputLevels`` removes any existing custom input levels in the Dataverse collection. -- Omitting the entire ``metadataBlocks`` object in the request JSON would exclude the three sub-objects, resulting in the application of the two changes described above. +- Omitting ``facetIds`` or ``metadataBlockNames`` causes no change to the Dataverse collection. To delete the current configuration and inherit the corresponding configuration from its parent include the flag ``inheritFacetsFromParent`` and/or ``inheritMetadataBlocksFromParent`` respectively. +- Omitting ``inputLevels`` causes no change to the Dataverse collection. Including the flag ``inheritMetadataBlocksFromParent`` will cause the custom ``inputLevels`` to be deleted and inherited from the parent. +- Omitting the entire ``metadataBlocks`` object in the request JSON would cause no change to the ``inputLevels``, ``facetIds`` or ``metadataBlockNames`` of the Dataverse collection. To obtain an example of how these objects are included in the JSON file, download :download:`dataverse-complete-optional-params.json <../_static/api/dataverse-complete-optional-params.json>` file and modify it to suit your needs. +To force the configurations to be deleted and inherited from the parent's configuration include the following ``metadataBlocks`` object in your JSON + +.. code-block:: json + + "metadataBlocks": { + "inheritMetadataBlocksFromParent": true, + "inheritFacetsFromParent": true + } + +.. note:: Including both the list ``metadataBlockNames`` and the flag ``"inheritMetadataBlocksFromParent": true`` will result in an error being returned {"status": "ERROR", "message": "Metadata block can not contain both metadataBlockNames and inheritMetadataBlocksFromParent: true"}. The same is true for ``facetIds`` and ``inheritFacetsFromParent``. + See also :ref:`collection-attributes-api`. .. _view-dataverse: diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index c494a5c9ccd..f406f6078ef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.api; +import com.google.common.collect.Lists; import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.api.datadeposit.SwordServiceBean; @@ -195,7 +196,7 @@ public Response updateDataverse(@Context ContainerRequestContext crc, String bod List facets = parseFacets(body); AuthenticatedUser u = getRequestAuthenticatedUserOrDie(crc); - dataverse = execCommand(new UpdateDataverseCommand(dataverse, facets, null, createDataverseRequest(u), inputLevels, metadataBlocks, updatedDataverseDTO, true)); + dataverse = execCommand(new UpdateDataverseCommand(dataverse, facets, null, createDataverseRequest(u), inputLevels, metadataBlocks, updatedDataverseDTO)); return ok(json(dataverse)); } catch (WrappedResponse ww) { @@ -221,31 +222,60 @@ private DataverseDTO parseAndValidateUpdateDataverseRequestBody(String body) thr } } + /* + return null - ignore + return empty list - delete and inherit from parent + return non-empty list - update + */ private List parseInputLevels(String body, Dataverse dataverse) throws WrappedResponse { JsonObject metadataBlocksJson = getMetadataBlocksJson(body); - if (metadataBlocksJson == null) { - return null; + JsonArray inputLevelsArray = metadataBlocksJson != null ? metadataBlocksJson.getJsonArray("inputLevels") : null; + + if (metadataBlocksJson != null && metadataBlocksJson.containsKey("inheritMetadataBlocksFromParent") && metadataBlocksJson.getBoolean("inheritMetadataBlocksFromParent")) { + return Lists.newArrayList(); // delete } - JsonArray inputLevelsArray = metadataBlocksJson.getJsonArray("inputLevels"); - return inputLevelsArray != null ? parseInputLevels(inputLevelsArray, dataverse) : null; + return parseInputLevels(inputLevelsArray, dataverse); } + /* + return null - ignore + return empty list - delete and inherit from parent + return non-empty list - update + */ private List parseMetadataBlocks(String body) throws WrappedResponse { JsonObject metadataBlocksJson = getMetadataBlocksJson(body); - if (metadataBlocksJson == null) { - return null; + JsonArray metadataBlocksArray = metadataBlocksJson != null ? metadataBlocksJson.getJsonArray("metadataBlockNames") : null; + + if (metadataBlocksArray != null && metadataBlocksJson.containsKey("inheritMetadataBlocksFromParent") && metadataBlocksJson.getBoolean("inheritMetadataBlocksFromParent")) { + String errorMessage = MessageFormat.format(BundleUtil.getStringFromBundle("dataverse.metadatablocks.error.containslistandinheritflag"), "metadataBlockNames", "inheritMetadataBlocksFromParent"); + throw new WrappedResponse(badRequest(errorMessage)); + } + if (metadataBlocksJson != null && metadataBlocksJson.containsKey("inheritMetadataBlocksFromParent") && metadataBlocksJson.getBoolean("inheritMetadataBlocksFromParent")) { + return Lists.newArrayList(); // delete and inherit from parent } - JsonArray metadataBlocksArray = metadataBlocksJson.getJsonArray("metadataBlockNames"); - return metadataBlocksArray != null ? parseNewDataverseMetadataBlocks(metadataBlocksArray) : null; + + return parseNewDataverseMetadataBlocks(metadataBlocksArray); } + /* + return null - ignore + return empty list - delete and inherit from parent + return non-empty list - update + */ private List parseFacets(String body) throws WrappedResponse { JsonObject metadataBlocksJson = getMetadataBlocksJson(body); - if (metadataBlocksJson == null) { - return null; + JsonArray facetsArray = metadataBlocksJson != null ? metadataBlocksJson.getJsonArray("facetIds") : null; + + if (facetsArray != null && metadataBlocksJson.containsKey("inheritFacetsFromParent") && metadataBlocksJson.getBoolean("inheritFacetsFromParent")) { + String errorMessage = MessageFormat.format(BundleUtil.getStringFromBundle("dataverse.metadatablocks.error.containslistandinheritflag"), "facetIds", "inheritFacetsFromParent"); + throw new WrappedResponse(badRequest(errorMessage)); + } + + if (metadataBlocksJson != null && metadataBlocksJson.containsKey("inheritFacetsFromParent") && metadataBlocksJson.getBoolean("inheritFacetsFromParent")) { + return Lists.newArrayList(); // delete and inherit from parent } - JsonArray facetsArray = metadataBlocksJson.getJsonArray("facetIds"); - return facetsArray != null ? parseFacets(facetsArray) : null; + + return parseFacets(facetsArray); } private JsonObject getMetadataBlocksJson(String body) { @@ -277,6 +307,9 @@ private Response handleEJBException(EJBException ex, String action) { } private List parseNewDataverseMetadataBlocks(JsonArray metadataBlockNamesArray) throws WrappedResponse { + if (metadataBlockNamesArray == null) { + return null; + } List selectedMetadataBlocks = new ArrayList<>(); for (JsonString metadataBlockName : metadataBlockNamesArray.getValuesAs(JsonString.class)) { MetadataBlock metadataBlock = metadataBlockSvc.findByName(metadataBlockName.getString()); @@ -745,6 +778,9 @@ public Response updateInputLevels(@Context ContainerRequestContext crc, @PathPar } private List parseInputLevels(JsonArray inputLevelsArray, Dataverse dataverse) throws WrappedResponse { + if (inputLevelsArray == null) { + return null; + } List newInputLevels = new ArrayList<>(); for (JsonValue value : inputLevelsArray) { JsonObject inputLevel = (JsonObject) value; @@ -771,6 +807,9 @@ private List parseInputLevels(JsonArray inputLevel } private List parseFacets(JsonArray facetsArray) throws WrappedResponse { + if (facetsArray == null) { + return null; + } List facets = new LinkedList<>(); for (JsonString facetId : facetsArray.getValuesAs(JsonString.class)) { DatasetFieldType dsfType = findDatasetFieldType(facetId.getString()); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java index 91f3a5b823c..2a72485d821 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java @@ -19,15 +19,13 @@ abstract class AbstractWriteDataverseCommand extends AbstractCommand private final List inputLevels; private final List facets; protected final List metadataBlocks; - private final boolean resetRelationsOnNullValues; public AbstractWriteDataverseCommand(Dataverse dataverse, Dataverse affectedDataverse, DataverseRequest request, List facets, List inputLevels, - List metadataBlocks, - boolean resetRelationsOnNullValues) { + List metadataBlocks) { super(request, affectedDataverse); this.dataverse = dataverse; if (facets != null) { @@ -45,7 +43,6 @@ public AbstractWriteDataverseCommand(Dataverse dataverse, } else { this.metadataBlocks = null; } - this.resetRelationsOnNullValues = resetRelationsOnNullValues; } @Override @@ -59,46 +56,61 @@ public Dataverse execute(CommandContext ctxt) throws CommandException { return ctxt.dataverses().save(dataverse); } + /* + metadataBlocks = null - ignore + metadataBlocks is empty - delete and inherit from parent + metadataBlocks is not empty - set with new updated values + */ private void processMetadataBlocks() { - if (metadataBlocks != null && !metadataBlocks.isEmpty()) { - dataverse.setMetadataBlockRoot(true); - dataverse.setMetadataBlocks(metadataBlocks); - } else if (resetRelationsOnNullValues) { - dataverse.setMetadataBlockRoot(false); - dataverse.clearMetadataBlocks(); + if (metadataBlocks != null) { + if (metadataBlocks.isEmpty()) { + dataverse.setMetadataBlockRoot(false); + dataverse.clearMetadataBlocks(); + } else { + dataverse.setMetadataBlockRoot(true); + dataverse.setMetadataBlocks(metadataBlocks); + } } } + /* + facets = null - ignore + facets is empty - delete and inherit from parent + facets is not empty - set with new updated values + */ private void processFacets(CommandContext ctxt) { if (facets != null) { - ctxt.facets().deleteFacetsFor(dataverse); - dataverse.setDataverseFacets(new ArrayList<>()); - - if (!facets.isEmpty()) { + if (facets.isEmpty()) { + ctxt.facets().deleteFacetsFor(dataverse); + dataverse.setFacetRoot(false); + } else { + ctxt.facets().deleteFacetsFor(dataverse); + dataverse.setDataverseFacets(new ArrayList<>()); dataverse.setFacetRoot(true); + for (int i = 0; i < facets.size(); i++) { + ctxt.facets().create(i, facets.get(i), dataverse); + } } - - for (int i = 0; i < facets.size(); i++) { - ctxt.facets().create(i, facets.get(i), dataverse); - } - } else if (resetRelationsOnNullValues) { - ctxt.facets().deleteFacetsFor(dataverse); - dataverse.setFacetRoot(false); } } + /* + inputLevels = null - ignore + inputLevels is empty - delete + inputLevels is not empty - set with new updated values + */ private void processInputLevels(CommandContext ctxt) { if (inputLevels != null) { - if (!inputLevels.isEmpty()) { + if (inputLevels.isEmpty()) { + ctxt.fieldTypeInputLevels().deleteFacetsFor(dataverse); + } else { dataverse.addInputLevelsMetadataBlocksIfNotPresent(inputLevels); + ctxt.fieldTypeInputLevels().deleteFacetsFor(dataverse); + inputLevels.forEach(inputLevel -> { + inputLevel.setDataverse(dataverse); + ctxt.fieldTypeInputLevels().create(inputLevel); + }); } - ctxt.fieldTypeInputLevels().deleteFacetsFor(dataverse); - inputLevels.forEach(inputLevel -> { - inputLevel.setDataverse(dataverse); - ctxt.fieldTypeInputLevels().create(inputLevel); - }); - } else if (resetRelationsOnNullValues) { - ctxt.fieldTypeInputLevels().deleteFacetsFor(dataverse); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java index 3728f3ee6ce..145cfb6199c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java @@ -39,7 +39,7 @@ public CreateDataverseCommand(Dataverse created, List facets, List inputLevels, List metadataBlocks) { - super(created, created.getOwner(), request, facets, inputLevels, metadataBlocks, false); + super(created, created.getOwner(), request, facets, inputLevels, metadataBlocks); } @Override diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java index 6dc4ab4d00d..55cc3708097 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java @@ -32,7 +32,7 @@ public UpdateDataverseCommand(Dataverse dataverse, List featuredDataverses, DataverseRequest request, List inputLevels) { - this(dataverse, facets, featuredDataverses, request, inputLevels, null, null, false); + this(dataverse, facets, featuredDataverses, request, inputLevels, null, null); } public UpdateDataverseCommand(Dataverse dataverse, @@ -41,9 +41,8 @@ public UpdateDataverseCommand(Dataverse dataverse, DataverseRequest request, List inputLevels, List metadataBlocks, - DataverseDTO updatedDataverseDTO, - boolean resetRelationsOnNullValues) { - super(dataverse, dataverse, request, facets, inputLevels, metadataBlocks, resetRelationsOnNullValues); + DataverseDTO updatedDataverseDTO) { + super(dataverse, dataverse, request, facets, inputLevels, metadataBlocks); if (featuredDataverses != null) { this.featuredDataverseList = new ArrayList<>(featuredDataverses); } else { diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 962b961b85b..85602dd43a1 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -984,6 +984,7 @@ dataverse.inputlevels.error.cannotberequiredifnotincluded=The input level for th dataverse.facets.error.fieldtypenotfound=Can't find dataset field type '{0}' dataverse.facets.error.fieldtypenotfacetable=Dataset field type '{0}' is not facetable dataverse.metadatablocks.error.invalidmetadatablockname=Invalid metadata block name: {0} +dataverse.metadatablocks.error.containslistandinheritflag=Metadata block can not contain both {0} and {1}: true dataverse.create.error.jsonparse=Error parsing Json: {0} dataverse.create.error.jsonparsetodataverse=Error parsing the POSTed json into a dataverse: {0} # rolesAndPermissionsFragment.xhtml diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 960e3d2e3ac..bd798b931ad 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -14,6 +14,7 @@ import java.io.FileReader; import java.io.IOException; import java.nio.file.Paths; +import java.text.MessageFormat; import java.util.Arrays; import java.util.List; import java.util.logging.Logger; @@ -931,12 +932,14 @@ public void testListMetadataBlocks() { .body("data[0].fields.author.childFields.size()", is(4)); Response setMetadataBlocksResponse = UtilIT.setMetadataBlocks(dataverseAlias, Json.createArrayBuilder().add("citation").add("astrophysics"), apiToken); + setMetadataBlocksResponse.prettyPrint(); setMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode()); String[] testInputLevelNames = {"geographicCoverage", "country", "city", "notesText"}; boolean[] testRequiredInputLevels = {false, true, false, false}; boolean[] testIncludedInputLevels = {false, true, true, false}; Response updateDataverseInputLevelsResponse = UtilIT.updateDataverseInputLevels(dataverseAlias, testInputLevelNames, testRequiredInputLevels, testIncludedInputLevels, apiToken); + updateDataverseInputLevelsResponse.prettyPrint(); updateDataverseInputLevelsResponse.then().assertThat().statusCode(OK.getStatusCode()); // Dataverse not found @@ -947,6 +950,7 @@ public void testListMetadataBlocks() { String[] expectedAllMetadataBlockDisplayNames = {"Astronomy and Astrophysics Metadata", "Citation Metadata", "Geospatial Metadata"}; listMetadataBlocksResponse = UtilIT.listMetadataBlocks(dataverseAlias, false, false, apiToken); + listMetadataBlocksResponse.prettyPrint(); listMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode()); listMetadataBlocksResponse.then().assertThat() .statusCode(OK.getStatusCode()) @@ -1345,20 +1349,31 @@ public void testUpdateDataverse() { String[] newFacetIds = new String[]{"contributorName"}; String[] newMetadataBlockNames = new String[]{"citation", "geospatial", "biomedical"}; + // Assert that the error is returned for having both MetadataBlockNames and inheritMetadataBlocksFromParent Response updateDataverseResponse = UtilIT.updateDataverse( - testDataverseAlias, - newAlias, - newName, - newAffiliation, - newDataverseType, - newContactEmails, - newInputLevelNames, - newFacetIds, - newMetadataBlockNames, - apiToken + testDataverseAlias, newAlias, newName, newAffiliation, newDataverseType, newContactEmails, newInputLevelNames, + null, newMetadataBlockNames, apiToken, + Boolean.TRUE, Boolean.TRUE ); + updateDataverseResponse.then().assertThat() + .statusCode(BAD_REQUEST.getStatusCode()) + .body("message", equalTo(MessageFormat.format(BundleUtil.getStringFromBundle("dataverse.metadatablocks.error.containslistandinheritflag"), "metadataBlockNames", "inheritMetadataBlocksFromParent"))); + + // Assert that the error is returned for having both facetIds and inheritFacetsFromParent + updateDataverseResponse = UtilIT.updateDataverse( + testDataverseAlias, newAlias, newName, newAffiliation, newDataverseType, newContactEmails, newInputLevelNames, + newFacetIds, null, apiToken, + Boolean.TRUE, Boolean.TRUE + ); + updateDataverseResponse.then().assertThat() + .statusCode(BAD_REQUEST.getStatusCode()) + .body("message", equalTo(MessageFormat.format(BundleUtil.getStringFromBundle("dataverse.metadatablocks.error.containslistandinheritflag"), "facetIds", "inheritFacetsFromParent"))); // Assert dataverse properties are updated + updateDataverseResponse = UtilIT.updateDataverse( + testDataverseAlias, newAlias, newName, newAffiliation, newDataverseType, newContactEmails, newInputLevelNames, + newFacetIds, newMetadataBlockNames, apiToken + ); updateDataverseResponse.then().assertThat().statusCode(OK.getStatusCode()); String actualDataverseAlias = updateDataverseResponse.then().extract().path("data.alias"); assertEquals(newAlias, actualDataverseAlias); @@ -1395,7 +1410,60 @@ public void testUpdateDataverse() { Response getDataverseResponse = UtilIT.listDataverseFacets(oldDataverseAlias, apiToken); getDataverseResponse.then().assertThat().statusCode(NOT_FOUND.getStatusCode()); + listMetadataBlocksResponse = UtilIT.listMetadataBlocks(newAlias, false, false, apiToken); + listMetadataBlocksResponse.prettyPrint(); + updateDataverseResponse = UtilIT.updateDataverse( + newAlias, newAlias, newName, newAffiliation, newDataverseType, newContactEmails, + null, + null, + null, + apiToken + ); + updateDataverseResponse.prettyPrint(); + listMetadataBlocksResponse = UtilIT.listMetadataBlocks(newAlias, false, false, apiToken); + listMetadataBlocksResponse.prettyPrint(); + + + // Update the dataverse without including metadata blocks, facets, or input levels + // ignore the missing data so the metadata blocks, facets, and input levels are NOT deleted and inherited from the parent + updateDataverseResponse = UtilIT.updateDataverse( + newAlias, newAlias, newName, newAffiliation, newDataverseType, newContactEmails, + null, + null, + null, + apiToken + ); + updateDataverseResponse.then().assertThat().statusCode(OK.getStatusCode()); + + // Assert that the metadata blocks are untouched and NOT inherited from the parent + listMetadataBlocksResponse = UtilIT.listMetadataBlocks(newAlias, false, false, apiToken); + listMetadataBlocksResponse.prettyPrint(); + listMetadataBlocksResponse + .then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.size()", equalTo(3)) + .body("data[0].name", equalTo(actualDataverseMetadataBlock1)) + .body("data[1].name", equalTo(actualDataverseMetadataBlock2)) + .body("data[2].name", equalTo(actualDataverseMetadataBlock3)); + // Assert that the dataverse should still have its input level(s) + listDataverseInputLevelsResponse = UtilIT.listDataverseInputLevels(newAlias, apiToken); + listDataverseInputLevelsResponse.prettyPrint(); + listDataverseInputLevelsResponse + .then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.size()", equalTo(1)) + .body("data[0].datasetFieldTypeName", equalTo("geographicCoverage")); + // Assert that the dataverse should still have its Facets + listDataverseFacetsResponse = UtilIT.listDataverseFacets(newAlias, apiToken); + listDataverseFacetsResponse.prettyPrint(); + listDataverseFacetsResponse + .then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.size()", equalTo(1)) + .body("data", hasItem("contributorName")); + // Update the dataverse without setting metadata blocks, facets, or input levels + // Do NOT ignore the missing data so the metadata blocks, facets, and input levels are deleted and inherited from the parent updateDataverseResponse = UtilIT.updateDataverse( newAlias, newAlias, @@ -1406,12 +1474,14 @@ public void testUpdateDataverse() { null, null, null, - apiToken + apiToken, + Boolean.TRUE, Boolean.TRUE ); updateDataverseResponse.then().assertThat().statusCode(OK.getStatusCode()); // Assert that the metadata blocks are inherited from the parent listMetadataBlocksResponse = UtilIT.listMetadataBlocks(newAlias, false, false, apiToken); + listMetadataBlocksResponse.prettyPrint(); listMetadataBlocksResponse .then().assertThat() .statusCode(OK.getStatusCode()) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 630643afb39..6080e7f01ea 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -415,14 +415,13 @@ static Response createSubDataverse(String alias, String category, String apiToke objectBuilder.add("affiliation", affiliation); } - updateDataverseRequestJsonWithMetadataBlocksConfiguration(inputLevelNames, facetIds, metadataBlockNames, objectBuilder); + updateDataverseRequestJsonWithMetadataBlocksConfiguration(inputLevelNames, facetIds, metadataBlockNames, null, null, objectBuilder); JsonObject dvData = objectBuilder.build(); return given() .body(dvData.toString()).contentType(ContentType.JSON) .when().post("/api/dataverses/" + parentDV + "?key=" + apiToken); } - static Response updateDataverse(String alias, String newAlias, String newName, @@ -433,6 +432,23 @@ static Response updateDataverse(String alias, String[] newFacetIds, String[] newMetadataBlockNames, String apiToken) { + + return updateDataverse(alias, newAlias, newName, newAffiliation, newDataverseType, newContactEmails, + newInputLevelNames, newFacetIds, newMetadataBlockNames, apiToken, null, null); + } + + static Response updateDataverse(String alias, + String newAlias, + String newName, + String newAffiliation, + String newDataverseType, + String[] newContactEmails, + String[] newInputLevelNames, + String[] newFacetIds, + String[] newMetadataBlockNames, + String apiToken, + Boolean inheritMetadataBlocksFromParent, + Boolean inheritFacetsFromParent) { JsonArrayBuilder contactArrayBuilder = Json.createArrayBuilder(); for(String contactEmail : newContactEmails) { contactArrayBuilder.add(Json.createObjectBuilder().add("contactEmail", contactEmail)); @@ -445,7 +461,8 @@ static Response updateDataverse(String alias, .add("dataverseType", newDataverseType) .add("affiliation", newAffiliation); - updateDataverseRequestJsonWithMetadataBlocksConfiguration(newInputLevelNames, newFacetIds, newMetadataBlockNames, jsonBuilder); + updateDataverseRequestJsonWithMetadataBlocksConfiguration(newInputLevelNames, newFacetIds, newMetadataBlockNames, + inheritMetadataBlocksFromParent, inheritFacetsFromParent, jsonBuilder); JsonObject dvData = jsonBuilder.build(); return given() @@ -456,6 +473,8 @@ static Response updateDataverse(String alias, private static void updateDataverseRequestJsonWithMetadataBlocksConfiguration(String[] inputLevelNames, String[] facetIds, String[] metadataBlockNames, + Boolean inheritFacetsFromParent, + Boolean inheritMetadataBlocksFromParent, JsonObjectBuilder objectBuilder) { JsonObjectBuilder metadataBlocksObjectBuilder = Json.createObjectBuilder(); @@ -478,6 +497,9 @@ private static void updateDataverseRequestJsonWithMetadataBlocksConfiguration(St } metadataBlocksObjectBuilder.add("metadataBlockNames", metadataBlockNamesArrayBuilder); } + if (inheritMetadataBlocksFromParent != null) { + metadataBlocksObjectBuilder.add("inheritMetadataBlocksFromParent", inheritMetadataBlocksFromParent); + } if (facetIds != null) { JsonArrayBuilder facetIdsArrayBuilder = Json.createArrayBuilder(); @@ -486,6 +508,9 @@ private static void updateDataverseRequestJsonWithMetadataBlocksConfiguration(St } metadataBlocksObjectBuilder.add("facetIds", facetIdsArrayBuilder); } + if (inheritFacetsFromParent != null) { + metadataBlocksObjectBuilder.add("inheritFacetsFromParent", inheritFacetsFromParent); + } objectBuilder.add("metadataBlocks", metadataBlocksObjectBuilder); }