package edu.harvard.iq.dataverse.engine.command;
import edu.harvard.iq.dataverse.DvObject;
import edu.harvard.iq.dataverse.authorization.Permission;
import edu.harvard.iq.dataverse.authorization.users.User;
import static edu.harvard.iq.dataverse.engine.command.CommandHelper.CH;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Convenience class for implementing the {@link Command} interface.
*
* @author michael
* @param <R> The result type of the command.
*/
public abstract class AbstractCommand<R> implements Command<R> {
private final Map<String, DvObject> affectedDataverses;
private final DataverseRequest request;
static protected class DvNamePair {
final String name;
final DvObject dvObject;
public DvNamePair(String name, DvObject dv) {
this.name = name;
this.dvObject = dv;
}
}
/**
* Convenience method to name affected dataverses.
*
* @param s the name
* @param d the dataverse
* @return the named pair
*/
protected static DvNamePair dv(String s, DvObject d) {
return new DvNamePair(s, d);
}
public AbstractCommand(DataverseRequest aRequest, DvObject anAffectedDvObject) {
this(aRequest, dv("", anAffectedDvObject));
}
public AbstractCommand(DataverseRequest aRequest, DvNamePair dvp, DvNamePair... more) {
request = aRequest;
affectedDataverses = new HashMap<>();
affectedDataverses.put(dvp.name, dvp.dvObject);
for (DvNamePair p : more) {
affectedDataverses.put(p.name, p.dvObject);
}
}
public AbstractCommand(DataverseRequest aRequest, Map<String, DvObject> someAffectedDvObjects) {
request = aRequest;
affectedDataverses = someAffectedDvObjects;
}
@Override
public Map<String, DvObject> getAffectedDvObjects() {
return affectedDataverses;
}
@Override
public DataverseRequest getRequest() {
return request;
}
@Override
public Map<String, Set<Permission>> getRequiredPermissions() {
return CH.permissionsRequired(getClass());
}
/**
* Convenience method for getting the user requesting this command.
* @return the user issuing the command (via the {@link DataverseRequest}).
*/
protected User getUser() {
return getRequest().getUser();
}
}