]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
[XVSM] Add presentation
[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.*;
7 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
8 import org.mozartspaces.capi3.EntryLockedException;
9 import org.mozartspaces.core.ContainerReference;
10 import org.mozartspaces.core.MzsConstants;
11 import org.mozartspaces.core.MzsCoreException;
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         preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
32         deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
33         deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
34         pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
35
36     }
37
38
39     public void listenForPreparedDeliveryOrders() {
40         getDefaultBuilder("listenForPreparedDeliveryOrders").setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
41
42             @Override
43             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
44                 handleDeliveries(entries);
45
46             }
47         }).createSpaceListenerImpl();
48     }
49
50     private void handleDeliveries(List<? extends Serializable> entries) throws MzsCoreException {
51         final List<DeliveryGroupData> deliveries = castEntries(entries);
52
53         for (DeliveryGroupData delivery : deliveries) {
54             DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
55             template.setDeliveryStatus(DeliveryStatus.ORDERED);
56
57             final TransactionReference tx = capi.createTransaction(
58                     7000,
59                     URI.create(String.format(Util.SERVER_ADDR, port)));
60             final String error = "Another driver wants to deliver this order!";
61
62             try {
63                 // Get lock for delivering this delivery order
64                 takeMatchingEntity(template, deliverDeliveryOrderContainer, tx, MzsConstants.RequestTimeout.ZERO, error);
65                 final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, MzsConstants.RequestTimeout.DEFAULT, "Cannot get the delivery order!");
66                 group.setDriverId(driverId);
67                 group.setDeliveryStatus(DeliveryStatus.IN_PROGRESS);
68
69                 final List<DeliveryGroupData> groups = Arrays.asList(group);
70                         sendItemsToContainer(groups,
71                                 pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
72
73                 if (!Util.runSimulation) {
74                     Thread.sleep(3000);
75                 }
76
77                 final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
78                 ContainerReference cref = null;
79                 boolean success = false;
80                 try {
81                     cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
82                     log.debug("Looked up container {} successfully!", address);
83                     success = true;
84
85                 } catch (Exception ex) {
86                     log.info("Could not find container {}", address);
87                 }
88                 if (success) {
89                     group.setDeliveryStatus(DeliveryStatus.DELIVERED);
90                     if (!Util.runSimulation) {
91                         double sum = computeSum(group.getOrder());
92                         sendItemsToContainer(Arrays.asList(new Bill(sum, group.getId())), cref, MzsConstants.RequestTimeout.ZERO, null);
93                     }
94                 } else {
95                     group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
96                 }
97                 sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, tx);
98                 capi.commitTransaction(tx);
99
100
101             } catch(EntryLockedException e) {
102                 capi.rollbackTransaction(tx);
103             } catch (Exception e) {
104                 log.info("DRiverXVSM exception");
105                 log.info(e.getMessage());
106                 e.printStackTrace();
107             }
108         }
109     }
110
111     private double computeSum(Order order) {
112         final List<PizzaOrder> orderedPizzas = order.getOrderedPizzas();
113         double sum = 0;
114         for (PizzaOrder pizza : orderedPizzas) {
115             final PizzaType pizzaType = pizza.getPizzaType();
116             switch (pizzaType) {
117                 case CARDINALE: sum = sum + 6;
118                     break;
119                 case MARGHERITA: sum = sum + 5;
120                     break;
121                 case SALAMI: sum = sum + 5.5;
122                     break;
123                 default:
124                     throw new RuntimeException("Unhandled Pizzatype: " + pizzaType);
125             }
126         }
127         return sum;
128     }
129
130     public void listenForPreparedDeliveryPizzas() {
131         getDefaultBuilder("listenForPreparedDeliveryPizzas").setCref(preparedDeliveryPizzasContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
132
133             @Override
134             public void onEntriesWritten(List<? extends Serializable> entries)
135                     throws Exception {
136
137                 List<Pizza> pizzas = castEntries(entries);
138
139                 for (Pizza pizza : pizzas) {
140                     int orderId = pizza.getOrderId();
141                     Order order = new Order();
142                     order.setId(orderId);
143
144                     TransactionReference tx = getDefaultTransaction();
145
146                     try {
147                         DeliveryGroupData entity = new DeliveryGroupData();
148                         entity.setDeliveryStatus(null);
149                         entity.setOrder(order);
150
151                         final DeliveryGroupData groupData = takeMatchingEntity(entity,
152                                 deliveryOrderTakenContainer, tx, MzsConstants.RequestTimeout.DEFAULT,
153                                 "Another driver just checks if the delivery order is complete");
154                         int numberOfPizzas = groupData.getOrder().getNumberOfPizzas();
155
156                         Pizza pizzaTemplate = new Pizza();
157                         pizzaTemplate.setOrderId(orderId);
158
159                         List<Pizza> pizzasOfOrder = takeMatchingEntities(
160                                 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
161                                 MzsConstants.RequestTimeout.DEFAULT,
162                                 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
163
164                         if (pizzasOfOrder.size() == numberOfPizzas) {
165                             final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
166                             sendItemsToContainer(groupsWithCompleteOrder,
167                                     deliverDeliveryOrderContainer, MzsConstants.RequestTimeout.DEFAULT,
168                                     tx);
169
170                             capi.commitTransaction(tx);
171                         } else {
172                             log.info("Not yet all pizzas prepared! Order with id "
173                                     + orderId + " has " + numberOfPizzas
174                                     + " pizzas, but only " + pizzasOfOrder.size()
175                                     + " pizzas are ready by now!");
176                             capi.rollbackTransaction(tx);
177                         }
178                     } catch (NullPointerException e) {
179
180                     } catch (Exception e) {
181                         capi.rollbackTransaction(tx);
182                     }
183                 }
184             }
185         }).createSpaceListenerImpl();
186     }
187 }