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 /** 031 * @see railo.runtime.lock.LockManager#lock(int, java.lang.String, int, int) 032 */ 033 public LockData lock(int type, String name, int timeout, int pageContextId) throws LockTimeoutException, InterruptedException { 034 if(!caseSensitive)name=name.toLowerCase(); 035 //if(type==LockManager.TYPE_READONLY) return new ReadLockData(name,pageContextId); 036 if(timeout<=0)timeout=1; 037 Lock lock; 038 try { 039 lock=locks.lock(name,timeout,type==LockManager.TYPE_READONLY); 040 } catch (LockException e) { 041 throw new LockTimeoutException(type,name,timeout); 042 } 043 catch (LockInterruptedException e) { 044 throw e.getLockInterruptedException(); 045 } 046 047 return new LockDataImpl(lock,name,pageContextId,type==LockManager.TYPE_READONLY); 048 } 049 050 public void unlock(LockData data) { 051 Lock l = ((LockDataPro)data).getLock(); 052 locks.unlock(l); 053 } 054 055 056 /** 057 * 058 * @see railo.runtime.lock.LockManager#unlock(int) 059 */ 060 public void unlock(int pageContextId) { 061 throw new RuntimeException("no longer supported");//FUTURE remove from interface 062 } 063 064 065 /** 066 * 067 * @see railo.runtime.lock.LockManager#getOpenLockNames() 068 */ 069 public String[] getOpenLockNames() { 070 List<String> list = locks.getOpenLockNames(); 071 return list.toArray(new String[list.size()]); 072 } 073 074 public void clean() { 075 locks.clean(); 076 } 077 078 079 }