--- a/sbsv2/raptor/python/raptor_cache.py Wed Oct 28 14:39:48 2009 +0000
+++ b/sbsv2/raptor/python/raptor_cache.py Mon Nov 16 09:46:46 2009 +0000
@@ -1,223 +1,223 @@
-#
-# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "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:
-# raptor_cache module
-# This module represents a cache of objects for a Raptor program.
-#
-
-import raptor_data
-import raptor_xml
-import generic_path
-import os
-
-# raptor_cache module attributes
-
-
-# raptor_cache module classes
-
-class Cache:
-
- def __init__(self, Raptor):
- self.raptor = Raptor
- self.aliases = {}
- self.groups = {}
- self.interfaces = {}
- self.variants = {}
-
- def Load(self, gPathOrGPathList, cacheID = ""):
- """scan directory for xml files containing Raptor objects.
- Input is either a generic path object or a list of
- generic path objects.
-
- If a cacheID is supplied then the loaded objects are
- placed into containers which are marked with that ID.
- This is useful for Interfaces which may be loaded from
- several locations (different epoc32 trees for example)
- but need to be kept separate.
- """
-
- pathlist = []
- filenames = []
-
- # Create pathlist - this will be of length one if gPathOrGPathList is a
- # generic path object; otherwise it's a list so just make all supplied paths generic
- if isinstance(gPathOrGPathList, list):
- pathlist = map(lambda x: x.GetLocalString(), gPathOrGPathList)
- elif isinstance(gPathOrGPathList, generic_path.Path):
- pathlist = [gPathOrGPathList.GetLocalString()]
- else:
- self.raptor.Warn("Empty list or blank path supplied.")
-
- # Only when debugging, print the list. The for loop will be
- # skipped if not in debug mode
- if self.raptor.debugOutput:
- for path in pathlist:
- self.raptor.Debug("Loading XML cache from %s", path)
-
- # Internal function to get the list of XML
- # files recursively
- def getXmlFiles(aDir, aFileList):
- dirList = []
- for fname in os.listdir(aDir):
- path = os.path.join(aDir, fname)
- if os.path.isdir(path):
- dirList.append(path)
- else: # It's a file
- if path.endswith(".xml"): # Only files ending in .xml get added
- aFileList.append(path)
- # Now iterate over directory list; this way, the files in the top level of
- # aDir will be added before all files in any subdirectory of aDir
- for dir in dirList:
- getXmlFiles(dir, aFileList)
-
- # This will add all files in all top level directories and all XML files
- for path in pathlist:
- # gPathOrGPathList passed to Load() can be a file or a
- # directory, or a list of files or directories or both
- if os.path.isfile(path):
- if path.endswith(".xml"): # Only files whose names end in .xml get added
- filenames.append(path)
- elif os.path.isdir(path):
- getXmlFiles(path, filenames)
- else: # it isn't a file or directory
- self.raptor.Warn("No file or directory found for '%s'", path)
-
- if not filenames:
- # No XML files found in any of the paths
- return
-
- # Parse XML files, and add the objects to our
- # configuration/interface/variant dictionaries
- for fullpath in filenames:
- try:
- objects = raptor_xml.Read(self.raptor, fullpath)
-
- except raptor_xml.XMLError:
- self.raptor.Warn("Failed to read XML file %s", fullpath)
- continue
-
- self.raptor.Debug("%d objects found in XML file %s", len(objects), fullpath)
-
- for obj in objects:
- # top-level objects need to know which XML file they came from.
- obj.SetSourceFile(fullpath)
- try:
- self.AddObject(obj, cacheID)
- except UnexpectedObjectError:
- self.raptor.Warn("Unexpected object %s", str(obj))
-
- def AddObject(self, obj, cacheID):
- """add a Group, Alias, Interface or Variant.
-
- The cacheID is only used to separate Interfaces.
- """
-
- if isinstance(obj, raptor_data.Group):
- self.AddGroup(obj)
- elif isinstance(obj, raptor_data.Alias):
- self.AddAlias(obj)
- elif isinstance(obj, raptor_data.Interface):
- self.AddInterface(obj, cacheID)
- elif isinstance(obj, raptor_data.Variant):
- self.AddVariant(obj)
- else:
- raise UnexpectedObjectError
-
-
- def FindNamedGroup(self, name):
- return self.groups[name]
-
- def AddGroup(self, obj):
- if obj.name in self.groups:
- self.WarnDuplicate("group", self.groups[obj.name], obj)
- return
-
- obj.SetOwner(self.raptor)
- self.groups[obj.name] = obj
-
- def FindNamedAlias(self, name):
- return self.aliases[name]
-
- def AddAlias(self, obj):
- if obj.name in self.aliases:
- self.WarnDuplicate("alias", self.aliases[obj.name], obj)
- return
-
- obj.SetOwner(self.raptor)
- self.aliases[obj.name] = obj
-
-
- def FindNamedInterface(self, name, cacheID = ""):
- try:
- return self.interfaces[cacheID][name]
- except KeyError, e:
- if cacheID == "":
- raise e
- else:
- return self.interfaces[""][name]
-
-
- def AddInterface(self, obj, cacheID):
- if not cacheID in self.interfaces:
- self.interfaces[cacheID] = {}
-
- if obj.name in self.interfaces[cacheID]:
- self.WarnDuplicate("interface", self.interfaces[cacheID][obj.name], obj)
- return
-
- obj.SetOwner(self.raptor)
- obj.cacheID = cacheID
- self.interfaces[cacheID][obj.name] = obj
-
-
- def FindNamedVariant(self, name):
- return self.variants[name]
-
-
- def AddVariant(self, obj):
- # anonymous variants can never be referenced, so ignore them
- if obj.name:
- if self.variants.has_key(obj.name):
- self.WarnDuplicate("variant", self.variants[obj.name], obj)
- return
-
- obj.SetOwner(self.raptor)
- self.variants[obj.name] = obj
-
-
- def WarnDuplicate(self, type, objOld, objNew):
- """tell us where duplicate objects came from."""
- oldSource = objOld.source
- if oldSource == None:
- oldSource = "unknown"
-
- newSource = objNew.source
- if newSource == None:
- newSource = "unknown"
-
- # don't warn if we are reloading the object from the same
- # file as before: since that is quite ligitimate.
- if oldSource == newSource and oldSource != "unknown":
- return
-
- # actually this is just for information not a warning
- self.raptor.Info("Duplicate %s '%s' (the one from '%s' will override the one in '%s')",
- type, objOld.name, oldSource, newSource)
-
-
-class UnexpectedObjectError(Exception):
- pass
-
-
-# end of the raptor_cache module
+#
+# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+# raptor_cache module
+# This module represents a cache of objects for a Raptor program.
+#
+
+import raptor_data
+import raptor_xml
+import generic_path
+import os
+
+# raptor_cache module attributes
+
+
+# raptor_cache module classes
+
+class Cache:
+
+ def __init__(self, Raptor):
+ self.raptor = Raptor
+ self.aliases = {}
+ self.groups = {}
+ self.interfaces = {}
+ self.variants = {}
+
+ def Load(self, gPathOrGPathList, cacheID = ""):
+ """scan directory for xml files containing Raptor objects.
+ Input is either a generic path object or a list of
+ generic path objects.
+
+ If a cacheID is supplied then the loaded objects are
+ placed into containers which are marked with that ID.
+ This is useful for Interfaces which may be loaded from
+ several locations (different epoc32 trees for example)
+ but need to be kept separate.
+ """
+
+ pathlist = []
+ filenames = []
+
+ # Create pathlist - this will be of length one if gPathOrGPathList is a
+ # generic path object; otherwise it's a list so just make all supplied paths generic
+ if isinstance(gPathOrGPathList, list):
+ pathlist = map(lambda x: x.GetLocalString(), gPathOrGPathList)
+ elif isinstance(gPathOrGPathList, generic_path.Path):
+ pathlist = [gPathOrGPathList.GetLocalString()]
+ else:
+ self.raptor.Warn("Empty list or blank path supplied.")
+
+ # Only when debugging, print the list. The for loop will be
+ # skipped if not in debug mode
+ if self.raptor.debugOutput:
+ for path in pathlist:
+ self.raptor.Debug("Loading XML cache from %s", path)
+
+ # Internal function to get the list of XML
+ # files recursively
+ def getXmlFiles(aDir, aFileList):
+ dirList = []
+ for fname in os.listdir(aDir):
+ path = os.path.join(aDir, fname)
+ if os.path.isdir(path):
+ dirList.append(path)
+ else: # It's a file
+ if path.endswith(".xml"): # Only files ending in .xml get added
+ aFileList.append(path)
+ # Now iterate over directory list; this way, the files in the top level of
+ # aDir will be added before all files in any subdirectory of aDir
+ for dir in dirList:
+ getXmlFiles(dir, aFileList)
+
+ # This will add all files in all top level directories and all XML files
+ for path in pathlist:
+ # gPathOrGPathList passed to Load() can be a file or a
+ # directory, or a list of files or directories or both
+ if os.path.isfile(path):
+ if path.endswith(".xml"): # Only files whose names end in .xml get added
+ filenames.append(path)
+ elif os.path.isdir(path):
+ getXmlFiles(path, filenames)
+ else: # it isn't a file or directory
+ self.raptor.Warn("No file or directory found for '%s'", path)
+
+ if not filenames:
+ # No XML files found in any of the paths
+ return
+
+ # Parse XML files, and add the objects to our
+ # configuration/interface/variant dictionaries
+ for fullpath in filenames:
+ try:
+ objects = raptor_xml.Read(self.raptor, fullpath)
+
+ except raptor_xml.XMLError:
+ self.raptor.Warn("Failed to read XML file %s", fullpath)
+ continue
+
+ self.raptor.Debug("%d objects found in XML file %s", len(objects), fullpath)
+
+ for obj in objects:
+ # top-level objects need to know which XML file they came from.
+ obj.SetSourceFile(fullpath)
+ try:
+ self.AddObject(obj, cacheID)
+ except UnexpectedObjectError:
+ self.raptor.Warn("Unexpected object %s", str(obj))
+
+ def AddObject(self, obj, cacheID):
+ """add a Group, Alias, Interface or Variant.
+
+ The cacheID is only used to separate Interfaces.
+ """
+
+ if isinstance(obj, raptor_data.Group):
+ self.AddGroup(obj)
+ elif isinstance(obj, raptor_data.Alias):
+ self.AddAlias(obj)
+ elif isinstance(obj, raptor_data.Interface):
+ self.AddInterface(obj, cacheID)
+ elif isinstance(obj, raptor_data.Variant):
+ self.AddVariant(obj)
+ else:
+ raise UnexpectedObjectError
+
+
+ def FindNamedGroup(self, name):
+ return self.groups[name]
+
+ def AddGroup(self, obj):
+ if obj.name in self.groups:
+ self.WarnDuplicate("group", self.groups[obj.name], obj)
+ return
+
+ obj.SetOwner(self.raptor)
+ self.groups[obj.name] = obj
+
+ def FindNamedAlias(self, name):
+ return self.aliases[name]
+
+ def AddAlias(self, obj):
+ if obj.name in self.aliases:
+ self.WarnDuplicate("alias", self.aliases[obj.name], obj)
+ return
+
+ obj.SetOwner(self.raptor)
+ self.aliases[obj.name] = obj
+
+
+ def FindNamedInterface(self, name, cacheID = ""):
+ try:
+ return self.interfaces[cacheID][name]
+ except KeyError, e:
+ if cacheID == "":
+ raise e
+ else:
+ return self.interfaces[""][name]
+
+
+ def AddInterface(self, obj, cacheID):
+ if not cacheID in self.interfaces:
+ self.interfaces[cacheID] = {}
+
+ if obj.name in self.interfaces[cacheID]:
+ self.WarnDuplicate("interface", self.interfaces[cacheID][obj.name], obj)
+ return
+
+ obj.SetOwner(self.raptor)
+ obj.cacheID = cacheID
+ self.interfaces[cacheID][obj.name] = obj
+
+
+ def FindNamedVariant(self, name):
+ return self.variants[name]
+
+
+ def AddVariant(self, obj):
+ # anonymous variants can never be referenced, so ignore them
+ if obj.name:
+ if self.variants.has_key(obj.name):
+ self.WarnDuplicate("variant", self.variants[obj.name], obj)
+ return
+
+ obj.SetOwner(self.raptor)
+ self.variants[obj.name] = obj
+
+
+ def WarnDuplicate(self, type, objOld, objNew):
+ """tell us where duplicate objects came from."""
+ oldSource = objOld.source
+ if oldSource == None:
+ oldSource = "unknown"
+
+ newSource = objNew.source
+ if newSource == None:
+ newSource = "unknown"
+
+ # don't warn if we are reloading the object from the same
+ # file as before: since that is quite ligitimate.
+ if oldSource == newSource and oldSource != "unknown":
+ return
+
+ # actually this is just for information not a warning
+ self.raptor.Info("Duplicate %s '%s' (the one from '%s' will override the one in '%s')",
+ type, objOld.name, oldSource, newSource)
+
+
+class UnexpectedObjectError(Exception):
+ pass
+
+
+# end of the raptor_cache module