]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/group/Group.java
the whole pizzeria workflow. EXCEPT cooking the pizzas.
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / group / Group.java
1 package at.ac.tuwien.sbc.valesriegler.group;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5
6 import at.ac.tuwien.sbc.valesriegler.group.actions.OrderRequest;
7 import at.ac.tuwien.sbc.valesriegler.group.actions.PayRequest;
8 import at.ac.tuwien.sbc.valesriegler.group.actions.TableFree;
9 import at.ac.tuwien.sbc.valesriegler.group.actions.TableRequest;
10 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
11 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
12 import at.ac.tuwien.sbc.valesriegler.types.Order;
13 import at.ac.tuwien.sbc.valesriegler.types.Table;
14
15 // class doing all the Group related work as required.
16 public class Group implements Runnable {
17         private static final Logger log = LoggerFactory.getLogger(Group.class);
18         private static int idNext = -1; // TODO: set to 0 after debugging!
19
20         final private GroupData groupData;
21
22         public GroupData getGroupData() {
23                 return groupData;
24         }
25
26         public Group() {
27                 groupData = new GroupData(++idNext);
28         }
29
30         @Override
31         public void run() {
32                 log.debug("Thread started for:" + this);
33                 try {
34                         Thread.sleep((long) (Math.random() * 10000));
35
36                         switch (groupData.getState()) {
37                         case NEW:
38                                 // TODO : may not happen!
39                                 break;
40                         case WAITING:
41                                 GroupAgent.getInstance().getGroupcomm().send(new TableRequest(groupData));
42                                 break;
43                         case SITTING:
44                                 GroupAgent.getInstance().getGroupcomm().send(new OrderRequest(groupData));
45                                 order();
46                                 break;
47                         case ORDER_PENDING:
48                                 break; // do nothing.
49                         case ORDERED:
50                                 break; // do nothing.
51                         case EATING: // request bill.
52                                 GroupAgent.getInstance().getGroupcomm().send(new PayRequest(groupData));
53                                 break;
54                         case PAY:// leave table
55                                 GroupAgent.getInstance().getGroupcomm().send(new TableFree(groupData));
56                                 groupData.setState(GroupState.GONE);
57                                 break;
58                         case GONE:
59                                 break; // do nothing.
60                         default:
61                                 break;
62                         }
63
64                 } catch (InterruptedException e) {
65                         e.printStackTrace();
66                 }
67         }
68
69         // lets go to the pizzaria.
70         public void goGrabSomeFood() {
71                 log.debug("goGrabSomeFood(): " + this);
72                 groupData.setState(GroupState.WAITING);
73                 new Thread(this).start();
74         }
75
76         // get a table assigned by a waiter.
77         public void assignTable(Table t, int waiterID) {
78                 groupData.setState(GroupState.SITTING);
79                 groupData.setTable(t);
80                 groupData.setTableWaiter(waiterID);
81                 new Thread(this).start();
82                 log.debug("assignTable(): " + this);
83         }
84
85         // ask the group to send their order.
86         public void order() {
87                 groupData.setState(GroupState.ORDER_PENDING);
88                 new Thread(this).start();
89                 log.debug("order(): " + this);
90         }
91
92         // Waiter telling group he/she forwarded the order.
93         public void orderReceived(int waiter) {
94                 groupData.setState(GroupState.ORDERED);
95                 groupData.setState(GroupState.EATING); // TODO: skip pizza creation step
96                 groupData.setOrderWaiter(waiter);
97                 new Thread(this).start();
98                 log.debug("orderReceived(): " + this);
99         }
100
101         // pizzas are here! nom nom nom
102         public void deliverPizzas(Order order, int waiter) {
103                 groupData.setState(GroupState.EATING);
104                 groupData.setOrder(order);
105                 groupData.setServingWaiter(waiter);
106                 new Thread(this).start();
107                 log.debug("bringOrderedPizzas(): " + this);
108         }
109
110         // pay for the pizzas and leave
111         public void payForPizzas(int waiter) {
112                 groupData.setState(GroupState.PAY);
113                 groupData.setPayingWaiter(waiter);
114                 new Thread(this).start();
115                 log.debug("payForPizzas(): " + this);
116         }
117 }