You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by jp...@apache.org on 2013/07/06 07:54:03 UTC

svn commit: r1500208 - in /chemistry/cmislib/trunk/src: cmislib/browser_binding.py cmislib/cmis_services.py tests/cmislibtest.py tests/settings.py

Author: jpotts
Date: Sat Jul  6 05:54:03 2013
New Revision: 1500208

URL: http://svn.apache.org/r1500208
Log:
Added selectable binding to cmislib unit tests. Implemented createFolder for the browser binding.

Modified:
    chemistry/cmislib/trunk/src/cmislib/browser_binding.py
    chemistry/cmislib/trunk/src/cmislib/cmis_services.py
    chemistry/cmislib/trunk/src/tests/cmislibtest.py
    chemistry/cmislib/trunk/src/tests/settings.py

Modified: chemistry/cmislib/trunk/src/cmislib/browser_binding.py
URL: http://svn.apache.org/viewvc/chemistry/cmislib/trunk/src/cmislib/browser_binding.py?rev=1500208&r1=1500207&r2=1500208&view=diff
==============================================================================
--- chemistry/cmislib/trunk/src/cmislib/browser_binding.py (original)
+++ chemistry/cmislib/trunk/src/cmislib/browser_binding.py Sat Jul  6 05:54:03 2013
@@ -29,6 +29,7 @@ from util import parsePropValueByType, p
 import json
 import StringIO
 import logging
+from urllib import urlencode
 
 CMIS_FORM_TYPE = 'application/x-www-form-urlencoded;charset=utf-8'
 
@@ -69,7 +70,7 @@ class BrowserBinding(Binding):
             result = json.loads(content)
         return result
 
-    def post(self, url, username, password, payload, contentType, **kwargs):
+    def post(self, url, payload, contentType, username, password, **kwargs):
 
         """
         Does a post against the CMIS service. More than likely, you will not
@@ -91,7 +92,7 @@ class BrowserBinding(Binding):
                              username=username,
                              password=password,
                              **kwargs)
-        if resp['status'] != '200':
+        if resp['status'] != '200' and resp['status'] != '201':
             self._processCommonErrors(resp, url)
         else:
             result = json.loads(content)
@@ -1155,7 +1156,8 @@ class BrowserRepository(object):
     def createFolder(self,
                      parentFolder,
                      name,
-                     properties={}):
+                     properties={},
+                     **kwargs):
 
         """
         Creates a new :class:`Folder` object in the specified parentFolder.
@@ -1173,7 +1175,7 @@ class BrowserRepository(object):
          - removeACEs
         """
 
-        pass
+        return parentFolder.createFolder(name, properties, **kwargs)
 
     def createRelationship(self, sourceObj, targetObj, relType):
         """
@@ -1685,7 +1687,7 @@ class BrowserFolder(BrowserCmisObject):
     A container object that can hold other :class:`CmisObject` objects
     """
 
-    def createFolder(self, name, properties={}):
+    def createFolder(self, name, properties={}, **kwargs):
 
         """
         Creates a new :class:`Folder` using the properties provided.
