/*
* UserManager.java
*
* Created on October 22, 2001, 11:45 AM
*/
package com.limegroup.gnutella.security;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.limegroup.gnutella.util.FileUtils;
import com.limegroup.gnutella.xml.LimeXMLProperties;
import com.util.LOG;
/**
* Manages the user authentication data
* Note: Implements Singleton Design Pattern
* Note: The methods in this class are synchronized, as different processes
* may be accessing same instance. And so the process using this class
* doesnt have enough information to figure out when to synchronize.
* @author Anurag Singla
*/
public class UserManager
{
//NOTE that this class uses com.limegroup.gnutella.xml.LimeXMLProperties
//class for UserMap property
//This should eventually be changed to use SettingsManager, as and when
//the directory conventions for two property files are standardized
/**
* Mapping from username to user information. (String -> User)
*/
private Map /* String -> User */ _userMap = new HashMap();
/**
* an instance of UserManager
* Note: Implements Singleton Design Pattern
*/
private static UserManager _instance = new UserManager();
/**
* Returns an instance of UserManager
* Note: Implements Singleton Design Pattern
*/
public static UserManager instance()
{
//return the initialized instance
return _instance;
}
/**
* Initializes the UserManager from file
* @modifies _instance
*/
private void initialize()
{
//load the userMap from file
try
{
//read from file
_userMap = readUserMap();
}
catch(Exception e)
{
//if not able to read from file, create a new instance
_userMap = new HashMap();
}
}
/**
* Creates new UserManager
* Note: Implements Singleton Design Pattern
*/
private UserManager()
{
//initialize the map
initialize();
}
/**
* Writes the user information map to corresponding file
* @param userMap The map to be stored
*/
private static void writeUserMap(Map userMap)
throws IOException, ClassNotFoundException
{
FileUtils.writeMap(
LimeXMLProperties.instance().getUserMapFile(), userMap);
}
/**
* Reads the user information map from the file where it is stored
* @return The map that was read
*/
private static Map readUserMap()
throws IOException, ClassNotFoundException
{
return FileUtils.readMap(
LimeXMLProperties.instance().getUserMapFile());
}
/**
* Returns the user data corresponding to the given username
* @param username Unique name identifying the user, whose information
* is requested.
* @return The user data corresponding to the given username.
* Returns null if no data exists for the given user (i.e. UserManager
* doesnt know about this user)
*/
public synchronized User getUser(String username)
{
//get the data from the map
return (User)_userMap.get(username);
}
/**
* Adds the passed user to the list of users. If a user exists earlier
* with the same username as the passed user, its old information
* is replaced by the new data passed.
* @param user The user to be added
*
*/
public synchronized void putUser(User user)
{
//add the user to the map
_userMap.put(user.getUsername(),user);
}
/**
* Returns all the users
* @return all the users.
*/
public synchronized String[] getAllUsers()
{
return (String[])_userMap.keySet().toArray(new String[0]);
}
/**
* Removes the user data corresponding to the given username
* @param username Unique name identifying the user, who has to
* be deleted.
*
*/
public synchronized void removeUser(String username)
{
//remove the data from the map
_userMap.remove(username);
}
/**
* Saves the user map to file
*/
public void save()
{
try
{
Map clone;
synchronized(this)
{
clone = (Map)((HashMap)_userMap).clone();
}
//save to file
writeUserMap(clone);
}
catch(Exception e)
{
//nothing we can do
}
}
/**
* returns the string representation of the contents
* @return the string representation of the contents
*/
public synchronized String toString()
{
return _userMap.toString();
}
//Unit Test
public static void main(String[] args)
{
LOG.info(UserManager.instance().toString());
}
}