Package org.dspace.app.xmlui.aspect.administrative

Source Code of org.dspace.app.xmlui.aspect.administrative.FlowAuthorizationUtils

/*
* FlowAuthorizationUtils.java
*
* Version: $Revision: 4309 $
*
* Date: $Date: 2009-09-30 19:20:07 +0000 (Wed, 30 Sep 2009) $
*
* Copyright (c) 2002, Hewlett-Packard Company and Massachusetts
* Institute of Technology.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of the Hewlett-Packard Company nor the name of the
* Massachusetts Institute of Technology nor the names of their
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/

package org.dspace.app.xmlui.aspect.administrative;

import java.sql.SQLException;
import java.util.List;

import org.dspace.app.util.AuthorizeUtil;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.AuthorizeManager;
import org.dspace.authorize.PolicySet;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.dspace.eperson.Group;
import org.dspace.handle.HandleManager;

import org.dspace.core.Constants;



/**
*
* FIXME: add documentation
*
* @author Alexey maslov
*/
public class FlowAuthorizationUtils {

  /** Language Strings */
  //example language string
//  private static final Message T_add_eperson_success_notice =
//    new Message("default","xmlui.administrative.FlowUtils.add-eperson-success-notice");
 
 
  /**
   * Resolve an identifier submitted into the item lookup box. If it contains a slash, it's assumed to be a
   * handle and is resolved by that mechanism into an item, collection or community. Otherwise, it's assumed
   * to be an item and looked up by ID.
   *
   * @param context The current DSpace context.
   * @param identifier The identifier that is to be resolved.
   * @return A process result's object.
   */
  public static FlowResult resolveItemIdentifier(Context context, String identifier) throws SQLException
  {
    FlowResult result = new FlowResult();
    result.setContinue(false);
    //Check whether it's a handle or internal id (by check ing if it has a slash in the string)
    if (identifier.contains("/")) {
      DSpaceObject dso = HandleManager.resolveToObject(context, identifier);
     
      if (dso != null && dso.getType() == Constants.ITEM) {
        result.setParameter("itemID", dso.getID());
        result.setParameter("type", Constants.ITEM);
        result.setContinue(true);
        return result;
      }
      else if (dso != null && dso.getType() == Constants.COLLECTION) {
        result.setParameter("collectionID", dso.getID());
        result.setParameter("type", Constants.COLLECTION);
        result.setContinue(true);
        return result;
      }
      else if (dso != null && dso.getType() == Constants.COMMUNITY) {
        result.setParameter("communityID", dso.getID());
        result.setParameter("type", Constants.COMMUNITY);
        result.setContinue(true);
        return result;
      }
    }
    // Otherwise, it's assumed to be a DSpace Item
    else {
      Item item = null;
      try {
        item = Item.find(context, Integer.valueOf(identifier));
      } catch (NumberFormatException e) {
        // ignoring the exception in case of a malformed input string
      }
     
      if (item != null) {
        result.setParameter("itemID", item.getID());
        result.setParameter("type", Constants.ITEM);
        result.setContinue(true);
        return result;
      }
    }
   
    result.addError("identifier");
    return result; 
  }
 
 
  /**
   * Process the editing of an existing or a newly created policy.
   *
   * @param context The current DSpace context.
   * @param objectType The type of the policy's parent object (ITEM, COLLECTION, COMMUNITY)
   * @param objectID The ID of the policy's parent object
   * @param policyID The ID of the policy being edited (-1 if a new policy is being created)
   * @param groupID The ID of the group to be associated with this policy
   * @param actionID The ID of the action (dependent on the objectType) to be associated with this policy
   * @return A process result's object.
   */
  public static FlowResult processEditPolicy(Context context, int objectType, int objectID, int policyID, int groupID, int actionID) throws SQLException, AuthorizeException
  {
    FlowResult result = new FlowResult();
    boolean added = false;
 
    ResourcePolicy policy = ResourcePolicy.find(context, policyID);
   
    // check authorization to edit an existent policy
    if (policy != null)
    {
        AuthorizeUtil.authorizeManagePolicy(context, policy);
    }
   
    /* First and foremost, if no group or action was selected, throw an error back to the user */
    if (actionID == -1) {
      result.setContinue(false);
      result.addError("action_id");
      return result;
    }
    if (groupID == -1) {
      result.setContinue(false);
      result.addError("group_id");
      return result;
   
   
    /* If the policy doesn't exist, cretae a new one and set its parent resource */
    DSpaceObject policyParent = null;
    if (policy == null)
    {
      switch (objectType) {
      case Constants.COMMUNITY:
          {
              policyParent = Community.find(context, objectID);
              AuthorizeUtil.authorizeManageCommunityPolicy(context, (Community)policyParent);
              break;
          }
      case Constants.COLLECTION:
            {
              policyParent = Collection.find(context, objectID);
              AuthorizeUtil.authorizeManageCollectionPolicy(context, (Collection)policyParent);       
              break;
            }
      case Constants.ITEM:
            {
              policyParent = Item.find(context, objectID);
              AuthorizeUtil.authorizeManageItemPolicy(context, (Item) policyParent);
              break;
            }
      case Constants.BUNDLE:
            {
              policyParent = Bundle.find(context, objectID);
              AuthorizeUtil.authorizeManageItemPolicy(context, (Item) (policyParent.getParentObject()));
              break;
            }
      case Constants.BITSTREAM:
            {
              policyParent = Bitstream.find(context, objectID);
              AuthorizeUtil
                        .authorizeManageItemPolicy(context, (Item) (policyParent
                                .getParentObject()));
              break;
            }
      }
      policy = ResourcePolicy.create(context);
      policy.setResource(policyParent);
      added = true;
    }
   
      Group group = Group.find(context, groupID);
     
      //  modify the policy
      policy.setAction(actionID);
      policy.setGroup(group);
       
      // propagate the changes to the logo, which is treated on the same level as the parent object
      Bitstream logo = null;
      DSpaceObject logoContainer = null;
      if (objectType == Constants.COLLECTION)
      {
        logoContainer = Collection.find(context, objectID);
          logo = ((Collection)logoContainer).getLogo();
      }
      else if (objectType == Constants.COMMUNITY)
      {
        logoContainer = Community.find(context, objectID);
          logo = ((Community)logoContainer).getLogo();
      }
     
      if (logo != null)
      {
          List policySet = AuthorizeManager.getPolicies(context, logoContainer);
          AuthorizeManager.removeAllPolicies(context, logo);
          AuthorizeManager.addPolicies(context, policySet, logo);
      }
     
      // Perform the update action
      policy.update();
      context.commit();
     
      result.setContinue(true);
      result.setOutcome(true);
      if (added) result.setMessage(new Message("default","A new policy was created successfully"));
      else result.setMessage(new Message("default","The policy was edited successfully"));
     
      result.setParameter("policyID", policy.getID());
     
    return result;
  }
 
 
  /**
   * Delete the policies specified by the policyIDs parameter. This assumes that the
   * deletion has been confirmed.
   *
   * @param context The current DSpace context
   * @param policyIDs The unique ids of the policies being deleted.
   * @return A process result's object.  
   */
  public static FlowResult processDeletePolicies(Context context, String[] policyIDs) throws NumberFormatException, SQLException, AuthorizeException
  {
    FlowResult result = new FlowResult();
 
    for (String id : policyIDs)
    {
      ResourcePolicy policyDeleted = ResourcePolicy.find(context, Integer.valueOf(id));
      // check authorization
      AuthorizeUtil.authorizeManagePolicy(context, policyDeleted);
      policyDeleted.delete();
      }
 
    result.setContinue(true);
    result.setOutcome(true);
    result.setMessage(new Message("default","The policies were deleted successfully"));
   
    return result;
  }
 
 
  /**
   * Process addition of a several authorizations at once, as entered in the wildcard/advanced authorizations tool
   *
   * @param context The current DSpace context.
   * @param groupIDs The IDs of the groups to be associated with the newly created policies
   * @param actionID The ID of the action to be associated with the policies
   * @param resourceID Whether the policies will apply to Items or Bitstreams
   * @param collectionIDs The IDs of the collections that the policies will be applied to
   * @return A process result's object.
   */
  public static FlowResult processAdvancedPolicyAdd(Context context, String[] groupIDs, int actionID,
      int resourceID, String [] collectionIDs) throws NumberFormatException, SQLException, AuthorizeException
  {
      AuthorizeUtil.requireAdminRole(context);
    FlowResult result = new FlowResult();
   
    for (String groupID : groupIDs)
    {
      for (String collectionID : collectionIDs)
      {
        PolicySet.setPolicies(context, Constants.COLLECTION, Integer.valueOf(collectionID),
                  resourceID, actionID, Integer.valueOf(groupID), false, false);
       
        // if it's a bitstream, do it to the bundle too
          if (resourceID == Constants.BITSTREAM)
          {
            PolicySet.setPolicies(context, Constants.COLLECTION, Integer.valueOf(collectionID),
                Constants.BUNDLE, actionID, Integer.valueOf(groupID), false, false);
          }
      }
      } 
   
    result.setContinue(true);
    result.setOutcome(true);
    result.setMessage(new Message("default","The policies were added successfully!"));
   
    return result;
  }
 
  /**
   * Process the deletion of all authorizations across a set of collections, regardless of associated
   * actions or groups. This functionality should probably not be used, ever, unless the goal to
   * completely reset a collection for one reason or another.
   *
   * @param context The current DSpace context.
   * @param resourceID Whether the policies will apply to Items or Bitstreams
   * @param collectionIDs The IDs of the collections that the policy wipe will be applied to
   * @return A process result's object.
   */
  public static FlowResult processAdvancedPolicyDelete(Context context, int resourceID, String [] collectionIDs)
      throws NumberFormatException, SQLException, AuthorizeException
  {
      AuthorizeUtil.requireAdminRole(context);
    FlowResult result = new FlowResult();
   
    for (String collectionID : collectionIDs)
    {
      PolicySet.setPolicies(context, Constants.COLLECTION, Integer.valueOf(collectionID),
                resourceID, 0, 0, false, true);
     
      // if it's a bitstream, do it to the bundle too
        if (resourceID == Constants.BITSTREAM)
        {
          PolicySet.setPolicies(context, Constants.COLLECTION, Integer.valueOf(collectionID),
              Constants.BUNDLE, 0, 0, false, true);
        }
    }
   
    result.setContinue(true);
    result.setOutcome(true);
    result.setMessage(new Message("default","The policies for the selected collections were cleared."));
   
    return result;
  }

}
TOP

Related Classes of org.dspace.app.xmlui.aspect.administrative.FlowAuthorizationUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.