package edu.harvard.iq.dataverse.engine.command.impl;
import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.MetadataBlock;
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.exception.CommandException;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
/**
* Commands for setting the metadata blocks a dataverse uses.
* @author michael
*/
@RequiredPermissions( Permission.EditDataverse )
public abstract class UpdateDataverseMetadataBlocksCommand extends AbstractVoidCommand {
final Dataverse updatedDv;
public UpdateDataverseMetadataBlocksCommand(DataverseRequest aRequest, Dataverse anAffectedDataverse) {
super(aRequest, anAffectedDataverse);
updatedDv = anAffectedDataverse;
}
public static class SetRoot extends UpdateDataverseMetadataBlocksCommand {
private final boolean isRoot;
public SetRoot(DataverseRequest aRequest, Dataverse anAffectedDataverse, boolean shouldBeRoot) {
super(aRequest, anAffectedDataverse);
isRoot = shouldBeRoot;
}
@Override
protected void executeImpl(CommandContext ctxt) throws CommandException {
updatedDv.setMetadataBlockRoot(isRoot);
ctxt.em().merge(updatedDv);
}
}
public static class SetBlocks extends UpdateDataverseMetadataBlocksCommand {
private final List<MetadataBlock> blocks;
public SetBlocks(DataverseRequest aRequest, Dataverse anAffectedDataverse, List<MetadataBlock> someBlocks) {
super(aRequest, anAffectedDataverse);
blocks = someBlocks;
}
@Override
protected void executeImpl(CommandContext ctxt) throws CommandException {
ctxt.engine().submit( new UpdateDataverseMetadataBlocksCommand.SetRoot(getRequest(), updatedDv, true) );
// We filter the list through a set, so that all blocks are distinct.
updatedDv.setMetadataBlocks(new LinkedList<>(new HashSet<>(blocks)));
ctxt.em().merge(updatedDv);
}
}
}