source: TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/one_and_only.py @ 6803

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDG_XACML/ndg/xacml/core/functions/v1/one_and_only.py@6803
Revision 6803, 4.4 KB checked in by pjkersha, 9 years ago (diff)

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

Line 
1"""NDG XACML one and only functions module
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "01/04/10"
7__copyright__ = ""
8__license__ = "BSD - see LICENSE file in top-level directory"
9__contact__ = "Philip.Kershaw@stfc.ac.uk"
10__revision__ = '$Id: $'
11#from datetime import datetime, timedelta
12
13from ndg.xacml.core.functions import AbstractFunction, FunctionClassFactoryBase
14from ndg.xacml.utils import TypedList as Bag
15from ndg.xacml.core.context.exceptions import XacmlContextError
16
17
18class OneAndOnlyBase(AbstractFunction):
19    """Base class for XACML <type>-one-and-only functions"""
20    BAG_TYPE = None
21   
22    def evaluate(self, bag):
23        """Check a bag has one element only and return it
24       
25        @param bag: bag containing one element
26        @rtype: bool
27        """
28        if not isinstance(bag, Bag):
29            raise XacmlContextError('Expecting %r derived type for "bag"; '
30                                    'got %r' % (Bag, type(bag)))
31           
32        if bag.elementType != self.__class__.BAG_TYPE:
33            raise XacmlContextError('Expecting %r type elements for "bag"; '
34                                    'got %r' %
35                                    (self.__class__.BAG_TYPE, bag.elementType))
36                       
37        nBagElems = len(bag)
38        if nBagElems != 1:
39            raise XacmlContextError('Expecting single element for %r bag; got '
40                                    '%r' %
41                                    (self.__class__.BAG_TYPE, nBagElems))
42           
43        return bag[0]
44   
45
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))   
Note: See TracBrowser for help on using the repository browser.