[Commits] (vajda) - removed defaultParent feature

commits at osafoundation.org commits at osafoundation.org
Mon Apr 4 15:13:27 PDT 2005


Commit by: vajda
Modified files:
chandler/Makefile 1.95 1.96
chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py 1.1 1.2
chandler/parcels/osaf/mail/imap.py 1.48 1.49
chandler/parcels/osaf/mail/smtp.py 1.36 1.37
chandler/repository/item/Children.py None 1.1
chandler/repository/item/Indexes.py 1.11 1.12
chandler/repository/item/Item.py 1.203 1.204
chandler/repository/item/Monitors.py 1.10 1.11
chandler/repository/item/Query.py 1.13 1.14
chandler/repository/item/RefCollections.py 1.14 1.15
chandler/repository/item/Values.py 1.44 1.45
chandler/repository/packs/schema/model/Kind.kind 1.29 1.30
chandler/repository/persistence/RepositoryViewManager.py None 1.1
chandler/repository/persistence/DBLob.py 1.4 1.5
chandler/repository/persistence/DBRefs.py 1.5 1.6
chandler/repository/persistence/DBRepositoryView.py 1.11 1.12
chandler/repository/persistence/PackHandler.py 1.22 1.23
chandler/repository/persistence/RepositoryError.py 1.16 1.17
chandler/repository/persistence/RepositoryView.py 1.37 1.38
chandler/repository/schema/Kind.py 1.107 1.108
chandler/repository/tests/TestNullView.py None 1.1
chandler/repository/util/Lob.py 1.11 1.12

Log message:
   - removed defaultParent feature
   - added support for nullRepositoryView
   - added optional _uuid constructor argument to Item.__init__()
   - made name, parent, and kind optional in Item.__init__()
   - removed timing code additions as they're obsolete
   - added RepositoryView.importItem()
   - made Item.itsView settable
   - fixed 'del' bug and ref leaks in descriptor C code
   - fixed bug with copying SingleRef resolving to None
   - removed view-is-current-view checks
   - moved AbstractRepositoryViewManager class to its own module


ViewCVS links:
http://cvs.osafoundation.org/index.cgi/chandler/Makefile.diff?r1=text&tr1=1.95&r2=text&tr2=1.96
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py.diff?r1=text&tr1=1.1&r2=text&tr2=1.2
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/mail/imap.py.diff?r1=text&tr1=1.48&r2=text&tr2=1.49
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/mail/smtp.py.diff?r1=text&tr1=1.36&r2=text&tr2=1.37
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Children.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Indexes.py.diff?r1=text&tr1=1.11&r2=text&tr2=1.12
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Item.py.diff?r1=text&tr1=1.203&r2=text&tr2=1.204
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Monitors.py.diff?r1=text&tr1=1.10&r2=text&tr2=1.11
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Query.py.diff?r1=text&tr1=1.13&r2=text&tr2=1.14
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/RefCollections.py.diff?r1=text&tr1=1.14&r2=text&tr2=1.15
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Values.py.diff?r1=text&tr1=1.44&r2=text&tr2=1.45
http://cvs.osafoundation.org/index.cgi/chandler/repository/packs/schema/model/Kind.kind.diff?r1=text&tr1=1.29&r2=text&tr2=1.30
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/RepositoryViewManager.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/DBLob.py.diff?r1=text&tr1=1.4&r2=text&tr2=1.5
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/DBRefs.py.diff?r1=text&tr1=1.5&r2=text&tr2=1.6
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/DBRepositoryView.py.diff?r1=text&tr1=1.11&r2=text&tr2=1.12
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/PackHandler.py.diff?r1=text&tr1=1.22&r2=text&tr2=1.23
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/RepositoryError.py.diff?r1=text&tr1=1.16&r2=text&tr2=1.17
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/RepositoryView.py.diff?r1=text&tr1=1.37&r2=text&tr2=1.38
http://cvs.osafoundation.org/index.cgi/chandler/repository/schema/Kind.py.diff?r1=text&tr1=1.107&r2=text&tr2=1.108
http://cvs.osafoundation.org/index.cgi/chandler/repository/tests/TestNullView.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/repository/util/Lob.py.diff?r1=text&tr1=1.11&r2=text&tr2=1.12

Index: chandler/repository/persistence/DBLob.py
diff -u chandler/repository/persistence/DBLob.py:1.4 chandler/repository/persistence/DBLob.py:1.5
--- chandler/repository/persistence/DBLob.py:1.4	Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/DBLob.py	Mon Apr  4 15:13:20 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.4 $"
-__date__      = "$Date: 2005/03/18 21:41:48 $"
+__revision__  = "$Revision: 1.5 $"
+__date__      = "$Date: 2005/04/04 22:13:20 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -35,19 +35,7 @@
 
     def _copy(self, item, attribute, key=None):
 
-        view = item.itsView
-        copy = view._getLobType()(view, self.encoding,
-                                  self.mimetype, self._indexed)
-
-        inputStream = self.getInputStream(key)
-        outputStream = copy.getOutputStream(self._compression, self._encryption,
-                                            key)
-
-        outputStream.write(inputStream.read())
-        outputStream.close()
-        inputStream.close()
-
-        return copy
+        return self.copy(item.itsView, key)
 
     def _writeData(self, uuid, store, db):
 
@@ -134,20 +122,9 @@
 
     def load(self, data, attrs):
 
-        self.mimetype = attrs.get('mimetype', 'text/plain')
-        if attrs.has_key('encoding'):
-            self.encoding = attrs['encoding']
-
-        self._compression = attrs.get('compression', None)
-        self._encryption = attrs.get('encryption', None)
-        self._version = long(attrs.get('version', '0'))
-        self._indexed = attrs.get('indexed', 'False') == 'True'
-
-        if attrs.get('type', 'text') == 'text':
-            writer = self.getWriter()
-            writer.write(data)
-            writer.close()
-        else:
+        super(DBLob, self).load(data, attrs)
+
+        if attrs.get('type', 'text') != 'text':
             self._uuid = UUID(data)
 
     def _setData(self, data):

Index: chandler/repository/item/RefCollections.py
diff -u chandler/repository/item/RefCollections.py:1.14 chandler/repository/item/RefCollections.py:1.15
--- chandler/repository/item/RefCollections.py:1.14	Fri Mar 18 13:41:46 2005
+++ chandler/repository/item/RefCollections.py	Mon Apr  4 15:13:20 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.14 $"
-__date__      = "$Date: 2005/03/18 21:41:46 $"
+__revision__  = "$Revision: 1.15 $"
+__date__      = "$Date: 2005/04/04 22:13:20 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -72,6 +72,16 @@
             item = self._item
             item.setDirty(item.RDIRTY, self._name, item._references, noMonitors)
 
+    # copy the indexes from self into refList, empty
+    def _copyIndexes(self, refList):
+
+        if self._indexes is not None:
+            refList._indexes = indexes = {}
+            for name, index in self._indexes.iteritems():
+                type = index.getIndexType()
+                kwds = index.getInitKeywords()
+                indexes[name] = refList._createIndex(type, **kwds)
+
     # copy the refs from self into copyItem._references
     def _copy(self, copyItem, name, policy, copyFn):
 
