diff -r 000000000000 -r 2e8eeb919028 configurationengine/source/cone/storage/configurationpersistence.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configurationengine/source/cone/storage/configurationpersistence.py Thu Mar 11 17:04:37 2010 +0200 @@ -0,0 +1,118 @@ +# +# 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: +# + +from cone.public import persistence + +# list of namespaces supported. the first one in the list is always used in writing +CONFIGURATION_NAMESPACES = ["http://www.s60.com/xml/confml/1"] +INCLUDE_NAMESPACES = ["http://www.w3.org/2001/xinclude","http://www.w3.org/2001/XInclude"] + +class ConfigurationReader(persistence.ConeReader): + """ + Parses a single CPF configuration project root confml file. Parses the XInclude statements to + find out the layers inside the project + """ + + class_type = "Configuration" + + def __init__(self): + self.configuration_namespaces = CONFIGURATION_NAMESPACES + self.include_namespaces = INCLUDE_NAMESPACES + + def fromstring(self, xml_as_string): + configuration = api.CompositeConfiguration(None) + etree = ElementTree.fromstring(xml_as_string) + configuration.desc = self.parse_desc(etree) + configuration.meta = self.parse_meta(etree) + configuration.set_name(self.parse_name(etree)) + for inc in self.parse_includes(etree): + configuration.add_layer(inc) + + return configuration + + def parse_includes(self,etree): + include_elems = [] + include_elems.extend(etree.getiterator("{%s}include" % self.include_namespaces[0])) + include_elems.extend(etree.getiterator("{%s}include" % self.include_namespaces[1])) + includes = [] + for inc in include_elems: + includes.append(inc.get('href').replace('#/','')) + return includes + + def parse_meta(self,etree): + meta_elem = etree.find("{%s}meta" % self.configuration_namespaces[0]) + meta = {} + if meta_elem: + # There must be a nicer way to do this!! :( + for elem in meta_elem.getiterator(): + m = re.match("{.*}(?P.*)",elem.tag) + if m and m.group('tagname') != 'meta': + meta[m.group('tagname')] = elem.text + return meta + + def parse_desc(self,etree): + desc = "" + desc_elem = etree.find("{%s}desc" % self.configuration_namespaces[0]) + if desc_elem != None: + desc = desc_elem.text + return desc + + def parse_name(self,etree): + return etree.get("name") + + +class ConfigurationWriter(persistence.ConeWriter): + """ + Parses a single CPF configuration project root confml file. Parses the XInclude statements to + find out the layers inside the project + """ + + class_type = "Configuration" + + def __init__(self): + self.configuration_namespace = CONFIGURATION_NAMESPACES[0] + self.include_namespace = INCLUDE_NAMESPACES[0] + + def tostring(self,configuration,indent=True): + root = ElementTree.Element("configuration") + root.set("xmlns",self.configuration_namespace) + root.set("xmlns:xi",self.include_namespace) + root.set("name",configuration.ref) + root.append(self.to_desc(configuration.desc)) + root.append(self.to_meta(configuration.meta)) + for inc in configuration.list_layers(): + root.append(self.to_include(inc)) + if indent: + self.indent(root) + return ElementTree.tostring(root) + + def to_desc(self,desc): + elem = ElementTree.Element("desc") + elem.text = desc + return elem + + def to_meta(self,meta): + elem = ElementTree.Element("meta") + for key in meta.keys(): + selem = ElementTree.SubElement(elem,key) + selem.text = meta[key] + return elem + + def to_include(self,include): + elem = ElementTree.Element("xi:include") + elem.set("href",include) + return elem +