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 2010/03/11 13:38:50 UTC

svn commit: r921826 - in /incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider: cache/ cache/impl/ spi/atompub/

Author: fmui
Date: Thu Mar 11 12:38:50 2010
New Revision: 921826

URL: http://svn.apache.org/viewvc?rev=921826&view=rev
Log:
CMIS-155: provider layer should now be thread-safe

Modified:
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/Cache.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/impl/CacheImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/AbstractAtomPubService.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/LinkCache.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/NavigationServiceImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/ObjectServiceImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/RelationshipServiceImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/VersioningServiceImpl.java

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/Cache.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/Cache.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/Cache.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/Cache.java Thu Mar 11 12:38:50 2010
@@ -85,4 +85,14 @@ public interface Cache extends Serializa
    *         the object is in the cache
    */
   int check(String... keys);
+
+  /**
+   * Applies a write lock.
+   */
+  void writeLock();
+
+  /**
+   * Releases a write lock.
+   */
+  void writeUnlock();
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/impl/CacheImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/impl/CacheImpl.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/impl/CacheImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/cache/impl/CacheImpl.java Thu Mar 11 12:38:50 2010
@@ -302,6 +302,24 @@ public class CacheImpl implements Cache 
     return keys.length;
   }
 
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.apache.opencmis.client.provider.cache.Cache#writeLock()
+   */
+  public void writeLock() {
+    fLock.writeLock().lock();
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.apache.opencmis.client.provider.cache.Cache#writeUnlock()
+   */
+  public void writeUnlock() {
+    fLock.writeLock().unlock();
+  }
+
   // ---- internal ----
 
   /**

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/AbstractAtomPubService.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/AbstractAtomPubService.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/AbstractAtomPubService.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/AbstractAtomPubService.java Thu Mar 11 12:38:50 2010
@@ -189,6 +189,20 @@ public class AbstractAtomPubService {
   }
 
   /**
+   * Locks the link cache.
+   */
+  protected void lockLinks() {
+    getLinkCache().lockLinks();
+  }
+
+  /**
+   * Unlocks the link cache.
+   */
+  protected void unlockLinks() {
+    getLinkCache().unlockLinks();
+  }
+
+  /**
    * Checks a link throw an appropriate exception.
    */
   protected void throwLinkException(String repositoryId, String id, String rel, String type) {
@@ -269,6 +283,20 @@ public class AbstractAtomPubService {
   }
 
   /**
+   * Locks the type link cache.
+   */
+  protected void lockTypeLinks() {
+    getLinkCache().lockTypeLinks();
+  }
+
+  /**
+   * Unlocks the type link cache.
+   */
+  protected void unlockTypeLinks() {
+    getLinkCache().unlockTypeLinks();
+  }
+
+  /**
    * Gets a collection from the cache.
    */
   protected String getCollection(String repositoryId, String collection) {
@@ -678,18 +706,24 @@ public class AbstractAtomPubService {
       throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
     }
 
-    // clean up cache
-    removeLinks(repositoryId, entry.getId());
+    lockLinks();
+    try {
+      // clean up cache
+      removeLinks(repositoryId, entry.getId());
 
-    // walk through the entry
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-      }
-      else if (element.getObject() instanceof CmisObjectType) {
-        result = convert((CmisObjectType) element.getObject());
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
+        else if (element.getObject() instanceof CmisObjectType) {
+          result = convert((CmisObjectType) element.getObject());
+        }
       }
     }
+    finally {
+      unlockLinks();
+    }
 
     return result;
   }
@@ -717,19 +751,25 @@ public class AbstractAtomPubService {
       throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
     }
 
-    // clean up cache
-    removeTypeLinks(repositoryId, entry.getId());
+    lockTypeLinks();
+    try {
+      // clean up cache
+      removeTypeLinks(repositoryId, entry.getId());
 
-    // walk through the entry
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addTypeLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-      }
-      else if (element.getObject() instanceof CmisTypeDefinitionType) {
-        result = convert((CmisTypeDefinitionType) element.getObject());
-        break;
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addTypeLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
+        else if (element.getObject() instanceof CmisTypeDefinitionType) {
+          result = convert((CmisTypeDefinitionType) element.getObject());
+          break;
+        }
       }
     }
+    finally {
+      unlockTypeLinks();
+    }
 
     return result;
   }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/LinkCache.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/LinkCache.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/LinkCache.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/LinkCache.java Thu Mar 11 12:38:50 2010
