Author: ozeigermann
Date: Sat Jul 28 14:31:44 2007
New Revision: 560618

URL: http://svn.apache.org/viewvc?view=rev&rev=560618
Log:
Established first version of a hierarchical lock manager

Modified:
    
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalLockManager.java
    
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalRWLockManager.java

Modified: 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalLockManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalLockManager.java?view=diff&rev=560618&r1=560617&r2=560618
==============================================================================
--- 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalLockManager.java
 (original)
+++ 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalLockManager.java
 Sat Jul 28 14:31:44 2007
@@ -16,9 +16,8 @@
  */
 package org.apache.commons.transaction.locking;
 
-
 // Takes care of hierarchical locking with folders and resources
-public interface HierarchicalLockManager<M> extends LockManager<String, M> {
-    public void lockAsFolder(String path, boolean exclusive) throws 
LockException;
-    public void lockAsResource(String path, boolean exclusive) throws 
LockException;
+public interface HierarchicalLockManager<K, M> extends LockManager<K, M> {
+    
+    public void lockInHierarchy(M managedResource, String path, boolean 
exclusive) throws LockException;
 }

Modified: 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalRWLockManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalRWLockManager.java?view=diff&rev=560618&r1=560617&r2=560618
==============================================================================
--- 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalRWLockManager.java
 (original)
+++ 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/HierarchicalRWLockManager.java
 Sat Jul 28 14:31:44 2007
@@ -16,16 +16,69 @@
  */
 package org.apache.commons.transaction.locking;
 
-public class HierarchicalRWLockManager<M> extends RWLockManager<String, M> 
implements
-        HierarchicalLockManager<M> {
+import java.util.concurrent.TimeUnit;
+
+public class HierarchicalRWLockManager<M> implements 
HierarchicalLockManager<Object, M> {
+
+    private final String rootPath;
+
+    private final LockManager<Object, M> lm;
+
+    public HierarchicalRWLockManager(String rootPath, LockManager<Object, M> 
lm) {
+        this.rootPath = rootPath;
+        this.lm = lm;
+    }
+
+    public void lockInHierarchy(M managedResource, String path, boolean 
exclusive)
+            throws LockException {
+        // strip off root path
+        // TODO misses sane checks
+        String relativePath = path.substring(path.indexOf(rootPath));
+
+        // this is the root path we want to lock
+        if (relativePath.length() == 0) {
+            lock(managedResource, "/", exclusive);
+            return;
+        }
+
+        // always read lock root
+        lock(managedResource, "/", false);
+
+        String[] segments = relativePath.split("/");
+        StringBuffer currentPath = new StringBuffer(relativePath.length());
+        // for root path
+        currentPath.append('/');
+
+        for (int i = 0; i < segments.length; i++) {
+            String segment = segments[i];
+
+            currentPath.append(segment).append('/');
+            String key = currentPath.toString();
+
+            if (i == segments.length - 1) {
+                // this is the resource itself
+                lock(managedResource, key, exclusive);
+            } else {
+                // this is one of the parent path segments
+                lock(managedResource, key, false);
+            }
+        }
+    }
+
+    public void endWork() {
+        lm.endWork();
+    }
+
+    public void lock(M managedResource, Object key, boolean exclusive) throws 
LockException {
+        lm.lock(managedResource, key, exclusive);
+    }
+
+    public void startWork(long timeout, TimeUnit unit) {
+        lm.startWork(timeout, unit);
 
-    public void lockAsFolder(String path, boolean exclusive) throws 
LockException {
-        // TODO Auto-generated method stub
-        
     }
 
-    public void lockAsResource(String path, boolean exclusive) throws 
LockException {
-        // TODO Auto-generated method stub
-        
+    public boolean tryLock(M managedResource, Object key, boolean exclusive) {
+        return lm.tryLock(managedResource, key, exclusive);
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to