package com.diodesoftware.scb.clipboard;
import org.apache.log4j.Logger;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: rob
* Date: Jun 27, 2007
* Time: 9:41:23 PM
* To change this template use File | Settings | File Templates.
*/
public class ClipStatus {
private Map<String, Map<String, CurrentStatus>> uris = new HashMap<String, Map<String, CurrentStatus>>();
private Map<String, Long> lastEditMap = new HashMap<String, Long>();
private static ClipStatus instance = null;
private Map<String, Map<String, Boolean>> accessMap = new HashMap<String, Map<String, Boolean>>();
private static Logger log = Logger.getLogger(ClipStatus.class);
private ClipStatus(){
}
public static ClipStatus getInstance(){
if(instance == null)
instance = new ClipStatus();
return instance;
}
public void grantAccess(String sessionKey, String uri){
synchronized(accessMap){
Map<String, Boolean> map = accessMap.get(sessionKey);
if(map == null){
map = new HashMap<String, Boolean>();
accessMap.put(sessionKey, map);
}
map.put(uri, true);
log.debug("Access Granted to [" + sessionKey + "] URI [" + uri + "]");
}
}
public boolean hasAccess(String sessionKey, String uri){
synchronized(accessMap){
Map map = accessMap.get(sessionKey);
if(map == null){
log.debug("Access denied to [" + uri + "] session [" + sessionKey + "]");
return false;
}
log.debug("Access to [" + sessionKey + "] URI [" + uri + "] Granted [" + (Boolean)map.get(uri) + "]");
if(map.containsKey(uri))
return (Boolean)map.get(uri);
return false;
}
}
public void setStatus(String sessionKey, String uri, int status, long lastEdit) {
synchronized (uris) {
Map<String, CurrentStatus> map = uris.get(uri);
if (map == null) {
map = new HashMap<String, CurrentStatus>();
uris.put(uri, map);
}
CurrentStatus cStatus = map.get(sessionKey);
if (cStatus == null) {
cStatus = new CurrentStatus();
map.put(sessionKey, cStatus);
}
cStatus.lastUpdate = System.currentTimeMillis();
cStatus.status = status;
}
synchronized(lastEditMap){
lastEditMap.put(uri, lastEdit);
}
}
public int[] getStatus(String uri) {
int viewers = 0;
int editors = 0;
synchronized (uris) {
Map<String, CurrentStatus> map = uris.get(uri);
if (map == null) {
return new int[]{0, 0};
}
Iterator<CurrentStatus> iter = map.values().iterator();
while (iter.hasNext()) {
if (iter.next().status == 1)
editors++;
else
viewers++;
}
}
return new int[]{viewers, editors};
}
public long getLastEdit(String uri){
long result = 0;
synchronized(lastEditMap){
result = lastEditMap.get(uri);
}
return result;
}
public void cleanOld(){
long now = System.currentTimeMillis();
long max = 60*1000;
synchronized(uris){
List<String> sessionsToClean = new ArrayList<String>();
Iterator<Map<String, CurrentStatus>> alpha = uris.values().iterator();
while(alpha.hasNext()){
Map<String, CurrentStatus> m = alpha.next();
Iterator<String> iter = m.keySet().iterator();
while(iter.hasNext()){
String sessionKey = iter.next();
CurrentStatus cs = m.get(sessionKey);
if(now - cs.lastUpdate > max){
sessionsToClean.add(sessionKey);
}
}
iter = sessionsToClean.iterator();
while(iter.hasNext()){
m.remove(iter.next());
}
}
}
}
class CurrentStatus {
int status;
long lastUpdate;
}
}