@@ -1709,7 +1711,36 @@ class BrowserFolder(BrowserCmisObject):
          - removeACEs
         """
 
-        pass
+        # get the root folder URL
+        createFolderUrl = self._repository.getRootFolderUrl()
+
+        props = {"objectId" : self.id,
+                 "cmisaction" : "createFolder",
+                 "propertyId[0]" : "cmis:name",
+                 "propertyValue[0]" : name}
+
+        props["propertyId[1]"] = "cmis:objectTypeId"
+        if properties.has_key('cmis:objectTypeId'):
+            props["propertyValue[1]"] = properties['cmis:objectTypeId']
+        else:
+            props["propertyValue[1]"] = "cmis:folder"
+
+        propCount = 2
+        for prop in properties:
+            props["propertyId[%s]" % propCount] = prop.key
+            props["propertyValue[%s]" % propCount] = prop
+            propCount += 1
+
+        # invoke the URL
+        result = self._cmisClient.binding.post(createFolderUrl.encode('utf-8'),
+                                               urlencode(props),
+                                               'application/x-www-form-urlencoded',
+                                               self._cmisClient.username,
+                                               self._cmisClient.password,
+                                               **kwargs)
+
+        # return the result set
+        return BrowserFolder(self._cmisClient, self._repository, data=result)
 
     def createDocumentFromString(self,
                                  name,

Modified: chemistry/cmislib/trunk/src/cmislib/cmis_services.py
URL: http://svn.apache.org/viewvc/chemistry/cmislib/trunk/src/cmislib/cmis_services.py?rev=1500208&r1=1500207&r2=1500208&view=diff
==============================================================================
--- chemistry/cmislib/trunk/src/cmislib/cmis_services.py (original)
+++ chemistry/cmislib/trunk/src/cmislib/cmis_services.py Sat Jul  6 05:54:03 2013
@@ -50,6 +50,8 @@ class Binding(object):
             raise UpdateConflictException(error['status'], url)
         elif error['status'] == '500':
             raise RuntimeException(error['status'], url)
+        else:
+            raise CmisException(error['status'], url)
 
 
 class RepositoryServiceIfc(object):

Modified: chemistry/cmislib/trunk/src/tests/cmislibtest.py
URL: http://svn.apache.org/viewvc/chemistry/cmislib/trunk/src/tests/cmislibtest.py?rev=1500208&r1=1500207&r2=1500208&view=diff
==============================================================================
--- chemistry/cmislib/trunk/src/tests/cmislibtest.py (original)
+++ chemistry/cmislib/trunk/src/tests/cmislibtest.py Sat Jul  6 05:54:03 2013
@@ -52,7 +52,9 @@ class CmisTestBase(unittest.TestCase):
 
     def setUp(self):
         """ Create a root test folder for the test. """
-        self._cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        self._cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                      binding=settings.BINDING,
+                                      **settings.EXT_ARGS)
         self._repo = self._cmisClient.getDefaultRepository()
         self._rootFolder = self._repo.getObjectByPath(settings.TEST_ROOT_PATH)
         self._folderName = " ".join(['cmislib', self.__class__.__name__, str(time())])
@@ -72,14 +74,18 @@ class CmisClientTest(unittest.TestCase):
 
     def testCmisClient(self):
         """Instantiate a CmisClient object"""
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         self.assert_(cmisClient is not None)
 
     def testGetRepositories(self):
         """Call getRepositories and make sure at least one comes back with
         an ID and a name
         """
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repoInfo = cmisClient.getRepositories()
         self.assert_(len(repoInfo) >= 1)
         self.assert_('repositoryId' in repoInfo[0])
@@ -87,14 +93,18 @@ class CmisClientTest(unittest.TestCase):
 
     def testDefaultRepository(self):
         """Get the default repository by calling the repo's service URL"""
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repo = cmisClient.getDefaultRepository()
         self.assert_(repo is not None)
         self.assert_(repo.getRepositoryId() is not None)
 
     def testGetRepository(self):
         """Get a repository by repository ID"""
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repo = cmisClient.getDefaultRepository()
         defaultRepoId = repo.getRepositoryId()
         defaultRepoName = repo.getRepositoryName()
@@ -105,12 +115,16 @@ class CmisClientTest(unittest.TestCase):
     # Error conditions
     def testCmisClientBadUrl(self):
         """Try to instantiate a CmisClient object with a known bad URL"""