@@ -79,6 +89,7 @@
             refList = copyItem._references[name]
         except KeyError:
             refList = copyItem._refList(name)
+            self._copyIndexes(refList)
             copyItem._references[name] = refList
 
         for key in self.iterkeys():

Index: chandler/repository/item/Monitors.py
diff -u chandler/repository/item/Monitors.py:1.10 chandler/repository/item/Monitors.py:1.11
--- chandler/repository/item/Monitors.py:1.10	Mon Feb 28 17:20:36 2005
+++ chandler/repository/item/Monitors.py	Mon Apr  4 15:13:20 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.10 $"
-__date__      = "$Date: 2005/03/01 01:20:36 $"
+__revision__  = "$Revision: 1.11 $"
+__date__      = "$Date: 2005/04/04 22:13:20 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -14,6 +14,15 @@
         self.setPinned()
         Monitors.instances[view] = self
 
+    def onItemImport(self, view):
+
+        try:
+            del Monitors.instances[self.itsView]
+        except KeyError:
+            pass
+        
+        Monitors.instances[view] = self
+
     def getInstance(cls, view):
 
         try:

Index: chandler/repository/item/Values.py
diff -u chandler/repository/item/Values.py:1.44 chandler/repository/item/Values.py:1.45
--- chandler/repository/item/Values.py:1.44	Mon Apr  4 11:59:27 2005
+++ chandler/repository/item/Values.py	Mon Apr  4 15:13:20 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.44 $"
-__date__      = "$Date: 2005/04/04 18:59:27 $"
+__revision__  = "$Revision: 1.45 $"
+__date__      = "$Date: 2005/04/04 22:13:20 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -67,11 +67,12 @@
                                                   default='copy'))
                 other = item.find(value.itsUUID)
                 if other is None:
-                    self.name = value
+                    self[name] = value
                 else:
                     copyOther = copyFn(item, other, policy)
                     if copyOther is not item.Nil:
                         self[name] = SingleRef(copyOther.itsUUID)
+
             else:
                 self[name] = value
 
@@ -291,7 +292,7 @@
     def _checkValue(self, logger, name, value, attrType):
 
         if not attrType.recognizes(value):
-            logger._error('Value %s of type %s in attribute %s on %s is not recognized by type %s', value, type(value), name, self._item.itsPath, attrType.itsPath)
+            logger.error('Value %s of type %s in attribute %s on %s is not recognized by type %s', value, type(value), name, self._item.itsPath, attrType.itsPath)
             return False
 
         return True
@@ -361,10 +362,19 @@
             if value is not None and value._isItem():
                 value._references._removeRef(otherName, self._item)
 
-        if other is not None and otherName in other._references:
-            value = other._references._getRef(otherName)
-            if value is not None and value._isItem():
-                value._references._removeRef(name, other)
+        if other is not None:
+            view = self._item.itsView
+            otherView = other.itsView
+            if otherView is not view:
+                if otherView._isNullView() or view._isNullView():
+                    view.importItem(other)
+                else:
+                    raise ViewMismatchError, (self._item, other)
+                    
+            if otherName in other._references:
+                value = other._references._getRef(otherName)
+                if value is not None and value._isItem():
+                    value._references._removeRef(name, other)
 
         self._setRef(name, other, otherName, **kwds)
         if other is not None:

Index: chandler/repository/persistence/DBRepositoryView.py
diff -u chandler/repository/persistence/DBRepositoryView.py:1.11 chandler/repository/persistence/DBRepositoryView.py:1.12
--- chandler/repository/persistence/DBRepositoryView.py:1.11	Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/DBRepositoryView.py	Mon Apr  4 15:13:21 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.11 $"
-__date__      = "$Date: 2005/03/18 21:41:48 $"
+__revision__  = "$Revision: 1.12 $"
+__date__      = "$Date: 2005/04/04 22:13:21 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -23,8 +23,6 @@
 from repository.persistence.DBItemIO \
      import DBItemWriter, DBItemVMergeReader, DBItemRMergeReader
 
-timing = False
-if timing: import tools.timing
 
 class DBRepositoryView(OnDemandRepositoryView):
 
@@ -32,17 +30,21 @@
 
         super(DBRepositoryView, self).openView()
 
-        self._log = []
+        self._log = set()
         self._indexWriter = None
 
     def _logItem(self, item):
         
         if super(DBRepositoryView, self)._logItem(item):
-            self._log.append(item)
+            self._log.add(item)
             return True
         
         return False
 
+    def _unsavedItems(self):
+
+        return iter(self._log)
+
     def dirlog(self):
 
         for item in self._log:
@@ -65,7 +67,7 @@
                                   self._version, item)
                 self.find(item._uuid)
 
-        del self._log[:]
+        self._log.clear()
         if self.isDirty():
             self._roots._clearDirties()
             self.setDirty(0)
@@ -112,6 +114,18 @@
 
         return DBChildren(self, parent, new)
 
+    def _registerItem(self, item):
+
+        super(DBRepositoryView, self)._registerItem(item)
+        if item.isDirty():
+            self._log.add(item)
+
+    def _unregisterItem(self, item, reloadable):
+
+        super(DBRepositoryView, self)._unregisterItem(item, reloadable)
+        if item.isDirty():
+            self._log.remove(item)
+
     def _getLobType(self):
 
         return DBLob
@@ -160,7 +174,7 @@
             _log = self._log
 
             try:
-                self._log = []
+                self._log = set()
                 try:
                     self._mergeItems(self._version, newVersion,
                                      histNotifications, unloads, also, mergeFn)
@@ -212,8 +226,6 @@
     def commit(self, mergeFn=None):
 
         if self._status & RepositoryView.COMMITTING == 0:
-            if timing: tools.timing.begin("Repository commit")
-
             try:
                 self._exclusive.acquire()
                 self._status |= RepositoryView.COMMITTING
@@ -282,7 +294,7 @@
                         item._version = newVersion
                         item.setDirty(0, None)
                         item._status &= ~(Item.NEW | Item.MERGED)
-                    del self._log[:]
+                    self._log.clear()
 
                     if self.isDirty():
                         self._roots._clearDirties()
@@ -307,8 +319,6 @@
                 self._status &= ~RepositoryView.COMMITTING
                 self._exclusive.release()
 
-            if timing: tools.timing.end("Repository commit")
-
     def _saveItem(self, item, newVersion, itemWriter, notifications):
 
         if self.isDebug():

Index: chandler/repository/packs/schema/model/Kind.kind
diff -u chandler/repository/packs/schema/model/Kind.kind:1.29 chandler/repository/packs/schema/model/Kind.kind:1.30
--- chandler/repository/packs/schema/model/Kind.kind:1.29	Wed Feb 16 12:41:04 2005
+++ chandler/repository/packs/schema/model/Kind.kind	Mon Apr  4 15:13:20 2005
@@ -14,8 +14,7 @@
          - plus local attributes below:
          -     notFoundAttributes, inheritedAttributes,
          -     superKinds, subKinds, attributes, classes, 
-         -     displayAttribute, clouds, otherNames, mixins,
-	 -     defaultParent
+         -     displayAttribute, clouds, otherNames, mixins
         -->
     </ref>
 
@@ -225,21 +224,4 @@
          type="path" otherCard="list">/Core/UUID</ref>
     <attribute name="cardinality">list</attribute>
   </item>
