source: TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/policyreader.py @ 6746

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/policyreader.py@6746
Revision 6746, 3.6 KB checked in by pjkersha, 9 years ago (diff)

Added more !ETree readers for the different types.

Line 
1"""NDG XACML ElementTree Policy Reader 
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "16/03/10"
7__copyright__ = "(C) 2010 Science and Technology Facilities Council"
8__contact__ = "Philip.Kershaw@stfc.ac.uk"
9__license__ = "BSD - see LICENSE file in top-level directory"
10__contact__ = "Philip.Kershaw@stfc.ac.uk"
11__revision__ = "$Id: $"
12from ndg.xacml.parsers import XMLParseError
13from ndg.xacml.core.policy import Policy
14from ndg.xacml.core.variabledefinition import VariableDefinition
15from ndg.xacml.core.rule import Rule
16from ndg.xacml.core.target import Target
17from ndg.xacml.parsers.etree import QName
18from ndg.xacml.parsers.etree.reader import ETreeAbstractReader
19from ndg.xacml.parsers.etree.targetreader import TargetReader
20from ndg.xacml.parsers.etree.rulereader import RuleReader
21   
22   
23class PolicyReader(ETreeAbstractReader):
24    """Parse a Policy Document using ElementTree
25    """
26    def __call__(self, obj):
27        """Parse policy object"""
28        elem = super(PolicyReader, self)._parse(obj)
29       
30        policy = Policy()
31        cls = Policy
32       
33        localName = QName.getLocalPart(elem.tag)
34        if localName != cls.ELEMENT_LOCAL_NAME:
35            raise XMLParseError("No \"%s\" element found" % 
36                                cls.ELEMENT_LOCAL_NAME)
37       
38        # Unpack *required* attributes from top-level element
39        attributeValues = []
40        for attributeName in (cls.POLICY_ID_ATTRIB_NAME,
41                              cls.RULE_COMBINING_ALG_ID_ATTRIB_NAME):
42            attributeValue = elem.attrib.get(attributeName)
43            if attributeValue is None:
44                raise XMLParseError('No "%s" attribute found in "%s" '
45                                        'element' %
46                                        (attributeName,
47                                         cls.ELEMENT_LOCAL_NAME))
48               
49            attributeValues.append(attributeValue) 
50                   
51        policy.policyId, policy.ruleCombiningAlgId = attributeValues
52       
53        # Defaults to XACML version 1.0
54        # TODO: version check
55        policy.version = (elem.attrib.get(cls.VERSION_ATTRIB_NAME) or 
56                          cls.DEFAULT_XACML_VERSION)
57           
58        # Parse sub-elements
59        for childElem in elem:
60            localName = QName.getLocalPart(childElem.tag)
61           
62            if localName == cls.DESCRIPTION_LOCAL_NAME:
63                if elem.text is not None:
64                    policy.description = elem.text.strip()
65                   
66            elif localName == cls.POLICY_DEFAULTS_LOCAL_NAME:
67                raise NotImplementedError()
68                   
69            elif localName == Target.ELEMENT_LOCAL_NAME:
70                policy.target = TargetReader.parse(childElem)
71             
72            elif localName == cls.COMBINER_PARAMETERS_LOCAL_NAME:
73                raise NotImplementedError()
74             
75            elif localName == cls.RULE_COMBINER_PARAMETERS_LOCAL_NAME:
76                raise NotImplementedError()
77           
78            elif localName == VariableDefinition.ELEMENT_LOCAL_NAME:
79                variableDefinition = VariableDefinitionReader.parse(childElem)
80               
81            elif localName == Rule.ELEMENT_LOCAL_NAME:
82                policy.rules.append(RuleReader.parse(childElem))
83                   
84            elif localName == cls.OBLIGATIONS_LOCAL_NAME:
85                raise NotImplementedError()
86           
87            else:
88                raise XMLParseError("XACML Policy child element name %r not "
89                                    "recognised" % localName)
90       
91        return policy
92   
Note: See TracBrowser for help on using the repository browser.