Ignore:
Timestamp:
13/04/10 16:39:31 (10 years ago)
Author:
pjkersha
Message:

Refactored function modules with class factories to generate classes for each variable type.

Location:
TI12-security/trunk/NDG_XACML/ndg/xacml/core
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/context/exceptions.py

    r6796 r6803  
    3737                            '%r instead' % (Response, type(Response))) 
    3838        self.__response = value 
    39          
     39 
     40 
     41class XacmlContextTypeError(XacmlContextError): 
     42    """Type errors within XACML context processing""" 
     43             
    4044         
    4145class MissingAttributeError(XacmlContextError): 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/__init__.py

    r6802 r6803  
    1 """NDG XACML package for match functions 
     1"""NDG XACML package for functions 
    22 
    33NERC DataGrid Project 
     
    1111__revision__ = "$Id: $" 
    1212from abc import ABCMeta, abstractmethod 
    13  
     13from datetime import datetime, timedelta 
     14import traceback 
     15import logging 
     16log = logging.getLogger(__name__) 
     17 
     18from ndg.xacml.core.attributevalue import AttributeValue 
    1419from ndg.xacml.utils import VettedDict 
    1520from ndg.xacml.utils.factory import callModuleObject 
    16  
    17 from datetime import datetime, timedelta 
    1821 
    1922 
     
    3033            raise TypeError('"FUNCTION_NS" class variable must be defined in ' 
    3134                            'derived classes') 
    32 #    @classmethod 
    33 #    def __subclasshook__(cls, C): 
    34 #        if cls is AbstractFunction: 
    35 #            if  
    36 #            return True 
    37 #        else: 
    38 #            return NotImplemented 
    3935             
    4036    @abstractmethod 
     
    265261 
    266262 
     263class ClassFactoryInterface(object): 
     264    """Interface class for function module class factory class 
     265    """ 
     266    __meta__ = ABCMeta 
     267     
     268    @abstractmethod 
     269    def __call__(self, identifier): 
     270        '''Create class for the given XACML function identifier 
     271         
     272        @param identifier: XACML *-at-least-one-member-of type function 
     273        identifier 
     274        @type identifier: basestring 
     275        @return: at least one member of class corresponding to the given input 
     276        identifier 
     277        @rtype: AtLeastOneMemberOfBase derived type or None if no match is  
     278        found 
     279        ''' 
     280        return None 
     281     
     282 
     283class FunctionClassFactoryBase(ClassFactoryInterface): 
     284    """Base implementation for XACML Function Class Factory.  Derived types  
     285    should be implemented in sub-modules of ndg.xacml.core.functions e.g. 
     286    for urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of a  
     287    class factory should exist, 
     288     
     289    ndg.xacml.core.functions.v1.at_least_one_member_of.FunctionClassFactory 
     290     
     291    which  
     292    StringAtLeastOneMemberOf     
     293     
     294    Derived classes MUST define these two class variables: 
     295     
     296    @cvar FUNCTION_NS_SUFFIX: urn suffix for the family of function to define 
     297    e.g. -at-least-one-member-of is the suffix for the URN: 
     298     
     299    urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of 
     300    @type FUNCTION_NS_SUFFIX: NoneType (but basestring in derived class) 
     301     
     302    @cvar FUNCTION_BASE_CLASS: base class for this family of functions e.g for 
     303    urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of, 
     304    ndg.xacml.core.functions.v1.at_least_one_member_of.AtLeastOneMemberOfBase 
     305    @type FUNCTION_BASE_CLASS: NoneType (but AbstractFunction derived type in  
     306    derived function facotry class) 
     307    """ 
     308     
     309     
     310    FUNCTION_NS_SUFFIX = None 
     311    FUNCTION_BASE_CLASS = None 
     312     
     313    URN_SEP = ':' 
     314    FUNCTION_NAME_SEP = '-' 
     315 
     316    def __init__(self): 
     317        """Create classes for each <type>-at-least-one-member-of function and 
     318        place in a look-up table 
     319        """ 
     320        if None in (self.__class__.FUNCTION_NS_SUFFIX,  
     321                    self.__class__.FUNCTION_BASE_CLASS): 
     322            raise TypeError('"FUNCTION_NS_SUFFIX" and "FUNCTION_BASE_CLASS" ' 
     323                            'must be defined in a derived implementation of ' 
     324                            'this class.  See this classes __doc__ contents') 
     325             
     326        self.__map = {} 
     327        functionSuffixParts = self.__class__.FUNCTION_NS_SUFFIX.split( 
     328                                            self.__class__.FUNCTION_NAME_SEP) 
     329        functionSuffix = ''.join([n[0].upper() + n[1:]  
     330                                  for n in functionSuffixParts if n]) 
     331         
     332        functionNames = [n for n in XacmlFunctionNames.FUNCTION_NAMES 
     333                         if n.endswith(self.__class__.FUNCTION_NS_SUFFIX)] 
     334         
     335        for identifier in functionNames: 
     336            # Extract the function name and the type portion of the function 
     337            # name in order to make an implementation of a class to handle it 
     338            functionName = identifier.split(self.__class__.URN_SEP)[-1] 
     339            typePart = functionName.split(self.__class__.FUNCTION_NAME_SEP)[0] 
     340             
     341            typeName = typePart[0].upper() + typePart[1:] 
     342            _type = AttributeValue.TYPE_MAP.get(typeName) 
     343            if _type is None: 
     344                raise TypeError('No AttributeValue.TYPE_MAP entry for %r type' % 
     345                                typeName) 
     346               
     347            className = typeName + functionSuffix 
     348            classVars = { 
     349                'TYPE': _type, 
     350                'FUNCTION_NS': identifier 
     351            } 
     352             
     353            functionClass = type(className,  
     354                                 (self.__class__.FUNCTION_BASE_CLASS, ),  
     355                                 classVars) 
     356             
     357            self.__map[identifier] = functionClass 
     358             
     359    def __call__(self, identifier): 
     360        """Return the class for the given XACML *-at-least-one-member-of type 
     361        function identifier 
     362        @param identifier: XACML *-at-least-one-member-of type function 
     363        identifier 
     364        @type identifier: basestring 
     365        @return: at least one member of class corresponding to the given input 
     366        identifier 
     367        @rtype: AtLeastOneMemberOfBase derived type or None if no match is  
     368        found 
     369        """ 
     370        return self.__map.get(identifier) 
     371         
     372     
    267373class FunctionMapError(Exception): 
    268374    """Generic Error exception class for FunctionMap""" 
     
    284390        AbstractFunction.V2_0_FUNCTION_NS: V2_0_PKG_PREFIX 
    285391    } 
     392     
     393    # Each function module is expected to have a class factory for obtaining 
     394    # a class for the given function identifier associated with that module 
     395    FUNCTION_CLASS_FACTORY_CLASSNAME = 'FunctionClassFactory' 
    286396     
    287397    def __init__(self): 
     
    300410            raise TypeError('Expecting %r type for key; got %r' %  
    301411                            (basestring, type(key)))  
     412             
    302413        return True  
    303414     
     
    305416    def valueFilter(value): 
    306417        """Enforce AbstractFunction derived types for match functions""" 
    307  
    308         if not isinstance(value,  
    309                           (AbstractFunction, NotImplemented.__class__)): 
     418        if value is NotImplemented: 
     419            return True 
     420         
     421        elif not issubclass(value, AbstractFunction): 
    310422            raise TypeError('Expecting %r derived type for value; got %r' %  
    311                             (AbstractFunction, type(value)))  
     423                            (AbstractFunction, value))  
     424             
    312425        return True  
    313426            
     
    334447        if functionNs == "urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of": 
    335448            pass 
     449#        else: 
     450#            self[functionNs] = NotImplemented 
     451#            return 
    336452 
    337453        for namespacePrefix, pkgNamePrefix in cls.SUPPORTED_NSS.items(): 
     
    347463                    moduleName = '_'.join(functionNameParts[1:]).lower() 
    348464                     
    349                 className = ''.join([n[0].upper() + n[1:]  
    350                                      for n in functionNameParts]) 
    351                 classPath = pkgNamePrefix + moduleName + '.' + className 
     465                classPath = pkgNamePrefix + moduleName + '.' + \ 
     466                            cls.FUNCTION_CLASS_FACTORY_CLASSNAME 
    352467                break 
    353468 
     
    359474        # map 
    360475        try: 
    361             matchFunctionObj = callModuleObject(classPath) 
    362             self[functionNs] = matchFunctionObj 
    363         except ImportError: 
     476            functionFactory = callModuleObject(classPath) 
     477             
     478        except (ImportError, AttributeError): 
     479            log.error("Error importing function factory class %r for function " 
     480                      "identifier %r: %s", classPath, functionNs,  
     481                      traceback.format_exc()) 
     482             
    364483            # No implementation exists - default to Abstract function 
    365484            self[functionNs] = NotImplemented 
    366485             
    367  
    368  
    369          
     486        self[functionNs] = functionFactory(functionNs) 
     487             
     488 
     489 
     490         
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/at_least_one_member_of.py

    r6797 r6803  
    99__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1010__revision__ = '$Id: $' 
    11 import sys 
    12  
    13 from ndg.xacml.core.functions import AbstractFunction, TYPE_MAP 
    14 from ndg.xacml.core.context.exceptions import XacmlContextError 
     11from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase 
     12from ndg.xacml.core.context.exceptions import XacmlContextTypeError 
    1513from ndg.xacml.utils import TypedList as Bag 
    1614 
     
    2321    """ 
    2422    TYPE = None 
    25     FUNCTION_SUFFIX = 'AtLeastOneMemberOf' 
    26     FUNCTION_NS_SUFFIX = '-at-least-one-member-of' 
    2723     
    2824    def evaluate(self, item, bag): 
     
    3733        """ 
    3834        if not isinstance(item, self.__class__.TYPE): 
    39             raise XacmlContextError('Expecting %r derived type for "str"; ' 
    40                                     'got %r' % (self.__class__.TYPE,  
    41                                                 type(item))) 
     35            raise XacmlContextTypeError('Expecting %r derived type for "item"; ' 
     36                                        'got %r' % (self.__class__.TYPE,  
     37                                                    type(item))) 
    4238             
    4339        if not isinstance(bag, Bag): 
    44             raise XacmlContextError('Expecting %r derived type for "bag"; got ' 
    45                                     '%r' % (Bag, type(bag))) 
     40            raise XacmlContextTypeError('Expecting %r derived type for "bag"; ' 
     41                                        'got %r' % (Bag, type(bag))) 
    4642             
    4743        if bag.elementType != self.__class__.TYPE: 
    48             raise XacmlContextError('Expecting %r type elements for "bag"; ' 
    49                                     'got %r' % 
    50                                     (self.__class__.TYPE, bag.elementType))             
    51         return str in bag 
     44            raise XacmlContextTypeError('Expecting %r type elements for "bag"; ' 
     45                                        'got %r' % 
     46                                        (self.__class__.TYPE, bag.elementType))             
     47        return item in bag 
    5248     
    5349 
    54 _thisModule = sys.modules[__name__] 
    55  
    56 for typeName, _type in TYPE_MAP.items(): 
    57     className = typeName + AtLeastOneMemberOfBase.FUNCTION_SUFFIX 
    58     classVars = { 
    59         'TYPE': _type, 
    60         'FUNCTION_NS': AbstractFunction.V1_0_FUNCTION_NS + typeName[0 
    61             ].lower() + typeName[1:] + AtLeastOneMemberOfBase.FUNCTION_NS_SUFFIX 
    62     } 
    63     setattr(_thisModule,  
    64             className,  
    65             type(className, (AtLeastOneMemberOfBase, ), classVars))  
     50class FunctionClassFactory(FunctionClassFactoryBase): 
     51    """Class Factory for *-at-least-one-member-of XACML function classes 
     52    """ 
     53    FUNCTION_NS_SUFFIX = '-at-least-one-member-of' 
     54    FUNCTION_BASE_CLASS = AtLeastOneMemberOfBase 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/bag.py

    r6796 r6803  
    1212 
    1313from ndg.xacml.utils import TypedList as Bag 
    14 from ndg.xacml.core.functions import AbstractFunction, TYPE_MAP 
     14from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase 
    1515 
    1616 
     
    4545 
    4646 
    47 _thisModule = sys.modules[__name__] 
    48  
    49 for typeName, _type in TYPE_MAP.items(): 
    50     className = typeName + BagBase.FUNCTION_SUFFIX 
    51     classVars = { 
    52         'TYPE': _type, 
    53         'FUNCTION_NS': AbstractFunction.V1_0_FUNCTION_NS + typeName[0 
    54                 ].lower() + typeName[1:] + BagBase.FUNCTION_NS_SUFFIX 
    55     } 
    56     setattr(_thisModule, className, type(className, (BagBase, ), classVars))  
     47class FunctionClassFactory(FunctionClassFactoryBase): 
     48    """Class Factory for *-bag XACML function classes 
     49    """ 
     50    FUNCTION_NS_SUFFIX = '-bag' 
     51    FUNCTION_BASE_CLASS = BagBase  
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/equal.py

    r6796 r6803  
    99__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1010__revision__ = '$Id: $' 
    11 from datetime import datetime, timedelta 
    12 from ndg.xacml.core.functions import AbstractFunction 
     11#from datetime import datetime, timedelta 
     12from ndg.xacml.core.context.exceptions import XacmlContextTypeError 
     13from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase 
    1314 
    1415 
     
    2829        """ 
    2930        if not isinstance(string1, basestring): 
    30             raise TypeError('Expecting %r derived type for "string1"; got %r' % 
    31                             (self.__class__.TYPE, type(string1))) 
     31            raise XacmlContextTypeError('Expecting %r derived type for ' 
     32                                        '"string1"; got %r' % 
     33                                        (self.__class__.TYPE,  
     34                                         type(string1))) 
    3235             
    3336        if not isinstance(string2, self.__class__.TYPE): 
    34             raise TypeError('Expecting %r derived type for "string2"; got %r' % 
    35                             (self.__class__.TYPE, type(string2))) 
     37            raise XacmlContextTypeError('Expecting %r derived type for ' 
     38                                        '"string2"; got %r' % 
     39                                        (self.__class__.TYPE,  
     40                                         type(string2))) 
    3641             
    3742        return string1 == string2 
     43     
     44 
     45class FunctionClassFactory(FunctionClassFactoryBase): 
     46    """Class Factory for *-equal XACML function classes 
     47    """ 
     48    FUNCTION_NS_SUFFIX = '-equal' 
     49    FUNCTION_BASE_CLASS = EqualBase 
    3850 
    3951 
    40 # Dynamically create classes for all the types 
    41 FUNCTION_CLASS_MAP = { 
    42     'StringEqual': { 
    43         'TYPE': basestring,  
    44         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:string-equal' 
    45     }, 
    46          
    47     'AnyURIEqual': { 
    48         'TYPE': basestring,  
    49         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:anyURI-equal' 
    50     }, 
    51          
    52     'IntegerEqual': { 
    53         'TYPE': int,  
    54         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:integer-equal' 
    55     }, 
    56          
    57     'BooleanEqual': { 
    58         'TYPE': basestring,  
    59         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:boolean-equal' 
    60     }, 
    61          
    62     'DoubleEqual': { 
    63         'TYPE': float,  
    64         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:double-equal'   
    65     }, 
    66          
    67     'DateEqual': { 
    68         'TYPE': datetime,  
    69         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:date-equal' 
    70     }, 
    71          
    72     'DateTimeEqual': { 
    73         'TYPE': datetime,  
    74         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:dateTime-equal' 
    75     }, 
    76          
    77     'TimeEqual': { 
    78         'TYPE': datetime,  
    79         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:time-equal' 
    80     }, 
    81          
    82     'DayTimeDurationEqual': { 
    83         'TYPE': timedelta,  
    84         'FUNCTION_NS': \ 
    85             'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-equal' 
    86     }, 
    87      
    88     'YearMonthDurationEqual': { 
    89         'TYPE': timedelta,  
    90         'FUNCTION_NS': \ 
    91             'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-equal' 
    92     }, 
    93      
    94     'X500NameEqual': { 
    95         # TODO: refactor - basestring type is inadequate for X.500 name  
    96         # comparison 
    97         'TYPE': basestring,  
    98         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:x500Name-equal' 
    99     }, 
    100      
    101     'Rfc822NameEqual': { 
    102         # TODO: refactor - basestring type is inadequate for RFC822 name  
    103         # comparison 
    104         'TYPE': basestring,  
    105         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal' 
    106     }, 
    107      
    108     'HexBinaryEqual': { 
    109         'TYPE': int,  
    110         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal' 
    111     }, 
    112      
    113     'Base64BinaryEqual': { 
    114         'TYPE': int,  
    115         'FUNCTION_NS': \ 
    116             'urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal' 
    117     } 
    118 } 
     52## Dynamically create classes for all the types 
     53#FUNCTION_CLASS_MAP = { 
     54#    'StringEqual': { 
     55#        'TYPE': basestring,  
     56#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:string-equal' 
     57#    }, 
     58#         
     59#    'AnyURIEqual': { 
     60#        'TYPE': basestring,  
     61#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:anyURI-equal' 
     62#    }, 
     63#         
     64#    'IntegerEqual': { 
     65#        'TYPE': int,  
     66#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:integer-equal' 
     67#    }, 
     68#         
     69#    'BooleanEqual': { 
     70#        'TYPE': basestring,  
     71#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:boolean-equal' 
     72#    }, 
     73#         
     74#    'DoubleEqual': { 
     75#        'TYPE': float,  
     76#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:double-equal'   
     77#    }, 
     78#         
     79#    'DateEqual': { 
     80#        'TYPE': datetime,  
     81#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:date-equal' 
     82#    }, 
     83#         
     84#    'DateTimeEqual': { 
     85#        'TYPE': datetime,  
     86#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:dateTime-equal' 
     87#    }, 
     88#         
     89#    'TimeEqual': { 
     90#        'TYPE': datetime,  
     91#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:time-equal' 
     92#    }, 
     93#         
     94#    'DayTimeDurationEqual': { 
     95#        'TYPE': timedelta,  
     96#        'FUNCTION_NS': \ 
     97#            'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-equal' 
     98#    }, 
     99#     
     100#    'YearMonthDurationEqual': { 
     101#        'TYPE': timedelta,  
     102#        'FUNCTION_NS': \ 
     103#            'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-equal' 
     104#    }, 
     105#     
     106#    'X500NameEqual': { 
     107#        # TODO: refactor - basestring type is inadequate for X.500 name  
     108#        # comparison 
     109#        'TYPE': basestring,  
     110#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:x500Name-equal' 
     111#    }, 
     112#     
     113#    'Rfc822NameEqual': { 
     114#        # TODO: refactor - basestring type is inadequate for RFC822 name  
     115#        # comparison 
     116#        'TYPE': basestring,  
     117#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal' 
     118#    }, 
     119#     
     120#    'HexBinaryEqual': { 
     121#        'TYPE': int,  
     122#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal' 
     123#    }, 
     124#     
     125#    'Base64BinaryEqual': { 
     126#        'TYPE': int,  
     127#        'FUNCTION_NS': \ 
     128#            'urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal' 
     129#    } 
     130#} 
     131# 
     132#import sys 
     133#_thisModule = sys.modules[__name__] 
     134# 
     135#for className, classVars in FUNCTION_CLASS_MAP.items(): 
     136#    setattr(_thisModule, className, type(className, (EqualBase, ), classVars)) 
    119137 
    120 import sys 
    121 _thisModule = sys.modules[__name__] 
    122  
    123 for className, classVars in FUNCTION_CLASS_MAP.items(): 
    124     setattr(_thisModule, className, type(className, (EqualBase, ), classVars)) 
    125  
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/one_and_only.py

    r6796 r6803  
    99__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1010__revision__ = '$Id: $' 
    11 from datetime import datetime, timedelta 
     11#from datetime import datetime, timedelta 
    1212 
    13 from ndg.xacml.core.functions import AbstractFunction 
     13from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase 
    1414from ndg.xacml.utils import TypedList as Bag 
    1515from ndg.xacml.core.context.exceptions import XacmlContextError 
     
    4343        return bag[0] 
    4444     
    45 # Dynamically create classes for all the types 
    46 FUNCTION_CLASS_MAP = { 
    47     'StringOneAndOnly': { 
    48         'BAG_TYPE': basestring,  
    49         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:string-equal' 
    50     }, 
    51          
    52     'AnyURIOneAndOnly': { 
    53         'BAG_TYPE': basestring,  
    54         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:anyURI-equal' 
    55     }, 
    56          
    57     'IntegerOneAndOnly': { 
    58         'BAG_TYPE': int,  
    59         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:integer-equal' 
    60     }, 
    61          
    62     'BooleanOneAndOnly': { 
    63         'BAG_BAG_TYPE': basestring,  
    64         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:boolean-equal' 
    65     }, 
    66          
    67     'DoubleOneAndOnly': { 
    68         'BAG_TYPE': float,  
    69         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:double-equal'   
    70     }, 
    71          
    72     'DateOneAndOnly': { 
    73         'BAG_TYPE': datetime,  
    74         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:date-equal' 
    75     }, 
    76          
    77     'DateTimeOneAndOnly': { 
    78         'BAG_TYPE': datetime,  
    79         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:dateTime-equal' 
    80     }, 
    81          
    82     'TimeOneAndOnly': { 
    83         'BAG_TYPE': datetime,  
    84         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:time-equal' 
    85     }, 
    86          
    87     'DayTimeDurationOneAndOnly': { 
    88         'BAG_TYPE': timedelta,  
    89         'FUNCTION_NS': \ 
    90             'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-equal' 
    91     }, 
    92      
    93     'YearMonthDurationOneAndOnly': { 
    94         'BAG_TYPE': timedelta,  
    95         'FUNCTION_NS': \ 
    96             'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-equal' 
    97     }, 
    98      
    99     'X500NameOneAndOnly': { 
    100         # TODO: refactor - basestring type is inadequate for X.500 name  
    101         # comparison 
    102         'BAG_TYPE': basestring,  
    103         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:x500Name-equal' 
    104     }, 
    105      
    106     'Rfc822NameOneAndOnly': { 
    107         # TODO: refactor - basestring type is inadequate for RFC822 name  
    108         # comparison 
    109         'BAG_TYPE': basestring,  
    110         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal' 
    111     }, 
    112      
    113     'HexBinaryOneAndOnly': { 
    114         'BAG_TYPE': int,  
    115         'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal' 
    116     }, 
    117      
    118     'Base64BinaryOneAndOnly': { 
    119         'BAG_TYPE': int,  
    120         'FUNCTION_NS': \ 
    121             'urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal' 
    122     } 
    123 } 
    12445 
    125 import sys 
    126 _thisModule = sys.modules[__name__] 
    127  
    128 for className, classVars in FUNCTION_CLASS_MAP.items(): 
    129     setattr(_thisModule,  
    130             className,  
    131             type(className, (OneAndOnlyBase, ), classVars))    
     46class FunctionClassFactory(FunctionClassFactoryBase): 
     47    """Class Factory for *-one-and-only XACML function classes 
     48    """ 
     49    FUNCTION_NS_SUFFIX = '-one-and-only' 
     50    FUNCTION_BASE_CLASS = OneAndOnlyBase 
     51        
     52## Dynamically create classes for all the types 
     53#FUNCTION_CLASS_MAP = { 
     54#    'StringOneAndOnly': { 
     55#        'BAG_TYPE': basestring,  
     56#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:string-equal' 
     57#    }, 
     58#         
     59#    'AnyURIOneAndOnly': { 
     60#        'BAG_TYPE': basestring,  
     61#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:anyURI-equal' 
     62#    }, 
     63#         
     64#    'IntegerOneAndOnly': { 
     65#        'BAG_TYPE': int,  
     66#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:integer-equal' 
     67#    }, 
     68#         
     69#    'BooleanOneAndOnly': { 
     70#        'BAG_BAG_TYPE': basestring,  
     71#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:boolean-equal' 
     72#    }, 
     73#         
     74#    'DoubleOneAndOnly': { 
     75#        'BAG_TYPE': float,  
     76#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:double-equal'   
     77#    }, 
     78#         
     79#    'DateOneAndOnly': { 
     80#        'BAG_TYPE': datetime,  
     81#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:date-equal' 
     82#    }, 
     83#         
     84#    'DateTimeOneAndOnly': { 
     85#        'BAG_TYPE': datetime,  
     86#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:dateTime-equal' 
     87#    }, 
     88#         
     89#    'TimeOneAndOnly': { 
     90#        'BAG_TYPE': datetime,  
     91#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:time-equal' 
     92#    }, 
     93#         
     94#    'DayTimeDurationOneAndOnly': { 
     95#        'BAG_TYPE': timedelta,  
     96#        'FUNCTION_NS': \ 
     97#            'urn:oasis:names:tc:xacml:1.0:function:dayTimeDuration-equal' 
     98#    }, 
     99#     
     100#    'YearMonthDurationOneAndOnly': { 
     101#        'BAG_TYPE': timedelta,  
     102#        'FUNCTION_NS': \ 
     103#            'urn:oasis:names:tc:xacml:1.0:function:yearMonthDuration-equal' 
     104#    }, 
     105#     
     106#    'X500NameOneAndOnly': { 
     107#        # TODO: refactor - basestring type is inadequate for X.500 name  
     108#        # comparison 
     109#        'BAG_TYPE': basestring,  
     110#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:x500Name-equal' 
     111#    }, 
     112#     
     113#    'Rfc822NameOneAndOnly': { 
     114#        # TODO: refactor - basestring type is inadequate for RFC822 name  
     115#        # comparison 
     116#        'BAG_TYPE': basestring,  
     117#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal' 
     118#    }, 
     119#     
     120#    'HexBinaryOneAndOnly': { 
     121#        'BAG_TYPE': int,  
     122#        'FUNCTION_NS': 'urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal' 
     123#    }, 
     124#     
     125#    'Base64BinaryOneAndOnly': { 
     126#        'BAG_TYPE': int,  
     127#        'FUNCTION_NS': \ 
     128#            'urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal' 
     129#    } 
     130#} 
     131# 
     132#import sys 
     133#_thisModule = sys.modules[__name__] 
     134# 
     135#for className, classVars in FUNCTION_CLASS_MAP.items(): 
     136#    setattr(_thisModule,  
     137#            className,  
     138#            type(className, (OneAndOnlyBase, ), classVars))    
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/round.py

    r6796 r6803  
    99__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1010__revision__ = '$Id: $' 
    11 from ndg.xacml.core.functions import AbstractFunction 
    12 from ndg.xacml.core.context.exceptions import XacmlContextError 
     11from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase 
     12from ndg.xacml.core.context.exceptions import XacmlContextTypeError 
    1313 
    1414 
    15 class Round(AbstractFunction): 
    16     """Base class for XACML <type>-one-and-only functions""" 
     15class RoundBase(AbstractFunction): 
     16    """Base class for XACML <type>-round functions""" 
    1717    FUNCTION_NS = AbstractFunction.V1_0_FUNCTION_NS + 'round' 
    1818     
     
    2626            return round(num) 
    2727        except TypeError, e: 
    28             raise XacmlContextError('Round function: %s' % e) 
     28            raise XacmlContextTypeError('Round function: %s' % e) 
     29 
     30     
     31 
     32class FunctionClassFactory(FunctionClassFactoryBase): 
     33    """Class Factory for *-round XACML function classes 
     34    """ 
     35    FUNCTION_NS_SUFFIX = '-round' 
     36    FUNCTION_BASE_CLASS = RoundBase 
  • TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v2/regexp_match.py

    r6797 r6803  
    1010__revision__ = '$Id: $' 
    1111import re 
    12 import sys 
     12#import sys 
    1313 
    14 from ndg.xacml.core.functions import AbstractFunction 
     14from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase 
     15from ndg.xacml.core.context.exceptions import XacmlContextTypeError 
    1516 
    1617 
     
    2223    CLASS_NAME_SUFFIX = 'RegexpMatch' 
    2324    TYPE = None 
    24     TYPE_MAP = {}.fromkeys( 
    25         ('AnyURI',  
    26         'IpAddress',  
    27         'DnsName', 
    28         'Rfc822Name', 
    29         'X500Name'), 
    30         basestring) 
     25#    TYPE_MAP = {}.fromkeys( 
     26#        ('AnyURI',  
     27#        'IpAddress',  
     28#        'DnsName', 
     29#        'Rfc822Name', 
     30#        'X500Name'), 
     31#        basestring) 
    3132     
    3233    def evaluate(self, pat, input): 
     
    5051        return bool(re.match(pat, input)) 
    5152     
    52 _thisModule = sys.modules[__name__] 
    5353 
    54 for typeName, _type in RegexpMatchBase.TYPE_MAP.items(): 
    55     className = typeName + RegexpMatchBase.CLASS_NAME_SUFFIX 
    56     classVars = { 
    57         'TYPE': _type, 
    58         'FUNCTION_NS': AbstractFunction.V2_0_FUNCTION_NS + typeName[0 
    59             ].lower() + typeName[1:] + RegexpMatchBase.FUNCTION_NS_SUFFIX 
    60     } 
    61     setattr(_thisModule,  
    62             className,  
    63             type(className, (RegexpMatchBase, ), classVars))  
     54class FunctionClassFactory(FunctionClassFactoryBase): 
     55    """Class Factory for *-regexp-match XACML function classes 
     56    """ 
     57    FUNCTION_NS_SUFFIX = RegexpMatchBase.FUNCTION_NS_SUFFIX 
     58    FUNCTION_BASE_CLASS = RegexpMatchBase 
     59     
     60         
     61#_thisModule = sys.modules[__name__] 
     62# 
     63#for typeName, _type in RegexpMatchBase.TYPE_MAP.items(): 
     64#    className = typeName + RegexpMatchBase.CLASS_NAME_SUFFIX 
     65#    classVars = { 
     66#        'TYPE': _type, 
     67#        'FUNCTION_NS': AbstractFunction.V2_0_FUNCTION_NS + typeName[0 
     68#            ].lower() + typeName[1:] + RegexpMatchBase.FUNCTION_NS_SUFFIX 
     69#    } 
     70#    setattr(_thisModule,  
     71#            className,  
     72#            type(className, (RegexpMatchBase, ), classVars))  
Note: See TracChangeset for help on using the changeset viewer.