diff --git a/doc/release-notes/10389-metadatablocks-api-extension.md b/doc/release-notes/10389-metadatablocks-api-extension.md
new file mode 100644
index 00000000000..9b14100d33c
--- /dev/null
+++ b/doc/release-notes/10389-metadatablocks-api-extension.md
@@ -0,0 +1,6 @@
+New optional query parameters added to ``api/metadatablocks`` and ``api/dataverses/{id}/metadatablocks`` endpoints:
+
+- ``returnDatasetFieldTypes``: Whether or not to return the dataset field types present in each metadata block. If not set, the default value is false.
+- ``onlyDisplayedOnCreate``: Whether or not to return only the metadata blocks that are displayed on dataset creation. If ``returnDatasetFieldTypes`` is true, only the dataset field types shown on dataset creation will be returned within each metadata block. If not set, the default value is false.
+
+Added new ``displayOnCreate`` field to the MetadataBlock and DatasetFieldType payloads.
diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst
index 0eb4e1515a7..0b9b042b052 100644
--- a/doc/sphinx-guides/source/api/native-api.rst
+++ b/doc/sphinx-guides/source/api/native-api.rst
@@ -447,6 +447,27 @@ The fully expanded example above (without environment variables) looks like this
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/dataverses/root/metadatablocks"
+This endpoint supports the following optional query parameters:
+
+- ``returnDatasetFieldTypes``: Whether or not to return the dataset field types present in each metadata block. If not set, the default value is false.
+- ``onlyDisplayedOnCreate``: Whether or not to return only the metadata blocks that are displayed on dataset creation. If ``returnDatasetFieldTypes`` is true, only the dataset field types shown on dataset creation will be returned within each metadata block. If not set, the default value is false.
+
+An example using the optional query parameters is presented below:
+
+.. code-block:: bash
+
+ export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+ export SERVER_URL=https://demo.dataverse.org
+ export ID=root
+
+ curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/dataverses/$ID/metadatablocks?returnDatasetFieldTypes=true&onlyDisplayedOnCreate=true"
+
+The fully expanded example above (without environment variables) looks like this:
+
+.. code-block:: bash
+
+ curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/dataverses/root/metadatablocks?returnDatasetFieldTypes=true&onlyDisplayedOnCreate=true"
+
Define Metadata Blocks for a Dataverse Collection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -4455,6 +4476,25 @@ The fully expanded example above (without environment variables) looks like this
curl "https://demo.dataverse.org/api/metadatablocks"
+This endpoint supports the following optional query parameters:
+
+- ``returnDatasetFieldTypes``: Whether or not to return the dataset field types present in each metadata block. If not set, the default value is false.
+- ``onlyDisplayedOnCreate``: Whether or not to return only the metadata blocks that are displayed on dataset creation. If ``returnDatasetFieldTypes`` is true, only the dataset field types shown on dataset creation will be returned within each metadata block. If not set, the default value is false.
+
+An example using the optional query parameters is presented below:
+
+.. code-block:: bash
+
+ export SERVER_URL=https://demo.dataverse.org
+
+ curl "$SERVER_URL/api/metadatablocks?returnDatasetFieldTypes=true&onlyDisplayedOnCreate=true"
+
+The fully expanded example above (without environment variables) looks like this:
+
+.. code-block:: bash
+
+ curl "https://demo.dataverse.org/api/metadatablocks?returnDatasetFieldTypes=true&onlyDisplayedOnCreate=true"
+
Show Info About Single Metadata Block
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/scripts/api/data/metadatablocks/citation.tsv b/scripts/api/data/metadatablocks/citation.tsv
index c5af05927dc..10084faedd3 100644
--- a/scripts/api/data/metadatablocks/citation.tsv
+++ b/scripts/api/data/metadatablocks/citation.tsv
@@ -33,7 +33,7 @@
publicationCitation Citation The full bibliographic citation for the related publication textbox 29 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE publication citation http://purl.org/dc/terms/bibliographicCitation
publicationIDType Identifier Type The type of identifier that uniquely identifies a related publication text 30 #VALUE: TRUE TRUE FALSE FALSE TRUE FALSE publication citation http://purl.org/spar/datacite/ResourceIdentifierScheme
publicationIDNumber Identifier The identifier for a related publication text 31 #VALUE TRUE FALSE FALSE FALSE TRUE FALSE publication citation http://purl.org/spar/datacite/ResourceIdentifier
- publicationURL URL The URL form of the identifier entered in the Identifier field, e.g. the DOI URL if a DOI was entered in the Identifier field. Used to display what was entered in the ID Type and ID Number fields as a link. If what was entered in the Identifier field has no URL form, the URL of the publication webpage is used, e.g. a journal article webpage https:// url 32 #VALUE FALSE FALSE FALSE FALSE FALSE FALSE publication citation https://schema.org/distribution
+ publicationURL URL The URL form of the identifier entered in the Identifier field, e.g. the DOI URL if a DOI was entered in the Identifier field. Used to display what was entered in the ID Type and ID Number fields as a link. If what was entered in the Identifier field has no URL form, the URL of the publication webpage is used, e.g. a journal article webpage https:// url 32 #VALUE FALSE FALSE FALSE FALSE TRUE FALSE publication citation https://schema.org/distribution
notesText Notes Additional information about the Dataset textbox 33 FALSE FALSE FALSE FALSE TRUE FALSE citation
language Language A language that the Dataset's files is written in text 34 TRUE TRUE TRUE TRUE FALSE FALSE citation http://purl.org/dc/terms/language
producer Producer The entity, such a person or organization, managing the finances or other administrative processes involved in the creation of the Dataset none 35 FALSE FALSE TRUE FALSE FALSE FALSE citation
diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java
index c1de9d63410..42db9c1392a 100644
--- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java
+++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java
@@ -466,9 +466,6 @@ public void setTemplateRoot(boolean templateRoot) {
this.templateRoot = templateRoot;
}
-
-
-
public List getMetadataBlocks() {
return getMetadataBlocks(false);
}
diff --git a/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java b/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java
index bb3fa475847..b3b69e25bf3 100644
--- a/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java
+++ b/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java
@@ -124,6 +124,9 @@ public class EjbDataverseEngine {
@EJB
GuestbookResponseServiceBean responses;
+
+ @EJB
+ MetadataBlockServiceBean metadataBlockService;
@EJB
DataverseLinkingServiceBean dvLinking;
@@ -587,6 +590,11 @@ public ActionLogServiceBean actionLog() {
return logSvc;
}
+ @Override
+ public MetadataBlockServiceBean metadataBlocks() {
+ return metadataBlockService;
+ }
+
@Override
public void beginCommandSequence() {
this.commandsCalled = new Stack();
diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java
index bb6daa264ba..c4c95fae551 100644
--- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java
+++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java
@@ -1,43 +1,74 @@
package edu.harvard.iq.dataverse;
-import java.util.List;
import jakarta.ejb.Stateless;
import jakarta.inject.Named;
import jakarta.persistence.EntityManager;
import jakarta.persistence.NoResultException;
import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.TypedQuery;
+import jakarta.persistence.criteria.*;
+
+import java.util.List;
/**
- *
* @author michael
*/
@Stateless
@Named
public class MetadataBlockServiceBean {
-
+
@PersistenceContext(unitName = "VDCNet-ejbPU")
private EntityManager em;
-
+
public MetadataBlock save(MetadataBlock mdb) {
- return em.merge(mdb);
- }
-
-
+ return em.merge(mdb);
+ }
+
public List listMetadataBlocks() {
+ return listMetadataBlocks(false);
+ }
+
+ public List listMetadataBlocks(boolean onlyDisplayedOnCreate) {
+ if (onlyDisplayedOnCreate) {
+ return listMetadataBlocksDisplayedOnCreate(null);
+ }
return em.createNamedQuery("MetadataBlock.listAll", MetadataBlock.class).getResultList();
}
-
- public MetadataBlock findById( Long id ) {
+
+ public MetadataBlock findById(Long id) {
return em.find(MetadataBlock.class, id);
}
-
- public MetadataBlock findByName( String name ) {
+
+ public MetadataBlock findByName(String name) {
try {
return em.createNamedQuery("MetadataBlock.findByName", MetadataBlock.class)
- .setParameter("name", name)
- .getSingleResult();
- } catch ( NoResultException nre ) {
+ .setParameter("name", name)
+ .getSingleResult();
+ } catch (NoResultException nre) {
return null;
}
}
+
+ public List listMetadataBlocksDisplayedOnCreate(Dataverse ownerDataverse) {
+ CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(MetadataBlock.class);
+ Root metadataBlockRoot = criteriaQuery.from(MetadataBlock.class);
+ Join datasetFieldTypeJoin = metadataBlockRoot.join("datasetFieldTypes");
+ Predicate displayOnCreatePredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate"));
+
+ if (ownerDataverse != null) {
+ Root dataverseRoot = criteriaQuery.from(Dataverse.class);
+ criteriaQuery.where(criteriaBuilder.and(
+ criteriaBuilder.equal(dataverseRoot.get("id"), ownerDataverse.getId()),
+ metadataBlockRoot.in(dataverseRoot.get("metadataBlocks")),
+ displayOnCreatePredicate
+ ));
+ } else {
+ criteriaQuery.where(displayOnCreatePredicate);
+ }
+
+ criteriaQuery.select(metadataBlockRoot).distinct(true);
+ TypedQuery typedQuery = em.createQuery(criteriaQuery);
+ return typedQuery.getResultList();
+ }
}
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 a1dbc3a1de6..250257fc33b 100644
--- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java
+++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java
@@ -710,14 +710,19 @@ public Response deleteDataverseLinkingDataverse(@Context ContainerRequestContext
@GET
@AuthRequired
@Path("{identifier}/metadatablocks")
- public Response listMetadataBlocks(@Context ContainerRequestContext crc, @PathParam("identifier") String dvIdtf) {
+ public Response listMetadataBlocks(@Context ContainerRequestContext crc,
+ @PathParam("identifier") String dvIdtf,
+ @QueryParam("onlyDisplayedOnCreate") boolean onlyDisplayedOnCreate,
+ @QueryParam("returnDatasetFieldTypes") boolean returnDatasetFieldTypes) {
try {
- JsonArrayBuilder arr = Json.createArrayBuilder();
- final List blocks = execCommand(new ListMetadataBlocksCommand(createDataverseRequest(getRequestUser(crc)), findDataverseOrDie(dvIdtf)));
- for (MetadataBlock mdb : blocks) {
- arr.add(brief.json(mdb));
- }
- return ok(arr);
+ final List metadataBlocks = execCommand(
+ new ListMetadataBlocksCommand(
+ createDataverseRequest(getRequestUser(crc)),
+ findDataverseOrDie(dvIdtf),
+ onlyDisplayedOnCreate
+ )
+ );
+ return ok(json(metadataBlocks, returnDatasetFieldTypes, onlyDisplayedOnCreate));
} catch (WrappedResponse we) {
return we.getResponse();
}
diff --git a/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java b/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java
index 448fb48e389..8861abd4803 100644
--- a/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java
+++ b/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java
@@ -1,34 +1,33 @@
package edu.harvard.iq.dataverse.api;
import edu.harvard.iq.dataverse.MetadataBlock;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
-import static edu.harvard.iq.dataverse.util.json.JsonPrinter.brief;
-import jakarta.ws.rs.PathParam;
+
+import java.util.List;
+
import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json;
-import static edu.harvard.iq.dataverse.util.json.JsonPrinter.toJsonArray;
/**
* Api bean for managing metadata blocks.
+ *
* @author michael
*/
@Path("metadatablocks")
@Produces("application/json")
public class MetadataBlocks extends AbstractApiBean {
-
+
@GET
- public Response list() {
- return ok(metadataBlockSvc.listMetadataBlocks().stream().map(brief::json).collect(toJsonArray()));
+ public Response listMetadataBlocks(@QueryParam("onlyDisplayedOnCreate") boolean onlyDisplayedOnCreate,
+ @QueryParam("returnDatasetFieldTypes") boolean returnDatasetFieldTypes) {
+ List metadataBlocks = metadataBlockSvc.listMetadataBlocks(onlyDisplayedOnCreate);
+ return ok(json(metadataBlocks, returnDatasetFieldTypes, onlyDisplayedOnCreate));
}
-
+
@Path("{identifier}")
@GET
- public Response getBlock( @PathParam("identifier") String idtf ) {
+ public Response getMetadataBlock(@PathParam("identifier") String idtf) {
MetadataBlock b = findMetadataBlock(idtf);
-
- return (b != null ) ? ok(json(b)) : notFound("Can't find metadata block '" + idtf + "'");
+ return (b != null) ? ok(json(b)) : notFound("Can't find metadata block '" + idtf + "'");
}
-
}
diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java
index 6c4d63e3e35..48e8cd952b4 100644
--- a/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java
+++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java
@@ -15,6 +15,7 @@
import edu.harvard.iq.dataverse.FileDownloadServiceBean;
import edu.harvard.iq.dataverse.GuestbookResponseServiceBean;
import edu.harvard.iq.dataverse.GuestbookServiceBean;
+import edu.harvard.iq.dataverse.MetadataBlockServiceBean;
import edu.harvard.iq.dataverse.search.IndexServiceBean;
import edu.harvard.iq.dataverse.PermissionServiceBean;
import edu.harvard.iq.dataverse.RoleAssigneeServiceBean;
@@ -133,7 +134,9 @@ public interface CommandContext {
public ConfirmEmailServiceBean confirmEmail();
public ActionLogServiceBean actionLog();
-
+
+ public MetadataBlockServiceBean metadataBlocks();
+
public void beginCommandSequence();
public boolean completeCommandSequence(Command command);
diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommand.java
index 912318cf155..8275533ced2 100644
--- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommand.java
+++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommand.java
@@ -7,6 +7,7 @@
import edu.harvard.iq.dataverse.engine.command.CommandContext;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
+
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -14,29 +15,40 @@
/**
* Lists the metadata blocks of a {@link Dataverse}.
- *
+ *
* @author michael
*/
// no annotations here, since permissions are dynamically decided
-public class ListMetadataBlocksCommand extends AbstractCommand>{
-
- private final Dataverse dv;
-
- public ListMetadataBlocksCommand(DataverseRequest aRequest, Dataverse aDataverse) {
- super(aRequest, aDataverse);
- dv = aDataverse;
+public class ListMetadataBlocksCommand extends AbstractCommand> {
+
+ private final Dataverse dataverse;
+ private final boolean onlyDisplayedOnCreate;
+
+ public ListMetadataBlocksCommand(DataverseRequest request, Dataverse dataverse, boolean onlyDisplayedOnCreate) {
+ super(request, dataverse);
+ this.dataverse = dataverse;
+ this.onlyDisplayedOnCreate = onlyDisplayedOnCreate;
}
@Override
public List execute(CommandContext ctxt) throws CommandException {
- return dv.getMetadataBlocks();
+ if (onlyDisplayedOnCreate) {
+ return listMetadataBlocksDisplayedOnCreate(ctxt, dataverse);
+ }
+ return dataverse.getMetadataBlocks();
}
-
+
+ private List listMetadataBlocksDisplayedOnCreate(CommandContext ctxt, Dataverse dataverse) {
+ if (dataverse.isMetadataBlockRoot() || dataverse.getOwner() == null) {
+ return ctxt.metadataBlocks().listMetadataBlocksDisplayedOnCreate(dataverse);
+ }
+ return listMetadataBlocksDisplayedOnCreate(ctxt, dataverse.getOwner());
+ }
+
@Override
public Map> getRequiredPermissions() {
return Collections.singletonMap("",
- dv.isReleased() ? Collections.emptySet()
- : Collections.singleton(Permission.ViewUnpublishedDataverse));
- }
-
+ dataverse.isReleased() ? Collections.emptySet()
+ : Collections.singleton(Permission.ViewUnpublishedDataverse));
+ }
}
diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java
index 3fcaf6b11ff..c16a46a1765 100644
--- a/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java
+++ b/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java
@@ -28,6 +28,7 @@ public JsonObjectBuilder json( MetadataBlock blk ) {
? null
: jsonObjectBuilder().add("id", blk.getId())
.add("displayName", blk.getDisplayName())
+ .add("displayOnCreate", blk.isDisplayOnCreate())
.add("name", blk.getName())
;
}
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 99c7a265119..a0278d1a60f 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
@@ -587,6 +587,14 @@ public static JsonObjectBuilder json(MetadataBlock block, List fie
return blockBld;
}
+ public static JsonArrayBuilder json(List metadataBlocks, boolean returnDatasetFieldTypes, boolean printOnlyDisplayedOnCreateDatasetFieldTypes) {
+ JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
+ for (MetadataBlock metadataBlock : metadataBlocks) {
+ arrayBuilder.add(returnDatasetFieldTypes ? json(metadataBlock, printOnlyDisplayedOnCreateDatasetFieldTypes) : brief.json(metadataBlock));
+ }
+ return arrayBuilder;
+ }
+
public static String typeClassString(DatasetFieldType typ) {
if (typ.isControlledVocabulary()) {
return "controlledVocabulary";
@@ -609,26 +617,34 @@ public static JsonObject json(DatasetField dfv) {
}
}
- public static JsonObjectBuilder json(MetadataBlock blk) {
- JsonObjectBuilder bld = jsonObjectBuilder();
- bld.add("id", blk.getId());
- bld.add("name", blk.getName());
- bld.add("displayName", blk.getDisplayName());
+ public static JsonObjectBuilder json(MetadataBlock metadataBlock) {
+ return json(metadataBlock, false);
+ }
- JsonObjectBuilder fieldsBld = jsonObjectBuilder();
- for (DatasetFieldType df : new TreeSet<>(blk.getDatasetFieldTypes())) {
- fieldsBld.add(df.getName(), JsonPrinter.json(df));
+ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printOnlyDisplayedOnCreateDatasetFieldTypes) {
+ JsonObjectBuilder jsonObjectBuilder = jsonObjectBuilder();
+ jsonObjectBuilder.add("id", metadataBlock.getId());
+ jsonObjectBuilder.add("name", metadataBlock.getName());
+ jsonObjectBuilder.add("displayName", metadataBlock.getDisplayName());
+ jsonObjectBuilder.add("displayOnCreate", metadataBlock.isDisplayOnCreate());
+
+ JsonObjectBuilder fieldsBuilder = jsonObjectBuilder();
+ for (DatasetFieldType datasetFieldType : new TreeSet<>(metadataBlock.getDatasetFieldTypes())) {
+ if (!printOnlyDisplayedOnCreateDatasetFieldTypes || datasetFieldType.isDisplayOnCreate()) {
+ fieldsBuilder.add(datasetFieldType.getName(), json(datasetFieldType));
+ }
}
- bld.add("fields", fieldsBld);
+ jsonObjectBuilder.add("fields", fieldsBuilder);
- return bld;
+ return jsonObjectBuilder;
}
public static JsonObjectBuilder json(DatasetFieldType fld) {
JsonObjectBuilder fieldsBld = jsonObjectBuilder();
fieldsBld.add("name", fld.getName());
fieldsBld.add("displayName", fld.getDisplayName());
+ fieldsBld.add("displayOnCreate", fld.isDisplayOnCreate());
fieldsBld.add("title", fld.getTitle());
fieldsBld.add("type", fld.getFieldType().toString());
fieldsBld.add("typeClass", typeClassString(fld));
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 3330d11435a..d7f7ff39cbd 100644
--- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java
+++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java
@@ -18,17 +18,14 @@
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
import jakarta.ws.rs.core.Response.Status;
-import static jakarta.ws.rs.core.Response.Status.OK;
-import static jakarta.ws.rs.core.Response.Status.CREATED;
-import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST;
-import static jakarta.ws.rs.core.Response.Status.FORBIDDEN;
-import static jakarta.ws.rs.core.Response.Status.NOT_FOUND;
-import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+
+import static jakarta.ws.rs.core.Response.Status.*;
import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -691,5 +688,66 @@ public void testAttributesApi() throws Exception {
deleteCollectionResponse.prettyPrint();
assertEquals(OK.getStatusCode(), deleteCollectionResponse.getStatusCode());
}
-
+
+ @Test
+ public void testListMetadataBlocks() {
+ Response createUserResponse = UtilIT.createRandomUser();
+ String apiToken = UtilIT.getApiTokenFromResponse(createUserResponse);
+
+ Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken);
+ createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode());
+ String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);
+
+ Response setMetadataBlocksResponse = UtilIT.setMetadataBlocks(dataverseAlias, Json.createArrayBuilder().add("citation").add("astrophysics"), apiToken);
+ setMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode());
+
+ // Dataverse not found
+ Response listMetadataBlocksResponse = UtilIT.listMetadataBlocks("-1", false, false, apiToken);
+ listMetadataBlocksResponse.then().assertThat().statusCode(NOT_FOUND.getStatusCode());
+
+ // Existent dataverse and no optional params
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(dataverseAlias, false, false, apiToken);
+ listMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode());
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", equalTo(null))
+ .body("data.size()", equalTo(2));
+
+ // Existent dataverse and onlyDisplayedOnCreate=true
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(dataverseAlias, true, false, apiToken);
+ listMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode());
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", equalTo(null))
+ .body("data[0].displayName", equalTo("Citation Metadata"))
+ .body("data.size()", equalTo(1));
+
+ // Existent dataverse and returnDatasetFieldTypes=true
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(dataverseAlias, false, true, apiToken);
+ listMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode());
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", not(equalTo(null)))
+ .body("data.size()", equalTo(2));
+
+ // Existent dataverse and onlyDisplayedOnCreate=true and returnDatasetFieldTypes=true
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(dataverseAlias, true, true, apiToken);
+ listMetadataBlocksResponse.then().assertThat().statusCode(OK.getStatusCode());
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", not(equalTo(null)))
+ .body("data[0].displayName", equalTo("Citation Metadata"))
+ .body("data.size()", equalTo(1));
+
+ // User has no permissions on the requested dataverse
+ Response createSecondUserResponse = UtilIT.createRandomUser();
+ String secondApiToken = UtilIT.getApiTokenFromResponse(createSecondUserResponse);
+
+ createDataverseResponse = UtilIT.createRandomDataverse(secondApiToken);
+ createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode());
+ String secondDataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);
+
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(secondDataverseAlias, true, true, apiToken);
+ listMetadataBlocksResponse.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode());
+ }
}
diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java
index 39152bccad8..5f5a7fbc0f8 100644
--- a/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java
+++ b/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java
@@ -8,6 +8,8 @@
import static jakarta.ws.rs.core.Response.Status.CREATED;
import static jakarta.ws.rs.core.Response.Status.OK;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
@@ -20,7 +22,42 @@ public static void setUpClass() {
}
@Test
- void testGetCitationBlock() {
+ void testListMetadataBlocks() {
+ // No optional params enabled
+ Response listMetadataBlocksResponse = UtilIT.listMetadataBlocks(false, false);
+ int expectedDefaultNumberOfMetadataBlocks = 6;
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", equalTo(null))
+ .body("data.size()", equalTo(expectedDefaultNumberOfMetadataBlocks));
+
+ // onlyDisplayedOnCreate=true
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(true, false);
+ int expectedOnlyDisplayedOnCreateNumberOfMetadataBlocks = 1;
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", equalTo(null))
+ .body("data[0].displayName", equalTo("Citation Metadata"))
+ .body("data.size()", equalTo(expectedOnlyDisplayedOnCreateNumberOfMetadataBlocks));
+
+ // returnDatasetFieldTypes=true
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(false, true);
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", not(equalTo(null)))
+ .body("data.size()", equalTo(expectedDefaultNumberOfMetadataBlocks));
+
+ // onlyDisplayedOnCreate=true and returnDatasetFieldTypes=true
+ listMetadataBlocksResponse = UtilIT.listMetadataBlocks(true, true);
+ listMetadataBlocksResponse.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data[0].fields", not(equalTo(null)))
+ .body("data[0].displayName", equalTo("Citation Metadata"))
+ .body("data.size()", equalTo(expectedOnlyDisplayedOnCreateNumberOfMetadataBlocks));
+ }
+
+ @Test
+ void testGetMetadataBlock() {
Response getCitationBlock = UtilIT.getMetadataBlock("citation");
getCitationBlock.prettyPrint();
getCitationBlock.then().assertThat()
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 ba36911ffae..824f4e232ad 100644
--- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java
+++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java
@@ -647,6 +647,21 @@ static Response setMetadataBlocks(String dataverseAlias, JsonArrayBuilder blocks
.post("/api/dataverses/" + dataverseAlias + "/metadatablocks");
}
+ static Response listMetadataBlocks(String dataverseAlias, boolean onlyDisplayedOnCreate, boolean returnDatasetFieldTypes, String apiToken) {
+ return given()
+ .header(API_TOKEN_HTTP_HEADER, apiToken)
+ .queryParam("onlyDisplayedOnCreate", onlyDisplayedOnCreate)
+ .queryParam("returnDatasetFieldTypes", returnDatasetFieldTypes)
+ .get("/api/dataverses/" + dataverseAlias + "/metadatablocks");
+ }
+
+ static Response listMetadataBlocks(boolean onlyDisplayedOnCreate, boolean returnDatasetFieldTypes) {
+ return given()
+ .queryParam("onlyDisplayedOnCreate", onlyDisplayedOnCreate)
+ .queryParam("returnDatasetFieldTypes", returnDatasetFieldTypes)
+ .get("/api/metadatablocks");
+ }
+
static Response getMetadataBlock(String block) {
return given()
.get("/api/metadatablocks/" + block);
diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java b/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java
index 255125189ae..fa89bb756f5 100644
--- a/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java
+++ b/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java
@@ -224,6 +224,11 @@ public ConfirmEmailServiceBean confirmEmail() {
public ActionLogServiceBean actionLog() {
return null;
}
+
+ @Override
+ public MetadataBlockServiceBean metadataBlocks() {
+ return null;
+ }
@Override
public StorageUseServiceBean storageUse() {
diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java
index b426f84a464..fc458d88acd 100644
--- a/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java
+++ b/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java
@@ -1,19 +1,16 @@
package edu.harvard.iq.dataverse.util.json;
-import edu.harvard.iq.dataverse.Dataset;
-import edu.harvard.iq.dataverse.DatasetField;
-import edu.harvard.iq.dataverse.DatasetFieldConstant;
-import edu.harvard.iq.dataverse.DatasetFieldType;
-import edu.harvard.iq.dataverse.DatasetVersion;
-import edu.harvard.iq.dataverse.MetadataBlock;
+import edu.harvard.iq.dataverse.*;
import edu.harvard.iq.dataverse.mocks.MocksFactory;
import edu.harvard.iq.dataverse.workflow.Workflow;
import jakarta.json.JsonObject;
import org.junit.jupiter.api.Test;
import java.util.Collections;
+import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
/**
*
@@ -58,14 +55,16 @@ public void testJson_MetadataBlock() {
mtb.setId(1L);
mtb.setName("metadata_block_name");
mtb.setDisplayName("Metadata Block Name");
+ mtb.setDatasetFieldTypes(List.of(new DatasetFieldType("JustAString", DatasetFieldType.FieldType.TEXT, false)));
BriefJsonPrinter sut = new BriefJsonPrinter();
JsonObject res = sut.json(mtb).build();
assertEquals("Metadata Block Name", res.getString("displayName"));
- assertEquals("metadata_block_name", res.getString("name"));
- assertEquals(1, res.getInt("id"));
- assertEquals(3, res.keySet().size());
+ assertEquals("metadata_block_name", res.getString("name"));
+ assertFalse(res.getBoolean("displayOnCreate"));
+ assertEquals(1, res.getInt("id"));
+ assertEquals(4, res.keySet().size());
}
/**