1 package at.ac.tuwien.sbc.valesriegler.xvsm;
4 import at.ac.tuwien.sbc.valesriegler.common.Util;
5 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
6 import at.ac.tuwien.sbc.valesriegler.types.Order;
7 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
8 import org.mozartspaces.core.MzsConstants;
9 import org.mozartspaces.core.TransactionReference;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
13 import java.io.Serializable;
14 import java.util.Arrays;
15 import java.util.List;
17 public class DriverXVSM extends AbstractXVSMConnector {
18 private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
22 public DriverXVSM(int id, int port) {
27 this.preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
28 this.deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
29 this.deliverDeliveryOrder = useContainer(Util.DELIVER_DELIVERY_ORDER);
32 public void listenForPreparedPizzas() {
34 * A driver gets informed when a new pizza is complete. He takes the
35 * orderId of the pizza and looks up the corresponding order from which
36 * he gets the number of necessary pizzas of the order. He then tries to
37 * fetch all pizzas with the corresponding orderId and compares the
38 * number of those pizzas with the number of necessary pizzas. If all
39 * pizzas of an order are complete he then delivers them!
41 SpaceListener preparedPizzasListener = new SpaceListenerImpl(capi, preparedDeliveryPizzasContainer, true) {
44 void onEntriesWritten(List<? extends Serializable> entries)
47 log.info("HELLLOOOOO");
49 List<Pizza> pizzas = castEntries(entries);
51 for (Pizza pizza : pizzas) {
52 int orderId = pizza.getOrderId();
53 Order order = new Order();
56 TransactionReference tx = getDefaultTransaction();
59 DeliveryGroupData entity = new DeliveryGroupData();
60 entity.setDeliveryStatus(null);
61 entity.setOrder(order);
63 DeliveryGroupData groupData = takeMatchingEntity(entity,
64 deliveryOrderTakenContainer, tx, MzsConstants.RequestTimeout.DEFAULT,
65 "Another driver just checks if the delivery order is complete");
66 int groupId = groupData.getId();
67 int numberOfPizzas = groupData.getOrder().getNumberOfPizzas();
69 Pizza pizzaTemplate = new Pizza();
70 pizzaTemplate.setOrderId(orderId);
72 List<Pizza> pizzasOfOrder = takeMatchingEntities(
73 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
74 MzsConstants.RequestTimeout.DEFAULT,
75 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
77 if (pizzasOfOrder.size() == numberOfPizzas) {
78 DeliveryGroupData group = new DeliveryGroupData();
79 group.setDriverId(driverId);
80 Order completeOrder = new Order();
81 completeOrder.setId(orderId);
82 completeOrder.setGroupId(groupId);
83 group.setOrder(completeOrder);
84 final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(group);
85 sendItemsToContainer(groupsWithCompleteOrder,
86 deliverDeliveryOrder, MzsConstants.RequestTimeout.DEFAULT,
89 capi.commitTransaction(tx);
91 log.info("Not yet all pizzas prepared! Order with id "
92 + orderId + " has " + numberOfPizzas
93 + " pizzas, but only " + pizzasOfOrder.size()
94 + " pizzas are ready by now!");
95 capi.rollbackTransaction(tx);
97 } catch (NullPointerException e) {
99 } catch (Exception e) {
100 capi.rollbackTransaction(tx);
106 createNotification(preparedPizzasListener, preparedDeliveryPizzasContainer);