Work-in-progress on change entry support for the cmislib browser binding.
git-svn-id: https://svn.apache.org/repos/asf/chemistry/cmislib/trunk@1758999 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/cmislib/browser/binding.py b/src/cmislib/browser/binding.py
index 800223c..4feb124 100644
--- a/src/cmislib/browser/binding.py
+++ b/src/cmislib/browser/binding.py
@@ -1238,8 +1238,20 @@
>>> rs[0].changeTime
datetime.datetime(2010, 2, 16, 20, 6, 37)
"""
+ if self.getCapabilities()['Changes'] is None:
+ raise NotSupportedException(messages.NO_CHANGE_LOG_SUPPORT)
- pass
+ changesUrl = self.getRootFolderUrl() + "?selector=contentChanges"
+
+ result = self._cmisClient.binding.get(changesUrl,
+ self._cmisClient.username,
+ self._cmisClient.password,
+ **kwargs)
+
+ return BrowserResultSet(self._cmisClient,
+ self,
+ data=result,
+ serializer=ChangeEntrySerializer())
def createDocumentFromString(self,
name,
@@ -2727,7 +2739,7 @@
result[principalId] = ace
return result
- def addEntry(self, principalId, access, direct):
+ def addEntry(self, principalId, access, direct=True):
"""
Adds an :class:`ACE` entry to the ACL.
@@ -2844,6 +2856,19 @@
u'updated'
"""
+ def __init__(self, cmisClient, repository, data):
+ """Constructor"""
+ self._cmisClient = cmisClient
+ self._repository = repository
+ self._data = data
+ self._properties = {}
+ self._objectId = None
+ self._changeEntryId = None
+ self._changeType = None
+ self._changeTime = None
+ self.logger = logging.getLogger('cmislib.model.ChangeEntry')
+ self.logger.info('Creating an instance of ChangeEntry')
+
def getId(self):
"""
Returns the unique ID of the change entry.
@@ -2942,9 +2967,18 @@
"""
Overriding to make it work with a list instead of a dict.
"""
- # TODO need to implement
- pass
+ if self._results:
+ return self._results
+ if self._data:
+ entries = []
+ for entry in self._data:
+ changeEntry = BrowserChangeEntry(self._cmisClient, self._repository, entry)
+ entries.append(changeEntry)
+
+ self._results = entries
+
+ return self._results
class BrowserRendition(object):
@@ -3233,3 +3267,24 @@
aces.append(entryJSON)
return json.dumps(aces)
+
+class ChangeEntrySerializer(object):
+
+ """
+ Responsible for serializing lists of change entries.
+ """
+
+ def fromJSON(self, client, repo, jsonObj):
+ """Transforms from JSON to the object."""
+ self.logger = logging.getLogger('cmislib.browser.binding.ChangeEntrySerializer')
+ entries = []
+ for obj in jsonObj['objects']:
+ self.logger.debug("Parsing a change entry object")
+ dataObj = obj['object']
+ cmisObject = getSpecializedObject(BrowserChangeEntry(client,
+ repo,
+ data=dataObj))
+ self.logger.debug("Parsed a change entry object, appending")
+ entries.append(cmisObject)
+
+ return entries
diff --git a/src/cmislib/messages.py b/src/cmislib/messages.py
index b0ff6cc..2df8e45 100644
--- a/src/cmislib/messages.py
+++ b/src/cmislib/messages.py
@@ -22,3 +22,4 @@
"""
NO_ACL_SUPPORT = 'This repository does not support ACLs'
NO_CHANGE_LOG_SUPPORT = 'This repository does not support change logs'
+NO_CHANGE_OBJECT_SUPPORT = 'This repository does not support change log entries as objects'
diff --git a/src/tests/cmislibtest.py b/src/tests/cmislibtest.py
index 249576f..a7daabc 100644
--- a/src/tests/cmislibtest.py
+++ b/src/tests/cmislibtest.py
@@ -733,7 +733,8 @@
"""Get the content changes and inspect Change Entry props"""
# need to check changes capability
- if not self._repo.capabilities['Changes']:
+ changeCap = self._repo.capabilities['Changes']
+ if changeCap == 'none':
print messages.NO_CHANGE_LOG_SUPPORT
return
@@ -751,10 +752,15 @@
"""Gets the ACL that is included with a Change Entry."""
# need to check changes capability
- if not self._repo.capabilities['Changes']:
+ changeCap = self._repo.capabilities['Changes']
+ if changeCap == 'none':
print messages.NO_CHANGE_LOG_SUPPORT
return
+ if changeCap == 'objectidsonly':
+ print messages.NO_CHANGE_OBJECT_SUPPORT
+ return
+
# need to check ACL capability
if not self._repo.capabilities['ACL']:
print messages.NO_ACL_SUPPORT
@@ -786,10 +792,14 @@
# need to check changes capability
changeCap = self._repo.capabilities['Changes']
- if not changeCap:
+ if changeCap == 'none':
print messages.NO_CHANGE_LOG_SUPPORT
return
+ if changeCap == 'objectidsonly':
+ print messages.NO_CHANGE_OBJECT_SUPPORT
+ return
+
# need to test once without includeProperties set. the objectID should be there
rs = self._repo.getContentChanges()
self.assertTrue(len(rs) > 0)