configurationengine/source/cone/confml/model.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,982 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Base class for Confml elements.
+Attributes:
+ All Confml element attributes become attributes of this instance.
+"""
+import types
+from cone.public import api, exceptions, container, utils
+
+class ConfmlElement(api.Base):
+    def _get_mapper(self,modelname):
+        """
+        Return a instance of appropriate mapper for given model.
+        """
+        mapmodule = __import__('cone.confml.mapping')
+        return mapmodule.confml.mapping.MAPPERS[modelname]()
+
+    def get_desc(self): 
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+
+    def set_desc(self,value): 
+        self._add(ConfmlDescription(value))
+
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+class ConfmlConfiguration(ConfmlElement, api.Configuration):
+    """
+    Confml configuration class. 
+    """
+    def __init__(self,ref="", **kwargs):
+        super(ConfmlConfiguration,self).__init__(ref, **kwargs)
+        if kwargs.get('meta'):
+            self.meta = kwargs.get('meta')
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+
+
+    def get_desc(self): 
+        """
+        @return: The description of the Configuration.
+        """
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+
+    def set_desc(self,value): 
+        self._add(ConfmlDescription(value))
+
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+
+    def get_meta(self): 
+        """
+        @return: The description of the Configuration.
+        """
+        try:
+            meta = getattr(self,ConfmlMeta.refname)
+            return meta
+        except AttributeError:
+            return None
+
+    def set_meta(self,value): 
+        self._add(ConfmlMeta(value))
+
+    def del_meta(self): 
+        try:
+            self._remove(ConfmlMeta.refname)
+        except exceptions.NotFound:
+            pass
+
+    """ The meta element as a property """
+    meta = property(get_meta,set_meta,del_meta)
+
+
+class ConfmlGroup(ConfmlElement, api.Group):
+    """
+    Confml view.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(ConfmlGroup,self).__init__(ref,**kwargs)
+        if kwargs.get('icon'):
+            self.icon = kwargs.get('icon')
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+
+    def get_icon(self): 
+        try:
+            icon = getattr(self,ConfmlIcon.refname)
+            return icon.href
+        except AttributeError:
+            return None
+    def set_icon(self,value): self._add(ConfmlIcon(value))
+    def del_icon(self): 
+        try:
+            self._remove(ConfmlIcon.refname)
+        except exceptions.NotFound:
+            pass
+    """ The icon as a property """
+    icon = property(get_icon,set_icon,del_icon)
+
+    def get_desc(self): 
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+    def set_desc(self,value): self._add(ConfmlDescription(value))
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+
+
+class ConfmlView(api.View):
+    """
+    Confml view.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(ConfmlView,self).__init__(ref,**kwargs)
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+
+
+    def get_desc(self): 
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+    def set_desc(self,value): self._add(ConfmlDescription(value))
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+
+class ConfmlFeature(ConfmlElement, api.Feature):
+    pass
+
+class ConfmlSetting(ConfmlElement, api.Feature):
+    """
+    Confml setting class. Attribute 'options' contains options of this setting.
+    """
+    supported_types = ['int',
+                       'string',
+                       'boolean',
+                       'selection']
+    def __init__(self, ref,**kwargs):
+        super(ConfmlSetting,self).__init__(ref,**kwargs)
+        self.type = kwargs.get('type',None)
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+        if kwargs.get('minOccurs'):
+            self.minOccurs = kwargs.get('minOccurs')
+        if kwargs.get('maxOccurs'):
+            self.maxOccurs = kwargs.get('maxOccurs')
+        if kwargs.get('maxLength'):
+            self.maxLength = kwargs.get('maxLength')
+        if kwargs.get('minLength'):
+            self.minLength = kwargs.get('minLength')
+        if kwargs.get('mapKey'):
+            self.mapKey = kwargs.get('mapKey')
+        if kwargs.get('mapValue'):
+            self.mapValue = kwargs.get('mapValue')
+        
+        self.readOnly = kwargs.get('readOnly',None)
+        self.constraint = kwargs.get('constraint',None)
+        self.required = kwargs.get('required',None)
+        self.relevant = kwargs.get('relevant',None)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueRe('.*')
+
+    def add_property(self, **kwargs):
+        """
+        @param name=str: property name 
+        @param value=str: property value
+        @param unit=str: property unit, e.g. kB
+        """
+        self._add(ConfmlProperty(**kwargs), container.APPEND)
+
+    def get_property(self, name):
+        """
+        @param name: The name of the property
+        """
+        for property in utils.get_list(self._get(ConfmlProperty.refname)):
+            if property.name == name:
+                return property
+        raise exceptions.NotFound("ConfmlProperty with name %s not found!" % name)
+
+    def remove_property(self, name):
+        """
+        remove a given option from this feature by name. 
+        @param name: 
+        """
+        for property in self._get(ConfmlProperty.refname):
+            if property.name == name:
+                return self._remove(property.get_fullref())
+        raise exceptions.NotFound("ConfmlProperty with name %s not found!" % name)
+
+    def list_properties(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [obj.name for obj in utils.get_list(self._get(ConfmlProperty.refname))]
+
+    def get_maxlength(self): 
+        try:
+            return getattr(self,ConfmlMaxLength.refname).value
+        except AttributeError:
+            return None
+
+    def set_maxlength(self,value): 
+        self._add(ConfmlMaxLength(value))
+
+    def del_maxlength(self): 
+        try:
+            self._remove(ConfmlMaxLength.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    maxLength = property(get_maxlength,set_maxlength,del_maxlength)
+
+    def get_minlength(self): 
+        try:
+            return getattr(self,ConfmlMinLength.refname).value
+        except AttributeError:
+            return None
+
+    def set_minlength(self,value): 
+        self._add(ConfmlMinLength(value))
+
+    def del_minlength(self): 
+        try:
+            self._remove(ConfmlMinLength.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    minLength = property(get_minlength,set_minlength,del_minlength)
+
+    def get_minInclusive(self): 
+        try:
+            return getattr(self,ConfmlMinInclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_minInclusive(self,value): 
+        self._add(ConfmlMinInclusive(value))
+
+    def del_minInclusive(self): 
+        try:
+            self._remove(ConfmlMinInclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The minInclusive as a property """
+    minInclusive = property(get_minInclusive,set_minInclusive,del_minInclusive)
+
+    def get_maxInclusive(self): 
+        try:
+            return getattr(self,ConfmlMaxInclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_maxInclusive(self,value): 
+        self._add(ConfmlMaxInclusive(value))
+
+    def del_maxInclusive(self): 
+        try:
+            self._remove(ConfmlMaxInclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The minInclusive as a property """
+    maxInclusive = property(get_maxInclusive,set_maxInclusive,del_maxInclusive)
+
+    def get_minExclusive(self): 
+        try:
+            return getattr(self,ConfmlMinExclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_minExclusive(self,value): 
+        self._add(ConfmlMinExclusive(value))
+
+    def del_minExclusive(self): 
+        try:
+            self._remove(ConfmlMinExclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The minExclusive as a property """
+    minExclusive = property(get_minExclusive,set_minExclusive,del_minExclusive)
+
+    def get_maxExclusive(self): 
+        try:
+            return getattr(self,ConfmlMaxExclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_maxExclusive(self,value): 
+        self._add(ConfmlMaxExclusive(value))
+
+    def del_maxExclusive(self): 
+        try:
+            self._remove(ConfmlMaxExclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The maxExclusive as a property """
+    maxExclusive = property(get_maxExclusive,set_maxExclusive,del_maxExclusive)
+
+    def get_pattern(self): 
+        try:
+            return getattr(self,ConfmlPattern.refname).value
+        except AttributeError:
+            return None
+
+    def set_pattern(self,value): 
+        self._add(ConfmlPattern(value))
+
+    def del_pattern(self): 
+        try:
+            self._remove(ConfmlPattern.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The pattern as a property """
+    pattern = property(get_pattern,set_pattern,del_pattern)
+
+    def get_totalDigits(self): 
+        try:
+            return getattr(self,ConfmlTotalDigits.refname).value
+        except AttributeError:
+            return None
+
+    def set_totalDigits(self,value): 
+        self._add(ConfmlTotalDigits(value))
+
+    def del_totalDigits(self): 
+        try:
+            self._remove(ConfmlTotalDigits.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The totalDigits as a property """
+    totalDigits = property(get_totalDigits,set_totalDigits,del_totalDigits)
+
+    @property
+    def options(self):
+        optdict = {}
+        for opt in self._objects(type=api.Option):
+            optdict[opt.value] = opt
+        return  optdict
+
+    @property
+    def properties(self):
+        dict = {}
+        for property in utils.get_list(self._get(ConfmlProperty.refname)):
+            dict[property.name] = property
+        return  dict
+
+    def get_rfs(self,):
+        return super(ConfmlSetting,self).get_value('rfs')
+
+    def set_rfs(self, value):
+        super(ConfmlSetting,self).set_value('rfs',value)
+
+    def del_rfs(self):
+        super(ConfmlSetting,self).del_value('rfs')
+
+    rfs = property(get_rfs,set_rfs,del_rfs)
+
+    def get_value_cast(self, value, attr=None):
+        """
+        A function to perform the value type casting in get operation  
+        @param value: the value to cast 
+        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
+        """
+        if not attr or attr == 'data':
+            return self.get_data_cast(value)
+        elif attr == 'rfs':
+            return self.get_rfs_cast(value)
+        else:
+            return value
+    
+    def set_value_cast(self, value, attr=None):
+        """
+        A function to perform the value type casting in the set operation  
+        @param value: the value to cast 
+        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
+        """
+        if not attr or attr == 'data':
+            return self.set_data_cast(value)
+        elif attr == 'rfs':
+            return self.set_rfs_cast(value)
+        else:
+            return value
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the data type casting in get operation  
+        @param value: the value to cast 
+        """
+        return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the data type casting in the set operation  
+        @param value: the value to cast 
+        """
+        return value
+
+    def get_rfs_cast(self, value):
+        """
+        A function to perform the rfs type casting in get operation  
+        @param value: the value to cast 
+        """
+        if value == 'true':
+            return True
+        elif value == 'false':
+            return False
+        else: # otherwise this is an invalid rfs value. Should it report an error?
+            return value
+    
+    def set_rfs_cast(self, value):
+        """
+        A function to perform the rfs type casting in the set operation  
+        @param value: the value to cast 
+        """
+        if value:
+            return 'true'
+        else: 
+            return 'false'
+
+
+class ConfmlStringSetting(ConfmlSetting):
+    """
+    Confml setting class for integer type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'string'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+
+class ConfmlIntSetting(ConfmlSetting):
+    """
+    Confml setting class for integer type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'int'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueRange(0,sys.maxint)
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        if value:
+            try:
+                return int(value)
+            except ValueError:
+                return int(value, 16)
+        else:
+            return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        return str(int(value))
+
+
+class ConfmlRealSetting(ConfmlSetting):
+    """
+    Confml setting class for real type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'real'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueRange(0,float(sys.maxint))
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        if value:
+            return float(value)
+        else:
+            return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        return str(float(value))
+
+
+
+
+class ConfmlBooleanSetting(ConfmlSetting):
+    """
+    Confml setting class for boolean type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'boolean'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueSet([True,False])
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        if value:
+            if value in ('true', '1'):
+                return True
+            else:
+                return False
+        else:
+            return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        if isinstance(value, basestring):
+            if value in ('false', '0'):
+                return 'false'
+            elif value in ('true', '1'):
+                return 'true'
+        
+        return str(bool(value)).lower()
+
+
+class ConfmlSelectionSetting(ConfmlSetting):
+    """
+    Confml setting class for boolean type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'selection'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+    
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.Feature.get_valueset(self)
+
+class ConfmlMultiSelectionSetting(ConfmlSetting):
+    """
+    Confml setting class for multiSelection type.
+    """
+
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'multiSelection'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+        
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.Feature.get_valueset(self)
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        try:
+            if not isinstance(value, types.ListType):
+                values = value.split('" "')
+                for i in range(len(values)):
+                    if values[i].startswith('"'):
+                        values[i] = values[i][1:] 
+                    if values[i].endswith('"'):
+                        values[i] = values[i][:-1]
+                return values
+            return value
+        except AttributeError:
+            return None
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        
+        if isinstance(value, list):
+            value = " ".join(['"%s"' % elem for elem in value])
+        return value
+    
+    def set_value(self, value):
+        if not isinstance(value, types.ListType):
+            raise ValueError("Only list types are allowed.")
+        self.value = value
+
+class ConfmlDateSetting(ConfmlSetting):
+    """
+    Confml setting class for date type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'date'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlTimeSetting(ConfmlSetting):
+    """
+    Confml setting class for time type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'time'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlDateTimeSetting(ConfmlSetting):
+    """
+    Confml setting class for date-time type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'dateTime'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlDurationSetting(ConfmlSetting):
+    """
+    Confml setting class for date type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'duration'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlSequenceSetting(api.FeatureSequence,ConfmlSetting):
+    """
+    Confml setting class. Attribute 'options' contains options of this setting.
+    """
+    def __init__(self, ref,**kwargs):
+        ConfmlSetting.__init__(self,ref,**kwargs)
+        api.FeatureSequence.__init__(self,ref,**kwargs)
+
+class ConfmlFileSetting(ConfmlSetting):
+    """
+    Confml file setting class.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'file'
+        ConfmlSetting.__init__(self, ref, **kwargs)
+        """
+        The file element always includes localPath and targetPath child elements.
+        """
+        self.add_feature(ConfmlLocalPath())
+        self.add_feature(ConfmlTargetPath())
+
+class ConfmlFolderSetting(ConfmlSetting):
+    """
+    Confml folder setting class.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'folder'
+        ConfmlSetting.__init__(self, ref, **kwargs)
+        """
+        The folder element always includes localPath and targetPath child elements.
+        """
+        self.add_feature(ConfmlLocalPath())
+        self.add_feature(ConfmlTargetPath())
+
+class ConfmlLocalPath(ConfmlElement, api.Feature):
+    """
+    Confml file class. Attribute setting.
+    """
+    def __init__(self, ref='localPath', **kwargs):
+        kwargs['type'] = 'string'
+        ConfmlElement.__init__(self, **kwargs)
+        api.Feature.__init__(self, ref, **kwargs)
+        self.readOnly = kwargs.get('readOnly', None)
+
+
+class ConfmlTargetPath(ConfmlElement, api.Feature):
+    """
+    Confml file class. Attribute setting.
+    """
+    def __init__(self, ref='targetPath', **kwargs):
+        kwargs['type'] = 'string'
+        ConfmlElement.__init__(self, **kwargs)
+        api.Feature.__init__(self, ref, **kwargs)
+        self.readOnly = kwargs.get('readOnly', None)
+
+
+class ConfmlMeta(api.Base):
+    """
+    Confml meta element
+    """
+    refname = "_meta"
+    def __init__(self, array=None, **kwargs):
+        super(ConfmlMeta,self).__init__(self.refname)
+        self.array  = []
+        if array:            
+            self.array += array
+
+    def __getitem__(self, key):
+        return self.array[key]
+ 
+    def __delitem__(self, key):
+        del self.array[key]
+
+    def __setitem__(self, key, value):
+        self.array[key] = value
+
+    def __str__(self):
+        tempstr = "ConfmlMeta object\n"
+        counter = 0
+        for item in self.array:
+            tempstr += "\t%d: %s\n" % (counter, item.__str__())
+            counter += 1
+        return tempstr 
+
+    def __cmp__(self, other):
+        try:
+            for item in self.array:
+                if item != other.array[self.array.index(item)]:
+                    return 1
+        except:
+            return 1
+        return 0
+
+    def append(self, value):
+        self.array.append(value)
+
+    def add(self, tag, value, ns=None, attributes=None):
+        self.array.append(ConfmlMetaProperty(tag, value, ns, attrs=attributes))
+
+    def get(self, tag, default=None):
+        """
+        Try to find the element by its tag in the meta elem array.
+        @param tag: the tag that is searched,
+        @param default: return the default value if the element is not found. 
+        @return: the value of the ConfmlMetaProperty object if it is found. Default value 
+        if element with tag is not found.
+        """
+        for item in self.array:
+            if item.tag == tag:
+                return item.value
+        return default
+
+    def replace(self, index, tag, value, ns=None, dict=None):
+        self.array[index] = ConfmlMetaProperty(tag, value, ns, attrs=dict)
+
+    def clear(self, value):
+        self.array = []
+
+    def clone(self):
+        newMeta = ConfmlMeta()
+        for item in self.array:
+            newProp = ConfmlMetaProperty(item.tag, item.value, item.ns, attrs = item.attrs)
+            newMeta.append(newProp)
+        return newMeta
+
+    def find_by_tag(self, value):
+        for item in self.array:
+            if item.tag == value:
+                return self.array.index(item)
+        return -1
+
+    def find_by_attribute(self, name, value):
+        for item in self.array:
+            if item.attrs.has_key(name) and item.attrs[name] == value: 
+                return self.array.index(item)
+        return -1
+
+    def get_property_by_tag(self, tag):
+        """
+        Try to find the element by its tag in the meta elem array.
+        @param tag: the tag that is searched
+        @return: the ConfmlMetaProperty object if it is found. None if element with tag is not found.
+        """
+        for item in self.array:
+            if item.tag == tag:
+                return item
+        return None
+
+
+class ConfmlDescription(api.Base):
+    """
+    Confml description element
+    """
+    refname = "_desc"
+    def __init__(self, text=None, **kwargs):
+        super(ConfmlDescription,self).__init__(self.refname)
+        self.text = text or ''
+
+
+class ConfmlIcon(api.Base):
+    """
+    Confml icon element
+    """
+    refname = "_icon"
+    def __init__(self, href='', **kwargs):
+        super(ConfmlIcon,self).__init__(self.refname)
+        self.href = href
+
+
+class ConfmlProperty(api.Base):
+    """
+    Confml meta element
+    """
+    refname = "_property"
+    def __init__(self, **kwargs):
+        """
+        @param name=str: name string 
+        @param value=str: value for the property, string 
+        @param unit=str: unit of the property
+        """
+        super(ConfmlProperty,self).__init__(self.refname)
+        self.name = kwargs.get('name',None)
+        self.value = kwargs.get('value',None)
+        self.unit = kwargs.get('unit',None)
+
+
+class ConfmlMetaProperty(api.Base):
+    """
+    Confml meta property element
+    """
+    refname = "_metaproperty"
+    def __init__(self, tag, value = None, ns = None, **kwargs):
+        """
+        """
+        super(ConfmlMetaProperty,self).__init__(self.refname)
+        self.tag = tag
+        self.value = value
+        self.ns = ns
+        if kwargs.has_key("attrs") and kwargs["attrs"] != None:
+            self.attrs = dict(kwargs["attrs"])
+        else:
+            self.attrs = {}
+
+    def __cmp__(self, other):
+        try:
+            if self.tag != other.tag or self.value != other.value\
+                or self.ns != other.ns or self.attrs != other.attrs:
+                return 1
+        except:
+            return 1
+        return 0
+
+    def __str__(self):
+        return "Tag: %s Value: %s Namespace: %s Attributes: % s" % (self.tag, self.value, self.ns, repr(self.attrs))         
+        
+            
+
+class ConfmlLength(api.Base):
+    """
+    Confml length element
+    """
+    refname = "_length"
+    def __init__(self, value, **kwargs):
+        super(ConfmlLength,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMaxLength(api.Base):
+    """
+    Confml max element
+    """
+    refname = "_maxLength"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMaxLength,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMinLength(api.Base):
+    """
+    Confml min element
+    """
+    refname = "_minLength"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMinLength,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMinInclusive(api.Base):
+    """
+    Confml minInclusive element
+    """
+    refname = "_minInclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMinInclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMaxInclusive(api.Base):
+    """
+    Confml minInclusive element
+    """
+    refname = "_maxInclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMaxInclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMinExclusive(api.Base):
+    """
+    Confml minExclusive element
+    """
+    refname = "_minExclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMinExclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMaxExclusive(api.Base):
+    """
+    Confml maxExclusive element
+    """
+    refname = "_maxExclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMaxExclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlPattern(api.Base):
+    """
+    Confml pattern element
+    """
+    refname = "_pattern"
+    def __init__(self, value, **kwargs):
+        super(ConfmlPattern,self).__init__(self.refname)
+        self.value = value   
+
+class ConfmlTotalDigits(api.Base):
+    """
+    Confml totalDigits element
+    """
+    refname = "_totalDigits"
+    def __init__(self, value, **kwargs):
+        super(ConfmlTotalDigits,self).__init__(self.refname)
+        self.value = value
+
+def get_mapper(modelname):
+    """
+    Return a instance of appropriate mapper for given model.
+    """
+    mapmodule = __import__('cone.confml.mapping')
+    return mapmodule.confml.mapping.MAPPERS[modelname]()
+