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 2013/12/03 20:12:49 UTC

svn commit: r1547529 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory: server/ storedobj/api/

Author: jens
Date: Tue Dec  3 19:12:48 2013
New Revision: 1547529

URL: http://svn.apache.org/r1547529
Log:
InMemory: Some improvements on type validation

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/BaseServiceValidatorImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/CmisServiceValidator.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/BaseServiceValidatorImpl.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/BaseServiceValidatorImpl.java?rev=1547529&r1=1547528&r2=1547529&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/BaseServiceValidatorImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/BaseServiceValidatorImpl.java Tue Dec  3 19:12:48 2013
@@ -18,17 +18,34 @@
  */
 package org.apache.chemistry.opencmis.inmemory.server;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collection;
 import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.chemistry.opencmis.commons.data.Acl;
+import org.apache.chemistry.opencmis.commons.data.CreatablePropertyTypes;
 import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
+import org.apache.chemistry.opencmis.commons.data.NewTypeSettableAttributes;
 import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.commons.data.RepositoryCapabilities;
+import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
+import org.apache.chemistry.opencmis.commons.definitions.Choice;
+import org.apache.chemistry.opencmis.commons.definitions.PropertyDecimalDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.PropertyIntegerDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.PropertyStringDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
 import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
 import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.PropertyType;
 import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
 import org.apache.chemistry.opencmis.commons.server.CallContext;
@@ -45,6 +62,8 @@ public class BaseServiceValidatorImpl im
     protected static final String UNKNOWN_REPOSITORY_ID = "Unknown repository id: ";
     protected static final String OBJECT_ID_CANNOT_BE_NULL = "Object Id cannot be null.";
     protected static final String REPOSITORY_ID_CANNOT_BE_NULL = "Repository Id cannot be null.";
+    protected static final String UNKNOWN_TYPE_ID = "Unknown type id: ";
+    protected static final String TYPE_ID_CANNOT_BE_NULL = "Type Id cannot be null.";
     protected final StoreManager fStoreManager;
 
     public BaseServiceValidatorImpl(StoreManager sm) {
@@ -186,6 +205,261 @@ public class BaseServiceValidatorImpl im
         }
     }
 
