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/03/31 18:39:14 UTC

svn commit: r1463002 [1/5] - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src: main/java/org/apache/chemistry/opencmis/inmemory/ main/java/org/apache/chemistry/opencmis/inmemory/query/ main/java/org/apache/c...

Author: jens
Date: Sun Mar 31 16:39:14 2013
New Revision: 1463002

URL: http://svn.apache.org/r1463002
Log:
InMemory: start implementing relationships and policies

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryPolicyServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryRelationshipServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/Policy.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/Relationship.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/PolicyImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/RelationshipImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/PolicyTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/RelationshipServiceTest.java
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.java
    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/InMemoryDiscoveryServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.java
    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/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/server/InMemoryServiceFactoryImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/CmisServiceValidator.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/ObjectStore.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/StoredObject.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/VersionedDocument.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/InMemoryServiceValidatorImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/VersionedDocumentImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/DocumentTypeCreationHelper.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/InMemoryPolicyTypeDefinition.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/InMemoryRelationshipTypeDefinition.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyUtil.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/AbstractServiceTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/FolderTest.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-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/RepositoryServiceTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/EvalQueryTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/query/QueryTestDataCreator.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.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/DataObjectCreator.java?rev=1463002&r1=1463001&r2=1463002&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java Sun Mar 31 16:39:14 2013
