package org.openslx.imagemaster.serversession; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; import org.apache.log4j.Logger; import org.openslx.imagemaster.session.SessionManager; import org.openslx.imagemaster.thrift.iface.ServerSessionData; import org.openslx.imagemaster.util.Hash; /** * Manages all server sessions and kicks timed out sessions. */ public class ServerSessionManager { private static Logger log = Logger.getLogger( SessionManager.class ); // Map of currently known sessions private static final Map serverSessions = new LinkedHashMap(); private static final Thread gcThread; public static ServerSessionData addSession( ServerSession serverSession ) { final String sessionId = Hash.sha256( UUID.randomUUID().toString() ); synchronized ( serverSessions ) { serverSessions.put( sessionId, serverSession ); } return new ServerSessionData( sessionId ); } public static ServerSession getSession( String sessionId ) { final ServerSession serverSession; synchronized ( serverSessions ) { serverSession = serverSessions.get( sessionId ); } if ( serverSession == null || serverSession.timedOut() ) { return null; } serverSession.refresh(); return serverSession; } static { gcThread = new Thread( new Runnable() { @Override public void run() { for ( ;; ) { try { Thread.sleep( 1800L * 1000L ); } catch ( InterruptedException e ) { } synchronized ( serverSessions ) { Iterator it = serverSessions.values().iterator(); while ( it.hasNext() ) { final ServerSession s = it.next(); if ( s.timedOut() ) { log.debug( "Removing old session of " + s.getOrganization() ); it.remove(); } } } } } } ); gcThread.start(); } }