Changeset 6746


Ignore:
Timestamp:
16/03/10 13:26:59 (9 years ago)
Author:
pjkersha
Message:

Added more !ETree readers for the different types.

Location:
TI12-security/trunk/NDG_XACML
Files:
10 added
22 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDG_XACML/ndg/__init__.py

    r6738 r6746  
    22 
    33NERC DataGrid Project 
    4  
    5 This package is adapted from the Sun Java XACML implementation ... 
    6  
    7 Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. 
    8  
    9 Redistribution and use in source and binary forms, with or without 
    10 modification, are permitted provided that the following conditions are met: 
    11  
    12   1. Redistribution of source code must retain the above copyright notice, 
    13      this list of conditions and the following disclaimer. 
    14  
    15   2. Redistribution in binary form must reproduce the above copyright 
    16      notice, this list of conditions and the following disclaimer in the 
    17      documentation and/or other materials provided with the distribution. 
    18  
    19 Neither the name of Sun Microsystems, Inc. or the names of contributors may 
    20 be used to endorse or promote products derived from this software without 
    21 specific prior written permission. 
    22  
    23 This software is provided "AS IS," without a warranty of any kind. ALL 
    24 EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING 
    25 ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 
    26 OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") 
    27 AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE 
    28 AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS 
    29 DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST 
    30 REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, 
    31 INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY 
    32 OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 
    33 EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 
    34  
    35 You acknowledge that this software is not designed or intended for use in 
    36 the design, construction, operation or maintenance of any nuclear facility. 
    37  
    384 
    395This is a setuptools namespace_package.  DO NOT place any other 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/__init__.py

    r6740 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12  
    1312class XACMLError(Exception): 
    1413    """Base class for XACML package exception types""" 
    15      
    16      
    17 class XMLParseError(XACMLError): 
    18     """XACML package XML Parsing error""" 
    19      
    20      
    21 class PolicyComponent(object): 
    22     """Base class for Policy and Policy subelements""" 
    23     XACML_2_0_XMLNS = "urn:oasis:names:tc:xacml:2.0:policy:schema:os" 
    24  
    25     __slots__ = ('__xmlns', '__reader', '__writer') 
    26  
    27     ELEMENT_LOCAL_NAME = None 
    28      
    29     def __init__(self): 
    30         self.__xmlns = PolicyComponent.XACML_2_0_XMLNS 
    31         self.__reader = None 
    32         self.__writer = None 
    33          
    34     def _getXmlns(self): 
    35         return self.__xmlns 
    36  
    37     def _setXmlns(self, value): 
    38         if not isinstance(value, basestring): 
    39             raise TypeError('Expecting string type for "xmlns" ' 
    40                             'attribute; got %r' % type(value)) 
    41         self.__xmlns = value 
    42  
    43     xmlns = property(_getXmlns, _setXmlns,  
    44                      doc="XML Namespace for policy the document") 
    45      
    46     @property 
    47     def isValidXmlns(self): 
    48         return self.xmlns in PolicyComponent.XMLNS 
    49  
    50     def read(self, obj): 
    51         """Read using callable assinged to reader property""" 
    52         if self.__reader is None: 
    53             raise AttributeError('No reader set for %r' % self.__class__) 
    54          
    55         self.__reader(self, obj) 
    56  
    57     @classmethod 
    58     def Read(cls, obj): 
    59         """Construct a new Policy"""  
    60         xacmlObj = cls() 
    61         xacmlObj.read(obj) 
    62         return xacmlObj 
    63      
    64     def write(self, obj): 
    65         """Read using callable assinged to reader property""" 
    66         if self.__writer is None: 
    67             raise AttributeError('No writer set for %r' % self.__class__) 
    68          
    69         self.__writer(self, obj) 
    70          
    71              
    72 class RequestPropertyBase(PolicyComponent): 
    73     """Base type for Subject, Resource, Action and Environment types""" 
    74     MATCH_TYPE = None 
    75      
    76     __slots__ = ('__matches', ) 
    77      
    78     def __init__(self): 
    79         # Derived types can specify the type for matches via the MATCH_TYPE 
    80         # class variable 
    81         self.__matches = TypedList(self.__class__.MATCH_TYPE) 
    82          
    83     @property 
    84     def matches(self): 
    85         return self.__matches 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/Copy of msi.py

    r6745 r6746  
    1818from elementtree import ElementTree 
    1919 
    20 from ndg.security.common.utils import TypedList 
    21 from ndg.security.common.utils.etree import QName 
    22 from ndg.security.common.authz import (_AttrDict, SubjectBase, Subject, 
     20from ndg.xacml.utils import TypedList 
     21from ndg.xacml.utils.etree import QName 
     22from ndg.xacml.authz import (_AttrDict, SubjectBase, Subject, 
    2323                                       SubjectRetrievalError) 
    24 from ndg.security.common.authz.pip import (PIPBase, PIPAttributeQuery,  
     24from ndg.xacml.authz.pip import (PIPBase, PIPAttributeQuery,  
    2525                                           PIPAttributeResponse) 
    2626 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/__init__.py

    r6744 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
     12     
     13     
     14class PolicyComponent(object): 
     15    """Base class for Policy and Policy subelements""" 
     16    XACML_2_0_XMLNS = "urn:oasis:names:tc:xacml:2.0:policy:schema:os" 
     17 
     18    __slots__ = ('__xmlns', '__reader', '__writer') 
     19 
     20    ELEMENT_LOCAL_NAME = None 
     21     
     22    def __init__(self): 
     23        self.__xmlns = PolicyComponent.XACML_2_0_XMLNS 
     24        self.__reader = None 
     25        self.__writer = None 
     26         
     27    def _getXmlns(self): 
     28        return self.__xmlns 
     29 
     30    def _setXmlns(self, value): 
     31        if not isinstance(value, basestring): 
     32            raise TypeError('Expecting string type for "xmlns" ' 
     33                            'attribute; got %r' % type(value)) 
     34        self.__xmlns = value 
     35 
     36    xmlns = property(_getXmlns, _setXmlns,  
     37                     doc="XML Namespace for policy the document") 
     38     
     39    @property 
     40    def isValidXmlns(self): 
     41        return self.xmlns in PolicyComponent.XMLNS 
     42 
     43    def read(self, obj): 
     44        """Read using callable assinged to reader property""" 
     45        if self.__reader is None: 
     46            raise AttributeError('No reader set for %r' % self.__class__) 
     47         
     48        self.__reader(self, obj) 
     49 
     50    @classmethod 
     51    def Read(cls, obj): 
     52        """Construct a new Policy"""  
     53        xacmlObj = cls() 
     54        xacmlObj.read(obj) 
     55        return xacmlObj 
     56     
     57    def write(self, obj): 
     58        """Read using callable assinged to reader property""" 
     59        if self.__writer is None: 
     60            raise AttributeError('No writer set for %r' % self.__class__) 
     61         
     62        self.__writer(self, obj) 
     63         
     64             
     65class RequestPropertyBase(PolicyComponent): 
     66    """Base type for Subject, Resource, Action and Environment types""" 
     67    MATCH_TYPE = None 
     68     
     69    __slots__ = ('__matches', ) 
     70     
     71    def __init__(self): 
     72        # Derived types can specify the type for matches via the MATCH_TYPE 
     73        # class variable 
     74        self.__matches = TypedList(self.__class__.MATCH_TYPE) 
     75         
     76    @property 
     77    def matches(self): 
     78        return self.__matches 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/action.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import RequestPropertyBase 
    13 from ndg.xacml.match import ActionMatch 
     12from ndg.xacml.core import RequestPropertyBase 
     13from ndg.xacml.core.match import ActionMatch 
    1414 
    1515 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/attribute.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import PolicyComponent 
     12from ndg.xacml.core import PolicyComponent 
    1313 
    1414 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/condition.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import PolicyComponent 
     12from ndg.xacml.core import PolicyComponent 
    1313 
    1414 
     
    1919    def __init__(self): 
    2020        self.__expression = None 
     21         
     22    @property 
     23    def expression(self): 
     24        return self.__expression 
     25     
     26    @expression.setter 
     27    def expression(self, value): 
     28        self.__expression = value 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/environment.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import RequestPropertyBase 
    13 from ndg.xacml.match import EnvironmentMatch 
     12from ndg.xacml.core import RequestPropertyBase 
     13from ndg.xacml.core.match import EnvironmentMatch 
    1414 
    1515 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/match.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import PolicyComponent 
    13 from ndg.xacml.attribute import AttributeValue 
     12from ndg.xacml.core import PolicyComponent 
     13from ndg.xacml.core.attribute import AttributeValue 
    1414 
    1515 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/obligation.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.security.common.utils import TypedList 
    13 from ndg.xacml import PolicyComponent 
     12from ndg.xacml.utils import TypedList 
     13from ndg.xacml.core import PolicyComponent 
    1414 
    1515 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/policy.py

    r6745 r6746  
    1111__revision__ = "$Id: $" 
    1212from ndg.xacml.utils import TypedList 
    13 from ndg.xacml import PolicyComponent 
    14 from ndg.xacml.target import Target 
    15 from ndg.xacml.rule import Rule 
    16 from ndg.xacml.obligation import Obligation 
     13from ndg.xacml.core import PolicyComponent 
     14from ndg.xacml.core.target import Target 
     15from ndg.xacml.core.rule import Rule 
     16from ndg.xacml.core.obligation import Obligation 
    1717 
    1818 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/resource.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import RequestPropertyBase 
    13 from ndg.xacml.match import ResourceMatch 
     12from ndg.xacml.core import RequestPropertyBase 
     13from ndg.xacml.core.match import ResourceMatch 
    1414 
    1515 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/rule.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.security.common.utils import TypedList 
    13 from ndg.xacml import PolicyComponent 
    14 from ndg.xacml.target import Target 
    15 from ndg.xacml.condition import Condition 
     12from ndg.xacml.utils import TypedList 
     13from ndg.xacml.core import PolicyComponent 
     14from ndg.xacml.core.target import Target 
     15from ndg.xacml.core.condition import Condition 
    1616 
    1717 
     
    1919    """XACML Policy Rule""" 
    2020    ELEMENT_LOCAL_NAME = 'Rule' 
     21    RULE_ID_ATTRIB_NAME = 'RuleId' 
     22    EFFECT_ATTRIB_NAME = 'Effect' 
     23     
     24    DESCRIPTION_LOCAL_NAME = 'Description' 
    2125     
    2226    __slots__ = ( 
    23         '__targets',  
    24         '__conditions',  
     27        '__target',  
     28        '__condition',  
    2529        '__description',  
    2630        '__id',  
     
    3135        self.__id = None 
    3236        self.__effect = None 
    33         self.__targets = TypedList(Target) 
    34         self.__conditions = TypedList(Condition) 
     37        self.__target = None 
     38        self.__condition = None 
    3539         
    3640    @property 
    37     def targets(self): 
    38         "list of Rule targets" 
    39         return self.__targets 
     41    def target(self): 
     42        "Rule target" 
     43        return self.__target 
    4044     
     45    @target.setter 
     46    def target(self, value): 
     47        if not isinstance(value, Target): 
     48            raise TypeError('Expecting %r type for "id" ' 
     49                            'attribute; got %r' % (Target, type(value)))  
     50        self.__target = value 
     51            
    4152    @property 
    42     def conditions(self): 
    43         "list of rule conditions" 
    44         return self.__conditions 
    45         
     53    def condition(self): 
     54        "rule condition" 
     55        return self.__condition 
     56     
     57    @condition.setter 
     58    def condition(self, value): 
     59        if not isinstance(value, Condition): 
     60            raise TypeError('Expecting %r type for "id" ' 
     61                            'attribute; got %r' % (Condition, type(value)))  
     62             
     63        self.__condition = value 
     64              
    4665    def _get_id(self): 
    4766        return self.__id 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/subject.py

    r6745 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import RequestPropertyBase 
    13 from ndg.xacml.match import SubjectMatch 
     12from ndg.xacml.core import RequestPropertyBase 
     13from ndg.xacml.core.match import SubjectMatch 
    1414 
    1515class Subject(RequestPropertyBase): 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/target.py

    r6745 r6746  
    44@author: pjkersha 
    55''' 
    6 from ndg.security.common.utils import TypedList 
     6from ndg.xacml.utils import TypedList 
    77"""NDG Security Target type definition 
    88 
     
    1616__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1717__revision__ = "$Id: $" 
    18 from ndg.xacml import PolicyComponent 
    19 from ndg.xacml.action import Action 
    20 from ndg.xacml.resource import Resource 
    21 from ndg.xacml.subject import Subject 
    22 from ndg.xacml.environment import Environment 
     18from ndg.xacml.core import PolicyComponent 
     19from ndg.xacml.core.action import Action 
     20from ndg.xacml.core.resource import Resource 
     21from ndg.xacml.core.subject import Subject 
     22from ndg.xacml.core.environment import Environment 
    2323 
    2424 
    2525class Target(PolicyComponent): 
    2626    ELEMENT_LOCAL_NAME = "Target" 
     27    SUBJECTS_ELEMENT_LOCAL_NAME = "Subjects" 
     28    ACTIONS_ELEMENT_LOCAL_NAME = "Actions" 
     29    RESOURCES_ELEMENT_LOCAL_NAME = "Resources" 
     30    ENVIRONMENTS_ELEMENT_LOCAL_NAME = "Environments" 
    2731     
    28     __slots__ = ('__actions', '__resources', '__actions', '__environments') 
     32    __slots__ = ('__subjects', '__resources', '__actions', '__environments') 
    2933     
    3034    def __init__(self): 
    31         self.__actions = TypedList(Subject) 
     35        self.__subjects = TypedList(Subject) 
    3236        self.__resources = TypedList(Resource) 
    3337        self.__actions = TypedList(Action) 
     
    3539     
    3640    @property 
    37     def actions(self): 
    38         return self.__actions 
     41    def subjects(self): 
     42        return self.__subjects 
    3943     
    4044    @property 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/__init__.py

    r6740 r6746  
    1414from abc import ABCMeta, abstractmethod 
    1515 
    16 from xml.etree import ElementTree 
     16from ndg.xacml import XACMLError 
     17  
     18     
     19class XMLParseError(XACMLError): 
     20    """XACML package XML Parsing error""" 
    1721 
    1822 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/__init__.py

    r6740 r6746  
    8282        match 
    8383         
    84         @type qname: ndg.security.common.utils.etree.QName 
     84        @type qname: ndg.xacml.utils.etree.QName 
    8585        @param qname: Qualified Name to compare with self  
    8686        """ 
     
    9696        match 
    9797         
    98         @type qname: ndg.security.common.utils.etree.QName 
     98        @type qname: ndg.xacml.utils.etree.QName 
    9999        @param qname: Qualified Name to compare with self  
    100100        """ 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/policyreader.py

    r6740 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml.parsers.etree.reader import \ 
    13     EtreeAbstractReader 
    14 from ndg.xacml import XMLParseError 
    15 from ndg.xacml.policy import Policy 
    16 from ndg.xacml.variabledefinition import \ 
    17     VariableDefinition 
    18 from ndg.xacml.rule import Rule 
    19 from ndg.xacml.target import Target 
     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 
    2017from ndg.xacml.parsers.etree import QName 
    21 from ndg.xacml.parsers.etree.targetreader import \ 
    22     TargetReader 
     18from ndg.xacml.parsers.etree.reader import ETreeAbstractReader 
     19from ndg.xacml.parsers.etree.targetreader import TargetReader 
     20from ndg.xacml.parsers.etree.rulereader import RuleReader 
    2321     
    2422     
    25 class PolicyReader(EtreeAbstractReader): 
     23class PolicyReader(ETreeAbstractReader): 
    2624    """Parse a Policy Document using ElementTree 
    2725    """ 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/reader.py

    r6740 r6746  
    1919from xml.etree import ElementTree 
    2020 
    21 from ndg.xacml import PolicyComponent 
     21from ndg.xacml.core import PolicyComponent 
    2222from ndg.xacml.parsers import AbstractReader 
    2323 
    2424 
    25 class EtreeAbstractReader(AbstractReader): 
     25class ETreeAbstractReader(AbstractReader): 
    2626    """Base class for ElementTree implementation of XACML reader""" 
    2727      
     
    5151          
    5252# Set up new class as an abstract base itself              
    53 AbstractReader.register(EtreeAbstractReader) 
     53AbstractReader.register(ETreeAbstractReader) 
    5454 
    5555 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/parsers/etree/targetreader.py

    r6740 r6746  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id: $" 
    12 from ndg.xacml import XMLParseError 
    13 from ndg.xacml.target import Target 
    14 from ndg.xacml.action import Action 
    15 from ndg.xacml.resource import Resource 
    16 from ndg.xacml.subject import Subject 
    17 from ndg.xacml.environment import Environment 
     12from ndg.xacml.core.target import Target 
     13from ndg.xacml.parsers import XMLParseError 
    1814from ndg.xacml.parsers.etree import QName 
    19 from ndg.xacml.parsers.etree.reader import \ 
    20     EtreeAbstractReader 
     15from ndg.xacml.parsers.etree.reader import ETreeAbstractReader 
     16from ndg.xacml.parsers.etree.subjectreader import SubjectReader 
     17from ndg.xacml.parsers.etree.actionreader import ActionReader 
     18from ndg.xacml.parsers.etree.resourcereader import ResourceReader 
     19from ndg.xacml.parsers.etree.environmentreader import EnvironmentReader 
    2120 
    2221 
    23 class TargetReader(EtreeAbstractReader): 
     22class TargetReader(ETreeAbstractReader): 
    2423    """ElementTree based parser for XACML Target elements""" 
    2524     
     
    3938            localName = QName.getLocalPart(childElem.tag) 
    4039             
    41             if localName == Subject.ELEMENT_LOCAL_NAME: 
     40            if localName == cls.SUBJECTS_ELEMENT_LOCAL_NAME: 
    4241                target.subjects.append(SubjectReader.parse(childElem)) 
    4342                                 
    44             elif localName == Resource.ELEMENT_LOCAL_NAME: 
     43            elif localName == cls.RESOURCES_ELEMENT_LOCAL_NAME: 
    4544                target.resources.append(ResourceReader.parse(childElem)) 
    4645                 
    47             elif localName == Action.ELEMENT_LOCAL_NAME: 
     46            elif localName == cls.ACTIONS_ELEMENT_LOCAL_NAME: 
    4847                target.actions.append(ActionReader.parse(childElem)) 
    4948                 
    50             elif localName == Environment.ELEMENT_LOCAL_NAME: 
     49            elif localName == cls.ENVIRONMENTS_ELEMENT_LOCAL_NAME: 
    5150                target.environments.append(EnvironmentReader.parse(childElem)) 
    5251                 
    5352            else: 
    5453                raise XMLParseError("XACML Target child element name %r not " 
    55                                     "recognised" % localName)       
     54                                    "recognised" % localName) 
    5655                 
    5756        return target  
  • TI12-security/trunk/NDG_XACML/ndg/xacml/utils/configfileparsers.py

    r6069 r6746  
    342342    turn.  Convert to a list if validKeys dict item indicates so 
    343343     
    344     @type cfg: ndg.security.common.utils.configfileparsers.CaseSensitiveConfigParser 
     344    @type cfg: ndg.xacml.utils.configfileparsers.CaseSensitiveConfigParser 
    345345    @param cfg: config file object 
    346346    @type section: basestring 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/utils/etree.py

    r5712 r6746  
    5757    def __eq__(self, qname): 
    5858        """Enable equality check for QName 
    59         @type qname: ndg.security.common.utils.etree.QName 
     59        @type qname: ndg.xacml.utils.etree.QName 
    6060        @param qname: Qualified Name to compare with self  
    6161        """ 
     
    6868    def __ne__(self, qname): 
    6969        """Enable equality check for QName 
    70         @type qname: ndg.security.common.utils.etree.QName 
     70        @type qname: ndg.xacml.utils.etree.QName 
    7171        @param qname: Qualified Name to compare with self  
    7272        """ 
Note: See TracChangeset for help on using the changeset viewer.