From 3bb3c7a8e721f9c398ee404aa0299084bcec9c17 Mon Sep 17 00:00:00 2001 From: marcins78 Date: Wed, 9 Jan 2013 17:15:42 +0000 Subject: [PATCH] Expire of users logged. --- .../lotro/async/LoggedUserHolder.java | 84 +++++++++++++++---- .../async/LotroServerPipelineFactory.java | 5 +- 2 files changed, 74 insertions(+), 15 deletions(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LoggedUserHolder.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LoggedUserHolder.java index 1f6dfcc94..e7ea2d7cb 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LoggedUserHolder.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LoggedUserHolder.java @@ -2,34 +2,63 @@ package com.gempukku.lotro.async; import org.jboss.netty.handler.codec.http.Cookie; import org.jboss.netty.handler.codec.http.CookieDecoder; -import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.COOKIE; import org.jboss.netty.handler.codec.http.HttpRequest; import java.util.*; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.COOKIE; public class LoggedUserHolder { + private long _loggedUserExpireLength = 1000 * 60 * 10; + private long _expireCheckInterval = 1000 * 60; + private Map _users = Collections.synchronizedMap(new HashMap()); + private Map _lastAccess = Collections.synchronizedMap(new HashMap()); + private ReadWriteLock _readWriteLock = new ReentrantReadWriteLock(); + private ClearExpiredRunnable _clearExpiredRunnable; + + public void start() { + _clearExpiredRunnable = new ClearExpiredRunnable(); + Thread thr = new Thread(_clearExpiredRunnable); + thr.start(); + } public String getLoggedUser(HttpRequest request) { - CookieDecoder cookieDecoder = new CookieDecoder(); - Set cookies = cookieDecoder.decode(request.getHeader(COOKIE)); - for (Cookie cookie : cookies) { - if (cookie.getName().equals("loggedUser")) { - String value = cookie.getValue(); - if (value != null) { - String loggedUser = _users.get(value); - if (loggedUser != null) - return loggedUser; + _readWriteLock.readLock().lock(); + try { + CookieDecoder cookieDecoder = new CookieDecoder(); + Set cookies = cookieDecoder.decode(request.getHeader(COOKIE)); + for (Cookie cookie : cookies) { + if (cookie.getName().equals("loggedUser")) { + String value = cookie.getValue(); + if (value != null) { + String loggedUser = _users.get(value); + if (loggedUser != null) { + _lastAccess.put(value, System.currentTimeMillis()); + return loggedUser; + } + } } } + return null; + } finally { + _readWriteLock.readLock().unlock(); } - return null; } public Map logUser(String userName) { - Map cookies = new HashMap(); - cookies.put("loggedUser", insertValueForUser(userName)); - return cookies; + _readWriteLock.readLock().lock(); + try { + Map cookies = new HashMap(); + String userValue = insertValueForUser(userName); + cookies.put("loggedUser", userValue); + _lastAccess.put(userValue, System.currentTimeMillis()); + return cookies; + } finally { + _readWriteLock.readLock().unlock(); + } } private char[] _chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray(); @@ -46,4 +75,31 @@ public class LoggedUserHolder { _users.put(randomStr, userName); return randomStr; } + + private class ClearExpiredRunnable implements Runnable { + @Override + public void run() { + while (true) { + _readWriteLock.writeLock().lock(); + try { + Iterator> iterator = _lastAccess.entrySet().iterator(); + if (iterator.hasNext()) { + Map.Entry lastAccess = iterator.next(); + if (lastAccess.getValue() > System.currentTimeMillis() + _loggedUserExpireLength) { + String userValue = lastAccess.getKey(); + _users.remove(userValue); + iterator.remove(); + } + } + try { + Thread.sleep(_expireCheckInterval); + } catch (InterruptedException exp) { + + } + } finally { + _readWriteLock.writeLock().unlock(); + } + } + } + } } diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroServerPipelineFactory.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroServerPipelineFactory.java index 760d41b30..1bdc4f1a6 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroServerPipelineFactory.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroServerPipelineFactory.java @@ -28,7 +28,10 @@ public class LotroServerPipelineFactory implements ChannelPipelineFactory { ServerBuilder.fillObjectMap(objects); ServerBuilder.constructObjects(objects); - objects.put(LoggedUserHolder.class, new LoggedUserHolder()); + LoggedUserHolder loggedUserHolder = new LoggedUserHolder(); + loggedUserHolder.start(); + objects.put(LoggedUserHolder.class, loggedUserHolder); + LongPollingSystem longPollingSystem = new LongPollingSystem(); longPollingSystem.start(); objects.put(LongPollingSystem.class, longPollingSystem);