/*
* Person.java
* The package system contains the different class allowing to create and to select the object to store in the database.
*/
package reservation.system;
import java.io.Serializable;
/**
* This class hold person structure. This object could be asserted in the <CODE>PersonList</CODE>.
* @author Texier Mathieu and Frederic Bidon
*/
/**
* Construct an empty person
*/
Person (){
}
/**
* Construct a <CODE>Person</CODE> named <CODE>personName</CODE> booked on the <CODE>flight</CODE> the seat <CODE>pos</CODE> and has the booking number : <CODE>bookingNumber</CODE>.
* @param personName Name of the person.
* @param flight Flight on witch the person has booked.
* @param bookingNumber used to {@link reservation.system.functions.Identify} a group of person
* @param pos The position of the seat on the <CODE>flight</CODE>
* @throws Exception if the invariant _check() is violated
*/
Person (
Flight flight,
int bookingNumber,
this.personName = personName;
this.flight = flight;
this.
bookingNumber = new Integer (bookingNumber
);
try {
this.pos = (Pos) pos.clone ();
_check ();
}
/**
* Set the name of the person
* @param personName name of the person
* @throws Exception if the invariant _check() is violated
*/
this.personName = personName;
_check ();
}
/**
* Set the flight
* @param flight Flight on witch the person has booked.
* @throws Exception if the invariant _check() is violated
*/
void setFlight
(Flight flight
) throws Exception {
this.flight = (Flight) flight.clone ();
_check ();
}
/**
* Set the booking number
* @param bookingNumber the booking number
* @throws Exception if the invariant _check() is violated
*/
void setBookingNumber
(int bookingNumber
) throws Exception {
this.
bookingNumber = new Integer (bookingNumber
);
_check ();
}
/**
* Set the position
* @param pos The position of the seat on the <CODE>flight</CODE>
* @throws Exception if the invariant _check() is violated
*/
this.pos = (Pos) pos.clone ();
_check ();
}
/**
* Return the name of the person
* @return the name of the person
* @throws Exception if the invariant _check() is violated
*/
return personName;
}
/**
* Return the flight
* @return the flight on witch the person has booked.
* @throws Exception if the invariant _check() is violated
*/
final public Flight getFlight
() throws Exception {
if (flight == null)
return null;
else
return (Flight) flight.clone ();
}
/**
* Return the booking number
* @return the booking number
* @throws Exception if the invariant _check() is violated
*/
final public int getBookingNumber
() throws Exception {
if (bookingNumber == null)
return 0;
return bookingNumber.intValue ();
}
/**
* Return the position of the seat
* @return pos the position of the seat in the <CODE>Flight</CODE>
* @throws Exception if the invariant _check() is violated
*/
final public Pos getPos
() throws Exception {
if (pos == null)
return null;
else
return (Pos) pos.clone ();
}
/**
* Returns a string representation of this <CODE>Person</CODE> object. This method
* is intended to be used only for debugging purposes, and the content and format
* of the returned string may vary between implementations. The returned string may
* be empty but may not be <CODE>null</CODE>
* @return a string representation of this <CODE>Person</CODE> object.
*/
return personName +" has booked on "+ flight +" the seat "+ pos +" under the booking number : "+ bookingNumber + "\r\n";
}
/**
* Overide equals
* @return <CODE>true</CODE> if this object is the same as the obj argument or match a {@link reservation.system.Profile} object;
* <CODE>false</CODE> otherwise
* @param anObject <CODE>anObject</CODE> - the reference object with which to compare
*/
public boolean equals
(Object anObject
) {
if (anObject != null && anObject instanceof Profile) {
boolean bPersonName = false;
boolean bBookingNumber = false;
boolean bFlightName = false;
boolean bPos = false;
Profile profile = (Profile) anObject;
try {
if (personName.equals (profile.getPersonName ()) || profile.personNameIsMask ())
bPersonName = true;
if (bookingNumber.intValue () == profile.getBookingNumber () || profile.bookingNumberIsMask ())
bBookingNumber = true;
if (flight.equals (profile.getFlight ()) || profile.flightIsMask ())
bFlightName = true;
if (pos.equals (profile.getPos ()) || profile.posIsMask ())
bPos = true;
return bPersonName && bBookingNumber && bFlightName && bPos;
}
else if (anObject != null && anObject instanceof Person) {
Person person = (Person) anObject;
return (flight.equals (person.flight)
&& (personName == person.personName)
&& (bookingNumber == person.bookingNumber)
&& (pos.equals (person.pos)));
}
else
return false;
}
/**
* Verify invariants :
<PRE>
- <CODE>regex</CODE> ^[A-Z][a-z]*
- seat < dimension of the flight and > 0
</PRE>
* @throws NullPointerException if pos or name is null
* @throws Exception if the invariant is violated
*/
if (flight == null || pos == null || personName == null || bookingNumber == null)
if (bookingNumber.
intValue () < 1 || bookingNumber.
intValue () > Integer.
MAX_VALUE
|| pos.getRow () < 1 || pos.getRow () > flight.getDimension ().getRow ()
|| pos.getCol () < 1 || pos.getCol () > flight.getDimension ().getCol ()) {
throw new Exception ("The person "+ this +" has an out of range value.");
}
if (!personName.matches ("^[A-Z][a-z]*") || personName.equals (""))
throw new Exception ("The name : "+ personName
+" has illegal character(s)\r\n" +
"Remember that the first letter of a name has to be in upper case and the rest in lower case " +
"and that no number or special characters are allowed");
}
/**
* Creates and returns a copy of this object.
* @return a copy of this <CODE>Person</CODE> object
* @throws CloneNotSupportedException if the object's class does not support the <CODE>Cloneable</CODE> interface.
*/
Person retPerson = null;
try {
retPerson = new Person (personName, flight, bookingNumber.intValue (), (Pos) pos.clone ());
return retPerson;
}
private Flight flight = null;
private String personName
= null;
private Integer bookingNumber
= null;
private Pos pos = null;
}