All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.firefly.server.session.LocalHttpSessionManager Maven / Gradle / Ivy

package com.firefly.server.session;

import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;

import com.firefly.server.http.Config;
import com.firefly.utils.time.HashTimeWheel;
import com.firefly.utils.time.Millisecond100Clock;

public class LocalHttpSessionManager implements HttpSessionManager {

	private ConcurrentHashMap map = new ConcurrentHashMap();
	private Config config;
	
	private static final HashTimeWheel timeWheel = new HashTimeWheel();
	static {
		timeWheel.start();
	}

	public LocalHttpSessionManager(Config config) {
		this.config = config;
	}

	@Override
	public boolean containsKey(String id) {
		return map.containsKey(id);
	}

	@Override
	public HttpSession remove(String id) {
		HttpSession session = map.remove(id);
		if (session != null)
			config.getHttpSessionListener().sessionDestroyed(new HttpSessionEvent(session));

		return session;
	}

	@Override
	public HttpSession get(String id) {
		return map.get(id);
	}

	@Override
	public HttpSession create() {
		String id = UUID.randomUUID().toString().replace("-", "");
		long timeout = config.getMaxSessionInactiveInterval() * 1000;
		HttpSessionImpl session = new HttpSessionImpl(this, id,
				Millisecond100Clock.currentTimeMillis(),
				config.getMaxSessionInactiveInterval());
		timeWheel.add(timeout, new TimeoutTask(session));
		map.put(id, session);
		config.getHttpSessionListener().sessionCreated(new HttpSessionEvent(session));
		return session;
	}

	@Override
	public int size() {
		return map.size();
	}

	private class TimeoutTask implements Runnable {
		private HttpSessionImpl session;

		public TimeoutTask(HttpSessionImpl session) {
			this.session = session;
		}

		@Override
		public void run() {
			long t = Millisecond100Clock.currentTimeMillis() - session.getLastAccessedTime();
			long timeout = session.getMaxInactiveInterval() * 1000;
			// System.out.println(timeout + "|" + t);
			if (t > timeout) {
				// System.out.println("removie session id: " + session.getId());
				remove(session.getId());
			} else {
				if (timeout > 0) {
					long nextCheckTime = timeout - t;
					timeWheel.add(nextCheckTime, TimeoutTask.this);
				} else if (timeout == 0) {
					remove(session.getId());
				}
			}
		}

	}

	@Override
	public Config getConfig() {
		return config;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy