package no.ntnu.fp.model; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Iterator; /** * The <code>Project</code> class is a list of zero or more {@link Person} objects. * * @author Thomas Østerlie * @version $Revision: 1.9 $ - $Date: 2005/02/22 07:53:33 $ * */ public class Project implements PropertyChangeListener { /** * The member variable storing all registered {@link Person} objects. */ private java.util.ArrayList personList; /** * This member variable provides functionality for notifying of changes to * the <code>Project</code> class. */ private java.beans.PropertyChangeSupport propChangeSupp; /** * Default constructor. Must be called to initialise the object's member variables. * */ public Project() { personList = new java.util.ArrayList(); propChangeSupp = new java.beans.PropertyChangeSupport(this); } /** * Returns the number of {@linkplain #addPerson(Person) <code>Person</code> objects * registered} with this class. * * @return The number of {@link Person} objects in this class. */ public int getPersonCount() { return personList.size(); } /** * Returns the {@link Person} object at the specified position in the list. * * @param i Index of object to return. * * @return The {@link Person} object at the specified position in the list. */ public Person getPerson(int i) { return (Person)personList.get(i); } /** * Returns the index of the first occurrence of the specified object, or * -1 if the list does not contain this object. * * @param obj Object to search for. * * @return The index in this list of the first occurrence of the specified element, * or -1 if this list does not contain this element. */ public int indexOf(Object obj) { return personList.indexOf(obj); } /** * Returns an iterator over the elements in this list in proper sequence.<P> * * @return A {@link java.util.Iterator} over the elements in this list in proper sequence. * * @see java.util.Iterator <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html">java.util.Iterator</a>. */ public Iterator iterator() { return personList.iterator(); } /** * Adds a new {@link Person} object to the <code>Project</code>.<P> * * Calling this method will invoke the * <code>propertyChange(java.beans.PropertyChangeEvent)</code> method on * all {@linkplain * #addPropertyChangeListener(java.beans.PropertyChangeListener) registered * <code>PropertyChangeListener<code> objecs}. The {@link java.beans.PropertyChangeEvent} * passed with the {@link java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)} * method has the following characteristics: * * <ul> * <li>the <code>getNewValue()</code> method returns the {@link Person} object added</li> * <li>the <code>getOldValue()</code> method returns <code>null</code></li> * <li>the <code>getSource()</code> method returns this {@link Project} object * </ul> * * @param person The {@link Person} object added. * * @see java.beans.PropertyChangeListener <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/PropertyChangeListener.html">java.beans.PropertyChangeListener</a> * @see java.beans.PropertyChangeEvent <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/PropertyChangeEvent.html">java.beans.PropertyChangeEvent</a> */ public void addPerson(Person person) { personList.add(person); person.addPropertyChangeListener(this); propChangeSupp.firePropertyChange("person", null, person); } /** * Removes the specified {@link Person} object from the <code>Project</code>.<P> * * Calling this method will invoke the * <code>propertyChange(java.beans.PropertyChangeEvent)</code> method on * all {@linkplain * #addPropertyChangeListener(java.beans.PropertyChangeListener) registered * <code>PropertyChangeListener<code> objecs}. The {@link java.beans.PropertyChangeEvent} * passed with the {@link java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)} * method has the following characteristics: * * <ul> * <li>the <code>getNewValue()</code> method returns an {@link java.lang.Integer} object * with the index of the removed element</li> * <li>the <code>getOldValue()</code> method returns the {@link Person} object added</li> * <li>the <code>getSource()</code> method returns this {@link Project} object * </ul> * * @param person The {@link Person} object to be removed. * * @see java.beans.PropertyChangeListener <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/PropertyChangeListener.html">java.beans.PropertyChangeListener</a> * @see java.beans.PropertyChangeEvent <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/beans/PropertyChangeEvent.html">java.beans.PropertyChangeEvent</a> */ public void removePerson(Person person) { int i = personList.indexOf(person); Integer index = new Integer(i); personList.remove(person); person.removePropertyChangeListener(this); propChangeSupp.firePropertyChange("person", person, index); } /** * Add a {@link java.beans.PropertyChangeListener} to the listener list. * * @param listener The {@link java.beans.PropertyChangeListener} to be added. */ public void addPropertyChangeListener(PropertyChangeListener listener) { propChangeSupp.addPropertyChangeListener(listener); } /** * Remove a {@link java.beans.PropertyChangeListener} from the listener list. * * @param listener The {@link java.beans.PropertyChangeListener} to be removed. */ public void removePropertyChangeListener(PropertyChangeListener listener) { propChangeSupp.removePropertyChangeListener(listener); } public void propertyChange(PropertyChangeEvent event) { propChangeSupp.firePropertyChange(event); } /** * {@inheritDoc} */ public boolean equals(Object o) { if (super.equals(o)) return true; if (o.getClass() != this.getClass()) return false; Project aProject = (Project)o; if (aProject.getPersonCount() != getPersonCount()) return false; Iterator it = this.iterator(); while (it.hasNext()) { Person aPerson = (Person)it.next(); if (aProject.indexOf(aPerson) < 0) return false; } return true; } /** * {@inheritDoc} */ public String toString() { String s = "project:\n"; Iterator it = this.iterator(); while (it.hasNext()) { s += it.next().toString() + "\n"; } return s; } }