package com.limegroup.gnutella.security;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import com.limegroup.gnutella.settings.SecuritySettings;
import com.limegroup.gnutella.util.FileUtils;
import com.util.LOG;
/**
* Maintains user's information for variety of services
* Note: Implements Singleton Design Pattern
* @author Anurag Singla
*/
public class Cookies implements Serializable
{
//NOTE that the User information in a cookie always have the domains
//authenticated, as default only
//This is however not a problem, as only username and password are used from
//the User info contained in a cookie
/**
* Map from hostname/IPAddressString to corresponding user authentication
* info for the host (String -> User)
*/
private Map /* of String -> User */ _hostUserInfoMap = new HashMap();
/**
* an instance of Cookies
* Note: Implements Singleton Design Pattern
*/
private static Cookies _instance = new Cookies();
/**
* Returns an instance of Cookies
* Note: Implements Singleton Design Pattern
*/
public static Cookies instance()
{
//return the initialized instance
return _instance;
}
/**
* Initializes the Cookies from file
*/
private void initialize()
{
//load the mappings from file
try
{
//read from file
_hostUserInfoMap = readCookies();
}
catch(Exception e)
{
//if not able to read from file, create a new instance
// e.printStackTrace();
_hostUserInfoMap = new HashMap();
}
}
/**
* Creates new Cookies
* Note: Implements Singleton Design Pattern
*/
protected Cookies()
{
//initialize the map
initialize();
}
/**
* Reads the cookies from the file
* @return Map from hostname to corresponding user authentication
* info for the host (String -> User)
*/
private Map readCookies() throws IOException, ClassNotFoundException
{
return FileUtils.readMap(
SecuritySettings.COOKIES_FILE);
}
/**
* Returns the user data corresponding to the given host name
* @param host The name of the host for whom the corresponding information
* is requested.
* @return The user data corresponding to the given host
* Returns null if no data exists for the given host
*/
public synchronized User getUserInfo(String host)
{
//get the data from the map
return (User)_hostUserInfoMap.get(host);
}
/**
* Adds the passed user info for the given host
* @param host The name of the host for whom to add information
* @param user The user info to be added
*
*/
public synchronized void putCookie(String host, User user)
{
//add the cookie
_hostUserInfoMap.put(host, user);
}
/**
* Saves the cookies to file
*/
public void save()
{
try
{
Map clone;
synchronized(this)
{
clone = (Map)((HashMap)_hostUserInfoMap).clone();
}
//save to file
// FileUtils.writeMap(SecuritySettings.COOKIES_FILE, clone);
}
catch(Exception e)
{
//nothing we can do
//just print the exception
e.printStackTrace();
}
}
/**
* returns the string representation of the contents
* @return the string representation of the contents
*/
public String toString()
{
return _hostUserInfoMap.toString();
}
//Unit Test
public static void main(String[] args)
{
LOG.info(Cookies.instance().toString());
}
}