-
-  <item withSchema="True">
-    <name>defaultParent</name>
-    <kind type="path">//Schema/Core/Attribute</kind>
-    <class module="repository.schema.Attribute">Attribute</class>
-    <parent type="path">//Schema/Core/Kind</parent>
-
-    <ref name="kinds" otherName="attributes"
-         cardinality="list" otherCard="list">
-      <ref type="path">..</ref>
-    </ref>
-
-    <ref name="type" otherName="typeFor" 
-         type="path" otherCard="list">/Core/SingleRef</ref>
-    <attribute name="cardinality">single</attribute>
-  </item>
-
 </items>

Index: chandler/repository/item/Query.py
diff -u chandler/repository/item/Query.py:1.13 chandler/repository/item/Query.py:1.14
--- chandler/repository/item/Query.py:1.13	Fri Mar 18 13:41:46 2005
+++ chandler/repository/item/Query.py	Mon Apr  4 15:13:20 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.13 $"
-__date__      = "$Date: 2005/03/18 21:41:46 $"
+__revision__  = "$Revision: 1.14 $"
+__date__      = "$Date: 2005/04/04 22:13:20 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -50,7 +50,7 @@
             matches = set()
             changedItems = set()
 
-            for item in kinds[0].itsView._log:
+            for item in kinds[0].itsView._unsavedItems():
                 if item._isNDirty():
                     changedItems.add(item)
 

Index: chandler/parcels/osaf/mail/imap.py
diff -u chandler/parcels/osaf/mail/imap.py:1.48 chandler/parcels/osaf/mail/imap.py:1.49
--- chandler/parcels/osaf/mail/imap.py:1.48	Mon Mar 28 17:36:20 2005
+++ chandler/parcels/osaf/mail/imap.py	Mon Apr  4 15:13:19 2005
@@ -1,5 +1,5 @@
-__revision__  = "$Revision: 1.48 $"
-__date__      = "$Date: 2005/03/29 01:36:20 $"
+__revision__  = "$Revision: 1.49 $"
+__date__      = "$Date: 2005/04/04 22:13:19 $"
 __copyright__ = "Copyright (c) 2005 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -402,7 +402,7 @@
 
     def _viewCommitSuccess(self):
         """
-        Overides C{RepositoryView.AbstractRepositoryViewManager}.
+        Overides C{RepositoryViewManager.AbstractRepositoryViewManager}.
         It posts a commit event to the GUI thread, unpins the C{EmailAccountKind} from
         memory, and writes commit info to the logger
         @return: C{None}

Index: chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py
diff -u chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py:1.1 chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py:1.2
--- chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py:1.1	Thu Oct 28 14:26:23 2004
+++ chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py	Mon Apr  4 15:13:19 2005
@@ -1,11 +1,13 @@
-__revision__  = "$Revision: 1.1 $"
-__date__      = "$Date: 2004/10/28 21:26:23 $"
+__revision__  = "$Revision: 1.2 $"
+__date__      = "$Date: 2005/04/04 22:13:19 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
 import repository.persistence.RepositoryView as RepositoryView
+from repository.persistence.RepositoryViewManager \
+     import AbstractRepositoryViewManager
 
-class RepositoryViewManager(RepositoryView.AbstractRepositoryViewManager):
+class RepositoryViewManager(AbstractRepositoryViewManager):
 
     def execInViewDeferred(self, result, method, *args, **kw):
         """

Index: chandler/repository/persistence/PackHandler.py
diff -u chandler/repository/persistence/PackHandler.py:1.22 chandler/repository/persistence/PackHandler.py:1.23
--- chandler/repository/persistence/PackHandler.py:1.22	Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/PackHandler.py	Mon Apr  4 15:13:21 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.22 $"
-__date__      = "$Date: 2005/03/18 21:41:48 $"
+__revision__  = "$Revision: 1.23 $"
+__date__      = "$Date: 2005/04/04 22:13:21 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -26,6 +26,11 @@
         self.view = view
         self.hooks = []
 
+        packs = view.getRoot('Packs')
+        if packs is None:
+            packs = Item('Packs', view, None)
+        self.packs = packs
+
     def startDocument(self):
 
         self.tagAttrs = []
@@ -70,9 +75,7 @@
 
         else:
             self.name = attrs['name']
-
-            packs = self.view.findPath('Packs')
-            self.pack = Item(self.name, packs, None)
+            self.pack = Item(self.name, self.packs, None)
             self.hooks.append([])
 
     def packEnd(self, attrs):

Index: chandler/repository/persistence/RepositoryError.py
diff -u chandler/repository/persistence/RepositoryError.py:1.16 chandler/repository/persistence/RepositoryError.py:1.17
--- chandler/repository/persistence/RepositoryError.py:1.16	Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/RepositoryError.py	Mon Apr  4 15:13:21 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.16 $"
-__date__      = "$Date: 2005/03/18 21:41:48 $"
+__revision__  = "$Revision: 1.17 $"
+__date__      = "$Date: 2005/04/04 22:13:21 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -77,28 +77,6 @@
                   REF: 'REF' }
 
 
-class ViewError(RepositoryError):
-    "View '%s' is not the view, '%s', set for the current thread '%s'"
-
-    def __str__(self):
-        return self.__doc__ %(self.args[0].name,
-                              self.args[1].name,
-                              threading.currentThread().getName())
-
-
-class ItemViewError(ViewError):
-    "View '%s', set for the current thread, '%s', is not the view of the instance of %s used, '%s'."
-
-    def __str__(self):
-        return self.__doc__ %(self.args[1].name,
-                              threading.currentThread().getName(),
-                              self.getItem()._repr_(),
-                              self.getItem().itsView.name)
-
-    def getItem(self):
-        return self.args[0]
-
-
 class LoadError(RepositoryError):
     "While loading %s, %s"
 
@@ -118,3 +96,10 @@
 
     def __str__(self):
         return self.__doc__ %(self.args[0], self.args[1], self.args[2])
+
+
+class ItemImportError(RepositoryError):
+    "While importing %s into %s, %s"
+
+    def __str__(self):
+        return self.__doc__ %(self.args[0], self.args[1], self.args[2])

