]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
[XVSM] Create initial Pizzeria Recovery support.
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / xvsm / DriverXVSM.java
1 package at.ac.tuwien.sbc.valesriegler.xvsm;
2
3
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;
12
13 import java.io.Serializable;
14 import java.util.Arrays;
15 import java.util.List;
16
17 public class DriverXVSM extends AbstractXVSMConnector {
18     private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
19
20     private int driverId;
21
22     public DriverXVSM(int id, int port) {
23         super(port);
24
25         this.driverId = id;
26
27         this.preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
28         this.deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
29         this.deliverDeliveryOrder = useContainer(Util.DELIVER_DELIVERY_ORDER);
30     }
31
32     public void listenForPreparedPizzas() {
33         /**
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!
40          */
41         SpaceListener preparedPizzasListener = new SpaceListenerImpl(capi, preparedDeliveryPizzasContainer, true) {
42
43             @Override
44             void onEntriesWritten(List<? extends Serializable> entries)
45                     throws Exception {
46
47                 log.info("HELLLOOOOO");
48
49                 List<Pizza> pizzas = castEntries(entries);
50
51                 for (Pizza pizza : pizzas) {
52                     int orderId = pizza.getOrderId();
53                     Order order = new Order();
54                     order.setId(orderId);
55
56                     TransactionReference tx = getDefaultTransaction();
57
58                     try {
59                         DeliveryGroupData entity = new DeliveryGroupData();
60                         entity.setDeliveryStatus(null);
61                         entity.setOrder(order);
62
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();
68
69                         Pizza pizzaTemplate = new Pizza();
70                         pizzaTemplate.setOrderId(orderId);
71
72                         List<Pizza> pizzasOfOrder = takeMatchingEntities(
73                                 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
74                                 MzsConstants.RequestTimeout.DEFAULT,
75                                 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
76
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,
87                                     tx);
88
89                             capi.commitTransaction(tx);
90                         } else {
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);
96                         }
97                     } catch (NullPointerException e) {
98
99                     } catch (Exception e) {
100                         capi.rollbackTransaction(tx);
101                     }
102                 }
103             }
104         };
105
106         createNotification(preparedPizzasListener, preparedDeliveryPizzasContainer);
107     }
108 }