configurationengine/source/cone/storage/metadata.py
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
    22     except ImportError:
    22     except ImportError:
    23         try:
    23         try:
    24             from xml.etree import cElementTree as ElementTree
    24             from xml.etree import cElementTree as ElementTree
    25         except ImportError:
    25         except ImportError:
    26             from xml.etree import ElementTree
    26             from xml.etree import ElementTree
       
    27 
    27 import StringIO
    28 import StringIO
    28 import os
    29 import os
       
    30 import logging
    29 
    31 
    30 from cone.public import exceptions, persistence
    32 from cone.public import exceptions, persistence
    31 
    33 
    32 class Metadata(object):
    34 class Metadata(object):
    33     """
    35     """
    40         Constructor initializes the default values
    42         Constructor initializes the default values
    41         """
    43         """
    42         self.data = {}
    44         self.data = {}
    43         if copyobj != None:
    45         if copyobj != None:
    44             self.data = copyobj.data.copy()
    46             self.data = copyobj.data.copy()
    45         pass
       
    46 
    47 
    47     def get_root_file(self):
    48     def get_root_file(self):
    48         return self.data.get(self.META_ROOT_FILE,"")
    49         return self.data.get(self.META_ROOT_FILE, None)
    49 
    50 
    50     def set_root_file(self,filename):
    51     def set_root_file(self,filename):
    51         self.data[self.META_ROOT_FILE] = filename
    52         if filename:
       
    53             self.data[self.META_ROOT_FILE] = filename
    52 
    54 
    53 class MetadataReader(persistence.ConeReader):
    55 class MetadataReader(persistence.ConeReader):
    54     """
    56     """
    55     Parses a single metadata file
    57     Parses a single metadata file
    56     """ 
    58     """ 
    57     class_type = "Metadata"
    59     class_type = "Metadata"
    58     NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
    60     NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
    59     def __init__(self):
       
    60         return
       
    61     
    61     
    62     def fromstring(self, xml_as_string):
    62     def fromstring(self, xml_as_string):
    63         meta = Metadata()
    63         meta = Metadata()
    64         etree = ElementTree.fromstring(xml_as_string)
    64         try:
    65         iter = etree.getiterator("{%s}property" % self.NAMESPACES[0])
    65             etree = ElementTree.fromstring(xml_as_string)
    66         for elem in iter:
    66             for elem in etree.getiterator("{%s}property" % self.NAMESPACES[0]):
    67             (key,value) = self.get_property(elem)
    67                 (key,value) = self.get_property(elem)
    68             meta.data[key] = value
    68                 meta.data[key] = value
       
    69         except Exception,e:
       
    70             logging.getLogger('cone').warning("Could not read metadata! Exception %s" % (e))
    69         return meta
    71         return meta
    70 
    72 
    71     def get_property(self, elem):
    73     def get_property(self, elem):
    72         key = elem.get('name')
    74         key = elem.get('name')
    73         value = ''
    75         value = ''
    80     """ 
    82     """ 
    81     class_type = "Metadata"
    83     class_type = "Metadata"
    82     NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
    84     NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
    83     DEFAULT_ENCODING = "ASCII"
    85     DEFAULT_ENCODING = "ASCII"
    84     def __init__(self):
    86     def __init__(self):
       
    87         super(MetadataWriter, self).__init__()
    85         self.encoding = self.DEFAULT_ENCODING
    88         self.encoding = self.DEFAULT_ENCODING
    86         return
    89         return
    87     
    90     
    88     def tostring(self,obj,indent=True):
    91     def tostring(self,obj,indent=True):
    89         stringdata =  StringIO.StringIO()
    92         stringdata =  StringIO.StringIO()
    98         for key in obj.data.keys():
   101         for key in obj.data.keys():
    99             prop = ElementTree.SubElement(root,'property')
   102             prop = ElementTree.SubElement(root,'property')
   100             self.set_property(prop, key, obj.data[key])
   103             self.set_property(prop, key, obj.data[key])
   101         if indent:
   104         if indent:
   102             persistence.indent(root)
   105             persistence.indent(root)
       
   106         
       
   107         # To make the output the same in linux and windows
       
   108         # (needed to make testing easier)
       
   109         class LinesepNormalizerResource(object):
       
   110             def __init__(self, resource):
       
   111                 self.resource = resource
       
   112             def write(self, data):
       
   113                 if os.linesep != '\r\n':
       
   114                     data = data.replace(os.linesep, '\r\n')
       
   115                 self.resource.write(data)
       
   116         res = LinesepNormalizerResource(res)
       
   117         
   103         # some smarter way to implement adding of the encoding to the beginning of file
   118         # some smarter way to implement adding of the encoding to the beginning of file
   104         res.write('<?xml version="1.0" encoding="%s"?>%s' % (self.encoding,os.linesep))
   119         res.write('<?xml version="1.0" encoding="%s"?>%s' % (self.encoding,os.linesep))
   105         ElementTree.ElementTree(root).write(res)
   120         ElementTree.ElementTree(root).write(res)
   106         
   121         
   107     def set_property(self, elem, key, value):
   122     def set_property(self, elem, key, value):