]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/DriverXVSM.java
GUI fix for Tables OutOfBoundsException
[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.MzsCoreException;
14 import org.mozartspaces.core.TransactionReference;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 import java.io.Serializable;
19 import java.net.URI;
20 import java.util.Arrays;
21 import java.util.List;
22
23 public class DriverXVSM extends AbstractXVSMConnector {
24     private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
25
26     private int driverId;
27
28     public DriverXVSM(int id, int port) {
29         super(port);
30
31         this.driverId = id;
32
33         preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
34         deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
35         deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
36         pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
37
38     }
39
40
41     public void listenForPreparedDeliveryOrders() {
42         getDefaultBuilder("listenForPreparedDeliveryOrders").setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
43
44             @Override
45             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
46                 handleDeliveries(entries);
47
48             }
49         }).createSpaceListenerImpl();
50     }
51
52     private void handleDeliveries(List<? extends Serializable> entries) throws MzsCoreException {
53         final List<DeliveryGroupData> deliveries = castEntries(entries);
54
55         for (DeliveryGroupData delivery : deliveries) {
56             DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
57             template.setDeliveryStatus(DeliveryStatus.ORDERED);
58
59             final TransactionReference tx = capi.createTransaction(
60                     7000,
61                     URI.create(String.format(Util.SERVER_ADDR, port)));
62             final String error = "Another driver wants to deliver this order!";
63
64             try {
65                 // Get lock for delivering this delivery order
66                 takeMatchingEntity(template, deliverDeliveryOrderContainer, tx, MzsConstants.RequestTimeout.ZERO, error);
67                 final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, 2000, "Cannot get the delivery order!");
68                 group.setDriverId(driverId);
69                 group.setDeliveryStatus(DeliveryStatus.IN_PROGRESS);
70
71                 final List<DeliveryGroupData> groups = Arrays.asList(group);
72                         sendItemsToContainer(groups,
73                                 pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
74
75                 if (!Util.runSimulation) {
76                     Thread.sleep(3000);
77                 }
78
79                 final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
80                 ContainerReference cref = null;
81                 boolean success = false;
82                 try {
83                     cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
84                     log.debug("Looked up container {} successfully!", address);
85                     success = true;
86
87                 } catch (Exception ex) {
88                     log.info("Could not find container {}", address);
89                 }
90                 if (success) {
91                     group.setDeliveryStatus(DeliveryStatus.DELIVERED);
92                     if (!Util.runSimulation) {
93                         sendItemsToContainer(Arrays.asList(new Bill(1000, group.getId())), cref, MzsConstants.RequestTimeout.ZERO, null);
94                     }
95                 } else {
96                     group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
97                 }
98                 sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, tx);
99                 capi.commitTransaction(tx);
100
101
102             } catch (Exception e) {
103                 log.info("DRiverXVSM exception");
104                 log.info(e.getMessage());
105                 e.printStackTrace();
106             }
107         }
108     }
109
110     public void listenForPreparedDeliveryPizzas() {
111         getDefaultBuilder("listenForPreparedDeliveryPizzas").setCref(preparedDeliveryPizzasContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
112
113             @Override
114             public void onEntriesWritten(List<? extends Serializable> entries)
115                     throws Exception {
116
117                 List<Pizza> pizzas = castEntries(entries);
118
119                 for (Pizza pizza : pizzas) {
120                     int orderId = pizza.getOrderId();
121                     Order order = new Order();
122                     order.setId(orderId);
123
124                     TransactionReference tx = getDefaultTransaction();
125
126                     try {
127                         DeliveryGroupData entity = new DeliveryGroupData();
128                         entity.setDeliveryStatus(null);
129                         entity.setOrder(order);
130
131                         final DeliveryGroupData groupData = takeMatchingEntity(entity,
132                                 deliveryOrderTakenContainer, tx, MzsConstants.RequestTimeout.DEFAULT,
133                                 "Another driver just checks if the delivery order is complete");
134                         int numberOfPizzas = groupData.getOrder().getNumberOfPizzas();
135
136                         Pizza pizzaTemplate = new Pizza();
137                         pizzaTemplate.setOrderId(orderId);
138
139                         List<Pizza> pizzasOfOrder = takeMatchingEntities(
140                                 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
141                                 MzsConstants.RequestTimeout.DEFAULT,
142                                 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
143
144                         if (pizzasOfOrder.size() == numberOfPizzas) {
145                             final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
146                             sendItemsToContainer(groupsWithCompleteOrder,
147                                     deliverDeliveryOrderContainer, MzsConstants.RequestTimeout.DEFAULT,
148                                     tx);
149
150                             capi.commitTransaction(tx);
151                         } else {
152                             log.info("Not yet all pizzas prepared! Order with id "
153                                     + orderId + " has " + numberOfPizzas
154                                     + " pizzas, but only " + pizzasOfOrder.size()
155                                     + " pizzas are ready by now!");
156                             capi.rollbackTransaction(tx);
157                         }
158                     } catch (NullPointerException e) {
159
160                     } catch (Exception e) {
161                         capi.rollbackTransaction(tx);
162                     }
163                 }
164             }
165         }).createSpaceListenerImpl();
166     }
167 }