package edu.harvard.iq.dataverse.engine.command.impl; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevel; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroup; 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; import java.util.ArrayList; /** * Deletes a {@link Dataverse} - but only if it is empty. * * @author michael */ @RequiredPermissionsMap({ @RequiredPermissions(dataverseName = "doomed", value = Permission.DeleteDataverse) }) public class DeleteDataverseCommand extends AbstractVoidCommand { private final Dataverse doomed; public DeleteDataverseCommand(DataverseRequest aRequest, Dataverse aDoomedDataverse) { super(aRequest, dv("doomed", aDoomedDataverse), dv("owner", aDoomedDataverse.getOwner())); doomed = aDoomedDataverse; } @Override protected void executeImpl(CommandContext ctxt) throws CommandException { // Make sure we don't delete root if (doomed.getOwner() == null) { throw new IllegalCommandException("Cannot delete the root dataverse", this); } // make sure the dataverse is emptyw if (ctxt.dvObjects().hasData(doomed)) { throw new IllegalCommandException("Cannot delete non-empty dataverses", this); } // if we got here, we can delete // Metadata blocks - cant delete metadatablocks /* Don't seem to need to do this SEK 10/23/14 for (MetadataBlock block : doomed.getMetadataBlocks(true) ) { MetadataBlock merged = ctxt.em().merge(block); ctxt.em().remove(merged); } */ // ASSIGNMENTS for ( RoleAssignment ra : ctxt.roles().directRoleAssignments(doomed) ) { ctxt.em().remove(ra); } // ROLES for ( DataverseRole ra : ctxt.roles().findByOwnerId(doomed.getId()) ) { ctxt.em().remove(ra); } // EXPLICIT GROUPS for ( ExplicitGroup eg : ctxt.em().createNamedQuery("ExplicitGroup.findByOwnerId", ExplicitGroup.class) .setParameter("ownerId", doomed.getId()) .getResultList() ) { ctxt.explicitGroups().removeGroup(eg); } // FACETS handled with cascade on dataverse // Input Level for (DataverseFieldTypeInputLevel inputLevel : doomed.getDataverseFieldTypeInputLevels()) { DataverseFieldTypeInputLevel merged = ctxt.em().merge(inputLevel); ctxt.em().remove(merged); } doomed.setDataverseFieldTypeInputLevels(new ArrayList()); // DATAVERSE Dataverse doomedAndMerged = ctxt.em().merge(doomed); ctxt.em().remove(doomedAndMerged); // Remove from index ctxt.index().delete(doomed); } }