package edu.harvard.iq.dataverse.engine.command.impl;
import edu.harvard.iq.dataverse.Dataset;
import edu.harvard.iq.dataverse.DatasetField;
import edu.harvard.iq.dataverse.DatasetVersion;
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.sql.Timestamp;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import javax.validation.ConstraintViolation;
/**
* Updates a {@link DatasetVersion}, as long as that version is in a "draft" state.
* @author michael
*/
@RequiredPermissions(Permission.EditDataset)
public class UpdateDatasetVersionCommand extends AbstractCommand<DatasetVersion> {
final DatasetVersion newVersion;
public UpdateDatasetVersionCommand(DataverseRequest aRequest, DatasetVersion theNewVersion) {
super(aRequest, theNewVersion.getDataset());
newVersion = theNewVersion;
}
@Override
public DatasetVersion execute(CommandContext ctxt) throws CommandException {
Dataset ds = newVersion.getDataset();
DatasetVersion latest = ds.getLatestVersion();
if ( latest == null ) {
throw new IllegalCommandException("Dataset " + ds.getId() + " does not have a latest version.", this);
}
if ( ! latest.isDraft() ) {
throw new IllegalCommandException("Cannot update a dataset version that's not a draft", this);
}
DatasetVersion edit = ds.getEditVersion();
edit.setDatasetFields( newVersion.getDatasetFields() );
edit.setDatasetFields(edit.initDatasetFields());
Set<ConstraintViolation> constraintViolations = edit.validate();
if (!constraintViolations.isEmpty()) {
String validationFailedString = "Validation failed:";
for (ConstraintViolation constraintViolation : constraintViolations) {
validationFailedString += " " + constraintViolation.getMessage();
}
throw new IllegalCommandException(validationFailedString, this);
}
Iterator<DatasetField> dsfIt = edit.getDatasetFields().iterator();
while (dsfIt.hasNext()) {
if (dsfIt.next().removeBlankDatasetFieldValues()) {
dsfIt.remove();
}
}
Timestamp now = new Timestamp(new Date().getTime());
edit.setLastUpdateTime(now);
ds.setModificationTime(now);
DatasetVersion managed = ctxt.em().merge(edit);
boolean doNormalSolrDocCleanUp = true;
ctxt.index().indexDataset(managed.getDataset(), doNormalSolrDocCleanUp);
return managed;
}
}