@@ -144,6 +144,20 @@ public class LinkCache implements Serial
   }
 
   /**
+   * Locks the link cache.
+   */
+  public void lockLinks() {
+    fLinkCache.writeLock();
+  }
+
+  /**
+   * Unlocks the link cache.
+   */
+  public void unlockLinks() {
+    fLinkCache.writeUnlock();
+  }
+
+  /**
    * Adds a type link.
    */
   public void addTypeLink(String repositoryId, String id, String rel, String type, String link) {
@@ -172,6 +186,20 @@ public class LinkCache implements Serial
   }
 
   /**
+   * Locks the type link cache.
+   */
+  public void lockTypeLinks() {
+    fTypeLinkCache.writeLock();
+  }
+
+  /**
+   * Unlocks the type link cache.
+   */
+  public void unlockTypeLinks() {
+    fTypeLinkCache.writeUnlock();
+  }
+
+  /**
    * Adds a collection.
    */
   public void addCollection(String repositoryId, String collection, String link) {

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/NavigationServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/NavigationServiceImpl.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/NavigationServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/NavigationServiceImpl.java Thu Mar 11 12:38:50 2010
@@ -120,22 +120,28 @@ public class NavigationServiceImpl exten
         ObjectInFolderDataImpl child = null;
         String pathSegment = null;
 
-        // clean up cache
-        removeLinks(repositoryId, entry.getId());
-
-        // walk through the entry
-        for (AtomElement element : entry.getElements()) {
-          if (element.getObject() instanceof AtomLink) {
-            addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-          }
-          else if (isStr(NAME_PATH_SEGMENT, element)) {
-            pathSegment = (String) element.getObject();
-          }
-          else if (element.getObject() instanceof CmisObjectType) {
-            child = new ObjectInFolderDataImpl();
-            child.setObject(convert((CmisObjectType) element.getObject()));
+        lockLinks();
+        try {
+          // clean up cache
+          removeLinks(repositoryId, entry.getId());
+
+          // walk through the entry
+          for (AtomElement element : entry.getElements()) {
+            if (element.getObject() instanceof AtomLink) {
+              addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+            }
+            else if (isStr(NAME_PATH_SEGMENT, element)) {
+              pathSegment = (String) element.getObject();
+            }
+            else if (element.getObject() instanceof CmisObjectType) {
+              child = new ObjectInFolderDataImpl();
+              child.setObject(convert((CmisObjectType) element.getObject()));
+            }
           }
         }
+        finally {
+          unlockLinks();
+        }
 
         if (child != null) {
           child.setPathSegment(pathSegment);
@@ -229,18 +235,24 @@ public class NavigationServiceImpl exten
       throw new CmisRuntimeException("Unexpected document!");
     }
 
-    // clean up cache
-    removeLinks(repositoryId, entry.getId());
+    lockLinks();
+    try {
+      // clean up cache
+      removeLinks(repositoryId, entry.getId());
 
-    // walk through the entry
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-      }
-      else if (element.getObject() instanceof CmisObjectType) {
-        result = convert((CmisObjectType) element.getObject());
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
+        else if (element.getObject() instanceof CmisObjectType) {
+          result = convert((CmisObjectType) element.getObject());
+        }
       }
     }
+    finally {
+      unlockLinks();
+    }
 
     return result;
   }
@@ -349,21 +361,27 @@ public class NavigationServiceImpl exten
     ObjectParentDataImpl result = null;
     String relativePathSegment = null;
 
-    // clean up cache
-    removeLinks(repositoryId, entry.getId());
+    lockLinks();
+    try {
+      // clean up cache
+      removeLinks(repositoryId, entry.getId());
 
-    // walk through the entry
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-      }
-      else if (element.getObject() instanceof CmisObjectType) {
-        result = new ObjectParentDataImpl(convert((CmisObjectType) element.getObject()));
-      }
-      else if (is(NAME_RELATIVE_PATH_SEGMENT, element)) {
-        relativePathSegment = (String) element.getObject();
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
+        else if (element.getObject() instanceof CmisObjectType) {
+          result = new ObjectParentDataImpl(convert((CmisObjectType) element.getObject()));
+        }
+        else if (is(NAME_RELATIVE_PATH_SEGMENT, element)) {
+          relativePathSegment = (String) element.getObject();
+        }
       }
     }