Index: chandler/parcels/osaf/mail/smtp.py
diff -u chandler/parcels/osaf/mail/smtp.py:1.36 chandler/parcels/osaf/mail/smtp.py:1.37
--- chandler/parcels/osaf/mail/smtp.py:1.36	Mon Mar 28 17:36:20 2005
+++ chandler/parcels/osaf/mail/smtp.py	Mon Apr  4 15:13:19 2005
@@ -1,5 +1,5 @@
-__revision__  = "$Revision: 1.36 $"
-__date__      = "$Date: 2005/03/29 01:36:20 $"
+__revision__  = "$Revision: 1.37 $"
+__date__      = "$Date: 2005/04/04 22:13:19 $"
 __copyright__ = "Copyright (c) 2005 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -357,7 +357,7 @@
 
     def _viewCommitSuccess(self):
         """
-        Overides C{RepositoryView.AbstractRepositoryViewManager}.
+        Overides C{RepositoryViewManager.AbstractRepositoryViewManager}.
         It posts a commit event to the GUI thread, unpins the C{SMTPAccountKind} and
         C{MailMessageKind} from memory, and writes commit info to the logger
         @return: C{None}

Index: chandler/Makefile
diff -u chandler/Makefile:1.95 chandler/Makefile:1.96
--- chandler/Makefile:1.95	Tue Mar 29 14:58:52 2005
+++ chandler/Makefile	Mon Apr  4 15:13:18 2005
@@ -19,7 +19,7 @@
 
 # these get installed into release or debug
 BIN_ARCHIVES=../Launchers-$(SNAP)-0.4-9.tar.gz \
-             ../chandlerdb-$(SNAP)-0.5-5.tar.gz \
+             ../chandlerdb-$(SNAP)-0.5-6.tar.gz \
              ../db-$(SNAP)-4.3.27-1.tar.gz \
              ../egenix-mx-base-$(SNAP)-2.1.0-3.tar.gz \
              ../epydoc-$(SNAP)-2.1-2.tar.gz \

Index: chandler/repository/item/Item.py
diff -u chandler/repository/item/Item.py:1.203 chandler/repository/item/Item.py:1.204
--- chandler/repository/item/Item.py:1.203	Mon Mar 28 15:33:16 2005
+++ chandler/repository/item/Item.py	Mon Apr  4 15:13:19 2005
@@ -1,11 +1,9 @@
 
-__revision__  = "$Revision: 1.203 $"
-__date__      = "$Date: 2005/03/28 23:33:16 $"
+__revision__  = "$Revision: 1.204 $"
+__date__      = "$Date: 2005/04/04 22:13:19 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
-import cStringIO
-
 from chandlerdb.util.uuid import UUID
 from chandlerdb.schema.descriptor import _countAccess
 from chandlerdb.item.item import CItem
@@ -17,6 +15,8 @@
 from repository.item.PersistentCollections \
      import PersistentCollection, PersistentList, PersistentDict
 
+from repository.persistence.RepositoryView import nullRepositoryView
+
 from repository.util.SingleRef import SingleRef
 from repository.util.Path import Path
 from repository.util.LinkedMap import LinkedMap
@@ -25,17 +25,20 @@
 class Item(CItem):
     'The root class for all items.'
     
-    def __init__(self, name, parent, kind):
+    def __init__(self, name=None, parent=None, kind=None, _uuid=None):
         """
         Construct an Item.
 
         @param name: The name of the item. It must be unique among the names
-        this item's siblings. C{name} may be C{None}.
+        this item's siblings. C{name} is optional, except for roots and is
+        C{None} by default.
         @type name: a string or C{None} to create an anonymous item.
         @param parent: The parent of this item. All items require a parent
         unless they are a repository root in which case the parent argument
         is the repository.
-        @type parent: an item or the item's repository view
+        @type parent: an item or the item's repository view. C{parent} is
+        optional. When ommitted, the item is made a root of either the
+        C{kind}'s view or of the global null view.
         @param kind: The kind for this item. This kind has definitions for
         all the Chandler attributes that are to be used with this item.
         This parameter can be C{None} for Chandler attribute-less operation.
@@ -50,7 +53,7 @@
         cls = type(self)
         self._values = Values(self)
         self._references = References(self)
-        self._uuid = UUID()
+        self._uuid = _uuid or UUID()
         self._name = name or None
         self._kind = kind
         self._version = 0
@@ -59,15 +62,10 @@
             kind._setupClass(cls)
 
         if parent is None:
-            if kind is None:
-                raise NoParentError, self
-
-            parent = kind.getAttributeValue('defaultParent', default=Item.Nil,
-                                            _attrDict=kind._values)
-            if parent is None:
-                raise NoSuchDefaultParentError, (self, kind)
-            if parent is Item.Nil:
-                raise NoParentError, self
+            if kind is not None:
+                parent = kind.itsView
+            else:
+                parent = nullRepositoryView
 
         if name is None and not parent._isItem():
             raise AnonymousRootError, self
@@ -1217,6 +1215,45 @@
 
         return False
 
+    def _collectItems(self, items, filter=None):
+
+        def collectItems(item):
+            parent = item.itsParent
+            if parent._isItem() and not parent in items:
+                if filter is None or filter(parent) is True:
+                    return collectItems(parent)
+
+            def collectChildren(_item):
+                if not _item in items:
+                    items.add(_item)
+                    for child in _item.iterChildren():
+                        collectItems(child)
+
+            def collectReferences(_item):
+                def collectOther(__item):
+                    if __item not in items:
+                        if filter is None or filter(__item) is True:
+                            collectItems(__item)
+                    
+                for key, value in _item._references.items():
+                    if value is not None:
+                        if value._isRefList():
+                            for other in value:
+                                collectOther(other)
+                        else:
+                            if value._isUUID():
+                                value = self.find(value)
+                            collectOther(value)
+
+            collectChildren(item)
+            collectReferences(item)
+            kind = item._kind
+            if not (kind is None or kind in items):
+                if filter is None or filter(kind) is True:
+                    collectItems(kind)
+
+        collectItems(self)
+
     def getItemCloud(self, cloudAlias, items=None):
         """
         Get the items in a cloud by using this item as entrypoint.
@@ -1528,7 +1565,7 @@
             if oldView is not newView:
 
                 if oldView is not None and newView is not None:
-                    raise NotImplementedError, 'changing repositories'
+                    raise NotImplementedError, 'changing views'
 
                 if oldView is not None:
                     oldView._unregisterItem(self, False)
@@ -1723,7 +1760,8 @@
             acl = Item.Nil
 
         if acl is Item.Nil:
-            acl = self.getRepositoryView().getACL(self._uuid, name, self._version)
+            acl = self.getRepositoryView().getACL(self._uuid, name,
+                                                  self._version)
 
         return acl
 
@@ -1740,6 +1778,10 @@
         except AttributeError:
             return None
 
+    def __setRepositoryView(self, view):
+
+        view.importItem(self)
+
     def rename(self, name):
         """
         Rename this item.
@@ -2222,6 +2264,7 @@
                        """)
 
     itsView = property(fget = getRepositoryView,
+                       fset = __setRepositoryView,
                        doc =
                        """
                        Return this item's repository view.
