From 2a6d274588b7d6cfe02a2d719bb3093a1e49ab83 Mon Sep 17 00:00:00 2001 From: Gustavo Durand Date: Fri, 4 Mar 2016 17:02:19 -0500 Subject: [PATCH 1/4] added backend support for alternate citation dates #2606 --- doc/sphinx-guides/source/api/native-api.rst | 5 ++ .../upgrades/upgrade_v4.2.4_to_4.3.sql | 7 ++ .../edu/harvard/iq/dataverse/Dataset.java | 13 ++++ .../harvard/iq/dataverse/DatasetVersion.java | 73 ++++++++++++++----- .../harvard/iq/dataverse/api/Datasets.java | 24 +++++- .../impl/SetDatasetCitationDateCommand.java | 51 +++++++++++++ 6 files changed, 155 insertions(+), 18 deletions(-) create mode 100644 scripts/database/upgrades/upgrade_v4.2.4_to_4.3.sql create mode 100644 src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 98ada68727b..a07fb2e0e7a 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -139,6 +139,11 @@ Deletes the draft version of dataset ``$id``. Only the draft version can be dele DELETE http://$SERVER/api/datasets/$id/versions/:draft?key=$apiKey +Sets the dataset field type to be used as the citation date for the given dataset (if the dataset does not include the dataset field type, the default logic is used). To revert to the default logic, use ``:publicationDate`` as the ``$datasetFieldTypeName``:: + + PUT http://$SERVER/api/datasets/$id/citationdate/$datasetFieldTypeName?key=$apiKey + + Builtin Users ~~~~~ diff --git a/scripts/database/upgrades/upgrade_v4.2.4_to_4.3.sql b/scripts/database/upgrades/upgrade_v4.2.4_to_4.3.sql new file mode 100644 index 00000000000..237e0de81f4 --- /dev/null +++ b/scripts/database/upgrades/upgrade_v4.2.4_to_4.3.sql @@ -0,0 +1,7 @@ +-- Add new foreign ket to dataset for citation date (from datasetfieldtype) +ALTER TABLE dataset ADD COLUMN citationdatedatasetfieldtype_id bigint; + +ALTER TABLE dataset + ADD CONSTRAINT fk_dataset_citationdatedatasetfieldtype_id FOREIGN KEY (citationdatedatasetfieldtype_id) + REFERENCES datasetfieldtype (id) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION; \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 26409015032..6b019ab9a4a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -13,6 +13,7 @@ import javax.persistence.Entity; import javax.persistence.Index; import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; @@ -81,6 +82,18 @@ public void setDatasetLinkingDataverses(List datasetLin private boolean fileAccessRequest; @OneToMany(mappedBy = "dataset", orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}) private List dataFileCategories = null; + + @ManyToOne + @JoinColumn(name = "citationDateDatasetFieldType_id") + private DatasetFieldType citationDateDatasetFieldType; + + public DatasetFieldType getCitationDateDatasetFieldType() { + return citationDateDatasetFieldType; + } + + public void setCitationDateDatasetFieldType(DatasetFieldType citationDateDatasetFieldType) { + this.citationDateDatasetFieldType = citationDateDatasetFieldType; + } public Dataset() { //this.versions = new ArrayList(); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index a3c748478de..b6542f81bcf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -1,8 +1,10 @@ package edu.harvard.iq.dataverse; +import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; import edu.harvard.iq.dataverse.util.StringUtil; import java.io.Serializable; import java.sql.Timestamp; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; @@ -12,6 +14,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -664,30 +668,40 @@ public String getCitation(boolean isOnlineVersion) { } else { str += getDatasetProducersString(); } + + Date citationDate = getCitationDate(); + if (citationDate != null) { + if (!StringUtil.isEmpty(str)) { + str += ", "; + } + str += new SimpleDateFormat("yyyy").format(citationDate); + + } else { + if (this.getDataset().getPublicationDate() == null || StringUtil.isEmpty(this.getDataset().getPublicationDate().toString())) { - if (this.getDataset().getPublicationDate() == null || StringUtil.isEmpty(this.getDataset().getPublicationDate().toString())) { - - if (!this.getDataset().isHarvested()) { - //if not released use current year - if (!StringUtil.isEmpty(str)) { - str += ", "; - } - str += new SimpleDateFormat("yyyy").format(new Timestamp(new Date().getTime())); - } else { - String distDate = getDistributionDate(); - if (distDate != null) { + if (!this.getDataset().isHarvested()) { + //if not released use current year if (!StringUtil.isEmpty(str)) { str += ", "; } - str += distDate; + str += new SimpleDateFormat("yyyy").format(new Timestamp(new Date().getTime())); + } else { + String distDate = getDistributionDate(); + if (distDate != null) { + if (!StringUtil.isEmpty(str)) { + str += ", "; + } + str += distDate; + } } + } else { + if (!StringUtil.isEmpty(str)) { + str += ", "; + } + str += new SimpleDateFormat("yyyy").format(new Timestamp(this.getDataset().getPublicationDate().getTime())); } - } else { - if (!StringUtil.isEmpty(str)) { - str += ", "; - } - str += new SimpleDateFormat("yyyy").format(new Timestamp(this.getDataset().getPublicationDate().getTime())); } + if (this.getTitle() != null) { if (!StringUtil.isEmpty(this.getTitle())) { if (!StringUtil.isEmpty(str)) { @@ -780,6 +794,31 @@ public String getCitation(boolean isOnlineVersion) { }*/ return str; } + + private Date getCitationDate() { + DatasetField citationDate = getDatasetField(this.getDataset().getCitationDateDatasetFieldType()); + if (citationDate != null && citationDate.getDatasetFieldType().getFieldType().equals(FieldType.DATE)){ + try { + return new SimpleDateFormat("yyyy").parse( citationDate.getValue() ); + } catch (ParseException ex) { + Logger.getLogger(DatasetVersion.class.getName()).log(Level.SEVERE, null, ex); + } + } + + return null; + } + + public DatasetField getDatasetField(DatasetFieldType dsfType) { + if (dsfType != null) { + for (DatasetField dsf : this.getFlatDatasetFields()) { + if (dsf.getDatasetFieldType().equals(dsfType)) { + return dsf; + } + } + } + return null; + + } public String getDistributionDate() { //todo get dist date from datasetfieldvalue table diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 4e953af4591..fcc4f9c21b2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -3,6 +3,7 @@ import edu.harvard.iq.dataverse.DOIEZIdServiceBean; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetField; +import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetServiceBean; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.Dataverse; @@ -22,6 +23,7 @@ import edu.harvard.iq.dataverse.engine.command.impl.GetLatestPublishedDatasetVersionCommand; import edu.harvard.iq.dataverse.engine.command.impl.ListVersionsCommand; import edu.harvard.iq.dataverse.engine.command.impl.PublishDatasetCommand; +import edu.harvard.iq.dataverse.engine.command.impl.SetDatasetCitationDateCommand; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetTargetURLCommand; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand; import edu.harvard.iq.dataverse.export.DDIExportServiceBean; @@ -124,7 +126,27 @@ public Response destroyDataset( @PathParam("id") Long id) { } catch (WrappedResponse ex) { return ex.refineResponse( "Failed to detroy dataset " + id ); } - } + } + + @PUT + @Path("{id}/citationdate/{datasetFieldTypeName}") + public Response setCitationDate( @PathParam("id") Long id, @PathParam("datasetFieldTypeName") String dsfTypeName) { + try { + DatasetFieldType dsfType = null; + if (!":publicationDate".equals(dsfTypeName)) { + dsfType = datasetFieldSvc.findByName(dsfTypeName); + if (dsfType == null) { + return notFound("Dataset Field Type Name " + dsfTypeName + " not found."); + } + } + + execCommand(new SetDatasetCitationDateCommand(createDataverseRequest(findUserOrDie()), findDatasetOrDie(id), dsfType)); + return okResponse("Citation Date for dataset " + id + " set to: " + (dsfType != null ? dsfType.getDisplayName() : "default")); + + } catch (WrappedResponse ex) { + return ex.refineResponse("Unable to set citation date for dataset " + id); + } + } @GET @Path("{id}/versions") diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java new file mode 100644 index 00000000000..a790c90e723 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java @@ -0,0 +1,51 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package edu.harvard.iq.dataverse.engine.command.impl; + +import edu.harvard.iq.dataverse.Dataset; +import edu.harvard.iq.dataverse.DatasetFieldType; +import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; +import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.engine.command.AbstractCommand; +import edu.harvard.iq.dataverse.engine.command.CommandContext; +import edu.harvard.iq.dataverse.engine.command.DataverseRequest; +import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; +import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; +import java.util.concurrent.Future; + +/** + * + * @author gdurand + */ +@RequiredPermissions( Permission.PublishDataset ) +public class SetDatasetCitationDateCommand extends AbstractCommand{ + + + private final DatasetFieldType dsfType; + private final Dataset dataset; + + public SetDatasetCitationDateCommand( DataverseRequest aRequest, Dataset dataset, DatasetFieldType dsfType ) { + super( aRequest, dataset ); + this.dataset = dataset; + this.dsfType = dsfType; + } + + @Override + public Dataset execute(CommandContext ctxt) throws CommandException { + if ( dsfType == null || dsfType.getFieldType().equals(FieldType.DATE) ) { + dataset.setCitationDateDatasetFieldType(dsfType); + } else { + throw new IllegalCommandException("Provided DatasetFieldtype is not a Date", this); + } + + Dataset savedDataset = ctxt.em().merge(dataset); + ctxt.index().indexDataset(savedDataset, false); + return savedDataset; + } + +} + From 63b1adcd281abbfaa9de60370d8bbc7b3e74a182 Mon Sep 17 00:00:00 2001 From: Michael Bar-Sinai Date: Mon, 7 Mar 2016 22:56:17 +0200 Subject: [PATCH 2/4] API for setting dataset citation type uses PUT body. WrappedResponse#refine looks into JSON body of the wrapped response, if indeed the wrapped response is of type application/json --- doc/sphinx-guides/source/api/native-api.rst | 6 ++- .../iq/dataverse/api/AbstractApiBean.java | 42 +++++++++++++++++-- .../harvard/iq/dataverse/api/Datasets.java | 12 ++++-- .../impl/SetDatasetCitationDateCommand.java | 8 +--- 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index a07fb2e0e7a..88fc9140f83 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -139,9 +139,11 @@ Deletes the draft version of dataset ``$id``. Only the draft version can be dele DELETE http://$SERVER/api/datasets/$id/versions/:draft?key=$apiKey -Sets the dataset field type to be used as the citation date for the given dataset (if the dataset does not include the dataset field type, the default logic is used). To revert to the default logic, use ``:publicationDate`` as the ``$datasetFieldTypeName``:: +Sets the dataset field type to be used as the citation date for the given dataset (if the dataset does not include the dataset field type, the default logic is used). The name of the dataset field type should be sent in the body of the reqeust. +To revert to the default logic, use ``:publicationDate`` as the ``$datasetFieldTypeName``. +Note that the dataset field used has to be a date field:: - PUT http://$SERVER/api/datasets/$id/citationdate/$datasetFieldTypeName?key=$apiKey + PUT http://$SERVER/api/datasets/$id/citationdate?key=$apiKey Builtin Users diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index a8947792490..ab8c00d3f3f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -31,6 +31,7 @@ import edu.harvard.iq.dataverse.util.json.JsonParser; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import edu.harvard.iq.dataverse.validation.BeanValidationServiceBean; +import java.io.StringReader; import java.net.URI; import java.util.concurrent.Callable; import java.util.logging.Level; @@ -38,7 +39,11 @@ import javax.ejb.EJB; import javax.json.Json; import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; import javax.json.JsonObjectBuilder; +import javax.json.JsonReader; +import javax.json.JsonValue; +import javax.json.JsonValue.ValueType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.servlet.http.HttpServletRequest; @@ -83,10 +88,39 @@ public Response getResponse() { */ public Response refineResponse( String message ) { final Status statusCode = Response.Status.fromStatusCode(response.getStatus()); - final Throwable cause = getCause(); - return errorResponse(statusCode, message - + (cause!=null ? " "+cause.getMessage() : "") - + " (" + statusCode.toString() + ")" ); + String baseMessage = getWrappedMessageWhenJson(); + + if ( baseMessage == null ) { + final Throwable cause = getCause(); + baseMessage = (cause!=null ? cause.getMessage() : ""); + } + return errorResponse(statusCode, message+" "+baseMessage); + } + + /** + * In the common case of the wrapped response being of type JSON, + * return the message field it has (if any). + * @return the content of a message field, or {@code null}. + */ + String getWrappedMessageWhenJson() { + if ( response.getMediaType().equals(MediaType.APPLICATION_JSON_TYPE) ) { + Object entity = response.getEntity(); + if ( entity == null ) return null; + + String json = entity.toString(); + try ( StringReader rdr = new StringReader(json) ){ + JsonReader jrdr = Json.createReader(rdr); + JsonObject obj = jrdr.readObject(); + if ( obj.containsKey("message") ) { + JsonValue message = obj.get("message"); + return message.getValueType() == ValueType.STRING ? obj.getString("message") : message.toString(); + } else { + return null; + } + } + } else { + return null; + } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index fcc4f9c21b2..26603b3939b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -129,22 +129,26 @@ public Response destroyDataset( @PathParam("id") Long id) { } @PUT - @Path("{id}/citationdate/{datasetFieldTypeName}") - public Response setCitationDate( @PathParam("id") Long id, @PathParam("datasetFieldTypeName") String dsfTypeName) { + @Path("{id}/citationdate") + public Response setCitationDate( @PathParam("id") Long id, String dsfTypeName) { try { + if ( dsfTypeName.trim().isEmpty() ){ + throw new WrappedResponse( badRequest("Please provide a dataset field type in the requst body.") ); + } DatasetFieldType dsfType = null; if (!":publicationDate".equals(dsfTypeName)) { dsfType = datasetFieldSvc.findByName(dsfTypeName); if (dsfType == null) { - return notFound("Dataset Field Type Name " + dsfTypeName + " not found."); + throw new WrappedResponse( badRequest("Dataset Field Type Name " + dsfTypeName + " not found.") ); } } execCommand(new SetDatasetCitationDateCommand(createDataverseRequest(findUserOrDie()), findDatasetOrDie(id), dsfType)); + return okResponse("Citation Date for dataset " + id + " set to: " + (dsfType != null ? dsfType.getDisplayName() : "default")); } catch (WrappedResponse ex) { - return ex.refineResponse("Unable to set citation date for dataset " + id); + return ex.refineResponse("Unable to set citation date for dataset " + id + "."); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java index a790c90e723..707b9fa94f4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java @@ -1,8 +1,3 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package edu.harvard.iq.dataverse.engine.command.impl; import edu.harvard.iq.dataverse.Dataset; @@ -15,7 +10,6 @@ import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; -import java.util.concurrent.Future; /** * @@ -41,7 +35,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { } else { throw new IllegalCommandException("Provided DatasetFieldtype is not a Date", this); } - + Dataset savedDataset = ctxt.em().merge(dataset); ctxt.index().indexDataset(savedDataset, false); return savedDataset; From 3db6eb304f82f213c456c77b7bd311abb2606ed7 Mon Sep 17 00:00:00 2001 From: Michael Bar-Sinai Date: Mon, 7 Mar 2016 23:48:22 +0200 Subject: [PATCH 3/4] src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand is now testable. --- .../edu/harvard/iq/dataverse/DatasetServiceBean.java | 11 ++++++++++- .../command/impl/SetDatasetCitationDateCommand.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java index 96071cc652a..8596ba9dcc8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java @@ -121,7 +121,16 @@ public List findAllOrSubset(long numPartitions, long partitionId, boole typedQuery.setParameter("partitionId", partitionId); return typedQuery.getResultList(); } - + + /** + * Merges the passed dataset to the persistence context. + * @param ds the dataset whose new state we want to persist. + * @return The managed entity representing {@code ds}. + */ + public Dataset merge( Dataset ds ) { + return em.merge(ds); + } + public Dataset findByGlobalId(String globalId) { String protocol = ""; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java index 707b9fa94f4..362b2ea29e4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDatasetCitationDateCommand.java @@ -36,7 +36,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { throw new IllegalCommandException("Provided DatasetFieldtype is not a Date", this); } - Dataset savedDataset = ctxt.em().merge(dataset); + Dataset savedDataset = ctxt.datasets().merge(dataset); ctxt.index().indexDataset(savedDataset, false); return savedDataset; } From 92612392a94a6e65c53043401a1624fc25332eeb Mon Sep 17 00:00:00 2001 From: Michael Bar-Sinai Date: Mon, 7 Mar 2016 23:56:57 +0200 Subject: [PATCH 4/4] Added a DELETE API call to restore default behavior for date used for citation --- doc/sphinx-guides/source/api/native-api.rst | 4 ++++ .../java/edu/harvard/iq/dataverse/api/Datasets.java | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 88fc9140f83..b657fd99ed2 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -144,6 +144,10 @@ To revert to the default logic, use ``:publicationDate`` as the ``$datasetFieldT Note that the dataset field used has to be a date field:: PUT http://$SERVER/api/datasets/$id/citationdate?key=$apiKey + +Restores the default logic of the field type to be used as the citation date. Same as ``PUT`` with ``:publicationDate`` body:: + + DELETE http://$SERVER/api/datasets/$id/citationdate?key=$apiKey Builtin Users diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 26603b3939b..7c3985e1bdb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -150,6 +150,17 @@ public Response setCitationDate( @PathParam("id") Long id, String dsfTypeName) { } catch (WrappedResponse ex) { return ex.refineResponse("Unable to set citation date for dataset " + id + "."); } + } + + @DELETE + @Path("{id}/citationdate") + public Response useDefaultCitationDate( @PathParam("id") Long id) { + try { + execCommand(new SetDatasetCitationDateCommand(createDataverseRequest(findUserOrDie()), findDatasetOrDie(id), null)); + return okResponse("Citation Date for dataset " + id + " set to default"); + } catch (WrappedResponse ex) { + return ex.refineResponse("Unable to restore default citation date for dataset " + id + "."); + } } @GET