package frontOffice;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import messages.Message;
import backOffice.BackOfficeRemoteInterface;
import common.*;
import com.toedter.calendar.JCalendar;
;
/**
*
* FrontOffice is responsible for interaction with the users that use our
* service( clients or operators). It communicates with the BackOffice using
* JAVA RMI and is used to manage bookings, search flights, and gives the
* operators opportunity to create charter flights.
*
* @author Daniela Fontes
* @author Ivo Correia
* @author Jo�o Penetra
* @author Jo�o Barbosa
* @author Ricardo Bernardino
*
*
*/
public class FrontOffice extends UnicastRemoteObject {
private static final long serialVersionUID = 1L;
/* The main panel. */
private JPanel panel = new JPanel();
/* The windows used on the graphical interface. */
private Menu menu;
private BookingsMenu bookingsMenu;
private SendFeedBackMenu sendFeedBackMenu;
private SearchMenu searchMenu;
private BackOfficeRemoteInterface backOffice;
private boolean loggedIn = false;
private JFrame f;
private ShowTime showTime;
private Vector<String> destinations;
private static int bookingNumber;
/**
* The main constructor.
*/
public FrontOffice() throws RemoteException {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
System.exit(-1);
}
try {
backOffice = (BackOfficeRemoteInterface) Naming
.lookup("rmi://localhost:" + Constants.RMI_PORT +"/AirlineManager");
} catch (Exception e) {
System.exit(-1);
}
destinations = backOffice.getDestinations();
menu = new Menu();
bookingsMenu = new BookingsMenu();
sendFeedBackMenu = new SendFeedBackMenu(this);
searchMenu = new SearchMenu();
}
public static void main(String[] args) throws RemoteException {
FrontOffice frontOffice;
frontOffice = new FrontOffice();
frontOffice.executeGraphics();
}
/**
* Sends positive feedback to the BackOffice.
*/
public String sendPositiveFeedBack(Message message) {
try {
backOffice.sendPositiveFeedback(message);
} catch (RemoteException e) {
return "It was not possible to reach the system.";
}
return "Message sent.";
}
/**
* Sends negative feedback to the BackOffice.
*/
public String sendNegativeFeedBack(Message message) {
try {
backOffice.sendNegativeFeedback(message);
} catch (RemoteException e) {
return "It was not possible to reach the system.";
}
return "Message sent.";
}
// / / / / / / / / / / / / / / / / / / / / / GRAPHIC INTERFACE / / / / / / /
// / / / / / / / / / / /
public void executeGraphics() {
f = new JFrame();
f.setSize(Constants.DIM_H, Constants.DIM_V);
f.setTitle("AirlineManager");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setLayout(null);
panel.setBackground(Color.lightGray);
panel.setVisible(true);
/* Sets the panel that will hold the time display. */
JPanel timeDisplay = new JPanel();
timeDisplay.setLayout(null);
timeDisplay.setBounds(new Rectangle(765, 11, 250, 50));
timeDisplay.setOpaque(false);
JLabel time = new JLabel();
JLabel userNameField = new JLabel();
timeDisplay.add(time);
timeDisplay.setVisible(true);
timeDisplay.add(userNameField);
timeDisplay.setVisible(true);
panel.add(timeDisplay);
showTime = new ShowTime(time, userNameField);
panel.add(menu);
panel.add(bookingsMenu);
panel.add(sendFeedBackMenu);
panel.add(searchMenu);
System.out.println("LOADING THE IMAGES...");
menu.CreateImage("./src/images/takeoff.jpg", "", 0, 0, 990, 570);
bookingsMenu
.CreateImage("./src/images/takeoff.jpg", "", 0, 0, 990, 570);
sendFeedBackMenu.CreateImage("./src/images/takeoff.jpg", "", 0, 0, 990,
570);
searchMenu.CreateImage("./src/images/takeoff.jpg", "", 0, 0, 990, 570);
/* Sets all the windows invisible, except, naturally, the main menu. */
menu.setVisible(true);
bookingsMenu.setVisible(false);
sendFeedBackMenu.setVisible(false);
searchMenu.setVisible(false);
f.setContentPane(panel);
f.setVisible(true);
}
/**
* Check if the inserted fields can form a valid date.
*
* @return GregorianCalendar or null
*/
public GregorianCalendar checkDate(int year, int month, int day, int hour,
int minute) {
/* A non-positive year. */
if (year < 0) {
return null;
}
/* An invalid month. */
else if (month < 1 || month > 12) {
return null;
}
/* An invalid day. */
else if (day < 1
|| (day > 31 && (month == 1 || month == 3 || month == 5
|| month == 7 || month == 8 || month == 10 || month == 12))
|| (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11))) {
return null;
}
/* Invalid hour. */
else if (hour < 0 || hour > 23) {
return null;
}
/* Invalid minute. */
else if (minute < 0 || minute > 59) {
return null;
}
/* It's February, so we ought to check if we are in a leap year or not. */
if (month == 2) {
boolean leapYear;
/* Verifies whether we are in a leap year or not. */
if (year % 400 == 0) {
leapYear = true;
} else if (year % 100 == 0) {
leapYear = false;
} else if (year % 4 == 0) {
leapYear = true;
} else {
leapYear = false;
}
/* Acts accordingly to the result collected above. */
if (leapYear) {
if (day > 29) {
return null;
}
} else {
if (day > 28) {
return null;
}
}
}
GregorianCalendar now = new GregorianCalendar();
GregorianCalendar date = new GregorianCalendar(year, month - 1, day,
hour, minute);
/* This is an old date. */
if (now.after(date)) {
return null;
}
return date;
}
@SuppressWarnings("serial")
private class Menu extends Window {
public Menu() {
/* Creates the buttons that redirect to each manager window. */
CreateButton("Bookings", Color.white, "Check Your Bookings", 15,
60, 200, 150, 30);
CreateButton("Find Flights", Color.white,
"Find all the Flights Available", 15, 60, 250, 150, 30);
CreateButton("Feedback", Color.white, "Send Feedback", 15, 60, 300,
150, 30);
CreateButton("Operator", Color.white, "Login and Register", 15, 60,
350, 150, 30);
CreateButton("Exit", Color.white, "Leave the application", 15, 60,
500, 150, 30);
}
public void mouseReleased(MouseEvent e) {
if (e.getComponent().getName().equals("Bookings")) {
menu.setVisible(false);
bookingsMenu.entry();
} else if (e.getComponent().getName().equals("Find Flights")) {
menu.setVisible(false);
searchMenu.entry();
} else if (e.getComponent().getName().equals("Feedback")) {
menu.setVisible(false);
sendFeedBackMenu.entry();
} else if (e.getComponent().getName().equals("Operator")) {
operator();
} else if (e.getComponent().getName().equals("Exit")) {
/* The user is leaving the application. */
JOptionPane jp = new JOptionPane("Have a nice day!",
JOptionPane.INFORMATION_MESSAGE);
JDialog jd = jp.createDialog("Thank you!");
jd.setBounds(new Rectangle(340, 200, 320, 120));
jd.setVisible(true);
System.exit(0);
}
}
public void operator() {
/* Initialize variables */
final String[] possibilities = { "Login", "Register" };
int op, status;
String pass, conf, answer = "";
JPasswordField pwd = new JPasswordField(20);
JPasswordField confirmPwd = new JPasswordField(20);
JLabel title;
final JLabel username = new JLabel("Enter username: ");
JTextField user = new JTextField();
final JLabel passcode = new JLabel("Enter password: ");
final JLabel confirmPassword = new JLabel("Confirm password: ");
final JLabel company = new JLabel("Company:");
final JLabel address = new JLabel("Address:");
final JLabel telephone = new JLabel("Telephone:");
final JLabel email = new JLabel("Email:");
JTextField companyText = new JTextField();
JTextField addressText = new JTextField();
JTextField telephoneText = new JTextField();
JTextField emailText = new JTextField();
int count = 0;
if (!loggedIn) {
op = JOptionPane.showOptionDialog(null, "Options", "Operator",
JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE,
null, possibilities, "");
if (op == 0) {
title = new JLabel("<html><h3> Login </h3></html>");
Object[] jop = { title, username, user, passcode, pwd };
/* User has 3 opportunities to finish login process */
while (!loggedIn && count++ != 3) {
String userName, passWord;
/* Pop-up to ask for the login information */
status = JOptionPane.showConfirmDialog(null, jop,
"Please enter your information",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE);
/* If "X" was clicked the login process terminates */
if (status == -1)
return;
try {
/*
* Get the information from the TextField and
* PasswordField
*/
userName = user.getText();
passWord = new String(pwd.getPassword());
/* The fields are empty. */
if (userName.equals("") || passWord.equals("")) {
JOptionPane.showMessageDialog(null,
"Empty fields!");
continue;
} else {
answer = backOffice.loginOperator(userName,
passWord);
}
} catch (RemoteException e) {
JOptionPane
.showMessageDialog(null,
"The server is down, please try again later");
return;
}
/*
* Login was successful, loggedIn is now true so
* operator can book charters
*/
if (answer.equals("Login successful")) {
loggedIn = true;
showTime.setIsLoggedIn(userName);
}
JOptionPane.showMessageDialog(null, answer);
pwd.setText("");
}
user.setText("");
} else if (op == 1) {
title = new JLabel("<html><h3> Register </h3></html>");
Object[] jop = { title, username, user, passcode, pwd,
confirmPassword, confirmPwd, email, emailText,
telephone, telephoneText, company, companyText,
address, addressText };
/* User has 3 opportunities to finish register process */
while (!loggedIn && count++ != 3) {
status = JOptionPane.showConfirmDialog(null, jop,
"Please enter your information",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE);
/* If "X" was clicked the register process terminates */
if (status == -1)
return;
/* Get the information from the PasswordFields */
pass = new String(pwd.getPassword());
conf = new String(confirmPwd.getPassword());
/* Check if the fields are empty. */
if (!user.getText().equals("")
&& !emailText.getText().equals("")
&& !telephoneText.getText().equals("")
&& !companyText.getText().equals("")
&& !addressText.getText().equals("")) {
if (pass.equals(conf)) {
try {
/* The fields are empty. */
if (user.getText().equals("")
|| pass.equals("")) {
JOptionPane.showMessageDialog(null,
"Empty fields!");
continue;
} else {
answer = backOffice.registerOperator(
companyText.getText(),
user.getText(),
addressText.getText(),
telephoneText.getText(),
emailText.getText(), pass);
}
} catch (RemoteException e) {
JOptionPane
.showMessageDialog(null,
"The server is down, please try again later");
return;
}
/*
* Registration was successful, loggedIn is now
* true so operator can book charters
*/
if (answer
.equals("Registration was successful")) {
loggedIn = true;
showTime.setIsLoggedIn(user.getText());
JOptionPane.showMessageDialog(null, answer);
}
} else {
JOptionPane
.showMessageDialog(null,
"The passwords don't match, please try again");
}
} else {
JOptionPane
.showMessageDialog(null,
"You have to fill all the information in order to register");
}
pwd.setText("");
confirmPwd.setText("");
}
user.setText("");
}
} else {
JOptionPane
.showMessageDialog(null, "You are already logged in");
}
}
}
@SuppressWarnings("serial")
private class BookingsMenu extends Window implements PropertyChangeListener {
/* ALL PANELS */
private JPanel newPanel;
private JPanel checkPanel;
private JPanel cancelPanel;
private JPanel modifyPanel;
private JPanel charterPanel;
private JButton charterButton;
/* NEW BOOKING PANEL */
private JTextField newFlightID;
private JTextField seatsNew;
private JTextField nameNew;
private JTextField phoneNew;
private JTextField addressNew;
private JTextField emailNew;
private JTextField ccNoNew;
private JTextArea confirmActionNew;
private JScrollPane jpNew;
/* CHECK BOOKING PANEL */
private JTextField checkFlightID;
private JTextField checkBookingID;
private JTextArea confirmActionCheck;
/* CANCEL BOOKING PANEL */
private JTextField cancelFlightID;
private JTextField cancelBookingID;
private JTextArea confirmActionCancel;
private JScrollPane jpCancel;
/* MODIFY BOOKING PANEL */
private JTextField modifyFlightID;
private JTextField modifyBookingID;
private JTextField modifyNewFlightID;
private JTextArea confirmActionModify;
private JScrollPane jpModify;
/* CHARTER BOOKING PANEL */
private JCalendar jCalendar;
private JTextField dateCharter;
private JTextField seatsCharter;
private JComboBox originCharter;
private JComboBox destinationCharter;
private JTextArea confirmActionCharter;
private JScrollPane jpCharter;
private JTextField hourFieldCharter;
private JTextField minuteFieldCharter;
private GregorianCalendar calendar;
public BookingsMenu() {
/* Creates the buttons that redirect to each manager window. */
CreateButton("New Booking", Color.white, "Books a given flight",
15, 60, 200, 200, 30);
CreateButton("Check Booking", Color.white, "Confirm booked flight",
15, 60, 250, 200, 30);
CreateButton("Cancel Booking", Color.white, "Cancels a booking",
15, 60, 300, 200, 30);
CreateButton("Modify Booking", Color.white,
"Changes a booking to another flight", 15, 60, 350, 200, 30);
charterButton = CreateButton("Book Charter", Color.white,
"Book a Charter Flight", 15, 60, 400, 200, 30);
charterButton.setVisible(false);
CreateButton("Return", Color.white, "Go back to the main menu", 15,
60, 500, 100, 30);
/*
* Creates the sub panels that are displayed accordingly to the
* user's choice.
*/
newPanel = new JPanel();
checkPanel = new JPanel();
cancelPanel = new JPanel();
modifyPanel = new JPanel();
charterPanel = new JPanel();
/* Defines the sub panels. */
newPanel.setLayout(null);
newPanel.setBounds(new Rectangle(500, 40, 500, 500));
newPanel.add(CreateTitle("Flight ID:", Color.black, 15, 60, 20, 70,
20));
newPanel.add(newFlightID = CreateBoxInt(20, 170, 20, 80, 20, 0));
newPanel.add(CreateTitle("Name:", Color.black, 15, 60, 50, 100, 20));
newPanel.add(nameNew = CreateBoxText(20, 170, 50, 300, 20));
newPanel.add(CreateTitle("Phone:", Color.black, 15, 60, 80, 100, 20));
newPanel.add(phoneNew = CreateBoxText(20, 170, 80, 150, 20));
newPanel.add(CreateTitle("Address:", Color.black, 15, 60, 110, 100,
20));
newPanel.add(addressNew = CreateBoxText(20, 170, 110, 300, 20));
newPanel.add(CreateTitle("E-mail:", Color.black, 15, 60, 140, 100,
20));
newPanel.add(emailNew = CreateBoxText(20, 170, 140, 300, 20));
newPanel.add(CreateTitle("Seats:", Color.black, 15, 60, 170, 100,
20));
newPanel.add(seatsNew = CreateBoxInt(20, 170, 170, 80, 20, 0));
newPanel.add(CreateTitle("CC Number:", Color.black, 15, 60, 200,
100, 20));
newPanel.add(ccNoNew = CreateBoxInt(20, 170, 200, 150, 20, 0));
newPanel.add(confirmActionNew = CreateText(100, 100, 60, 210, 100,
60));
jpNew = new JScrollPane(confirmActionNew);
newPanel.add(jpNew);
jpNew.setBounds(60, 240, 300, 180);
newPanel.add(CreateButton("Schedule", Color.white,
"Schedule your flight", 15, 60, 460, 120, 20));
checkPanel.setLayout(null);
checkPanel.setBounds(new Rectangle(500, 40, 500, 500));
checkPanel.add(CreateTitle("Flight ID:", Color.black, 15, 60, 20,
70, 20));
checkPanel
.add(checkFlightID = CreateBoxInt(20, 150, 20, 80, 20, 0));
checkPanel.add(CreateTitle("Booking ID:", Color.black, 15, 60, 50,
90, 20));
checkPanel
.add(checkBookingID = CreateBoxInt(20, 150, 50, 80, 20, 0));
checkPanel.add(confirmActionCheck = CreateText(300, 150, 60, 90,
400, 150));
checkPanel.add(CreateButton("Check", Color.white, "Check Booking",
15, 60, 260, 200, 30));
cancelPanel.setLayout(null);
cancelPanel.setBounds(new Rectangle(500, 40, 400, 500));
cancelPanel.add(CreateTitle("Flight ID:", Color.black, 15, 60, 20,
70, 20));
cancelPanel.add(cancelFlightID = CreateBoxInt(20, 140, 20, 80, 20,
0));
cancelPanel.add(CreateTitle("Booking Number:", Color.black, 15, 60,
50, 150, 20));
cancelPanel.add(cancelBookingID = CreateBoxInt(20, 190, 50, 80, 20,
0));
cancelPanel.add(confirmActionCancel = CreateText(300, 150, 60, 90,
400, 150));
jpCancel = new JScrollPane(confirmActionCancel);
cancelPanel.add(jpCancel);
jpCancel.setBounds(60, 90, 400, 150);
cancelPanel.add(CreateButton("Cancel", Color.white,
"Cancel Booking", 15, 60, 260, 200, 30));
modifyPanel.setLayout(null);
modifyPanel.setBounds(new Rectangle(500, 40, 400, 500));
modifyPanel.add(CreateTitle("Flight ID:", Color.black, 15, 60, 20,
70, 20));
modifyPanel.add(modifyFlightID = CreateBoxInt(20, 165, 20, 80, 20,
0));
modifyPanel.add(CreateTitle("Booking ID:", Color.black, 15, 60, 50,
100, 20));
modifyPanel.add(modifyBookingID = CreateBoxInt(20, 165, 50, 80, 20,
0));
modifyPanel.add(CreateTitle("New Flight ID:", Color.black, 15, 60,
80, 120, 20));
modifyPanel.add(modifyNewFlightID = CreateBoxInt(20, 165, 80, 80,
20, 0));
modifyPanel.add(confirmActionModify = CreateText(300, 150, 60, 120,
300, 150));
jpModify = new JScrollPane(confirmActionModify);
modifyPanel.add(jpModify);
jpModify.setBounds(60, 120, 300, 150);
modifyPanel.add(CreateButton("Confirm modification", Color.white,
"Modify a booking", 15, 60, 290, 200, 30));
charterPanel.setLayout(null);
charterPanel.setBounds(new Rectangle(500, 40, 400, 500));
charterPanel.add(CreateTitle("Date:", Color.black, 15, 60, 20, 70,
20));
charterPanel.add(dateCharter = CreateBoxText(20, 100, 20, 80, 20));
calendar = new GregorianCalendar();
charterPanel.add(CreateButton("Charter Date", Color.white,
"Choose flight date", 15, 60, 50, 120, 30));
charterPanel.add(CreateTitle("TIME:", Color.white, 15, 60, 90, 70,
20));
charterPanel.add(hourFieldCharter = CreateBoxInt(20, 100, 90, 20,
20, calendar.get(Calendar.HOUR_OF_DAY)));
charterPanel
.add(CreateTitle("h", Color.white, 15, 125, 90, 70, 20));
charterPanel.add(minuteFieldCharter = CreateBoxInt(20, 140, 90,
20, 20, (calendar.get(Calendar.MINUTE) + 1) % 60));
charterPanel.add(CreateTitle("Origin:", Color.black, 15, 60, 120,
70, 20));
charterPanel.add(originCharter = CreateComboBox(120, 120, 120, 20,
destinations));
charterPanel.add(CreateTitle("Destination:", Color.black, 15, 60,
150, 100, 20));
charterPanel.add(destinationCharter = CreateComboBox(150, 150, 120,
20, destinations));
charterPanel.add(CreateTitle("Seats:", Color.black, 15, 60, 180,
50, 20));
charterPanel.add(seatsCharter = CreateBoxInt(20, 120, 180, 50, 20,
0));
charterPanel.add(confirmActionCharter = CreateText(300, 150, 60,
210, 300, 150));
jpCharter = new JScrollPane(confirmActionCharter);
charterPanel.add(jpCharter);
jpCharter.setBounds(60, 210, 300, 150);
charterPanel.add(CreateButton("Book Flight", Color.white,
"Search for a flight", 15, 60, 380, 120, 20));
/* Adds the sub panels to the main panel. */
panel.add(newPanel);
panel.add(checkPanel);
panel.add(cancelPanel);
panel.add(modifyPanel);
panel.add(charterPanel);
newPanel.setVisible(false);
newPanel.setOpaque(false);
checkPanel.setVisible(false);
checkPanel.setOpaque(false);
cancelPanel.setVisible(false);
cancelPanel.setOpaque(false);
modifyPanel.setVisible(false);
modifyPanel.setOpaque(false);
charterPanel.setVisible(false);
charterPanel.setOpaque(false);
}
/*
* This function is used when the user enters this menu. We need to set
* true the right menu and one of its sub panels.
*/
public void entry() {
setVisible(true);
/* As default, we have the Buy Plane Menu. */
newPanel.setVisible(true);
/* If the operator is logged in, we set the Charter button visible */
if (loggedIn) {
charterButton.setVisible(true);
}
}
public void mouseReleased(MouseEvent e) {
/*
* Every time the user releases a mouse button, the event must be
* handled
*/
if (e.getComponent().getName().equals("New Booking")) {
newPanel.setVisible(true);
cancelPanel.setVisible(false);
modifyPanel.setVisible(false);
charterPanel.setVisible(false);
checkPanel.setVisible(false);
} else if (e.getComponent().getName().equals("Check Booking")) {
newPanel.setVisible(false);
checkPanel.setVisible(true);
cancelPanel.setVisible(false);
modifyPanel.setVisible(false);
charterPanel.setVisible(false);
} else if (e.getComponent().getName().equals("Cancel Booking")) {
newPanel.setVisible(false);
checkPanel.setVisible(false);
cancelPanel.setVisible(true);
modifyPanel.setVisible(false);
charterPanel.setVisible(false);
} else if (e.getComponent().getName().equals("Modify Booking")) {
newPanel.setVisible(false);
checkPanel.setVisible(false);
cancelPanel.setVisible(false);
modifyPanel.setVisible(true);
charterPanel.setVisible(false);
} else if (e.getComponent().getName().equals("Book Charter")) {
newPanel.setVisible(false);
checkPanel.setVisible(false);
cancelPanel.setVisible(false);
modifyPanel.setVisible(false);
charterPanel.setVisible(true);
} else if (e.getComponent().getName().equals("Schedule")) {
try {
int id = Integer.parseInt(newFlightID.getText());
int seats = Integer.parseInt(seatsNew.getText());
String name = nameNew.getText();
String address = addressNew.getText();
String phone = phoneNew.getText();
String mail = emailNew.getText();
String cc = ccNoNew.getText();
boolean validPhone = true, validCC = true;
// It can't contain only numbers if it's null or empty...
if (phone == null || phone.length() == 0)
validPhone = false;
else {
if (!(phone.charAt(0) == '+' || Character.isDigit(phone
.charAt(0)))) {
validPhone = false;
}
for (int i = 1; i < phone.length() && validPhone; i++) {
// If we find a non-digit character we return false.
if (!Character.isDigit(phone.charAt(i)))
validPhone = false;
}
}
// It can't contain only numbers if it's null or empty...
if (cc == null || cc.length() == 0)
validCC = false;
else {
for (int i = 0; i < cc.length() && validCC; i++) {
// If we find a non-digit character we return false.
if (!Character.isDigit(cc.charAt(i)))
validCC = false;
}
}
if (validPhone && validCC) {
if (!name.equals("") && !address.equals("")
&& !mail.equals("")) {
String answer = backOffice.scheduleBooking(id,
name, address, phone, mail, seats,
loggedIn, bookingNumber);
String [] splitted = answer.split(" ");
String scheduleAnswer = splitted[0];
if (answer.equals("Innexistent flight")) {
confirmActionNew
.setText("There's no such flight.");
confirmActionNew.setCaretPosition(0);
} else if (scheduleAnswer.equals("Scheduled")) {
Double[] bookingInfo = backOffice.bookingPrice(
id, mail);
Double price = bookingInfo[0] * seats;
Double miles = bookingInfo[1] - (price * 10);
if (miles > 0) {
int option = JOptionPane
.showConfirmDialog(
f,
"The price of the flight is "
+ price
+ "� and you have travelled "
+ miles
+ " miles. Do you want to reduce the final price?",
"Price Reduction",
JOptionPane.YES_NO_OPTION);
// If the user wants to reduce price
if (option == 0) {
if (miles * 0.01 < price) {
price -= (miles * 0.01);
miles = 0.0;
} else {
miles -= price * 100;
price = 0.0;
}
// Update user miles
backOffice.updateMiles(miles, mail);
}
}
confirmActionNew
.setText("Booking scheduled, with booking number "
+ splitted[1]
+ " flight number "
+ id
+ " and price is "
+ price
+ "�.");
confirmActionNew.setCaretPosition(0);
//bookingNumber++;
} else if (answer.equals("Over")) {
confirmActionNew
.setText("This flight is over, please choose another.");
confirmActionNew.setCaretPosition(0);
} else if (answer.equals("Cancelled")) {
confirmActionNew
.setText("This flight was cancelled, please choose another.");
confirmActionNew.setCaretPosition(0);
} else if (answer.equals("Charter")) {
confirmActionNew
.setText("Sorry, but only operators can book charter flights.");
confirmActionNew.setCaretPosition(0);
} else {
int number = Integer
.parseInt(answer.split(" ")[1]);
if (number == 0) {
confirmActionNew
.setText("This flight is closed.");
confirmActionNew.setCaretPosition(0);
} else {
confirmActionNew.setText("There are only "
+ number + " empty seats.");
confirmActionNew.setCaretPosition(0);
}
}
} else {
confirmActionNew.setText("Empty field(s).");
confirmActionNew.setCaretPosition(0);
}
} else {
confirmActionNew
.setText("Invalid phone number or\ncredit card number.");
confirmActionNew.setCaretPosition(0);
}
} catch (Exception e1) {
confirmActionNew.setText("Invalid field(s).\n");
e1.printStackTrace();
}
} else if (e.getComponent().getName().equals("Check")) {
try {
int idFlight = Integer.parseInt(checkFlightID.getText());
int idBooking = Integer.parseInt(checkBookingID.getText());
confirmActionCheck.setText(backOffice.getBookingInfo(
idFlight, idBooking));
} catch (NumberFormatException e1) {
confirmActionCheck.setText("Invalid flight or booking ID");
} catch (RemoteException e1) {
confirmActionCheck
.setText("The system is not availabe, please try again later");
}
} else if (e.getComponent().getName()
.equals("Confirm modification")) {
try {
int idFlight = Integer.parseInt(modifyFlightID.getText());
int idBooking = Integer.parseInt(modifyBookingID.getText());
int newIdFlight = Integer.parseInt(modifyNewFlightID
.getText());
confirmActionModify.setText(backOffice.modifyBooking(
idFlight, idBooking, newIdFlight, loggedIn,
bookingNumber));
} catch (NumberFormatException e1) {
confirmActionModify.setText("Invalid flight or booking ID");
} catch (RemoteException e1) {
}
} else if (e.getComponent().getName().equals("Cancel")) {
try {
int idFlight = Integer.parseInt(cancelFlightID.getText());
int idBooking = Integer.parseInt(cancelBookingID.getText());
String answer = backOffice.cancelBooking(idFlight,
idBooking);
if (answer.equals("Innexistent flight")) {
confirmActionCancel.setText("There's no such flight.");
} else if (answer.equals("Innexistent booking")) {
confirmActionCancel
.setText("There's no such booking in this flight.");
} else if (answer.equals("Cancelled")) {
confirmActionCancel.setText("Booking cancelled.");
}
} catch (NumberFormatException e2) {
confirmActionCancel.setText("Invalid field(s).\n");
} catch (RemoteException e3) {
confirmActionCancel
.setText("The system is not availabe at the moment");
}
} else if (e.getComponent().getName().equals("Book Flight")) {
int day, month, year, hour, minute;
String[] dateFields = dateCharter.getText().split("/");
try {
day = Integer.parseInt(dateFields[0]);
month = Integer.parseInt(dateFields[1]);
year = Integer.parseInt(dateFields[2]);
hour = Integer.parseInt(hourFieldCharter.getText());
minute = Integer
.parseInt(minuteFieldCharter.getText());
GregorianCalendar date = new GregorianCalendar(year, month - 1,
day, hour, minute);
if ((checkDate(year, month, day, hour, minute)) != null
&& !originCharter.getSelectedItem()
.equals("")
&& !destinationCharter.getSelectedItem()
.equals("")
&& Integer.parseInt(seatsCharter.getText()) > 0) {
try {
confirmActionCharter
.setText(backOffice.scheduleCharter(date, originCharter
.getSelectedItem().toString(),
destinationCharter.getSelectedItem()
.toString(), Integer
.parseInt(seatsCharter
.getText())));
} catch (RemoteException e1) {
confirmActionCharter
.setText("The server is not available, please try again later");
}
}
else {
confirmActionCharter.setText("Invalid data");
}
} catch (NumberFormatException e1) {
confirmActionCharter.setText("Invalid Date");
}
} else if (e.getComponent().getName().equals("Charter Date")) {
JFrame date = new JFrame("Booking");
jCalendar = new JCalendar();
date.getContentPane().add(jCalendar);
date.pack();
date.setVisible(true);
jCalendar.addPropertyChangeListener(this);
} else if (e.getComponent().getName().equals("Return")) {
newPanel.setVisible(false);
cancelPanel.setVisible(false);
modifyPanel.setVisible(false);
charterPanel.setVisible(false);
checkPanel.setVisible(false);
bookingsMenu.setVisible(false);
menu.setVisible(true);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
Calendar cal = jCalendar.getCalendar();
GregorianCalendar calendar = new GregorianCalendar(
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
dateCharter.setText(calendar.get(Calendar.DAY_OF_MONTH)
+ "/" + (calendar.get(Calendar.MONTH) + 1) + "/"
+ calendar.get(Calendar.YEAR));
}
}
@SuppressWarnings("serial")
private class SendFeedBackMenu extends Window {
FrontOffice frontOffice;
JPanel positivePanel;
JPanel negativePanel;
/* Positive Panel Message Area */
private JTextArea posMsgArea;
/* Negative Panel Message Area */
private JTextArea negMsgArea;
private JTextArea displayN;
private JTextArea displayP;
public SendFeedBackMenu(FrontOffice f) {
frontOffice = f;
/* Creates the buttons that redirect to each manager window. */
CreateButton("Positive Feedback", Color.white,
"Send a positive Sugestion", 15, 60, 200, 200, 30);
CreateButton("Negative Feedback", Color.white,
"Send a reclamation", 15, 60, 250, 200, 30);
CreateButton("Return", Color.white, "Go back to the main menu", 15,
60, 500, 100, 30);
/*
* Creates the subpanels that are displayed accordingly to the
* user's choice.
*/
positivePanel = new JPanel();
negativePanel = new JPanel();
/* Defines the subpanels. */
positivePanel.setLayout(null);
positivePanel.setBounds(new Rectangle(500, 40, 500, 400));
positivePanel.add(CreateButton("Send", Color.white,
"Send your message", 15, 280, 20, 200, 30));
positivePanel.add(CreateTitle("Message (Positive Comment):",
Color.black, 15, 20, 20, 250, 20));
positivePanel
.add(posMsgArea = CreateText(10, 50, 40, 60, 350, 300));
displayP = CreateText(10, 50, 40, 375, 150, 20);
positivePanel.add(displayP);
negativePanel.setLayout(null);
negativePanel.setBounds(new Rectangle(500, 40, 500, 400));
negativePanel.add(CreateButton("Send ", Color.white,
"Send your message", 15, 280, 20, 200, 30));
negativePanel.add(CreateTitle("Message (Negative Comment):",
Color.black, 15, 20, 20, 250, 20));
negativePanel
.add(negMsgArea = CreateText(10, 50, 40, 60, 350, 300));
displayN = CreateText(10, 50, 40, 375, 150, 20);
negativePanel.add(displayN);
/* Adds the subpanels to the main panel. */
panel.add(positivePanel);
panel.add(negativePanel);
negativePanel.setVisible(false);
negativePanel.setOpaque(false);
positivePanel.setVisible(false);
positivePanel.setOpaque(false);
}
public void entry() {
setVisible(true);
/* As default, we have the Buy Plane Menu. */
positivePanel.setVisible(true);
}
public void mouseReleased(MouseEvent e) {
if (e.getComponent().getName().equals("Positive Feedback")) {
negativePanel.setVisible(false);
positivePanel.setVisible(true);
} else if (e.getComponent().getName().equals("Negative Feedback")) {
negativePanel.setVisible(true);
positivePanel.setVisible(false);
} else if (e.getComponent().getName().equals("Return")) {
negativePanel.setVisible(false);
positivePanel.setVisible(false);
sendFeedBackMenu.setVisible(false);
menu.setVisible(true);
} else if (e.getComponent().getName().equals("Send")) {
System.out.println(posMsgArea.getText());
displayP.setText(frontOffice.sendPositiveFeedBack(new Message(posMsgArea.getText(), new GregorianCalendar())));
} else if (e.getComponent().getName().equals("Send ")) {
displayN.setText(frontOffice.sendNegativeFeedBack(new Message(negMsgArea.getText(), new GregorianCalendar())));
}
}
}
@SuppressWarnings("serial")
private class SearchMenu extends Window implements PropertyChangeListener {
private JPanel listPanel;
/* NEWPANEL */
private JPanel newPanel;
private JCalendar jCalendar;
private GregorianCalendar calendar;
private JTextField dateNew;
private JComboBox originNew;
private JComboBox destinationNew;
private JTextArea confirmActionNew;
private JLabel idText;
private JTextField newID;
private JButton bookNew;
/* LISTPANEL */
private JTextArea listArea;
public SearchMenu() {
/* Creates the buttons that redirect to each manager window. */
CreateButton("List Flights", Color.white,
"Lists all the upcoming flights", 15, 60, 200, 150, 30);
CreateButton("Find Flight", Color.white, "Find your flight", 15,
60, 250, 150, 30);
CreateButton("Return", Color.white, "Go back to the main menu", 15,
60, 500, 100, 30);
newPanel = new JPanel();
listPanel = new JPanel();
/* Defines the sub panels. */
newPanel.setLayout(null);
newPanel.setBounds(new Rectangle(500, 40, 500, 500));
newPanel.add(CreateTitle("Date:", Color.black, 15, 60, 20, 70, 20));
newPanel.add(dateNew = CreateBoxText(20, 100, 20, 80, 20));
calendar = new GregorianCalendar();
dateNew.setText(calendar.get(Calendar.DAY_OF_MONTH) + "/"
+ (calendar.get(Calendar.MONTH) + 1) + "/"
+ calendar.get(Calendar.YEAR));
newPanel.add(CreateButton("Booking Date", Color.white,
"Choose flight date", 15, 60, 50, 150, 30));
newPanel.add(CreateTitle("Origin:", Color.black, 15, 60, 90, 70, 20));
newPanel.add(CreateButton("Check Price", Color.white,
"Check the flight's price", 15, 60, 340, 150, 30));
newPanel.add(CreateButton("Find", Color.white, "Find your flight",
15, 60, 380, 150, 30));
newPanel.add(originNew = CreateComboBox(120, 90, 120, 20,
destinations));
newPanel.add(CreateTitle("Destination:", Color.black, 15, 60, 120,
100, 20));
newPanel.add(destinationNew = CreateComboBox(150, 120, 120, 20,
destinations));
newPanel.add(confirmActionNew = CreateText(300, 150, 60, 180, 300,
150));
newPanel.add(idText = CreateTitle("Flight ID: ", Color.black, 15,
220, 345, 100, 20));
idText.setVisible(false);
newPanel.add(newID = CreateBoxInt(20, 290, 345, 70, 20, 0));
newID.setVisible(false);
newPanel.add(bookNew = CreateButton("Book", Color.white,
"Book a Flight", 15, 220, 380, 140, 30));
bookNew.setVisible(false);
listPanel.setLayout(null);
listPanel.setBounds(new Rectangle(500, 40, 500, 400));
listPanel.add(CreateTitle("LIST OF FLIGHTS:", Color.black, 15, 20,
20, 150, 20));
listPanel
.add(CreateTitle(
" ID PLANE DESTINATION TIME",
Color.black, 15, 20, 40, 400, 20));
listPanel.add(listArea = CreateText(10, 50, 40, 60, 450, 320));
/* Adds the sub panels to the main panel. */
panel.add(newPanel);
panel.add(listPanel);
newPanel.setVisible(false);
newPanel.setOpaque(false);
listPanel.setVisible(false);
listPanel.setOpaque(false);
}
/*
* This function is used when the user enters this menu. We need to set
* true the right menu and one of its subpanels.
*/
public void entry() {
setVisible(true);
/* As default, we have the List Panel Menu. */
listPanel.setVisible(true);
}
public void mouseReleased(MouseEvent e) {
if (e.getComponent().getName().equals("Find Flight")) {
listPanel.setVisible(false);
newPanel.setVisible(true);
} else if (e.getComponent().getName().equals("Find")) {
String[] dateFields = dateNew.getText().split("/");
int day = Integer.parseInt(dateFields[0]);
int month = Integer.parseInt(dateFields[1]);
int year = Integer.parseInt(dateFields[2]);
String answer;
try {
answer = backOffice.findFlights(year, month, day,
(String) originNew.getSelectedItem(),
(String) destinationNew.getSelectedItem());
idText.setVisible(true);
newID.setVisible(true);
bookNew.setVisible(true);
} catch (RemoteException e1) {
answer = "The system is down.";
}
confirmActionNew.setText(answer);
} else if (e.getComponent().getName().equals("Book")) {
idText.setVisible(false);
newID.setVisible(false);
bookNew.setVisible(false);
newPanel.setVisible(false);
searchMenu.setVisible(false);
bookingsMenu.newFlightID.setText(newID.getText());
bookingsMenu.entry();
} else if (e.getComponent().getName().equals("List Flights")) {
newPanel.setVisible(false);
listPanel.setVisible(true);
try {
listArea.setText(backOffice.listFlights());
} catch (RemoteException e1) {
listArea.setText("The system is not available, please try again later");
}
} else if (e.getComponent().getName().equals("Booking Date")) {
JFrame date = new JFrame("Booking");
jCalendar = new JCalendar();
date.getContentPane().add(jCalendar);
date.pack();
date.setVisible(true);
jCalendar.addPropertyChangeListener(this);
} else if (e.getComponent().getName().equals("Check Price")) {
double price = 0.0;
String orig = (String) originNew.getSelectedItem();
String dest = (String) destinationNew.getSelectedItem();
try {
price = backOffice.getPrice(orig, dest);
} catch (RemoteException e1) {
confirmActionNew
.setText("The system is not available, please try again later.");
}
confirmActionNew.setText("The price is " + price + "�.");
} else if (e.getComponent().getName().equals("Return")) {
searchMenu.setVisible(false);
newPanel.setVisible(false);
listPanel.setVisible(false);
menu.setVisible(true);
}
}
/* Every time the user selects a new date, an event is generated */
public void propertyChange(PropertyChangeEvent evt) {
Calendar cal = jCalendar.getCalendar();
calendar = new GregorianCalendar(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
dateNew.setText(calendar.get(Calendar.DAY_OF_MONTH) + "/"
+ (calendar.get(Calendar.MONTH) + 1) + "/"
+ calendar.get(Calendar.YEAR));
}
}
}