1 package at.ac.tuwien.sbc.valesriegler.xvsm;
4 import at.ac.tuwien.sbc.valesriegler.common.Util;
5 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
6 import at.ac.tuwien.sbc.valesriegler.types.DeliveryStatus;
7 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
8 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceListener;
9 import org.mozartspaces.core.ContainerReference;
10 import org.mozartspaces.core.MzsConstants;
11 import org.mozartspaces.core.TransactionReference;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
15 import java.io.Serializable;
17 import java.util.Arrays;
18 import java.util.List;
20 public class DriverXVSM extends AbstractXVSMConnector {
21 private static final Logger log = LoggerFactory.getLogger(DriverXVSM.class);
25 public DriverXVSM(int id, int port) {
30 this.preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
31 this.deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
32 this.deliverDeliveryOrderContainer = useContainer(Util.DELIVER_DELIVERY_ORDER);
33 pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
34 deliveryDone = useContainer(Util.DELIVERY_DONE);
35 deliveryInProgress = useContainer(Util.DELIVERY_PROGRESS);
39 public void listenForPreparedDeliveryOrders() {
40 SpaceListener orderListener = getDefaultBuilder().setCref(deliverDeliveryOrderContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
43 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
44 final List<DeliveryGroupData> deliveries = castEntries(entries);
46 for (DeliveryGroupData delivery : deliveries) {
47 DeliveryGroupData template = new DeliveryGroupData(delivery.getId());
48 template.setDeliveryStatus(DeliveryStatus.ORDERED);
50 final TransactionReference tx = capi.createTransaction(
52 URI.create(String.format(Util.SERVER_ADDR, port)));
53 final String error = "Another driver wants to deliver this order!";
56 // Get lock for delivering this delivery order
57 takeMatchingEntity(template, deliverDeliveryOrderContainer, tx, MzsConstants.RequestTimeout.DEFAULT, error);
58 final DeliveryGroupData group = takeMatchingEntity(template, pizzeriaDeliveryContainer, tx, MzsConstants.RequestTimeout.DEFAULT, "Cannot get the delivery order!");
59 group.setDriverId(driverId);
60 group.setDeliveryStatus(DeliveryStatus.IN_PROGRESS);
62 final List<DeliveryGroupData> groups = Arrays.asList(group);
63 sendItemsToContainer(groups,
64 deliveryInProgress, MzsConstants.RequestTimeout.ZERO, null);
65 sendItemsToContainer(groups,
66 pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.ZERO, null);
70 final String address = String.format(Util.SERVER_ADDR, Util.DELIVERY_CUSTOMERS_PORT);
71 ContainerReference cref;
73 cref = capi.lookupContainer(group.getAddress(), URI.create(address), MzsConstants.RequestTimeout.ZERO, null);
74 log.debug("Looked up container {} successfully!", address);
76 group.setDeliveryStatus(DeliveryStatus.DELIVERED);
78 } catch (Exception ex) {
79 log.info("Could not find container {}", address);
81 group.setDeliveryStatus(DeliveryStatus.DELIVERY_FAILED);
83 sendItemsToContainer(groups, deliveryDone, MzsConstants.RequestTimeout.DEFAULT, tx);
84 sendItemsToContainer(groups, pizzeriaDeliveryContainer, MzsConstants.RequestTimeout.DEFAULT, tx);
85 capi.commitTransaction(tx);
88 } catch (Exception e) {
89 log.info("DRiverXVSM exception");
90 log.info(e.getMessage());
96 }).createSpaceListenerImpl();