package sso;

import java.sql.*;
import java.util.*;
import sso.event.*;

public class Group extends Persistant
{
	protected Vector group;
	protected Vector propertyChangeListeners;

	/**
	 *  Constructor. Not to be called directly.
     */
	protected Group()
	{
		super();

System.err.println("..back in Group constructor");

		group = new Vector();
		propertyChangeListeners = new Vector();
	}

	/**
	 *  Create a new Group.
	 */
	public static Group createGroup()
	{
		Group g = new Group();

		g.init();

		return g;
	}

	/**
	 *  Initializer.
	 */
	protected void init()
	{
		super.init();

	}

	/**
	 *  Get the group members.
	 */
	public Vector getMembers()
	{
		return group;
	}

	/**
	 *  Add a group member.
	 */
	public void addMember(PC go)
	{
		group.addElement(go);
		propertyChange("group");
	}

	/**
	 *  Remove a group member.
	 */
	public void removeMember(PC go)
	{
		group.removeElement(go);
		propertyChange("group");
	}

	/**
	 *  Create the table rows needed to store the group.
	 */
	protected void createRows()
	{
		super.createRows();
	}

	/**
	 *  Store the group.
	 */
	public void store()
	{
System.out.print("calling super.store() from Group...");

		super.store();
		Statement stmt = null;

		try
		{
			stmt = Persistant.getStatement();

			// remove the old instances
			stmt.executeUpdate("DELETE FROM Group_PCs WHERE group_id=" + getID());

			// insert the current instances
			for (Enumeration en = group.elements(); en.hasMoreElements(); )
			{
				stmt.executeUpdate("INSERT INTO Group_PCs SET group_id=" + getID()
				+ ", pc_id=" + ((PC)en.nextElement()).getID());
			}

			stmt.close();
			stmt = null;
		}
		catch (SQLException e)
		{
			System.err.println("Trying to insert Group (" + getID() + "): " +
			e.getMessage());
		}

		if (stmt != null)
		{
			try
			{
				stmt.close();
			}
			catch (SQLException e)
			{
				//
			}

			stmt = null;
		}
	}

	/**
	 *  Load a group object.
	 */
	public static Group loadGroup(int id)
	{
		Group g = null;

		if (Registry.isLoaded(id))
		{
			return (Group)Registry.get(id);
		}
		else
		{
			g = new Group();
			g.id = id;
			g.load();
		}

		return g;
	}

	/**
	 *  Load the group object from the database.
	 */
	protected void load()
	{
		super.load();

		Statement stmt = null;
		ResultSet rs = null;

		try
		{
			stmt = Persistant.getStatement();
			rs = stmt.executeQuery("SELECT pc_id FROM Group_PCs WHERE group_id=" + getID());
			
			while (rs.next())
			{
				addMember(PC.loadPC(rs.getInt("pc_id")));
			}

			rs.close();
			rs = null;

			stmt.close();
			stmt = null;
		}
		catch (SQLException e)
		{
			System.err.println("Trying to load Group (" + getID() + "): " +
			e.getMessage());
		}

		if (rs != null)
		{
			try
			{
				rs.close();
			}
			catch (SQLException e)
			{
				//
			}

			rs = null;
		}

		if (stmt != null)
		{
			try
			{
				stmt.close();
			}
			catch (SQLException e)
			{
				//
			}

			rs = null;
		}
	}

	/**
     *  Remove the group object completely.
	 */
	public void unregister()
	{
		// remove members of the group
		Vector vg = (Vector)getMembers().clone();

		for (int i = 0; i < vg.size(); i++)
		{
			((PC)vg.elementAt(i)).leaveGroup();
		}
	
		// remove from db
		Statement stmt = null;

		try
		{
			stmt = Persistant.getStatement();

			stmt.executeUpdate("DELETE FROM Group_PCs WHERE group_id=" +
			getID());

			stmt.close();
			stmt = null;
		}
		catch (SQLException e)
		{
			System.err.println("Trying to remove Group (" + id + "): " +
			e.getMessage());
		}

		if (stmt != null)
		{
			try
			{
				stmt.close();
			}
			catch (SQLException e)
			{
				//
			}

			stmt = null;
		}

		super.unregister();
	}

	// EVENTS
	public void addPropertyChangeListener(PropertyChangeListener pl)
	{
		propertyChangeListeners.addElement(pl);
	}

	public void removePropertyChangeListeners(PropertyChangeListener pl)
	{
		propertyChangeListeners.removeElement(pl);
	}

	protected void propertyChange(String propname)
	{
		PropertyChangeEvent pe = new PropertyChangeEvent(this, propname);

		Vector pl = (Vector)propertyChangeListeners.clone();

		for (int i = 0; i < pl.size(); i++)
		{
			((PropertyChangeListener)pl.elementAt(i)).notifyPropertyChange(pe);
		}
	}


	/**
	 *  Tester
	 */
	public static void main(String [] args)
	{
		Group g = Group.createGroup();

		PC go1 = PC.createPC();
		PC go2 = PC.createPC();

		go1.store();
		go2.store();

		g.addMember(go1);
		g.addMember(go2);

System.out.println("***created Group***");

		try
		{
			Thread.sleep(15000);
		}
		catch (InterruptedException e)
		{
			//
		}

		g.store();

		int id = g.getID();

		g = null;

System.out.println("*** stored group ***");

		try
		{
			Thread.sleep(15000);
		}
		catch (InterruptedException e)
		{
			//
		}

		g = Group.loadGroup(id);

		PC go3 = null;
		for (Enumeration en = g.getMembers().elements(); en.hasMoreElements();)
		{
			System.out.println((go3 = (PC)en.nextElement()).getID());
		}

		g.removeMember(go3);

		g.store();

		try
		{
			Thread.sleep(15000);
		}
		catch (InterruptedException e)
		{
			//
		}

		g.unregister();
		go1.unregister();
		go2.unregister();
	}
		
}
			

