You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2013/03/19 13:57:01 UTC

svn commit: r1458261 - in /chemistry/opencmis/trunk: chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/ chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemi...

Author: fmui
Date: Tue Mar 19 12:57:01 2013
New Revision: 1458261

URL: http://svn.apache.org/r1458261
Log:
TCK: extended type creation tests

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/XMLConverter.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/types/CreateAndDeleteTypeTest.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/XMLConverter.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/XMLConverter.java?rev=1458261&r1=1458260&r2=1458261&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/XMLConverter.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/XMLConverter.java Tue Mar 19 12:57:01 2013
@@ -477,6 +477,10 @@ public class XMLConverter {
             return;
         }
 
+        if (source.getPropertyType() == null) {
+            throw new CmisRuntimeException("Property type for property definition '" + source.getId() + "' is not set!");
+        }
+
         switch (source.getPropertyType()) {
         case STRING:
             writer.writeStartElement(PREFIX_CMIS, TAG_TYPE_PROP_DEF_STRING, NAMESPACE_CMIS);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java?rev=1458261&r1=1458260&r2=1458261&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/impl/AbstractSessionTest.java Tue Mar 19 12:57:01 2013
@@ -64,6 +64,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.data.Acl;
 import org.apache.chemistry.opencmis.commons.data.AllowableActions;
 import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.data.NewTypeSettableAttributes;
 import org.apache.chemistry.opencmis.commons.data.ObjectData;
 import org.apache.chemistry.opencmis.commons.data.RepositoryCapabilities;
 import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
@@ -585,6 +586,80 @@ public abstract class AbstractSessionTes
         }
     }
 
