/*
* 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.DvObject;
import edu.harvard.iq.dataverse.authorization.Permission;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.authorization.users.User;
import edu.harvard.iq.dataverse.engine.command.AbstractVoidCommand;
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.PermissionException;
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.ResourceBundle;
/**
*
* @author skraffmi
*/
@RequiredPermissions(Permission.EditDataset)
public class UpdateDatasetTargetURLCommand extends AbstractVoidCommand {
private final Dataset target;
public UpdateDatasetTargetURLCommand( Dataset target, DataverseRequest aRequest) {
super(aRequest, target);
this.target = target;
}
@Override
protected void executeImpl(CommandContext ctxt) throws CommandException {
if (!(getUser() instanceof AuthenticatedUser) || !getUser().isSuperuser()) {
throw new PermissionException("Update Target URL can only be called by superusers.",
this, Collections.singleton(Permission.EditDataset), target);
}
if (target.getProtocol().equals("doi")) {
String nonNullDefaultIfKeyNotFound = "";
String doiProvider = ctxt.settings().getValueForKey(SettingsServiceBean.Key.DoiProvider, nonNullDefaultIfKeyNotFound);
if (doiProvider.equals("EZID")) {
HashMap<String, String> metadata = ctxt.doiEZId().getMetadataFromDatasetForTargetURL(target);
String doiRetString = ctxt.doiEZId().modifyIdentifier(target, metadata);
if (doiRetString != null && doiRetString.contains(target.getIdentifier())) {
target.setGlobalIdCreateTime(new Timestamp(new Date().getTime()));
ctxt.em().merge(target);
ctxt.em().flush();
} else {
//do nothing - we'll know it failed because the global id create time won't have been updated.
}
}
if (doiProvider.equals("DataCite")) {
HashMap<String, String> metadata = ctxt.doiDataCite().getMetadataFromDatasetForTargetURL(target);
try {
String doiRetString = ctxt.doiDataCite().modifyIdentifier(target, metadata);
if (doiRetString != null && doiRetString.contains(target.getIdentifier())) {
target.setGlobalIdCreateTime(new Timestamp(new Date().getTime()));
ctxt.em().merge(target);
ctxt.em().flush();
} else {
//do nothing - we'll know it failed because the global id create time won't have been updated.
}
} catch (Exception e) {
//do nothing - we'll know it failed because the global id create time won't have been updated.
}
}
} else if ("hdl".equals(target.getProtocol())) {
// TODO:
// handlenet registration still needs diagnostics!
// -- L.A. 4.0
ctxt.handleNet().reRegisterHandle(target);
target.setGlobalIdCreateTime(new Timestamp(new Date().getTime()));
ctxt.em().merge(target);
ctxt.em().flush();
} else {
// TODO why not throw an IllegalCommandException?
throw new UnsupportedOperationException("UpdateDatasetTargetURLCommand only supported for doi protocol."); //To change body of generated methods, choose Tools | Templates.
}
}
}