summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/session/SessionManager.java
diff options
context:
space:
mode:
authorSimon Rettberg2014-03-28 17:51:24 +0100
committerSimon Rettberg2014-03-28 17:51:24 +0100
commitfbbfee0a32ce83f5bfe36d78eddafed7226a041c (patch)
treef3d44e8b9e2bca678165cb3dd97ec1aa1380f244 /src/main/java/org/openslx/imagemaster/session/SessionManager.java
downloadmasterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.gz
masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.xz
masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.zip
Initial Commit
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/session/SessionManager.java')
-rw-r--r--src/main/java/org/openslx/imagemaster/session/SessionManager.java73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/session/SessionManager.java b/src/main/java/org/openslx/imagemaster/session/SessionManager.java
new file mode 100644
index 0000000..cc68d0b
--- /dev/null
+++ b/src/main/java/org/openslx/imagemaster/session/SessionManager.java
@@ -0,0 +1,73 @@
+package org.openslx.imagemaster.session;
+
+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.thrift.iface.SessionData;
+import org.openslx.imagemaster.util.Hash;
+
+/**
+ * Class for managing active user sessions. This class and all its function are
+ * (supposed to be) thread-safe.
+ */
+public class SessionManager
+{
+ private static Logger log = Logger.getLogger( SessionManager.class );
+
+ // Map of currently known sessions
+ private static final Map<String, Session> sessions = new LinkedHashMap<>();
+ private static final Thread gcThread;
+
+ public static SessionData addSession( Session session )
+ {
+ final String authToken = Hash.md5( UUID.randomUUID().toString() );
+ final String sessionId = Hash.sha256( UUID.randomUUID().toString() );
+
+ synchronized ( sessions ) {
+ sessions.put( authToken, session );
+ }
+ return new SessionData( sessionId, authToken, session.getSatelliteAddress() );
+ }
+
+ public static Session getSession( String token )
+ {
+ final Session session;
+ synchronized ( sessions ) {
+ session = sessions.get( token );
+ }
+ if ( session == null || session.timedOut() ) {
+ return null;
+ }
+ return session;
+ }
+
+ static {
+ gcThread = new Thread( new Runnable() {
+ @Override
+ public void run()
+ {
+ for ( ;; ) {
+ try {
+ Thread.sleep( 1800L * 1000L );
+ } catch ( InterruptedException e ) {
+ }
+ synchronized ( sessions ) {
+ Iterator<Session> it = sessions.values().iterator();
+ while ( it.hasNext() ) {
+ final Session s = it.next();
+ if ( s.timedOut() ) {
+ log.debug( "Removing old session of " + s.getUserId() );
+ it.remove();
+ }
+ }
+ }
+ }
+ }
+ } );
+ gcThread.start();
+ }
+
+}