@@ -2243,63 +2286,3 @@
                        item. Setting an item's kind to C{None} clears all
                        its values.
                        """)
-
-
-class Children(LinkedMap):
-
-    def __init__(self, item, new):
-
-        super(Children, self).__init__(new)
-
-        self._item = None
-        self._setItem(item)
-
-    def _setItem(self, item):
-
-        if self._item is not None:
-            assert item._uuid == self._item._uuid
-
-            for link in self._itervalues():
-                link.getValue(self)._parent = item
-
-        if item is not None and item._isItem():
-            item._status |= Item.CONTAINER
-            
-        self._item = item
-
-    def _refCount(self):
-
-        return super(Children, self).__len__() + 1
-        
-    def linkChanged(self, link, key):
-
-        self._item.setDirty(Item.CDIRTY)
-
-    def _unloadChild(self, child):
-
-        self._unloadRef(child)
-    
-    def __repr__(self):
-
-        buffer = None
-
-        try:
-            buffer = cStringIO.StringIO()
-            buffer.write('{(currenly loaded) ')
-            first = True
-            for link in self._itervalues():
-                if not first:
-                    buffer.write(', ')
-                else:
-                    first = False
-                buffer.write(link.getValue(self)._repr_())
-            buffer.write('}')
-
-            return buffer.getvalue()
-
-        finally:
-            if buffer is not None:
-                buffer.close()
-
-    def _saveValues(self, version):
-        raise NotImplementedError, "%s._saveValues" %(type(self))

Index: chandler/repository/persistence/DBRefs.py
diff -u chandler/repository/persistence/DBRefs.py:1.5 chandler/repository/persistence/DBRefs.py:1.6
--- chandler/repository/persistence/DBRefs.py:1.5	Tue Mar 22 16:56:35 2005
+++ chandler/repository/persistence/DBRefs.py	Mon Apr  4 15:13:21 2005
@@ -1,15 +1,15 @@
 
-__revision__  = "$Revision: 1.5 $"
-__date__      = "$Date: 2005/03/23 00:56:35 $"
+__revision__  = "$Revision: 1.6 $"
+__date__      = "$Date: 2005/04/04 22:13:21 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
 from cStringIO import StringIO
 
-from repository.item.Item import Item, Children
+from repository.item.Children import Children
 from repository.item.RefCollections import RefList
 from repository.item.Indexes import NumericIndex
-from repository.persistence.RepositoryError import MergeError, ItemViewError
+from repository.persistence.RepositoryError import MergeError
 from chandlerdb.util.uuid import UUID
 from repository.util.LinkedMap import LinkedMap
 
@@ -108,10 +108,6 @@
 
     def _loadRef(self, key):
 
-        view = self.view
-        if view is not view.repository.view:
-            raise ItemViewError, (self._item, view.repository.view)
-
         if self._isRemoved(key):
             return None
         

Index: chandler/repository/item/Indexes.py
diff -u chandler/repository/item/Indexes.py:1.11 chandler/repository/item/Indexes.py:1.12
--- chandler/repository/item/Indexes.py:1.11	Fri Mar 18 13:41:46 2005
+++ chandler/repository/item/Indexes.py	Mon Apr  4 15:13:19 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.11 $"
-__date__      = "$Date: 2005/03/18 21:41:46 $"
+__revision__  = "$Revision: 1.12 $"
+__date__      = "$Date: 2005/04/04 22:13:19 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -49,6 +49,9 @@
     def getIndexType(self):
         raise NotImplementedError, "%s.getIndexType" %(type(self))
 
+    def getInitKeywords(self):
+        raise NotImplementedError, "%s.getInitKeywords" %(type(self))
+
     def __len__(self):
         return self._count
 
@@ -140,6 +143,10 @@
 
         return 'numeric'
 
+    def getInitKeywords(self):
+
+        return {}
+
     def insertKey(self, key, afterKey):
 
         self.insert(self, key, afterKey)
@@ -197,6 +204,10 @@
             else:
                 self._descending = False
 
+    def getInitKeywords(self):
+
+        return {'descending': self._descending }
+
     def compare(self, k0, k1):
 
         raise NotImplementedError, '%s is abstract' % type(self)
@@ -319,6 +330,13 @@
 
         return 'attribute'
     
+    def getInitKeywords(self):
+
+        kwds = super(AttributeIndex, self).getInitKeywords()
+        kwds['attribute'] = self._attribute
+
+        return kwds
+
     def compare(self, k0, k1):
 
         v0 = self._valueMap[k0].getAttributeValue(self._attribute)
@@ -365,6 +383,13 @@
 
         return 'compare'
     
+    def getInitKeywords(self):
+
+        kwds = super(AttributeIndex, self).getInitKeywords()
+        kwds['compare'] = self._compare
+
+        return kwds
+
     def compare(self, k0, k1):
 
         return getattr(self._valueMap[k0], self._compare)(self._valueMap[k1])

Index: chandler/repository/persistence/RepositoryView.py
diff -u chandler/repository/persistence/RepositoryView.py:1.37 chandler/repository/persistence/RepositoryView.py:1.38
--- chandler/repository/persistence/RepositoryView.py:1.37	Fri Mar 25 13:53:57 2005
+++ chandler/repository/persistence/RepositoryView.py	Mon Apr  4 15:13:21 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.37 $"
-__date__      = "$Date: 2005/03/25 21:53:57 $"
+__revision__  = "$Revision: 1.38 $"
+__date__      = "$Date: 2005/04/04 22:13:21 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -9,20 +9,17 @@
 from threading import currentThread, Thread
 
 from chandlerdb.util.uuid import UUID
+from chandlerdb.item.item import CItem
 from repository.util.Path import Path
 from repository.util.ThreadSemaphore import ThreadSemaphore
+from repository.util.Lob import Lob
 from repository.persistence.RepositoryError \
-     import RepositoryError, VersionConflictError, ViewError, \
-            RecursiveLoadItemError
-from repository.item.Item import Item
-from repository.item.ItemHandler import ItemHandler
-from repository.persistence.PackHandler import PackHandler
-import Repository
+     import RepositoryError, VersionConflictError, \
+            RecursiveLoadItemError, ItemImportError
+from repository.item.Children import Children
+from repository.item.RefCollections import TransientRefList
 
 
-timing = False
-if timing: import tools.timing
-
 class RepositoryView(object):
     """
     This class implements the cache for loaded items. Changes to items in a
@@ -43,7 +40,7 @@
 
         super(RepositoryView, self).__init__()
 
-        if not repository.isOpen():
+        if repository is not None and not repository.isOpen():
             raise RepositoryError, "Repository is not open"
 
         self.repository = repository
@@ -80,6 +77,10 @@
 
         return False
 
+    def _isNullView(self):
+
+        return False
+
     def _createRefList(self, item, name, otherName,
                        persist, readOnly, new, uuid):
 
@@ -109,10 +110,11 @@
         self._status = RepositoryView.OPEN
 
         repository = self.repository
-        if repository.isRefCounted():
-            self._status |= RepositoryView.REFCOUNTED
-        repository.store.attachView(self)
-        repository._openViews.append(self)
+        if repository is not None:
+            if repository.isRefCounted():
+                self._status |= RepositoryView.REFCOUNTED
+            repository.store.attachView(self)
+            repository._openViews.append(self)
 
     def __len__(self):
 
@@ -126,13 +128,13 @@
 
         if dirty:
             if not self._status & RepositoryView.LOADING:
-                self._status |= Item.CDIRTY
+                self._status |= CItem.CDIRTY
         else:
-            self._status &= ~Item.CDIRTY
+            self._status &= ~CItem.CDIRTY
 
     def isDirty(self):
 
-        return self._status & Item.CDIRTY != 0
+        return self._status & CItem.CDIRTY != 0
 
     def closeView(self):
         """
@@ -146,9 +148,10 @@
             raise RepositoryError, "RepositoryView is not open"
 
         repository = self.repository
-        if repository._threaded.view is self:
-            del repository._threaded.view
-        repository._openViews.remove(self)
+        if repository is not None:
+            if repository._threaded.view is self:
+                del repository._threaded.view
+            repository._openViews.remove(self)
         
         for item in self._registry.itervalues():
             item._setStale()
@@ -157,9 +160,10 @@
         self._roots = None
         self._deletedRegistry.clear()
         self._instanceRegistry.clear()
-        self._status &= ~(RepositoryView.OPEN | Item.CDIRTY)
+        self._status &= ~(RepositoryView.OPEN | CItem.CDIRTY)
 
-        repository.store.detachView(self)
+        if repository is not None:
+            repository.store.detachView(self)
 
     def prune(self, size):
         """
