/** * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xcmis.spi.tck; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.xcmis.spi.BaseContentStream; import org.xcmis.spi.ChangeTokenHolder; import org.xcmis.spi.CmisConstants; import org.xcmis.spi.ConstraintException; import org.xcmis.spi.ContentAlreadyExistsException; import org.xcmis.spi.ContentStream; import org.xcmis.spi.InvalidArgumentException; import org.xcmis.spi.ItemsTree; import org.xcmis.spi.NameConstraintViolationException; import org.xcmis.spi.ObjectNotFoundException; import org.xcmis.spi.RenditionFilter; import org.xcmis.spi.StreamNotSupportedException; import org.xcmis.spi.model.AccessControlEntry; import org.xcmis.spi.model.AllowableActions; import org.xcmis.spi.model.BaseType; import org.xcmis.spi.model.CapabilityACL; import org.xcmis.spi.model.CmisObject; import org.xcmis.spi.model.ContentStreamAllowed; import org.xcmis.spi.model.IncludeRelationships; import org.xcmis.spi.model.ObjectParent; import org.xcmis.spi.model.Property; import org.xcmis.spi.model.RepositoryCapabilities; import org.xcmis.spi.model.TypeDefinition; import org.xcmis.spi.model.UnfileObject; import org.xcmis.spi.model.VersioningState; import org.xcmis.spi.model.impl.IdProperty; import org.xcmis.spi.model.impl.StringProperty; import org.xcmis.spi.utils.MimeType; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class ObjectTest extends BaseTest { private static String testRootFolderId; private static TypeDefinition folderType; private static TypeDefinition documentType; private static TypeDefinition folderTypeControllableAcl; private static TypeDefinition folderTypeNotControllableAcl; private static TypeDefinition folderTypeControllablePolicy; private static TypeDefinition folderTypeNotControllablePolicy; private static TypeDefinition documentTypeStreamNotSupported; private static TypeDefinition documentTypeStreamRequired; private static TypeDefinition documentTypeControllableAcl; private static TypeDefinition documentTypeNotControllableAcl; private static TypeDefinition documentTypeControllablePolicy; private static TypeDefinition documentTypeNotControllablePolicy; private static TypeDefinition documentTypeVersionable; private static TypeDefinition documentTypeNotVersionable; private static TypeDefinition policyType; private static TypeDefinition policyTypeControllableAcl; private static TypeDefinition policyTypeNotControllableAcl; private static TypeDefinition policyTypeControllablePolicy; private static TypeDefinition policyTypeNotControllablePolicy; private static TypeDefinition relationshipType; private static TypeDefinition relationshipTypeControllableAcl; private static TypeDefinition relationshipTypeNotControllableAcl; private static TypeDefinition relationshipTypeControllablePolicy; private static TypeDefinition relationshipTypeNotControllablePolicy; private String principal = "root"; @BeforeClass public static void start() throws Exception { folderType = connection.getTypeDefinition(CmisConstants.FOLDER); List<ItemsTree<TypeDefinition>> allFolders = connection.getTypeDescendants(folderType.getId(), -1, true); if (folderType.isControllableACL()) { folderTypeControllableAcl = folderType; } else { folderTypeNotControllableAcl = folderType; } if (folderTypeControllableAcl == null) { folderTypeControllableAcl = getControllableAclType(allFolders); } if (folderTypeNotControllableAcl == null) { folderTypeNotControllableAcl = getNotControllableAclType(allFolders); } if (folderType.isControllablePolicy()) { folderTypeControllablePolicy = folderType; } else { folderTypeNotControllablePolicy = folderType; } if (folderTypeControllablePolicy == null) { folderTypeControllablePolicy = getControllablePolicyType(allFolders); } if (folderTypeNotControllablePolicy == null) { folderTypeNotControllablePolicy = getNotControllablePolicyType(allFolders); } documentType = connection.getTypeDefinition(CmisConstants.DOCUMENT); List<ItemsTree<TypeDefinition>> allDocs = connection.getTypeDescendants(documentType.getId(), -1, true); if (documentType.isControllableACL()) { documentTypeControllableAcl = documentType; } else { documentTypeNotControllableAcl = documentType; } if (documentTypeControllableAcl == null) { documentTypeControllableAcl = getControllableAclType(allDocs); } if (documentTypeNotControllableAcl == null) { documentTypeNotControllableAcl = getNotControllableAclType(allDocs); } if (documentType.isControllablePolicy()) { documentTypeControllablePolicy = documentType; } else { documentTypeNotControllablePolicy = documentType; } if (documentTypeControllablePolicy == null) { documentTypeControllablePolicy = getControllablePolicyType(allDocs); } if (documentTypeNotControllablePolicy == null) { documentTypeNotControllablePolicy = getNotControllablePolicyType(allDocs); } if (documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED) { documentTypeStreamNotSupported = documentType; } if (documentTypeStreamNotSupported == null) { documentTypeStreamNotSupported = getStreamNotSupportedDocType(allDocs); } if (documentType.getContentStreamAllowed() == ContentStreamAllowed.REQUIRED) { documentTypeStreamRequired = documentType; } if (documentTypeStreamRequired == null) { documentTypeStreamRequired = getStreamNotSupportedDocType(allDocs); } if (!documentType.isVersionable()) { documentTypeNotVersionable = documentType; } else { documentTypeVersionable = documentType; } if (documentTypeNotVersionable == null) { documentTypeNotVersionable = getNotVersionableDocType(allDocs); } if (documentTypeVersionable == null) { documentTypeVersionable = getVersionableDocType(allDocs); } if (isPoliciesSupported) { policyType = connection.getTypeDefinition(CmisConstants.POLICY); List<ItemsTree<TypeDefinition>> allPolicies = connection.getTypeDescendants(policyType.getId(), -1, true); if (policyType.isControllableACL()) { policyTypeControllableAcl = policyType; } else { policyTypeNotControllableAcl = policyType; } if (policyTypeControllableAcl == null) { policyTypeControllableAcl = getControllableAclType(allPolicies); } if (policyTypeNotControllableAcl == null) { policyTypeNotControllableAcl = getNotControllableAclType(allPolicies); } if (policyType.isControllablePolicy()) { policyTypeControllablePolicy = policyType; } else { policyTypeNotControllablePolicy = policyType; } if (policyTypeControllablePolicy == null) { policyTypeControllablePolicy = getControllablePolicyType(allPolicies); } if (policyTypeNotControllablePolicy == null) { policyTypeNotControllablePolicy = getNotControllablePolicyType(allPolicies); } } if (isRelationshipsSupported) { relationshipType = connection.getTypeDefinition(CmisConstants.RELATIONSHIP); List<ItemsTree<TypeDefinition>> allRelationships = connection.getTypeDescendants(relationshipType.getId(), -1, true); if (relationshipType.isControllableACL()) { relationshipTypeControllableAcl = relationshipType; } else { relationshipTypeNotControllableAcl = relationshipType; } if (relationshipTypeControllableAcl == null) { relationshipTypeControllableAcl = getControllableAclType(allRelationships); } if (relationshipTypeNotControllableAcl == null) { relationshipTypeNotControllableAcl = getNotControllableAclType(allRelationships); } if (relationshipType.isControllablePolicy()) { relationshipTypeControllablePolicy = relationshipType; } else { relationshipTypeNotControllablePolicy = relationshipType; } if (relationshipTypeControllablePolicy == null) { relationshipTypeControllablePolicy = getControllablePolicyType(allRelationships); } if (relationshipTypeNotControllablePolicy == null) { relationshipTypeNotControllablePolicy = getNotControllablePolicyType(allRelationships); } } testRootFolderId = createFolder(rootFolderID, folderType.getId(), "object_testroot", null, null, null); System.out.println("Running Object Service tests"); } @AfterClass public static void stop() throws Exception { if (testRootFolderId != null) { clear(testRootFolderId); } } /** * 2.2.4.1 createDocument. * <p> * Create document and set content stream for it. If content stream is not * allowed for document then content will be not set. * </p> */ @Test public void testCreateDocument_Content() throws Exception { String template = "1234567890aBcDE"; ContentStream content = null; if (documentType.getContentStreamAllowed() != ContentStreamAllowed.NOT_ALLOWED) { byte[] before = template.getBytes(); content = new BaseContentStream(before, null, new MimeType("text", "plain")); } Map<String, Property<?>> properties = createPropertyMap(documentType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_CheckContent.txt"); } String docId = connection.createDocument(testRootFolderId, properties, content, null, null, null, documentType .isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); // Check content it it exists. if (content != null) { ContentStream content1 = connection.getContentStream(docId, null); assertEquals(content.getMediaType(), content1.getMediaType()); byte[] buf = new byte[1024]; int read = content1.getStream().read(buf); assertEquals(template, new String(buf, 0, read)); } else { // Content is not allowed, ConstraintException must be thrown. try { connection.getContentStream(docId, null); fail("ConstraintException must be throw, content stream not allowed. "); } catch (ConstraintException e) { } } } /** * 2.2.4.1 createDocument. * <p> * Create document and apply policies to the newly-created document object. * If policies is not supported then this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateDocument_ApplyPolicy() throws Exception { if (documentTypeControllablePolicy == null) { return; } String policyId = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); Map<String, Property<?>> properties = createPropertyMap(documentTypeControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ApplyPolicy"); } String docId = connection.createDocument(testRootFolderId, properties, documentTypeControllablePolicy .getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, Arrays.asList(policyId), documentTypeControllablePolicy.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); List<CmisObject> policies = connection.getAppliedPolicies(docId, true, null); assertEquals(1, policies.size()); assertEquals(policyId, policies.get(0).getObjectInfo().getId()); } /** * 2.2.4.1 createDocument. * <p> * Create document and apply ACL for it. If ACL is not supported at all or * can't be managed (if method * {@link RepositoryCapabilities#getCapabilityACL()} returns something other * then CapabilityACL.MANAGE) this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateDocument_ApplyACL() throws Exception { if (documentTypeControllableAcl == null || capabilities.getCapabilityACL() != CapabilityACL.MANAGE) { return; } List<AccessControlEntry> acl = createACL(principal, "cmis:all"); Map<String, Property<?>> properties = createPropertyMap(documentTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ApplyACL"); } String docId = connection.createDocument(testRootFolderId, properties, documentTypeControllableAcl.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, acl, null, null, documentTypeControllableAcl.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); List<AccessControlEntry> actualACL = connection.getACL(docId, false); validateACL(actualACL); checkACL(acl, actualACL); } /** * 2.2.4.1 createDocument. * <p> * If a violation are detected with the given cmis:name property value, the * repository MAY throw {@link NameConstraintViolationException} or chose a * name which does not conflict. Try create two documents with the same name * in one directory and expect to get * {@link NameConstraintViolationException} or at least second document must * get different name then provide when it created. * </p> * * @throws Exception */ @Test public void testCreateDocument_NameConstraintViolationException() throws Exception { String name = "testCreateDocument_NameConstraintViolationException"; Map<String, Property<?>> properties = createPropertyMap(documentType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add(name); } connection.createDocument(testRootFolderId, properties, documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, null, documentType.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); try { String docId2 = connection.createDocument(testRootFolderId, properties, documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, null, documentType.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); // If exception was not thrown then check name, it must be different. CmisObject doc2 = connection.getObject(docId2, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); String name2 = doc2.getObjectInfo().getName(); assertFalse("NameConstraintViolationException must be throw or different name chosen. ", name.equals(name2)); } catch (NameConstraintViolationException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link StreamNotSupportedException} must be thrown if the * "contentStreamAllowed" attribute of the object type definition specified * by the cmis:objectTypeId property value is set to "not allowed" and a * content stream input parameter is provided. If there is no any type for * which content stream is not allowed this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateDocument_StreamNotSupportedException() throws Exception { if (documentTypeStreamNotSupported == null) { return; } Map<String, Property<?>> properties = createPropertyMap(documentTypeStreamNotSupported); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_StreamNotSupportedException"); } try { connection.createDocument(testRootFolderId, properties, BaseTest.TEST_CONTENT_STREAM, null, null, null, documentTypeStreamNotSupported.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); fail("StreamNotSupportedException must be thrown. "); } catch (StreamNotSupportedException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link ConstraintException} must be thrown if cmis:objectTypeId property * value is not an object type whose baseType is cmis:document. * </p> * * @throws Exception */ @Test public void testCreateDocument_ConstraintException_ObjectType() throws Exception { Map<String, Property<?>> properties = createPropertyMap(documentType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_ObjectType"); } IdProperty property = (IdProperty)properties.get(CmisConstants.OBJECT_TYPE_ID); property.getValues().clear(); // Set cmis:folder instead cmis:document property.getValues().add(folderType.getId()); try { connection.createDocument(testRootFolderId, properties, documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, null, documentType.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); fail("ConstraintException must be thrown."); } catch (ConstraintException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link StreamNotSupportedException} must be thrown if the * "contentStreamAllowed" attribute of the object type definition specified * by the cmis:objectTypeId property value is set to "required" and a content * stream input parameter is not provided. If there is no any type for which * content stream is "required" this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateDocument_ConstraintException_ContentRequired() throws Exception { if (documentTypeStreamRequired == null) { return; } Map<String, Property<?>> properties = createPropertyMap(documentTypeStreamRequired); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_ContentRequired"); } try { connection.createDocument(testRootFolderId, properties, null, null, null, null, documentTypeStreamRequired .isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link ConstraintException} must be thrown if "versionable" attribute of * the object type definition specified by the cmis:objectTypeId property * value is set to <code>true</code> and the value for the versioningState * input parameter is provided that is "none". * </p> * * @throws Exception */ @Test public void testCreateDocument_ConstraintException_Versionable() throws Exception { if (documentTypeVersionable == null) { return; } Map<String, Property<?>> properties = createPropertyMap(documentTypeVersionable); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_Versionable"); } try { connection.createDocument(testRootFolderId, properties, documentTypeVersionable.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, null, VersioningState.NONE); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link ConstraintException} must be thrown if "versionable" attribute of * the object type definition specified by the cmis:objectTypeId property * value is set to <code>false</code> and the value for the versioningState * input parameter is other then "none". * </p> * * @throws Exception */ @Test @Ignore // Ignore it at the moment. Not clear from specification what must be exception // or ignoring versionState attribute for not versionable document. public void testCreateDocument_ConstraintException_NonVersionable() throws Exception { if (documentTypeNotVersionable == null) { return; } Map<String, Property<?>> properties = createPropertyMap(documentTypeNotVersionable); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_NonVersionable"); } try { connection.createDocument(testRootFolderId, properties, documentTypeNotVersionable.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, null, VersioningState.MAJOR); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link ConstraintException} must be thrown if "controllablePolicy" * attribute of the object type definition specified by the cmis:objectTypeId * property value is set to <code>false</code> and at least one policy is * provided. * </p> * * @throws Exception */ @Test public void testCreateDocument_ConstraintException_NotControllablePolicy() throws Exception { if (!isPoliciesSupported || documentTypeNotControllablePolicy == null) { return; } String policy = createPolicy(testRootFolderId, policyType.getId(), generateName(policyType, null), BaseTest.TEST_POLICY_TEXT, null, null, null); Map<String, Property<?>> properties = createPropertyMap(documentTypeNotControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_NotControllablePolicy"); } try { connection.createDocument(testRootFolderId, properties, documentTypeNotControllablePolicy .getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, Arrays.asList(policy), documentTypeNotControllablePolicy.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link ConstraintException} must be thrown if "controllableACL" attribute * of the object type definition specified by the cmis:objectTypeId property * value is set to <code>false</code> and at least one ACE is provided. * </p> * * @throws Exception */ @Test public void testCreateDocument_ConstraintException_NotControllableACL() throws Exception { if (!capabilities.getCapabilityACL().equals(CapabilityACL.MANAGE) || documentTypeNotControllableAcl == null) { return; } Map<String, Property<?>> properties = createPropertyMap(documentTypeNotControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_NotControllableACL"); } try { connection.createDocument(testRootFolderId, properties, documentTypeNotControllableAcl .getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, createACL(principal, "cmis:all"), null, null, documentTypeNotControllableAcl.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.1 createDocument. * <p> * {@link ConstraintException} must be thrown if at least one of the * permissions is used in an ACE provided which is not supported by the * repository. * </p> * * @throws Exception */ @Test public void testCreateDocument_ConstraintException_ACENotSupported() throws Exception { if (!capabilities.getCapabilityACL().equals(CapabilityACL.MANAGE) || documentTypeControllableAcl == null) { return; } if (documentTypeControllableAcl != null) { Map<String, Property<?>> properties = createPropertyMap(documentTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateDocument_ConstraintException_ACENotSupported"); } try { List<AccessControlEntry> acl = createACL(principal, "cmis:unknown"); connection.createDocument(testRootFolderId, properties, documentTypeControllableAcl .getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, acl, null, null, documentTypeControllableAcl.isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } } /** * 2.2.4.2 createDocumentFromSource. * <p> * Creates a document object as a copy of the given source document in the * specified location. * </p> * * @throws Exception */ @Test public void testCreateDocumentFromSource_Content() throws Exception { String name = generateName(documentType, null); String document = createDocument(testRootFolderId, documentType.getId(), name, documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED ? null : BaseTest.TEST_CONTENT_STREAM, null, null, null, null); Map<String, Property<?>> properties = createPropertyMap(documentType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add(name + "_copy"); } String documentCopy = connection.createDocumentFromSource(document, testRootFolderId, properties, null, null, null, documentType .isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); try { connection.getObject(documentCopy, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); } catch (ObjectNotFoundException e) { fail("Can't get newly created object. "); } if (documentType.getContentStreamAllowed() != ContentStreamAllowed.NOT_ALLOWED) { ContentStream content = connection.getContentStream(documentCopy, null); byte[] buf = new byte[1024]; int read = content.getStream().read(buf); byte[] res = new byte[read]; System.arraycopy(buf, 0, res, 0, read); assertArrayEquals(TEST_CONTENT, res); } else { try { connection.getContentStream(documentCopy, null); fail("ConstraintException must be throw, content stream not allowed. "); } catch (ConstraintException e) { } } } /** * 2.2.4.3 createFolder. * <p> * Create a folder object of the specified type in the specified location * without any additional attributes, such as policies, ACL, etc. * </p> * * @throws Exception */ @Test public void testCreateFolder() throws Exception { Map<String, Property<?>> properties = createPropertyMap(folderType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder"); } String folderId = connection.createFolder(testRootFolderId, properties, null, null, null); // Get by id. try { connection.getObject(folderId, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); } catch (ObjectNotFoundException e) { fail("Unable get newly create folder by id. "); } // Get by path. String path = "/object_testroot/testCreateFolder"; try { connection.getObjectByPath(path, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); } catch (ObjectNotFoundException e) { fail("Unable get newly create folder by path. "); } } /** * 2.2.4.3 createFolder. * <p> * Create folder and apply policies to the newly-created folder object. If * policies is not supported then this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateFolder_ApplyPolicy() throws Exception { if (folderTypeControllablePolicy == null || !isPoliciesSupported) { return; } String policyId = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); Map<String, Property<?>> properties = createPropertyMap(folderTypeControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder_ApplyPolicy"); } String folderId = connection.createFolder(testRootFolderId, properties, null, null, Arrays.asList(policyId)); List<CmisObject> policies = connection.getAppliedPolicies(folderId, true, null); assertEquals(1, policies.size()); assertEquals(policyId, policies.get(0).getObjectInfo().getId()); } /** * 2.2.4.3 createFolder. * <p> * Create folder and apply ACL for it. If ACL is not supported at all or * can't be managed (if method * {@link RepositoryCapabilities#getCapabilityACL()} returns something other * then CapabilityACL.MANAGE) this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateFolder_ApplyACL() throws Exception { if (folderTypeControllableAcl == null || capabilities.getCapabilityACL() != CapabilityACL.MANAGE) { return; } List<AccessControlEntry> acl = createACL(principal, "cmis:all"); Map<String, Property<?>> properties = createPropertyMap(folderTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder_ApplyACL"); } String folderId = connection.createFolder(testRootFolderId, properties, acl, null, null); List<AccessControlEntry> actualACL = connection.getACL(folderId, false); validateACL(actualACL); checkACL(acl, actualACL); } /** * 2.2.4.3 createFolder. * <p> * If a violation are detected with the given cmis:name property value, the * repository MAY throw {@link NameConstraintViolationException} or chose a * name which does not conflict. Try create two folders with the same name in * one directory and expect to get {@link NameConstraintViolationException} * or at least second folder must get different name then provide when it * created. * </p> * * @throws Exception */ @Test public void testCreateFolder_NameConstraintViolationException() throws Exception { String name = "testCreateFolder_NameConstraintViolationException"; Map<String, Property<?>> properties = createPropertyMap(folderType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add(name); } connection.createFolder(testRootFolderId, properties, null, null, null); try { String folderId2 = connection.createFolder(testRootFolderId, // properties, null, null, null); // If exception was not thrown then check name, it must be different. CmisObject folder2 = connection.getObject(folderId2, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); String name2 = folder2.getObjectInfo().getName(); assertFalse("NameConstraintViolationException must be throw or different name chosen. ", name.equals(name2)); } catch (NameConstraintViolationException e) { } } /** * 2.2.4.3 createFolder. * <p> * {@link ConstraintException} must be thrown if cmis:objectTypeId property * value is not an object type whose baseType is cmis:folder. * </p> * * @throws Exception */ @Test public void testCreateFolder_ConstraintException_ObjectType() throws Exception { Map<String, Property<?>> properties = createPropertyMap(folderType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder_ConstraintException_ObjectType"); } IdProperty property = (IdProperty)properties.get(CmisConstants.OBJECT_TYPE_ID); property.getValues().clear(); // Set cmis:document instead cmis:folder property.getValues().add(documentType.getId()); try { connection.createFolder(testRootFolderId, properties, null, null, null); fail("ConstraintException must be thrown."); } catch (ConstraintException e) { } } /** * 2.2.4.3 createFolder. * <p> * {@link ConstraintException} must be thrown if "controllablePolicy" * attribute of the object type definition specified by the cmis:objectTypeId * property value is set to <code>false</code> and at least one policy is * provided. * </p> * * @throws Exception */ @Test public void testCreateFolder_ConstraintException_NotControllablePolicy() throws Exception { if (!isPoliciesSupported || folderTypeNotControllablePolicy == null) { return; } if (folderTypeNotControllablePolicy != null) { String policy = createPolicy(testRootFolderId, policyType.getId(), generateName(policyType, null), BaseTest.TEST_POLICY_TEXT, null, null, null); Map<String, Property<?>> properties = createPropertyMap(folderTypeNotControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder_ConstraintException_NotControllablePolicy"); } try { connection.createFolder(testRootFolderId, properties, null, null, Arrays.asList(policy)); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } } /** * 2.2.4.3 createFolder. * <p> * {@link ConstraintException} must be thrown if at least one of the * permissions is used in an ACE provided which is not supported by the * repository. * </p> * * @throws Exception */ @Test public void testCreateFolder_ConstraintException_ACENotSupported() throws Exception { if (!capabilities.getCapabilityACL().equals(CapabilityACL.MANAGE) || folderTypeControllableAcl == null) { return; } Map<String, Property<?>> properties = createPropertyMap(folderTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder_ConstraintException_ACENotSupported"); } try { List<AccessControlEntry> acl = createACL(principal, "cmis:unknown"); connection.createFolder(testRootFolderId, properties, acl, null, null); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.3 createFolder. * <p> * {@link ConstraintException} must be thrown if "controllableACL" attribute * of the object type definition specified by the cmis:objectTypeId property * value is set to <code>false</code> and at least one ACE is provided. * </p> * * @throws Exception */ @Test public void testCreateFolder_ConstraintException_NotControllableACL() throws Exception { if (!capabilities.getCapabilityACL().equals(CapabilityACL.MANAGE) || folderTypeNotControllableAcl == null) { return; } if (folderTypeNotControllableAcl != null) { Map<String, Property<?>> properties = createPropertyMap(folderTypeNotControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateFolder_ConstraintException_NotControllableACL"); } try { connection.createFolder(testRootFolderId, properties, createACL(principal, "cmis:all"), null, null); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } } /** * 2.2.4.4 createRelationship. * <p> * Create a relationship object of the specified type without any additional * attributes, such as policies, ACL, etc. * </p> * * @throws Exception */ @Test public void testCreateRelationship() throws Exception { if (!isRelationshipsSupported) { return; } String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); Map<String, Property<?>> properties = createPropertyMap(relationshipType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship"); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } String relationshipId = connection.createRelationship(properties, null, null, null); try { connection.getObject(relationshipId, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); } catch (ObjectNotFoundException e) { fail("Unable get newly create relationship. "); } } /** * 2.2.4.4 createRelationship. * <p> * Create a relationship object of the specified and apply policies to it. * </p> * * @throws Exception */ @Test public void testCreateRelationship_ApplyPolicy() throws Exception { if (!isRelationshipsSupported || !isPoliciesSupported || relationshipTypeControllablePolicy == null) { return; } String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); Map<String, Property<?>> properties = createPropertyMap(relationshipTypeControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship_ApplyPolicy"); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } String relationshipId = connection.createRelationship(properties, null, null, Arrays.asList(policy)); List<CmisObject> policies = connection.getAppliedPolicies(relationshipId, true, null); assertEquals(1, policies.size()); assertEquals(policy, policies.get(0).getObjectInfo().getId()); } /** * 2.2.4.4 createRelationship. * <p> * Create relationship and apply ACL for it. If ACL is not supported at all * or can't be managed (if method * {@link RepositoryCapabilities#getCapabilityACL()} returns something other * then CapabilityACL.MANAGE) this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreateRelationship_ApplyACL() throws Exception { if (!isRelationshipsSupported || relationshipTypeControllableAcl == null || capabilities.getCapabilityACL() != CapabilityACL.MANAGE) { return; } String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); List<AccessControlEntry> acl = createACL(principal, "cmis:all"); Map<String, Property<?>> properties = createPropertyMap(relationshipTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship_ApplyACL"); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } String relationshipId = connection.createRelationship(properties, acl, null, null); List<AccessControlEntry> actualACL = connection.getACL(relationshipId, false); validateACL(actualACL); checkACL(acl, actualACL); } /** * 2.2.4.4 createRelationship. * <p> * If a violation are detected with the given cmis:name property value, the * repository MAY throw {@link NameConstraintViolationException} or chose a * name which does not conflict. Try create two relationship with the same * name and expect to get {@link NameConstraintViolationException} or at * least second relationship must get different name then provide when it * created. * </p> * * @throws Exception */ @Test @Ignore // Ignore since in some case storage may not throw exception or choose different name. // Relationship is not hierarchical not need (but may) to be care about names. // Enable this if need. public void testCreateRelationship_NameConstraintViolationException() throws Exception { if (!isRelationshipsSupported) { return; } String name = "testCreateRelationship_NameConstraintViolationException"; String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); Map<String, Property<?>> properties = createPropertyMap(relationshipType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add(name); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } connection.createRelationship(properties, null, null, null); try { String relationshipId2 = connection.createRelationship(properties, null, null, null); // If exception was not thrown then check name, it must be different. CmisObject relationship2 = connection.getObject(relationshipId2, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); String name2 = relationship2.getObjectInfo().getName(); assertFalse("NameConstraintViolationException must be throw or different name chosen. ", name.equals(name2)); } catch (NameConstraintViolationException e) { } } /** * 2.2.4.4 createRelationship. * <p> * {@link ConstraintException} must be thrown if cmis:objectTypeId property * value is not an object type whose baseType is cmis:relationship. * </p> * * @throws Exception */ @Test public void testCreateRelationship_ConstraintException_ObjectType() throws Exception { if (!isRelationshipsSupported) { return; } String name = "testCreateRelationship_ConstraintException_ObjectType"; String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); Map<String, Property<?>> properties = createPropertyMap(relationshipType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add(name); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } IdProperty property = (IdProperty)properties.get(CmisConstants.OBJECT_TYPE_ID); property.getValues().clear(); // Set cmis:document instead cmis:relationship property.getValues().add(documentType.getId()); try { connection.createRelationship(properties, null, null, null); fail("ConstraintException must be thrown."); } catch (ConstraintException e) { } } /* * TODO * Tests for throwing {@link ConstraintException} if the * sourceObjectId's ObjectType is not in the list of "allowedSourceTypes" * specified by the object type definition specified by cmis:objectTypeId * property value. Or if targetObjectId's ObjectType is not in the list of * "allowedTargetTypes" specified by the object type definition specified by * cmis:objectTypeId property value. */ /** * 2.2.4.4 createRelationship. * <p> * {@link ConstraintException} must be thrown if "controllablePolicy" * attribute of the object type definition specified by the cmis:objectTypeId * property value is set to <code>false</code> and at least one policy is * provided. * </p> * * @throws Exception */ @Test public void testCreateRelationship_ConstraintException_NotControllablePolicy() throws Exception { if (!isRelationshipsSupported || !isPoliciesSupported || relationshipTypeNotControllablePolicy == null) { return; } String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); Map<String, Property<?>> properties = createPropertyMap(relationshipTypeNotControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship_ConstraintException_NotControllablePolicy"); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } try { connection.createRelationship(properties, null, null, Arrays.asList(policy)); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.4 createRelationship. * <p> * {@link ConstraintException} must be thrown if "controllableACL" attribute * of the object type definition specified by the cmis:objectTypeId property * value is set to <code>false</code> and at least one ACEs is provided. * </p> * * @throws Exception */ @Test public void testCreateRelationship_ConstraintException_NotControllableACL() throws Exception { if (!isRelationshipsSupported || capabilities.getCapabilityACL() != CapabilityACL.MANAGE || relationshipTypeNotControllableAcl == null) { return; } String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); List<AccessControlEntry> acl = createACL(principal, "cmis:all"); Map<String, Property<?>> properties = createPropertyMap(relationshipTypeNotControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship_ConstraintException_NotControllableACL"); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } try { connection.createRelationship(properties, acl, null, null); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.4 createRelationship. * <p> * {@link ConstraintException} must be thrown if at least one of the * permissions is used in an ACE provided which is not supported by the * repository. * </p> * * @throws Exception */ @Test public void testCreateRelationship_ConstraintException_ACENotSupported() throws Exception { if (!isRelationshipsSupported || !capabilities.getCapabilityACL().equals(CapabilityACL.MANAGE) || relationshipTypeControllableAcl == null) { return; } String source = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String target = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); List<AccessControlEntry> acl = createACL(principal, "cmis:unknown"); Map<String, Property<?>> properties = createPropertyMap(relationshipTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship_ConstraintException_ACENotSupported"); } IdProperty sourceIdProperty = (IdProperty)properties.get(CmisConstants.SOURCE_ID); if (sourceIdProperty != null) { sourceIdProperty.getValues().add(source); } IdProperty targetIdProperty = (IdProperty)properties.get(CmisConstants.TARGET_ID); if (targetIdProperty != null) { targetIdProperty.getValues().add(target); } try { connection.createRelationship(properties, acl, null, null); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.5 createPolicy. * <p> * Create a relationship object of the specified type without any additional * attributes, such as policies, ACL, etc. * </p> * * @throws Exception */ @Test public void testCreatePolicy() throws Exception { if (!isPoliciesSupported) { return; } String test = "test create policy"; Map<String, Property<?>> properties = createPropertyMap(policyType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreatePolicy"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(test); } String policyId = connection.createPolicy(policyType.isFileable() ? testRootFolderId : null, properties, null, null, null); CmisObject policy = null; try { policy = connection.getObject(policyId, false, IncludeRelationships.NONE, false, false, true, CmisConstants.POLICY_TEXT, RenditionFilter.NONE); } catch (ObjectNotFoundException e) { fail("Unable get newly create policy. "); } assertNotNull(policy); assertEquals("testCreatePolicy", policy.getObjectInfo().getName()); StringProperty textProperty = (StringProperty)policy.getProperties().get(CmisConstants.POLICY_TEXT); assertTrue("Unable get policy text. ", textProperty != null && textProperty.getValues().size() > 0); assertEquals(test, textProperty.getValues().get(0)); } /** * 2.2.4.5 createPolicy. * <p> * Create a policy object of the specified and apply policies to it. * </p> * * @throws Exception */ @Test public void testCreatePolicy_ApplyPolicy() throws Exception { if (!isPoliciesSupported || policyTypeControllablePolicy == null) { return; } String policy1 = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); Map<String, Property<?>> properties = createPropertyMap(policyTypeControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreatePolicy_ApplyPolicy"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } String policyId = connection.createPolicy(policyTypeControllablePolicy.isFileable() ? testRootFolderId : null, properties, null, null, Arrays.asList(policy1)); List<CmisObject> policies = connection.getAppliedPolicies(policyId, true, null); assertEquals(1, policies.size()); assertEquals(policy1, policies.get(0).getObjectInfo().getId()); } /** * 2.2.4.5 createPolicy. * <p> * Create policy and apply ACL for it. If ACL is not supported at all or * can't be managed (if method * {@link RepositoryCapabilities#getCapabilityACL()} returns something other * then CapabilityACL.MANAGE) this test will be skipped. * </p> * * @throws Exception */ @Test public void testCreatePolicy_ApplyACL() throws Exception { if (!isPoliciesSupported || policyTypeControllableAcl == null || capabilities.getCapabilityACL() != CapabilityACL.MANAGE) { return; } List<AccessControlEntry> acl = createACL(principal, "cmis:all"); Map<String, Property<?>> properties = createPropertyMap(policyTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreatePolicy_ApplyACL"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } String policyId = connection.createPolicy(policyTypeControllableAcl.isFileable() ? testRootFolderId : null, properties, acl, null, null); List<AccessControlEntry> actualACL = connection.getACL(policyId, false); validateACL(actualACL); checkACL(acl, actualACL); } /** * 2.2.4.5 createPolicy. * <p> * If a violation are detected with the given cmis:name property value, the * repository MAY throw {@link NameConstraintViolationException} or chose a * name which does not conflict. Try create two policies with the same name * in one directory and expect to get * {@link NameConstraintViolationException} or at least second policy must * get different name then provide when it created. <i>If policy type is not * fileable this test will be skipped since name may not be important for not * hierarchical object.</i> * </p> * * @throws Exception */ @Test public void testCreatePolicy_NameConstraintViolationException() throws Exception { if (!isPoliciesSupported || !policyType.isFileable()) { return; } String name = "testCreatePolicy_NameConstraintViolationException"; Map<String, Property<?>> properties = createPropertyMap(policyType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add(name); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } connection.createPolicy(policyType.isFileable() ? testRootFolderId : null, properties, null, null, null); try { String policyId2 = connection.createPolicy(policyType.isFileable() ? testRootFolderId : null, properties, null, null, null);; // If exception was not thrown then check name, it must be different. CmisObject policy2 = connection.getObject(policyId2, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); String name2 = policy2.getObjectInfo().getName(); assertFalse("NameConstraintViolationException must be throw or different name chosen. ", name.equals(name2)); } catch (NameConstraintViolationException e) { } } /** * 2.2.4.5 createPolicy. * <p> * {@link ConstraintException} must be thrown if cmis:objectTypeId property * value is not an object type whose baseType is cmis:policy. * </p> * * @throws Exception */ @Test public void testCreatePolicy_ConstraintException_ObjectType() throws Exception { if (!isPoliciesSupported) { return; } Map<String, Property<?>> properties = createPropertyMap(policyType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreatePolicy_ConstraintException_ObjectType"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } IdProperty property = (IdProperty)properties.get(CmisConstants.OBJECT_TYPE_ID); property.getValues().clear(); // Set cmis:document instead cmis:policy property.getValues().add(documentType.getId()); try { connection.createPolicy(policyType.isFileable() ? testRootFolderId : null, properties, null, null, null); fail("ConstraintException must be thrown."); } catch (ConstraintException e) { } } /** * 2.2.4.5 createPolicy. * <p> * {@link ConstraintException} must be thrown if "controllablePolicy" * attribute of the object type definition specified by the cmis:objectTypeId * property value is set to <code>false</code> and at least one policy is * provided. * </p> * * @throws Exception */ @Test public void testCreatePolicy_ConstraintException_NotControllablePolicy() throws Exception { if (!isPoliciesSupported || policyTypeNotControllablePolicy == null) { return; } String policy1 = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); Map<String, Property<?>> properties = createPropertyMap(policyTypeNotControllablePolicy); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreatePolicy_ConstraintException_NotControllablePolicy"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } try { connection.createPolicy(policyTypeNotControllablePolicy.isFileable() ? testRootFolderId : null, properties, null, null, Arrays.asList(policy1)); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.5 createPolicy. * <p> * {@link ConstraintException} must be thrown if "controllableACL" attribute * of the object type definition specified by the cmis:objectTypeId property * value is set to <code>false</code> and at least one ACEs is provided. * </p> * * @throws Exception */ @Test public void testCreatePolicy_ConstraintException_NotControllableACL() throws Exception { if (!isPoliciesSupported || policyTypeNotControllableAcl == null) { return; } List<AccessControlEntry> acl = createACL(principal, "cmis:all"); Map<String, Property<?>> properties = createPropertyMap(policyTypeNotControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreatePolicy_ConstraintException_NotControllablePolicy"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } try { connection.createPolicy(policyTypeNotControllableAcl.isFileable() ? testRootFolderId : null, properties, acl, null, null); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.5 createPolicy. * <p> * {@link ConstraintException} must be thrown if at least one of the * permissions is used in an ACE provided which is not supported by the * repository. * </p> * * @throws Exception */ @Test public void testCreatePolicy_ConstraintException_ACENotSupported() throws Exception { if (!isPoliciesSupported || !capabilities.getCapabilityACL().equals(CapabilityACL.MANAGE) || policyTypeControllableAcl == null) { return; } List<AccessControlEntry> acl = createACL(principal, "cmis:unknown"); Map<String, Property<?>> properties = createPropertyMap(policyTypeControllableAcl); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testCreateRelationship_ConstraintException_ACENotSupported"); } StringProperty policyText = (StringProperty)properties.get(CmisConstants.POLICY_TEXT); if (policyText != null) { policyText.getValues().add(TEST_POLICY_TEXT); } try { connection.createPolicy(policyTypeControllableAcl.isFileable() ? testRootFolderId : null, properties, acl, null, null); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * * 2.2.4.6 getAllowableActions. * <p> * Gets the list of allowable actions for an object. * </p> * * @throws Exception */ @Test public void testGetAllowableActions_Simlpe() throws Exception { AllowableActions actions = connection.getAllowableActions(testRootFolderId); assertNotNull("Unable get allowable actions. ", actions); } /** * 2.2.4.7 getObject. * <p> * Get the specified information for the object without any additional info * about relationships, policies, renditions. * </p> * * @throws Exception */ @Test public void testGetObject() throws Exception { CmisObject o = connection.getObject(testRootFolderId, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); assertEquals(testRootFolderId, o.getObjectInfo().getId()); assertNull(o.getAllowableActions()); assertEquals(0, o.getPolicyIds().size()); assertEquals(0, o.getRelationship().size()); assertEquals(0, o.getRenditions().size()); } /** * 2.2.4.7 getObject. * <p> * Get object with id <code>testRootFolderId</code> and use filter for * properties. Result SHOULD contains only the properties specified in the * property filter if they exist on the object's type definition. * </p> * * @throws Exception */ @Test public void testGetObject_PropertyFiltered() throws Exception { CmisObject o = connection.getObject(testRootFolderId, false, IncludeRelationships.NONE, false, false, true, "cmis:name,cmis:path", RenditionFilter.NONE); BaseType baseType = o.getObjectInfo().getBaseType(); Set<String> queryNames = new HashSet<String>(); for (Map.Entry<String, Property<?>> e : o.getProperties().entrySet()) { queryNames.add(e.getValue().getQueryName()); } assertEquals(baseType, BaseType.FOLDER); // cmis:path and cmis:name must be in result. assertEquals(2, queryNames.size()); for (String q : queryNames) { assertTrue("Unexpected property " + q + " in result. ", q.equalsIgnoreCase("cmis:name") || q.equalsIgnoreCase("cmis:path")); } } /** * 2.2.4.7 getObject. *<p> * Get object with id <code>testRootFolderId</code> with additional * information about relationships. *</p> * * @throws Exception */ @Test public void testGetObject_IncludeRelationships() throws Exception { if (!isRelationshipsSupported) { return; } String relationship = createRelationship(relationshipType.getId(), generateName(relationshipType, null), testRootFolderId, testRootFolderId, null, null, null); CmisObject o = connection.getObject(testRootFolderId, false, IncludeRelationships.BOTH, false, false, true, null, RenditionFilter.NONE); assertTrue(o.getRelationship().size() >= 1); Set<String> r = new HashSet<String>(); for (CmisObject rel : o.getRelationship()) { r.add(rel.getObjectInfo().getId()); } assertTrue("Expected relationship " + relationship + " not found in result. ", r.contains(relationship)); } /** * 2.2.4.7 getObject. *<p> * Get object with id <code>testRootFolderId</code> with additional * information about policies. *</p> * * @throws Exception */ @Test public void testGetObject_IncludePolicy() throws Exception { if (!isPoliciesSupported || !folderType.isControllablePolicy()) { return; } String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName( relationshipType, null), TEST_POLICY_TEXT, null, null, null); connection.applyPolicy(policy, testRootFolderId); CmisObject o = connection.getObject(testRootFolderId, false, IncludeRelationships.NONE, true, false, true, null, RenditionFilter.NONE); assertTrue(o.getPolicyIds().size() >= 1); assertTrue("Expected policy " + policy + " not found in result. ", o.getPolicyIds().contains(policy)); } /** * 2.2.4.7 getObject. *<p> * Get object with id with additional information about ACL. *</p> * * @throws Exception */ @Test public void testGetObject_IncludeACL() throws Exception { if (capabilities.getCapabilityACL() != CapabilityACL.MANAGE || documentTypeControllableAcl == null) { return; } List<AccessControlEntry> acl = createACL(principal, "cmis:all"); String documentId = createDocument(testRootFolderId, documentTypeControllableAcl.getId(), generateName( documentTypeControllableAcl, null), null, acl, null, null, null); CmisObject o = connection.getObject(documentId, false, IncludeRelationships.NONE, false, true, true, null, RenditionFilter.NONE); List<AccessControlEntry> actualACL = o.getACL(); validateACL(actualACL); checkACL(acl, actualACL); } /** * 2.2.4.7 getObject. *<p> * Get object with id with additional information about allowable actions. *</p> * * @throws Exception */ @Test public void testGetObject_IncludeAllowableActions() throws Exception { String documentId = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); CmisObject o = connection.getObject(documentId, true, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); assertNotNull(o.getAllowableActions()); } /** * 2.2.4.9 getObjectByPath. * <p> * Get the specified information for the object without any additional info * about relationships, policies, renditions. * </p> * * @throws Exception */ @Test public void testGetObjectByPath() throws Exception { CmisObject o = connection.getObjectByPath("/object_testroot", false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); assertEquals(testRootFolderId, o.getObjectInfo().getId()); assertNull(o.getAllowableActions()); assertEquals(0, o.getPolicyIds().size()); assertEquals(0, o.getRelationship().size()); assertEquals(0, o.getRenditions().size()); } /** * 2.2.4.7 getObjectByPath. * <p> * Get object by path and use filter for properties. Result SHOULD contains * only the properties specified in the property filter if they exist on the * object's type definition. * </p> * * @throws Exception */ @Test public void testGetObjectByPath_PropertyFiltered() throws Exception { CmisObject o = connection.getObjectByPath("/object_testroot", false, IncludeRelationships.NONE, false, false, true, "cmis:name,cmis:path", RenditionFilter.NONE); BaseType baseType = o.getObjectInfo().getBaseType(); Set<String> queryNames = new HashSet<String>(); for (Map.Entry<String, Property<?>> e : o.getProperties().entrySet()) { queryNames.add(e.getValue().getQueryName()); } assertEquals(baseType, BaseType.FOLDER); // cmis:path and cmis:name must be in result. assertEquals(2, queryNames.size()); for (String q : queryNames) { assertTrue("Unexpected property " + q + " in result. ", q.equalsIgnoreCase("cmis:name") || q.equalsIgnoreCase("cmis:path")); } } /** * 2.2.4.7 getObjectByPath. *<p> * Get object by path with additional information about relationships. *</p> * * @throws Exception */ @Test public void testGetObjectByPath_IncludeRelationships() throws Exception { if (!isRelationshipsSupported) { return; } String relationship = createRelationship(relationshipType.getId(), generateName(relationshipType, null), testRootFolderId, testRootFolderId, null, null, null); CmisObject o = connection.getObjectByPath("/object_testroot", false, IncludeRelationships.BOTH, false, false, true, null, RenditionFilter.NONE); assertTrue(o.getRelationship().size() >= 1); Set<String> r = new HashSet<String>(); for (CmisObject rel : o.getRelationship()) { r.add(rel.getObjectInfo().getId()); } assertTrue("Expected relationship " + relationship + " not found in result. ", r.contains(relationship)); } /** * 2.2.4.7 getObjectByPath. *<p> * Get object by path with additional information about policies. *</p> * * @throws Exception */ @Test public void testGetObjectByPath_IncludePolicy() throws Exception { if (!isPoliciesSupported || !folderType.isControllablePolicy()) { return; } String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName( relationshipType, null), TEST_POLICY_TEXT, null, null, null); connection.applyPolicy(policy, testRootFolderId); CmisObject o = connection.getObjectByPath("/object_testroot", false, IncludeRelationships.NONE, true, false, true, null, RenditionFilter.NONE); assertTrue(o.getPolicyIds().size() >= 1); assertTrue("Expected policy " + policy + " not found in result. ", o.getPolicyIds().contains(policy)); } /** * 2.2.4.7 getObjectByPath. *<p> * Get object by path with additional information about allowable actions. *</p> * * @throws Exception */ @Test public void testGetObjectByPath_IncludeAllowableActions() throws Exception { CmisObject o = connection.getObjectByPath("/object_testroot", true, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); assertNotNull(o.getAllowableActions()); } /** * 2.2.4.10 getContentStream. * * @throws Exception */ @Test public void testGetContentStream() throws Exception { String template = "TEST_GET_CONTENT"; ContentStream content = null; if (documentType.getContentStreamAllowed() != ContentStreamAllowed.NOT_ALLOWED) { byte[] before = template.getBytes(); content = new BaseContentStream(before, null, new MimeType("text", "plain")); } Map<String, Property<?>> properties = createPropertyMap(documentType); StringProperty nameProperty = (StringProperty)properties.get(CmisConstants.NAME); if (nameProperty != null) { nameProperty.getValues().add("testGetContentStream.txt"); } String document = connection.createDocument(testRootFolderId, properties, content, null, null, null, documentType .isVersionable() ? VersioningState.MAJOR : VersioningState.NONE); if (content != null) { if (content != null) { ContentStream content1 = connection.getContentStream(document, null); assertEquals(content.getMediaType(), content1.getMediaType()); byte[] buf = new byte[1024]; int read = content1.getStream().read(buf); assertEquals(template, new String(buf, 0, read)); } else { // Content is not allowed, ConstraintException must be thrown. try { connection.getContentStream(document, null); fail("ConstraintException must be throw, content stream not allowed. "); } catch (ConstraintException e) { } } } } /** * 2.2.4.17 deleteContentStream. * * @throws Exception */ @Test public void testDeleteContentStream() throws Exception { if (documentType.getContentStreamAllowed() != ContentStreamAllowed.ALLOWED) { return; } String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), TEST_CONTENT_STREAM, null, null, null, null); Map<String, Property<?>> documentProperties = connection.getProperties(document, true, CmisConstants.CHANGE_TOKEN).getProperties(); StringProperty changeTokenProperty = (StringProperty)documentProperties.get(CmisConstants.CHANGE_TOKEN); ChangeTokenHolder holder = new ChangeTokenHolder(); if (changeTokenProperty != null && changeTokenProperty.getValues().size() > 0) { holder.setValue(changeTokenProperty.getValues().get(0)); } connection.deleteContentStream(document, holder); try { connection.getContentStream(document, null); fail("ConstraintException must be thrown since document has not content stream. "); } catch (ConstraintException e) { } } /** * 2.2.4.13 moveObject. * <p> * Move object from one folder to other. * </p> * * @throws Exception */ @Test public void testMove() throws Exception { String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String folder = createFolder(testRootFolderId, folderType.getId(), generateName(folderType, null), null, null, null); document = connection.moveObject(document, folder, testRootFolderId); List<ObjectParent> parents = connection.getObjectParents(document, false, IncludeRelationships.NONE, false, true, null, RenditionFilter.NONE); assertEquals(folder, parents.get(0).getObject().getObjectInfo().getId()); } /** * 2.2.4.13 moveObject. * <p> * {@link InvalidArgumentException} must be thrown if sourceFolderId is * missing or the sourceFolderId doesn't match the specified object's. * </p> * * @throws Exception */ @Test public void testMove_InvalidArgumentException_Missing() throws Exception { String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String folder = createFolder(testRootFolderId, folderType.getId(), generateName(folderType, null), null, null, null); try { connection.moveObject(document, folder, null); fail("InvalidArgumentException must be thrown. "); } catch (InvalidArgumentException e) { } } /** * 2.2.4.13 moveObject. * <p> * {@link InvalidArgumentException} must be thrown if sourceFolderId is * missing or the sourceFolderId doesn't match the specified object's. * </p> * * @throws Exception */ @Test public void testMove_InvalidArgumentException_NotMatch() throws Exception { String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); String folder = createFolder(testRootFolderId, folderType.getId(), generateName(folderType, null), null, null, null); try { connection.moveObject(document, folder, folder); fail("InvalidArgumentException must be thrown. "); } catch (InvalidArgumentException e) { } } /** * 2.2.4.14 deleteObject. * * @throws Exception */ @Test public void testDeleteObject() throws Exception { String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, null), null, null, null, null, null); connection.deleteObject(document, true); try { connection.getObject(document, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); fail("Object must be removed. "); } catch (ObjectNotFoundException ex) { } } /** * 2.2.4.14 deleteObject. * <p> * {@link ConstraintException} must be thrown if the method is invoked on a * folder object that contains one or more objects. * </p> * * @throws Exception */ @Test public void testDeleteObject_ConstraintException() throws Exception { String folder = createFolder(testRootFolderId, folderType.getId(), generateName(documentType, null), null, null, null); createDocument(folder, documentType.getId(), generateName(documentType, null), null, null, null, null, null); try { connection.deleteObject(folder, true); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.4.15 deleteTree. * * @throws Exception */ @Test public void testDeleteTree() throws Exception { String folder = createFolder(testRootFolderId, folderType.getId(), generateName(documentType, null), null, null, null); String document = createDocument(folder, documentType.getId(), generateName(documentType, null), null, null, null, null, null); connection.deleteTree(folder, true, UnfileObject.DELETE, false); try { connection.getObject(document, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); fail("Document must be removed. "); } catch (ObjectNotFoundException e) { } try { connection.getObject(folder, false, IncludeRelationships.NONE, false, false, true, null, RenditionFilter.NONE); fail("Folder must be removed. "); } catch (ObjectNotFoundException e) { } } /** * 2.2.4.16 setContentStream. * * @throws Exception */ @Test public void testSetContentStream() throws Exception { if (documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED) { return; } String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, "txt"), null, null, null, null, null); byte[] newContent = "UPDATED_CONTENT".getBytes(); document = connection.setContentStream(document, new BaseContentStream(newContent, "", new MimeType("text", "plain")), new ChangeTokenHolder(), true); ContentStream content = connection.getContentStream(document, null); assertEquals(content.getMediaType(), content.getMediaType()); byte[] buf = new byte[1024]; int read = content.getStream().read(buf); byte[] res = new byte[read]; System.arraycopy(buf, 0, res, 0, read); assertArrayEquals(newContent, res); } /** * 2.2.4.16 setContentStream. * <p> *{@link ContentAlreadyExistsException} must be thrown if object has content * and overwriteFlag is <code>false</code>. * </p> * * @throws Exception */ @Test public void testSetContentStream_ContentAlreadyExistsException() throws Exception { if (documentType.getContentStreamAllowed() == ContentStreamAllowed.NOT_ALLOWED) { return; } String document = createDocument(testRootFolderId, documentType.getId(), generateName(documentType, "txt"), TEST_CONTENT_STREAM, null, null, null, null); byte[] newContent = "UPDATED_CONTENT".getBytes(); try { connection.setContentStream(document, new BaseContentStream(newContent, "", new MimeType("text", "plain")), new ChangeTokenHolder(), false); fail("ContentAlreadyExistsException must be thrown. "); } catch (ContentAlreadyExistsException e) { } } /** * 2.2.4.16 setContentStream. * <p> * {@link StreamNotSupportedException} must be thrown if object * "contentStreamAllowed" attribute of the object type definition specified * by the cmis:objectTypeId property value of the given document is set to * NOT_ALLOWED. * </p> * * @throws Exception */ @Test public void testSetContentStream_StreamNotSupportedException() throws Exception { if (documentTypeStreamNotSupported == null) { return; } String document = createDocument(testRootFolderId, documentTypeStreamNotSupported.getId(), generateName( documentTypeStreamNotSupported, "txt"), null, null, null, null, null); byte[] newContent = "_CONTENT_".getBytes(); try { connection.setContentStream(document, new BaseContentStream(newContent, "", new MimeType("text", "plain")), new ChangeTokenHolder(), false); fail("StreamNotSupportedException must be thrown. "); } catch (StreamNotSupportedException e) { } } }