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.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;
18 import java.io.Serializable;
20 import java.util.Arrays;
21 import java.util.List;
23 public class DriverXVSM extends AbstractXVSMConnector {
24 private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
28 public DriverXVSM(int id, int port) {
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);
41 public void listenForPreparedDeliveryOrders() {
42 getDefaultBuilder("listenForPreparedDeliveryOrders").setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
45 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
46 handleDeliveries(entries);
49 }).createSpaceListenerImpl();
52 private void handleDeliveries(List<? extends Serializable> entries) throws MzsCoreException {
53 final List<DeliveryGroupData> deliveries = castEntries(entries);
55 for (DeliveryGroupData delivery : deliveries) {
56 DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
57 template.setDeliveryStatus(DeliveryStatus.ORDERED);
59 final TransactionReference tx = capi.createTransaction(
61 URI.create(String.format(Util.SERVER_ADDR, port)));
62 final String error = "Another driver wants to deliver this order!";
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);
71 final List<DeliveryGroupData> groups = Arrays.asList(group);
72 sendItemsToContainer(groups,
73 pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
75 if (!Util.runSimulation) {
79 final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
80 ContainerReference cref = null;
81 boolean success = false;
83 cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
84 log.debug("Looked up container {} successfully!", address);
87 } catch (Exception ex) {
88 log.info("Could not find container {}", address);
91 group.setDeliveryStatus(DeliveryStatus.DELIVERED);
92 if (!Util.runSimulation) {
93 sendItemsToContainer(Arrays.asList(new Bill(1000, group.getId())), cref, MzsConstants.RequestTimeout.ZERO, null);
96 group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
98 sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, tx);
99 capi.commitTransaction(tx);
102 } catch (Exception e) {
103 log.info("DRiverXVSM exception");
104 log.info(e.getMessage());
110 public void listenForPreparedDeliveryPizzas() {
111 getDefaultBuilder("listenForPreparedDeliveryPizzas").setCref(preparedDeliveryPizzasContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
114 public void onEntriesWritten(List<? extends Serializable> entries)
117 List<Pizza> pizzas = castEntries(entries);
119 for (Pizza pizza : pizzas) {
120 int orderId = pizza.getOrderId();
121 Order order = new Order();
122 order.setId(orderId);
124 TransactionReference tx = getDefaultTransaction();
127 DeliveryGroupData entity = new DeliveryGroupData();
128 entity.setDeliveryStatus(null);
129 entity.setOrder(order);
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();
136 Pizza pizzaTemplate = new Pizza();
137 pizzaTemplate.setOrderId(orderId);
139 List<Pizza> pizzasOfOrder = takeMatchingEntities(
140 pizzaTemplate, preparedDeliveryPizzasContainer, tx,
141 MzsConstants.RequestTimeout.DEFAULT,
142 "Cannot take the pizzas from the preparedDeliveryPizzasContainer");
144 if (pizzasOfOrder.size() == numberOfPizzas) {
145 final List<DeliveryGroupData> groupsWithCompleteOrder = Arrays.asList(groupData);
146 sendItemsToContainer(groupsWithCompleteOrder,
147 deliverDeliveryOrderContainer, MzsConstants.RequestTimeout.DEFAULT,
150 capi.commitTransaction(tx);
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);
158 } catch (NullPointerException e) {
160 } catch (Exception e) {
161 capi.rollbackTransaction(tx);
165 }).createSpaceListenerImpl();