@@ -213,9 +217,6 @@
 
     def _setLoading(self, loading, runHooks=False):
 
-        if self.repository.view is not self:
-            raise ViewError, (self, self.repository.view)
-
         status = (self._status & RepositoryView.LOADING != 0)
 
         if loading:
@@ -398,16 +399,9 @@
         @type parent: an item
         """
 
-        if timing: tools.timing.begin("Load pack")
-
-        packs = self.getRoot('Packs')
-        if not packs:
-            packs = Item('Packs', self, None)
-
+        from repository.persistence.PackHandler import PackHandler
         PackHandler(path, parent, self).parseFile(path)
 
-        if timing: tools.timing.end("Load pack")
-
     def dir(self, item=None, path=None):
         """
         Print out a listing of each item in the repository or under item.
@@ -552,6 +546,10 @@
 
         return not self.isLoading()
 
+    def _unsavedItems(self):
+
+        raise NotImplementedError, "%s._unsavedItems" %(type(self))
+
     def _addItem(self, item, previous=None, next=None):
 
         name = item.itsName
@@ -625,7 +623,7 @@
                size of the cache drops below 90% of this threshhold.
         """
         
-        raise NotImplementedError, "%s.commit" %(type(self))
+        raise NotImplementedError, "%s.refresh" %(type(self))
 
     def commit(self, mergeFn=None):
         """
@@ -691,9 +689,6 @@
     def _loadRoot(self, name):
         raise NotImplementedError, "%s._loadRoot" %(type(self))
 
-    def _newItems(self):
-        raise NotImplementedError, "%s._newItems" %(type(self))
-
     def __getUUID(self):
 
         return self.repository.itsUUID
@@ -772,20 +767,115 @@
         
     def _commitMerge(self):
 
-        if self._status & Item.CMERGED:
+        if self._status & CItem.CMERGED:
             self._roots._commitMerge()
 
     def _revertMerge(self):
 
-        if self._status & Item.CMERGED:
+        if self._status & CItem.CMERGED:
             self._roots._revertMerge()
 
-        self._status &= ~Item.MERGED
+        self._status &= ~CItem.MERGED
 
     def getItemVersion(self, version, item):
 
         return self.repository.store.getItemVersion(version, item._uuid)
 
+    def addNotificationCallback(self, fn):
+
+        self.repository.addNotificationCallback(fn)
+
+    def removeNotificationCallback(self, fn):
+
+        return self.repository.removeNotificationCallback(fn)
+
+    def importItem(self, item):
+
+        if self.find(item._uuid) is not None:
+            raise ItemImportError, (item, self, "item already exists")
+
+        items = set()
+        view = item.itsView
+        if view is self:
+            return items
+
+        item._collectItems(items,
+                           lambda _item: (_item.isNew() or
+                                          self.find(_item._uuid) is None))
+                           
+        sameType = type(self) is type(view)
+
+        for _item in items:
+            kind = _item._kind
+            if not (kind is None or kind in items):
+                localKind = self.find(kind._uuid)
+                if localKind is None:
+                    raise ItemImportError, (_item, self,
+                                            "Kind %s not found" %(kind.itsPath))
+                item._kind = kind
+
+            for key, value in _item._values.iteritems():
+                if not sameType and isinstance(value, Lob):
+                    _item._values[key] = value.copy(self)
+
+            for key, value in _item._references.items():
+                if value is not None:
+                    if value._isRefList():
+                        if sameType or value._isTransient():
+                            previous = None
+                            for other in value:
+                                if other not in items:
+                                    value.remove(other)
+                                    other = self.find(other._uuid)
+                                    value.insertItem(other, previous)
+                        else:
+                            localValue = self._createRefList(_item, value._name, value._otherName, True, False, True, UUID())
+                            value._copyIndexes(localValue)
+                            for other in value:
+                                if other in items:
+                                    localValue._setRef(other, load=True,
+                                                       noMonitors=True)
+                                else:
+                                    value.remove(other)
+                                    path = other.itsPath
+                                    other = self.find(other._uuid)
+                                    localValue.append(other)
+                            localValue._aliases = value._aliases
+                            _item._references[key] = localValue
+                    else:
+                        if value._isUUID():
+                            value = self.find(value)
+                        if value not in items:
+                            _item.removeAttributeValue(key)
+                            _item.setAttributeValue(key, value)
+
+        for _item in items:
+            parent = _item.itsParent
+            if hasattr(type(_item), 'onItemImport'):
+                _item.onItemImport(self)
+            if not parent in items:
+                if parent is view:
+                    localParent = self
+                else:
+                    localParent = self.find(parent._uuid)
+                if localParent is not parent:
+                    def setRoot(root, __item):
+                        view._unregisterItem(__item, False)
+                        self._registerItem(__item)
+                        __item._root = root
+                        for child in __item.iterChildren():
+                            setRoot(root, child)
+                    if _item.isNew():
+                        parent._removeItem(_item)
+                    else:
+                        parent._unloadChild(_item)
+                    root = localParent._addItem(_item)
+                    _item._parent = localParent
+                    setRoot(root, _item)
+
+        return items
+
+
     itsUUID = property(__getUUID)
     itsName = property(__getName)
     itsPath = property(_getPath)
@@ -803,16 +893,10 @@
     COMMITTING = 0x0008
     FDIRTY     = 0x0010
     
-    # flags from Item
+    # flags from CItem
     # CDIRTY   = 0x0200
     # merge flags
 
-    def addNotificationCallback(self, fn):
-        self.repository.addNotificationCallback(fn)
-
-    def removeNotificationCallback(self, fn):
-        return self.repository.removeNotificationCallback(fn)
-
 
 class OnDemandRepositoryView(RepositoryView):
 
@@ -948,292 +1032,160 @@
                         item._unloadItem(False)
                     else:
                         self.logger.warn('not pruning %s (refCount %d)',
-                                         Item.__repr__(item),
-                                         pythonRefs - itemRefs)
+                                         item._repr_(), pythonRefs - itemRefs)
             else:
                 for i in xrange(count):
                     registry[heapq.heappop(heap)[1]]._unloadItem(False)
 
 
-class AbstractRepositoryViewManager(object):
+class NullRepositoryView(RepositoryView):
 
-    def __init__(self, repository, viewName = None):
-        """
-        Base Class for View Context Management.
+    def __init__(self):
 
-        @param repository: a Repository instance
-        @type repository: C{Repository}
-        @param viewName: The name to assign as the key for the view
-        @type name: a string
-        @return: C{None}
-        """
+        super(NullRepositoryView, self).__init__(None, "null view")
 
-        if repository is None:
-            raise RepositoryError, "Repository Instance is None"
+        self._logger = logging.getLogger('repository')
+        self._logger.addHandler(logging.StreamHandler())
+        
+    def setCurrentView(self):
 
-        self.repository = repository
-        self.view = self.repository.createView(viewName)
-        self.prevView = None
-        self.callChain = False
-        self.log = self._getLog()
+        raise AssertionError, "Null view cannot be made current"
 
