You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2012/09/18 22:22:51 UTC

svn commit: r1387342 - in /chemistry/opencmis/trunk/chemistry-opencmis-server: chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/ chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmi...

Author: jens
Date: Tue Sep 18 20:22:50 2012
New Revision: 1387342

URL: http://svn.apache.org/viewvc?rev=1387342&view=rev
Log:
InMemory: verify if content is allowed/required on document type on create

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/TypeValidator.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java?rev=1387342&r1=1387341&r2=1387342&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java Tue Sep 18 20:22:50 2012
@@ -549,6 +549,12 @@ public class InMemoryObjectServiceImpl e
                     + " does not refer to a document, but only documents can have content");
         }
 
+        // validate content allowed
+        TypeDefinition typeDef = getTypeDefinition(repositoryId, so);
+        if (!(typeDef instanceof DocumentTypeDefinition))
+            throw new CmisInvalidArgumentException("Object does not refer to a document, can't set content");
+        TypeValidator.validateContentAllowed((DocumentTypeDefinition) typeDef , null != contentStream);
+
         if (so instanceof Document) {
             content = ((Document) so);
         } else if (so instanceof DocumentVersion) {
@@ -719,7 +725,7 @@ public class InMemoryObjectServiceImpl e
 
         // validate ACL
         TypeValidator.validateAcl(typeDef, addACEs, removeACEs);
-
+        
         Folder folder = null;
         if (null != folderId) {
             StoredObject so = objectStore.getObjectById(folderId);
@@ -748,6 +754,9 @@ public class InMemoryObjectServiceImpl e
             throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME + " Name is: " + name);
         }
 
+        // validate content allowed
+        TypeValidator.validateContentAllowed((DocumentTypeDefinition) typeDef, null != contentStream);
+
         TypeValidator.validateVersionStateForCreate((DocumentTypeDefinition) typeDef, versioningState);
 
         // set properties that are not set but have a default:

Modified: 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/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java?rev=1387342&r1=1387341&r2=1387342&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java Tue Sep 18 20:22:50 2012
@@ -46,6 +46,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
 import org.apache.chemistry.opencmis.commons.enums.Updatability;
@@ -86,6 +87,8 @@ public class ObjectServiceTest extends A
     public 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_CUSTOM_NO_CONTENT_TYPE_ID = "NoContentType";
+    private static final String TEST_CUSTOM_MUST_CONTENT_TYPE_ID = "MustHaveContentType";
     private static final String TEST_DOCUMENT_MY_STRING_PROP_ID = "MyCustomDocumentStringProp";
     private static final String TEST_DOCUMENT_MY_MULTI_STRING_PROP_ID = "MyCustomDocumentMultiStringProp";
     private static final String TEST_DOCUMENT_MY_INT_PROP_ID = "MyCustomDocumentIntProp";
@@ -95,7 +98,6 @@ public class ObjectServiceTest extends A
     private static final String TEST_FOLDER_MY_INT_PROP_ID_MANDATORY_DEFAULT = "MyCustomDocumentIntPropMandatoryDefault";
     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();
@@ -910,6 +912,67 @@ public class ObjectServiceTest extends A
                 fail("getObject() failed with exception: " + e);
             }
     }
+    
+    @Test
+    public void testNoContentAllowed() {
+        log.info("starting testNoContentAllowed() ...");
+        String id = createDocument("NoContentAllowedDoc1", fRootFolderId, TEST_CUSTOM_NO_CONTENT_TYPE_ID, false);
+        assertNotNull (id);
+
+        try {
+            id = createDocumentNoCatch("NoContentAllowedDoc2", fRootFolderId, TEST_CUSTOM_NO_CONTENT_TYPE_ID, VersioningState.NONE, true);
+            fail("Creating  document with content and type allows no content should fail.");
+        } catch (Exception e) {
+            assertTrue(e instanceof CmisConstraintException);
+            log.info("Creating  document with content for no-content type failed as expected.");
+        }
+        log.info("... testNoContentAllowed finished.");
+    }
+
+    @Test
+    public void testMustHaveContent() {
+        log.info("starting testMustHaveContent() ...");
+        String id = createDocument("MustHaveContentAllowedDoc1", fRootFolderId, TEST_CUSTOM_MUST_CONTENT_TYPE_ID, true);
+        assertNotNull (id);
+
+        try {
+            id = createDocumentNoCatch("MustHaveContentAllowedDoc2", fRootFolderId, TEST_CUSTOM_MUST_CONTENT_TYPE_ID, VersioningState.NONE, false);
+            fail("Creating document without content and type requires content should fail.");
+        } catch (Exception e) {
+            assertTrue(e instanceof CmisConstraintException);
+            log.info("Creating document with content for must-have-content type failed as expected.");
+        }
+        log.info("... testMustHaveContent finished.");
+    }
+    
+    @Test
+    public void testMaxContentSize() {
+        log.info("starting testMaxContentSize() ...");
+        try {
+            createContent(MAX_SIZE + 1, MAX_SIZE);
+            fail("createContent with exceeded content size should fail.");
+        } catch (CmisInvalidArgumentException e) {
+            log.debug("createDocument with exceeded failed as excpected.");
+        } catch (Exception e1) {
+            log.debug("createDocument with exceeded failed with wrong exception (expected CmisInvalidArgumentException, got "
+                    + e1.getClass().getName() + ").");
+        }
+
+        try {
+            ContentStream contentStream = createContent(MAX_SIZE + 1);
+            Properties props = createDocumentProperties("TestMaxContentSize", DOCUMENT_TYPE_ID);
+            fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, contentStream, VersioningState.NONE, null,
+                    null, null, null);
+            fail("createDocument with exceeded content size should fail.");
+        } catch (CmisInvalidArgumentException e) {
+            log.debug("createDocument with exceeded failed as excpected.");
+        } catch (Exception e1) {
+            log.debug("createDocument with exceeded failed with wrong exception (expected CmisInvalidArgumentException, got "
+                    + e1.getClass().getName() + ").");
+        }
+    }
+
+
 
     private static void verifyAllowableActionsDocument(Set<Action> actions, boolean isVersioned, boolean hasContent) {
         assertTrue(actions.contains(Action.CAN_DELETE_OBJECT));
@@ -1167,10 +1230,15 @@ public class ObjectServiceTest extends A
             cmisFolderType.addCustomPropertyDefinitions(propertyDefinitions);
 
             InMemoryDocumentTypeDefinition customDocType = createCustomTypeWithStringIntProperty();
+            InMemoryDocumentTypeDefinition noContentType = createCustomTypeNoContent();
+            InMemoryDocumentTypeDefinition mustHaveContentType = createCustomTypeMustHaveContent();
+
             // add type to types collection
             typesList.add(cmisDocumentType);
             typesList.add(cmisFolderType);
             typesList.add(customDocType);
+            typesList.add(noContentType);
+            typesList.add(mustHaveContentType);
             typesList.add(createCustomInheritedType(customDocType));
             typesList.add(createDocumentTypeWithDefault());
             typesList.add(createFolderTypeWithDefault());
@@ -1246,6 +1314,24 @@ public class ObjectServiceTest extends A
             return cmisDocumentType;
         }
 
