package org.openslx.imagemaster.serversession; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import org.openslx.bwlp.thrift.iface.ServerSessionData; import org.openslx.imagemaster.util.Hash; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; /** * Manages all server sessions and kicks timed out sessions. */ public class ServerSessionManager { // Map of currently known sessions private static final Map serverSessions = new LinkedHashMap(); 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 { QuickTimer.scheduleAtFixedDelay( new Task() { @Override public void fire() { synchronized ( serverSessions ) { Iterator it = serverSessions.values().iterator(); while ( it.hasNext() ) { final ServerSession s = it.next(); if ( s.timedOut() ) { it.remove(); } } } } }, 911, TimeUnit.MINUTES.toMillis( 14 ) ); } }