source: TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/authz/xacml/parsers/etree/policyreader.py @ 6733

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/authz/xacml/parsers/etree/policyreader.py@6733
Revision 6733, 3.4 KB checked in by pjkersha, 10 years ago (diff)

Rearranging parsing package structure.

RevLine 
[6731]1'''
2Created on 16 Mar 2010
3
4@author: pjkersha
5'''
6from ndg.security.common.authz.xacml.etree.reader import AbstractReader
7from ndg.security.common.authz.xacml import PolicyComponent, XMLParseError
8from ndg.security.common.authz.xacml.policy import Policy
9from ndg.security.common.authz.xacml.variabledefinition import \
10    VariableDefinition
11from ndg.security.common.authz.xacml.rule import Rule
12from ndg.security.common.authz.xacml.target import Target
13from ndg.security.common.authz.xacml.etree import QName
14from ndg.security.common.authz.xacml.etree.targetreader import TargetReader
15   
16   
17class PolicyReader(AbstractReader):
18    """Parse a Policy Document using ElementTree
19    """
20    def __call__(self, obj):
21        """Parse policy object"""
22        elem = super(PolicyReader, self)._parse(obj)
23       
24        policy = Policy()
25        cls = Policy
26       
27        localName = QName.getLocalPart(elem.tag)
28        if localName != cls.ELEMENT_LOCAL_NAME:
29            raise XMLParseError("No \"%s\" element found" % 
30                                cls.ELEMENT_LOCAL_NAME)
31       
32        # Unpack *required* attributes from top-level element
33        attributeValues = []
34        for attributeName in (cls.POLICY_ID_ATTRIB_NAME,
35                              cls.RULE_COMBINING_ALG_ID_ATTRIB_NAME):
36            attributeValue = elem.attrib.get(attributeName)
37            if attributeValue is None:
38                raise XMLParseError('No "%s" attribute found in "%s" '
39                                        'element' %
40                                        (attributeName,
41                                         cls.ELEMENT_LOCAL_NAME))
42               
43            attributeValues.append(attributeValue) 
44                   
45        policy.policyId, policy.ruleCombiningAlgId = attributeValues
46       
47        # Defaults to XACML version 1.0
48        # TODO: version check
49        policy.version = (elem.attrib.get(cls.VERSION_ATTRIB_NAME) or 
50                          cls.DEFAULT_XACML_VERSION)
51           
52        # Parse sub-elements
53        for childElem in elem:
54            localName = QName.getLocalPart(childElem.tag)
55           
56            if localName == cls.DESCRIPTION_LOCAL_NAME:
57                if elem.text is not None:
58                    policy.description = elem.text.strip()
59                   
60            elif localName == cls.POLICY_DEFAULTS_LOCAL_NAME:
61                raise NotImplementedError()
62                   
63            elif localName == Target.ELEMENT_LOCAL_NAME:
64                target = TargetReader.parse(childElem)
65             
66            elif localName == cls.COMBINER_PARAMETERS_LOCAL_NAME:
67                raise NotImplementedError()
68             
69            elif localName == cls.RULE_COMBINER_PARAMETERS_LOCAL_NAME:
70                raise NotImplementedError()
71           
72            elif localName == VariableDefinition.ELEMENT_LOCAL_NAME:
73                variableDefinition = VariableDefinitionReader.parse(childElem)
74               
75            elif localName == Rule.ELEMENT_LOCAL_NAME:
76                rule = RuleReader.parse(childElem)
77                   
78            elif localName == cls.OBLIGATIONS_LOCAL_NAME:
79                raise NotImplementedError()
80           
81            else:
82                raise XMLParseError("XACML Policy child element name %r not "
83                                    "recognised" % localName)
84       
85        return policy
86   
Note: See TracBrowser for help on using the repository browser.