We want to implement a virtual shopping system, whether the threads are either clients using the web app or clients buying products on the physical shop using the mobile app. The lifecycle of any client interaction is summarised by ClientLifecycle: Each client interacts with the shop through
the RainforestShop via the login method, through which each client can add items to its basket and perform re-shelving operations.
Each client can get a list of available items at the time of the query, basket a given product by name, (re)shelf the product (thus removing it from the basket), checkout, and proceed with the payment (thus either buying all the items on the basket or none of those entirely), and logging out of the system while losing the information of all the items being previously put in the basket from the real/virtual shelf.
Each time an allowed user logs in, a non-empty transaction will be created with a unique transaction ID. The unavailability of the product shall be confirmed not while basketing the items, rather than after purchasing those. At this stage, the shop supplier might be notified that some products are missing and refurbish the show with a non-zero amount of products of the same type. For simplicity’s sake, the refurbishWithItems method will be in charge of creating the number of desired products and placing them on the shelf.
As in any industrial setting where teams split up the duties, you are assigned an API that you need to implement. This will then require finalizing the implementation of RainforestShop and the integration of concurrency
mechanisms in ProductMonitor; the Transaction class shall not be changed! The Testing solves a twofold task: showing how Clients, Suppliers, and the Shop system are communicating, as well as providing some preliminary guidelines on how the coursework is going to be assessed.
The student is free to choose whichever is the best way to pass the tests (not fully disclosed to the students) in the Testing class. E.g., the RainforestShop could be either modeled as a finer-grained monitor, but inside this monitor at least one thread per logged user should be running; also, such a Rainforest Shop could be also implemented as consumer threads handling all of the client’s messages.