-    def _getLog(self):
-        """
-        This method is called by the __init__ method to retrieve a C{logging.Logger} for
-        logging.
+    def refresh(self, mergeFn=None):
+        
+        raise AssertionError, "Null view cannot refresh"
 
-        This method can be sub-classed to return a custom logger by the child.
+    def commit(self, mergeFn=None):
+        
+        raise AssertionError, "Null view cannot commit"
 
-        @return: C{logging.Logger}
-        """
+    def cancel(self):
+        
+        raise AssertionError, "Null view cannot cancel"
 
-        log = logging.getLogger("AbstractRepositoryViewManager")
-        log.setLevel(logging.DEBUG)
-        return log
+    def _createRefList(self, item, name, otherName,
+                       persist, readOnly, new, uuid):
 
-    def setViewCurrent(self):
-        """
-        This method changes the current C{RepositoryView} to be the C{RepositoryView} associated with the 
-        C{AbstractRepositoryViewManger} instance.
+        return NullViewRefList(item, name, otherName, persist, readOnly)
+    
+    def _createChildren(self, parent, new):
 
-        It saves the previous C{RepositoryView}. Calling C{AbstractRepositoryViewManager.restorePreviousView} will
-        set the previous C{RepositoryView} as the current C{RepositoryView}.
+        return Children(parent, new)
+    
+    def _getLobType(self):
 
-        @return: C{None}
-        """
+        return NullViewLob
 
-        assert self.callChain is False, "setViewCurrent called again before a restorePreviousView"
+    def _findSchema(self, spec, withSchema):
 
-        assert self.prevView is None, "Nested prevView investigate"
-        self.prevView = self.getCurrentView()
-        self.repository.setCurrentView(self.view)
+        return self.find(spec, load=False)
 
-        self.callChain = True
+    def _loadItem(self, uuid):
 
+        return None
 
-    def restorePreviousView(self):
-        """
-        This method will restore the C{RepositoryView} that was current before 
-        C{AbstractRepositoryViewManager.setViewCurrent} when called.
+    def setDirty(self, dirty):
 
-        The C{AbstractRepositoryViewManager.setViewCurrent} method must be called before this method.
+        pass
 
-        @return: C{None}
-        """
+    def isDirty(self):
 
-        if self.callChain is not True:
-            raise RepositoryError, "restorePreviousView called before setViewCurrent"
+        return False
 
-        if self.prevView is not None:
-             self.repository.setCurrentView(self.prevView)
-             self.prevView = None
+    def isOpen(self):
 
-        self.callChain = False
+        return (self._status & RepositoryView.OPEN) != 0
 
+    def isNew(self):
 
-    def execInView(self, method, *args, **kw):
-        """
-        This utility method will call C{AbstractRepositoryViewManager.setCurrentView}.
-        Execute the method passed in as an argument and call
-        C{AbstractRepositoryViewManager.restorePreviousView} when the method is finished executing.
+        return False
 
-        It abstracts the C{RepositoryView} switching logic for the caller and is the recommended means of
-        executing code that utilizes a C{RepositoryView}.
+    def isStale(self):
 
-        @param method: The method to execute
-        @type method: a string
-        @param args: Arguments to pass to the method
-        @type args: list reference
-        @param kw: Keyword dict to pass to the method
-        @type args: dict reference
-        @return: The value returned by the method call or None
-        """
+        return False
 
-        result = None
+    def isRefCounted(self):
 
-        self.setViewCurrent()
+        return True
+        
+    def isLoading(self):
 
-        try:
-            result = method(*args, **kw)
+        return False
 
-        finally:
-            self.restorePreviousView()
+    def _isNullView(self):
 
-        return result
+        return True
 
+    def _setLoading(self, loading, runHooks=False):
 
-    def execInViewThenCommit(self, method, *args, **kw):
-        """
-        This utility method will call C{AbstractRepositoryViewManager.setCurrentView},
-        execute the method passed in as an argument and perform a Repository commit in
-        the current Thread then call C{AbstractRepositoryViewManager.restorePreviousView}.
-
-        It abstracts the C{RepositoryView} switching and commit logic for the caller and
-        is the recommended means of executing a method and inline commit in a C{RepositoryView}.
-
-        @param method: The method to execute
-        @type method: a string
-        @param args: Arguments to pass to the method
-        @type args: list reference
-        @param kw: Keyword dict to pass to the method
-        @type args: dict reference
-        @return: The value returned by the method call or None
-        """
-        result = None
+        raise AssertionError, "Null view cannot load items"
 
-        self.setViewCurrent()
+    def _getStore(self):
 
-        try:
-            result = method(*args, **kw)
-            self.__commit()
-        finally:
-            self.restorePreviousView()
+        return None
 
-        return result
+    def _logItem(self, item):
 
-    def execInViewThenCommitInThread(self, method, *args, **kw):
-        """
-        This utility method will call C{AbstractRepositoryViewManager.setCurrentView},
-        execute the method passed in as an argument, spawn a C{RepositoryThread} to perform
-        a Repository commit, then call C{AbstractRepositoryViewManager.restorePreviousView}. 
-        Spawning a C{RepositoryThread}prevents the current Thread from blocking which the 
-        C{RepositoryView} is commiting. This is especially useful
-        when a Asynchronous model is employed.
-
-        The method abstracts the C{RepositoryView} switching and commit logic for the caller and
-        is the recommended means of executing a method and non-blocking commit in a C{RepositoryView}.
-
-        @param method: The method to execute
-        @type method: a string
-        @param args: Arguments to pass to the method
-        @type args: list reference
-        @param kw: Keyword dict to pass to the method
-        @type args: dict reference
-        @return: The value returned by the method call or None
-        """
+        return True
 
-        result = self.execInView(method, *args, **kw)
-        self.commitInView(True)
-        return result
+    def _unsavedItems(self):
 
-    def getCurrentView(self):
-        """
-        Gets the current C{RepositoryView} the C{Repository} is working with
-        @return: C{RepositoryView}
-        """
+        return self._registry.itervalues()
 
-        return self.repository.getCurrentView(False)
+    def getLogger(self):
 
-    def printCurrentView(self, printString = None):
-        """
-        Writes the current C{RepositoryView} as well as optional printString to the C{logging.Logger}
-        instance. This method is useful for C{RepositoryView} debugging.
+        return self._logger
 
-        @param printString: An optional string to display with the message (i.e. the name of the calling method)
-        @type printString: string
-        @return: C{None}
-        """
+    def isDebug(self):
 
-        str = None
+        return self._logger.getEffectiveLevel() <= logging.DEBUG
 
-        if printString is None:
-             self.log.info("Current View is: %s" % self.getCurrentView())
-        else:
-             self.log.info("[%s] Current View is: %s" % (printString, self.getCurrentView()))
+    def __getUUID(self):
 
+        return self.itsUUID
 
-    def commitInView(self, useThread=False):
-        """
-        Runs a C{RepositoryView} commit. If the commit is successful calls the
-        C{AbstractRepositoryViewManager._viewCommitSuccess} method otherwise calls
-        the C{AbstractRepositoryViewManager._viewCommitFailed} method. Both methods
-        can be subclassed to add additional functionality. An optional useThread
-        argument can be passed which indicates to run the commit in a dedicated
-        C{RepositoryThread} to prevent blocking the current thread.
+    def getRepositoryView(self):
 
-        @param useThread: Flag to indicate whether to run the view commit in the current
-                          thread or a dedicated C{RepositoryThread} to prevent blocking
-        @type: boolean
-        @return: C{None}
-        """
+        return self
+
+    def getItemVersion(self, version, item):
 
