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