package no.ntnu.fp.model;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Date;
/**
* The <code>Person</code> class stores information about a single person.
*
* @author Thomas Østerlie
*
* @version $Revision: 1.5 $ - $Date: 2005/02/20 14:52:29 $
*/
public class Person {
/**
* This member variable holds the person's name.
*/
private String name;
/**
* This member variable holds the person's email address.
*/
private String email;
/**
* This member variable holds the person's date of birth.
*/
private Date dateOfBirth;
/**
* This member variable holds a unique identifier for this object.
*/
private long id;
/**
* This member variable provides functionality for notifying of changes to
* the <code>Group</code> class.
*/
private PropertyChangeSupport propChangeSupp;
/**
* Constant used when calling
* {@link java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)}
* on {@linkplain #addPropertyChangeListener(java.beans.PropertyChangeListener) registered
* <code>PropertyChangeListener<code> objecs} when the person's name is changed.
*
* @see #setName(String) the setName(String) method
*/
public final static String NAME_PROPERTY_NAME = "name";
/**
* Constant used when calling
* {@link java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)}
* on {@linkplain #addPropertyChangeListener(java.beans.PropertyChangeListener) registered
* <code>PropertyChangeListener<code> objecs} when the person's email address is changed.
*
* @see #setEmail(String) the setEmail(String) method
*/
public final static String EMAIL_PROPERTY_NAME = "email";
/**
* Constant used when calling
* {@link java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)}
* on {@linkplain #addPropertyChangeListener(java.beans.PropertyChangeListener) registered
* <code>PropertyChangeListener<code> objecs} when the person's date of birth is changed.
*
* @see #setEmail(String) the setDateOfBirth(java.util.Date) method
*/
public final static String DATEOFBIRTH_PROPERTY_NAME = "dateOfBirth";
/**
* Default constructor. Must be called to initialise the object's member variables.
* The constructor sets the name and email of this person to empty
* {@link java.lang.String}, while the date of birth is given today's date. The
* {@linkplain #getId() id field} is set to current time when the object is created.
*/
public Person() {
name = "";
email = "";
dateOfBirth = new Date();
id = System.currentTimeMillis();
propChangeSupp = new PropertyChangeSupport(this);
}
/**
* Constructs a new <code>Person</code> object with specified name, email, and date
* of birth.
*
* @param name The name of the person.
* @param email The person's e-mail address
* @param dateOfBirth The person's date of birth.
*/
public Person(String name, String email, Date dateOfBirth) {
this();
this.name = name;
this.email = email;
this.dateOfBirth = dateOfBirth;
}
/**
* Assigns a new name to the person.<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 a {@link java.lang.String}
* with the newly assigned name</li>
* <li>the <code>getOldValue()</code> method returns a {@link java.lang.String}
* with the person's old name</li>
* <li>the <code>getPropertyName()</code> method returns a {@link java.lang.String}
* with the value {@link #NAME_PROPERTY_NAME}.</li>
* <li>the <code>getSource()</code> method returns this {@link Person} object
* </ul>
*
* @param name The person's new name.
*
* @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 setName(String name) {
String oldName = this.name;
this.name = name;
PropertyChangeEvent event = new PropertyChangeEvent(this, NAME_PROPERTY_NAME, oldName, name);
propChangeSupp.firePropertyChange(event);
}
/**
* Assigns a new email address to the person.<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 a {@link java.lang.String}
* with the newly assigned email address</li>
* <li>the <code>getOldValue()</code> method returns a {@link java.lang.String}
* with the person's old email address</li>
* <li>the <code>getPropertyName()</code> method returns a {@link java.lang.String}
* with the value {@link #EMAIL_PROPERTY_NAME}.</li>
* <li>the <code>getSource()</code> method returns this {@link Person} object
* </ul>
*
* @param email The person's new email address.
*
* @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 setEmail(String email) {
String oldEmail = this.email;
this.email = email;
PropertyChangeEvent event = new PropertyChangeEvent(this, EMAIL_PROPERTY_NAME, oldEmail, this.email);
propChangeSupp.firePropertyChange(event);
}
/**
* Assigns a new date of birth to the person.<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 a {@link java.util.Date}
* with the newly assigned date of birth</li>
* <li>the <code>getOldValue()</code> method returns a {@link java.util.Date}
* with the person's old date of birth</li>
* <li>the <code>getPropertyName()</code> method returns a {@link java.lang.String}
* with the value {@link #DATEOFBIRTH_PROPERTY_NAME}.</li>
* <li>the <code>getSource()</code> method returns this {@link Person} object
* </ul>
*
* @param dateOfBirth The person's new date of birth.
*
* @see java.beans.PropertyChangeListener <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html">java.util.Date</a>
* @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 setDateOfBirth(Date dateOfBirth) {
Date oldDateOfBirth = this.dateOfBirth;
this.dateOfBirth = dateOfBirth;
PropertyChangeEvent event = new PropertyChangeEvent(this, DATEOFBIRTH_PROPERTY_NAME, oldDateOfBirth, this.dateOfBirth);
propChangeSupp.firePropertyChange(event);
}
/**
* Returns the person's name.
*
* @return The person's name.
*/
public String getName() {
return name;
}
/**
* Returns the person's email address.
*
* @return The person's email address.
*/
public String getEmail() {
return email;
}
/**
* Returns the person's date of birth.
*
* @return The person's date of birth.
*/
public Date getDateOfBirth() {
return dateOfBirth;
}
/**
* Returns this object's unique identification.
*
* @return The person's unique identification.
*/
public long getId() {
return id;
}
/**
* 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);
}
/**
* {@inheritDoc}
*/
public boolean equals(Object obj) {
if (super.equals(obj))
return true;
if (obj.getClass() != this.getClass())
return false;
Person aPerson = (Person)obj;
if (aPerson.getName().compareTo(getName()) != 0)
return false;
if (aPerson.getEmail().compareTo(getEmail()) != 0)
return false;
if (aPerson.getDateOfBirth().compareTo(getDateOfBirth()) != 0)
return false;
return true;
}
/**
* {@inheritDoc}
*/
public String toString() {
String s = "Name: " + getName() + "; ";
s += "Email: " + getEmail() + "; ";
s += "Date of birth: " + getDateOfBirth().toString();
return s;
}
}