
// Author: Josh Holtrop
// Date: 2008-10-30
// CS656
// Lab Excersize 3

import java.util.*;
import java.io.Serializable;

/**
 * This class implements the PresenceService interface using Chord.
 * It provides a presence service for the chat system.
 */
public class PresenceServiceImpl implements PresenceService
{
    ChordClient myChordClient;

	public PresenceServiceImpl(ChordClient chordClient)
	{
        myChordClient = chordClient;
	}

    /* a user calls this method to register with the presence service */
    public void register(RegistrationInfo reg)
	{
	    StringKey userName = new StringKey(reg.getUserName());
	    try {
            myChordClient.chord().insert(userName, reg);
        } catch (Exception e) {
            e.printStackTrace();
        }
	}

    /* a user calls this method to unregister with the presence service */
    public void unregister(String userName)
	{
	    StringKey userNameKey = new StringKey(userName);
	    try {
            myChordClient.chord().remove(userNameKey, lookup(userName));
        } catch (Exception e) {
            e.printStackTrace();
        }
	}

    /* a user calls this method to get the registration information
     * for another user by name */
    public RegistrationInfo lookup(String name)
	{
	    StringKey userNameKey = new StringKey(name);
	    try {
            Set<Serializable> vals = myChordClient.chord().retrieve(userNameKey);
            Iterator<Serializable> it = vals.iterator();
            if (it.hasNext())
            {
                RegistrationInfo data = (RegistrationInfo) it.next();
                return data;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
	    return null;
	}

    /* called when a user wishes to leave the network */
	public void leave()
    {
        try
        {
            myChordClient.chord().leave();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
