#---------------------------------------------------------------------------- # 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 "" % 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