String name, String description, String startDateParam, String endDateParam) 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;
}
// check dates
Date startDate = null;
Date endDate = null;
// 05/01/2012 valid date
if(StringUtils.isNotBlank(startDateParam)){
try {
startDate = DateUtils.parseDate(startDateParam, new String[]{"yyyy-MM-dd", "yyyy-MM", "yyyy"});
} catch (ParseException e) {
startDate = null;
}
if(startDate==null){
result.setContinue(false);
result.addError("startDate");
return result;
}
}
if(StringUtils.isNotBlank(endDateParam)){
try {
endDate = DateUtils.parseDate(endDateParam, new String[]{"yyyy-MM-dd", "yyyy-MM", "yyyy"});
} catch (ParseException e) {
endDate = null;
}
if(endDate==null){
result.setContinue(false);
result.addError("endDate");
return result;
}
}
if(endDate!=null && startDate!=null){
if(startDate.after(endDate)){
result.setContinue(false);
result.addError("startDateGreaterThenEndDate");
return result;
}
}
// end check dates
// check if a similar policy is already in place
if(policy==null){
if(AuthorizeManager.isAnIdenticalPolicyAlreadyInPlace(context, objectType, objectID, groupID, actionID, -1)){
result.setContinue(false);
result.addError("duplicatedPolicy");
return result;
}
}
else{
if(AuthorizeManager.isAnIdenticalPolicyAlreadyInPlace(context, objectType, objectID, groupID, actionID, policy.getID())){
result.setContinue(false);
result.addError("duplicatedPolicy");
return result;
}
}
/* If the policy doesn't exist, create 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);
policy.setRpType(ResourcePolicy.TYPE_CUSTOM);
added = true;
}
Group group = Group.find(context, groupID);
// modify the policy
policy.setAction(actionID);
policy.setGroup(group);
policy.setRpName(name);
policy.setRpDescription(description);
if(endDate!=null) policy.setEndDate(endDate);
else policy.setEndDate(null);
if(startDate!=null) policy.setStartDate(startDate);
else policy.setStartDate(null);
// 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;
}