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