]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
[XVSM] Delivery in progress, Delivery done updates in UIs, Delivery logic
[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.DeliveryStatus;
7 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
8 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceListener;
9 import org.mozartspaces.core.ContainerReference;
10 import org.mozartspaces.core.MzsConstants;
11 import org.mozartspaces.core.TransactionReference;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14
15 import java.io.Serializable;
16 import java.net.URI;
17 import java.util.Arrays;
18 import java.util.List;
19
20 public class DriverXVSM extends AbstractXVSMConnector {
21     private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
22
23     private int driverId;
24
25     public DriverXVSM(int id, int port) {
26         super(port);
27
28         this.driverId = id;
29
30         this.preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
31         this.deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
32         this.deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
33         pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
34         deliveryDone = useContainer(Util.DELIVERY_DONE);
35         deliveryInProgress = useContainer(Util.DELIVERY_PROGRESS);
36     }
37
38
39     public void listenForPreparedDeliveryOrders() {
40         SpaceListener orderListener = getDefaultBuilder().setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
41
42             @Override
43             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
44                 final List<DeliveryGroupData> deliveries = castEntries(entries);
45
46                 for (DeliveryGroupData delivery : deliveries) {
47                     DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
48                     template.setDeliveryStatus(DeliveryStatus.ORDERED);
49
50                     final TransactionReference tx = capi.createTransaction(
51                            7000,
52                             URI.create(String.format(Util.SERVER_ADDR, port)));
53                     final String error = "Another driver wants to deliver this order!";
54
55                     try {
56                         // Get lock for delivering this delivery order
57                         takeMatchingEntity(template, deliverDeliveryOrderContainer, tx, MzsConstants.RequestTimeout.DEFAULT, error);
58                         final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, MzsConstants.RequestTimeout.DEFAULT, "Cannot get the delivery order!");
59                         group.setDriverId(driverId);
60                         group.setDeliveryStatus(DeliveryStatus.IN_PROGRESS);
61
62                         final List<DeliveryGroupData> groups = Arrays.asList(group);
63                         sendItemsToContainer(groups,
64                                 deliveryInProgress, MzsConstants.RequestTimeout.ZERO, null);
65                         sendItemsToContainer(groups,
66                                 pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
67
68                         Thread.sleep(3000);
69
70                         final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
71                         ContainerReference cref;
72                         try {
73                             cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
74                             log.debug("Looked up container {} successfully!", address);
75
76                             group.setDeliveryStatus(DeliveryStatus.DELIVERED);
77
78                         } catch (Exception ex) {
79                             log.info("Could not find container {}", address);
80
81                             group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
82                         }
83                         sendItemsToContainer(groups, deliveryDone, MzsConstants.RequestTimeout.DEFAULT, tx);
84                         sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.DEFAULT, tx);
85                         capi.commitTransaction(tx);
86
87
88                     } catch (Exception e) {
89                         log.info("DRiverXVSM exception");
90                         log.info(e.getMessage());
91                         e.printStackTrace();
92                     }
93                 }
94
95             }
96         }).createSpaceListenerImpl();
97     }
98 }