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 sessions; protected SessionManager() { sessions = new HashMap(); thread.setDaemon(true); thread.start(); } public static SessionManager getInstance() { return sessionManager; } public ASLSession getASLSession(String externalSessionID, String username) { ASLSession session = sessions.get(externalSessionID + "_" + username); if(session == null || !session.isValid() || !session.getUsername().equals(username)) { session = new ASLSession(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(300000); } 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 keys = sessionManager.sessions.keySet(); Iterator 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"); } } }