import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; /** * The entry class which holds and exposes all the data relating to the Health Spa. * * @author Cormac Redmond -- credmond85 /at/ gmail */ public class HealthSpa { /* *Declare some global variables */ protected Hashtable rooms; protected Hashtable members; protected Hashtable staff; public HealthSpa() { rooms = new Hashtable(); staff = new Hashtable(); members = new Hashtable(); // Here we read in information on members, staff and rooms. // In a real-world application this would be read from a database, // but used here just to populate the HealthSpa. try { BufferedReader roomFile = new BufferedReader(new FileReader( "rooms.txt")); String name, code; double price; while ((name = roomFile.readLine()) != null) { code = roomFile.readLine(); price = Double.parseDouble(roomFile.readLine()); System.out.println(name + " - " + code + " - " + price); rooms.put(code, new Room(name, code, price)); } roomFile.close(); // close the input stream. BufferedReader staffFile = new BufferedReader(new FileReader( "staff.txt")); while ((name = staffFile.readLine()) != null) { code = staffFile.readLine(); staff.put(code, new Staff(name, code)); } staffFile.close(); // close the input stream. BufferedReader memberFile = new BufferedReader(new FileReader( "members.txt")); while ((name = memberFile.readLine()) != null) { code = memberFile.readLine(); String username = memberFile.readLine(); String password = memberFile.readLine(); System.out.println("Memeber code added: " + code); members.put(code, new Member(username, password, name, code)); } memberFile.close(); // close the input stream. } catch (IOException e) { System.out.println("Error reading files!" + e.getMessage()); } //Set this particular 'member' to be an admin members.get("AD1").setIsAdmin(true); //members.get("CR0").setIsAdmin(true);//This this particular 'member' to be an admin. /* * This chunk of code is not necessary, but used to populate some test data, i.e., staff timetables. * Be careful changing this, there is no proper error handling. */ staff.get("CR1234").makeBooking("CR1234", 1, Days.Monday, Days.NextWeek); staff.get("BC333").makeBooking("BC333", 2, Days.Tuesday, Days.NextWeek); staff.get("JR56").makeBooking("JR56", 3, Days.Thursday, Days.NextWeek); staff.get("CR1234").makeBooking("CR1234", 3, Days.Monday, Days.CurrentWeek); staff.get("DC12345").makeBooking("DC12345", 4, Days.Saturday, Days.CurrentWeek); staff.get("JR56").makeBooking("JR56", 1, Days.Thursday, Days.NextWeek); staff.get("CR1234").makeBooking("CR1234", 1, Days.Sunday, Days.CurrentWeek); staff.get("BC333").makeBooking("BC333", 2, Days.Wednesday, Days.CurrentWeek); staff.get("JR56").makeBooking("JR56", 2, Days.Monday, Days.NextWeek); staff.get("CR1234").makeBooking("CR1234", 1, Days.Monday, Days.NextWeek); staff.get("BC333").makeBooking("BC333", 2, Days.Tuesday, Days.NextWeek); staff.get("JC1234").makeBooking("JR56", 3, Days.Thursday, Days.NextWeek); staff.get("CR1234").makeBooking("CR1234", 3, Days.Monday, Days.CurrentWeek); staff.get("BC333").makeBooking("BC333", 4, Days.Tuesday, Days.CurrentWeek); staff.get("JR56").makeBooking("JR56", 1, Days.Thursday, Days.NextWeek); staff.get("CR1234").makeBooking("CR1234", 1, Days.Sunday, Days.CurrentWeek); staff.get("JC1234").makeBooking("JC1234", 2, Days.Wednesday, Days.CurrentWeek); staff.get("JR56").makeBooking("JR56", 2, Days.Monday, Days.NextWeek); this.makeBooking("MB1", "CR0", null, "cormac", "cormac", 8, Days.Monday, Days.CurrentWeek); this.makeBooking("FR1", "CR0", null, "cormac", "cormac", 0, Days.Saturday, Days.NextWeek); this.makeBooking("MB2", "EP1", null, "elvis", "elvis", 9, Days.Tuesday, Days.CurrentWeek); this.makeBooking("BM1", "CR0", null, "cormac", "cormac", 5, Days.Saturday, Days.NextWeek); this.makeBooking("BM1", "CR0", null, "cormac", "cormac", 0, Days.Tuesday, Days.NextWeek); this.makeBooking("BM2", "CR0", null, "cormac", "cormac", 8, Days.Sunday, Days.CurrentWeek); this.makeBooking("AR1", "TT3", null, "bertie", "bertie", 1, Days.Wednesday, Days.CurrentWeek); this.makeBooking("AR1", "TT3", null, "bertie", "bertie", 6, Days.Wednesday, Days.CurrentWeek); this.makeBooking("SW1", "TT3", null, "bertie", "tester", 8, Days.Saturday, Days.CurrentWeek); this.makeBooking("FR2", "TT3", null, "bertie", "bertie", 1, Days.Friday, Days.NextWeek); this.makeBooking("SW1", "CR0", null, "cormac", "cormac", 4, Days.Saturday, Days.CurrentWeek); this.makeBooking("SW1", "AD1", null, "cormac", "cormac", 6, Days.Thursday, Days.NextWeek); this.makeBooking("MB1", "CR0", null, "cormac", "cormac", 1, Days.Monday, Days.CurrentWeek); this.makeBooking("FR1", "CR0", null, "cormac", "cormac", 0, Days.Saturday, Days.NextWeek); this.makeBooking("BM1", "EP1", null, "elvis", "elvis", 1, Days.Monday, Days.NextWeek); this.makeBooking("FR1", "CR0", null, "cormac", "cormac", 2, Days.Wednesday, Days.NextWeek); this.makeBooking("BM1", "CR0", null, "cormac", "cormac", 2, Days.Tuesday, Days.NextWeek); this.makeBooking("FR1", "EP1", null, "elvis", "elvis", 5, Days.Monday, Days.NextWeek); this.makeBooking("AR1", "CR0", null, "cormac", "cormac", 2, Days.Tuesday, Days.NextWeek); this.makeBooking("AR1", "CR0", null, "cormac", "cormac", 3, Days.Tuesday, Days.CurrentWeek); this.makeBooking("AR1", "TT3", null, "bertie", "bertie", 4, Days.Wednesday, Days.CurrentWeek); this.makeBooking("AR1", "TT3", null, "bertie", "bertie", 7, Days.Wednesday, Days.CurrentWeek); this.makeBooking("SW1", "TT3", null, "bertie", "bertie", 6, Days.Saturday, Days.NextWeek); this.makeBooking("FR2", "TT3", null, "bertie", "bertie", 8, Days.Friday, Days.NextWeek); this.makeBooking("FR1", "CR0", null, "cormac", "cormac", 9, Days.Saturday, Days.CurrentWeek); this.makeBooking("SW1", "AD1", null, "cormac", "cormac", 9, Days.Thursday, Days.NextWeek); } // Gets a list of the rooms which the Health Spa is currently maintaining. LinkedList getRoomList() { LinkedList roomList = new LinkedList(); for (Iterator i = rooms.values().iterator(); i.hasNext();) { Room f = i.next(); ModelObject tempModel = new ModelObject(f.getName(), f.getCode()); tempModel.setData(String.valueOf(f.getPrice())); roomList.add(tempModel); } return roomList; } // Gets a list of the members to which the Health Spa is currently maintaining. // Only admins can use this. LinkedList getMemberList(String adminUsername, String adminPassword) { if (isUserAdmin(adminUsername, adminPassword))//Make sure it's an admin requesting it { LinkedList memberList = new LinkedList(); for (Iterator i = members.values().iterator(); i.hasNext();) { Member f = i.next(); ModelObject tempModel = new ModelObject(f.getName(), f.getCode()); memberList.add(tempModel); } return memberList; } else { return null; } } // Gets a list of booking information for a particular user. // A normal user can only request their own, while an admin can request anybodies. public ArrayList getMemberBookingInfo(String username, String password, String memberCode) { if (isUserAdmin(username, password)) { return members.get(memberCode).getMemberBookings(); } else { ModelObject tempUser = userLogin(username, password); { //Check to see if the user is only requesting their own info if (tempUser.getCode() == memberCode) { return members.get(memberCode).getMemberBookings(); } else { return null; } } } } // Gets a list the staff that the Health Spa is currently maintaining LinkedList getStaffList() { LinkedList staffList = new LinkedList(); for (Iterator i = staff.values().iterator(); i.hasNext();) { Staff f = i.next(); staffList.add(new ModelObject(f.getName(), f.getCode())); } return staffList; } // Gets a list of staff available at a certain time LinkedList getStaffAvailableList(int hour, int day, int week) { LinkedList staffAvailableList = new LinkedList(); Staff s; for (Iterator i = staff.values().iterator(); i.hasNext();) { s = i.next(); if (s.isAvailableAt(hour, day, week)) staffAvailableList.add((ModelObject) s); } return staffAvailableList; } // Handles a booking request. // Only a valid user can create a booking. int makeBooking(String roomCode, String memberCode, String staffCode, String username, String password, int hour, int day, int week) { //User did not choose a staff member? if (staffCode == null) { LinkedList freeStaff = this.getStaffAvailableList(hour, day, week); //Get first available staff (ideally it should be random - TODO: Randomise) staffCode = ((Staff) freeStaff.getFirst()).getCode(); } //Make sure the user is valid if (userLogin(username, password) != null) { /* *Basically marks a room as not available at this time period. *The memberCode and staffCode objects are not neccessary, but handed in as they may be handy in future. */ System.out.println("Booking a room..."); if (!(rooms.get(roomCode).makeBooking(memberCode, staffCode, hour, day, week))) { return -1;//Already booked } // Same idea here for the staff - roomCode has no relevance, but might be handy later. System.out.println("Booking in a staff members..."); staff.get(staffCode).makeBooking(roomCode, hour, day, week); // Adds the booking information to the user's account System.out.println("Adding booking to members account..."); members.get(memberCode).addBookingToAccount(rooms.get(roomCode).getName(), roomCode, day, hour, week); return 0; } else { //Invalid user return -1; } } int cancelBooking(Booking tempBooking, String memberCode, String username, String password) { //Make sure the user is valid if (userLogin(username, password) != null) { // Basically marks a room as not available from now on, at this time period. // The memberCode and staffCode objects are not neccessary, but handed in as they may be handy in future. System.out.println("Removing booking from room..."); rooms.get(tempBooking.getRoomCode()).removeBooking(memberCode, null, tempBooking.getHour(), tempBooking.getDay(), tempBooking.getWeek()); // Same idea here for the staff - roomCode has no relevance, but might be handy later. System.out.println("Removing booking from staff..."); // Adds the booking information to the user's account System.out.println("Removing booking from member..."); // members.get(memberCode).addBookingToAccount(rooms.get(roomCode).getName(), day, hour, week); members.get(memberCode).removeBookingFromAccount(tempBooking.getBookingNo()); return 0; } else { //Invalid user return -1; } } // Used to record that a payment has been made. Only admins can use this. public int recordPayment(String adminUsername, String adminPassword, String memberCode, int bookingNo) { if (isUserAdmin(adminUsername, adminPassword)) { members.get(memberCode).pay(bookingNo); return 0; } return -1; } // Gets a timetable for a particular time period, for a particular room boolean[] getRoomTimetableForPeriod(String roomCode, int hour, int week) { return rooms.get(roomCode).getRoomTimetableForPeriod(hour, week); } // Returns a ModelObject (containing the name and code of the user) if the user is valid. public ModelObject userLogin(String username, String password) { for (Iterator i = members.values().iterator(); i.hasNext();) { Member member = i.next(); if (member.getMemberUsername().equals(username) && member.getMemberPassword().equals(password)) { return new ModelObject(member.getName(), member.getCode()); } } return null; } // Gets a staff timetable for a particular week public boolean[][] getStaffRoster(String staffCode, int week) { for (Iterator i = staff.values().iterator(); i.hasNext();) { Staff tempStaff = i.next(); if (tempStaff.getCode().equals(staffCode)) { return tempStaff.getStaffRoster(week); } } return null; } // Adds a new user to the system. Only admins can do this. public int addUser(String username, String password, String newMemberUsername, String newMemberPassword, String newMemberName) { if (isUserAdmin(username, password)) { members.put(String.valueOf(members.size()), new Member(newMemberUsername, newMemberPassword, newMemberName, String.valueOf(members.size()))); return 0; } else { //Error, not admin. return -1; } } // Changes a user's password. Only the user themselves can do this. public int changePassword(String memberCode, String memberUsername, String memberCurrentPassword, String memberNewPassword) { Member tempMember = members.get(memberCode); if (userLogin(memberUsername, memberCurrentPassword) != null) { tempMember.setMemberPassword(memberNewPassword); return 0; } else return -1; } // Sets the price of a room. Only admins can do this. public int setPrice(String adminUsername, String adminPassword, String roomCode, double newPrice) { rooms.get(roomCode).setPrice(newPrice); System.out.println("New Price:" + rooms.get(roomCode).getPrice()); return 0; } // Helper class to determine if a particular user is an admin, given the memberCode. public boolean isUserAdmin(String memberCode) { if (members.get(memberCode).isAdmin()) { return true; } else { return false; } } // Helper class to determine if a particular user is an admin, given the username and password. public boolean isUserAdmin(String username, String password) { for (Iterator i = members.values().iterator(); i.hasNext();) { Member tempAdmin = i.next(); if (tempAdmin.isAdmin()) { if (tempAdmin.getMemberUsername().equals(username) && tempAdmin.getMemberPassword().equals(password)) { return true; } } } return true; } }