/* * This file is part of the Echo Web Application Framework (hereinafter "Echo"). * Copyright (C) 2002-2009 NextApp, Inc. * * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. */ package echo2example.chatserver; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * A store of active users. */ public class UserManager { /** * User timeout (15min * 60sec/min * 1000ms/sec). */ private static final int TIMEOUT_MS = 15 * 60 * 1000; /** * User name to <code>User</code> mapping. */ private Map userMap = new HashMap(); /** * Attempts to add a new user. * * @param userName the name of the user * @return an authentication token, if the user name is available or * null if it is not */ public String add(String userName) { // Ensure no leading/trailing spaces are present in user name. if (userName.length() != userName.trim().length()) { return null; } // Ensure user name is at least two characters in length. if (userName.length() < 2) { return null; } User user = null; synchronized (userMap) { // Ensure user name is available. if (userMap.containsKey(userName)) { return null; } user = new User(userName); userMap.put(userName, user); } return user.getAuthToken(); } /** * Authenticates a user based on user name and an authentication token. * * @param userName the user's name * @param authToken the authentication token * @return true if the user is authenticated */ public boolean authenticate(String userName, String authToken) { User user = (User) userMap.get(userName); if (user == null) { return false; } return user.authenticate(authToken); } /** * Performs clean-up operations, i.e., removing stale users. */ public void purge() { long time = System.currentTimeMillis(); synchronized (userMap) { Iterator userNameIt = userMap.keySet().iterator(); while (userNameIt.hasNext()) { String userName = (String) userNameIt.next(); User user = (User) userMap.get(userName); if (time - user.getLastActionTime() > TIMEOUT_MS) { userNameIt.remove(); } } } } /** * Removes the specified user. * * @param userName the user's name */ public void remove(String userName) { synchronized (userMap) { userMap.remove(userName); } } /** * @see java.lang.Object#toString() */ public String toString() { StringBuffer out = new StringBuffer(); synchronized (userMap) { Iterator it = userMap.keySet().iterator(); while (it.hasNext()) { out.append(it.next()); if (it.hasNext()) { out.append(", "); } } } return out.toString(); } }