protected void store(String... fields) throws FactoryException { DataTypeFactory thisDataTypeFactory = this.getDataTypeFactory(); Identifier identifierCategory = new IdentifierImpl(fields[0]); Identifier identifierAttribute = new IdentifierImpl(fields[1]); Identifier identifierDataType = new IdentifierImpl(fields[2]); String issuer = fields.length == 5 ? fields[3] : null; String value = fields[fields.length - 1]; DataType<?> dataType = thisDataTypeFactory.getDataType(identifierDataType); if (dataType == null) { logger.error("Unknown data type " + identifierDataType.stringValue()); return; } AttributeValue<?> attributeValue = null; try { attributeValue = dataType.createAttributeValue(value); } catch (DataTypeException ex) { throw new FactoryException("DataTypeException creating AttributeValue", ex); } Attribute attribute = new StdMutableAttribute( identifierCategory, identifierAttribute, attributeValue, issuer, false); this.listAttributes.add(attribute); }
public static boolean repair(Node nodePolicySet) throws DOMStructureException { Element elementPolicySet = DOMUtil.getElement(nodePolicySet); boolean result = false; NodeList children = elementPolicySet.getChildNodes(); int numChildren; boolean sawDescription = false; boolean sawPolicyIssuer = false; boolean sawPolicyDefaults = false; boolean sawTarget = false; boolean sawObligationExprs = false; boolean sawAdviceExprs = false; if (children != null && (numChildren = children.getLength()) > 0) { /* * Now process the other elements so we can pull up the parent policy defaults */ for (int i = 0; i < numChildren; i++) { Node child = children.item(i); if (DOMUtil.isElement(child)) { if (DOMUtil.isInNamespace(child, XACML3.XMLNS)) { String childName = child.getLocalName(); if (XACML3.ELEMENT_DESCRIPTION.equals(childName)) { if (sawDescription) { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } else { sawDescription = true; } } else if (XACML3.ELEMENT_POLICYISSUER.equals(childName)) { if (sawPolicyIssuer) { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } else { sawPolicyIssuer = true; result = DOMPolicyIssuer.repair(child) || result; } } else if (XACML3.ELEMENT_POLICYSETDEFAULTS.equals(childName)) { if (sawPolicyDefaults) { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } else { sawPolicyDefaults = true; result = DOMPolicyDefaults.repair(child) || result; } } else if (XACML3.ELEMENT_TARGET.equals(childName)) { if (sawTarget) { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } else { sawTarget = true; result = DOMTarget.repair(child) || result; } } else if (XACML3.ELEMENT_POLICYSET.equals(childName)) { result = DOMPolicySet.repair(child) || result; } else if (XACML3.ELEMENT_POLICY.equals(childName)) { result = DOMPolicy.repair(child) || result; } else if (XACML3.ELEMENT_POLICYIDREFERENCE.equals(childName)) { result = DOMPolicyIdReference.repair(child) || result; } else if (XACML3.ELEMENT_POLICYSETIDREFERENCE.equals(childName)) { result = DOMPolicySetIdReference.repair(child) || result; } else if (XACML3.ELEMENT_COMBINERPARAMETERS.equals(childName)) { result = DOMCombinerParameter.repair(child) || result; } else if (XACML3.ELEMENT_POLICYCOMBINERPARAMETERS.equals(childName)) { result = DOMPolicyCombinerParameter.repair(child) || result; } else if (XACML3.ELEMENT_POLICYSETCOMBINERPARAMETERS.equals(childName)) { result = DOMPolicySetCombinerParameter.repair(child) || result; } else if (XACML3.ELEMENT_OBLIGATIONEXPRESSIONS.equals(childName)) { if (sawObligationExprs) { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } else { sawObligationExprs = true; result = DOMObligationExpression.repairList(child) || result; } } else if (XACML3.ELEMENT_ADVICEEXPRESSIONS.equals(childName)) { if (sawAdviceExprs) { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } else { sawAdviceExprs = true; result = DOMAdviceExpression.repairList(child) || result; } } else { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } } else { logger.warn("Unexpected element " + child.getNodeName()); elementPolicySet.removeChild(child); result = true; } } } } if (!sawTarget) { throw DOMUtil.newMissingElementException(nodePolicySet, XACML3.XMLNS, XACML3.ELEMENT_TARGET); } /* * Get the attributes */ result = DOMUtil.repairIdentifierAttribute(elementPolicySet, XACML3.ATTRIBUTE_POLICYSETID, logger) || result; result = DOMUtil.repairVersionAttribute(elementPolicySet, XACML3.ATTRIBUTE_VERSION, logger) || result; result = DOMUtil.repairIdentifierAttribute( elementPolicySet, XACML3.ATTRIBUTE_POLICYCOMBININGALGID, XACML3.ID_POLICY_DENY_OVERRIDES, logger) || result; Identifier identifier = DOMUtil.getIdentifierAttribute(elementPolicySet, XACML3.ATTRIBUTE_POLICYCOMBININGALGID); CombiningAlgorithm<PolicySetChild> combiningAlgorithm = null; try { combiningAlgorithm = CombiningAlgorithmFactory.newInstance().getPolicyCombiningAlgorithm(identifier); } catch (FactoryException ex) { combiningAlgorithm = null; } if (combiningAlgorithm == null) { logger.warn( "Setting invalid " + XACML3.ATTRIBUTE_POLICYCOMBININGALGID + " attribute " + identifier.stringValue() + " to " + XACML3.ID_POLICY_DENY_OVERRIDES.stringValue()); elementPolicySet.setAttribute( XACML3.ATTRIBUTE_POLICYCOMBININGALGID, XACML3.ID_POLICY_DENY_OVERRIDES.stringValue()); result = true; } return result; }