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