@@ -20,6 +20,7 @@ package org.apache.chemistry.opencmis.in
 
 import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -43,9 +44,13 @@ import org.apache.chemistry.opencmis.inm
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.Filing;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.Folder;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.Item;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Policy;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Relationship;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.Version;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
+import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
+import org.apache.chemistry.opencmis.server.support.TypeManager;
 
 /**
  * @author Jens A collection of utility functions to fill the data objects used
@@ -53,7 +58,7 @@ import org.apache.chemistry.opencmis.inm
  */
 public class DataObjectCreator {
 
-	 public static BigInteger MINUS_ONE = BigInteger.valueOf(-1L);
+    public static BigInteger MINUS_ONE = BigInteger.valueOf(-1L);
 
     // Utility class
     private DataObjectCreator() {
@@ -64,17 +69,20 @@ public class DataObjectCreator {
         boolean isFolder = so instanceof Folder;
         boolean isDocument = so instanceof Content;
         boolean isItem = so instanceof Item;
+        boolean isRelationship = so instanceof Relationship;
+        boolean isFileable = isFolder || isDocument || isItem;
+        boolean isPolicy = so instanceof Policy;
         boolean isCheckedOut = false;
         boolean canCheckOut = false;
         boolean canCheckIn = false;
         boolean isVersioned = so instanceof Version || so instanceof VersionedDocument;
         boolean hasContent = so instanceof Content && ((Content) so).hasContent();
-        boolean isRootFolder = isFolder && ((Folder)so).getParent() == null;
+        boolean isRootFolder = isFolder && ((Folder) so).getParent() == null;
         boolean hasRendition = so.hasRendition(user);
-        boolean canGetAcl = user != null && (isDocument || isFolder);
+        boolean canGetAcl = user != null && (isDocument || isFolder || isItem);
         boolean canSetAcl = canGetAcl;
-        boolean cmis11 = InMemoryServiceContext.getCallContext().getCmisVersion() != CmisVersion.CMIS_1_0;        
-        
+        boolean cmis11 = InMemoryServiceContext.getCallContext().getCmisVersion() != CmisVersion.CMIS_1_0;
+
         if (so instanceof Version) {
             isCheckedOut = ((Version) so).isPwc();
             canCheckIn = isCheckedOut && ((Version) so).getParentDocument().getCheckedOutBy().equals(user);
@@ -84,18 +92,21 @@ public class DataObjectCreator {
             canCheckOut = !((VersionedDocument) so).isCheckedOut();
             canCheckIn = isCheckedOut && ((VersionedDocument) so).getCheckedOutBy().equals(user);
         }
-        
+
         AllowableActionsImpl allowableActions = new AllowableActionsImpl();
         Set<Action> set = allowableActions.getAllowableActions();
+        
         if (!isRootFolder) {
             set.add(Action.CAN_DELETE_OBJECT);
             set.add(Action.CAN_UPDATE_PROPERTIES);
+            set.add(Action.CAN_APPLY_POLICY);
+            set.add(Action.CAN_GET_APPLIED_POLICIES);
         }
 
-        if (isFolder || isDocument || isItem) {
+        if (isFolder || isDocument || isItem || isRelationship || isPolicy) {
             set.add(Action.CAN_GET_PROPERTIES);
-            if (!isRootFolder) {
-                set.add(Action.CAN_GET_OBJECT_PARENTS);   
+            if (!isRootFolder && isFileable) {
+                set.add(Action.CAN_GET_OBJECT_PARENTS);
                 set.add(Action.CAN_MOVE_OBJECT);
             }
         }
@@ -132,27 +143,27 @@ public class DataObjectCreator {
         }
 
         if (isDocument || isItem) {
-            if (so instanceof Filing && ((Filing)so).hasParent()) {
+            if (so instanceof Filing && ((Filing) so).hasParent()) {
                 set.add(Action.CAN_ADD_OBJECT_TO_FOLDER);
                 set.add(Action.CAN_REMOVE_OBJECT_FROM_FOLDER);
             }
-        if (isDocument)
-            if (isVersioned) {
-                if (canCheckIn)
+            if (isDocument)
+                if (isVersioned) {
+                    if (canCheckIn)
+                        set.add(Action.CAN_SET_CONTENT_STREAM);
+                } else
                     set.add(Action.CAN_SET_CONTENT_STREAM);
-            } else
-                set.add(Action.CAN_SET_CONTENT_STREAM);
         }
 
         if (hasRendition) {
             set.add(Action.CAN_GET_RENDITIONS);
         }
-        
-        if (canSetAcl) 
+
+        if (canSetAcl)
             set.add(Action.CAN_APPLY_ACL);
-        if (canGetAcl) 
+        if (canGetAcl)
             set.add(Action.CAN_GET_ACL);
-       
+
         allowableActions.setAllowableActions(set);
         return allowableActions;
     }
@@ -172,8 +183,9 @@ public class DataObjectCreator {
         return polIds;
     }
 
-    public static List<ObjectData> fillRelationships(IncludeRelationships includeRelationships, StoredObject so, String user) {
-        return getRelationships(includeRelationships, so, user);
+    public static List<ObjectData> fillRelationships(TypeManager tm, IncludeRelationships includeRelationships,
+            StoredObject so, String user) {
+        return getRelationships(tm, includeRelationships, so, user);
     }
 
     public static ChangeEventInfo fillChangeEventInfo(StoredObject so) {
@@ -181,23 +193,26 @@ public class DataObjectCreator {
         ChangeEventInfo changeEventInfo = new ChangeEventInfoDataImpl();
         return changeEventInfo;
     }
-    
-    public static List<ObjectData> getRelationships(IncludeRelationships includeRelationships,
-    		StoredObject spo, String user)
-    {
-         if (includeRelationships != IncludeRelationships.NONE) 
-        {
-        	RelationshipDirection relationshipDirection = RelationshipDirection.SOURCE;
-        	// source is default
-        	if (includeRelationships == IncludeRelationships.TARGET)
-        		relationshipDirection = RelationshipDirection.TARGET;
-        	else if (includeRelationships == IncludeRelationships.BOTH)
-        		relationshipDirection = RelationshipDirection.EITHER;  // either and both!!
-        	
-            ObjectList relationships = spo.getObjectRelationships(false, relationshipDirection,
-            		null, null, false, MINUS_ONE, MINUS_ONE, null, user);
-           return (relationships == null? null : relationships.getObjects());
+
+    public static List<ObjectData> getRelationships(TypeManager tm, IncludeRelationships includeRelationships,
+            StoredObject spo, String user) {
+        if (includeRelationships != IncludeRelationships.NONE) {
+            RelationshipDirection relationshipDirection = RelationshipDirection.SOURCE;
+            // source is default
+            if (includeRelationships == IncludeRelationships.TARGET)
+                relationshipDirection = RelationshipDirection.TARGET;
+            else if (includeRelationships == IncludeRelationships.BOTH)
+                relationshipDirection = RelationshipDirection.EITHER;
+            
+            List<StoredObject>  relationships = spo.getObjectRelationships(relationshipDirection, user);
+            List<ObjectData> res = new ArrayList<ObjectData>(relationships.size());
+            for (StoredObject so : relationships) {
+                ObjectData od = PropertyCreationHelper.getObjectData(tm, so, null, user, false,
+                        IncludeRelationships.NONE, null, false, false, null);
+                res.add(od);
+            }
+            return res;
         }
-         return null;
+        return null;
     }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.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/query/InMemoryQueryProcessor.java?rev=1463002&r1=1463001&r2=1463002&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java Sun Mar 31 16:39:14 2013
@@ -153,7 +153,7 @@ public class InMemoryQueryProcessor {
             String queryName = queryObj.getTypes().values().iterator().next();
             TypeDefinition td = queryObj.getTypeDefinitionFromQueryName(queryName);
 
-            ObjectData od = PropertyCreationHelper.getObjectDataQueryResult(td, so, user, props, funcs,
+            ObjectData od = PropertyCreationHelper.getObjectDataQueryResult(tm, td, so, user, props, funcs,
                     fromType, includeAllowableActions, includeRelationships, renditionFilter);
 
             objDataList.add(od);
@@ -243,19 +243,15 @@ public class InMemoryQueryProcessor {
     private void match(StoredObject so, String user, boolean searchAllVersions) {
         // log.debug("checkMatch() for object: " + so.getId());
         // first check if type is matching...
-        String queryName = queryObj.getTypes().values().iterator().next(); // as
-                                                                           // we
-                                                                           // don't
-                                                                           // support
-                                                                           // JOINS
-                                                                           // take
-                                                                           // first
-                                                                           // type
+
+        // as we don't support joins take first type
+        String queryName = queryObj.getTypes().values().iterator().next(); 
+
         TypeDefinition td = queryObj.getTypeDefinitionFromQueryName(queryName);
-        boolean skip = so instanceof VersionedDocument; // we are only
-                                                        // interested in
-                                                        // versions not in the
-                                                        // series
+        
+        // we are only interested in versions not in the series
+        boolean skip = so instanceof VersionedDocument; 
+
         boolean typeMatches = typeMatches(td, so);
         if (!searchAllVersions && so instanceof DocumentVersion
                 && ((DocumentVersion) so).getParentDocument().getLatestVersion(false) != so) {

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.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/AtomLinkInfoProvider.java?rev=1463002&r1=1463001&r2=1463002&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.java Sun Mar 31 16:39:14 2013
@@ -30,6 +30,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.data.RenditionData;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
+import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
 import org.apache.chemistry.opencmis.commons.impl.server.RenditionInfoImpl;
 import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
@@ -129,7 +130,6 @@ public class AtomLinkInfoProvider {
             objInfo.setHasParent(false);
         }
 
-        // Renditions, currently not supported by in-memory provider
         List<RenditionData> renditions = so.getRenditions("*", 0, 0);
         if (renditions == null || renditions.size() == 0)
             objInfo.setRenditionInfos(null);
@@ -147,10 +147,19 @@ public class AtomLinkInfoProvider {
             objInfo.setRenditionInfos(infos);
         }
 
-        // Relationships, currently not supported by in-memory provider
-        objInfo.setSupportsRelationships(false);
-        objInfo.setRelationshipSourceIds(null);
-        objInfo.setRelationshipTargetIds(null);
+        // Relationships
+        objInfo.setSupportsRelationships(true);
+        List<StoredObject> rels = so.getObjectRelationships(RelationshipDirection.SOURCE, null);
+        List<String> srcIds = new ArrayList<String>(rels.size());
+        for (StoredObject rel : rels)
+            srcIds.add(rel.getId());
+        
+        rels = so.getObjectRelationships(RelationshipDirection.TARGET, null);
+        List<String> targetIds = new ArrayList<String>(rels.size());
+        for (StoredObject rel : rels)
+            targetIds.add(rel.getId());
+        objInfo.setRelationshipSourceIds(srcIds);
+        objInfo.setRelationshipTargetIds(targetIds);
 
         // Policies, currently not supported by in-memory provider
         objInfo.setSupportsPolicies(false);

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=1463002&r1=1463001&r2=1463002&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 Sun Mar 31 16:39:14 2013
@@ -23,7 +23,10 @@ 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.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.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
@@ -47,7 +50,7 @@ public class BaseServiceValidatorImpl im
      * Check if repository is known and that object exists. To avoid later calls
      * to again retrieve the object from the id return the retrieved object for
      * later use.
-     *
+     * 
      * @param repositoryId
      *            repository id
      * @param objectId
@@ -157,11 +160,23 @@ public class BaseServiceValidatorImpl im
 
     protected StoredObject[] checkParams(String repositoryId, String objectId1, String objectId2) {
         StoredObject[] so = new StoredObject[2];
-        so[0] = checkStandardParameters(repositoryId, objectId1);
         ObjectStore objectStore = fStoreManager.getObjectStore(repositoryId);
+        so[0] = checkExistingObjectId(objectStore, objectId1);
         so[1] = checkExistingObjectId(objectStore, objectId2);
         return so;
     }
+    
+    protected void checkPolicies(String repositoryId, List<String> policyIds) {
+        if (policyIds != null && policyIds.size() > 0) {
+            for (String policyId : policyIds) {
+                TypeDefinitionContainer tdc = fStoreManager.getTypeById(repositoryId, policyId);
+                if (tdc == null)
+                    throw new CmisInvalidArgumentException("Unknown policy type: " + policyId);
+                if (tdc.getTypeDefinition().getBaseTypeId() != BaseTypeId.CMIS_POLICY)
+                    throw new CmisInvalidArgumentException( policyId + " is not a policy type");
+            }
+        }
+    }
 
     public void getRepositoryInfos(CallContext context, ExtensionsData extension) {
     }
@@ -171,20 +186,17 @@ public class BaseServiceValidatorImpl im
         checkRepositoryId(repositoryId);
     }
 
-    public void getTypeChildren(CallContext context, String repositoryId, String typeId,
-            ExtensionsData extension) {
+    public void getTypeChildren(CallContext context, String repositoryId, String typeId, ExtensionsData extension) {
 
         checkRepositoryId(repositoryId);
     }
 
-    public void getTypeDescendants(CallContext context, String repositoryId, String typeId,
-            ExtensionsData extension) {
+    public void getTypeDescendants(CallContext context, String repositoryId, String typeId, ExtensionsData extension) {
 
         checkRepositoryId(repositoryId);
     }
 
-    public void getTypeDefinition(CallContext context, String repositoryId, String typeId,
-            ExtensionsData extension) {
+    public void getTypeDefinition(CallContext context, String repositoryId, String typeId, ExtensionsData extension) {
 
         checkRepositoryId(repositoryId);
     }
@@ -231,36 +243,39 @@ public class BaseServiceValidatorImpl im
     }
 
     public StoredObject createDocument(CallContext context, String repositoryId, String folderId,
-            ExtensionsData extension) {
+            List<String> policyIds, ExtensionsData extension) {
         return checkStandardParametersAllowNull(repositoryId, folderId);
     }
 
     public StoredObject createDocumentFromSource(CallContext context, String repositoryId, String sourceId,
-            String folderId, ExtensionsData extension) {
+            String folderId, List<String> policyIds, ExtensionsData extension) {
 
         return checkStandardParametersAllowNull(repositoryId, sourceId);
     }
 
-    public StoredObject createFolder(CallContext context, String repositoryId, String folderId, ExtensionsData extension) {
+    public StoredObject createFolder(CallContext context, String repositoryId, String folderId, List<String> policyIds,
+            ExtensionsData extension) {
         return checkStandardParameters(repositoryId, folderId);
     }
 
     public StoredObject[] createRelationship(CallContext context, String repositoryId, String sourceId,
-    		String targetId, ExtensionsData extension) {
+            String targetId, List<String> policyIds, ExtensionsData extension) {
         checkRepositoryId(repositoryId);
         checkStandardParametersAllowNull(repositoryId, null);
         return checkParams(repositoryId, sourceId, targetId);
     }
 
-    public StoredObject createPolicy(CallContext context, String repositoryId, String folderId, ExtensionsData extension) {
-    	 return checkStandardParameters(repositoryId, folderId);
+    public StoredObject createPolicy(CallContext context, String repositoryId, String folderId, Acl addAces,
+            Acl removeAces, List<String> policyIds, ExtensionsData extension) {
+
+        return checkStandardParametersAllowNull(repositoryId, null);
     }
 
     // CMIS 1.1
     public StoredObject createItem(CallContext context, String repositoryId, Properties properties, String folderId,
             List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) {
         return checkStandardParametersAllowNull(repositoryId, folderId);
-   }
+    }
 
     public StoredObject getAllowableActions(CallContext context, String repositoryId, String objectId,
             ExtensionsData extension) {
@@ -289,7 +304,7 @@ public class BaseServiceValidatorImpl im
     public StoredObject getObjectByPath(CallContext context, String repositoryId, String path, ExtensionsData extension) {
 
         return checkStandardParametersByPath(repositoryId, path, context.getUsername());
-   }
+    }
 
     public StoredObject getContentStream(CallContext context, String repositoryId, String objectId, String streamId,
             ExtensionsData extension) {
@@ -307,7 +322,7 @@ public class BaseServiceValidatorImpl im
             String targetFolderId, String sourceFolderId, ExtensionsData extension) {
 
         StoredObject[] res = new StoredObject[3];
-        res [0] = checkStandardParameters(repositoryId, objectId.getValue());
+        res[0] = checkStandardParameters(repositoryId, objectId.getValue());
         res[1] = checkExistingObjectId(fStoreManager.getObjectStore(repositoryId), sourceFolderId);
         res[2] = checkExistingObjectId(fStoreManager.getObjectStore(repositoryId), targetFolderId);
         return res;
@@ -352,8 +367,8 @@ public class BaseServiceValidatorImpl im
         return checkStandardParameters(repositoryId, objectId);
     }
 
-    public StoredObject checkIn(CallContext context, String repositoryId, Holder<String> objectId,
-            Acl addAces, Acl removeAces, ExtensionsData extension) {
+    public StoredObject checkIn(CallContext context, String repositoryId, Holder<String> objectId, Acl addAces,
+            Acl removeAces, List<String> policyIds, ExtensionsData extension) {
         return checkStandardParameters(repositoryId, objectId.getValue());
     }
 
@@ -400,7 +415,24 @@ public class BaseServiceValidatorImpl im
     public StoredObject getObjectRelationships(CallContext context, String repositoryId, String objectId,
             RelationshipDirection relationshipDirection, String typeId, ExtensionsData extension) {
 
-        return checkStandardParameters(repositoryId, objectId);
+        StoredObject so = checkStandardParameters(repositoryId, objectId);
+
+        if (relationshipDirection == null) {
+            throw new CmisInvalidArgumentException("Relationship direction cannot be null.");
+        }
+
+        if (typeId != null) {
+            TypeDefinition typeDef = fStoreManager.getTypeById(repositoryId, typeId).getTypeDefinition();
+            if (typeDef == null) {
+                throw new CmisInvalidArgumentException("Type Id " + typeId + " is not known in repository "
+                        + repositoryId);
+            }
+
+            if (!typeDef.getBaseTypeId().equals(BaseTypeId.CMIS_RELATIONSHIP)) {
+                throw new CmisInvalidArgumentException("Type Id " + typeId + " is not a relationship type.");
+            }
+        }
+        return so;
     }
 
     public StoredObject getAcl(CallContext context, String repositoryId, String objectId, ExtensionsData extension) {

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryDiscoveryServiceImpl.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/InMemoryDiscoveryServiceImpl.java?rev=1463002&r1=1463001&r2=1463002&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryDiscoveryServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryDiscoveryServiceImpl.java Sun Mar 31 16:39:14 2013
@@ -90,6 +90,10 @@ public class InMemoryDiscoveryServiceImp
         changeEventInfo.setChangeType(ChangeType.DELETED);
         changeEventInfo.setChangeTime(new GregorianCalendar());
         odImpl.setChangeEventInfo(changeEventInfo);
+        if (includePolicyIds != null && includePolicyIds) {
+            // TODO set policies
+            // odImpl.setPolicyIds(policyIds)
+        }
         lod.add(odImpl);
 
         objList.setObjects(lod);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.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/InMemoryNavigationServiceImpl.java?rev=1463002&r1=1463001&r2=1463002&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.java Sun Mar 31 16:39:14 2013
@@ -424,7 +424,8 @@ public class InMemoryNavigationServiceIm
 
         copyFilteredProperties(repositoryId, parentFolder, filter, parent);
         
-        parent.setRelationships(DataObjectCreator.getRelationships(includeRelationships, parentFolder, user));
+        TypeManager tm = fStoreManager.getTypeManager(repositoryId);
+        parent.setRelationships(DataObjectCreator.getRelationships(tm, includeRelationships, parentFolder, user));
         
         if (includeAllowableActions != null && includeAllowableActions) {
             //  AllowableActions allowableActions = DataObjectCreator.fillAllowableActions(spo, user);

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=1463002&r1=1463001&r2=1463002&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 Sun Mar 31 16:39:14 2013
@@ -104,8 +104,8 @@ public class InMemoryObjectServiceImpl e
         // Attach the CallContext to a thread local context that can be
         // accessed from everywhere
 
-        StoredObject so = createDocumentIntern(context, repositoryId, properties, folderId, contentStream, versioningState,
-                policies, addAces, removeAces, extension);
+        StoredObject so = createDocumentIntern(context, repositoryId, properties, folderId, contentStream,
+                versioningState, policies, addAces, removeAces, extension);
         LOG.debug("stop createDocument()");
         return so.getId();
     }
@@ -115,8 +115,14 @@ public class InMemoryObjectServiceImpl e
             Acl addAces, Acl removeAces, ExtensionsData extension) {
 
         LOG.debug("start createDocumentFromSource()");
-        StoredObject so = validator.createDocumentFromSource(context, repositoryId, sourceId, folderId, extension);
-        TypeDefinition td = getTypeDefinition(repositoryId, so);  // type definition may be copied from source object
+        StoredObject so = validator.createDocumentFromSource(context, repositoryId, sourceId, folderId, policies,
+                extension);
+        TypeDefinition td = getTypeDefinition(repositoryId, so); // type
+                                                                 // definition
+                                                                 // may be
+                                                                 // copied from
+                                                                 // source
+                                                                 // object
 
         ContentStream content = getContentStream(context, repositoryId, sourceId, null, BigInteger.valueOf(-1),
                 BigInteger.valueOf(-1), null);
@@ -163,8 +169,8 @@ public class InMemoryObjectServiceImpl e
 
         // TODO to be completed if policies are implemented
         LOG.debug("start createPolicy()");
-        StoredObject so = createPolicyIntern(context, repositoryId, properties, folderId, policies, addAces, removeAces,
-                extension);
+        StoredObject so = createPolicyIntern(context, repositoryId, properties, folderId, policies, addAces,
+                removeAces, extension);
         LOG.debug("stop createPolicy()");
         return so == null ? null : so.getId();
     }
@@ -172,17 +178,18 @@ public class InMemoryObjectServiceImpl e
     public String createRelationship(CallContext context, String repositoryId, Properties properties,
             List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) {
 
-        // TODO to be completed if relationships are implemented
         LOG.debug("start createRelationship()");
-        StoredObject so = createRelationshipIntern(context, repositoryId, properties, policies, addAces, removeAces, extension);
+        StoredObject so = createRelationshipIntern(context, repositoryId, properties, policies, addAces, removeAces,
+                extension);
         LOG.debug("stop createRelationship()");
         return so == null ? null : so.getId();
     }
 
     // CMIS 1.1
-    public String createItem(CallContext context, String repositoryId, Properties properties, String folderId, List<String> policies,
-            Acl addAces, Acl removeAces, ExtensionsData extension) {
-        StoredObject so = createItemIntern(context, repositoryId, properties, folderId, policies, addAces, removeAces, extension);
+    public String createItem(CallContext context, String repositoryId, Properties properties, String folderId,
+            List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) {
+        StoredObject so = createItemIntern(context, repositoryId, properties, folderId, policies, addAces, removeAces,
+                extension);
         return so.getId();
     }
 
@@ -212,8 +219,8 @@ public class InMemoryObjectServiceImpl e
         BaseTypeId typeBaseId = typeDefC.getTypeDefinition().getBaseTypeId();
         StoredObject so = null;
         if (typeBaseId.equals(InMemoryDocumentTypeDefinition.getRootDocumentType().getBaseTypeId())) {
-            so = createDocumentIntern(context, repositoryId, properties, folderId, contentStream, versioningState, null, null,
-                    null, null);
+            so = createDocumentIntern(context, repositoryId, properties, folderId, contentStream, versioningState,
+                    null, null, null, null);
         } else if (typeBaseId.equals(InMemoryFolderTypeDefinition.getRootFolderType().getBaseTypeId())) {
             so = createFolderIntern(context, repositoryId, properties, folderId, null, null, null, null);
         } else if (typeBaseId.equals(InMemoryPolicyTypeDefinition.getRootPolicyType().getBaseTypeId())) {
@@ -250,9 +257,9 @@ public class InMemoryObjectServiceImpl e
             throw new CmisObjectNotFoundException("Unknown object id: " + objectId);
         }
 
-        if ( so.getChangeToken() != null && ( changeToken == null || !so.getChangeToken().equals( changeToken.getValue() ) ) )
-            throw new CmisUpdateConflictException( "deleteContentStream failed, ChangeToken does not match." );
-             
+        if (so.getChangeToken() != null && (changeToken == null || !so.getChangeToken().equals(changeToken.getValue())))
+            throw new CmisUpdateConflictException("deleteContentStream failed, ChangeToken does not match.");
+
         if (!(so instanceof Content)) {
             throw new CmisObjectNotFoundException("Id" + objectId
                     + " does not refer to a document, but only documents can have content");
@@ -262,8 +269,8 @@ public class InMemoryObjectServiceImpl e
         LOG.debug("stop deleteContentStream()");
     }
 
-    public void deleteObject(CallContext context, String repositoryId, String objectId,
-            Boolean allVersions, ExtensionsData extension) {
+    public void deleteObject(CallContext context, String repositoryId, String objectId, Boolean allVersions,
+            ExtensionsData extension) {
 
         LOG.debug("start deleteObject()");
         validator.deleteObject(context, repositoryId, objectId, allVersions, extension);
@@ -300,7 +307,8 @@ public class InMemoryObjectServiceImpl e
         ObjectStore objectStore = fStoreManager.getObjectStore(repositoryId);
 
         if (null == so) {
-            throw new CmisInvalidArgumentException("Cannot delete object with id  " + folderId + ". Object does not exist.");
+            throw new CmisInvalidArgumentException("Cannot delete object with id  " + folderId
+                    + ". Object does not exist.");
         }
 
         if (!(so instanceof Folder)) {
@@ -318,7 +326,8 @@ public class InMemoryObjectServiceImpl e
         }
 
         // recursively delete folder
-        deleteRecursive(objectStore, (Folder) so, continueOnFailure, allVersions, failedToDeleteIds, context.getUsername());
+        deleteRecursive(objectStore, (Folder) so, continueOnFailure, allVersions, failedToDeleteIds,
+                context.getUsername());
 
         result.setIds(failedToDeleteIds);
         LOG.debug("stop deleteTree()");
@@ -338,7 +347,8 @@ public class InMemoryObjectServiceImpl e
         }
 
         String user = context.getUsername();
-//      AllowableActions allowableActions = DataObjectCreator.fillAllowableActions(so, user);
+        // AllowableActions allowableActions =
+        // DataObjectCreator.fillAllowableActions(so, user);
         AllowableActions allowableActions = so.getAllowableActions(user);
         LOG.debug("stop getAllowableActions()");
         return allowableActions;
@@ -350,7 +360,6 @@ public class InMemoryObjectServiceImpl e
         LOG.debug("start getContentStream()");
         StoredObject so = validator.getContentStream(context, repositoryId, objectId, streamId, extension);
 
-
         if (so == null) {
             throw new CmisObjectNotFoundException("Unknown object id: " + objectId);
         }
@@ -402,8 +411,8 @@ public class InMemoryObjectServiceImpl e
 
         extElements.add(new CmisExtensionElementImpl(ns, "objectId", attr, objectId));
         extElements.add(new CmisExtensionElementImpl(ns, "name", null, so.getName()));
-        od.setExtensions(Collections.singletonList(
-                (CmisExtensionElement) new CmisExtensionElementImpl(ns, "exampleExtension",null,  extElements)));
+        od.setExtensions(Collections.singletonList((CmisExtensionElement) new CmisExtensionElementImpl(ns,
+                "exampleExtension", null, extElements)));
 
         LOG.debug("stop getObject()");
 
@@ -468,7 +477,8 @@ public class InMemoryObjectServiceImpl e
             throw new CmisObjectNotFoundException("Unknown object id: " + objectId);
         }
 
-        List<RenditionData> renditions = so.getRenditions(renditionFilter, maxItems==null ? 0 : maxItems.longValue(), skipCount==null ? 0: skipCount.longValue());
+        List<RenditionData> renditions = so.getRenditions(renditionFilter, maxItems == null ? 0 : maxItems.longValue(),
+                skipCount == null ? 0 : skipCount.longValue());
         LOG.debug("stop getRenditions()");
         return renditions;
     }
@@ -477,7 +487,8 @@ public class InMemoryObjectServiceImpl e
             String targetFolderId, String sourceFolderId, ExtensionsData extension, ObjectInfoHandler objectInfos) {
 
         LOG.debug("start moveObject()");
-        StoredObject[] sos = validator.moveObject(context, repositoryId, objectId, targetFolderId, sourceFolderId, extension);
+        StoredObject[] sos = validator.moveObject(context, repositoryId, objectId, targetFolderId, sourceFolderId,
+                extension);
         StoredObject so = sos[0];
         Folder targetFolder = null;
         Folder sourceFolder = null;
@@ -533,8 +544,8 @@ public class InMemoryObjectServiceImpl e
         LOG.debug("stop moveObject()");
 
         TypeManager tm = fStoreManager.getTypeManager(repositoryId);
-        ObjectData od = PropertyCreationHelper.getObjectData(tm, so, null, user, false,
-                IncludeRelationships.NONE, null, false, false, extension);
+        ObjectData od = PropertyCreationHelper.getObjectData(tm, so, null, user, false, IncludeRelationships.NONE,
+                null, false, false, extension);
 
         // To be able to provide all Atom links in the response we need
         // additional information:
@@ -552,7 +563,7 @@ public class InMemoryObjectServiceImpl e
 
         LOG.debug("start setContentStream()");
         Content content;
-        if ( null == overwriteFlag ) {
+        if (null == overwriteFlag) {
             overwriteFlag = Boolean.TRUE;
         }
 
@@ -562,7 +573,7 @@ public class InMemoryObjectServiceImpl e
                 && Long.valueOf(so.getChangeToken()) > Long.valueOf(changeToken.getValue())) {
             throw new CmisUpdateConflictException("updateProperties failed: changeToken does not match");
         }
-             
+
         if (!(so instanceof Document || so instanceof VersionedDocument || so instanceof DocumentVersion)) {
             throw new CmisObjectNotFoundException("Id" + objectId
                     + " does not refer to a document, but only documents can have content");
@@ -572,7 +583,7 @@ public class InMemoryObjectServiceImpl e
         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);
+        TypeValidator.validateContentAllowed((DocumentTypeDefinition) typeDef, null != contentStream);
 
         if (so instanceof Document) {
             content = ((Document) so);
@@ -587,7 +598,8 @@ public class InMemoryObjectServiceImpl e
         }
 
         if (!overwriteFlag && content.getContent(0, -1) != null) {
-            throw new CmisContentAlreadyExistsException("cannot overwrite existing content if overwrite flag is not set");
+            throw new CmisContentAlreadyExistsException(
+                    "cannot overwrite existing content if overwrite flag is not set");
         }
 
         content.setContent(contentStream, true);
@@ -625,7 +637,8 @@ public class InMemoryObjectServiceImpl e
         // Find secondary type definitions to consider for update
         List<String> existingSecondaryTypeIds = so.getSecondaryTypeIds();
         @SuppressWarnings("unchecked")
-        PropertyData<String> pdSec = (PropertyData<String>) properties.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
+        PropertyData<String> pdSec = (PropertyData<String>) properties.getProperties().get(
+                PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
         List<String> newSecondaryTypeIds = pdSec == null ? null : pdSec.getValues();
         Set<String> secondaryTypeIds = new HashSet<String>();
         if (null != existingSecondaryTypeIds)
@@ -633,72 +646,76 @@ public class InMemoryObjectServiceImpl e
         if (null != newSecondaryTypeIds)
             secondaryTypeIds.addAll(newSecondaryTypeIds);
 
-        // Find secondary type definitions to delete (null means not set --> do not change, empty --> remove all secondary types)
+        // Find secondary type definitions to delete (null means not set --> do
+        // not change, empty --> remove all secondary types)
         if (null != newSecondaryTypeIds) {
-            List<String> propertiesIdToDelete = getListOfPropertiesToDeleteFromRemovedSecondaryTypes(repositoryId, so, newSecondaryTypeIds);
+            List<String> propertiesIdToDelete = getListOfPropertiesToDeleteFromRemovedSecondaryTypes(repositoryId, so,
+                    newSecondaryTypeIds);
             for (String propIdToRemove : propertiesIdToDelete) {
                 so.getProperties().remove(propIdToRemove);
             }
         }
 
         // update properties:
-        if(properties != null) {
-        	for (String key : properties.getProperties().keySet()) {
-        		if (key.equals(PropertyIds.NAME)) {
-        			continue; // ignore here
-        		}
+        if (properties != null) {
+            for (String key : properties.getProperties().keySet()) {
+                if (key.equals(PropertyIds.NAME)) {
+                    continue; // ignore here
+                }
 
-        		PropertyData<?> value = properties.getProperties().get(key);
+                PropertyData<?> value = properties.getProperties().get(key);
                 PropertyDefinition<?> propDef = typeDef.getPropertyDefinitions().get(key);
-        		if (null == propDef && cmis11) {
-        		    TypeDefinition typeDefSecondary= getSecondaryTypeDefinition(repositoryId, secondaryTypeIds, key);
-        		    if (null == typeDefSecondary)
-        		        throw new CmisInvalidArgumentException("Cannot update property " + key + ": not contained in type");
-        		    propDef = typeDefSecondary.getPropertyDefinitions().get(key);
-        		}
-
-        		if (value.getValues() == null || value.getFirstValue() == null) {
-        			// delete property
-        			// check if a required a property
-        			if (propDef.isRequired()) {
-        				throw new CmisConstraintException(
-        						"updateProperties failed, following property can't be deleted, because it is required: "
-        								+ key);
-        			}
-        			oldProperties.remove(key);
-        			hasUpdatedProp = true;
-        		} else {
-        			if (propDef.getUpdatability().equals(Updatability.WHENCHECKEDOUT)) {
-        				if (!isCheckedOut)
-        					throw new CmisUpdateConflictException(
-        							"updateProperties failed, following property can't be updated, because it is not checked-out: "
-        									+ key);
-        			} else if (!propDef.getUpdatability().equals(Updatability.READWRITE)) {
-        				throw new CmisConstraintException(
-        						"updateProperties failed, following property can't be updated, because it is not writable: "
-        								+ key);
-        			}
-        			oldProperties.put(key, value);
-        			hasUpdatedProp = true;
-        		}
-        	}
-
-        	// get name from properties and perform special rename to check if
-        	// path already exists
-        	PropertyData<?> pd = properties.getProperties().get(PropertyIds.NAME);
-        	if (pd != null && so instanceof Filing) {
-        		String newName = (String) pd.getFirstValue();
-        		List<Folder> parents = ((Filing) so).getParents(user);
-        		if (so instanceof Folder && parents.isEmpty()) {
-        			throw new CmisConstraintException("updateProperties failed, you cannot rename the root folder");
-        		}
-        		if (newName == null || newName.equals("")) {
-        			throw new CmisConstraintException("updateProperties failed, name must not be empty.");
-        		}
-
-        		so.rename((String) pd.getFirstValue()); // note: this does persist
-        		hasUpdatedProp = true;
-        	}
+                if (null == propDef && cmis11) {
+                    TypeDefinition typeDefSecondary = getSecondaryTypeDefinition(repositoryId, secondaryTypeIds, key);
+                    if (null == typeDefSecondary)
+                        throw new CmisInvalidArgumentException("Cannot update property " + key
+                                + ": not contained in type");
+                    propDef = typeDefSecondary.getPropertyDefinitions().get(key);
+                }
+
+                if (value.getValues() == null || value.getFirstValue() == null) {
+                    // delete property
+                    // check if a required a property
+                    if (propDef.isRequired()) {
+                        throw new CmisConstraintException(
+                                "updateProperties failed, following property can't be deleted, because it is required: "
+                                        + key);
+                    }
+                    oldProperties.remove(key);
+                    hasUpdatedProp = true;
+                } else {
+                    if (propDef.getUpdatability().equals(Updatability.WHENCHECKEDOUT)) {
+                        if (!isCheckedOut)
+                            throw new CmisUpdateConflictException(
+                                    "updateProperties failed, following property can't be updated, because it is not checked-out: "
+                                            + key);
+                    } else if (!propDef.getUpdatability().equals(Updatability.READWRITE)) {
+                        throw new CmisConstraintException(
+                                "updateProperties failed, following property can't be updated, because it is not writable: "
+                                        + key);
+                    }
+                    oldProperties.put(key, value);
+                    hasUpdatedProp = true;
+                }
+            }
+
+            // get name from properties and perform special rename to check if
+            // path already exists
+            PropertyData<?> pd = properties.getProperties().get(PropertyIds.NAME);
+            if (pd != null && so instanceof Filing) {
+                String newName = (String) pd.getFirstValue();
+                List<Folder> parents = ((Filing) so).getParents(user);
+                if (so instanceof Folder && parents.isEmpty()) {
+                    throw new CmisConstraintException("updateProperties failed, you cannot rename the root folder");
+                }
+                if (newName == null || newName.equals("")) {
+                    throw new CmisConstraintException("updateProperties failed, name must not be empty.");
+                }
+
+                so.rename((String) pd.getFirstValue()); // note: this does
+                                                        // persist
+                hasUpdatedProp = true;
+            }
         }
 
         if (hasUpdatedProp) {
@@ -729,8 +746,8 @@ public class InMemoryObjectServiceImpl e
         }
 
         TypeManager tm = fStoreManager.getTypeManager(repositoryId);
-        ObjectData od = PropertyCreationHelper.getObjectData(tm, so, null, user, false,
-                IncludeRelationships.NONE, null, false, false, extension);
+        ObjectData od = PropertyCreationHelper.getObjectData(tm, so, null, user, false, IncludeRelationships.NONE,
+                null, false, false, extension);
 
         // To be able to provide all Atom links in the response we need
         // additional information:
@@ -744,11 +761,11 @@ public class InMemoryObjectServiceImpl e
     }
 
     // CMIS 1.1
-    public void appendContentStream(CallContext context, String repositoryId, Holder<String> objectId, Holder<String> changeToken,
-            ContentStream contentStream, ExtensionsData extension) {
+    public void appendContentStream(CallContext context, String repositoryId, Holder<String> objectId,
+            Holder<String> changeToken, ContentStream contentStream, ExtensionsData extension) {
 
         Content content;
-        
+
         LOG.debug("start appendContentStream()");
         StoredObject so = validator.appendContentStream(context, repositoryId, objectId, extension);
 
@@ -756,7 +773,7 @@ public class InMemoryObjectServiceImpl e
                 && Long.valueOf(so.getChangeToken()) > Long.valueOf(changeToken.getValue())) {
             throw new CmisUpdateConflictException("updateProperties failed: changeToken does not match");
         }
-             
+
         if (!(so instanceof Document || so instanceof VersionedDocument || so instanceof DocumentVersion)) {
             throw new CmisObjectNotFoundException("Id" + objectId
                     + " does not refer to a document, but only documents can have content");
@@ -766,7 +783,7 @@ public class InMemoryObjectServiceImpl e
         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);
+        TypeValidator.validateContentAllowed((DocumentTypeDefinition) typeDef, null != contentStream);
 
         if (so instanceof Document) {
             content = ((Document) so);
@@ -782,14 +799,14 @@ public class InMemoryObjectServiceImpl e
 
         content.appendContent(contentStream);
     }
-    
+
     public List<BulkUpdateObjectIdAndChangeToken> bulkUpdateProperties(CallContext context, String repositoryId,
             List<BulkUpdateObjectIdAndChangeToken> objectIdAndChangeToken, Properties properties,
             List<String> addSecondaryTypeIds, List<String> removeSecondaryTypeIds, ExtensionsData extension,
             ObjectInfoHandler objectInfos) {
 
         List<BulkUpdateObjectIdAndChangeToken> result = new ArrayList<BulkUpdateObjectIdAndChangeToken>();
-        for ( BulkUpdateObjectIdAndChangeToken obj: objectIdAndChangeToken) {
+        for (BulkUpdateObjectIdAndChangeToken obj : objectIdAndChangeToken) {
             Holder<String> objId = new Holder<String>(obj.getId());
             Holder<String> changeToken = new Holder<String>(obj.getChangeToken());
             try {
@@ -801,18 +818,19 @@ public class InMemoryObjectServiceImpl e
         }
         return result;
     }
-    
+
     // ///////////////////////////////////////////////////////
     // private helper methods
 
-    private StoredObject createDocumentIntern(CallContext context, String repositoryId, Properties properties, String folderId,
-            ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addACEs,
-            Acl removeACEs, ExtensionsData extension) {
+    private StoredObject createDocumentIntern(CallContext context, String repositoryId, Properties properties,
+            String folderId, ContentStream contentStream, VersioningState versioningState, List<String> policies,
+            Acl addACEs, Acl removeACEs, ExtensionsData extension) {
 
-    	addACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
-    	removeACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
+        addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+        removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(),
+                removeACEs);
 
-    	validator.createDocument(context, repositoryId, folderId, extension);
+        validator.createDocument(context, repositoryId, folderId, policies, extension);
 
         // Validation stuff
         TypeValidator.validateRequiredSystemProperties(properties);
@@ -826,10 +844,9 @@ public class InMemoryObjectServiceImpl e
         PropertyData<?> pd = propMap.get(PropertyIds.NAME);
         String name = (String) pd.getFirstValue();
 
-
         // validate ACL
         TypeValidator.validateAcl(typeDef, addACEs, removeACEs);
-        
+
         Folder folder = null;
         if (null != folderId) {
             StoredObject so = objectStore.getObjectById(folderId);
@@ -850,7 +867,8 @@ public class InMemoryObjectServiceImpl e
 
         // check if the given type is a document type
         if (!typeDef.getBaseTypeId().equals(BaseTypeId.CMIS_DOCUMENT)) {
-            throw new CmisInvalidArgumentException("Cannot create a document, with a non-document type: " + typeDef.getId());
+            throw new CmisInvalidArgumentException("Cannot create a document, with a non-document type: "
+                    + typeDef.getId());
         }
 
         // check name syntax
@@ -880,9 +898,11 @@ public class InMemoryObjectServiceImpl e
 
         StoredObject so = null;
 
-        // check if content stream parameters are set and if not set some defaults
-        if (null != contentStream && (contentStream.getFileName() == null || contentStream.getFileName().length() == 0 ||
-            contentStream.getMimeType() == null || contentStream.getMimeType().length() == 0)) {
+        // check if content stream parameters are set and if not set some
+        // defaults
+        if (null != contentStream
+                && (contentStream.getFileName() == null || contentStream.getFileName().length() == 0
+                        || contentStream.getMimeType() == null || contentStream.getMimeType().length() == 0)) {
             ContentStreamImpl cs = new ContentStreamImpl();
             cs.setStream(contentStream.getStream());
             if (contentStream.getFileName() == null || contentStream.getFileName().length() == 0) {
@@ -902,12 +922,13 @@ public class InMemoryObjectServiceImpl e
 
         // Now we are sure to have document type definition:
         if (((DocumentTypeDefinition) typeDef).isVersionable()) {
-            DocumentVersion version = objectStore.createVersionedDocument(name,  propMap,
-                    user, folder, addACEs, removeACEs, contentStream, versioningState);
+            DocumentVersion version = objectStore.createVersionedDocument(name, propMap, user, folder, policies,
+                    addACEs, removeACEs, contentStream, versioningState);
             version.persist();
-            so = version; // return the version and not the version series to caller
+            so = version; // return the version and not the version series to
+                          // caller
         } else {
-            Document doc = objectStore.createDocument(name, propMap, user, folder, addACEs, removeACEs);
+            Document doc = objectStore.createDocument(name, propMap, user, folder, policies, addACEs, removeACEs);
             doc.setContent(contentStream, false);
             doc.persist();
             so = doc;
@@ -919,10 +940,11 @@ public class InMemoryObjectServiceImpl e
     private Folder createFolderIntern(CallContext context, String repositoryId, Properties properties, String folderId,
             List<String> policies, Acl addACEs, Acl removeACEs, ExtensionsData extension) {
 
-    	addACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
-    	removeACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
+        addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+        removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(),
+                removeACEs);
 
-    	validator.createFolder(context, repositoryId, folderId, extension);
+        validator.createFolder(context, repositoryId, folderId, policies, extension);
         TypeValidator.validateRequiredSystemProperties(properties);
         String user = context.getUsername();
 
@@ -938,10 +960,9 @@ public class InMemoryObjectServiceImpl e
 
         // check name syntax
         if (!NameValidator.isValidName(folderName)) {
-            throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME  + " Name is: " + folderName);
+            throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME + " Name is: " + folderName);
         }
 
-
         TypeDefinition typeDef = getTypeDefinition(repositoryId, properties);
 
         // check if the given type is a folder type
@@ -982,34 +1003,48 @@ public class InMemoryObjectServiceImpl e
         }
 
         ObjectStore objStore = fStoreManager.getObjectStore(repositoryId);
-        Folder newFolder = objStore.createFolder(folderName, properties.getProperties(), user, parent,
-        addACEs,  removeACEs);
+        Folder newFolder = objStore.createFolder(folderName, properties.getProperties(), user, parent, policies,
+                addACEs, removeACEs);
         LOG.debug("stop createFolder()");
         newFolder.persist();
         return newFolder;
     }
 
-    private StoredObject createPolicyIntern(CallContext context, String repositoryId, Properties properties, String folderId,
-            List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) {
+    private StoredObject createPolicyIntern(CallContext context, String repositoryId, Properties properties,
+            String folderId, List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) {
+
+        validator.createPolicy(context, repositoryId, folderId, addAces, removeAces, policies, extension);
+
+        addAces = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addAces);
+        removeAces = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(),
+                removeAces);
+
+        String user = context.getUsername();
+        Map<String, PropertyData<?>> propMap = properties.getProperties();
+        // get name from properties
+        PropertyData<?> pd = propMap.get(PropertyIds.NAME);
+        String name = (String) pd.getFirstValue();
+        pd = propMap.get(PropertyIds.POLICY_TEXT);
+        String policyText = (String) pd.getFirstValue();
+
+        ObjectStore objStore = fStoreManager.getObjectStore(repositoryId);
+        StoredObject storedObject = objStore.createPolicy(name, policyText, propMap, user);
 
-    	addAces  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addAces);
-    	removeAces  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeAces);
-        validator.createPolicy(context, repositoryId, folderId, extension);
-        throw new CmisNotSupportedException("createPolicy is not supported.");
+        return storedObject;
     }
 
-    private StoredObject createRelationshipIntern(CallContext context, String repositoryId,
-            Properties properties, List<String> policies,
-            Acl addACEs, Acl removeACEs, ExtensionsData extension) {
+    private StoredObject createRelationshipIntern(CallContext context, String repositoryId, Properties properties,
+            List<String> policies, Acl addACEs, Acl removeACEs, ExtensionsData extension) {
 
         TypeValidator.validateRequiredSystemProperties(properties);
 
         String user = context.getUsername();
-        
-    	addACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
-    	removeACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
 
-    	// get required properties
+        addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+        removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(),
+                removeACEs);
+
+        // get required properties
         PropertyData<?> pd = properties.getProperties().get(PropertyIds.SOURCE_ID);
         String sourceId = (String) pd.getFirstValue();
         if (null == sourceId || sourceId.length() == 0)
@@ -1020,55 +1055,61 @@ public class InMemoryObjectServiceImpl e
         if (null == targetId || targetId.length() == 0)
             throw new CmisInvalidArgumentException("Cannot create a relationship without a targetId.");
 
-        RelationshipTypeDefinition typeDef = (RelationshipTypeDefinition) getTypeDefinition(repositoryId, properties);
+        TypeDefinition typeDef = getTypeDefinition(repositoryId, properties);
 
         // check if the given type is a relationship type
         if (!typeDef.getBaseTypeId().equals(BaseTypeId.CMIS_RELATIONSHIP))
-            throw new CmisInvalidArgumentException("Cannot create a relationship, with a non-relationship type: " + typeDef.getId());
+            throw new CmisInvalidArgumentException("Cannot create a relationship, with a non-relationship type: "
+                    + typeDef.getId());
 
-       StoredObject[] relationObjects = validator.createRelationship(context, repositoryId, sourceId, targetId, extension);
+        StoredObject[] relationObjects = validator.createRelationship(context, repositoryId, sourceId, targetId,
+                policies, extension);
 
+        // set default properties
+        Map<String, PropertyData<?>> propMap = properties.getProperties();
+        Map<String, PropertyData<?>> propMapNew = setDefaultProperties(typeDef, propMap);
+        if (propMapNew != propMap) {
+            properties = new PropertiesImpl(propMapNew.values());
+        }
 
-       // set default properties
-       Map<String, PropertyData<?>> propMap = properties.getProperties();
-       Map<String, PropertyData<?>> propMapNew = setDefaultProperties(typeDef, propMap);
-       if (propMapNew != propMap) {
-           properties = new PropertiesImpl(propMapNew.values());
-       }
-
-       boolean cmis11 = context.getCmisVersion() != CmisVersion.CMIS_1_0;
-       validateProperties(repositoryId, null, properties, false, cmis11);
+        boolean cmis11 = context.getCmisVersion() != CmisVersion.CMIS_1_0;
+        validateProperties(repositoryId, null, properties, false, cmis11);
 
-       // validate ACL
-       TypeValidator.validateAcl(typeDef, addACEs, removeACEs);
+        // validate ACL
+        TypeValidator.validateAcl(typeDef, addACEs, removeACEs);
 
-       // validate the allowed types of the relationship
-       ObjectStore objStore = fStoreManager.getObjectStore(repositoryId);
+        // validate the allowed types of the relationship
+        ObjectStore objStore = fStoreManager.getObjectStore(repositoryId);
 
-       TypeDefinition sourceTypeDef = fStoreManager.getTypeById(repositoryId, objStore.getObjectById(sourceId).getTypeId()).getTypeDefinition();
-       TypeDefinition targetTypeDef = fStoreManager.getTypeById(repositoryId, objStore.getObjectById(targetId).getTypeId()).getTypeDefinition();
-       TypeValidator.validateAllowedRelationshipTypes(typeDef,  sourceTypeDef, targetTypeDef);
+        TypeDefinition sourceTypeDef = fStoreManager.getTypeById(repositoryId,
+                objStore.getObjectById(sourceId).getTypeId()).getTypeDefinition();
+        TypeDefinition targetTypeDef = fStoreManager.getTypeById(repositoryId,
+                objStore.getObjectById(targetId).getTypeId()).getTypeDefinition();
+        TypeValidator.validateAllowedRelationshipTypes((RelationshipTypeDefinition) typeDef, sourceTypeDef,
+                targetTypeDef);
 
-       // get name from properties
-       pd = propMap.get(PropertyIds.NAME);
-       String name = (String) pd.getFirstValue();
+        // get name from properties
+        pd = propMap.get(PropertyIds.NAME);
+        String name = (String) pd.getFirstValue();
 
-       StoredObject storedObject = objStore.createRelationship( relationObjects[0], relationObjects[1],
-               propMap, user, addACEs,  removeACEs);
-//        StoredObject storedObject = objStore.createRelationship(name, relationObjects[0], relationObjects[1],
-//                propMap, user, addACEs,  removeACEs);
-       return storedObject;
+        // StoredObject storedObject = objStore.createRelationship(
+        // relationObjects[0], relationObjects[1],
+        // propMap, user, addACEs, removeACEs);
+        StoredObject storedObject = objStore.createRelationship(name, relationObjects[0], relationObjects[1], propMap,
+                user, addACEs, removeACEs);
+        return storedObject;
     }
 
-    private StoredObject createItemIntern(CallContext context, String repositoryId, Properties properties, String folderId,
-            List<String> policies, Acl addACEs, Acl removeACEs,  ExtensionsData extension) {
+    private StoredObject createItemIntern(CallContext context, String repositoryId, Properties properties,
+            String folderId, List<String> policies, Acl addACEs, Acl removeACEs, ExtensionsData extension) {
 
         validator.createItem(context, repositoryId, properties, folderId, policies, addACEs, removeACEs, extension);
-        
-        addACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
-        removeACEs  = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
 
-        validator.createDocument(context, repositoryId, folderId, extension);
+        addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+        removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(),
+                removeACEs);
+
+        validator.createDocument(context, repositoryId, folderId, policies, extension);
 
         // Validation stuff
         TypeValidator.validateRequiredSystemProperties(properties);
@@ -1082,10 +1123,9 @@ public class InMemoryObjectServiceImpl e
         PropertyData<?> pd = propMap.get(PropertyIds.NAME);
         String name = (String) pd.getFirstValue();
 
-
         // validate ACL
         TypeValidator.validateAcl(typeDef, addACEs, removeACEs);
-        
+
         Folder folder = null;
         if (null != folderId) {
             StoredObject so = objectStore.getObjectById(folderId);
@@ -1132,9 +1172,9 @@ public class InMemoryObjectServiceImpl e
         StoredObject so = null;
 
         // Now we are sure to have document type definition:
-        so = objectStore.createItem(name, propMap, user, folder, addACEs, removeACEs);
+        so = objectStore.createItem(name, propMap, user, folder, policies, addACEs, removeACEs);
         so.persist();
-        
+
         return so;
 
     }
@@ -1143,7 +1183,8 @@ public class InMemoryObjectServiceImpl e
         String sourceId = sourceFolder.getId();
         String targetId = targetFolder.getId();
         while (targetId != null) {
-            // log.debug("comparing source id " + sourceId + " with predecessor "
+            // log.debug("comparing source id " + sourceId +
+            // " with predecessor "
             // +
             // targetId);
             if (targetId.equals(sourceId)) {
@@ -1162,7 +1203,7 @@ public class InMemoryObjectServiceImpl e
     /**
      * Recursively delete a tree by traversing it and first deleting all
      * children and then the object itself
-     *
+     * 
      * @param folderStore
      * @param parentFolder
      * @param continueOnFailure
@@ -1184,8 +1225,7 @@ public class InMemoryObjectServiceImpl e
             if (child instanceof Folder) {
                 boolean mustContinue = deleteRecursive(folderStore, (Folder) child, continueOnFailure, allVersions,
                         failedToDeleteIds, user);
-                if (!mustContinue && !continueOnFailure)
-                 {
+                if (!mustContinue && !continueOnFailure) {
                     return false; // stop further deletions
                 }
             } else {
@@ -1204,64 +1244,70 @@ public class InMemoryObjectServiceImpl e
         ContentStream csd = null;
         long lOffset = offset == null ? 0 : offset.longValue();
         long lLength = length == null ? -1 : length.longValue();
-        
+
         if (streamId == null) {
             csd = ((Content) so).getContent(lOffset, lLength);
             return csd;
         } else if (streamId.endsWith("-rendition")) {
             csd = so.getRenditionContent(streamId, lOffset, lLength);
         }
-        
+
         return csd;
     }
 
-    private Map<String, PropertyData<?>> setDefaultProperties(TypeDefinition typeDef, Map<String, PropertyData<?>> properties) {
+    private Map<String, PropertyData<?>> setDefaultProperties(TypeDefinition typeDef,
+            Map<String, PropertyData<?>> properties) {
         Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions();
         boolean hasCopied = false;
 
-        for ( PropertyDefinition<?> propDef : propDefs.values()) {
+        for (PropertyDefinition<?> propDef : propDefs.values()) {
             String propId = propDef.getId();
             List<?> defaultVal = propDef.getDefaultValue();
             if (defaultVal != null && null == properties.get(propId)) {
                 if (!hasCopied) {
-                    properties = new HashMap<String, PropertyData<?>>(properties); // copy because it is an unmodified collection
+                    properties = new HashMap<String, PropertyData<?>>(properties); // copy
+                                                                                   // because
+                                                                                   // it
+                                                                                   // is
+                                                                                   // an
+                                                                                   // unmodified
+                                                                                   // collection
                     hasCopied = true;
                 }
-                Object value = propDef.getCardinality() == Cardinality.SINGLE ? defaultVal.get(0)
-                        : defaultVal;
-                PropertyData<?> pd = fStoreManager.getObjectFactory().createPropertyData(
-                        propDef, value);
+                Object value = propDef.getCardinality() == Cardinality.SINGLE ? defaultVal.get(0) : defaultVal;
+                PropertyData<?> pd = fStoreManager.getObjectFactory().createPropertyData(propDef, value);
                 // set property:
                 properties.put(propId, pd);
             }
         }
         return properties;
     }
-    
-    private void validateProperties(String repositoryId, StoredObject so, Properties properties, boolean checkMandatory, boolean cmis11) {
+
+    private void validateProperties(String repositoryId, StoredObject so, Properties properties,
+            boolean checkMandatory, boolean cmis11) {
         TypeDefinition typeDef;
-        
+
         if (null != so)
             typeDef = getTypeDefinition(repositoryId, so);
         else
             typeDef = getTypeDefinition(repositoryId, properties);
-            
+
         // check properties for validity
         if (!cmis11) {
             TypeValidator.validateProperties(typeDef, properties, checkMandatory, cmis11);
             return;
         }
-        
+
         // CMIS 1.1 secondary types
         PropertyData<?> pd = properties.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
-        
+
         @SuppressWarnings("unchecked")
         List<String> secondaryTypeIds = (List<String>) (pd == null ? null : pd.getValues());
         // if no secondary types are passed use the existing ones:
         if (null != so && (null == secondaryTypeIds || secondaryTypeIds.size() == 0)) {
             secondaryTypeIds = so.getSecondaryTypeIds();
         }
-        
+
         if (null != secondaryTypeIds && secondaryTypeIds.size() != 0) {
             List<String> allTypeIds = new ArrayList<String>(secondaryTypeIds);
             allTypeIds.add(typeDef.getId());
@@ -1271,11 +1317,12 @@ public class InMemoryObjectServiceImpl e
             TypeValidator.validateProperties(typeDef, properties, checkMandatory, true);
         }
     }
-    
-    private TypeDefinition getSecondaryTypeDefinition(String repositoryId, Set<String> secondaryTypeIds, String propertyId) {
+
+    private TypeDefinition getSecondaryTypeDefinition(String repositoryId, Set<String> secondaryTypeIds,
+            String propertyId) {
         if (null == secondaryTypeIds || secondaryTypeIds.isEmpty())
             return null;
-        
+
         for (String typeId : secondaryTypeIds) {
             TypeDefinitionContainer typeDefC = fStoreManager.getTypeById(repositoryId, typeId);
             TypeDefinition typeDef = typeDefC.getTypeDefinition();
@@ -1290,9 +1337,11 @@ public class InMemoryObjectServiceImpl e
 
     private List<String> getListOfPropertiesToDeleteFromRemovedSecondaryTypes(String repositoryId, StoredObject so,
             List<String> newSecondaryTypeIds) {
-        
-        List<String> propertiesToDelete = new ArrayList<String>(); // properties id to be removed
-        
+
+        List<String> propertiesToDelete = new ArrayList<String>(); // properties
+                                                                   // id to be
+                                                                   // removed
+
         // calculate delta to be removed
         List<String> existingSecondaryTypeIds = so.getSecondaryTypeIds();
         List<String> delta = new ArrayList<String>(existingSecondaryTypeIds);
@@ -1303,7 +1352,8 @@ public class InMemoryObjectServiceImpl e
             propertiesToDelete.addAll(typeDef.getPropertyDefinitions().keySet());
         }
 
-        // TODO: the list may contain too many properties, if the same property is also in a type not to be removed
+        // TODO: the list may contain too many properties, if the same property
+        // is also in a type not to be removed
         return propertiesToDelete;
     }
 

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryPolicyServiceImpl.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/InMemoryPolicyServiceImpl.java?rev=1463002&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryPolicyServiceImpl.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryPolicyServiceImpl.java Sun Mar 31 16:39:14 2013
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.inmemory.server;
+
+import java.util.List;
+
+import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
+import org.apache.chemistry.opencmis.commons.data.ObjectData;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
+
+public class InMemoryPolicyServiceImpl extends AbstractServiceImpl {
+
+    protected InMemoryPolicyServiceImpl(StoreManager storeManager) {
+        super(storeManager);
+    }
+
+    public List<ObjectData> getAppliedPolicies(String repositoryId, String objectId, String filter,
+            ExtensionsData extension) {
+        return null;
+    }
+
+    public void removePolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
+        
+    }
+
+    public void applyPolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
+    }
+
+}