+    finally {
+      unlockLinks();
+    }
 
     if (result != null) {
       result.setRelativePathSegment(relativePathSegment);
@@ -426,18 +444,24 @@ public class NavigationServiceImpl exten
       for (AtomEntry entry : feed.getEntries()) {
         ObjectData child = null;
 
-        // clean up cache
-        removeLinks(repositoryId, entry.getId());
-
-        // walk through the entry
-        for (AtomElement element : entry.getElements()) {
-          if (element.getObject() instanceof AtomLink) {
-            addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-          }
-          else if (element.getObject() instanceof CmisObjectType) {
-            child = convert((CmisObjectType) element.getObject());
+        lockLinks();
+        try {
+          // clean up cache
+          removeLinks(repositoryId, entry.getId());
+
+          // walk through the entry
+          for (AtomElement element : entry.getElements()) {
+            if (element.getObject() instanceof AtomLink) {
+              addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+            }
+            else if (element.getObject() instanceof CmisObjectType) {
+              child = convert((CmisObjectType) element.getObject());
+            }
           }
         }
+        finally {
+          unlockLinks();
+        }
 
         if (child != null) {
           result.getObjects().add(child);
@@ -465,24 +489,31 @@ public class NavigationServiceImpl exten
       String pathSegment = null;
       List<ObjectInFolderContainer> childContainerList = new ArrayList<ObjectInFolderContainer>();
 
-      // clean up cache
-      removeLinks(repositoryId, entry.getId());
+      lockLinks();
+      try {
+        // clean up cache
+        removeLinks(repositoryId, entry.getId());
 
-      // walk through the entry
-      for (AtomElement element : entry.getElements()) {
-        if (element.getObject() instanceof AtomLink) {
-          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-        }
-        else if (element.getObject() instanceof CmisObjectType) {
-          objectInFolder = new ObjectInFolderDataImpl(convert((CmisObjectType) element.getObject()));
-        }
-        else if (is(NAME_PATH_SEGMENT, element)) {
-          pathSegment = (String) element.getObject();
-        }
-        else if (element.getObject() instanceof AtomFeed) {
-          addDescendantsLevel(repositoryId, (AtomFeed) element.getObject(), childContainerList);
+        // walk through the entry
+        for (AtomElement element : entry.getElements()) {
+          if (element.getObject() instanceof AtomLink) {
+            addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+          }
+          else if (element.getObject() instanceof CmisObjectType) {
+            objectInFolder = new ObjectInFolderDataImpl(convert((CmisObjectType) element
+                .getObject()));
+          }
+          else if (is(NAME_PATH_SEGMENT, element)) {
+            pathSegment = (String) element.getObject();
+          }
+          else if (element.getObject() instanceof AtomFeed) {
+            addDescendantsLevel(repositoryId, (AtomFeed) element.getObject(), childContainerList);
+          }
         }
       }
+      finally {
+        unlockLinks();
+      }
 
       if (objectInFolder != null) {
         objectInFolder.setPathSegment(pathSegment);

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/ObjectServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/ObjectServiceImpl.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/ObjectServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/ObjectServiceImpl.java Thu Mar 11 12:38:50 2010
@@ -359,36 +359,42 @@ public class ObjectServiceImpl extends A
       changeToken.setValue(null); // just in case
     }
 
-    // clean up cache
-    removeLinks(repositoryId, entry.getId());
+    lockLinks();
+    try {
+      // clean up cache
+      removeLinks(repositoryId, entry.getId());
+
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
+        else if (element.getObject() instanceof CmisObjectType) {
+          // extract new change token
+          if (changeToken != null) {
+            object = (CmisObjectType) element.getObject();
+
+            if (object.getProperties() != null) {
+              for (CmisProperty property : object.getProperties().getProperty()) {
+                if (PropertyIds.CMIS_CHANGE_TOKEN.equals(property.getPropertyDefinitionId())
+                    && (property instanceof CmisPropertyString)) {
+
+                  CmisPropertyString changeTokenProperty = (CmisPropertyString) property;
+                  if (!changeTokenProperty.getValue().isEmpty()) {
+                    changeToken.setValue(changeTokenProperty.getValue().get(0));
+                  }
 
-    // walk through the entry
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-      }
-      else if (element.getObject() instanceof CmisObjectType) {
-        // extract new change token
-        if (changeToken != null) {
-          object = (CmisObjectType) element.getObject();
-
-          if (object.getProperties() != null) {
-            for (CmisProperty property : object.getProperties().getProperty()) {
-              if (PropertyIds.CMIS_CHANGE_TOKEN.equals(property.getPropertyDefinitionId())
-                  && (property instanceof CmisPropertyString)) {
-
-                CmisPropertyString changeTokenProperty = (CmisPropertyString) property;
-                if (!changeTokenProperty.getValue().isEmpty()) {
-                  changeToken.setValue(changeTokenProperty.getValue().get(0));
+                  break;
                 }
-
-                break;
               }
             }
           }
         }
       }
     }
+    finally {
+      unlockLinks();
+    }
   }
 
   /*

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/RelationshipServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/RelationshipServiceImpl.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/RelationshipServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/RelationshipServiceImpl.java Thu Mar 11 12:38:50 2010
@@ -109,23 +109,30 @@ public class RelationshipServiceImpl ext
       for (AtomEntry entry : feed.getEntries()) {
         ObjectData relationship = null;
 
-        // clean up cache
-        removeLinks(repositoryId, entry.getId());
+        lockLinks();
+        try {
+          // clean up cache
+          removeLinks(repositoryId, entry.getId());
 
-        // walk through the entry
-        for (AtomElement element : entry.getElements()) {
-          if (element.getObject() instanceof AtomLink) {
-            addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-          }
-          else if (element.getObject() instanceof CmisObjectType) {
-            relationship = convert((CmisObjectType) element.getObject());
+          // walk through the entry
+          for (AtomElement element : entry.getElements()) {
+            if (element.getObject() instanceof AtomLink) {
+              addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+            }
+            else if (element.getObject() instanceof CmisObjectType) {
+              relationship = convert((CmisObjectType) element.getObject());
+            }
           }
         }
+        finally {
+          unlockLinks();
+        }
 
         if (relationship != null) {
           result.getObjects().add(relationship);
         }
       }
+
     }
 
     return result;

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/VersioningServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/VersioningServiceImpl.java?rev=921826&r1=921825&r2=921826&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/VersioningServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-provider-impl/src/main/java/org/apache/opencmis/client/provider/spi/atompub/VersioningServiceImpl.java Thu Mar 11 12:38:50 2010
@@ -101,15 +101,21 @@ public class VersioningServiceImpl exten
 
     objectId.setValue(entry.getId());
 
-    // clean up cache
-    removeLinks(repositoryId, entry.getId());
-
-    // walk through the entry
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+    lockLinks();
+    try {
+      // clean up cache
+      removeLinks(repositoryId, entry.getId());
+
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
       }
     }
+    finally {
+      unlockLinks();
+    }
 
     if (contentCopied != null) {
       contentCopied.setValue(null);
@@ -204,21 +210,28 @@ public class VersioningServiceImpl exten
     // set object id
     objectId.setValue(entry.getId());
 
-    // clean up cache
-    removeLinks(repositoryId, entry.getId());
-
-    // walk through the entry
     AccessControlList originalAces = null;
-    for (AtomElement element : entry.getElements()) {
-      if (element.getObject() instanceof AtomLink) {
-        addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-      }
-      else if (element.getObject() instanceof CmisObjectType) {
-        // extract current ACL
-        object = (CmisObjectType) element.getObject();
-        originalAces = convert(object.getAcl(), object.isExactACL());
+
+    lockLinks();
+    try {
+      // clean up cache
+      removeLinks(repositoryId, entry.getId());
+
+      // walk through the entry
+      for (AtomElement element : entry.getElements()) {
+        if (element.getObject() instanceof AtomLink) {
+          addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+        }
+        else if (element.getObject() instanceof CmisObjectType) {
+          // extract current ACL
+          object = (CmisObjectType) element.getObject();
+          originalAces = convert(object.getAcl(), object.isExactACL());
+        }
       }
     }
+    finally {
+      unlockLinks();
+    }
 
     // handle ACL modifications
     if ((originalAces != null) && (isAclMergeRequired(addAces, removeAces))) {
@@ -263,18 +276,24 @@ public class VersioningServiceImpl exten
       for (AtomEntry entry : feed.getEntries()) {
         ObjectData version = null;
 
-        // clean up cache
-        removeLinks(repositoryId, entry.getId());
-
-        // walk through the entry
-        for (AtomElement element : entry.getElements()) {
-          if (element.getObject() instanceof AtomLink) {
-            addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-          }
-          else if (element.getObject() instanceof CmisObjectType) {
-            version = convert((CmisObjectType) element.getObject());
+        lockLinks();
+        try {
+          // clean up cache
+          removeLinks(repositoryId, entry.getId());
+
+          // walk through the entry
+          for (AtomElement element : entry.getElements()) {
+            if (element.getObject() instanceof AtomLink) {
+              addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+            }
+            else if (element.getObject() instanceof CmisObjectType) {
+              version = convert((CmisObjectType) element.getObject());
+            }
           }
         }
+        finally {
+          unlockLinks();
+        }
 
         if (version != null) {
           result.add(version);