configurationengine/source/cone/storage/common.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/common.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,85 @@
+#
+# 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: 
+#
+
+import logging
+import xml.parsers.expat
+
+from cone.public import api, utils
+from cone.storage import metadata
+
+class StorageBase(api.Storage):
+    """
+    A general base class for all storage type classes
+    """
+    METADATA_FILENAME = ".metadata"
+
+    def __init__(self,path):
+        super(StorageBase, self).__init__(path)
+        self.meta = self.read_metadata()
+
+    def get_active_configuration(self): 
+        """
+        Return the active configuration. 
+        If the storage holds only one configuration, it will be always active  
+        """
+        root_confmls = self.list_resources("/")
+        root_confmls = utils.resourceref.filter_resources(root_confmls,"\.confml")
+        if self.meta.get_root_file() == '' and len(root_confmls) == 1:
+            return root_confmls[0]
+        else:
+            return self.meta.get_root_file()
+            
+
+    def set_active_configuration(self, ref):
+        self.meta.set_root_file(ref)
+
+    def read_metadata(self):
+        meta = None
+        if not self.is_resource(self.METADATA_FILENAME):
+            logging.getLogger('cone').info("No metadata found for: %s" % (self.get_path()))
+            # return empty metadata object
+            meta = metadata.Metadata()
+        else:
+            res = self.open_resource(self.METADATA_FILENAME)
+            try:
+                try:
+                    meta = metadata.MetadataReader().fromstring(res.read())
+                except xml.parsers.expat.ExpatError:
+                    """ in case of xml parsing error return empty metadata """
+                    meta = metadata.Metadata()
+            finally:
+                res.close()
+        return meta
+
+    def write_metadata(self):
+        # Try to update the metadata, which might fail on ZipStorage
+
+        try:
+            if self.get_mode(self.mode) != api.Storage.MODE_READ:
+                # update the active configuration
+                self.set_active_configuration(self.get_active_configuration())
+                metares = self.open_resource(self.METADATA_FILENAME,"wb")
+                metadata.MetadataWriter().toresource(self.meta,metares)
+                metares.close()
+        except Exception,e:
+            logging.getLogger('cone').error("Could not save metadata. Exception %s" % e)
+        return
+
+    def close(self):
+        if self.get_current_path() == "": 
+            self.write_metadata()
+        super(StorageBase, self).close()
+