]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/CookXVSM.java
Space cooks prepare pizzas and Pizzeria GUI shows that
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / xvsm / CookXVSM.java
1 package at.ac.tuwien.sbc.valesriegler.xvsm;
2
3 import java.io.Serializable;
4 import java.net.URI;
5 import java.util.Arrays;
6 import java.util.Collections;
7 import java.util.List;
8
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;
17
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;
22
23 public class CookXVSM extends AbstractXVSMConnector {
24         private static final Logger log = LoggerFactory.getLogger(CookXVSM.class);
25
26         private int cookId;
27
28         public CookXVSM(int id) {
29                 super();
30                 
31                 this.cookId = id;
32                 useGroupsContainer();
33                 useOrdersContainer();
34                 useDeliverPizzasContainer();
35                 usePreparePizzasContainer();
36                 usePizzaInProgressContainer();
37         }
38
39         public void listenForPizzas() {
40                 NotificationListener pizzasListener = new NotificationListener() {
41             @Override
42             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
43                
44                                 log.info("New Pizzas to prepare!");
45                                 
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());
50                                 }
51                                 Collections.shuffle(pizzas);
52                                 for (PizzaOrder pizzaOrder : pizzas) {
53                                         try {
54                                                 try {
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());
57                                                         
58                                                         // Require the lock for preparing the pizza
59                                                         PizzaOrder order = takeEntityByTemplateFromContainer(new PizzaOrder(pizzaOrder.getId()), preparePizzasContainer, tx, 1000, pizzaAlreadyCooked);
60                                                         
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);
64                                                         
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);
68                                                         
69                                                         PizzaOrder pizza = createPizza(order);
70                                                         sendItemsToContainer(Arrays.asList(pizza), deliverPizzasContainer, RequestTimeout.DEFAULT, tx); 
71                                                         
72                                                         capi.commitTransaction(tx);
73                                                 } catch (IllegalArgumentException e) {
74                                                         log.info("IllegalArgumentException");
75                                                         e.printStackTrace();
76                                                 } catch (EntityNotFoundByTemplate e) {
77                                                         log.info(e.getMessage());
78                                                 }  catch (Exception e) {
79                                                         log.error("AN INNER EXCEPTION");
80                                                         e.printStackTrace();
81                                                 }
82                                         } catch (TransactionException e) {
83                                                 log.info("An unimportant TransactionException has occurred");
84                                         } catch (Exception e) {
85                                                 log.error("OUTER EXCEPTION");
86                                         }
87                                 }
88                                 
89             }
90         };
91         try {
92                         notificationMgr.createNotification(preparePizzasContainer, pizzasListener, Operation.WRITE);
93                         log.info("Created pizzasContainer notification for a cook");
94         } catch (Exception e) {
95                         handleSpaceErrorAndTerminate(e);
96                 }
97         }
98
99         private PizzaOrder createPizza(PizzaOrder order) throws InterruptedException {
100                 long duration = order.getPizzaType().duration;
101                 Thread.sleep(duration * 1000);
102                 
103                 PizzaOrder pizza = Pizza.createPizzaFromPizzaOrder(order, cookId);
104                 pizza.setStatus(PizzaOrderStatus.DONE);
105                 return pizza;
106         }
107
108 }