You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2014/02/22 20:32:33 UTC

svn commit: r1570886 - /chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/SessionImpl.java

Author: fmui
Date: Sat Feb 22 19:32:32 2014
New Revision: 1570886

URL: http://svn.apache.org/r1570886
Log:
CMIS-752: added ObjectType object cache

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/SessionImpl.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/SessionImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/SessionImpl.java?rev=1570886&r1=1570885&r2=1570886&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/SessionImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/SessionImpl.java Sat Feb 22 19:32:32 2014
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
@@ -112,6 +114,7 @@ public class SessionImpl implements Sess
     // private static Logger log = LoggerFactory.getLogger(SessionImpl.class);
 
     private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+    private transient IdentityHashMap<TypeDefinition, ObjectType> objectTypeCache;
 
     /*
      * default session context (serializable)
@@ -265,6 +268,9 @@ public class SessionImpl implements Sess
             // create new object cache
             this.cache = createCache();
 
+            // clear object type cache
+            objectTypeCache = new IdentityHashMap<TypeDefinition, ObjectType>();
+
             // clear provider cache
             getBinding().clearAllCaches();
         } finally {
@@ -593,7 +599,6 @@ public class SessionImpl implements Sess
 
     public ItemIterable<ObjectType> getTypeChildren(final String typeId, final boolean includePropertyDefinitions) {
         final RepositoryService repositoryService = getBinding().getRepositoryService();
-        final ObjectFactory of = this.getObjectFactory();
 
         return new CollectionIterable<ObjectType>(new AbstractPageFetcher<ObjectType>(this.getDefaultContext()
                 .getMaxItemsPerPage()) {
@@ -609,7 +614,7 @@ public class SessionImpl implements Sess
                 // convert type definitions
                 List<ObjectType> page = new ArrayList<ObjectType>(tdl.getList().size());
                 for (TypeDefinition typeDefinition : tdl.getList()) {
-                    page.add(of.convertTypeDefinition(typeDefinition));
+                    page.add(convertTypeDefinition(typeDefinition));
                 }
 
                 return new AbstractPageFetcher.Page<ObjectType>(page, tdl.getNumItems(), tdl.hasMoreItems()) {
@@ -621,7 +626,8 @@ public class SessionImpl implements Sess
     public ObjectType getTypeDefinition(String typeId) {
         TypeDefinition typeDefinition = getBinding().getRepositoryService().getTypeDefinition(getRepositoryId(),
                 typeId, null);
-        return objectFactory.convertTypeDefinition(typeDefinition);
+
+        return convertTypeDefinition(typeDefinition);
     }
 
     public List<Tree<ObjectType>> getTypeDescendants(String typeId, int depth, boolean includePropertyDefinitions) {
@@ -639,7 +645,7 @@ public class SessionImpl implements Sess
         List<Tree<ObjectType>> result = new ArrayList<Tree<ObjectType>>();
 
         for (TypeDefinitionContainer container : descendantsList) {
-            ObjectType objectType = objectFactory.convertTypeDefinition(container.getTypeDefinition());
+            ObjectType objectType = convertTypeDefinition(container.getTypeDefinition());
             List<Tree<ObjectType>> children = convertTypeDescendants(container.getChildren());
 
             result.add(new TreeImpl<ObjectType>(objectType, children));
@@ -648,13 +654,39 @@ public class SessionImpl implements Sess
         return result;
     }
 
+    /**
+     * Converts a type definition into an object type. If the object type is
+     * cached, it returns the cached object. Otherwise it creates an object type
+     * object and puts it into the cache.
+     */
+    private ObjectType convertTypeDefinition(TypeDefinition typeDefinition) {
+        lock.writeLock().lock();
+        try {
+            ObjectType result = null;
+            if (objectTypeCache == null) {
+                objectTypeCache = new IdentityHashMap<TypeDefinition, ObjectType>();
+            } else {
+                result = objectTypeCache.get(typeDefinition);
+            }
+
+            if (result == null) {
+                result = objectFactory.convertTypeDefinition(typeDefinition);
+                objectTypeCache.put(typeDefinition, result);
+            }
+
+            return result;
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
     public ObjectType createType(TypeDefinition type) {
         if (repositoryInfo.getCmisVersion() == CmisVersion.CMIS_1_0) {
             throw new CmisNotSupportedException("This method is not supported for CMIS 1.0 repositories.");
         }
 
-        return objectFactory.convertTypeDefinition(getBinding().getRepositoryService().createType(getRepositoryId(),
-                type, null));
+        TypeDefinition newType = getBinding().getRepositoryService().createType(getRepositoryId(), type, null);
+        return convertTypeDefinition(newType);
     }
 
     public ObjectType updateType(TypeDefinition type) {
@@ -662,8 +694,11 @@ public class SessionImpl implements Sess
             throw new CmisNotSupportedException("This method is not supported for CMIS 1.0 repositories.");
         }
 
-        return objectFactory.convertTypeDefinition(getBinding().getRepositoryService().updateType(getRepositoryId(),
-                type, null));
+        TypeDefinition updatedType = getBinding().getRepositoryService().updateType(getRepositoryId(), type, null);
+
+        removeFromObjectTypeCache(updatedType.getId());
+
+        return convertTypeDefinition(updatedType);
     }
 
     public void deleteType(String typeId) {
@@ -672,6 +707,30 @@ public class SessionImpl implements Sess
         }
 
         getBinding().getRepositoryService().deleteType(getRepositoryId(), typeId, null);
+        removeFromObjectTypeCache(typeId);
+    }
+
+    /**
+     * Removes the object type object with the given type ID from the cache.
+     */
+    private void removeFromObjectTypeCache(String typeId) {
+        lock.writeLock().lock();
+        try {
+            if (objectTypeCache == null) {
+                return;
+            }
+
+            Iterator<TypeDefinition> iter = objectTypeCache.keySet().iterator();
+            while (iter.hasNext()) {
+                TypeDefinition typeDef = iter.next();
+                if (typeDef.getId().equals(typeId)) {
+                    iter.remove();
+                    break;
+                }
+            }
+        } finally {
+            lock.writeLock().unlock();
+        }
     }
 
     public ItemIterable<QueryResult> query(final String statement, final boolean searchAllVersions) {