1 """NDG XACML ElementTree Policy Document Reader
2
3 NERC DataGrid
4 """
5 __author__ = "R B Wilkinson"
6 __date__ = "01/11/11"
7 __copyright__ = "(C) 2011 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$"
12 from ndg.xacml.parsers import XMLParseError
13 from ndg.xacml.core.policy import Policy
14 from ndg.xacml.core.policyset import PolicySet
15 from ndg.xacml.core.policybase import PolicyBase
16 from ndg.xacml.parsers.etree import QName
17 from ndg.xacml.parsers.etree.policyreader import PolicyReader
18 from ndg.xacml.parsers.etree.policysetreader import PolicySetReader
19 from ndg.xacml.parsers.etree.reader import ETreeAbstractReader
20
21
23 """Parse a Policy Document using ElementTree
24 @cvar TYPE: XACML type to instantiate from parsed object
25 @type TYPE: type"""
26 TYPE = PolicyBase
27 TYPE_MAP = {Policy.ELEMENT_LOCAL_NAME: (Policy, PolicyReader),
28 PolicySet.ELEMENT_LOCAL_NAME: (PolicySet, PolicySetReader)}
29
31 """Parse policy object
32
33 @param obj: input object to parse
34 @type obj: ElementTree Element, or stream object
35 @return: new XACML expression instance
36 @rtype: ndg.xacml.core.policybase.PolicyBase derived type
37 @raise XMLParseError: error reading element
38 @raise NotImplementedError: parsing is not implemented for rule
39 combiner, combiner parameters and obligations elements.
40 """
41 elem = super(PolicyBaseReader, self)._parse(obj)
42 localName = QName.getLocalPart(elem.tag)
43
44
45 (xacmlType, readerType) = self.TYPE_MAP.get(localName, (None, None))
46 if xacmlType is None:
47 raise XMLParseError("Element %s is not valid as the root element"
48 " of a XACML document",
49 localName)
50
51
52 rootElementReader = readerType()
53 policy = rootElementReader.processElement(elem, common)
54
55 return policy
56