/** * The ServiceEndEvent is an Event which handles the end of a service. * It handles freeing the counter and also generating a departure event * * @author Yadunand Prem * @version CS2030S AY22/23 Semester 2 */ class ServiceEndEvent extends Event { private ServiceCounter counter; private Customer customer; private Shop shop; public ServiceEndEvent(double time, Customer customer, Shop shop, ServiceCounter counter) { super(time); this.customer = customer; this.shop = shop; this.counter = counter; } @Override public String toString() { return super.toString() + String.format(": %s service done (by %s)", this.customer, this.counter); } @Override public Event[] simulate() { // if there are customers in the counter queue, they will be serviced next. // Customers in the shop queue will then be added to the counter queue if (!this.counter.isQueueEmpty()) { Customer serviceCustomer = this.counter.leaveQueue(); if (!this.shop.isQueueEmpty()) { return new Event[] { new DepartureEvent(this.getTime(), this.customer), new ServiceBeginEvent(this.getTime(), serviceCustomer, this.shop, this.counter), new JoinCounterQueueEvent(this.getTime(), this.shop.leaveQueue(), counter) }; } return new Event[] { new DepartureEvent(this.getTime(), this.customer), new ServiceBeginEvent(this.getTime(), serviceCustomer, this.shop, this.counter), }; } // There can also be the case where the counter queue may be empty but there are // customers in the shop queue. if (!this.shop.isQueueEmpty()) { return new Event[] { new DepartureEvent(this.getTime(), this.customer), new ServiceBeginEvent(this.getTime(), this.shop.leaveQueue(), this.shop, this.counter), }; } // else there are no more customers in the queue, and the counter can be freed this.counter.free(); return new Event[] { new DepartureEvent(this.getTime(), this.customer) }; } }