51 lines
1.6 KiB
Java
51 lines
1.6 KiB
Java
|
|
/**
|
|
* The ArrivalEvent is an Event which handles the arrival of a customer
|
|
* It decides whether a customer should go into queue or go to a counter
|
|
* It also allocates a counter to the customer. This event thus returns either a
|
|
* DepartureEvent or a ServiceBeginEvent
|
|
*
|
|
* @author Yadunand Prem
|
|
* @version CS2030S AY22/23 Semester 2
|
|
*/
|
|
class ArrivalEvent extends Event {
|
|
|
|
private Customer customer;
|
|
private Shop shop;
|
|
|
|
public ArrivalEvent(Customer customer, Shop shop) {
|
|
super(customer.getArrivalTIme());
|
|
this.customer = customer;
|
|
this.shop = shop;
|
|
}
|
|
|
|
@Override
|
|
public Event[] simulate() {
|
|
ServiceCounter availableCounter = this.shop.getAvailableCounter();
|
|
// check if counters are available. If available, start service for that
|
|
// customer
|
|
if (availableCounter != null) {
|
|
return new Event[] {
|
|
new ServiceBeginEvent(this.getTime(), customer, shop, availableCounter) };
|
|
}
|
|
// if no counters available, check if queue slots avialable in counters
|
|
availableCounter = this.shop.findCounterWithQueue();
|
|
if (availableCounter != null) {
|
|
return new Event[] {
|
|
new JoinCounterQueueEvent(this.getTime(), this.customer, availableCounter)
|
|
};
|
|
}
|
|
// if shop queue isn't empty, join shop queue
|
|
if (!this.shop.isQueueFull()) {
|
|
return new Event[] { new JoinShopQueueEvent(customer, shop) };
|
|
}
|
|
return new Event[] { new DepartureEvent(this.getTime(), customer) };
|
|
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return String.format("%s: %s arrived %s", super.toString(), this.customer, this.shop);
|
|
}
|
|
}
|