Reverting the 'empty cmisra:content' element change previously implemented b/c it breaks older versions of Alfresco. Adding initial support for renditions. Removing three unit tests that are not strictly required by the spec.
git-svn-id: https://svn.apache.org/repos/asf/chemistry/cmislib/trunk@1394812 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/cmislib/model.py b/src/cmislib/model.py
index 2947bc6..3a72b62 100644
--- a/src/cmislib/model.py
+++ b/src/cmislib/model.py
@@ -77,6 +77,7 @@
ACL_REL = 'http://docs.oasis-open.org/ns/cmis/link/200908/acl'
CHANGE_LOG_REL = 'http://docs.oasis-open.org/ns/cmis/link/200908/changes'
POLICIES_REL = 'http://docs.oasis-open.org/ns/cmis/link/200908/policies'
+RENDITION_REL = 'alternate'
# Collection types
QUERY_COLL = 'query'
@@ -2643,10 +2644,25 @@
# if Renditions capability is None, return notsupported
if self._repository.getCapabilities()['Renditions']:
- raise NotImplementedError
+ pass
else:
raise NotSupportedException
+ if self.xmlDoc == None:
+ self.reload()
+
+ linkElements = self.xmlDoc.getElementsByTagNameNS(ATOM_NS, 'link')
+
+ renditions = []
+ for linkElement in linkElements:
+
+ if linkElement.attributes.has_key('rel'):
+ relAttr = linkElement.attributes['rel'].value
+
+ if relAttr == RENDITION_REL:
+ renditions.append(Rendition(linkElement))
+ return renditions
+
checkedOut = property(isCheckedOut)
def getPaths(self):
@@ -3886,6 +3902,78 @@
return self._results
+class Rendition(object):
+
+ """
+ This class represents a Rendition.
+ """
+
+ def __init__(self, propNode):
+ """Constructor"""
+ self.xmlDoc = propNode
+ self.logger = logging.getLogger('cmislib.model.Rendition')
+ self.logger.info('Creating an instance of Rendition')
+
+ def __str__(self):
+ """To string"""
+ return self.getStreamId()
+
+ def getStreamId(self):
+ """Getter for the rendition's stream ID"""
+ if self.xmlDoc.attributes.has_key('streamId'):
+ return self.xmlDoc.attributes['streamId'].value
+
+ def getMimeType(self):
+ """Getter for the rendition's mime type"""
+ if self.xmlDoc.attributes.has_key('type'):
+ return self.xmlDoc.attributes['type'].value
+
+ def getLength(self):
+ """Getter for the renditions's length"""
+ if self.xmlDoc.attributes.has_key('length'):
+ return self.xmlDoc.attributes['length'].value
+
+ def getTitle(self):
+ """Getter for the renditions's title"""
+ if self.xmlDoc.attributes.has_key('title'):
+ return self.xmlDoc.attributes['title'].value
+
+ def getKind(self):
+ """Getter for the renditions's kind"""
+ if self.xmlDoc.hasAttributeNS(CMISRA_NS, 'renditionKind'):
+ return self.xmlDoc.getAttributeNS(CMISRA_NS, 'renditionKind')
+
+ def getHeight(self):
+ """Getter for the renditions's height"""
+ if self.xmlDoc.attributes.has_key('height'):
+ return self.xmlDoc.attributes['height'].value
+
+ def getWidth(self):
+ """Getter for the renditions's width"""
+ if self.xmlDoc.attributes.has_key('width'):
+ return self.xmlDoc.attributes['width'].value
+
+ def getHref(self):
+ """Getter for the renditions's href"""
+ if self.xmlDoc.attributes.has_key('href'):
+ return self.xmlDoc.attributes['href'].value
+
+ def getRenditionDocumentId(self):
+ """Getter for the renditions's width"""
+ if self.xmlDoc.attributes.has_key('renditionDocumentId'):
+ return self.xmlDoc.attributes['renditionDocumentId'].value
+
+ streamId = property(getStreamId)
+ mimeType = property(getMimeType)
+ length = property(getLength)
+ title = property(getTitle)
+ kind = property(getKind)
+ height = property(getHeight)
+ width = property(getWidth)
+ href = property(getHref)
+ renditionDocumentId = property(getRenditionDocumentId)
+
+
class CmisId(str):
"""
@@ -4060,8 +4148,6 @@
entryElement.setAttribute('xmlns:cmisra', CMISRA_NS)
entryXmlDoc.appendChild(entryElement)
- contentElement = entryXmlDoc.createElementNS(CMISRA_NS, 'cmisra:content')
-
# if there is a File, encode it and add it to the XML
if contentFile:
mimetype = contentType
@@ -4091,10 +4177,10 @@
base64Element = entryXmlDoc.createElementNS(CMISRA_NS, 'cmisra:base64')
base64ElementText = entryXmlDoc.createTextNode(fileData)
base64Element.appendChild(base64ElementText)
+ contentElement = entryXmlDoc.createElementNS(CMISRA_NS, 'cmisra:content')
contentElement.appendChild(mediaElement)
contentElement.appendChild(base64Element)
-
- entryElement.appendChild(contentElement)
+ entryElement.appendChild(contentElement)
objectElement = entryXmlDoc.createElementNS(CMISRA_NS, 'cmisra:object')
objectElement.setAttribute('xmlns:cmis', CMIS_NS)
diff --git a/src/tests/cmislibtest.py b/src/tests/cmislibtest.py
index 74b9441..3fbb9da 100644
--- a/src/tests/cmislibtest.py
+++ b/src/tests/cmislibtest.py
@@ -105,12 +105,6 @@
cmisClient = CmisClient(settings.REPOSITORY_URL + 'foobar', settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
self.assertRaises(CmisException, cmisClient.getRepositories)
- def testCmisClientBadAuth(self):
- '''Try to instantiate a CmisClient object with bad creds'''
- cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, 'BADPASS')
- self.assertRaises(PermissionDeniedException,
- cmisClient.getRepositories)
-
def testGetRepositoryBadId(self):
'''Try to get a repository with a bad repo ID'''
cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
@@ -666,20 +660,6 @@
self.assertEquals(len(subFolder1.getChildren()), 1)
self.assertEquals(doc.name, subFolder1.getChildren()[0].name)
- def testFolderLeadingDot(self):
- '''Create a folder with a leading dot in its name'''
- leadingDotFolder = self._testFolder.createFolder('.leadingDot')
- resultSet = self._testFolder.getChildren()
- self.assert_(resultSet != None)
- self.assertTrue(leadingDotFolder.getName().startswith('.'))
-
- def testFolderTrailingDot(self):
- '''Create a folder with a trailing dot in its name'''
- trailingDotFolder = self._testFolder.createFolder('trailingDot.')
- resultSet = self._testFolder.getChildren()
- self.assert_(resultSet != None)
- self.assertTrue(trailingDotFolder.getName().endswith('.'))
-
def testGetPaths(self):
'''Get a folder's paths'''
# ask the root for its path
@@ -1465,7 +1445,6 @@
# tts.addTests(TestLoader().loadTestsFromName('testAddObject', FolderTest))
# tts.addTests(TestLoader().loadTestsFromName('testRemoveObject', FolderTest))
# tts.addTests(TestLoader().loadTestsFromName('testFolderLeadingDot', FolderTest))
-# tts.addTests(TestLoader().loadTestsFromName('testFolderTrailingDot', FolderTest))
# tts.addTests(TestLoader().loadTestsFromName('testGetObjectParents', DocumentTest))
# tts.addTests(TestLoader().loadTestsFromName('testGetObjectParentsMultiple', DocumentTest))