You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by dc...@apache.org on 2010/04/22 18:28:00 UTC
svn commit: r936938 [22/29] - in
/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server:
chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/
chemistry-opencmis-server-bindings/src/main/java/org/apache/chem...
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java Thu Apr 22 16:27:57 2010
@@ -69,899 +69,899 @@ import static org.junit.Assert.*;
public class ObjectServiceTest extends AbstractServiceTst {
- private static Log log = LogFactory.getLog(ObjectServiceTest.class);
- private static final String TEST_FOLDER_TYPE_ID = "MyFolderType";
- private static final String TEST_DOCUMENT_TYPE_ID = "MyDocumentType";
- private static final String TEST_FOLDER_STRING_PROP_ID = "MyFolderStringProp";
- private static final String TEST_DOCUMENT_STRING_PROP_ID = "MyDocumentStringProp";
- private static final String TEST_CUSTOM_DOCUMENT_TYPE_ID = "MyCustomDocumentType";
- private static final String TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID = "MyCustomInheritedDocType";
- private static final String TEST_DOCUMENT_MY_STRING_PROP_ID = "MyCustomDocumentStringProp";
- private static final String TEST_DOCUMENT_MY_INT_PROP_ID = "MyCustomDocumentIntProp";
- private static final String TEST_DOCUMENT_MY_SUB_STRING_PROP_ID = "MyInheritedStringProp";
- private static final String TEST_DOCUMENT_MY_SUB_INT_PROP_ID = "MyInheritedIntProp";
-
- private static final String DOCUMENT_TYPE_ID = InMemoryDocumentTypeDefinition.getRootDocumentType().getId();
- private static final String DOCUMENT_ID = "Document_1";
- private static final String FOLDER_TYPE_ID = InMemoryFolderTypeDefinition.getRootFolderType().getId();
- private static final String FOLDER_ID = "Folder_1";
- private static final String MY_CUSTOM_NAME = "My Custom Document";
-
- ObjectCreator fCreator;
-
- @Before
- public void setUp() throws Exception {
- super.setTypeCreatorClass(ObjectTestTypeSystemCreator.class.getName());
- super.setUp();
- fCreator = new ObjectCreator(fFactory, fObjSvc, fRepositoryId);
- }
-
- @After
- public void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testCreateDocument() {
- log.info("starting testCreateObject() ...");
- String id = createDocument(fRootFolderId, false);
- if (id != null)
- log.info("createDocument succeeded with created id: " + id);
- log.info("... testCreateObject() finished.");
-
- // test create a document with a folder type, should fail:
- try {
- Properties props = createDocumentProperties("DocumentWithAFolderType", FOLDER_TYPE_ID);
- id = fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, null, VersioningState.NONE, null, null,
- null, null);
- fail("Creating document with a folder type should fail.");
- } catch (Exception e) {
- log.info("Creating document with a folder type failed as expected.");
- }
- // test create a document with an illegal name, should fail:
- try {
- Properties props = createDocumentProperties("abc ()", DOCUMENT_TYPE_ID);
- id = fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, null, VersioningState.NONE, null, null,
- null, null);
- fail("Creating document with an illegal name should fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisInvalidArgumentException);
- log.info("Creating document with an illegal name failed as expected.");
- }
- }
-
- @Test
- public void testGetObject() {
- log.info("starting testGetObject() ...");
- log.info(" creating object");
- String id = createDocument(fRootFolderId, false);
- if (id != null)
- log.info(" createDocument succeeded with created id: " + id);
-
- log.info(" getting object");
- retrieveDocument(id);
- log.info("... testGetObject() finished.");
- }
-
- @Test
- public void testGetObjectByPath() {
- log.info("starting testGetObjectByPath() ...");
- log.info(" creating object");
-
- // create a tree for testing paths
- String f1 = createFolder("folder1", fRootFolderId, FOLDER_TYPE_ID);
- String f2 = createFolder("folder2", fRootFolderId, FOLDER_TYPE_ID);
- String f3 = createFolder("folder3", fRootFolderId, FOLDER_TYPE_ID);
- String f11 = createFolder("folder1.1", f1, FOLDER_TYPE_ID);
- String f12 = createFolder("folder1.2", f1, FOLDER_TYPE_ID);
- String f13 = createFolder("folder1.3", f1, FOLDER_TYPE_ID);
- String f31 = createFolder("folder3.1", f3, FOLDER_TYPE_ID);
- String f32 = createFolder("folder3.2", f3, FOLDER_TYPE_ID);
- String f33 = createFolder("folder3.3", f3, FOLDER_TYPE_ID);
- String f121 = createFolder("folder1.2.1", f12, FOLDER_TYPE_ID);
- String f122 = createFolder("folder1.2.2", f12, FOLDER_TYPE_ID);
- String f123 = createFolder("folder1.2.3", f12, FOLDER_TYPE_ID);
- String f331 = createFolder("folder3.3.1", f33, FOLDER_TYPE_ID);
- String f332 = createFolder("folder3.3.2", f33, FOLDER_TYPE_ID);
- String f333 = createFolder("folder3.3.3", f33, FOLDER_TYPE_ID);
- String doc12 = createDocument("Document1.2.Doc", f12, false);
- String doc33 = createDocument("Document3.3.Doc", f33, false);
- String doc331 = createDocument("Document3.3.1.Doc", f331, false);
- String doc333 = createDocument("Document3.3.3.Doc", f333, false);
-
- log.info(" getting object by path");
- getByPath(f1, "/folder1");
- getByPath(f2, "/folder2");
- getByPath(f3, "/folder3");
- getByPath(f11, "/folder1/folder1.1");
- getByPath(f12, "/folder1/folder1.2");
- getByPath(f13, "/folder1/folder1.3");
- getByPath(f31, "/folder3/folder3.1");
- getByPath(f32, "/folder3/folder3.2");
- getByPath(f33, "/folder3/folder3.3");
- getByPath(f121, "/folder1/folder1.2/folder1.2.1");
- getByPath(f122, "/folder1/folder1.2/folder1.2.2");
- getByPath(f123, "/folder1/folder1.2/folder1.2.3");
- getByPath(f331, "/folder3/folder3.3/folder3.3.1");
- getByPath(f332, "/folder3/folder3.3/folder3.3.2");
- getByPath(f333, "/folder3/folder3.3/folder3.3.3");
- getByPath(doc12, "/folder1/folder1.2/Document1.2.Doc");
- getByPath(doc33, "/folder3/folder3.3/Document3.3.Doc");
- getByPath(doc331, "/folder3/folder3.3/folder3.3.1/Document3.3.1.Doc");
- getByPath(doc333, "/folder3/folder3.3/folder3.3.3/Document3.3.3.Doc");
-
- log.info("... testGetObjectByPath() finished.");
- }
-
- @Test
- public void testCreateDocumentWithContent() {
- log.info("starting testCreateDocumentWithContent() ...");
- String id = createDocument(fRootFolderId, true);
- if (id != null)
- log.info("createDocument succeeded with created id: " + id);
-
- ContentStream sd = fObjSvc.getContentStream(fRepositoryId, id, null, BigInteger.valueOf(-1) /* offset */,
- BigInteger.valueOf(-1) /* length */, null);
- verifyContentResult(sd);
-
- // delete content again
- Holder<String> idHolder = new Holder<String>(id);
- fObjSvc.deleteContentStream(fRepositoryId, idHolder, null, null);
- sd = fObjSvc.getContentStream(fRepositoryId, id, null, BigInteger.valueOf(-1) /* offset */, BigInteger
- .valueOf(-1) /* length */, null);
- assertNull(sd);
-
- // create content again in a second call
- ContentStream contentStream = createContent();
- fObjSvc.setContentStream(fRepositoryId, idHolder, true, null, contentStream, null);
- sd = fObjSvc.getContentStream(fRepositoryId, id, null, BigInteger.valueOf(-1) /* offset */, BigInteger
- .valueOf(-1) /* length */, null);
- verifyContentResult(sd);
-
- // update content and do not set overwrite flag, expect failure
- try {
- fObjSvc.setContentStream(fRepositoryId, idHolder, false, null, contentStream, null);
- fail("setContentStream with existing content and no overWriteFlag should fail");
- } catch (Exception e) {
- assertTrue(e instanceof CmisConstraintException);
- }
-
- // cleanup
- fObjSvc.deleteObject(fRepositoryId, id, true, null);
-
- log.info("... testCreateDocumentWithContent() finished.");
- }
-
- @Test
- public void testCreateDocumentFromSource() {
- log.info("starting testCreateDocumentFromSource() ...");
- // create a 1st document
- String id1 = createDocument(fRootFolderId, true);
- // create a second document with first as source
- String id2 = null;
- try {
- VersioningState versioningState = VersioningState.NONE;
- Properties props = createDocumentPropertiesForDocumentFromSource("Document From Source");
- id2 = fObjSvc.createDocumentFromSource(fRepositoryId, id1, props, fRootFolderId, versioningState, null,
- null, null, null);
- if (null == id2)
- fail("createDocumentFromSource failed.");
- } catch (Exception e) {
- fail("createDocumentFromSource() failed with exception: " + e);
- }
-
- // get content from second document and compare it with original one
- ContentStream sd = fObjSvc.getContentStream(fRepositoryId, id2, null, BigInteger.valueOf(-1) /* offset */,
- BigInteger.valueOf(-1) /* length */, null);
- verifyContentResult(sd);
-
- // cleanup
- fObjSvc.deleteObject(fRepositoryId, id1, true, null);
- fObjSvc.deleteObject(fRepositoryId, id2, true, null);
-
- log.info("... testCreateDocumentFromSource() finished.");
- }
-
- @Test
- public void testCreatedDocumentInherited() {
- log.info("starting testCreatedDocumentInherited() ...");
- log.info(" creating object");
-
- String id = createDocumentInheritedProperties(fRootFolderId, false);
- if (id != null)
- log.info(" createDocument succeeded with created id: " + id);
-
- log.info(" getting object");
- try {
- ObjectData res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false,
- false, null);
- assertNotNull(res);
-
- String returnedId = res.getId();
- assertEquals(id, returnedId);
- Map<String, PropertyData<?>> props = res.getProperties().getProperties();
- for (PropertyData<?> pd : props.values()) {
- log.info("return property id: " + pd.getId() + ", value: " + pd.getValues());
- }
-
- PropertyData<?> pd = props.get(PropertyIds.NAME);
- assertNotNull(pd);
- assertEquals(MY_CUSTOM_NAME, pd.getFirstValue());
-
- pd = props.get(PropertyIds.OBJECT_TYPE_ID);
- assertEquals(TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID, pd.getFirstValue());
-
- pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
- assertEquals("My pretty string", pd.getFirstValue());
-
- pd = props.get(TEST_DOCUMENT_MY_INT_PROP_ID);
- assertEquals(BigInteger.valueOf(4711), pd.getFirstValue());
-
- pd = props.get(TEST_DOCUMENT_MY_SUB_STRING_PROP_ID);
- assertEquals("another cool string", pd.getFirstValue());
-
- pd = props.get(TEST_DOCUMENT_MY_SUB_INT_PROP_ID);
- assertEquals(BigInteger.valueOf(4712), pd.getFirstValue());
- } catch (Exception e) {
- fail("getObject() failed with exception: " + e);
- }
- log.info("... testCreatedDocumentInherited() finished.");
- }
-
- @Test
- public void testBuildFolderAndDocuments() {
- // Create a hierarchy of folders and fill it with some documents
-
- ObjectGenerator gen = new ObjectGenerator(fFactory, fNavSvc, fObjSvc, fRepositoryId);
- int levels = 2; // create a hierarchy with two levels
- int childrenPerLevel = 2; // create two folders on each level
-
- gen.setNumberOfDocumentsToCreatePerFolder(1); // create one document in
- // each folder
-
- // Set the type id for all created documents:
- gen.setDocumentTypeId(TEST_DOCUMENT_TYPE_ID);
-
- // Set the type id for all created folders:
- gen.setFolderTypeId(TEST_FOLDER_TYPE_ID);
-
- // set the properties the generator should fill with values for
- // documents:
- // Note: must be valid properties in type TEST_DOCUMENT_TYPE_ID
- List<String> propsToSet = new ArrayList<String>();
- propsToSet.add(TEST_DOCUMENT_STRING_PROP_ID);
- gen.setDocumentPropertiesToGenerate(propsToSet);
-
- // set the properties the generator should fill with values for folders:
- // Note: must be valid properties in type TEST_FOLDER_TYPE_ID
- propsToSet = new ArrayList<String>();
- propsToSet.add(TEST_FOLDER_STRING_PROP_ID);
- gen.setFolderPropertiesToGenerate(propsToSet);
-
- // Build the tree
- try {
- gen.createFolderHierachy(levels, childrenPerLevel, fRootFolderId);
- // Dump the tree
- gen.dumpFolder(fRootFolderId, "*");
- } catch (Exception e) {
- fail("Could not create folder hierarchy with documents. " + e);
- }
- }
-
- @Test
- public void testDeleteObject() {
- log.info("starting testDeleteObject() ...");
- log.info("Testing to delete a document");
- log.info(" creating object");
- String id = createDocument(fRootFolderId, false);
- if (id != null)
- log.info(" createDocument succeeded with created id: " + id);
-
- log.info(" getting object");
- retrieveDocument(id);
- log.info(" deleting object");
- try {
- fObjSvc.deleteObject(fRepositoryId, id, true, null);
- } catch (Exception e) {
- fail("deleteObject() for document failed with exception: " + e);
- }
-
- // check that it does not exist anymore
- try {
- fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
- fail("object should not longer exist after it was deleted.");
- } catch (CmisObjectNotFoundException e) {
- assertTrue(e instanceof CmisObjectNotFoundException);
- } catch (Exception e) {
- fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
- }
-
- log.info("Testing to delete an empty folder");
- // create and delete an empty folder
- id = createFolder();
- try {
- fObjSvc.deleteObject(fRepositoryId, id, true, null);
- } catch (Exception e) {
- fail("deleteObject() for folder failed with exception: " + e);
- }
- // check that it does not exist anymore
- try {
- fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
- fail("object should not longer exist after it was deleted.");
- } catch (CmisObjectNotFoundException e) {
- assertTrue(e instanceof CmisObjectNotFoundException);
- } catch (Exception e) {
- fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
- }
-
- // create a folder with a document and delete should fail
- // create and delete an empty folder
- log.info("Testing to delete a folder with a contained document");
- String folderId;
- folderId = createFolder();
- id = createDocument(folderId, false);
-
- try {
- fObjSvc.deleteObject(fRepositoryId, folderId, true, null);
- fail("deleteObject() for folder with a document should fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisConstraintException);
- }
- // should succeed if we first delete document then folder
- try {
- fObjSvc.deleteObject(fRepositoryId, id, true, null);
- fObjSvc.deleteObject(fRepositoryId, folderId, true, null);
- } catch (Exception e) {
- fail("deleteObject() for document and folder failed with exception: " + e);
- }
- // check that it does not exist anymore
- try {
- fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
- fail("object should not longer exist after it was deleted.");
- } catch (CmisObjectNotFoundException e) {
- assertTrue(e instanceof CmisObjectNotFoundException);
- } catch (Exception e) {
- fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
- }
- try {
- fObjSvc.getObject(fRepositoryId, folderId, "*", false, IncludeRelationships.NONE, null, false, false, null);
- fail("object should not longer exist after it was deleted.");
- } catch (CmisObjectNotFoundException e) {
- assertTrue(e instanceof CmisObjectNotFoundException);
- } catch (Exception e) {
- fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
- }
- log.info("... testDeleteObject() finished.");
- }
-
- @Test
- public void testDeleteTree() {
- log.info("starting testDeleteTree() ...");
- ObjectGenerator gen = new ObjectGenerator(fFactory, fNavSvc, fObjSvc, fRepositoryId);
- String rootFolderId = createFolder();
- // Set the type id for all created documents:
- gen.setDocumentTypeId(InMemoryDocumentTypeDefinition.getRootDocumentType().getId());
- // Set the type id for all created folders:
- gen.setFolderTypeId(InMemoryFolderTypeDefinition.getRootFolderType().getId());
- gen.setNumberOfDocumentsToCreatePerFolder(2); // create two documents in
- // each folder
- gen.createFolderHierachy(1, 1, rootFolderId);
- try {
- fObjSvc.deleteTree(fRepositoryId, rootFolderId, null /* true */, UnfileObject.DELETE, true, null);
- } catch (Exception e) {
- fail("deleteTree failed unexpected. " + e);
- }
- log.info("Dumping folder, should only contain one empty folder under root");
- gen.dumpFolder(fRootFolderId, "*");
-
- // After that we should be not be able to get the root folder, because
- // it should be deleted
- try {
- fObjSvc.getObject(fRepositoryId, rootFolderId, "*", false, IncludeRelationships.NONE, null, false, false,
- null);
- fail("object should not longer exist after it was deleted.");
- } catch (CmisObjectNotFoundException e) {
- assertTrue(e instanceof CmisObjectNotFoundException);
- } catch (Exception e) {
- fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
- }
- log.info("... testDeleteTree() finished.");
- }
-
- @Test
- public void testMoveFolder() {
- log.info("starting testMoveFolder() ...");
- moveObjectTest(true);
- log.info("... testMoveFolder() finished.");
- }
-
- @Test
- public void testMoveDocument() {
- log.info("starting testMoveDocument() ...");
- moveObjectTest(false);
- log.info("... testMoveDocument() finished.");
- }
-
- @Test
- public void testUpdateProperties() {
- log.info("starting testUpdateProperties() ...");
- String oldChangeToken, newChangeToken;
- String id = createDocumentWithCustomType(fRootFolderId, false);
- if (id != null)
- log.info("createDocument succeeded with created id: " + id);
-
- log.info(" getting object");
- try {
- ObjectData res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false,
- false, null);
- assertNotNull(res);
- Map<String, PropertyData<?>> props = res.getProperties().getProperties();
-
- // check returned properties
- for (PropertyData<?> pd : props.values()) {
- log.info(" return property id: " + pd.getId() + ", value: " + pd.getValues());
- }
-
- String returnedId = res.getId();
- assertEquals(id, returnedId);
- PropertyData<?> pd = props.get(PropertyIds.NAME);
- assertNotNull(pd);
- assertEquals(MY_CUSTOM_NAME, pd.getFirstValue());
- pd = props.get(PropertyIds.OBJECT_TYPE_ID);
- assertEquals(TEST_CUSTOM_DOCUMENT_TYPE_ID, pd.getFirstValue());
- pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
- assertEquals("My pretty string", pd.getFirstValue());
- pd = props.get(TEST_DOCUMENT_MY_INT_PROP_ID);
- assertEquals(BigInteger.valueOf(4711), pd.getFirstValue());
-
- // update properties:
- log.info("updating property");
- final String newStringPropVal = "My ugly string";
- final BigInteger newIntPropVal = BigInteger.valueOf(815);
- List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
- //properties.add(fFactory.createPropertyIdData(PropertyIds.CMIS_NAME
- // , MY_CUSTOM_NAME));
- // properties.add(fFactory.createPropertyIdData(PropertyIds.
- // CMIS_OBJECT_TYPE_ID, TEST_CUSTOM_DOCUMENT_TYPE_ID));
- // Generate some property values for custom attributes
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, newStringPropVal));
- properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, newIntPropVal));
- Properties newProps = fFactory.createPropertiesData(properties);
-
- Holder<String> idHolder = new Holder<String>(id);
- Holder<String> changeTokenHolder = new Holder<String>();
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- oldChangeToken = changeTokenHolder.getValue(); // store for later
- // use
- // check if we now retrieve new values
- res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
- assertNotNull(res);
- props = res.getProperties().getProperties();
- for (PropertyData<?> pd2 : props.values()) {
- log.info(" return property id: " + pd2.getId() + ", value: " + pd2.getValues());
- }
- returnedId = res.getId();
- assertEquals(id, returnedId);
- pd = props.get(PropertyIds.NAME);
- assertNotNull(pd);
- assertEquals(MY_CUSTOM_NAME, pd.getFirstValue());
- pd = props.get(PropertyIds.OBJECT_TYPE_ID);
- assertEquals(TEST_CUSTOM_DOCUMENT_TYPE_ID, pd.getFirstValue());
- pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
- assertEquals(newStringPropVal, pd.getFirstValue());
- pd = props.get(TEST_DOCUMENT_MY_INT_PROP_ID);
- assertEquals(newIntPropVal, pd.getFirstValue());
-
- // Test delete properties
- log.info("deleting property");
- properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, (String) null));
- newProps = fFactory.createPropertiesData(properties);
- Thread.sleep(100); // ensure new change token, timer resolution is
- // not good enough
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
- assertNotNull(res);
- props = res.getProperties().getProperties();
- for (PropertyData<?> pd2 : props.values()) {
- log.info(" return property id: " + pd2.getId() + ", value: " + pd2.getValues());
- }
- pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
- assertNull(pd);
- // delete a required property and expect exception:
- properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, (BigInteger) null));
- newProps = fFactory.createPropertiesData(properties);
- idHolder = new Holder<String>(id);
- try {
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- fail("Deleteing a required property should fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisConstraintException);
- }
-
- // Test violation of property definition constraints
- log.info("Test violation of property definition constraints");
- properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID,
- "A very long String ABCDEFHIJKLMNOPQRSTUVWXYZ"));
- newProps = fFactory.createPropertiesData(properties);
- idHolder = new Holder<String>(id);
- try {
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- fail("Exceeding max String lengt h should fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisConstraintException);
- }
- // Test stale token
- log.info("Test stale token");
- properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, "ABC"));
- newProps = fFactory.createPropertiesData(properties);
- // set outdated token
- newChangeToken = changeTokenHolder.getValue();
- changeTokenHolder.setValue(oldChangeToken);
- assertFalse(oldChangeToken.equals(newChangeToken));
- try {
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- fail("Update with an outdated changeToken should fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisUpdateConflictException);
- }
-
- // test a rename
- log.info("Test renaming");
- final String newName = "My Renamed Document"; // MY_CUSTOM_NAME
- properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, newName));
- newProps = fFactory.createPropertiesData(properties);
- changeTokenHolder.setValue(newChangeToken);
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- id = idHolder.getValue(); // note that id is path and has changed!
- res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
- assertNotNull(res);
- props = res.getProperties().getProperties();
- pd = props.get(PropertyIds.NAME);
- assertNotNull(pd);
- assertEquals(newName, pd.getFirstValue());
-
- // test rename with a conflicting name
- createDocumentWithCustomType(fRootFolderId, false);
- properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, MY_CUSTOM_NAME));
- newProps = fFactory.createPropertiesData(properties);
- // now rename to old name
- try {
- fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
- fail("Update with a conflicting name should fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisConstraintException);
- }
-
- } catch (Exception e) {
- fail("getObject() failed with exception: " + e);
- }
- log.info("... testUpdateProperties() finished.");
- }
-
- @Test
- public void testAllowableActions() {
- log.info("starting testAllowableActions() ...");
- final boolean withContent = false;
- String id = createDocument(fRootFolderId, withContent);
-
- // get allowable actions via getObject
- ObjectData res = fObjSvc.getObject(fRepositoryId, id, "*", true, IncludeRelationships.NONE, null, false, false,
- null);
- assertNotNull(res.getAllowableActions());
- Set<Action> actions = res.getAllowableActions().getAllowableActions();
- assertNotNull(actions);
- verifyAllowableActionsDocument(actions, false, withContent);
-
- // get allowable actions via getAllowableActions
- AllowableActions allowableActions = fObjSvc.getAllowableActions(fRepositoryId, id, null);
- assertNotNull(allowableActions);
- actions = allowableActions.getAllowableActions();
- assertNotNull(actions);
- verifyAllowableActionsDocument(actions, false, withContent);
-
- // cleanup
- fObjSvc.deleteObject(fRepositoryId, id, true, null);
- log.info("... testAllowableActions() finished.");
- }
-
- private void verifyAllowableActionsDocument(Set<Action> actions, boolean isVersioned, boolean hasContent) {
- assertTrue(actions.contains(Action.CAN_DELETE_OBJECT));
- assertTrue(actions.contains(Action.CAN_UPDATE_PROPERTIES));
- assertTrue(actions.contains(Action.CAN_GET_PROPERTIES));
- assertFalse(actions.contains(Action.CAN_GET_OBJECT_RELATIONSHIPS));
- assertTrue(actions.contains(Action.CAN_GET_OBJECT_PARENTS));
-
- assertFalse(actions.contains(Action.CAN_GET_FOLDER_PARENT));
- assertFalse(actions.contains(Action.CAN_GET_FOLDER_TREE));
- assertFalse(actions.contains(Action.CAN_GET_DESCENDANTS));
- assertTrue(actions.contains(Action.CAN_MOVE_OBJECT));
- if (hasContent) {
- assertTrue(actions.contains(Action.CAN_DELETE_CONTENT_STREAM));
- assertTrue(actions.contains(Action.CAN_GET_CONTENT_STREAM));
- assertTrue(actions.contains(Action.CAN_GET_RENDITIONS));
- } else {
- assertFalse(actions.contains(Action.CAN_DELETE_CONTENT_STREAM));
- assertFalse(actions.contains(Action.CAN_GET_CONTENT_STREAM));
- assertFalse(actions.contains(Action.CAN_GET_RENDITIONS));
- }
- assertFalse(actions.contains(Action.CAN_ADD_OBJECT_TO_FOLDER));
- assertFalse(actions.contains(Action.CAN_REMOVE_OBJECT_FROM_FOLDER));
-
- if (isVersioned) {
- assertTrue(actions.contains(Action.CAN_CANCEL_CHECK_OUT));
- assertTrue(actions.contains(Action.CAN_CHECK_IN));
- assertTrue(actions.contains(Action.CAN_CHECK_OUT));
- assertTrue(actions.contains(Action.CAN_GET_ALL_VERSIONS));
-
- } else {
- assertFalse(actions.contains(Action.CAN_CANCEL_CHECK_OUT));
- assertFalse(actions.contains(Action.CAN_CHECK_IN));
- assertFalse(actions.contains(Action.CAN_CHECK_OUT));
- assertFalse(actions.contains(Action.CAN_GET_ALL_VERSIONS));
- }
- assertTrue(actions.contains(Action.CAN_SET_CONTENT_STREAM));
- assertFalse(actions.contains(Action.CAN_APPLY_POLICY));
- assertFalse(actions.contains(Action.CAN_GET_APPLIED_POLICIES));
- assertFalse(actions.contains(Action.CAN_REMOVE_POLICY));
- assertFalse(actions.contains(Action.CAN_GET_CHILDREN));
- assertFalse(actions.contains(Action.CAN_CREATE_DOCUMENT));
- assertFalse(actions.contains(Action.CAN_CREATE_FOLDER));
- assertFalse(actions.contains(Action.CAN_CREATE_RELATIONSHIP));
- assertFalse(actions.contains(Action.CAN_DELETE_TREE));
- assertFalse(actions.contains(Action.CAN_GET_ACL));
- assertFalse(actions.contains(Action.CAN_APPLY_ACL));
- }
-
- private String retrieveDocument(String id) {
- ObjectData res = getDocumentObjectData(id);
- String returnedId = res.getId();
- testReturnedProperties(returnedId, DOCUMENT_ID, DOCUMENT_TYPE_ID, res.getProperties().getProperties());
- return returnedId;
- }
-
- private void moveObjectTest(boolean isFolder) {
- final String propertyFilter = PropertyIds.OBJECT_ID + "," + PropertyIds.NAME; // +
- // ","
- // +
- // PropertyIds
- // .
- // CMIS_OBJECT_TYPE_ID
- // +
- // ","
- // +
- // PropertyIds
- // .
- // CMIS_BASE_TYPE_ID
- // ;
- String rootFolderId = createFolder();
- ObjectGenerator gen = new ObjectGenerator(fFactory, fNavSvc, fObjSvc, fRepositoryId);
- // Set the type id for all created documents:
- gen.setDocumentTypeId(InMemoryDocumentTypeDefinition.getRootDocumentType().getId());
- // Set the type id for all created folders:
- gen.setNumberOfDocumentsToCreatePerFolder(1); // create one document in
- // each folder
- gen.createFolderHierachy(3, 2, rootFolderId);
- gen.setFolderTypeId(InMemoryFolderTypeDefinition.getRootFolderType().getId());
- gen.dumpFolder(fRootFolderId, propertyFilter);
- Holder<String> holder = new Holder<String>();
- String sourceIdToMove = gen.getFolderId(rootFolderId, 2, 1);
- if (!isFolder) // get first document in this folder
- sourceIdToMove = gen.getDocumentId(sourceIdToMove, 0);
- holder.setValue(sourceIdToMove); //"/Folder_1/My Folder 0/My Folder 1");
- String sourceFolderId = getSourceFolder(sourceIdToMove);
- log.info("Id before moveObject: " + holder.getValue());
- fObjSvc.moveObject(fRepositoryId, holder, rootFolderId, sourceFolderId, null);
- log.info("Id after moveObject: " + holder.getValue());
- gen.dumpFolder(fRootFolderId, propertyFilter);
-
- List<ObjectParentData> result = fNavSvc.getObjectParents(fRepositoryId, holder.getValue(), null, Boolean.FALSE,
- IncludeRelationships.NONE, null, Boolean.FALSE, null);
- // check that new parent is set correctly
- String newParentId = result.get(0).getObject().getId();
- assertEquals(rootFolderId, newParentId);
-
- if (isFolder) {
- log.info("testing moveFolder to a subfolder");
- ObjectInFolderList ch = fNavSvc.getChildren(fRepositoryId, holder.getValue(), propertyFilter, null, false,
- IncludeRelationships.NONE, null, false, null, null, null);
- String subFolderId = ch.getObjects().get(0).getObject().getId();
-
- try {
- fObjSvc.moveObject(fRepositoryId, holder, subFolderId, sourceFolderId, null);
- fail("moveObject to a folder that is a descendant of the source must fail.");
- } catch (Exception e) {
- assertTrue(e instanceof CmisNotSupportedException);
- }
- }
- }
-
- private String createFolder() {
- return createFolder(FOLDER_ID, fRootFolderId, FOLDER_TYPE_ID);
- }
-
- private String createDocument(String folderId, boolean withContent) {
- return createDocument(DOCUMENT_ID, folderId, withContent);
- }
-
- private String createDocument(String name, String folderId, boolean withContent) {
- return createDocument(name, folderId, DOCUMENT_TYPE_ID, withContent);
- }
-
- private Properties createDocumentPropertiesForDocumentFromSource(String name) {
- // We only provide a name but not a type id, as spec says to copy
- // missing attributes
- // from the existing one
- List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, name));
- Properties props = fFactory.createPropertiesData(properties);
- return props;
- }
-
- private void testReturnedProperties(String objectId, String objectName, String typeId,
- Map<String, PropertyData<?>> props) {
- super.testReturnedProperties(objectId, props);
-
- PropertyData<?> pd = props.get(PropertyIds.NAME);
- assertNotNull(pd);
- assertEquals(objectName, pd.getFirstValue());
- pd = props.get(PropertyIds.OBJECT_TYPE_ID);
- assertEquals(typeId, pd.getFirstValue());
- }
-
- private String createDocumentWithCustomType(String folderId, boolean withContent) {
- ContentStream contentStream = null;
- VersioningState versioningState = VersioningState.NONE;
- List<String> policies = null;
- Acl addACEs = null;
- Acl removeACEs = null;
- ExtensionsData extension = null;
-
- // create the properties:
- List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, MY_CUSTOM_NAME));
- properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, TEST_CUSTOM_DOCUMENT_TYPE_ID));
- // Generate some property values for custom attributes
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, "My pretty string"));
- properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, BigInteger.valueOf(4711)));
-
- Properties props = fFactory.createPropertiesData(properties);
-
- if (withContent)
- contentStream = createContent();
-
- // create the document
- String id = null;
- id = fObjSvc.createDocument(fRepositoryId, props, folderId, contentStream, versioningState, policies, addACEs,
- removeACEs, extension);
- if (null == id)
- throw new RuntimeException("createDocument failed.");
- return id;
- }
-
- private String createDocumentInheritedProperties(String folderId, boolean withContent) {
- ContentStream contentStream = null;
- VersioningState versioningState = VersioningState.NONE;
- List<String> policies = null;
- Acl addACEs = null;
- Acl removeACEs = null;
- ExtensionsData extension = null;
-
- // create the properties:
- List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
- properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, MY_CUSTOM_NAME));
- properties.add(fFactory
- .createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID));
- // Generate some property values for custom attributes
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, "My pretty string"));
- properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, BigInteger.valueOf(4711)));
- properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_SUB_STRING_PROP_ID, "another cool string"));
- properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_SUB_INT_PROP_ID, BigInteger.valueOf(4712)));
-
- Properties props = fFactory.createPropertiesData(properties);
-
- if (withContent)
- contentStream = createContent();
-
- // create the document
- String id = null;
- id = fObjSvc.createDocument(fRepositoryId, props, folderId, contentStream, versioningState, policies, addACEs,
- removeACEs, extension);
- if (null == id)
- throw new RuntimeException("createDocument failed.");
- return id;
- }
-
- private String getSourceFolder(String objectId) {
- // return the first parent found in the result list of all parents
- List<ObjectParentData> parents = fNavSvc.getObjectParents(fRepositoryId, objectId, "*", false,
- IncludeRelationships.NONE, null, true, null);
- return parents.get(0).getObject().getId();
- }
-
- // Helper class to create some type for testing the ObjectService
-
- public static class ObjectTestTypeSystemCreator implements TypeCreator {
-
- /**
- * create root types and a sample type for folder and document
- *
- * @return typesMap map filled with created types
- */
- public List<TypeDefinition> createTypesList() {
- List<TypeDefinition> typesList = new LinkedList<TypeDefinition>();
- InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(TEST_DOCUMENT_TYPE_ID,
- "My Document Type", InMemoryDocumentTypeDefinition.getRootDocumentType());
-
- InMemoryFolderTypeDefinition cmisFolderType = new InMemoryFolderTypeDefinition(TEST_FOLDER_TYPE_ID,
- "My Folder Type", InMemoryFolderTypeDefinition.getRootFolderType());
- // create a simple string property type and
- // attach the property definition to the type definition for
- // document and folder type
- Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
- PropertyStringDefinitionImpl prop = PropertyCreationHelper.createStringDefinition(
- TEST_DOCUMENT_STRING_PROP_ID, "Sample Doc String Property");
- propertyDefinitions.put(prop.getId(), prop);
- cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
-
- propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
- prop = PropertyCreationHelper.createStringDefinition(TEST_FOLDER_STRING_PROP_ID,
- "Sample Folder String Property");
- propertyDefinitions.put(prop.getId(), prop);
- cmisFolderType.addCustomPropertyDefinitions(propertyDefinitions);
-
- InMemoryDocumentTypeDefinition customDocType = createCustomTypeWithStringIntProperty();
- // add type to types collection
- typesList.add(cmisDocumentType);
- typesList.add(cmisFolderType);
- typesList.add(customDocType);
- typesList.add(createCustomInheritedType(customDocType));
- return typesList;
- }
-
- private static InMemoryDocumentTypeDefinition createCustomTypeWithStringIntProperty() {
- InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(
- TEST_CUSTOM_DOCUMENT_TYPE_ID, "My Custom Document Type", InMemoryDocumentTypeDefinition
- .getRootDocumentType());
- Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
- PropertyStringDefinitionImpl prop = PropertyCreationHelper.createStringDefinition(
- TEST_DOCUMENT_MY_STRING_PROP_ID, "My String Property");
- prop.setIsRequired(false);
- prop.setMaxLength(BigInteger.valueOf(20)); // max len to 20
- propertyDefinitions.put(prop.getId(), prop);
-
- PropertyIntegerDefinitionImpl prop2 = PropertyCreationHelper.createIntegerDefinition(
- TEST_DOCUMENT_MY_INT_PROP_ID, "My Integer Property");
- prop2.setIsRequired(true);
- prop2.setMinValue(BigInteger.valueOf(-10000));
- prop2.setMaxValue(BigInteger.valueOf(10000));
- propertyDefinitions.put(prop2.getId(), prop2);
- cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
- return cmisDocumentType;
- }
-
- private static InMemoryDocumentTypeDefinition createCustomInheritedType(InMemoryDocumentTypeDefinition baseType) {
- InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(
- TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID, "My Custom Document Type", baseType);
- Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
- PropertyStringDefinitionImpl prop = PropertyCreationHelper.createStringDefinition(
- TEST_DOCUMENT_MY_SUB_STRING_PROP_ID, "Subtype String Property");
- prop.setIsRequired(false);
- propertyDefinitions.put(prop.getId(), prop);
-
- PropertyIntegerDefinitionImpl prop2 = PropertyCreationHelper.createIntegerDefinition(
- TEST_DOCUMENT_MY_SUB_INT_PROP_ID, "Subtype");
- prop2.setIsRequired(true);
- propertyDefinitions.put(prop2.getId(), prop2);
- cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
- return cmisDocumentType;
- }
+ private static Log log = LogFactory.getLog(ObjectServiceTest.class);
+ private static final String TEST_FOLDER_TYPE_ID = "MyFolderType";
+ private static final String TEST_DOCUMENT_TYPE_ID = "MyDocumentType";
+ private static final String TEST_FOLDER_STRING_PROP_ID = "MyFolderStringProp";
+ private static final String TEST_DOCUMENT_STRING_PROP_ID = "MyDocumentStringProp";
+ private static final String TEST_CUSTOM_DOCUMENT_TYPE_ID = "MyCustomDocumentType";
+ private static final String TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID = "MyCustomInheritedDocType";
+ private static final String TEST_DOCUMENT_MY_STRING_PROP_ID = "MyCustomDocumentStringProp";
+ private static final String TEST_DOCUMENT_MY_INT_PROP_ID = "MyCustomDocumentIntProp";
+ private static final String TEST_DOCUMENT_MY_SUB_STRING_PROP_ID = "MyInheritedStringProp";
+ private static final String TEST_DOCUMENT_MY_SUB_INT_PROP_ID = "MyInheritedIntProp";
+
+ private static final String DOCUMENT_TYPE_ID = InMemoryDocumentTypeDefinition.getRootDocumentType().getId();
+ private static final String DOCUMENT_ID = "Document_1";
+ private static final String FOLDER_TYPE_ID = InMemoryFolderTypeDefinition.getRootFolderType().getId();
+ private static final String FOLDER_ID = "Folder_1";
+ private static final String MY_CUSTOM_NAME = "My Custom Document";
+
+ ObjectCreator fCreator;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setTypeCreatorClass(ObjectTestTypeSystemCreator.class.getName());
+ super.setUp();
+ fCreator = new ObjectCreator(fFactory, fObjSvc, fRepositoryId);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testCreateDocument() {
+ log.info("starting testCreateObject() ...");
+ String id = createDocument(fRootFolderId, false);
+ if (id != null)
+ log.info("createDocument succeeded with created id: " + id);
+ log.info("... testCreateObject() finished.");
+
+ // test create a document with a folder type, should fail:
+ try {
+ Properties props = createDocumentProperties("DocumentWithAFolderType", FOLDER_TYPE_ID);
+ id = fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, null, VersioningState.NONE, null, null,
+ null, null);
+ fail("Creating document with a folder type should fail.");
+ } catch (Exception e) {
+ log.info("Creating document with a folder type failed as expected.");
+ }
+ // test create a document with an illegal name, should fail:
+ try {
+ Properties props = createDocumentProperties("abc ()", DOCUMENT_TYPE_ID);
+ id = fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, null, VersioningState.NONE, null, null,
+ null, null);
+ fail("Creating document with an illegal name should fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisInvalidArgumentException);
+ log.info("Creating document with an illegal name failed as expected.");
+ }
+ }
+
+ @Test
+ public void testGetObject() {
+ log.info("starting testGetObject() ...");
+ log.info(" creating object");
+ String id = createDocument(fRootFolderId, false);
+ if (id != null)
+ log.info(" createDocument succeeded with created id: " + id);
+
+ log.info(" getting object");
+ retrieveDocument(id);
+ log.info("... testGetObject() finished.");
+ }
+
+ @Test
+ public void testGetObjectByPath() {
+ log.info("starting testGetObjectByPath() ...");
+ log.info(" creating object");
+
+ // create a tree for testing paths
+ String f1 = createFolder("folder1", fRootFolderId, FOLDER_TYPE_ID);
+ String f2 = createFolder("folder2", fRootFolderId, FOLDER_TYPE_ID);
+ String f3 = createFolder("folder3", fRootFolderId, FOLDER_TYPE_ID);
+ String f11 = createFolder("folder1.1", f1, FOLDER_TYPE_ID);
+ String f12 = createFolder("folder1.2", f1, FOLDER_TYPE_ID);
+ String f13 = createFolder("folder1.3", f1, FOLDER_TYPE_ID);
+ String f31 = createFolder("folder3.1", f3, FOLDER_TYPE_ID);
+ String f32 = createFolder("folder3.2", f3, FOLDER_TYPE_ID);
+ String f33 = createFolder("folder3.3", f3, FOLDER_TYPE_ID);
+ String f121 = createFolder("folder1.2.1", f12, FOLDER_TYPE_ID);
+ String f122 = createFolder("folder1.2.2", f12, FOLDER_TYPE_ID);
+ String f123 = createFolder("folder1.2.3", f12, FOLDER_TYPE_ID);
+ String f331 = createFolder("folder3.3.1", f33, FOLDER_TYPE_ID);
+ String f332 = createFolder("folder3.3.2", f33, FOLDER_TYPE_ID);
+ String f333 = createFolder("folder3.3.3", f33, FOLDER_TYPE_ID);
+ String doc12 = createDocument("Document1.2.Doc", f12, false);
+ String doc33 = createDocument("Document3.3.Doc", f33, false);
+ String doc331 = createDocument("Document3.3.1.Doc", f331, false);
+ String doc333 = createDocument("Document3.3.3.Doc", f333, false);
+
+ log.info(" getting object by path");
+ getByPath(f1, "/folder1");
+ getByPath(f2, "/folder2");
+ getByPath(f3, "/folder3");
+ getByPath(f11, "/folder1/folder1.1");
+ getByPath(f12, "/folder1/folder1.2");
+ getByPath(f13, "/folder1/folder1.3");
+ getByPath(f31, "/folder3/folder3.1");
+ getByPath(f32, "/folder3/folder3.2");
+ getByPath(f33, "/folder3/folder3.3");
+ getByPath(f121, "/folder1/folder1.2/folder1.2.1");
+ getByPath(f122, "/folder1/folder1.2/folder1.2.2");
+ getByPath(f123, "/folder1/folder1.2/folder1.2.3");
+ getByPath(f331, "/folder3/folder3.3/folder3.3.1");
+ getByPath(f332, "/folder3/folder3.3/folder3.3.2");
+ getByPath(f333, "/folder3/folder3.3/folder3.3.3");
+ getByPath(doc12, "/folder1/folder1.2/Document1.2.Doc");
+ getByPath(doc33, "/folder3/folder3.3/Document3.3.Doc");
+ getByPath(doc331, "/folder3/folder3.3/folder3.3.1/Document3.3.1.Doc");
+ getByPath(doc333, "/folder3/folder3.3/folder3.3.3/Document3.3.3.Doc");
+
+ log.info("... testGetObjectByPath() finished.");
+ }
+
+ @Test
+ public void testCreateDocumentWithContent() {
+ log.info("starting testCreateDocumentWithContent() ...");
+ String id = createDocument(fRootFolderId, true);
+ if (id != null)
+ log.info("createDocument succeeded with created id: " + id);
+
+ ContentStream sd = fObjSvc.getContentStream(fRepositoryId, id, null, BigInteger.valueOf(-1) /* offset */,
+ BigInteger.valueOf(-1) /* length */, null);
+ verifyContentResult(sd);
+
+ // delete content again
+ Holder<String> idHolder = new Holder<String>(id);
+ fObjSvc.deleteContentStream(fRepositoryId, idHolder, null, null);
+ sd = fObjSvc.getContentStream(fRepositoryId, id, null, BigInteger.valueOf(-1) /* offset */, BigInteger
+ .valueOf(-1) /* length */, null);
+ assertNull(sd);
+
+ // create content again in a second call
+ ContentStream contentStream = createContent();
+ fObjSvc.setContentStream(fRepositoryId, idHolder, true, null, contentStream, null);
+ sd = fObjSvc.getContentStream(fRepositoryId, id, null, BigInteger.valueOf(-1) /* offset */, BigInteger
+ .valueOf(-1) /* length */, null);
+ verifyContentResult(sd);
+
+ // update content and do not set overwrite flag, expect failure
+ try {
+ fObjSvc.setContentStream(fRepositoryId, idHolder, false, null, contentStream, null);
+ fail("setContentStream with existing content and no overWriteFlag should fail");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisConstraintException);
+ }
+
+ // cleanup
+ fObjSvc.deleteObject(fRepositoryId, id, true, null);
+
+ log.info("... testCreateDocumentWithContent() finished.");
+ }
+
+ @Test
+ public void testCreateDocumentFromSource() {
+ log.info("starting testCreateDocumentFromSource() ...");
+ // create a 1st document
+ String id1 = createDocument(fRootFolderId, true);
+ // create a second document with first as source
+ String id2 = null;
+ try {
+ VersioningState versioningState = VersioningState.NONE;
+ Properties props = createDocumentPropertiesForDocumentFromSource("Document From Source");
+ id2 = fObjSvc.createDocumentFromSource(fRepositoryId, id1, props, fRootFolderId, versioningState, null,
+ null, null, null);
+ if (null == id2)
+ fail("createDocumentFromSource failed.");
+ } catch (Exception e) {
+ fail("createDocumentFromSource() failed with exception: " + e);
+ }
+
+ // get content from second document and compare it with original one
+ ContentStream sd = fObjSvc.getContentStream(fRepositoryId, id2, null, BigInteger.valueOf(-1) /* offset */,
+ BigInteger.valueOf(-1) /* length */, null);
+ verifyContentResult(sd);
+
+ // cleanup
+ fObjSvc.deleteObject(fRepositoryId, id1, true, null);
+ fObjSvc.deleteObject(fRepositoryId, id2, true, null);
+
+ log.info("... testCreateDocumentFromSource() finished.");
+ }
+
+ @Test
+ public void testCreatedDocumentInherited() {
+ log.info("starting testCreatedDocumentInherited() ...");
+ log.info(" creating object");
+
+ String id = createDocumentInheritedProperties(fRootFolderId, false);
+ if (id != null)
+ log.info(" createDocument succeeded with created id: " + id);
+
+ log.info(" getting object");
+ try {
+ ObjectData res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false,
+ false, null);
+ assertNotNull(res);
+
+ String returnedId = res.getId();
+ assertEquals(id, returnedId);
+ Map<String, PropertyData<?>> props = res.getProperties().getProperties();
+ for (PropertyData<?> pd : props.values()) {
+ log.info("return property id: " + pd.getId() + ", value: " + pd.getValues());
+ }
+
+ PropertyData<?> pd = props.get(PropertyIds.NAME);
+ assertNotNull(pd);
+ assertEquals(MY_CUSTOM_NAME, pd.getFirstValue());
+
+ pd = props.get(PropertyIds.OBJECT_TYPE_ID);
+ assertEquals(TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID, pd.getFirstValue());
+
+ pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
+ assertEquals("My pretty string", pd.getFirstValue());
+
+ pd = props.get(TEST_DOCUMENT_MY_INT_PROP_ID);
+ assertEquals(BigInteger.valueOf(4711), pd.getFirstValue());
+
+ pd = props.get(TEST_DOCUMENT_MY_SUB_STRING_PROP_ID);
+ assertEquals("another cool string", pd.getFirstValue());
+
+ pd = props.get(TEST_DOCUMENT_MY_SUB_INT_PROP_ID);
+ assertEquals(BigInteger.valueOf(4712), pd.getFirstValue());
+ } catch (Exception e) {
+ fail("getObject() failed with exception: " + e);
+ }
+ log.info("... testCreatedDocumentInherited() finished.");
+ }
+
+ @Test
+ public void testBuildFolderAndDocuments() {
+ // Create a hierarchy of folders and fill it with some documents
+
+ ObjectGenerator gen = new ObjectGenerator(fFactory, fNavSvc, fObjSvc, fRepositoryId);
+ int levels = 2; // create a hierarchy with two levels
+ int childrenPerLevel = 2; // create two folders on each level
+
+ gen.setNumberOfDocumentsToCreatePerFolder(1); // create one document in
+ // each folder
+
+ // Set the type id for all created documents:
+ gen.setDocumentTypeId(TEST_DOCUMENT_TYPE_ID);
+
+ // Set the type id for all created folders:
+ gen.setFolderTypeId(TEST_FOLDER_TYPE_ID);
+
+ // set the properties the generator should fill with values for
+ // documents:
+ // Note: must be valid properties in type TEST_DOCUMENT_TYPE_ID
+ List<String> propsToSet = new ArrayList<String>();
+ propsToSet.add(TEST_DOCUMENT_STRING_PROP_ID);
+ gen.setDocumentPropertiesToGenerate(propsToSet);
+
+ // set the properties the generator should fill with values for folders:
+ // Note: must be valid properties in type TEST_FOLDER_TYPE_ID
+ propsToSet = new ArrayList<String>();
+ propsToSet.add(TEST_FOLDER_STRING_PROP_ID);
+ gen.setFolderPropertiesToGenerate(propsToSet);
+
+ // Build the tree
+ try {
+ gen.createFolderHierachy(levels, childrenPerLevel, fRootFolderId);
+ // Dump the tree
+ gen.dumpFolder(fRootFolderId, "*");
+ } catch (Exception e) {
+ fail("Could not create folder hierarchy with documents. " + e);
+ }
+ }
+
+ @Test
+ public void testDeleteObject() {
+ log.info("starting testDeleteObject() ...");
+ log.info("Testing to delete a document");
+ log.info(" creating object");
+ String id = createDocument(fRootFolderId, false);
+ if (id != null)
+ log.info(" createDocument succeeded with created id: " + id);
+
+ log.info(" getting object");
+ retrieveDocument(id);
+ log.info(" deleting object");
+ try {
+ fObjSvc.deleteObject(fRepositoryId, id, true, null);
+ } catch (Exception e) {
+ fail("deleteObject() for document failed with exception: " + e);
+ }
+
+ // check that it does not exist anymore
+ try {
+ fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ fail("object should not longer exist after it was deleted.");
+ } catch (CmisObjectNotFoundException e) {
+ assertTrue(e instanceof CmisObjectNotFoundException);
+ } catch (Exception e) {
+ fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
+ }
+
+ log.info("Testing to delete an empty folder");
+ // create and delete an empty folder
+ id = createFolder();
+ try {
+ fObjSvc.deleteObject(fRepositoryId, id, true, null);
+ } catch (Exception e) {
+ fail("deleteObject() for folder failed with exception: " + e);
+ }
+ // check that it does not exist anymore
+ try {
+ fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ fail("object should not longer exist after it was deleted.");
+ } catch (CmisObjectNotFoundException e) {
+ assertTrue(e instanceof CmisObjectNotFoundException);
+ } catch (Exception e) {
+ fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
+ }
+
+ // create a folder with a document and delete should fail
+ // create and delete an empty folder
+ log.info("Testing to delete a folder with a contained document");
+ String folderId;
+ folderId = createFolder();
+ id = createDocument(folderId, false);
+
+ try {
+ fObjSvc.deleteObject(fRepositoryId, folderId, true, null);
+ fail("deleteObject() for folder with a document should fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisConstraintException);
+ }
+ // should succeed if we first delete document then folder
+ try {
+ fObjSvc.deleteObject(fRepositoryId, id, true, null);
+ fObjSvc.deleteObject(fRepositoryId, folderId, true, null);
+ } catch (Exception e) {
+ fail("deleteObject() for document and folder failed with exception: " + e);
+ }
+ // check that it does not exist anymore
+ try {
+ fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ fail("object should not longer exist after it was deleted.");
+ } catch (CmisObjectNotFoundException e) {
+ assertTrue(e instanceof CmisObjectNotFoundException);
+ } catch (Exception e) {
+ fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
+ }
+ try {
+ fObjSvc.getObject(fRepositoryId, folderId, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ fail("object should not longer exist after it was deleted.");
+ } catch (CmisObjectNotFoundException e) {
+ assertTrue(e instanceof CmisObjectNotFoundException);
+ } catch (Exception e) {
+ fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
+ }
+ log.info("... testDeleteObject() finished.");
+ }
+
+ @Test
+ public void testDeleteTree() {
+ log.info("starting testDeleteTree() ...");
+ ObjectGenerator gen = new ObjectGenerator(fFactory, fNavSvc, fObjSvc, fRepositoryId);
+ String rootFolderId = createFolder();
+ // Set the type id for all created documents:
+ gen.setDocumentTypeId(InMemoryDocumentTypeDefinition.getRootDocumentType().getId());
+ // Set the type id for all created folders:
+ gen.setFolderTypeId(InMemoryFolderTypeDefinition.getRootFolderType().getId());
+ gen.setNumberOfDocumentsToCreatePerFolder(2); // create two documents in
+ // each folder
+ gen.createFolderHierachy(1, 1, rootFolderId);
+ try {
+ fObjSvc.deleteTree(fRepositoryId, rootFolderId, null /* true */, UnfileObject.DELETE, true, null);
+ } catch (Exception e) {
+ fail("deleteTree failed unexpected. " + e);
+ }
+ log.info("Dumping folder, should only contain one empty folder under root");
+ gen.dumpFolder(fRootFolderId, "*");
+
+ // After that we should be not be able to get the root folder, because
+ // it should be deleted
+ try {
+ fObjSvc.getObject(fRepositoryId, rootFolderId, "*", false, IncludeRelationships.NONE, null, false, false,
+ null);
+ fail("object should not longer exist after it was deleted.");
+ } catch (CmisObjectNotFoundException e) {
+ assertTrue(e instanceof CmisObjectNotFoundException);
+ } catch (Exception e) {
+ fail("getting deleted object should raise CMISObjectNotFoundException, but got " + e);
+ }
+ log.info("... testDeleteTree() finished.");
+ }
+
+ @Test
+ public void testMoveFolder() {
+ log.info("starting testMoveFolder() ...");
+ moveObjectTest(true);
+ log.info("... testMoveFolder() finished.");
+ }
+
+ @Test
+ public void testMoveDocument() {
+ log.info("starting testMoveDocument() ...");
+ moveObjectTest(false);
+ log.info("... testMoveDocument() finished.");
+ }
+
+ @Test
+ public void testUpdateProperties() {
+ log.info("starting testUpdateProperties() ...");
+ String oldChangeToken, newChangeToken;
+ String id = createDocumentWithCustomType(fRootFolderId, false);
+ if (id != null)
+ log.info("createDocument succeeded with created id: " + id);
+
+ log.info(" getting object");
+ try {
+ ObjectData res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false,
+ false, null);
+ assertNotNull(res);
+ Map<String, PropertyData<?>> props = res.getProperties().getProperties();
+
+ // check returned properties
+ for (PropertyData<?> pd : props.values()) {
+ log.info(" return property id: " + pd.getId() + ", value: " + pd.getValues());
+ }
+
+ String returnedId = res.getId();
+ assertEquals(id, returnedId);
+ PropertyData<?> pd = props.get(PropertyIds.NAME);
+ assertNotNull(pd);
+ assertEquals(MY_CUSTOM_NAME, pd.getFirstValue());
+ pd = props.get(PropertyIds.OBJECT_TYPE_ID);
+ assertEquals(TEST_CUSTOM_DOCUMENT_TYPE_ID, pd.getFirstValue());
+ pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
+ assertEquals("My pretty string", pd.getFirstValue());
+ pd = props.get(TEST_DOCUMENT_MY_INT_PROP_ID);
+ assertEquals(BigInteger.valueOf(4711), pd.getFirstValue());
+
+ // update properties:
+ log.info("updating property");
+ final String newStringPropVal = "My ugly string";
+ final BigInteger newIntPropVal = BigInteger.valueOf(815);
+ List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
+ // properties.add(fFactory.createPropertyIdData(PropertyIds.CMIS_NAME
+ // , MY_CUSTOM_NAME));
+ // properties.add(fFactory.createPropertyIdData(PropertyIds.
+ // CMIS_OBJECT_TYPE_ID, TEST_CUSTOM_DOCUMENT_TYPE_ID));
+ // Generate some property values for custom attributes
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, newStringPropVal));
+ properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, newIntPropVal));
+ Properties newProps = fFactory.createPropertiesData(properties);
+
+ Holder<String> idHolder = new Holder<String>(id);
+ Holder<String> changeTokenHolder = new Holder<String>();
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ oldChangeToken = changeTokenHolder.getValue(); // store for later
+ // use
+ // check if we now retrieve new values
+ res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ assertNotNull(res);
+ props = res.getProperties().getProperties();
+ for (PropertyData<?> pd2 : props.values()) {
+ log.info(" return property id: " + pd2.getId() + ", value: " + pd2.getValues());
+ }
+ returnedId = res.getId();
+ assertEquals(id, returnedId);
+ pd = props.get(PropertyIds.NAME);
+ assertNotNull(pd);
+ assertEquals(MY_CUSTOM_NAME, pd.getFirstValue());
+ pd = props.get(PropertyIds.OBJECT_TYPE_ID);
+ assertEquals(TEST_CUSTOM_DOCUMENT_TYPE_ID, pd.getFirstValue());
+ pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
+ assertEquals(newStringPropVal, pd.getFirstValue());
+ pd = props.get(TEST_DOCUMENT_MY_INT_PROP_ID);
+ assertEquals(newIntPropVal, pd.getFirstValue());
+
+ // Test delete properties
+ log.info("deleting property");
+ properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, (String) null));
+ newProps = fFactory.createPropertiesData(properties);
+ Thread.sleep(100); // ensure new change token, timer resolution is
+ // not good enough
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ assertNotNull(res);
+ props = res.getProperties().getProperties();
+ for (PropertyData<?> pd2 : props.values()) {
+ log.info(" return property id: " + pd2.getId() + ", value: " + pd2.getValues());
+ }
+ pd = props.get(TEST_DOCUMENT_MY_STRING_PROP_ID);
+ assertNull(pd);
+ // delete a required property and expect exception:
+ properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, (BigInteger) null));
+ newProps = fFactory.createPropertiesData(properties);
+ idHolder = new Holder<String>(id);
+ try {
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ fail("Deleteing a required property should fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisConstraintException);
+ }
+
+ // Test violation of property definition constraints
+ log.info("Test violation of property definition constraints");
+ properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID,
+ "A very long String ABCDEFHIJKLMNOPQRSTUVWXYZ"));
+ newProps = fFactory.createPropertiesData(properties);
+ idHolder = new Holder<String>(id);
+ try {
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ fail("Exceeding max String lengt h should fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisConstraintException);
+ }
+ // Test stale token
+ log.info("Test stale token");
+ properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, "ABC"));
+ newProps = fFactory.createPropertiesData(properties);
+ // set outdated token
+ newChangeToken = changeTokenHolder.getValue();
+ changeTokenHolder.setValue(oldChangeToken);
+ assertFalse(oldChangeToken.equals(newChangeToken));
+ try {
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ fail("Update with an outdated changeToken should fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisUpdateConflictException);
+ }
+
+ // test a rename
+ log.info("Test renaming");
+ final String newName = "My Renamed Document"; // MY_CUSTOM_NAME
+ properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, newName));
+ newProps = fFactory.createPropertiesData(properties);
+ changeTokenHolder.setValue(newChangeToken);
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ id = idHolder.getValue(); // note that id is path and has changed!
+ res = fObjSvc.getObject(fRepositoryId, id, "*", false, IncludeRelationships.NONE, null, false, false, null);
+ assertNotNull(res);
+ props = res.getProperties().getProperties();
+ pd = props.get(PropertyIds.NAME);
+ assertNotNull(pd);
+ assertEquals(newName, pd.getFirstValue());
+
+ // test rename with a conflicting name
+ createDocumentWithCustomType(fRootFolderId, false);
+ properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, MY_CUSTOM_NAME));
+ newProps = fFactory.createPropertiesData(properties);
+ // now rename to old name
+ try {
+ fObjSvc.updateProperties(fRepositoryId, idHolder, changeTokenHolder, newProps, null);
+ fail("Update with a conflicting name should fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisConstraintException);
+ }
+
+ } catch (Exception e) {
+ fail("getObject() failed with exception: " + e);
+ }
+ log.info("... testUpdateProperties() finished.");
+ }
+
+ @Test
+ public void testAllowableActions() {
+ log.info("starting testAllowableActions() ...");
+ final boolean withContent = false;
+ String id = createDocument(fRootFolderId, withContent);
+
+ // get allowable actions via getObject
+ ObjectData res = fObjSvc.getObject(fRepositoryId, id, "*", true, IncludeRelationships.NONE, null, false, false,
+ null);
+ assertNotNull(res.getAllowableActions());
+ Set<Action> actions = res.getAllowableActions().getAllowableActions();
+ assertNotNull(actions);
+ verifyAllowableActionsDocument(actions, false, withContent);
+
+ // get allowable actions via getAllowableActions
+ AllowableActions allowableActions = fObjSvc.getAllowableActions(fRepositoryId, id, null);
+ assertNotNull(allowableActions);
+ actions = allowableActions.getAllowableActions();
+ assertNotNull(actions);
+ verifyAllowableActionsDocument(actions, false, withContent);
+
+ // cleanup
+ fObjSvc.deleteObject(fRepositoryId, id, true, null);
+ log.info("... testAllowableActions() finished.");
+ }
+
+ private void verifyAllowableActionsDocument(Set<Action> actions, boolean isVersioned, boolean hasContent) {
+ assertTrue(actions.contains(Action.CAN_DELETE_OBJECT));
+ assertTrue(actions.contains(Action.CAN_UPDATE_PROPERTIES));
+ assertTrue(actions.contains(Action.CAN_GET_PROPERTIES));
+ assertFalse(actions.contains(Action.CAN_GET_OBJECT_RELATIONSHIPS));
+ assertTrue(actions.contains(Action.CAN_GET_OBJECT_PARENTS));
+
+ assertFalse(actions.contains(Action.CAN_GET_FOLDER_PARENT));
+ assertFalse(actions.contains(Action.CAN_GET_FOLDER_TREE));
+ assertFalse(actions.contains(Action.CAN_GET_DESCENDANTS));
+ assertTrue(actions.contains(Action.CAN_MOVE_OBJECT));
+ if (hasContent) {
+ assertTrue(actions.contains(Action.CAN_DELETE_CONTENT_STREAM));
+ assertTrue(actions.contains(Action.CAN_GET_CONTENT_STREAM));
+ assertTrue(actions.contains(Action.CAN_GET_RENDITIONS));
+ } else {
+ assertFalse(actions.contains(Action.CAN_DELETE_CONTENT_STREAM));
+ assertFalse(actions.contains(Action.CAN_GET_CONTENT_STREAM));
+ assertFalse(actions.contains(Action.CAN_GET_RENDITIONS));
+ }
+ assertFalse(actions.contains(Action.CAN_ADD_OBJECT_TO_FOLDER));
+ assertFalse(actions.contains(Action.CAN_REMOVE_OBJECT_FROM_FOLDER));
+
+ if (isVersioned) {
+ assertTrue(actions.contains(Action.CAN_CANCEL_CHECK_OUT));
+ assertTrue(actions.contains(Action.CAN_CHECK_IN));
+ assertTrue(actions.contains(Action.CAN_CHECK_OUT));
+ assertTrue(actions.contains(Action.CAN_GET_ALL_VERSIONS));
+
+ } else {
+ assertFalse(actions.contains(Action.CAN_CANCEL_CHECK_OUT));
+ assertFalse(actions.contains(Action.CAN_CHECK_IN));
+ assertFalse(actions.contains(Action.CAN_CHECK_OUT));
+ assertFalse(actions.contains(Action.CAN_GET_ALL_VERSIONS));
+ }
+ assertTrue(actions.contains(Action.CAN_SET_CONTENT_STREAM));
+ assertFalse(actions.contains(Action.CAN_APPLY_POLICY));
+ assertFalse(actions.contains(Action.CAN_GET_APPLIED_POLICIES));
+ assertFalse(actions.contains(Action.CAN_REMOVE_POLICY));
+ assertFalse(actions.contains(Action.CAN_GET_CHILDREN));
+ assertFalse(actions.contains(Action.CAN_CREATE_DOCUMENT));
+ assertFalse(actions.contains(Action.CAN_CREATE_FOLDER));
+ assertFalse(actions.contains(Action.CAN_CREATE_RELATIONSHIP));
+ assertFalse(actions.contains(Action.CAN_DELETE_TREE));
+ assertFalse(actions.contains(Action.CAN_GET_ACL));
+ assertFalse(actions.contains(Action.CAN_APPLY_ACL));
+ }
+
+ private String retrieveDocument(String id) {
+ ObjectData res = getDocumentObjectData(id);
+ String returnedId = res.getId();
+ testReturnedProperties(returnedId, DOCUMENT_ID, DOCUMENT_TYPE_ID, res.getProperties().getProperties());
+ return returnedId;
+ }
+
+ private void moveObjectTest(boolean isFolder) {
+ final String propertyFilter = PropertyIds.OBJECT_ID + "," + PropertyIds.NAME; // +
+ // ","
+ // +
+ // PropertyIds
+ // .
+ // CMIS_OBJECT_TYPE_ID
+ // +
+ // ","
+ // +
+ // PropertyIds
+ // .
+ // CMIS_BASE_TYPE_ID
+ // ;
+ String rootFolderId = createFolder();
+ ObjectGenerator gen = new ObjectGenerator(fFactory, fNavSvc, fObjSvc, fRepositoryId);
+ // Set the type id for all created documents:
+ gen.setDocumentTypeId(InMemoryDocumentTypeDefinition.getRootDocumentType().getId());
+ // Set the type id for all created folders:
+ gen.setNumberOfDocumentsToCreatePerFolder(1); // create one document in
+ // each folder
+ gen.createFolderHierachy(3, 2, rootFolderId);
+ gen.setFolderTypeId(InMemoryFolderTypeDefinition.getRootFolderType().getId());
+ gen.dumpFolder(fRootFolderId, propertyFilter);
+ Holder<String> holder = new Holder<String>();
+ String sourceIdToMove = gen.getFolderId(rootFolderId, 2, 1);
+ if (!isFolder) // get first document in this folder
+ sourceIdToMove = gen.getDocumentId(sourceIdToMove, 0);
+ holder.setValue(sourceIdToMove); // "/Folder_1/My Folder 0/My Folder 1");
+ String sourceFolderId = getSourceFolder(sourceIdToMove);
+ log.info("Id before moveObject: " + holder.getValue());
+ fObjSvc.moveObject(fRepositoryId, holder, rootFolderId, sourceFolderId, null);
+ log.info("Id after moveObject: " + holder.getValue());
+ gen.dumpFolder(fRootFolderId, propertyFilter);
+
+ List<ObjectParentData> result = fNavSvc.getObjectParents(fRepositoryId, holder.getValue(), null, Boolean.FALSE,
+ IncludeRelationships.NONE, null, Boolean.FALSE, null);
+ // check that new parent is set correctly
+ String newParentId = result.get(0).getObject().getId();
+ assertEquals(rootFolderId, newParentId);
+
+ if (isFolder) {
+ log.info("testing moveFolder to a subfolder");
+ ObjectInFolderList ch = fNavSvc.getChildren(fRepositoryId, holder.getValue(), propertyFilter, null, false,
+ IncludeRelationships.NONE, null, false, null, null, null);
+ String subFolderId = ch.getObjects().get(0).getObject().getId();
+
+ try {
+ fObjSvc.moveObject(fRepositoryId, holder, subFolderId, sourceFolderId, null);
+ fail("moveObject to a folder that is a descendant of the source must fail.");
+ } catch (Exception e) {
+ assertTrue(e instanceof CmisNotSupportedException);
+ }
+ }
+ }
+
+ private String createFolder() {
+ return createFolder(FOLDER_ID, fRootFolderId, FOLDER_TYPE_ID);
+ }
+
+ private String createDocument(String folderId, boolean withContent) {
+ return createDocument(DOCUMENT_ID, folderId, withContent);
+ }
+
+ private String createDocument(String name, String folderId, boolean withContent) {
+ return createDocument(name, folderId, DOCUMENT_TYPE_ID, withContent);
+ }
+
+ private Properties createDocumentPropertiesForDocumentFromSource(String name) {
+ // We only provide a name but not a type id, as spec says to copy
+ // missing attributes
+ // from the existing one
+ List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, name));
+ Properties props = fFactory.createPropertiesData(properties);
+ return props;
+ }
+
+ private void testReturnedProperties(String objectId, String objectName, String typeId,
+ Map<String, PropertyData<?>> props) {
+ super.testReturnedProperties(objectId, props);
+
+ PropertyData<?> pd = props.get(PropertyIds.NAME);
+ assertNotNull(pd);
+ assertEquals(objectName, pd.getFirstValue());
+ pd = props.get(PropertyIds.OBJECT_TYPE_ID);
+ assertEquals(typeId, pd.getFirstValue());
+ }
+
+ private String createDocumentWithCustomType(String folderId, boolean withContent) {
+ ContentStream contentStream = null;
+ VersioningState versioningState = VersioningState.NONE;
+ List<String> policies = null;
+ Acl addACEs = null;
+ Acl removeACEs = null;
+ ExtensionsData extension = null;
+
+ // create the properties:
+ List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, MY_CUSTOM_NAME));
+ properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, TEST_CUSTOM_DOCUMENT_TYPE_ID));
+ // Generate some property values for custom attributes
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, "My pretty string"));
+ properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, BigInteger.valueOf(4711)));
+
+ Properties props = fFactory.createPropertiesData(properties);
+
+ if (withContent)
+ contentStream = createContent();
+
+ // create the document
+ String id = null;
+ id = fObjSvc.createDocument(fRepositoryId, props, folderId, contentStream, versioningState, policies, addACEs,
+ removeACEs, extension);
+ if (null == id)
+ throw new RuntimeException("createDocument failed.");
+ return id;
+ }
+
+ private String createDocumentInheritedProperties(String folderId, boolean withContent) {
+ ContentStream contentStream = null;
+ VersioningState versioningState = VersioningState.NONE;
+ List<String> policies = null;
+ Acl addACEs = null;
+ Acl removeACEs = null;
+ ExtensionsData extension = null;
+
+ // create the properties:
+ List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
+ properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, MY_CUSTOM_NAME));
+ properties.add(fFactory
+ .createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID));
+ // Generate some property values for custom attributes
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_STRING_PROP_ID, "My pretty string"));
+ properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_INT_PROP_ID, BigInteger.valueOf(4711)));
+ properties.add(fFactory.createPropertyStringData(TEST_DOCUMENT_MY_SUB_STRING_PROP_ID, "another cool string"));
+ properties.add(fFactory.createPropertyIntegerData(TEST_DOCUMENT_MY_SUB_INT_PROP_ID, BigInteger.valueOf(4712)));
+
+ Properties props = fFactory.createPropertiesData(properties);
+
+ if (withContent)
+ contentStream = createContent();
+
+ // create the document
+ String id = null;
+ id = fObjSvc.createDocument(fRepositoryId, props, folderId, contentStream, versioningState, policies, addACEs,
+ removeACEs, extension);
+ if (null == id)
+ throw new RuntimeException("createDocument failed.");
+ return id;
+ }
+
+ private String getSourceFolder(String objectId) {
+ // return the first parent found in the result list of all parents
+ List<ObjectParentData> parents = fNavSvc.getObjectParents(fRepositoryId, objectId, "*", false,
+ IncludeRelationships.NONE, null, true, null);
+ return parents.get(0).getObject().getId();
+ }
+
+ // Helper class to create some type for testing the ObjectService
+
+ public static class ObjectTestTypeSystemCreator implements TypeCreator {
+
+ /**
+ * create root types and a sample type for folder and document
+ *
+ * @return typesMap map filled with created types
+ */
+ public List<TypeDefinition> createTypesList() {
+ List<TypeDefinition> typesList = new LinkedList<TypeDefinition>();
+ InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(TEST_DOCUMENT_TYPE_ID,
+ "My Document Type", InMemoryDocumentTypeDefinition.getRootDocumentType());
+
+ InMemoryFolderTypeDefinition cmisFolderType = new InMemoryFolderTypeDefinition(TEST_FOLDER_TYPE_ID,
+ "My Folder Type", InMemoryFolderTypeDefinition.getRootFolderType());
+ // create a simple string property type and
+ // attach the property definition to the type definition for
+ // document and folder type
+ Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl prop = PropertyCreationHelper.createStringDefinition(
+ TEST_DOCUMENT_STRING_PROP_ID, "Sample Doc String Property");
+ propertyDefinitions.put(prop.getId(), prop);
+ cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
+
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ prop = PropertyCreationHelper.createStringDefinition(TEST_FOLDER_STRING_PROP_ID,
+ "Sample Folder String Property");
+ propertyDefinitions.put(prop.getId(), prop);
+ cmisFolderType.addCustomPropertyDefinitions(propertyDefinitions);
+
+ InMemoryDocumentTypeDefinition customDocType = createCustomTypeWithStringIntProperty();
+ // add type to types collection
+ typesList.add(cmisDocumentType);
+ typesList.add(cmisFolderType);
+ typesList.add(customDocType);
+ typesList.add(createCustomInheritedType(customDocType));
+ return typesList;
+ }
+
+ private static InMemoryDocumentTypeDefinition createCustomTypeWithStringIntProperty() {
+ InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(
+ TEST_CUSTOM_DOCUMENT_TYPE_ID, "My Custom Document Type", InMemoryDocumentTypeDefinition
+ .getRootDocumentType());
+ Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl prop = PropertyCreationHelper.createStringDefinition(
+ TEST_DOCUMENT_MY_STRING_PROP_ID, "My String Property");
+ prop.setIsRequired(false);
+ prop.setMaxLength(BigInteger.valueOf(20)); // max len to 20
+ propertyDefinitions.put(prop.getId(), prop);
+
+ PropertyIntegerDefinitionImpl prop2 = PropertyCreationHelper.createIntegerDefinition(
+ TEST_DOCUMENT_MY_INT_PROP_ID, "My Integer Property");
+ prop2.setIsRequired(true);
+ prop2.setMinValue(BigInteger.valueOf(-10000));
+ prop2.setMaxValue(BigInteger.valueOf(10000));
+ propertyDefinitions.put(prop2.getId(), prop2);
+ cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
+ return cmisDocumentType;
+ }
+
+ private static InMemoryDocumentTypeDefinition createCustomInheritedType(InMemoryDocumentTypeDefinition baseType) {
+ InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(
+ TEST_INHERITED_CUSTOM_DOCUMENT_TYPE_ID, "My Custom Document Type", baseType);
+ Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl prop = PropertyCreationHelper.createStringDefinition(
+ TEST_DOCUMENT_MY_SUB_STRING_PROP_ID, "Subtype String Property");
+ prop.setIsRequired(false);
+ propertyDefinitions.put(prop.getId(), prop);
+
+ PropertyIntegerDefinitionImpl prop2 = PropertyCreationHelper.createIntegerDefinition(
+ TEST_DOCUMENT_MY_SUB_INT_PROP_ID, "Subtype");
+ prop2.setIsRequired(true);
+ propertyDefinitions.put(prop2.getId(), prop2);
+ cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
+ return cmisDocumentType;
+ }
- }
+ }
}