package edu.harvard.iq.dataverse.engine.command.impl;
import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.authorization.Permission;
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.RequiredPermissionsMap;
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
/**
* A command to move a {@link Dataverse} between two {@link Dataverse}s.
* @author michael
*/
//@todo We will need to revist the permissions for move, once we add this
//(will probably need different move commands for unplublished which checks add,
//versus published which checks publish
@RequiredPermissionsMap({
@RequiredPermissions( dataverseName = "moved", value = {Permission.ManageDataversePermissions, Permission.EditDataverse} ),
@RequiredPermissions( dataverseName = "source", value = Permission.DeleteDataverse ),
@RequiredPermissions( dataverseName = "destination", value = Permission.AddDataverse )
})
public class MoveDataverseCommand extends AbstractVoidCommand {
final Dataverse moved;
final Dataverse destination;
public MoveDataverseCommand( DataverseRequest aRequest, Dataverse moved, Dataverse destination ) {
super(aRequest, dv("moved", moved),
dv("source",moved.getOwner()),
dv("destination",destination) );
this.moved = moved;
this.destination = destination;
}
@Override
public void executeImpl(CommandContext ctxt) throws CommandException {
// NOTE placeholder, more logic due
// validate the move makes sense
if ( destination.getOwners().contains(moved) ) {
throw new IllegalCommandException("Can't move a dataverse to its descendant", this);
}
// OK, move
moved.setOwner(destination);
ctxt.dataverses().save(moved);
}
}