Skip to content

Commit

Permalink
Merge 8b879f8 into 36fb0f4
Browse files Browse the repository at this point in the history
  • Loading branch information
GPortas committed Apr 10, 2024
2 parents 36fb0f4 + 8b879f8 commit 0015550
Show file tree
Hide file tree
Showing 17 changed files with 314 additions and 82 deletions.
6 changes: 6 additions & 0 deletions 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.
40 changes: 40 additions & 0 deletions doc/sphinx-guides/source/api/native-api.rst
Expand Up @@ -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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand Down Expand Up @@ -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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down
2 changes: 1 addition & 1 deletion scripts/api/data/metadatablocks/citation.tsv
Expand Up @@ -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 <a href="#VALUE" target="_blank" rel="noopener">#VALUE</a> 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 <a href="#VALUE" target="_blank" rel="noopener">#VALUE</a> 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
Expand Down
3 changes: 0 additions & 3 deletions src/main/java/edu/harvard/iq/dataverse/Dataverse.java
Expand Up @@ -466,9 +466,6 @@ public void setTemplateRoot(boolean templateRoot) {
this.templateRoot = templateRoot;
}




public List<MetadataBlock> getMetadataBlocks() {
return getMetadataBlocks(false);
}
Expand Down
Expand Up @@ -124,6 +124,9 @@ public class EjbDataverseEngine {

@EJB
GuestbookResponseServiceBean responses;

@EJB
MetadataBlockServiceBean metadataBlockService;

@EJB
DataverseLinkingServiceBean dvLinking;
Expand Down Expand Up @@ -587,6 +590,11 @@ public ActionLogServiceBean actionLog() {
return logSvc;
}

@Override
public MetadataBlockServiceBean metadataBlocks() {
return metadataBlockService;
}

@Override
public void beginCommandSequence() {
this.commandsCalled = new Stack();
Expand Down
@@ -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<MetadataBlock> listMetadataBlocks() {
return listMetadataBlocks(false);
}

public List<MetadataBlock> 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<MetadataBlock> listMetadataBlocksDisplayedOnCreate(Dataverse ownerDataverse) {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<MetadataBlock> criteriaQuery = criteriaBuilder.createQuery(MetadataBlock.class);
Root<MetadataBlock> metadataBlockRoot = criteriaQuery.from(MetadataBlock.class);
Join<MetadataBlock, DatasetFieldType> datasetFieldTypeJoin = metadataBlockRoot.join("datasetFieldTypes");
Predicate displayOnCreatePredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate"));

if (ownerDataverse != null) {
Root<Dataverse> 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<MetadataBlock> typedQuery = em.createQuery(criteriaQuery);
return typedQuery.getResultList();
}
}
19 changes: 12 additions & 7 deletions src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java
Expand Up @@ -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<MetadataBlock> blocks = execCommand(new ListMetadataBlocksCommand(createDataverseRequest(getRequestUser(crc)), findDataverseOrDie(dvIdtf)));
for (MetadataBlock mdb : blocks) {
arr.add(brief.json(mdb));
}
return ok(arr);
final List<MetadataBlock> metadataBlocks = execCommand(
new ListMetadataBlocksCommand(
createDataverseRequest(getRequestUser(crc)),
findDataverseOrDie(dvIdtf),
onlyDisplayedOnCreate
)
);
return ok(json(metadataBlocks, returnDatasetFieldTypes, onlyDisplayedOnCreate));
} catch (WrappedResponse we) {
return we.getResponse();
}
Expand Down
27 changes: 13 additions & 14 deletions 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<MetadataBlock> 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 + "'");
}

}
Expand Up @@ -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;
Expand Down Expand Up @@ -133,7 +134,9 @@ public interface CommandContext {
public ConfirmEmailServiceBean confirmEmail();

public ActionLogServiceBean actionLog();


public MetadataBlockServiceBean metadataBlocks();

public void beginCommandSequence();

public boolean completeCommandSequence(Command command);
Expand Down
Expand Up @@ -7,36 +7,48 @@
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;
import java.util.Set;

/**
* Lists the metadata blocks of a {@link Dataverse}.
*
*
* @author michael
*/
// no annotations here, since permissions are dynamically decided
public class ListMetadataBlocksCommand extends AbstractCommand<List<MetadataBlock>>{

private final Dataverse dv;

public ListMetadataBlocksCommand(DataverseRequest aRequest, Dataverse aDataverse) {
super(aRequest, aDataverse);
dv = aDataverse;
public class ListMetadataBlocksCommand extends AbstractCommand<List<MetadataBlock>> {

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<MetadataBlock> execute(CommandContext ctxt) throws CommandException {
return dv.getMetadataBlocks();
if (onlyDisplayedOnCreate) {
return listMetadataBlocksDisplayedOnCreate(ctxt, dataverse);
}
return dataverse.getMetadataBlocks();
}


private List<MetadataBlock> listMetadataBlocksDisplayedOnCreate(CommandContext ctxt, Dataverse dataverse) {
if (dataverse.isMetadataBlockRoot() || dataverse.getOwner() == null) {
return ctxt.metadataBlocks().listMetadataBlocksDisplayedOnCreate(dataverse);
}
return listMetadataBlocksDisplayedOnCreate(ctxt, dataverse.getOwner());
}

@Override
public Map<String, Set<Permission>> getRequiredPermissions() {
return Collections.singletonMap("",
dv.isReleased() ? Collections.<Permission>emptySet()
: Collections.singleton(Permission.ViewUnpublishedDataverse));
}

dataverse.isReleased() ? Collections.<Permission>emptySet()
: Collections.singleton(Permission.ViewUnpublishedDataverse));
}
}
Expand Up @@ -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())
;
}
Expand Down

0 comments on commit 0015550

Please sign in to comment.