+    protected void checkCreatablePropertyTypes(String repositoryId,
+            Collection<PropertyDefinition<?>> propertyDefinitions )
+    {
+        RepositoryInfo repositoryInfo = fStoreManager.getRepositoryInfo(repositoryId);
+        RepositoryCapabilities repositoryCapabilities = repositoryInfo.getCapabilities();
+        CreatablePropertyTypes creatablePropertyTypes = repositoryCapabilities.getCreatablePropertyTypes();
+        
+        Set<PropertyType> creatablePropertyTypeSet = creatablePropertyTypes.canCreate();
+        for (PropertyDefinition<?> propertyDefinition : propertyDefinitions)
+        {
+            if (!creatablePropertyTypeSet.contains(propertyDefinition.getPropertyType()))
+                throw new CmisConstraintException("propertyDefinition " + propertyDefinition.getId() +
+                        "is of not creatable type " + propertyDefinition.getPropertyType());
+            
+            // mandatory properties must have a default value
+            if (propertyDefinition.isRequired() && 
+                    (propertyDefinition.getDefaultValue() == null))
+            {
+                throw new CmisConstraintException("property: " + propertyDefinition.getId() + 
+                        "required properties must have a default value");
+            }
+        }
+    }
+    
+    protected void checkSettableAttributes(String repositoryId, TypeDefinition oldTypeDefinition,
+            TypeDefinition newTypeDefinition )
+    {
+        RepositoryInfo repositoryInfo = fStoreManager.getRepositoryInfo(repositoryId);
+        RepositoryCapabilities repositoryCapabilities = repositoryInfo.getCapabilities();
+        NewTypeSettableAttributes newTypeSettableAttributes = repositoryCapabilities.getNewTypeSettableAttributes();
+        
+        if (null == newTypeSettableAttributes)
+            return; // no restrictions defined
+        if (newTypeSettableAttributes.canSetControllableAcl() &&
+                newTypeSettableAttributes.canSetControllablePolicy() &&
+                newTypeSettableAttributes.canSetCreatable() &&
+                newTypeSettableAttributes.canSetDescription() &&
+                newTypeSettableAttributes.canSetDisplayName() &&
+                newTypeSettableAttributes.canSetFileable() &&
+                newTypeSettableAttributes.canSetFulltextIndexed() &&
+                newTypeSettableAttributes.canSetId() &&
+                newTypeSettableAttributes.canSetIncludedInSupertypeQuery() &&
+                newTypeSettableAttributes.canSetLocalName() &&
+                newTypeSettableAttributes.canSetLocalNamespace() &&
+                newTypeSettableAttributes.canSetQueryable() &&
+                newTypeSettableAttributes.canSetQueryName())
+            return;  // all is allowed
+        if (!newTypeSettableAttributes.canSetControllableAcl() && 
+                oldTypeDefinition.isControllableAcl() != newTypeDefinition.isControllableAcl())
+            throw new CmisConstraintException("controllableAcl is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in controllableAcl");
+        if (!newTypeSettableAttributes.canSetControllablePolicy() && 
+                oldTypeDefinition.isControllablePolicy() != newTypeDefinition.isControllablePolicy())
+            throw new CmisConstraintException("controllablePolicy is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in controllablePolicy");
+        if (!newTypeSettableAttributes.canSetCreatable() && 
+                oldTypeDefinition.isCreatable() != newTypeDefinition.isCreatable())
+            throw new CmisConstraintException("isCreatable is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in isCreatable");
+        if (!newTypeSettableAttributes.canSetDescription() && 
+                oldTypeDefinition.getDescription() != newTypeDefinition.getDescription())
+            throw new CmisConstraintException("description is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their description");
+        if (!newTypeSettableAttributes.canSetDisplayName() && 
+                oldTypeDefinition.getDisplayName() != newTypeDefinition.getDisplayName())
+            throw new CmisConstraintException("displayName is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their displayName");
+        if (!newTypeSettableAttributes.canSetFileable() && 
+                oldTypeDefinition.isFileable() != newTypeDefinition.isFileable())
+            throw new CmisConstraintException("fileable is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in isFileable");
+        if (!newTypeSettableAttributes.canSetFulltextIndexed() && 
+                oldTypeDefinition.isFulltextIndexed() != newTypeDefinition.isFulltextIndexed())
+            throw new CmisConstraintException("fulltextIndexed is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in isFulltextIndexed");
+        // TODO  how can the ids differ?
+        if (!newTypeSettableAttributes.canSetId() && 
+                oldTypeDefinition.getId() != newTypeDefinition.getId())
+            throw new CmisConstraintException("id is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their id");
+        if (!newTypeSettableAttributes.canSetIncludedInSupertypeQuery() && 
+                oldTypeDefinition.isIncludedInSupertypeQuery() != newTypeDefinition.isIncludedInSupertypeQuery())
+            throw new CmisConstraintException("includedInSupertypeQuery is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their isIncludedInSupertypeQuery");
+        if (!newTypeSettableAttributes.canSetLocalName() && 
+                oldTypeDefinition.getLocalName() != newTypeDefinition.getLocalName())
+            throw new CmisConstraintException("localName is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their localName");
+        if (!newTypeSettableAttributes.canSetLocalNamespace() && 
+                oldTypeDefinition.getLocalNamespace() != newTypeDefinition.getLocalNamespace())
+            throw new CmisConstraintException("localNamespace is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their localNamespace");
+        if (!newTypeSettableAttributes.canSetQueryable() && 
+                oldTypeDefinition.isQueryable() != newTypeDefinition.isQueryable())
+            throw new CmisConstraintException("queryable is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their isQueryable");
+        if (!newTypeSettableAttributes.canSetQueryName() && 
+                oldTypeDefinition.getQueryName() != newTypeDefinition.getQueryName())
+            throw new CmisConstraintException("queryName is not settable in repository " + repositoryId + ", but " +
+                     oldTypeDefinition.getId() + " and " + newTypeDefinition.getId() + " differ in their queryName");
+    }
+
+    protected void checkUpdatePropertyDefinitions(Map<String,PropertyDefinition<?>> oldPropertyDefinitions,
+            Map<String,PropertyDefinition<?>> newPropertyDefinitions)
+    {
+        for(PropertyDefinition<?> newPropertyDefinition : newPropertyDefinitions.values())
+        {                   
+            PropertyDefinition<?> oldPropertyDefinition = oldPropertyDefinitions.get(newPropertyDefinition.getId());
+        
+            if (oldPropertyDefinition.isInherited())
+                throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                        " update of inherited properties is not allowed");
+            if (!(oldPropertyDefinition.isRequired()) && newPropertyDefinition.isRequired())
+                throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                        " optional properties must not be changed to required");    
+            if (oldPropertyDefinition.getPropertyType() != newPropertyDefinition.getPropertyType())
+                throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                        " cannot update the propertyType (" + oldPropertyDefinition.getPropertyType() + ")");   
+            if (oldPropertyDefinition.getCardinality() != newPropertyDefinition.getCardinality())
+                throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                        " cannot update the cardinality (" + oldPropertyDefinition.getCardinality() + ")"); 
+            
+            if (oldPropertyDefinition.isOpenChoice() && !newPropertyDefinition.isOpenChoice() )
+                throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                        " open choice cannot change from true to false");
+            
+            // check choices
+            if (!oldPropertyDefinition.isOpenChoice())
+            {
+                List<?> oldChoices = oldPropertyDefinition.getChoices();
+                if (null == oldChoices)
+                    throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                            " there should be any choices when it's no open choice");
+                List<?> newChoices = newPropertyDefinition.getChoices();
+                if (null == newChoices)
+                throw new CmisConstraintException("property: " + newPropertyDefinition.getId() + 
+                        " there should be any choices when it's no open choice");
+                ListIterator<?> newChoicesIterator = newChoices.listIterator();
+                for (Object oldChoiceObject : oldChoices)
+                {
+                    Object newChoiceObject = newChoicesIterator.next();
+                    if (!(oldChoiceObject instanceof Choice))
+                        throw new CmisConstraintException("property: " + newPropertyDefinition.getId() + 
+                                " old choice object is not of class Choice: " + oldChoiceObject.toString());
+                    if (!(newChoiceObject instanceof Choice))
+                        throw new CmisConstraintException("property: " + newPropertyDefinition.getId() + 
+                                " new choice object is not of class Choice: " + newChoiceObject.toString());
+                    Choice<?> oldChoice = (Choice<?>) oldChoiceObject;
+                    Choice<?> newChoice = (Choice<?>) newChoiceObject;
+                    List<?> oldValues = oldChoice.getValue();
+                    List<?> newValues = newChoice.getValue();
+                    for (Object oldValue : oldValues)
+                    {                       
+                        if (! newValues.contains(oldValue))
+                            throw new CmisConstraintException("property: " + newPropertyDefinition.getId() + 
+                                    " value: " + oldValue.toString() + " is not in new values of the new choice");
+                    }       
+                }   
+            }
+        
+            // check restrictions
+            if (oldPropertyDefinition instanceof PropertyDecimalDefinition)
+            {
+                PropertyDecimalDefinition oldPropertyDecimalDefinition = (PropertyDecimalDefinition) oldPropertyDefinition;
+                PropertyDecimalDefinition newPropertyDecimalDefinition = (PropertyDecimalDefinition) newPropertyDefinition;
+                
+                BigDecimal oldMinValue = oldPropertyDecimalDefinition.getMinValue();
+                BigDecimal newMinValue = newPropertyDecimalDefinition.getMinValue();
+                if (null != newMinValue &&
+                        (oldMinValue == null || (newMinValue.compareTo( oldMinValue) > 0)))
+                    throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                            " minValue " + oldMinValue + " cannot be further restricted to " + newMinValue);
+                
+                BigDecimal oldMaxValue = oldPropertyDecimalDefinition.getMaxValue();
+                BigDecimal newMaxValue = newPropertyDecimalDefinition.getMaxValue();
+                if (null != newMaxValue &&
+                        (oldMaxValue == null || (newMaxValue.compareTo( oldMaxValue) < 0)))
+                    throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                            " maxValue " + oldMaxValue + " cannot be further restricted to " + newMaxValue);
+            }
+            if (oldPropertyDefinition instanceof PropertyIntegerDefinition)
+            {
+                PropertyIntegerDefinition oldPropertyIntegerDefinition = (PropertyIntegerDefinition) oldPropertyDefinition;
+                PropertyIntegerDefinition newPropertyIntegerDefinition = (PropertyIntegerDefinition) newPropertyDefinition;
+                
+                BigInteger oldMinValue = oldPropertyIntegerDefinition.getMinValue();
+                BigInteger newMinValue = newPropertyIntegerDefinition.getMinValue();
+                if (null != newMinValue &&
+                        (oldMinValue == null || (newMinValue.compareTo( oldMinValue) > 0)))
+                    throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                            " minValue " + oldMinValue + " cannot be further restricted to " + newMinValue);
+                
+                BigInteger oldMaxValue = oldPropertyIntegerDefinition.getMaxValue();
+                BigInteger newMaxValue = newPropertyIntegerDefinition.getMaxValue();
+                if (null != newMaxValue &&
+                        (oldMaxValue == null || (newMaxValue.compareTo( oldMaxValue) < 0)))
+                    throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                            " maxValue " + oldMaxValue + " cannot be further restricted to " + newMaxValue);
+            }
+            if (oldPropertyDefinition instanceof PropertyStringDefinition)
+            {
+                PropertyStringDefinition oldPropertyStringDefinition = (PropertyStringDefinition) oldPropertyDefinition;
+                PropertyStringDefinition newPropertyStringDefinition = (PropertyStringDefinition) newPropertyDefinition;
+                
+                BigInteger oldMaxValue = oldPropertyStringDefinition.getMaxLength();
+                BigInteger newMaxValue = newPropertyStringDefinition.getMaxLength();
+                if (null != newMaxValue &&
+                        (oldMaxValue == null || (newMaxValue.compareTo( oldMaxValue) < 0)))
+                    throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                            " maxValue " + oldMaxValue + " cannot be further restricted to " + newMaxValue);
+            }
+        }
+        
+        // check for removed properties
+        for(PropertyDefinition<?> oldPropertyDefinition : oldPropertyDefinitions.values())
+        {
+            PropertyDefinition<?> newPropertyDefinition = newPropertyDefinitions.get(oldPropertyDefinition.getId());
+            if (null == newPropertyDefinition)
+            {
+                throw new CmisConstraintException("property: " + oldPropertyDefinition.getId() + 
+                        " cannot remove that property");    
+            }
+        }
+    }
+    
+    protected void checkUpdateType (TypeDefinition updateType, TypeDefinition type)
+    {
+        if (updateType.getId() != type.getId())
+            throw new CmisConstraintException("type to update must be of the same id: " + updateType.getId() + ", " + type.getId());
+        if (updateType.getBaseTypeId() != type.getBaseTypeId())
+            throw new CmisConstraintException("base type to update must be the same: " + updateType.getBaseTypeId() + ", " + type.getBaseTypeId());
+        // anything else should be ignored          
+    }
+    
+    protected TypeDefinition checkExistingTypeId(String repositoryId, String typeId) {
+
+        if (null == typeId) {
+            throw new CmisInvalidArgumentException(TYPE_ID_CANNOT_BE_NULL);
+        }
+
+        TypeDefinitionContainer tdc = fStoreManager.getTypeById(repositoryId, typeId);
+        if (tdc == null) {
+            throw new CmisObjectNotFoundException(UNKNOWN_TYPE_ID + typeId);
+        }
+
+        return tdc.getTypeDefinition();
+    }
+
+
+    protected void checkBasicType(TypeDefinition type)
+    {
+        if (type.getId() == type.getBaseTypeId().value())       
+            throw new CmisConstraintException("type " + type.getId() + " is a basic type, basic types are read-only");  
+    }
+    
     @Override
     public void getRepositoryInfos(CallContext context, ExtensionsData extension) {
     }