+    // --- type helpers ---
+
+    /**
+     * Creates a new type.
+     */
+    protected ObjectType createType(Session session, TypeDefinition typeDef) {
+
+        NewTypeSettableAttributes settableAttributes = session.getRepositoryInfo().getCapabilities()
+                .getNewTypeSettableAttributes();
+        if (settableAttributes == null) {
+            addResult(createResult(WARNING, "Repository Info does not indicate, which type attributes can be set!"));
+        } else {
+            // TODO: add more tests
+        }
+
+        ObjectType newType = null;
+        try {
+            newType = session.createType(typeDef);
+            addResult(createInfoResult("Created type '" + typeDef.getId()
+                    + "'. Repository assigned the following type id: " + newType.getId()));
+        } catch (CmisBaseException e) {
+            addResult(createResult(FAILURE, "Creating type '" + typeDef.getId() + "' failed: " + e.getMessage(), e,
+                    false));
+            return null;
+        }
+
+        addResult(checkTypeDefinition(session, newType, "Newly created type spec compliance."));
+
+        if (newType.getTypeMutability() == null) {
+            addResult(createResult(FAILURE,
+                    "Newly created type does not provide type mutability data! Id: " + newType.getId()));
+        }
+
+        return newType;
+    }
+
+    /**
+     * Deletes a type.
+     */
+    protected void deleteType(Session session, String typeId) {
+        ObjectType type = session.getTypeDefinition(typeId);
+
+        if (type == null) {
+            addResult(createResult(FAILURE, "Type does not exist and therefore cannot be deleted! Id: " + typeId));
+            return;
+        }
+
+        // check if type can be deleted
+        if (type.getTypeMutability() == null) {
+            addResult(createResult(FAILURE, "Type does not provide type mutability data! Id: " + typeId));
+        } else {
+            if (!Boolean.TRUE.equals(type.getTypeMutability().canDelete())) {
+                addResult(createResult(WARNING, "Type indicates that it cannot be deleted. Trying it anyway. Id: "
+                        + typeId));
+            }
+        }
+
+        // delete it
+        try {
+            session.deleteType(typeId);
+        } catch (CmisBaseException e) {
+            addResult(createResult(FAILURE, "Deleting type '" + typeId + "' failed: " + e.getMessage(), e, false));
+            return;
+        }
+
+        // check if the type still exists
+        try {
+            session.getTypeDefinition(typeId);
+            addResult(createResult(FAILURE, "Type should not exist anymore but it is still there! Id: " + typeId, true));
+        } catch (CmisObjectNotFoundException e) {
+            // expected result
+        }
+    }
+
     // --- test folder methods ---
 
     /**

Modified: chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/types/CreateAndDeleteTypeTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/types/CreateAndDeleteTypeTest.java?rev=1458261&r1=1458260&r2=1458261&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/types/CreateAndDeleteTypeTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-tck/src/main/java/org/apache/chemistry/opencmis/tck/tests/types/CreateAndDeleteTypeTest.java Tue Mar 19 12:57:01 2013
@@ -20,17 +20,31 @@ package org.apache.chemistry.opencmis.tc
 
 import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.FAILURE;
 import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.SKIPPED;
-import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.WARNING;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.chemistry.opencmis.client.api.ObjectType;
 import org.apache.chemistry.opencmis.client.api.Session;
+import org.apache.chemistry.opencmis.commons.data.CreatablePropertyTypes;
+import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
+import org.apache.chemistry.opencmis.commons.enums.Cardinality;
 import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
 import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException;
+import org.apache.chemistry.opencmis.commons.enums.PropertyType;
+import org.apache.chemistry.opencmis.commons.enums.Updatability;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.DocumentTypeDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyBooleanDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDateTimeDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyHtmlDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIdDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyUriDefinitionImpl;
 import org.apache.chemistry.opencmis.tck.CmisTestResult;
 import org.apache.chemistry.opencmis.tck.impl.AbstractSessionTest;
 
@@ -51,69 +65,168 @@ public class CreateAndDeleteTypeTest ext
 
         ObjectType parentType = session.getTypeDefinition(getDocumentTestTypeId());
         if (parentType.getTypeMutability() == null || !Boolean.TRUE.equals(parentType.getTypeMutability().canCreate())) {
-            addResult(createResult(SKIPPED, "Test type doesn't allow creating a sub-type. Test skipped!"));
+            addResult(createResult(SKIPPED, "Test document type doesn't allow creating a sub-type. Test skipped!"));
             return;
         }
 
+        createTypeWithoutProperties(session, parentType);
+        createTypeWithProperties(session, parentType);
+    }
+
+    private void createTypeWithoutProperties(Session session, ObjectType parentType) {
         CmisTestResult failure = null;
 
         // define the type
-        DocumentTypeDefinitionImpl newTypeDef = new DocumentTypeDefinitionImpl();
-
-        newTypeDef.setId("tck:testid");
-        newTypeDef.setBaseTypeId(parentType.getBaseTypeId());
-        newTypeDef.setParentTypeId(parentType.getId());
-        newTypeDef.setLocalName("tck:testlocal");
-        newTypeDef.setLocalNamespace("tck:testlocalnamespace");
-        newTypeDef.setDisplayName("TCK Document Type");
-        newTypeDef.setDescription("This is the TCK document type");
-        newTypeDef.setQueryName("tck:testqueryname");
-        newTypeDef.setIsQueryable(false);
-        newTypeDef.setIsFulltextIndexed(false);
-        newTypeDef.setIsIncludedInSupertypeQuery(true);
-        newTypeDef.setIsControllableAcl(false);
-        newTypeDef.setIsControllablePolicy(false);
-        newTypeDef.setIsCreatable(true);
-        newTypeDef.setIsFileable(true);
-        newTypeDef.setIsVersionable(false);
-        newTypeDef.setContentStreamAllowed(ContentStreamAllowed.ALLOWED);
+        DocumentTypeDefinitionImpl newTypeDef = createDocumentTypeDefinition("tck:testid_without_properties",
+                parentType);
 
         // create the type
-        ObjectType newType = null;
-        try {
-            newType = session.createType(newTypeDef);
-        } catch (CmisBaseException e) {
-            addResult(createResult(FAILURE, "Creating type '" + newTypeDef.getId() + "' failed: " + e.getMessage()));
+        ObjectType newType = createType(session, newTypeDef);
+        if (newType == null) {
             return;
         }
 
-        // check type
-        addResult(checkTypeDefinition(session, newType, "Newly created type spec compliance."));
-
         // get the type
         ObjectType newType2 = null;
         try {
             newType2 = session.getTypeDefinition(newType.getId());
+
+            // assert type definitions
+            failure = createResult(FAILURE,
+                    "The type definition returned by createType() doesn't match the type definition returned by getTypeDefinition()!");
+            addResult(assertEquals(newType, newType2, null, failure));
         } catch (CmisObjectNotFoundException e) {
-            addResult(createResult(FAILURE, "Newly created type '" + newType.getId() + "' can not be fetched."));
+            addResult(createResult(FAILURE, "Newly created type can not be fetched. Id: " + newType.getId(), e, false));
         }
 
-        // assert type definitions
-        failure = createResult(FAILURE,
-                "The type definition returned by createType() doesn't match the type definition returned by getTypeDefinition()!");
-        addResult(assertEquals(newType, newType2, null, failure));
+        // delete the type
+        deleteType(session, newType.getId());
+    }
+
+    private void createTypeWithProperties(Session session, ObjectType parentType) {
+        CmisTestResult failure = null;
 
-        // check if type can be deleted
-        if (newType.getTypeMutability() == null || !Boolean.TRUE.equals(newType.getTypeMutability().canDelete())) {
-            addResult(createResult(WARNING, "Newly created type indicates that it cannot be deleted. Trying it anyway."));
+        CreatablePropertyTypes cpt = session.getRepositoryInfo().getCapabilities().getCreatablePropertyTypes();
+        if (cpt == null || cpt.canCreate() == null || cpt.canCreate().isEmpty()) {
+            addResult(createResult(FAILURE, "Repository Info does not indicate, which property types can be created!"));
+            return;
         }
 
-        // delete the type
+        // define the type
+        DocumentTypeDefinitionImpl newTypeDef = createDocumentTypeDefinition("tck:testid_with_properties", parentType);
+
+        // add a property for each creatable property type
+        for (PropertyType propType : PropertyType.values()) {
+            if (!cpt.canCreate().contains(propType)) {
+                continue;
+            }
+
+            newTypeDef.addPropertyDefinition(createPropertyDefinition(propType));
+        }
+
+        // create the type
+        ObjectType newType = createType(session, newTypeDef);
+        if (newType == null) {
+            return;
+        }
+
+        // get the type
+        ObjectType newType2 = null;
         try {
-            session.deleteType(newType.getId());
-        } catch (CmisBaseException e) {
-            addResult(createResult(FAILURE, "Deleting type '" + newType.getId() + "' failed: " + e.getMessage()));
+            newType2 = session.getTypeDefinition(newType.getId());
+
+            // assert type definitions
+            failure = createResult(FAILURE,
+                    "The type definition returned by createType() doesn't match the type definition returned by getTypeDefinition()!");
+            addResult(assertEquals(newType, newType2, null, failure));
+        } catch (CmisObjectNotFoundException e) {
+            addResult(createResult(FAILURE, "Newly created type can not be fetched. Id: " + newType.getId(), e, false));
         }
+
+        // check properties
+        List<PropertyDefinition<?>> newPropDefs = new ArrayList<PropertyDefinition<?>>();
+        for (Map.Entry<String, PropertyDefinition<?>> propDef : newType.getPropertyDefinitions().entrySet()) {
+            if (Boolean.FALSE.equals(propDef.getValue().isInherited())) {
+                newPropDefs.add(propDef.getValue());
+            }
+        }
+
+        failure = createResult(FAILURE,
+                "The number of defined properties and the number of non-inherited properties don't match!");
+        addResult(assertEquals(newTypeDef.getPropertyDefinitions().size(), newPropDefs.size(), null, failure));
+
+        // delete the type
+        deleteType(session, newType.getId());
+    }
+
+    private DocumentTypeDefinitionImpl createDocumentTypeDefinition(String typeId, ObjectType parentType) {
+        DocumentTypeDefinitionImpl result = new DocumentTypeDefinitionImpl();
+
+        result.setId(typeId);
+        result.setBaseTypeId(parentType.getBaseTypeId());
+        result.setParentTypeId(parentType.getId());
+        result.setLocalName("tck:testlocal");
+        result.setLocalNamespace("tck:testlocalnamespace");
+        result.setDisplayName("TCK Document Type");
+        result.setDescription("This is the TCK document type");
+        result.setQueryName("tck:testqueryname");
+        result.setIsQueryable(false);
+        result.setIsFulltextIndexed(false);
+        result.setIsIncludedInSupertypeQuery(true);
+        result.setIsControllableAcl(false);
+        result.setIsControllablePolicy(false);
+        result.setIsCreatable(true);
+        result.setIsFileable(true);
+        result.setIsVersionable(false);
+        result.setContentStreamAllowed(ContentStreamAllowed.ALLOWED);
+
+        return result;
     }
 
-}
+    private AbstractPropertyDefinition<?> createPropertyDefinition(PropertyType propertyType) {
+        AbstractPropertyDefinition<?> result = null;
+
+        switch (propertyType) {
+        case BOOLEAN:
+            result = new PropertyBooleanDefinitionImpl();
+            break;
+        case ID:
+            result = new PropertyIdDefinitionImpl();
+            break;
+        case INTEGER:
+            result = new PropertyIntegerDefinitionImpl();
+            break;
+        case DATETIME:
+            result = new PropertyDateTimeDefinitionImpl();
+            break;
+        case DECIMAL:
+            result = new PropertyDecimalDefinitionImpl();
+            break;
+        case HTML:
+            result = new PropertyHtmlDefinitionImpl();
+            break;
+        case URI:
+            result = new PropertyUriDefinitionImpl();
+            break;
+        default:
+            result = new PropertyStringDefinitionImpl();
+        }
+
+        result.setPropertyType(propertyType);
+        result.setId("tck:" + propertyType.value());
+        result.setLocalName("tck:local_" + propertyType.value());
+        result.setLocalNamespace("tck:testlocalnamespace");
+        result.setDisplayName("TCK " + propertyType.value() + " propertry");
+        result.setQueryName("tck:" + propertyType.value());
+        result.setDescription("TCK " + propertyType.value() + " propertry");
+        result.setCardinality(Cardinality.SINGLE);
+        result.setUpdatability(Updatability.READWRITE);
+        result.setIsInherited(false);
+        result.setIsQueryable(false);
+        result.setIsOrderable(false);
+        result.setIsRequired(false);
+        result.setIsOpenChoice(true);
+
+        return result;
+    }
+}
\ No newline at end of file