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    }