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