configurationengine/source/cone/storage/metadata.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
equal deleted inserted replaced
-1:000000000000 0:2e8eeb919028
       
     1 #
       
     2 # Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description: 
       
    15 #
       
    16 
       
    17 try:
       
    18     from cElementTree import ElementTree
       
    19 except ImportError:
       
    20     try:    
       
    21         from elementtree import ElementTree
       
    22     except ImportError:
       
    23         try:
       
    24             from xml.etree import cElementTree as ElementTree
       
    25         except ImportError:
       
    26             from xml.etree import ElementTree
       
    27 import StringIO
       
    28 import os
       
    29 
       
    30 from cone.public import exceptions, persistence
       
    31 
       
    32 class Metadata(object):
       
    33     """
       
    34     metadata container objectl, which is only a dictionary container
       
    35     """
       
    36     META_ROOT_FILE = 'cpf.rootFile'
       
    37 
       
    38     def __init__(self, copyobj=None):
       
    39         """
       
    40         Constructor initializes the default values
       
    41         """
       
    42         self.data = {}
       
    43         if copyobj != None:
       
    44             self.data = copyobj.data.copy()
       
    45         pass
       
    46 
       
    47     def get_root_file(self):
       
    48         return self.data.get(self.META_ROOT_FILE,"")
       
    49 
       
    50     def set_root_file(self,filename):
       
    51         self.data[self.META_ROOT_FILE] = filename
       
    52 
       
    53 class MetadataReader(persistence.ConeReader):
       
    54     """
       
    55     Parses a single metadata file
       
    56     """ 
       
    57     class_type = "Metadata"
       
    58     NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
       
    59     def __init__(self):
       
    60         return
       
    61     
       
    62     def fromstring(self, xml_as_string):
       
    63         meta = Metadata()
       
    64         etree = ElementTree.fromstring(xml_as_string)
       
    65         iter = etree.getiterator("{%s}property" % self.NAMESPACES[0])
       
    66         for elem in iter:
       
    67             (key,value) = self.get_property(elem)
       
    68             meta.data[key] = value
       
    69         return meta
       
    70 
       
    71     def get_property(self, elem):
       
    72         key = elem.get('name')
       
    73         value = ''
       
    74         if elem.get('value'): value = elem.get('value')
       
    75         return (key,value)
       
    76 
       
    77 class MetadataWriter(persistence.ConeWriter):
       
    78     """
       
    79     Writes a single metadata file
       
    80     """ 
       
    81     class_type = "Metadata"
       
    82     NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
       
    83     DEFAULT_ENCODING = "ASCII"
       
    84     def __init__(self):
       
    85         self.encoding = self.DEFAULT_ENCODING
       
    86         return
       
    87     
       
    88     def tostring(self,obj,indent=True):
       
    89         stringdata =  StringIO.StringIO()
       
    90         self.toresource(obj, stringdata, indent)
       
    91         return stringdata.getvalue()
       
    92     
       
    93     def toresource(self,obj,res,indent=True):
       
    94         root = ElementTree.Element("metadata")
       
    95         root.set('xmlns',self.NAMESPACES[0])
       
    96         if not obj.__class__ == Metadata:
       
    97             raise exceptions.IncorrectClassError('The given object is not a instance of %s' % Metadata)
       
    98         for key in obj.data.keys():
       
    99             prop = ElementTree.SubElement(root,'property')
       
   100             self.set_property(prop, key, obj.data[key])
       
   101         if indent:
       
   102             persistence.indent(root)
       
   103         # 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))
       
   105         ElementTree.ElementTree(root).write(res)
       
   106         
       
   107     def set_property(self, elem, key, value):
       
   108         elem.attrib['name'] = key
       
   109         if value != '':
       
   110             elem.attrib['value'] = value
       
   111         return elem