@@ -550,4 +824,56 @@ public class BaseServiceValidatorImpl im
 
         return checkStandardParameters(repositoryId, objectId);
     }
+    
+    @Override
+    public void createType(CallContext callContext, String repositoryId, TypeDefinition type, ExtensionsData extension) {
+        checkRepositoryId(repositoryId);
+
+        if (null == type) {
+            throw new CmisInvalidArgumentException("Type cannot be null.");
+        }
+        String parentTypeId = type.getParentTypeId();
+        TypeDefinitionContainer parentTypeContainer = fStoreManager.getTypeById(repositoryId, parentTypeId);
+        if (null == parentTypeContainer) {
+            throw new CmisInvalidArgumentException(UNKNOWN_TYPE_ID + parentTypeId);
+        }
+        TypeDefinition parentType = parentTypeContainer.getTypeDefinition();
+        // check type mutability
+        if (!(parentType.getTypeMutability().canCreate())) {
+            throw new CmisConstraintException("parent type: " + parentTypeId + " does not allow mutability create");
+        }
+        checkCreatablePropertyTypes(repositoryId, type.getPropertyDefinitions().values());
+    }
+
+    @Override
+    public TypeDefinition updateType(CallContext callContext,
+            String repositoryId, TypeDefinition type, ExtensionsData extension) {
+        checkRepositoryId(repositoryId);
+        
+        TypeDefinition updateType = checkExistingTypeId(repositoryId, type.getId());
+        checkUpdateType(updateType, type);
+        checkBasicType(type);
+        // check type mutability
+        if (!(updateType.getTypeMutability().canUpdate())) {
+            throw new CmisConstraintException("type: " + type.getId() + " does not allow mutability update");
+        }
+        checkCreatablePropertyTypes(repositoryId, type.getPropertyDefinitions().values());
+        checkSettableAttributes(repositoryId, updateType, type );
+        checkUpdatePropertyDefinitions(updateType.getPropertyDefinitions(), type.getPropertyDefinitions());
+        return updateType;
+    }
+
+    @Override
+    public TypeDefinition deleteType(CallContext callContext, String repositoryId,
+            String typeId, ExtensionsData extension) {
+        checkRepositoryId(repositoryId);
+        
+        TypeDefinition deleteType =  checkExistingTypeId(repositoryId, typeId);
+        // check type mutability
+        if (!(deleteType.getTypeMutability().canDelete())) {
+            throw new CmisConstraintException("type: " + typeId + " does not allow mutability delete");
+        }
+        return deleteType;
+    }
+    
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.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/InMemoryRepositoryServiceImpl.java?rev=1547529&r1=1547528&r2=1547529&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java Tue Dec  3 19:12:48 2013
@@ -142,17 +142,10 @@ public class InMemoryRepositoryServiceIm
         return result;
     }
 
