001 package railo.runtime.lock; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import railo.commons.lock.Lock; 007 import railo.commons.lock.LockException; 008 import railo.commons.lock.LockInterruptedException; 009 import railo.commons.lock.rw.RWKeyLock; 010 011 /** 012 * Lock mnager to make a log by a string name 013 */ 014 public final class LockManagerImpl implements LockManager { 015 016 private static List<LockManagerImpl> managers=new ArrayList<LockManagerImpl>(); 017 private RWKeyLock<String> locks=new RWKeyLock<String>(); 018 private boolean caseSensitive; 019 020 private LockManagerImpl(boolean caseSensitive) { 021 this.caseSensitive=caseSensitive; 022 } 023 024 public static LockManager getInstance(boolean caseSensitive) { 025 LockManagerImpl lmi = new LockManagerImpl(caseSensitive); 026 managers.add(lmi); 027 return lmi; 028 } 029 030 @Override 031 public LockData lock(int type, String name, int timeout, int pageContextId) throws LockTimeoutException, InterruptedException { 032 if(!caseSensitive)name=name.toLowerCase(); 033 //if(type==LockManager.TYPE_READONLY) return new ReadLockData(name,pageContextId); 034 if(timeout<=0)timeout=1; 035 Lock lock; 036 try { 037 lock=locks.lock(name,timeout,type==LockManager.TYPE_READONLY); 038 } catch (LockException e) { 039 throw new LockTimeoutException(type,name,timeout); 040 } 041 catch (LockInterruptedException e) { 042 throw e.getLockInterruptedException(); 043 } 044 045 return new LockDataImpl(lock,name,pageContextId,type==LockManager.TYPE_READONLY); 046 } 047 048 public void unlock(LockData data) { 049 Lock l = data.getLock(); 050 locks.unlock(l); 051 } 052 053 @Override 054 public String[] getOpenLockNames() { 055 List<String> list = locks.getOpenLockNames(); 056 return list.toArray(new String[list.size()]); 057 } 058 059 public void clean() { 060 locks.clean(); 061 } 062 063 064 }