package edu.harvard.iq.dataverse.engine.command; import edu.harvard.iq.dataverse.authorization.Permission; import java.util.*; /** * Helper object for the Command class. In java8, these will probably * be static methods in the {@link Command} interface. * @author michael */ public class CommandHelper { public static final CommandHelper CH = new CommandHelper(); /** * Given a {@link Command} sub-class, returns the set of permissions needed to be able to execute it. * Needed permissions are specified by annotating the command's class with * the {@link RequiredPermissions} annotation. * * @param cmdClass A class of command * @return Set of permissions, or {@code null} if the command's class was not annotated. */ public Map<String,Set<Permission>> permissionsRequired( Class<? extends Command> cmdClass ) { RequiredPermissions requiredPerms = cmdClass.getAnnotation(RequiredPermissions.class); if ( requiredPerms == null ) { // try for the permission map RequiredPermissionsMap reqPermMap = cmdClass.getAnnotation( RequiredPermissionsMap.class ); if ( reqPermMap == null ) { // No annotations here. Look up the class hierachy Class superClass = cmdClass.getSuperclass(); if ( superClass != null ) { return permissionsRequired(superClass); } else { throw new IllegalArgumentException("Command class " + cmdClass.getCanonicalName() + ", and its superclasses, do not declare required permissions."); } } Map<String, Set<Permission>> retVal = new TreeMap<>(); for ( RequiredPermissions rp : reqPermMap.value() ) { retVal.put( rp.dataverseName(), asPermissionSet(rp.value()) ); } return retVal; } else { Permission[] required = requiredPerms.value(); return Collections.singletonMap(requiredPerms.dataverseName(), asPermissionSet(required) ); } } /** * Given a command, returns the set of permissions needed to be able to execute it. * Needed permissions are specified by annotating the command's class with * the {@link RequiredPermissions} annotation. * * @param c The command * @return Set of permissions, or {@code null} if the command's class was not annotated. */ public Map<String,Set<Permission>> permissionsRequired( Command c ) { return permissionsRequired(c.getClass()); } private Set<Permission> asPermissionSet( Permission[] permissionArray ) { return (permissionArray.length==0) ? EnumSet.noneOf(Permission.class) : (permissionArray.length==1) ? EnumSet.of(permissionArray[0]) : EnumSet.of(permissionArray[0], permissionArray); } }