]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupOverviewModel.java
Space waiters pay and overall remaining space workflow refactoring
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / group / gui / GroupOverviewModel.java
1 package at.ac.tuwien.sbc.valesriegler.group.gui;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Set;
7
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10
11 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
12 import at.ac.tuwien.sbc.valesriegler.common.Util;
13 import at.ac.tuwien.sbc.valesriegler.group.Group;
14 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
15 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
16 import at.ac.tuwien.sbc.valesriegler.types.Order;
17 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
18 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
19
20 /**
21  * Might not the nicest way to store global data, but this is an elemental
22  * Object, storing ALL the Group's data. Might consider splitting those two
23  * usecases apart.
24  * 
25  * @author jan
26  * 
27  */
28 public class GroupOverviewModel extends TableModel<Group> {
29         private static final Logger log = LoggerFactory.getLogger(GroupOverviewModel.class);
30
31         private static final String STATE = "State";
32         private static final String PIZZAS = "Pizzas";
33         private static final String SIZE = "Size";
34         private static final String ID = "ID";
35         private static final String[] COLUMNS = new String[] { ID, SIZE, PIZZAS, STATE };
36
37
38         @Override
39         protected String[] getColumns() {
40                 return COLUMNS;
41         }
42
43         public List<Group> getItems() {
44                 return new ArrayList<>(items.values());
45         }
46
47         public Group getGroupByID(int id) {
48                 return items.get(id);
49         }
50
51         @Override
52         public Object getValueAt(int rowIndex, int columnIndex) {
53                 List<Group> values = new ArrayList<>(items.values());
54                 Group group = values.get(rowIndex);
55                 String wantedColumn = COLUMNS[columnIndex];
56                 switch (wantedColumn) {
57                 case ID:
58                         int groupId = group.getGroupData().getId();
59                         return groupId;
60                 case SIZE:
61                         int groupSize = group.getGroupData().getSize();
62                         return groupSize;
63                 case PIZZAS:
64                         if (group.getGroupData().getOrder() == null)
65                                 return "none";
66                         return pizzaDisplay(group.getGroupData().getOrder().getOrderedPizzas());
67                 case STATE:
68                         return group.getGroupData().getState();
69                 default:
70                         throw new RuntimeException(UNHANDLEDCOLUMN);
71                 }
72         }
73
74         /**
75          * 
76          * @return A display string for PizzaTypes.
77          *         <p />
78          *         e.g. Cardinale, Cardinale, Margherita is displayed as
79          *         "2xCARDINALE,1xMARGHERITA"
80          */
81         private String pizzaDisplay(List<PizzaOrder> list) {
82                 HashMap<PizzaType, Integer> pizzaCount = new HashMap<PizzaType, Integer>();
83                 for (PizzaOrder pizzaOrder : list) {
84                         PizzaType pizzaType = pizzaOrder.getPizzaType();
85                         if (pizzaCount.containsKey(pizzaType)) {
86                                 pizzaCount.put(pizzaType, pizzaCount.get(pizzaType) + 1);
87                         } else
88                                 pizzaCount.put(pizzaType, 1);
89                 }
90                 Set<PizzaType> pizzaTypes = pizzaCount.keySet();
91                 StringBuilder sb = new StringBuilder();
92
93                 boolean multiplePizzas = false;
94                 for (PizzaType pizzaType : pizzaTypes) {
95                         if (multiplePizzas)
96                                 sb.append(", ");
97                         else
98                                 multiplePizzas = true;
99
100                         sb.append(pizzaCount.get(pizzaType) + "x");
101                         sb.append(pizzaType.toString());
102                 }
103
104                 return sb.toString();
105         }
106
107         @Override
108         public void addItems(List<Group> newItems) {
109                 log.info("addItems()");
110                 super.addItems(newItems);
111                 for (Group g : newItems) {
112                         if(Util.useJMS) g.goGrabSomeFood();
113                 }
114         }
115         
116         /**
117          * 
118          * This is necessary as in the space version GroupData objects get written to the space. In order to 
119          * translate from Group data to the actual group object the group object has to be looked up by the id.
120          * 
121          * @param newItems the group data of the corresponding groups
122          */
123         public void addGroupData(List<GroupData> newItems) {
124                 List<Group> groups = new ArrayList<>();
125                 for (GroupData groupData : newItems) {
126                         Group group = items.get(groupData.getId());
127                         group.setGroupData(groupData);
128                         groups.add(group);
129                 }
130                 super.addItems(groups);
131         }
132
133         public void updateOrderDone(int groupId) {
134                 if(stateIs(groupId, GroupState.GONE) || stateIs(groupId, GroupState.PAY)) return;
135                 changeStateOfGroup(groupId, GroupState.EATING);
136         }
137
138         public void updateGroupPaymentPending(int groupId) {
139                 if(stateIs(groupId, GroupState.GONE)) return;
140                 changeStateOfGroup(groupId, GroupState.PAY);
141         }
142
143         private boolean stateIs(int groupId, GroupState state) {
144                 return items.get(groupId).getGroupData().getState() == state;
145         }
146
147
148         public void updateGroupHasPaid(int groupId) {
149                 
150                 changeStateOfGroup(groupId, GroupState.GONE);
151         }
152         
153         private void changeStateOfGroup(int groupId, GroupState state) {
154                 items.get(groupId).getGroupData().setState(state);
155                 
156                 fireTableDataChanged();
157         }
158
159 }