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]