-        if useThread:
-            thread = Repository.RepositoryThread(target=self.__commitInView)
-            thread.start()
+        return item._version
 
-        else:
-            self.__commitInView
+    def queryItems(self, kind=None, attribute=None, load=True):
 
-    def _viewCommitSuccess(self):
-         """
-         Called by C{AbstractRepositoryViewManager.commitView} when a
-         C{RepositoryView} is commited.
+        if kind is not None:
+            return [item for item in self._registry.itervalues()
+                    if item._kind is kind]
 
-         Overide this method to handle any additional functionality needed
-         when a C{RepositoryView} is committed.
-         @return: C{None}
-         """
+        elif attribute is not None:
+            raise NotImplementedError, 'attribute query'
 
-         pass
+        else:
+            raise ValueError, 'one of kind or value must be set'
 
-    def _viewCommitFailed(self, err):
-         """
-         Called by C{AbstractRepositoryViewManager.commitView} when a
-         C{RepositoryView} raises an error on commited.
 
-         Overide this method to handle any additional functionality needed
-         when a C{RepositoryView} fails on commit.
+    logger = property(getLogger)
+    itsUUID = UUID('17368718-a164-11d9-9351-000393db837c')
 
-         @param err: A Python Exception instance to use for debugging and error message display
-         @type Exception
 
-         @return: C{None}
-         """
-         str = "View Commit Failed: %s" % err
-         self.log.error(str)
+class NullViewLob(Lob):
 
-    def __commitInView(self):
-        """
-        Sets the current view then Attempts to commit the view.
-        Calls viewCommitSuccess or viewCommitFailed. Then restore the 
-        previous view. Need to sync with Andi on
-        what happens in the case of a conflict or
-        failed commit. This is still being resolved
-        by the repository team
-        """
+    def __init__(self, view, *args, **kwds):
 
-        self.setViewCurrent()
+        super(NullViewLob, self).__init__(*args, **kwds)
 
-        try:
-            self.__commit()
 
-        finally:
-            self.restorePreviousView()
+class NullViewRefList(TransientRefList):
 
-    def __commit(self):
-        """
-        Attempts to commit in the view. Calls viewCommitSuccess or
-        viewCommitFailed.  This method does not set or unset the current 
-        view.  Need to sync with Andi on
-        what happens in the case of a conflict or
-        failed commit. This is still being resolved
-        by the repository team
-        """
+    def __init__(self, item, name, otherName, persist, readOnly):
 
-        try:
-           self.view.commit()
+        super(NullViewRefList, self).__init__(item, name, otherName, readOnly)
+        self._transient = not persist
 
-        except RepositoryError, e:
-           """This condition needs to be flushed out more"""
-           self._viewCommitFailed(e)
-
-        except VersionConflictError, e1:
-           """This condition needs to be flushed out more"""
-           self._viewCommitFailed(e1)
-
-        except Exception, e2:
-           """Catch any unknown exceptions raised by the Repository"""
-           self._viewCommitFailed(e2)
+    def _isTransient(self):
 
-        else:
-           self._viewCommitSuccess()
+        return self._transient
+
+
+nullRepositoryView = NullRepositoryView()

Index: chandler/repository/schema/Kind.py
diff -u chandler/repository/schema/Kind.py:1.107 chandler/repository/schema/Kind.py:1.108
--- chandler/repository/schema/Kind.py:1.107	Tue Mar 29 14:58:52 2005
+++ chandler/repository/schema/Kind.py	Mon Apr  4 15:13:21 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.107 $"
-__date__      = "$Date: 2005/03/29 22:58:52 $"
+__revision__  = "$Revision: 1.108 $"
+__date__      = "$Date: 2005/04/04 22:13:21 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -125,7 +125,7 @@
             else:
                 self.itsView.logger.warn("Not installing attribute descriptor for '%s' since it would shadow already existing descriptor: %s", name, descriptor)
 
-    def newItem(self, name, parent, cls=None):
+    def newItem(self, name=None, parent=None, cls=None):
         """
         Create an new item of this kind.
 
@@ -137,9 +137,9 @@
         @param name: The name of the item. It must be unique among the names
         this item's siblings. C{name} may be C{None}.
         @type name: a string or C{None} to create an anonymous item.
-        @param parent: The parent of this item. All items require a parent
-        unless they are a repository root in which case the parent argument
-        is the repository.
+        @param parent: The parent of this item. C{parent} is
+        optional. When ommitted, the item is made a root of either the
+        C{kind}'s view or of the global null view.
         @type parent: an item or the item's repository view
         @param cls: an optional python class to instantiate the item with,
         defaults to the class set on this kind.
@@ -167,8 +167,8 @@
         this item's siblings. C{name} may be C{None}.
         @type name: a string or C{None} to create an anonymous item.
         @param parent: The parent of this item. All items require a parent
-        unless they are a repository root in which case the parent argument
-        is the repository.
+        unless they are a repository root in which case C{parent} is a
+        repository view.
         @type parent: an item or the item's repository view
         @param uuid: The uuid for the item.
         @type uuid: L{UUID<chandlerdb.util.uuid.UUID>}

Index: chandler/repository/util/Lob.py
diff -u chandler/repository/util/Lob.py:1.11 chandler/repository/util/Lob.py:1.12
--- chandler/repository/util/Lob.py:1.11	Tue Feb 15 16:29:21 2005
+++ chandler/repository/util/Lob.py	Mon Apr  4 15:13:23 2005
@@ -1,6 +1,6 @@
 
-__revision__  = "$Revision: 1.11 $"
-__date__      = "$Date: 2005/02/16 00:29:21 $"
+__revision__  = "$Revision: 1.12 $"
+__date__      = "$Date: 2005/04/04 22:13:23 $"
 __copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
 __license__   = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -91,6 +91,37 @@
 
         return self._data
 
+    def load(self, data, attrs):
+        
+        self.mimetype = attrs.get('mimetype', 'text/plain')
+        if attrs.has_key('encoding'):
+            self.encoding = attrs['encoding']
+
+        self._compression = attrs.get('compression', None)
+        self._encryption = attrs.get('encryption', None)
+        self._version = long(attrs.get('version', '0'))
+        self._indexed = attrs.get('indexed', 'False') == 'True'
+
+        if attrs.get('type', 'text') == 'text':
+            writer = self.getWriter()
+            writer.write(data)
+            writer.close()
+
+    def copy(self, view, key=None):
+
+        copy = view._getLobType()(view, self.encoding,
+                                  self.mimetype, self._indexed)
+
+        inputStream = self.getInputStream(key)
+        outputStream = copy.getOutputStream(self._compression, self._encryption,
+                                            key)
+
+        outputStream.write(inputStream.read())
+        outputStream.close()
+        inputStream.close()
+
+        return copy
+
     def getWriter(self, compression='bz2', encryption=None, key=None,
                   append=False, replace=False):
 



More information about the Commits mailing list