8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: Rule.java,v 1.8 2009/11/13 23:52:20 asyhuang Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
0c9594d96d580b0cba488fa7d01802fbb49d8a3eCraig McDonnell * Portions Copyrighted 2011-2014 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.policy;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport com.iplanet.sso.SSOException;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport com.sun.identity.shared.xml.XMLUtils;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport org.w3c.dom.Node;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport java.util.HashSet;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport java.util.Map;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport java.util.Set;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport java.util.HashMap;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamfordimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The class <code>Rule</code> provides interfaces to manage
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * a rule that can be added to a policy.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * A rule constains the rule name, service type,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * a resource and a map containing action names and action values.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
0c9594d96d580b0cba488fa7d01802fbb49d8a3eCraig McDonnell * @deprecated since 12.0.0
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
0c9594d96d580b0cba488fa7d01802fbb49d8a3eCraig McDonnell@Deprecated
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class Rule extends Object implements Cloneable {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford /** Empty resource name. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static final String EMPTY_RESOURCE_NAME = "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Name of the rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String ruleName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Service type
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String serviceTypeName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ServiceType serviceType;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford // Resource for which the rule applies.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> resourceNames = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String applicationName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Actions allowed on the resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Map actions;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * Contruct a <code>Rule</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected Rule() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructor to create a rule object with the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service name, resource name and actions. The actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * provided as a <code>Map</code> must have the action
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * name as key and a <code>Set</code> of <code>String</code>s
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * as its value. The action names and action values must
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * conform to the schema specified for the service.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Otherwise, <code>InvalidNameException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * </code> is thrown. The parameters <code>ruleName</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * and <code>resourceName</code> can be <code>null</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of the service type as defined by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the service schema
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName name of the resource for the service type
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actions map of action and action values for the resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @exception NameNotFoundException the service name provided does
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * not exist
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @exception InvalidNameException the resource name, action name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * or values is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Rule(String serviceName, String resourceName, Map actions) throws
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NameNotFoundException, InvalidNameException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this(null, serviceName, resourceName, actions);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructor to create a rule object with the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service name and actions. This is useful for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * services (and possibly action names) that do not have
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * resource names. The actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * provided as a <code>Map</code> must have the action
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * name as it key and a <code>Set</code> of <code>String</code>s
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * as its value. The action names and action values must
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * conform to the schema specified for the service.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Otherwise, <code>InvalidNameException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * </code> is thrown. The parameters <code>ruleName</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * and <code>resourceName</code> can be <code>null</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of the service type as defined by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the service schema
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actions map of action and action values for the resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @exception NameNotFoundException the service name provided does
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * not exist
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @exception InvalidNameException the resource name, action name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * or values is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Rule(String serviceName, Map actions) throws
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NameNotFoundException, InvalidNameException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this(null, serviceName, null, actions);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructor to create a rule object with rule name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service name, resource name and actions. The actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * provided as a <code>Map</code> must have the action
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * name as it key and a <code>Set</code> of <code>String</code>s
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * as its value. The action names and action values must
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * conform to the service schema.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Otherwise, <code>InvalidNameException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * </code> is thrown. The parameters <code>ruleName</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * and <code>resourceName</code> can be <code>null</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param ruleName name of the rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of the service type as defined by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the service schema
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName name of the resource for the service type
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actions map of action and action values for the resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @exception NameNotFoundException the service name provided does
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * not exist
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @exception InvalidNameException the resource name, action name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * or values is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Rule(String ruleName, String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resourceName, Map actions) throws
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NameNotFoundException, InvalidNameException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Rule and resource name can be null
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford this.ruleName = (ruleName != null) ? ruleName : ("rule" + ServiceTypeManager.generateRandomName());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.resourceNames = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.serviceTypeName = serviceName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((resourceName == null) || (resourceName.length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNames.add(EMPTY_RESOURCE_NAME);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName = resourceName.trim();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (PolicyManager.isMigratedToEntitlementService()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNames.add(resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Check the service type name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster checkAndSetServiceType(serviceName);
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Verify the action names
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceType.validateActionValues(actions);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.actions = new HashMap(actions);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNames.add(serviceType.canonicalize(resourceName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new InvalidNameException(pe, resourceName, 2);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford
45592298219ac1b0f4aea126fab71a247067ce9dRich Riley if (actions != null) {
45592298219ac1b0f4aea126fab71a247067ce9dRich Riley this.actions = new HashMap(actions);
45592298219ac1b0f4aea126fab71a247067ce9dRich Riley } else {
45592298219ac1b0f4aea126fab71a247067ce9dRich Riley this.actions = new HashMap();
45592298219ac1b0f4aea126fab71a247067ce9dRich Riley }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets application Name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param applicationName Application name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void setApplicationName(String applicationName) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.applicationName = applicationName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns application name.
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return application name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getApplicationName() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (applicationName == null) ? serviceTypeName : applicationName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * Constructor to create a <code>Rule</code> object from a XML Node.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param ruleNode XML node representation of <code>Rule</code>
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @throws InvalidFormatException on invalid xml
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @throws InvalidNameException thrown by called routines
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @throws NameNotFoundException thrown by called routines
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected Rule(Node ruleNode) throws InvalidFormatException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster InvalidNameException, NameNotFoundException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Make sure the node name is rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!ruleNode.getNodeName().equalsIgnoreCase(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.POLICY_RULE_NODE)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (PolicyManager.debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.debug.warning(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "invalid rule xml blob given to constructor");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw (new InvalidFormatException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "invalid_xml_rule_node", null, "", PolicyException.RULE));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get rule name, can be null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((ruleName = XMLUtils.getNodeAttributeValue(ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.NAME_ATTRIBUTE)) == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ruleName = "rule" + ServiceTypeManager.generateRandomName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get the service type name, cannot be null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node serviceNode = XMLUtils.getChildNode(ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.POLICY_RULE_SERVICE_NODE);
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford if ((serviceNode == null) || ((serviceTypeName = XMLUtils.getNodeAttributeValue(serviceNode,
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford PolicyManager.NAME_ATTRIBUTE)) == null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (PolicyManager.debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.debug.warning(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "invalid service name in rule xml blob in constructor");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford String[] objs = {((serviceTypeName == null) ? "null" : serviceTypeName)};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw (new InvalidFormatException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "invalid_xml_rule_service_name", objs,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ruleName, PolicyException.RULE));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster checkAndSetServiceType(serviceTypeName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node applicationNameNode = XMLUtils.getChildNode(ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.POLICY_RULE_APPLICATION_NAME_NODE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (applicationNameNode != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster applicationName = XMLUtils.getNodeAttributeValue(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster applicationNameNode, PolicyManager.NAME_ATTRIBUTE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNames = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNames.addAll(getResources(ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.POLICY_RULE_RESOURCE_NODE,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.isMigratedToEntitlementService()));
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> excludeResources = getResources(ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.POLICY_RULE_EXCLUDED_RESOURCE_NODE,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.isMigratedToEntitlementService());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get the actions and action values, cannot be null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNodes = XMLUtils.getChildNodes(ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.ATTR_VALUE_PAIR_NODE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actions = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (actionNodes != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator items = actionNodes.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (items.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get action name & values
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String actionName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionValues = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node node = (Node) items.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node attrNode = XMLUtils.getChildNode(node, PolicyManager.ATTR_NODE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((attrNode == null) || ((actionName = XMLUtils.getNodeAttributeValue(attrNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.NAME_ATTRIBUTE)) == null) || ((actionValues =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster XMLUtils.getAttributeValuePair(node)) == null)) {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford String[] objs = {((actionName == null) ? "null" : actionName)};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw (new InvalidFormatException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "invalid_xml_rule_action_name", objs,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ruleName, PolicyException.RULE));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actions.put(actionName, actionValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Validate the action values
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //serviceType.validateActionValues(actions);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set<String> getResources(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node ruleNode,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String childNodeName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isMigratedToEntitlementService
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) throws InvalidNameException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> container = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set children = XMLUtils.getChildNodes(ruleNode, childNodeName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((children != null) && !children.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster container = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator i = children.iterator(); i.hasNext();) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node resourceNode = (Node) i.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resourceName = XMLUtils.getNodeAttributeValue(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNode, PolicyManager.NAME_ATTRIBUTE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName = resourceName.trim();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!PolicyManager.isMigratedToEntitlementService()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName = serviceType.canonicalize(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new InvalidNameException(pe, resourceName, 2);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster container.add(resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return container;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * Sets the service type name of this object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceTypeName service type name for this object
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @exception NameNotFoundException the service type name provided does
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * not exist
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void checkAndSetServiceType(String serviceTypeName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws NameNotFoundException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Check the service type name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ServiceTypeManager stm = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster stm = ServiceTypeManager.getServiceTypeManager();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceType = stm.getServiceType(serviceTypeName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ssoe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyManager.debug.error("Unable to get admin SSO token" + ssoe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw (new NameNotFoundException(ssoe,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceTypeName, PolicyException.SERVICE));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NameNotFoundException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!PolicyManager.isMigratedToEntitlementService()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the name assigned to the rule. It could be <code>null</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if it was not constructed with a name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return rule name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getName() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ruleName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the name for the rule. If a name has already been
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * assigned, it will be replaced with the given name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param ruleName rule name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidNameException if rule name is invalid.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void setName(String ruleName) throws InvalidNameException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ruleName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.ruleName = ruleName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.ruleName = "rule" + ServiceTypeManager.generateRandomName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the service name for which the rule has been created.
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * The service name of the rule cannot be changed once the rule is
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getServiceTypeName() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (serviceTypeName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the resource name for which the rule has been created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If the service does not support resource names, the method
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * will return <code>null</code>. The resource name of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the rule cannot be changed once the rule is created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getResourceName() {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford return ((resourceNames == null) || resourceNames.isEmpty())
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford ? EMPTY_RESOURCE_NAME : resourceNames.iterator().next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the resource names for which the rule has been created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If the service does not support resource names, the method
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * will return <code>null</code>. The resource name of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the rule cannot be changed once the rule is created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set<String> getResourceNames() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceNames;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the resource names for which the rule has been created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If the service does not support resource names, the method
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * will return <code>null</code>. The resource name of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the rule cannot be changed once the rule is created.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceNames resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void setResourceNames(Set<String> resourceNames) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.resourceNames = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.resourceNames.addAll(resourceNames);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the action names that have been set for the rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The action names returned could be the same as the service's
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * action names or a subset of it.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return action names defined in this rule for the service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set getActionNames() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (new HashSet(actions.keySet()));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a set of action values that have been set for the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * specified action name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionName action name for which to compute values.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return action names defined in this rule for the service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws NameNotFoundException if actions name is not
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * found in the rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set getActionValues(String actionName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws NameNotFoundException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> answer = (Set<String>) actions.get(actionName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (answer != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set clone = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster clone.addAll(answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return clone;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a <code>Map</code> of all action names and their
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * corresponding action values that have been set in the rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The "key" of the <code>Map</code> will be the action name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * as a string, and its "value" will be a <code>Set</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * which contains the action values as strings.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return all action names and corresponding action values
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Map getActionValues() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (new HashMap(actions));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the action names and their corresponding actions values
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * (or permissions) for the resource or the service.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionValues action names and their corresponding values
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidNameException if action name is invalid.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void setActionValues(Map actionValues)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidNameException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceType.validateActionValues(actionValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actions = new HashMap(actionValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Checks if two rule objects are identical. Two rules are
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * identical only if the service name, resource name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * action name and values match.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @param obj object against which this rule object
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * will be checked for equality
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return <code>true</code> if the service type, resource, actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * and action values match, <code>false</code> otherwise.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster @Override
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean equals(Object obj) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean matched = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (obj == null || !(obj instanceof Rule)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Rule other = (Rule) obj;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (applicationName == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (other.applicationName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (!applicationName.equals(other.applicationName)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceNames == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (other.resourceNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!resourceNames.equals(other.resourceNames)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!actions.equals(other.actions)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return matched;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford /**
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * This added by when CheckStyle noticed there was an implementation of
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * equals without an implementation of hashCode - usually a recipe for
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * disaster.
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford *
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * @return the hashCode for this object
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford */
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford @Override
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford public int hashCode() {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford int result = super.hashCode();
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford if (applicationName != null) {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford result = 37 * result + applicationName.hashCode();
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford }
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford if (resourceNames != null) {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford result = 37 * result + resourceNames.hashCode();
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford }
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford if (actions != null) {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford result = 37 * result + actions.hashCode();
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford }
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford return result;
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford }
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Compares the given service and resource names with the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service and resource name specified in this rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The method returns a <code>ResourceMatch</code> object which
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * specifies if the resources match exactly, do not match, or one
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of them is a subordinate resource of the other. If the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service name does not match, the method returns <code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * NO_MATCH</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of the service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName name of the resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return returns <code>ResourceMatch</code> that
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * specifies if the service name and resource name are exact match, or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * otherwise.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public ResourceMatch isResourceMatch(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resourceName) {
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceMatch rm = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!serviceName.equalsIgnoreCase(serviceTypeName)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rm = ResourceMatch.NO_MATCH;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //rm = serviceType.compare(this.resourceName, resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String res = getResourceNames().iterator().next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rm = serviceType.compare(resourceName, res);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return rm;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns an XML string representing the rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return an XML string representing the rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String toXML() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder answer = new StringBuilder(100);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<Rule");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ruleName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(" name=\"");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(XMLUtils.escapeSpecialCharacters(ruleName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\">");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(">");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<ServiceName name=\"");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(XMLUtils.escapeSpecialCharacters(serviceTypeName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\" />");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (applicationName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(PolicyManager.POLICY_RULE_APPLICATION_NAME_NODE)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(" name=\"")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(XMLUtils.escapeSpecialCharacters(applicationName))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append("\" />");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (String resourceName : resourceNames) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<ResourceName name=\"");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster XMLUtils.escapeSpecialCharacters(resourceName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\" />");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionNames.addAll(actions.keySet());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator actionNamesIter = actionNames.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (actionNamesIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String actionName = (String) actionNamesIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<AttributeValuePair>");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<Attribute name=\"");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(XMLUtils.escapeSpecialCharacters(actionName));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\" />");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set values = (Set) actions.get(actionName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (values.size() > 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator items = values.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (items.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("<Value>");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster XMLUtils.escapeSpecialCharacters(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (String) items.next()));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("</Value>");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("</AttributeValuePair>");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.append("\n").append("</Rule>");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (answer.toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * Returns service type of this rules.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return service type of this rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected ServiceType getServiceType() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (serviceType);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns an XML respresentation of the rule with policy name to
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * use in resource index tree.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param policyName policy name to use while creating xml representation
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return an XML respresentation of the rule with policy name to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * use in resource index tree
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String toResourcesXml(String policyName) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer beginning = new StringBuffer(100);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // "<PolicyCrossReferences name=\"" + serviceTypeName +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // "\" type=\"Resources\">"
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford beginning.append("<")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_ROOT_NODE)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(" ")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_ROOT_NODE_NAME_ATTR)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("=\"")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(serviceTypeName)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("\" ")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_ROOT_NODE_TYPE_ATTR)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("=\"")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_ROOT_NODE_TYPE_ATTR_RESOURCES_VALUE)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("\">");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String normalizedResName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((resourceNames == null) || resourceNames.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster normalizedResName = ResourceManager.EMPTY_RESOURCE_NAME;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster normalizedResName = resourceNames.iterator().next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] resources = serviceType.split(normalizedResName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int n = resources.length;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder middle = new StringBuilder(100);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // "<Reference name=\"" + resources[n-1]) +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // "\"><PolicyName name=\"" + policyName +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // "\"/></Reference>"
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford middle.append("<")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_REFERENCE_NODE)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(" ")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_REFERENCE_NODE_NAME_ATTR)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("=\"")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(resources[n - 1])
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("\"><")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_POLICYNAME_NODE)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(" ")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_POLICYNAME_NODE_NAME_ATTR)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("=\"")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(policyName)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append("\"/></")
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(PolicyManager.POLICY_INDEX_REFERENCE_NODE)
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford .append(">");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tmp = middle.toString();
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford for (int i = n - 2; i >= 0; i--) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //tmp = "<Reference name=\"" + resources[i] +"\">" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // tmp + "</Reference>";
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford tmp = "<"
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + PolicyManager.POLICY_INDEX_REFERENCE_NODE
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + " "
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + PolicyManager.POLICY_INDEX_REFERENCE_NODE_NAME_ATTR
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + "=\""
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + resources[i]
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + "\">"
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + tmp
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + "</"
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + PolicyManager.POLICY_INDEX_REFERENCE_NODE
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + ">";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford return (beginning
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + tmp
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + "</"
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + PolicyManager.POLICY_INDEX_ROOT_NODE
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford + ">");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns xml string representation of the rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return xml string representation of the rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster @Override
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String toString() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (toXML());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Creates and returns a copy of this object. The returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>Rule</code> object will have the same rule
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * name, resource, service name, and actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * such that <code>x.clone().equals(x)</code> will be
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>true</code>. However <code>x.clone()</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * will not be the same as <code>x</code>, i.e.,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>x.clone() != x</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a copy of this object
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster @Override
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Object clone() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Rule answer = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer = (Rule) super.clone();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (CloneNotSupportedException se) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer = new Rule();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.ruleName = ruleName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.serviceTypeName = serviceTypeName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.applicationName = applicationName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.serviceType = serviceType;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.resourceNames = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.resourceNames.addAll(resourceNames);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Copy the actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.actions = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator items = actions.keySet().iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (items.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object o = items.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set set = (Set) actions.get(o);
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford HashSet aSet = new HashSet();
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford aSet.addAll(set);
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford answer.actions.put(o, aSet);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns action values given resource type, resource name and a set of
cfb80e0cfdc44c2128a14e92ebeb7cda5a09309cTony Bamford * action names by matching the arguments to those of the rule object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceType resource type
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionNames a set of action names for which to compute values.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Each element of the set should be a <code>String</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * valued action name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a map of action values for actions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Each key of the map is a String valued action name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Each value of the map is a set of String values
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws NameNotFoundException if any name in <code>actionNames</code> is
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * not found in the rule.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map getActionValues(String resourceType, String resourceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames) throws NameNotFoundException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map actionValues = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((serviceTypeName.equalsIgnoreCase(resourceType)) && (actionNames != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceMatch rm = isResourceMatch(resourceType, resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ResourceMatch.EXACT_MATCH.equals(rm) || ResourceMatch.WILDCARD_MATCH.equals(rm)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //if (ResourceMatch.EXACT_MATCH.equals(rm) ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionValues = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator actionIter = actionNames.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (actionIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String actionName = (String) actionIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set values = getActionValues(actionName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (values != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionValues.put(actionName, values);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (actionValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}