--- /dev/null
+#----------------------------------------------------------------------------
+# Name: dependencymgr.py
+# Purpose: Dependency Manager
+#
+# Author: Jeff Norton
+#
+# Created: 01/28/05
+# CVS-ID: $Id$
+# Copyright: (c) 2004-2005 ActiveGrid, Inc.
+#----------------------------------------------------------------------------
+
+DM_NO_ID = 0
+DM_ID_ATTR = "_DependencyMgr__ID"
+
+##class ManageableObject(object):
+##
+## def __init__(self):
+## self.__id = DM_NO_ID
+##
+## def __repr__(self):
+## return "<ManageableObject id = %s>" % self.__id
+##
+## def __getID(self):
+## return self.__id
+##
+## def __setID(self, value):
+## if (self.__id != DM_NO_ID):
+## raise DependencyMgrException("Cannot set the dependency ID on object %s to \"%s\" because it already has one (\"%s\")." % (repr(self), value, self.__id))
+## self.__id = value
+##
+## _DependencyMgr__ID = property(__getID, __setID)
+
+class DependencyMgr(object):
+
+ def __init__(self):
+ self.clear()
+
+ def clear(self):
+ self.__dependencies = {}
+ self.__lastID = DM_NO_ID
+
+ def addDependency(self, parent, child):
+ pid = self._initObjectID(parent)
+ try:
+ parentCollection = self.__dependencies[pid]
+ except KeyError:
+ parentCollection = self._newDependencyCollection()
+ self.__dependencies[pid] = parentCollection
+ if (child not in parentCollection):
+ parentCollection.append(child)
+
+ def removeDependency(self, parent, child):
+ pid = self._getObjectID(parent)
+ if (pid != DM_NO_ID):
+ try:
+ parentCollection = self.__dependencies[pid]
+ parentCollection.remove(child)
+ if (len(parentCollection) == 0):
+ del self.__dependencies[pid]
+ except KeyError, ValueError:
+ pass
+
+ def clearDependencies(self, parent):
+ "Returns a list of objects or an empty list if no dependencies exist as for getDependencies, and then removes the dependency list."
+ pid = self._getObjectID(parent)
+ try:
+ deps = self.__dependencies[pid]
+ del self.__dependencies[pid]
+ return deps
+ except KeyError:
+ return []
+
+ def hasDependency(self, parent):
+ "Returns a boolean"
+ return (self._getObjectID(parent) in self.__dependencies)
+
+ def getDependencies(self, parent):
+ "Returns a list of objects or an empty list if no dependencies exist."
+ try:
+ return self.__dependencies[self._getObjectID(parent)]
+ except KeyError:
+ return []
+
+ def dumpState(self, out):
+ "Writes the state of the dependency manager (as reported by getState) to out"
+ for line in self.getState():
+ print >> out, line
+
+ def getState(self):
+ "Returns the state of the dependency manager including all managed objects as a list of strings"
+ out = []
+ out.append("DependencyMgr %s has %i parent objects, last id assigned is %i" % (repr(self), len(self.__dependencies), self.__lastID))
+ for key, val in self.__dependencies.iteritems():
+ out.append("Object %s has dependents: %s " % (repr(key), ", ".join([repr(d) for d in val])))
+ return out
+
+ def _initObjectID(self, obj):
+ try:
+ id = getattr(obj, DM_ID_ATTR)
+ except AttributeError:
+ id = DM_NO_ID
+ if (id == DM_NO_ID):
+ id = self._newID()
+ setattr(obj, DM_ID_ATTR, id)
+ return id
+
+ def _getObjectID(self, obj):
+ try:
+ id = getattr(obj, DM_ID_ATTR)
+ except AttributeError:
+ id = DM_NO_ID
+ return id
+
+ def _newID(self):
+ self.__lastID += 1
+ return self.__lastID
+
+ def _newDependencyCollection(self):
+ return []
+
+globalDM = DependencyMgr()
+
+def addDependency(parent, child):
+ getGlobalDM().addDependency(parent, child)
+
+def removeDependency(parent, child):
+ getGlobalDM().removeDependency(parent, child)
+
+def clearDependencies(parent):
+ return getGlobalDM().clearDependencies(parent)
+
+def hasDependency(parent):
+ return getGlobalDM().hasDependency(parent)
+
+def getDependencies(parent):
+ return getGlobalDM().getDependencies(parent)
+
+def getState():
+ return getGlobalDM().getState()
+
+def dumpState(out):
+ getGlobalDM().dumpState(out)
+
+def getGlobalDM():
+ return globalDM