1 package at.ac.tuwien.sbc.valesriegler.xvsm;
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.capi3.EntryLockedException;
12 import org.mozartspaces.core.ContainerReference;
13 import org.mozartspaces.core.MzsConstants;
14 import org.mozartspaces.core.MzsCoreException;
15 import org.mozartspaces.core.TransactionReference;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
19 import java.io.Serializable;
21 import java.util.Arrays;
22 import java.util.List;
24 public class DriverXVSM extends AbstractXVSMConnector {
25 private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
29 public DriverXVSM(int id, int port) {
34 preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
35 deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
36 deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
37 pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
42 public void listenForPreparedDeliveryOrders() {
43 getDefaultBuilder("listenForPreparedDeliveryOrders").setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
46 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
47 handleDeliveries(entries);
50 }).createSpaceListenerImpl();
53 private void handleDeliveries(List<? extends Serializable> entries) throws MzsCoreException {
54 final List<DeliveryGroupData> deliveries = castEntries(entries);
56 for (DeliveryGroupData delivery : deliveries) {
57 DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
58 template.setDeliveryStatus(DeliveryStatus.ORDERED);
60 final TransactionReference tx = capi.createTransaction(
62 URI.create(String.format(Util.SERVER_ADDR, port)));
63 final String error = "Another driver wants to deliver this order!";
66 // Get lock for delivering this delivery order
67 takeMatchingEntity(template, deliverDeliveryOrderContainer, tx, MzsConstants.RequestTimeout.ZERO, error);
68 final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, MzsConstants.RequestTimeout.DEFAULT, "Cannot get the delivery order!");
69 group.setDriverId(driverId);
70 group.setDeliveryStatus(DeliveryStatus.IN_PROGRESS);
72 final List<DeliveryGroupData> groups = Arrays.asList(group);
73 sendItemsToContainer(groups,
74 pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
76 if (!Util.runSimulation) {
80 final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
81 ContainerReference cref = null;
82 boolean success = false;
84 cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
85 log.debug("Looked up container {} successfully!", address);
88 } catch (Exception ex) {
89 log.info("Could not find container {}", address);
92 group.setDeliveryStatus(DeliveryStatus.DELIVERED);
93 if (!Util.runSimulation) {
94 sendItemsToContainer(Arrays.asList(new Bill(1000, group.getId())), cref, MzsConstants.RequestTimeout.ZERO, null);
97 group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
99 sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, tx);
100 capi.commitTransaction(tx);
103 } catch(EntryLockedException e) {
104 capi.rollbackTransaction(tx);
105 } catch (Exception e) {
106 log.info("DRiverXVSM exception");
107 log.info(e.getMessage());
113 public void listenForPreparedDeliveryPizzas() {
114 getDefaultBuilder("listenForPreparedDeliveryPizzas").setCref(preparedDeliveryPizzasContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
117 public void onEntriesWritten(List<? extends Serializable> entries)
120 List<Pizza> pizzas = castEntries(entries);
122 for (Pizza pizza : pizzas) {
123 int orderId = pizza.getOrderId();
124 Order order = new Order();
125 order.setId(orderId);
127 TransactionReference tx = getDefaultTransaction();
130 DeliveryGroupData entity = new DeliveryGroupData();
131 entity.setDeliveryStatus(null);
132 entity.setOrder(order);
134 final DeliveryGroupData groupData = takeMatchingEntity(entity,
135 deliveryOrderTakenContainer, tx, MzsConstants.RequestTimeout.DEFAULT,
136 "Another driver just checks if the delivery order is complete");
137 int numberOfPizzas = groupData.getOrder().getNumberOfPizzas();
139 Pizza pizzaTemplate = new Pizza();
140 pizzaTemplate.setOrderId(orderId);
142 List<Pizza> pizzasOfOrder = takeMatchingEntities(
143 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
144 MzsConstants.RequestTimeout.DEFAULT,
145 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
147 if (pizzasOfOrder.size() == numberOfPizzas) {
148 final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
149 sendItemsToContainer(groupsWithCompleteOrder,
150 deliverDeliveryOrderContainer, MzsConstants.RequestTimeout.DEFAULT,
153 capi.commitTransaction(tx);
155 log.info("Not yet all pizzas prepared! Order with id "
156 + orderId + " has " + numberOfPizzas
157 + " pizzas, but only " + pizzasOfOrder.size()
158 + " pizzas are ready by now!");
159 capi.rollbackTransaction(tx);
161 } catch (NullPointerException e) {
163 } catch (Exception e) {
164 capi.rollbackTransaction(tx);
168 }).createSpaceListenerImpl();