+        private static InMemoryDocumentTypeDefinition createCustomTypeNoContent() {
+            InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(
+                    TEST_CUSTOM_NO_CONTENT_TYPE_ID, "No Content Document Type", InMemoryDocumentTypeDefinition
+                            .getRootDocumentType());
+            Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+            cmisDocumentType.addCustomPropertyDefinitions(propertyDefinitions);
+            cmisDocumentType.setContentStreamAllowed(ContentStreamAllowed.NOTALLOWED);
+            return cmisDocumentType;
+        }
+        
+        private static InMemoryDocumentTypeDefinition createCustomTypeMustHaveContent() {
+            InMemoryDocumentTypeDefinition cmisDocumentType = new InMemoryDocumentTypeDefinition(
+                    TEST_CUSTOM_MUST_CONTENT_TYPE_ID, "Must Have Content Document Type", InMemoryDocumentTypeDefinition
+                            .getRootDocumentType());
+            cmisDocumentType.setContentStreamAllowed(ContentStreamAllowed.REQUIRED);
+            return cmisDocumentType;
+        }
+        
         private static InMemoryFolderTypeDefinition createFolderTypeWithDefault() {
             InMemoryFolderTypeDefinition cmisFolderType = new InMemoryFolderTypeDefinition(
                     TEST_FOLDER_TYPE_WITH_DEFAULTS_ID, "Folder Type With default values", InMemoryFolderTypeDefinition.
@@ -1278,31 +1364,4 @@ public class ObjectServiceTest extends A
         }
     }
 
-    @Test
-    public void testMaxContentSize() {
-        log.info("starting testMaxContentSize() ...");
-        try {
-            createContent(MAX_SIZE + 1, MAX_SIZE);
-            fail("createContent with exceeded content size should fail.");
-        } catch (CmisInvalidArgumentException e) {
-            log.debug("createDocument with exceeded failed as excpected.");
-        } catch (Exception e1) {
-            log.debug("createDocument with exceeded failed with wrong exception (expected CmisInvalidArgumentException, got "
-                    + e1.getClass().getName() + ").");
-        }
-
-        try {
-            ContentStream contentStream = createContent(MAX_SIZE + 1);
-            Properties props = createDocumentProperties("TestMaxContentSize", DOCUMENT_TYPE_ID);
-            fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, contentStream, VersioningState.NONE, null,
-                    null, null, null);
-            fail("createDocument with exceeded content size should fail.");
-        } catch (CmisInvalidArgumentException e) {
-            log.debug("createDocument with exceeded failed as excpected.");
-        } catch (Exception e1) {
-            log.debug("createDocument with exceeded failed with wrong exception (expected CmisInvalidArgumentException, got "
-                    + e1.getClass().getName() + ").");
-        }
-    }
-
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/TypeValidator.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/TypeValidator.java?rev=1387342&r1=1387341&r2=1387342&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/TypeValidator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/TypeValidator.java Tue Sep 18 20:22:50 2012
@@ -39,6 +39,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
 import org.apache.chemistry.opencmis.commons.enums.Cardinality;
+import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
 import org.apache.chemistry.opencmis.commons.enums.VersioningState;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
@@ -325,6 +326,15 @@ public class TypeValidator {
     		throw new CmisConstraintException("acl set for type: " + typeDef.getDisplayName() + " that is not controllableACL");
     	}
     }
+    
+    public static void validateContentAllowed(DocumentTypeDefinition typeDef, boolean hasContent) {
+        ContentStreamAllowed contentAllowed = typeDef.getContentStreamAllowed();
+        if (ContentStreamAllowed.REQUIRED == contentAllowed && !hasContent) {
+            throw new CmisConstraintException("Type " + typeDef.getId() + " requires content but document has no content.");
+        } else if (ContentStreamAllowed.NOTALLOWED == contentAllowed && hasContent) {
+            throw new CmisConstraintException("Type " + typeDef.getId() + " does not allow content but document has content.");
+        }
+    }
 
     private static List<String> getMandatoryPropDefs(Map<String, PropertyDefinition<?>> propDefs) {
         List<String> res = new ArrayList<String>();