]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
[XVSM] Some performance improvements for the simulation
[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.types.Order;
9 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
10 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
11 import org.mozartspaces.core.ContainerReference;
12 import org.mozartspaces.core.MzsConstants;
13 import org.mozartspaces.core.TransactionReference;
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
16
17 import java.io.Serializable;
18 import java.net.URI;
19 import java.util.Arrays;
20 import java.util.List;
21
22 public class DriverXVSM extends AbstractXVSMConnector {
23     private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
24
25     private int driverId;
26
27     public DriverXVSM(int id, int port) {
28         super(port);
29
30         this.driverId = id;
31
32         preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
33         deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
34         deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
35         pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
36
37     }
38
39
40     public void listenForPreparedDeliveryOrders() {
41         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                         final DeliveryGroupData deliveryGroup = 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 //                                pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
66
67                         if (!Util.runSimulation) {
68                             Thread.sleep(3000);
69                         }
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                             if (!Util.runSimulation) {
85                                 sendItemsToContainer(Arrays.asList(new Bill(1000, group.getId())), cref, MzsConstants.RequestTimeout.DEFAULT, null);
86                             }
87                         } else {
88                             group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
89                         }
90                         sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.DEFAULT, tx);
91                         capi.commitTransaction(tx);
92
93
94                     } catch (Exception e) {
95                         log.info("DRiverXVSM exception");
96                         log.info(e.getMessage());
97                         e.printStackTrace();
98                     }
99                 }
100
101             }
102         }).createSpaceListenerImpl();
103     }
104
105     public void listenForPreparedDeliveryPizzas() {
106         getDefaultBuilder().setCref(preparedDeliveryPizzasContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
107
108             @Override
109             public void onEntriesWritten(List<? extends Serializable> entries)
110                     throws Exception {
111
112                 List<Pizza> pizzas = castEntries(entries);
113
114                 for (Pizza pizza : pizzas) {
115                     int orderId = pizza.getOrderId();
116                     Order order = new Order();
117                     order.setId(orderId);
118
119                     TransactionReference tx = getDefaultTransaction();
120
121                     try {
122                         DeliveryGroupData entity = new DeliveryGroupData();
123                         entity.setDeliveryStatus(null);
124                         entity.setOrder(order);
125
126                         final DeliveryGroupData groupData = takeMatchingEntity(entity,
127                                 deliveryOrderTakenContainer, tx, MzsConstants.RequestTimeout.DEFAULT,
128                                 "Another driver just checks if the delivery order is complete");
129                         int numberOfPizzas = groupData.getOrder().getNumberOfPizzas();
130
131                         Pizza pizzaTemplate = new Pizza();
132                         pizzaTemplate.setOrderId(orderId);
133
134                         List<Pizza> pizzasOfOrder = takeMatchingEntities(
135                                 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
136                                 MzsConstants.RequestTimeout.DEFAULT,
137                                 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
138
139                         if (pizzasOfOrder.size() == numberOfPizzas) {
140                             final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
141                             sendItemsToContainer(groupsWithCompleteOrder,
142                                     deliverDeliveryOrderContainer, MzsConstants.RequestTimeout.DEFAULT,
143                                     tx);
144
145                             capi.commitTransaction(tx);
146                         } else {
147                             log.info("Not yet all pizzas prepared! Order with id "
148                                     + orderId + " has " + numberOfPizzas
149                                     + " pizzas, but only " + pizzasOfOrder.size()
150                                     + " pizzas are ready by now!");
151                             capi.rollbackTransaction(tx);
152                         }
153                     } catch (NullPointerException e) {
154
155                     } catch (Exception e) {
156                         capi.rollbackTransaction(tx);
157                     }
158                 }
159             }
160         }).createSpaceListenerImpl();
161     }
162 }