/*
* AuthorizationMain.java
*
* Version: $Revision: 3705 $
*
* Date: $Date: 2009-04-11 17:02:24 +0000 (Sat, 11 Apr 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.authorization;
import java.sql.SQLException;
import java.util.ArrayList;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.Item;
import org.dspace.app.xmlui.wing.element.List;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.app.xmlui.wing.element.Radio;
import org.dspace.app.xmlui.wing.element.Row;
import org.dspace.app.xmlui.wing.element.Select;
import org.dspace.app.xmlui.wing.element.Table;
import org.dspace.app.xmlui.wing.element.Text;
import org.dspace.authorize.AuthorizeManager;
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.core.Constants;
import org.dspace.eperson.Group;
/**
* @author Alexey Maslov
*/
public class EditPolicyForm extends AbstractDSpaceTransformer
{
private static final Message T_title =
message("xmlui.administrative.authorization.EditPolicyForm.title");
private static final Message T_trail =
message("xmlui.administrative.authorization.EditPolicyForm.trail");
private static final Message T_authorize_trail =
message("xmlui.administrative.authorization.general.authorize_trail");
private static final Message T_policyList_trail =
message("xmlui.administrative.authorization.general.policyList_trail");
private static final Message T_main_head_new =
message("xmlui.administrative.authorization.EditPolicyForm.main_head_new");
private static final Message T_main_head_edit =
message("xmlui.administrative.authorization.EditPolicyForm.main_head_edit");
private static final Message T_error_no_group =
message("xmlui.administrative.authorization.EditPolicyForm.error_no_group");
private static final Message T_error_no_action =
message("xmlui.administrative.authorization.EditPolicyForm.error_no_action");
private static final Message T_no_results =
message("xmlui.administrative.group.EditGroupForm.no_results");
private static final Message T_groups_column1 =
message("xmlui.administrative.authorization.EditPolicyForm.groups_column1");
private static final Message T_groups_column2 =
message("xmlui.administrative.authorization.EditPolicyForm.groups_column2");
private static final Message T_groups_column3 =
message("xmlui.administrative.authorization.EditPolicyForm.groups_column3");
private static final Message T_groups_column4 =
message("xmlui.administrative.authorization.EditPolicyForm.groups_column4");
private static final Message T_submit_save =
message("xmlui.general.save");
private static final Message T_submit_cancel =
message("xmlui.general.cancel");
private static final Message T_set_group =
message("xmlui.administrative.authorization.EditPolicyForm.set_group");
private static final Message T_current_group =
message("xmlui.administrative.authorization.EditPolicyForm.current_group");
private static final Message T_groups_head =
message("xmlui.administrative.authorization.EditPolicyForm.groups_head");
private static final Message T_policy_currentGroup =
message("xmlui.administrative.authorization.EditPolicyForm.policy_currentGroup");
private static final Message T_label_search =
message("xmlui.administrative.authorization.EditPolicyForm.label_search");
private static final Message T_submit_search_groups =
message("xmlui.administrative.authorization.EditPolicyForm.submit_search_groups");
private static final Message T_label_action =
message("xmlui.administrative.authorization.EditPolicyForm.label_action");
private static final Message T_dspace_home =
message("xmlui.general.dspace_home");
// How many search results are displayed at once
private static final int RESULTS_PER_PAGE = 10;
public void addPageMeta(PageMeta pageMeta) throws WingException
{
pageMeta.addMetadata("title").addContent(T_title);
pageMeta.addTrailLink(contextPath + "/", T_dspace_home);
pageMeta.addTrailLink(contextPath + "/admin/authorize", T_authorize_trail);
pageMeta.addTrail().addContent(T_policyList_trail);
pageMeta.addTrail().addContent(T_trail);
}
public void addBody(Body body) throws WingException, SQLException
{
/* Get and setup our parameters. We should always have an objectType and objectID, since every policy
* has to have a parent resource. policyID may, however, be -1 for new, not-yet-created policies and
* the groupID is only set if the group is being changed. */
int objectType = parameters.getParameterAsInteger("objectType",-1);
int objectID = parameters.getParameterAsInteger("objectID",-1);
int policyID = parameters.getParameterAsInteger("policyID",-1);
int groupID = parameters.getParameterAsInteger("groupID",-1);
int actionID = parameters.getParameterAsInteger("actionID",-1);
int page = parameters.getParameterAsInteger("page",0);
String query = URLDecode(parameters.getParameter("query","-1"));
// The current policy, if it exists (i.e. we are not creating a new one)
ResourcePolicy policy = ResourcePolicy.find(context, policyID);
// The currently set group; it's value depends on wether previously clicked the "Set" button to change
// the associated group, came here to edit an existing group, or create a new one.
Group currentGroup;
if (groupID != -1) {
currentGroup = Group.find(context, groupID);
}
else if (policy != null) {
currentGroup = policy.getGroup();
}
else currentGroup = null;
// Same for the current action; it can either blank (-1), manually set, or inherited from the current policy
if (policy != null && actionID == -1)
actionID = policy.getAction();
String errorString = parameters.getParameter("errors",null);
ArrayList<String> errors = new ArrayList<String>();
if (errorString != null)
{
for (String error : errorString.split(","))
errors.add(error);
}
/* Set up our current Dspace object */
DSpaceObject dso;
switch (objectType) {
case Constants.COMMUNITY: dso = Community.find(context, objectID); break;
case Constants.COLLECTION: dso = Collection.find(context, objectID); break;
case Constants.ITEM: dso = org.dspace.content.Item.find(context, objectID); break;
case Constants.BUNDLE: dso = Bundle.find(context, objectID); break;
case Constants.BITSTREAM: dso = Bitstream.find(context, objectID); break;
default: dso = null;
}
// DIVISION: edit-container-policies
Division main = body.addInteractiveDivision("edit-policy",contextPath+"/admin/authorize",Division.METHOD_POST,"primary administrative authorization");
if (policyID >= 0) {
objectID = policy.getResourceID();
objectType = policy.getResourceType();
main.setHead(T_main_head_edit.parameterize(policyID,Constants.typeText[objectType],objectID));
}
else
main.setHead(T_main_head_new.parameterize(Constants.typeText[objectType],objectID));
int resourceRelevance = 1 << objectType;
// DIVISION: authorization-actions
Division actions = main.addDivision("edit-policy-actions");
List actionsList = actions.addList("actions","form");
// actions radio buttons
actionsList.addLabel(T_label_action);
Item actionSelectItem = actionsList.addItem();
Radio actionSelect = actionSelectItem.addRadio("action_id");
actionSelect.setLabel(T_label_action);
//Select actionSelect = actionSelectItem.addSelect("action_id");
//actionsBox.addContent(T_label_action);
//Select actionSelect = actionsBox.addSelect("action_id");
for( int i = 0; i < Constants.actionText.length; i++ )
{
// only display if action i is relevant
// to resource type resourceRelevance
if( (Constants.actionTypeRelevance[i] & resourceRelevance) > 0)
{
if (actionID == i)
actionSelect.addOption(true, i, Constants.actionText[i]);
else
actionSelect.addOption(i, Constants.actionText[i]);
}
}
if (errors.contains("action_id"))
actionSelect.addError(T_error_no_action);
// currently set group
actionsList.addLabel(T_policy_currentGroup);
Select groupSelect = actionsList.addItem().addSelect("group_id");
groupSelect.setSize(5);
for (Group group : Group.findAll(context, Group.NAME))
{
if (group == currentGroup)
groupSelect.addOption(true, group.getID(), group.getName());
else
groupSelect.addOption(group.getID(), group.getName());
}
if (errors.contains("group_id"))
groupSelect.addError(T_error_no_group);
// the search function
actionsList.addLabel(T_label_search);
Item searchItem = actionsList.addItem();
Text searchText = searchItem.addText("query");
if (!query.equals(new String("-1")))
searchText.setValue(query);
searchItem.addButton("submit_search_groups").setValue(T_submit_search_groups);
actionsList.addLabel();
Item buttons = actionsList.addItem();
buttons.addButton("submit_save").setValue(T_submit_save);
buttons.addButton("submit_cancel").setValue(T_submit_cancel);
// Display the search results table
if (!query.equals(new String("-1"))) {
Division groupsList = main.addDivision("edit-policy-groupsList");
groupsList.setHead(T_groups_head);
this.addGroupSearch(groupsList, currentGroup, dso, query, page);
}
main.addHidden("administrative-continue").setValue(knot.getId());
}
/**
* Search for groups to add to this group.
*/
private void addGroupSearch(Division div, Group sourceGroup, DSpaceObject dso, String query, int page) throws WingException, SQLException
{
Group[] groups = Group.search(context, query, page*RESULTS_PER_PAGE, (page+1)*RESULTS_PER_PAGE);
int totalResults = Group.searchResultCount(context, query);
ArrayList<ResourcePolicy> otherPolicies = (ArrayList<ResourcePolicy>)AuthorizeManager.getPolicies(context, dso);
if (totalResults > RESULTS_PER_PAGE) {
int firstIndex = page*RESULTS_PER_PAGE+1;
int lastIndex = page*RESULTS_PER_PAGE + groups.length;
String baseURL = contextPath+"/admin/authorize?administrative-continue="+knot.getId();
String nextURL = null, prevURL = null;
if (page < ((totalResults - 1) / RESULTS_PER_PAGE))
nextURL = baseURL+"&page="+(page+1);
if (page > 0)
prevURL = baseURL+"&page="+(page-1);
div.setSimplePagination(totalResults,firstIndex,lastIndex,prevURL, nextURL);
}
Table table = div.addTable("policy-edit-search-group",groups.length + 1, 1);
Row header = table.addRow(Row.ROLE_HEADER);
// Add the header row
header = table.addRow(Row.ROLE_HEADER);
header.addCell().addContent(T_groups_column1);
header.addCell().addContent(T_groups_column2);
header.addCell().addContent(T_groups_column3);
header.addCell().addContent(T_groups_column4);
// The rows of search results
for (Group group : groups)
{
String groupID = String.valueOf(group.getID());
String name = group.getName();
url = contextPath+"/admin/groups?administrative-continue="+knot.getId()+"&submit_edit_group&group_id="+groupID;
Row row = table.addRow();
row.addCell().addContent(groupID);
row.addCell().addXref(url,name);
// Iterate other other polices of our parent resource to see if any match the currently selected group
String otherAuthorizations = new String();
int groupsMatched = 0;
for (ResourcePolicy otherPolicy : otherPolicies) {
if (otherPolicy.getGroup() == group) {
otherAuthorizations += otherPolicy.getActionText() + ", ";
groupsMatched++;
}
}
if (groupsMatched > 0) {
row.addCell().addContent(otherAuthorizations.substring(0,otherAuthorizations.lastIndexOf(", ")));
}
else
row.addCell().addContent("-");
if (group != sourceGroup)
row.addCell().addButton("submit_group_id_"+groupID).setValue(T_set_group);
else
row.addCell().addContent(T_current_group);
}
if (groups.length <= 0) {
table.addRow().addCell(1, 4).addContent(T_no_results);
}
}
}