-    public TypeDefinition createType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
-
-        if (null == repositoryId) {
-            throw new CmisInvalidArgumentException("Repository id may not be null");
-        }
+    public TypeDefinition createType(CallContext context, String repositoryId, TypeDefinition type, ExtensionsData extension) {
 
+        validator.createType(context, repositoryId, type, extension);        
         TypeManager typeManager = fStoreManager.getTypeManager(repositoryId);
-        if (null == typeManager) {
-            throw new CmisInvalidArgumentException("Unknown repository " + repositoryId);
-        }
-
         AbstractTypeDefinition newType = TypeValidator.completeType(type);
         TypeValidator.adjustTypeNamesAndId(newType);
         TypeValidator.checkType(typeManager, newType);
@@ -160,7 +153,8 @@ public class InMemoryRepositoryServiceIm
         return newType;
     }
 
-    public TypeDefinition updateType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
+    public TypeDefinition updateType(CallContext context, String repositoryId, TypeDefinition type, ExtensionsData extension) {
+        validator.updateType(context, repositoryId, type, extension);        
         String typeId = type.getId();
         TypeManager typeManager = fStoreManager.getTypeManager(repositoryId);
         if (null == typeManager) {
@@ -176,17 +170,10 @@ public class InMemoryRepositoryServiceIm
         return type;
     }
 
-    public void deleteType(String repositoryId, String typeId, ExtensionsData extension) {
+    public void deleteType(CallContext context, String repositoryId, String typeId, ExtensionsData extension) {
 
+        validator.deleteType(context, repositoryId, typeId, extension);        
         TypeManager typeManager = fStoreManager.getTypeManager(repositoryId);
-        if (null == typeManager) {
-            throw new CmisInvalidArgumentException("Unknown repository " + repositoryId);
-        }
-
-        TypeDefinitionContainer typeDefC = typeManager.getTypeById(typeId);
-        if (null == typeDefC) {
-            throw new CmisInvalidArgumentException("Cannot delete type unknown type id: " + typeId);
-        }
 
         ObjectStore objectStore = fStoreManager.getObjectStore(repositoryId);
         if (objectStore.isTypeInUse(typeId)) {

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryService.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/InMemoryService.java?rev=1547529&r1=1547528&r2=1547529&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryService.java Tue Dec  3 19:12:48 2013
@@ -119,17 +119,17 @@ public class InMemoryService extends Abs
 
     @Override
     public TypeDefinition createType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
-        return fRepSvc.createType(repositoryId, type, extension);
+        return fRepSvc.createType(getCallContext(), repositoryId, type, extension);
     }
 
     @Override
     public TypeDefinition updateType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
-        return fRepSvc.updateType(repositoryId, type, extension);
+        return fRepSvc.updateType(getCallContext(), repositoryId, type, extension);
     }
 
     @Override
     public void deleteType(String repositoryId, String typeId, ExtensionsData extension) {
-        fRepSvc.deleteType(repositoryId, typeId, extension);
+        fRepSvc.deleteType(getCallContext(), repositoryId, typeId, extension);
     }
 
     @Override

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/CmisServiceValidator.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/storedobj/api/CmisServiceValidator.java?rev=1547529&r1=1547528&r2=1547529&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/CmisServiceValidator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/CmisServiceValidator.java Tue Dec  3 19:12:48 2013
@@ -23,6 +23,7 @@ import java.util.List;
 import org.apache.chemistry.opencmis.commons.data.Acl;
 import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
 import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
 import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
@@ -157,4 +158,10 @@ public interface CmisServiceValidator {
     StoredObject createItem(CallContext context, String repositoryId, Properties properties, String folderId,
             List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension);
 
+    void createType(CallContext callContext, String repositoryId, TypeDefinition type, ExtensionsData extension);
+    
+    TypeDefinition updateType(CallContext callContext, String repositoryId, TypeDefinition type, 
+            ExtensionsData extension);
+    
+    TypeDefinition deleteType(CallContext callContext, String repositoryId, String typeId, ExtensionsData extension);
 }
\ No newline at end of file