Skip to content

Commit

Permalink
added backend support for alternate citation dates #2606
Browse files Browse the repository at this point in the history
  • Loading branch information
scolapasta committed Mar 4, 2016
1 parent e27d3d6 commit 2a6d274
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 18 deletions.
5 changes: 5 additions & 0 deletions doc/sphinx-guides/source/api/native-api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
~~~~~

Expand Down
7 changes: 7 additions & 0 deletions scripts/database/upgrades/upgrade_v4.2.4_to_4.3.sql
Original file line number Diff line number Diff line change
@@ -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;
13 changes: 13 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/Dataset.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -81,6 +82,18 @@ public void setDatasetLinkingDataverses(List<DatasetLinkingDataverse> datasetLin
private boolean fileAccessRequest;
@OneToMany(mappedBy = "dataset", orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
private List<DataFileCategory> 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();
Expand Down
73 changes: 56 additions & 17 deletions src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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
Expand Down
24 changes: 23 additions & 1 deletion src/main/java/edu/harvard/iq/dataverse/api/Datasets.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Dataset>{


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;
}

}

0 comments on commit 2a6d274

Please sign in to comment.