summaryrefslogblamecommitdiffstats
path: root/dozentenmodulserver/src/main/java/server/SessionManager.java
blob: 75336de05ea608ca5f85b77b20ccff9f24b780f5 (plain) (tree)



















































































                                                                                                             
package server;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;
import org.openslx.imagemaster.thrift.iface.UserInfo;
import org.openslx.thrifthelper.ThriftManager;

/**
 * Manages user sessions. Mainly used to map tokens to users.
 * 
 */
public class SessionManager {

	private static final Logger LOGGER = Logger.getLogger(SessionManager.class);

	private static class Entry {
		private static final long SESSION_TIMEOUT = TimeUnit.DAYS.toMillis(1);
		private final UserInfo user;
		private long validUntil;

		private Entry(UserInfo user) {
			this.user = user;
			this.validUntil = System.currentTimeMillis() + SESSION_TIMEOUT;
		}

		public void touch(long now) {
			this.validUntil = now + SESSION_TIMEOUT;
		}
	}

	// saves the current tokens and the mapped userdata, returning from the server
	private static Map<String, Entry> tokenManager = new ConcurrentHashMap<>();

	/**
	 * Get the user corresponding to the given token. Returns null if the token
	 * is not known, or the session already timed out.
	 * 
	 * @param token
	 *            user's token
	 * @return UserInfo for the matching user
	 */
	public static UserInfo get(String token) {
		Entry e = tokenManager.get(token);
		if (e != null) {
			// User session already cached
			final long now = System.currentTimeMillis();
			if (e.validUntil < now) {
				tokenManager.remove(token);
				return getRemote(token);
			}
			e.touch(now);
			return e.user;
		}
		return getRemote(token);
	}

	/**
	 * Remove session matching the given token
	 * 
	 * @param token
	 */
	public static void remove(String token) {
		tokenManager.remove(token);
	}

	private static UserInfo getRemote(String token) {
		UserInfo ui = null;
		try {
			ui = ThriftManager.getMasterClient().getUserFromToken(token);
		} catch (Exception e) {
			LOGGER.warn("Could not reach master server to query for user token of a client!", e);
		}
		if (ui == null)
			return null;
		tokenManager.put(token, new Entry(ui));
		return ui;
	}

	// TODO: Clean map of old entries periodically

}