diff -r 000000000000 -r 2e8eeb919028 configurationengine/source/cone/confml/model.py --- /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]() +