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