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))