package com.diodesoftware.scb.clipboard; import com.diodesoftware.util.TimeGetter; import com.diodesoftware.util.DefaultTimeGetter; import java.util.Map; import java.util.HashMap; import java.util.Iterator; public class LockMaster { public static final int UNLOCKED = 0; public static final int LOCKED = 1; public static final int HAS_KEY = 2; public static final long EXPIRY_TIME = 2*60*1000; private TimeGetter timeGetter; private static LockMaster instance = null; private Map<String, ClipLock> locks = new HashMap<String, ClipLock>(); LockMaster(){ setTimeGetter(new DefaultTimeGetter()); } public static LockMaster getInstnace(){ if(instance == null)instance = new LockMaster(); return instance; } public void setTimeGetter(TimeGetter timeGetter) { this.timeGetter = timeGetter; } public int getLock(String sessionId, String uri){ int result; ClipLock lock = locks.get(uri); if(lock == null){ lock = new ClipLock(sessionId, timeGetter.currentTime()); result = HAS_KEY; locks.put(uri, lock); }else{ if(lock.sessionId == null|| lock.sessionId.equals(sessionId)){ lock.sessionId = sessionId; lock.lastUpdate = timeGetter.currentTime(); result = HAS_KEY; }else{ result = LOCKED; } } return result; } public void returnLock(String sessionId, String uri){ ClipLock lock = locks.get(uri); if(lock != null && lock.sessionId != null){ if(lock.sessionId.equals(sessionId)){ lock.sessionId = null; } } } public int getStatus(String sessionID, String uri){ int result = UNLOCKED; ClipLock lock = locks.get(uri); if(lock != null){ if(sessionID.equals(lock.sessionId)){ result = HAS_KEY; lock.lastUpdate = timeGetter.currentTime(); }else{ if(lock.sessionId == null){ result = UNLOCKED; }else{ result = LOCKED; } } } return result; } public void cleanOldLocks(){ long now = timeGetter.currentTime(); Iterator<ClipLock> iter = locks.values().iterator(); while(iter.hasNext()){ ClipLock lock = iter.next(); if(now - lock.lastUpdate > EXPIRY_TIME){ lock.sessionId = null;//Unlock } } } private class ClipLock{ String sessionId; long lastUpdate; public ClipLock(String sessionId, long lastUpdate) { this.sessionId = sessionId; this.lastUpdate = lastUpdate; } } }