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    }