//Encode the Order object into string object public static String encode(Order o) { String enc_string = o.getAgencyId().ToString(); enc_string += "@" + o.getCardNo() + "@" + o.getHotelId() + "@" + o.getRooms() + "@" + o.getOrderId() + "@" + o.getQuotePrice(); return(enc_string); }
/*gets the order confirmation from the RecieptBuffer class, wheather * the order is allocated romms or is cancelled*/ public void getReciept() { try { while (pendingReciept > 0 || atLeastOneIsAlive() || agencyAlive) { if (pendingReciept >= 0) { if (atLeastOneIsDead()) { for (int i = 0; i < HotelBookingSystem.Buffer.getLength(); i++) { String x = HotelBookingSystem.Buffer.getBuffer(i); if (x.Equals("-1")) { continue; } else { //Console.WriteLine("Hi"); Order o = EncoderDecoder.decode(x); for (int j = 0; j < h.Length; j++) { if (o.getAgencyId() == agencyId && h[j].getHotelId() == o.getHotelId() && !h[j].isHotelAlive()) { Buffer.freeBuffer(i); pendingReciept--; Console.WriteLine("Agency {1}-> Cancelling Order {0} to Hotel {2} because Hotel has terminated.", o.getOrderId(), agencyId, o.getHotelId(), System.DateTime.Now); } } } } } String receipt = ReceiptBuffer.getBuffer(agencyId); if (!receipt.Equals("-1")) { Console.WriteLine("Agency {0}-> Confirmation Received: " + receipt, agencyId); pendingReciept--; } Thread.Sleep(500); } } } catch (Exception e) { Console.WriteLine(e.Message); } }
//processes the order by checking the available rooms and validating credit card with BankService void processOrder(Object x) { try { float price1 = roomPrice; Order o = (Order)x; encryptionService.ServiceClient encrypt = new encryptionService.ServiceClient(); int orderID = o.getOrderId(); int agencyID = o.getAgencyId(); int hotelID = o.getHotelId(); int roomsOrdered = o.getRooms(); float quotedPrice = o.getQuotePrice(); float totalPrice = quotedPrice * roomsOrdered; String cardNo = o.getCardNo(); String success = "Order " + orderID + " booked with " + hotelID + " for " + roomsOrdered + " rooms was processed successfully with a total of $" + totalPrice; //String failure = "Order " + orderID + " for Agency " + agencyID + " failed to proccess"; lock (this) { //Console.WriteLine("Thread{2} : Orderporcess ..{0}..,{1}", quotedPrice, roomPrice,Thread.CurrentThread.ManagedThreadId); //Console.WriteLine("OrderProcess***********" + this); if (BankService.validateCard(encrypt.Encrypt(cardNo)) == false) { ReceiptBuffer.setBuffer(agencyID, "The card number for Order " + orderID + " booked with Hotel " + hotelID + " is invalid"); } else if (roomsOrdered > roomsAvailable) { ReceiptBuffer.setBuffer(agencyID, "The number of rooms ordered in Order " + orderID + " booked with " + hotelID + " is greater than the available rooms"); } else if ((int)quotedPrice != (int)price1) { //Console.WriteLine("Thread:"+Thread.CurrentThread.ManagedThreadId+" Orderporcess ..The quoted price for Order " + orderID + " for Agency " + agencyID + " of $" + quotedPrice + " does not match the current price of $" + roomPrice); ReceiptBuffer.setBuffer(agencyID, "The quoted price for Order " + orderID + " booked with Hotel " + hotelID + " of $" + quotedPrice + " does not match the current price of $" + price1); } else { roomsAvailable = roomsAvailable - roomsOrdered; ReceiptBuffer.setBuffer(agencyID, success); } } } catch (Exception e) { Console.WriteLine(e.Message); } }
//This method is started as a thread public void runHotel() { try { ArrayList orderthreadarr = new ArrayList(); hotelAlive = true; String x = ""; new Thread(new ThreadStart(runPricingControl)).Start(); while (hotelAlive) { for (int j = 0; j < HotelBookingSystem.Buffer.getLength(); j++) { x = HotelBookingSystem.Buffer.getBuffer(j); if (x.Equals("-1")) { continue; } else { Order o = EncoderDecoder.decode(x); if (o.getHotelId() == hotelId) { HotelBookingSystem.Buffer.freeBuffer(j); totalRoomsOrdered += o.getRooms(); Console.WriteLine("Hotel {0}-> Received OrderId-{1} from Agency{2} ..PriceQuote:{3} , Rooms Ordered:{4} ", hotelId, o.getOrderId(), o.getAgencyId(), o.getQuotePrice(), o.getRooms()); Thread t = new Thread(new ParameterizedThreadStart(processOrder)); t.Start(o); orderthreadarr.Add(t); } } } Thread.Sleep(500); } foreach (Thread item in orderthreadarr) { item.Join(); } Console.WriteLine("Hotel {0}-> Terminated at Timestamp: {1}", hotelId, System.DateTime.Now); } catch (Exception e) { Console.WriteLine(e.Message); } }