-        cmisClient = CmisClient(settings.REPOSITORY_URL + 'foobar', settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL + 'foobar', settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         self.assertRaises(CmisException, 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)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         self.assertRaises(ObjectNotFoundException,
                           cmisClient.getRepository,
                           '123FOO')
@@ -1311,7 +1325,9 @@ class TypeTest(unittest.TestCase):
     def testTypeDescendants(self):
         """Get the descendant types of the repository."""
 
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repo = cmisClient.getDefaultRepository()
         typeDefs = repo.getTypeDescendants()
         folderDef = None
@@ -1329,7 +1345,9 @@ class TypeTest(unittest.TestCase):
         #This test would be more interesting if there was a standard way to
         #deploy a custom model. Then we could look for custom types.
 
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repo = cmisClient.getDefaultRepository()
         typeDefs = repo.getTypeChildren()
         folderDef = None
@@ -1342,7 +1360,9 @@ class TypeTest(unittest.TestCase):
 
     def testTypeDefinition(self):
         """Get the cmis:document type and test a few props of the type."""
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repo = cmisClient.getDefaultRepository()
         docTypeDef = repo.getTypeDefinition('cmis:document')
         self.assertEquals('cmis:document', docTypeDef.getTypeId())
@@ -1350,7 +1370,9 @@ class TypeTest(unittest.TestCase):
 
     def testTypeProperties(self):
         """Get the properties for a type."""
-        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD, **settings.EXT_ARGS)
+        cmisClient = CmisClient(settings.REPOSITORY_URL, settings.USERNAME, settings.PASSWORD,
+                                binding=settings.BINDING,
+                                **settings.EXT_ARGS)
         repo = cmisClient.getDefaultRepository()
         docTypeDef = repo.getTypeDefinition('cmis:document')
         self.assertEquals('cmis:document', docTypeDef.getTypeId())

Modified: chemistry/cmislib/trunk/src/tests/settings.py
URL: http://svn.apache.org/viewvc/chemistry/cmislib/trunk/src/tests/settings.py?rev=1500208&r1=1500207&r2=1500208&view=diff
==============================================================================
--- chemistry/cmislib/trunk/src/tests/settings.py (original)
+++ chemistry/cmislib/trunk/src/tests/settings.py Sat Jul  6 05:54:03 2013
@@ -16,18 +16,25 @@
 #      specific language governing permissions and limitations
 #      under the License.
 #
+from cmislib.atompub_binding import AtomPubBinding
+from cmislib.browser_binding import BrowserBinding
 
 #
 # Override these settings with values to match your environment.
 #
 # CMIS repository's service URL
 #REPOSITORY_URL = 'http://cmis.alfresco.com/s/cmis' # Alfresco demo
-REPOSITORY_URL = 'http://localhost:8080/chemistry/atom' # Apache Chemistry
-#REPOSITORY_URL = 'http://localhost:8080/alfresco/cmisatom'  # Alfresco 4.0
+#REPOSITORY_URL = 'http://localhost:8080/chemistry/atom' # Apache Chemistry AtomPub
+REPOSITORY_URL = 'http://localhost:8080/chemistry/browser' # Apache Chemistry Browser
+#REPOSITORY_URL = 'http://localhost:8080/alfresco/cmisatom'  # Alfresco 4.0 AtomPub
 #REPOSITORY_URL = 'http://localhost:8080/alfresco/s/api/cmis'  # Alfresco
 #REPOSITORY_URL = 'http://cmis.demo.nuxeo.org/nuxeo/atom/cmis' # Nuxeo demo
 #REPOSITORY_URL = 'http://localhost:8080/nuxeo/atom/cmis' # Nuxeo local
 
+# Choose a binding. The AtomPubBinding is the only one you should really be using right now
+#BINDING = AtomPubBinding()
+BINDING = BrowserBinding()
+
 # CMIS repository credentials
 USERNAME = 'admin'  # Alfresco
 PASSWORD = 'admin'  # Alfresco
@@ -49,6 +56,7 @@ TEST_BINARY_2 = 'sample-a.pdf'
 # principal ID to add to the ACL of a test object. Some repositories care
 # if this ID doesn't exist. Some repositories don't.
 TEST_PRINCIPAL_ID = 'anyone'
+#TEST_PRINCIPAL_ID = 'admin'
 # For repositories that may index test content asynchronously, the number of
 # times a query is retried before giving up.
 MAX_FULL_TEXT_TRIES = 10
@@ -56,5 +64,6 @@ MAX_FULL_TEXT_TRIES = 10
 FULL_TEXT_WAIT = 10
 # Specify the type ID of a versionable type. If all types are versionable,
 # specify cmis:document
-VERSIONABLE_TYPE_ID = 'cmis:document'
-#VERSIONABLE_TYPE_ID = 'VersionableType'
+#VERSIONABLE_TYPE_ID = 'cmis:document'
+#VERSIONABLE_TYPE_ID = 'cmisbook:pdf'
+VERSIONABLE_TYPE_ID = 'VersionableType'