1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sourceforge.jhunters.pool.data;
18
19 import java.time.LocalDate;
20 import java.util.Collections;
21 import java.util.Comparator;
22 import java.util.HashMap;
23 import java.util.Iterator;
24 import java.util.Map;
25
26 import javafx.collections.FXCollections;
27 import javafx.collections.ObservableList;
28 import net.sourceforge.jhunters.pool.data.PlayerAnalysis.AnalysisComparator;
29
30
31
32
33 public class CompetitionStandings {
34
35
36
37 private final Competition theCompetition;
38
39
40
41
42 private final AnalysisTable theTable;
43
44
45
46
47 private final Map<Integer, AnalysisTable> theTieBreakers;
48
49
50
51
52 private final Comparator<PlayerAnalysis> theComparator;
53
54
55
56
57
58 public CompetitionStandings(final Competition pCompetition) {
59 theCompetition = pCompetition;
60 theTable = new AnalysisTable();
61 theTieBreakers = new HashMap<Integer, AnalysisTable>();
62 theComparator = new AnalysisComparator();
63 }
64
65
66
67
68
69 public ObservableList<PlayerAnalysis> getTable() {
70 return theTable.getTable();
71 }
72
73
74
75
76
77 protected void processFixtures(final FixtureList pFixtures) {
78
79 theCompetition.setActive(Boolean.FALSE);
80
81
82 theTable.reset();
83 theTieBreakers.clear();
84
85
86 Iterator<FixtureSet> myIterator = pFixtures.fixtureIterator();
87 while (myIterator.hasNext()) {
88 FixtureSet mySet = myIterator.next();
89
90
91 processFixtureSet(mySet);
92 }
93
94
95 myIterator = pFixtures.fixtureIterator();
96 while (myIterator.hasNext()) {
97 FixtureSet mySet = myIterator.next();
98
99
100 processTieBreakers(mySet);
101 }
102
103
104 propagateTieBreaks();
105
106
107 sortTable();
108 }
109
110
111
112
113 protected void sortTable() {
114
115 FXCollections.sort(theTable.getTable(), theComparator);
116 }
117
118
119
120
121
122 private void processFixtureSet(final FixtureSet pSet) {
123
124 LocalDate myDate = theCompetition.getStartDate();
125
126
127 Iterator<Fixture> myIterator = pSet.fixtureIterator();
128 while (myIterator.hasNext()) {
129 Fixture myFixture = myIterator.next();
130
131
132 if (myFixture.isBye()) {
133 continue;
134 }
135
136
137 Player myPlayer = myFixture.getHomePlayer();
138 PlayerAnalysis myAnalysis = theTable.getAnalysis(myPlayer);
139 myAnalysis.analyseHomeFixture(myFixture);
140
141
142 myPlayer = myFixture.getAwayPlayer();
143 myAnalysis = theTable.getAnalysis(myPlayer);
144 myAnalysis.analyseAwayFixture(myFixture);
145
146
147 if (myFixture.getResult() != null) {
148
149 theCompetition.setActive(Boolean.TRUE);
150 }
151
152
153 if (myDate == null) {
154
155 myDate = myFixture.getDate();
156 theCompetition.setStartDate(myDate);
157 }
158 }
159 }
160
161
162
163
164
165 private void processTieBreakers(final FixtureSet pSet) {
166
167 Iterator<Fixture> myIterator = pSet.fixtureIterator();
168 while (myIterator.hasNext()) {
169 Fixture myFixture = myIterator.next();
170
171
172 if (myFixture.isBye()) {
173 continue;
174 }
175
176
177 Player myHomePlayer = myFixture.getHomePlayer();
178 PlayerAnalysis myHome = theTable.getAnalysis(myHomePlayer);
179 Player myAwayPlayer = myFixture.getAwayPlayer();
180 PlayerAnalysis myAway = theTable.getAnalysis(myAwayPlayer);
181
182
183 if (myHome.getPoints().equals(myAway.getPoints())) {
184
185 AnalysisTable myTieBreak = getTieBreak(myHome.getPoints());
186
187
188 myHome = myTieBreak.getAnalysis(myHomePlayer);
189 myHome.analyseHomeFixture(myFixture);
190 myAway = myTieBreak.getAnalysis(myAwayPlayer);
191 myAway.analyseAwayFixture(myFixture);
192 }
193 }
194 }
195
196
197
198
199
200
201 private AnalysisTable getTieBreak(final Integer pPoints) {
202
203 AnalysisTable myTable = theTieBreakers.get(pPoints);
204
205
206 if (myTable == null) {
207
208 myTable = new AnalysisTable();
209 theTieBreakers.put(pPoints, myTable);
210 }
211
212
213 return myTable;
214 }
215
216
217
218
219 private void propagateTieBreaks() {
220
221 Iterator<AnalysisTable> myIterator = theTieBreakers.values().iterator();
222 while (myIterator.hasNext()) {
223 AnalysisTable myCurr = myIterator.next();
224
225
226 Collections.sort(myCurr.getTable(), theComparator);
227
228
229 myCurr.updateTieBreaker(theTable);
230 }
231 }
232
233
234
235
236
237
238 public ObservableList<PlayerAnalysis> getTieBreakTable(final Integer pPoints) {
239
240 AnalysisTable myTable = theTieBreakers.get(pPoints);
241
242
243 if ((myTable != null)
244 && !myTable.isActive()) {
245
246 myTable = null;
247 }
248
249
250 return myTable == null
251 ? null
252 : myTable.getTable();
253 }
254 }