1 package at.ac.tuwien.sbc.valesriegler.xvsm;
3 import java.io.Serializable;
5 import java.util.Arrays;
6 import java.util.Collections;
9 import org.mozartspaces.core.MzsConstants.RequestTimeout;
10 import org.mozartspaces.core.TransactionException;
11 import org.mozartspaces.core.TransactionReference;
12 import org.mozartspaces.notifications.Notification;
13 import org.mozartspaces.notifications.NotificationListener;
14 import org.mozartspaces.notifications.Operation;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
18 import at.ac.tuwien.sbc.valesriegler.common.Util;
19 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
20 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
21 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrderStatus;
23 public class CookXVSM extends AbstractXVSMConnector {
24 private static final Logger log = LoggerFactory.getLogger(CookXVSM.class);
28 public CookXVSM(int id) {
34 useDeliverPizzasContainer();
35 usePreparePizzasContainer();
36 usePizzaInProgressContainer();
39 public void listenForPizzas() {
40 NotificationListener pizzasListener = new NotificationListener() {
42 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
44 log.info("New Pizzas to prepare!");
46 List<PizzaOrder> pizzas = castEntries(entries);
47 for (PizzaOrder pizzaOrder : pizzas) {
48 log.info("I must prepare this fucking pizza:");
49 log.info(pizzaOrder.toString());
51 Collections.shuffle(pizzas);
52 for (PizzaOrder pizzaOrder : pizzas) {
55 TransactionReference tx = capi.createTransaction(9000, URI.create(Util.SERVER_ADDR));
56 String pizzaAlreadyCooked = String.format("Pizza with id %d has already been cooked by another cook", pizzaOrder.getId());
58 // Require the lock for preparing the pizza
59 PizzaOrder order = takeEntityByTemplateFromContainer(new PizzaOrder(pizzaOrder.getId()), preparePizzasContainer, tx, 1000, pizzaAlreadyCooked);
61 // tell the space that you prepare the pizza -> without a transaction!!
62 Pizza pizzaInProgress = Pizza.createPizzaFromPizzaOrder(order, cookId);
63 pizzaInProgress.setStatus(PizzaOrderStatus.IN_PREPARATION);
65 log.info("I say that I now prepare this pizza:");
66 log.info(pizzaInProgress.toString());
67 sendItemsToContainer(Arrays.asList(pizzaInProgress), pizzaInProgressContainer, RequestTimeout.DEFAULT, null);
69 PizzaOrder pizza = createPizza(order);
70 sendItemsToContainer(Arrays.asList(pizza), deliverPizzasContainer, RequestTimeout.DEFAULT, tx);
72 capi.commitTransaction(tx);
73 } catch (IllegalArgumentException e) {
74 log.info("IllegalArgumentException");
76 } catch (EntityNotFoundByTemplate e) {
77 log.info(e.getMessage());
78 } catch (Exception e) {
79 log.error("AN INNER EXCEPTION");
82 } catch (TransactionException e) {
83 log.info("An unimportant TransactionException has occurred");
84 } catch (Exception e) {
85 log.error("OUTER EXCEPTION");
92 notificationMgr.createNotification(preparePizzasContainer, pizzasListener, Operation.WRITE);
93 log.info("Created pizzasContainer notification for a cook");
94 } catch (Exception e) {
95 handleSpaceErrorAndTerminate(e);
99 private PizzaOrder createPizza(PizzaOrder order) throws InterruptedException {
100 long duration = order.getPizzaType().duration;
101 Thread.sleep(duration * 1000);
103 PizzaOrder pizza = Pizza.createPizzaFromPizzaOrder(order, cookId);
104 pizza.setStatus(PizzaOrderStatus.DONE);