Design and develop a distributed Hotel booking application using Java RMI. A distributed hotel booking system consists of the hotel server and the client machines. The server manages hotel rooms booking information. A customer can invoke the following operations at his machine
i) Book the room for the specific guest
ii) Cancel the booking of a guest
Required files: Included with this document are all files needed to run this application. These files are:
1. Compile all java files
2. Create Stub and Skeleton class file for RoomBookingServer
3. Run RMIC Registry
4. Run RoomBookingServer
5. In new terminal Run RoomBookingClient
Note: Make Sure that you are running the programs in same directory
Java Codes:
1. In terminal
2. In terminal
3. In terminal
4. In terminal
5. In terminal
6. In terminal
7. In terminal
Outputs:
i) Book the room for the specific guest
ii) Cancel the booking of a guest
Required files: Included with this document are all files needed to run this application. These files are:
- RoomBookingClient.java
- RoomBookingServer.java
- RoomBookingInterface.java
- Room.java
- RoomList.java
- Connect.policy
- Rooms.txt
- rooms.txt
1. Compile all java files
javac *.java
2. Create Stub and Skeleton class file for RoomBookingServer
rmic RoomBookingServer
3. Run RMIC Registry
rmiregistry &
4. Run RoomBookingServer
java RoomBookingServer
5. In new terminal Run RoomBookingClient
java RoomBookingClient
Note: Make Sure that you are running the programs in same directory
Java Codes:
1. In terminal
gedit RoomBookingClient.java
import java.rmi.*;
import java.rmi.server.*;
import java.io.*;
class RoomBookingClient
{
/**
* This is the Client Class. It takes an input from the user, calls the methods available
* to the client from the server class and gives an ouput depending on the operation performed.
*/
public static boolean validChoice = true;
static String [] daysOfWeek = { "Monday |", "Tuesday |", "Wednesday|", "Thursday |" , "Friday |" , "Saturday |" , "Sunday |" };
public static void main (String[] args)
{
try
{
//System.setSecurityManager ( new RMISecurityManager ( )); //set up the security manager
//String name = "rmi://localhost:9999/RoomBookingSystem"; //connect on local host on port 9999
String name="rmi://127.0.0.1/RoomBookingSystem";
RoomBookingInterface rbi =(RoomBookingInterface) Naming.lookup (name);
rbi.initRooms(); //set up the room booking system
while( validChoice != false )
{
//A small command line interface for the user to use the system.
System.out.println(" ");
System.out.println("*********************Room Booking Service********************");
System.out.println("");
System.out.println(" Please select a service");
System.out.println("");
System.out.println("1. List of all rooms.");
System.out.println("2. Check availability of a room.");
System.out.println("3. Book a room.");
System.out.println("4. Display weekly timetable for a room.");
System.out.println("");
//A buffered reader to allow input from the command line from the user.
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.println("");
System.out.println("Select a number between 1 and 4, 0 to exit");
System.out.println("");
System.out.flush();
String response = input.readLine();
int i = Integer.parseInt(response);
RoomList ListOfAllRooms = new RoomList(); //RoomList Object which stores
//a list of all the rooms available.
try{
switch (i)
{
case 0: System.out.println("Goodbye"); //User has quit the application.
validChoice =false;
break;
case 1: System.out.println("");
System.out.println("The full list of rooms is as follows");
System.out.println("");
System.out.println("Room|Capacity");
System.out.println("----|--------");
ListOfAllRooms = rbi.allRooms(); //Run the allRooms method which
//returns the list of all rooms.
for(int c = 0; c < 100; c++) //Print the list.
{
if (ListOfAllRooms.RoomList[c] ==null)
{
break;
}
System.out.println(ListOfAllRooms.RoomList[c]);
}
System.out.println("");
break;
case 2: System.out.println("");
System.out.println("Check a room");
System.out.println("Enter the room name");
String check_room = input.readLine();
System.out.println("Enter the day - ");
System.out.println("0=Mon , 1=Tues, 3=Wed ,4=Thurs , 5=Fri, 6=Sat, 7=Sun");
String check_day = input.readLine();
int real_day = Integer.parseInt(check_day);
System.out.println("Enter the start time - ");
System.out.println("0=8am , 1=9am , 2=10am , 3=11am , 4=12pm , 5=1pm , 6=2pm , 7=3pm , 8=4pm , 9=5pm , 10=6pm , 11= 7pm");
String check_time = input.readLine();
int real_time = Integer.parseInt(check_time);
//This checks whether a room is available given the room name, day and time.
String temp = rbi.checkRoom(check_room,real_day,real_time);
System.out.println(temp);
System.out.println("");
break;
case 3: System.out.println("Room Booking Service - Rooms can be booked from 8am to 8pm");
System.out.println("");
System.out.println("Time slots go from 0 for 8am up to 11 for 7pm - Enter a value in this range");
System.out.println("");
System.out.println("Enter the room name");
String book_room = input.readLine();
System.out.println("");
System.out.println("Enter the day -");
System.out.println("0=Mon , 1=Tues, 3=Wed ,4=Thurs , 5=Fri, 6=Sat, 7=Sun");
String book_day = input.readLine();
int real_day2 = Integer.parseInt(book_day);
System.out.println("");
System.out.println("Enter the start time -");
System.out.println("0=8am , 1=9am , 2=10am , 3=11am , 4=12pm , 5=1pm , 6=2pm , 7=3pm , 8=4pm , 9=5pm , 10=6pm , 11= 7pm");
String book_time = input.readLine();
int realb_time = Integer.parseInt(book_time);
//This checks whether a room is available, if it is it then reserves the room.
String resp = rbi.bookRoom(book_room,real_day2,realb_time);
System.out.println(resp);
System.out.println("");
break;
case 4: System.out.println("Enter the Room name");
String Room1 = new String();
Room1 = input.readLine();
//This checks the timetable for a room. A 2D array containing
//the timetable is returned from the server.
System.out.println("TimeSlot | 0 1 2 3 4 5 6 7 8 9 10 11");
int rtt [][]=(int[][])rbi.roomTimeTable(Room1).clone();
for(int f=0;f<7;f++)
{
System.out.println("");
System.out.print(daysOfWeek[f]);
for(int j=0;j<12;j++)
{
System.out.print(" ");
System.out.print(rtt[f][j]);
}
}
System.out.println("");
System.out.println(" ");
System.out.println("The key to start times is as follows... ");
System.out.println("0 = 8am , 1 = 9am , 2 = 10am , 3 = 11am , 4 = 12pm , 5 = 1pm , 6 = 2pm , 7 = 3pm , 8 = 4pm , 9 = 5pm , 10 = 6pm , 11 = 7pm");
System.out.println("");
break;
}
}
catch(Exception e)
{
System.err.println("Sorry but you have entered one of the fields incorrectly, Please try again ");
}
}
}
catch (Exception ex)
{
System.err.println (ex);
}
}
}
2. In terminal
gedit RoomBookingServer.java
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
class RoomBookingServer extends UnicastRemoteObject implements RoomBookingInterface
{
/**
* This is the Server Class. It contains the working methods which can be used by the client.
*/
protected int day;
protected int time;
protected int room;
protected String str = new String();
public String RoomListTemp [] = new String [100]; //Temporary store for list of rooms
public String temp = new String();
public Room RoomArray[] = new Room[100]; //Array of Room Objects
RoomList tempList = new RoomList();
public RoomBookingServer ( ) throws RemoteException
{
super ( );
}
/**
* This method is called once by the client when the application starts. It reads
* in the input from the text file and creates an Object for each room with the
* name and capacity that was specified in the file.
*/
public void initRooms() throws RemoteException
{
String record = null;
String tempRoom = null;
String tempCap = null;
int recCount = 0;
int num;
int capacity;
try
{
//This reads in the text from the file and uses that to create the
//Room Objects. The name is specified first in the text file and the
//capacity is specified last. This is manipulated in order to take in
//these parameters when creating the Rooms.
BufferedReader b = new BufferedReader(new FileReader("Rooms.txt"));
while((record = b.readLine()) != null)
{
num = (record.lastIndexOf (" ", record.length ())) + 1;
tempRoom = record.substring (0,num -1); //Reads in the Room name from file
tempCap = record.substring (num,record.length ());
capacity = Integer.parseInt(tempCap); //Reads in the capacity from file
RoomArray[recCount] = new Room(tempRoom, capacity); //Fills the array with the created Objects.
recCount ++;
}
b.close(); //close the input stream.
} catch (IOException e)
{
System.out.println("Error!" +e.getMessage());
}
}
/**
* This method is used to return the list of rooms and there capacity to the client.
* It returns a RoomList Object which contains the arrayList of Rooms. The Client
* can then retrieve a full list of rooms.
*/
public RoomList allRooms() throws RemoteException
{
try
{
BufferedReader in = new BufferedReader(new FileReader("rooms.txt")); //read in the text file.
if((str = in.readLine()) != null)
{
tempList.RoomList[0] = str;
for (int i = 1; i< 100; i++)
{
if((str = in.readLine()) != null)
{
tempList.RoomList[i] = str;
}
}
}
in.close();
}
catch (IOException e)
{
}
return tempList;
}
/**
* This method takes in a string and then compares that string with the name of each Object
* in the array of Rooms. If it finds the room it returns the index, -1 otherwise.
*/
public int compareRoom(String str)
{
for(int i=0; i< RoomArray.length; i++)
{
if(RoomArray[i].name.equals (str))
{
return i;
}
}
return -1;
}
/**
* This method is used to check whether a room is available or not. Firstly it checks
* for the room in the array, if it finds it it then checks whether the requested
* time slot on the requested day is available. It returns a string to the client
* depending on the value of the timeslot.
*/
public String checkRoom(String r ,int day , int startTime) throws RemoteException
{
int i = compareRoom(r);
if (RoomArray[i].slotAvailable(day, startTime) == true) //calls methos available to Room Object
{
String s = "Room is available for booking";
return s;
}
else
{
String s = "Sorry the room is not available for booking";
return s;
}
}
/**
* This method is used to book a Room. Again it checks whether the slot is available and depending
* on the result it reserves that slot and informs the client or it informs them that
* the slot has already been reserved.
*/
public String bookRoom(String r, int day , int startTime) throws RemoteException
{
int i = compareRoom(r);
if (RoomArray[i].slotAvailable(day, startTime) == true)
{
RoomArray[i].book(day,startTime);
String s = "Room has been successfully booked.";
return s;
}
else
{
String s = "Sorry but the Room has already been booked.";
return s;
}
}
/**
* This method is used to calculate the timetable for each room. It returns relevant
* the 2D array to the client displaying the weekly timetable for the requested room.
*/
public int [][] roomTimeTable(String room) throws RemoteException
{
int i;
System.out.println("TimeTable" + room);
for ( i = 0; i< RoomArray.length; i++)
{
if(RoomArray[i].name.equals(room))
{
return RoomArray[i].daySlot;
}
else
{
System.out.println("Searching for the room");
}
}
return RoomArray[i].daySlot;
}
//Main Method
public static void main (String[] args)
{
try
{
RoomBookingServer server = new RoomBookingServer ();
//String name = "rmi://localhost:9999/RoomBookingSystem";
// Naming.bind (name, server);
String name = "RoomBookingSystem";
Naming.bind (name, server);
System.out.println (name + " is running");
}
catch (Exception ex)
{
System.err.println (ex);
}
}
}
3. In terminal
gedit RoomBookingInterface.java
import java.rmi.*;
import java.rmi.server.*;
/**
* This is the interface, it contains the 5 methods which the Client can use.
*/
public interface RoomBookingInterface extends Remote
{
public void initRooms() throws RemoteException;
public RoomList allRooms () throws RemoteException;
public String checkRoom (String r, int day , int startTime) throws RemoteException;
public String bookRoom (String r, int day , int startTime) throws RemoteException;
public int[][] roomTimeTable (String room) throws RemoteException;
}
4. In terminal
gedit Room.java
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.io.Serializable;
class Room implements Serializable
{
/*
* This is the Room class. Each Room Object has a name and a capacity. It also
* contains a 7 * 12 array which represents the 7 days of the week and the
* 12 hours between 8 am and 8pm(The valid hours for booking a room).
*/
int daySlot[][] = new int[7][12]; //represents days and hours
String name;
int capacity;
public Room(String n , int cap) //constructor that sets all slots to zero - unbooked
{
this.name =n;
this.capacity = cap;
for (int i=0; i<7; i++)
{
for (int j=0; j<11; j++)
{
this.daySlot[i][j] = 0;
}
}
}
/**
* This Method is used to check whether a particular timeslot on a particular day
* has already been booked. If the slot contains a 1 then it has already been booked.
* If it contains a 0 then it is available. The method returns a true or false value.
*/
public boolean slotAvailable(int day, int slot)
{
if (daySlot[day][slot] == 1)
{
return false;
}
else
{
return true;
}
}
/**
* This Method is used to book a slot. It sets the relevant slot to a 1.
*/
public void book(int day , int slot)
{
this.daySlot[day][slot] = 1;
}
}
5. In terminal
gedit RoomList.java
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.io.Serializable;
class RoomList implements Serializable
{
public String RoomList [] = new String [100];
//contains an array which holds the maximun number of rooms. To allow for
//more rooms just increase the size of this array.
}
6. In terminal
gedit rooms.txt
Room1 1
Room2 2
Room3 3
Room4 4
7. In terminal
gedit Rooms.txt
Room1 1
Room2 2
Room3 3
Room4 4
Outputs:
Room Booking System using Java RMI |
Room Booking System using Java RMI |
Comments
Post a Comment