aslcore/src/org/gcube/application/framework/core/session/SessionManager.java

76 lines
2.1 KiB
Java

package org.gcube.application.framework.core.session;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class SessionManager {
protected static Thread thread = new CleanSessionThread();
protected static SessionManager sessionManager = new SessionManager();
protected HashMap<String, D4ScienceSession> sessions;
protected SessionManager() {
sessions = new HashMap<String, D4ScienceSession>();
thread.setDaemon(true);
thread.start();
}
public static SessionManager getInstance() {
return sessionManager;
}
public D4ScienceSession getD4ScienceSession(String externalSessionID, String username)
{
D4ScienceSession session = sessions.get(externalSessionID + "_" + username);
if(session == null || !session.isValid() || !session.getUsername().equals(username))
{
session = new D4ScienceSession(externalSessionID, username);
sessions.put(externalSessionID + "_" + username, session);
}
return session;
}
@Override
protected void finalize() throws Throwable {
thread.interrupt();
System.out.println(new Date(System.currentTimeMillis()) + " clean thread was interrupted");
thread.join();
System.out.println(new Date(System.currentTimeMillis()) + " clean thread was joint");
super.finalize();
}
protected static class CleanSessionThread extends Thread
{
public void run()
{
while(true)
{
try {
Thread.sleep(600000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(new Date(System.currentTimeMillis()) + " clean thread was interrupted (in clean thread)");
break;
}
//TODO: cleanup invalid sessions: add locks...
Set<String> keys = sessionManager.sessions.keySet();
Iterator<String> iter = keys.iterator();
while(iter.hasNext())
{
String extSessionID = iter.next();
if(!sessionManager.sessions.get(extSessionID).isValid())
{
sessionManager.sessions.remove(extSessionID);
}
}
}
System.out.println(new Date(System.currentTimeMillis()) + " clean thread was terminated");
}
}
}