Skip to content

Commit e2241d4

Browse files
committed
More refactoring.
1 parent d853257 commit e2241d4

16 files changed

+155
-100
lines changed

src/main/java/lap_race/Category.java src/main/java/common/Category.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package lap_race;
1+
package common;
22

33
public interface Category {
44

src/main/java/common/Race.java

+40
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import java.io.FileInputStream;
44
import java.io.IOException;
5+
import java.nio.file.Path;
6+
import java.time.Duration;
57
import java.util.Properties;
68

79
public abstract class Race {
810

911
protected Properties properties;
12+
protected Path working_directory_path;
1013

1114
public Race(final String config_file_path) throws IOException {
1215

@@ -36,4 +39,41 @@ protected static Properties readProperties(final String config_file_path) throws
3639
return properties;
3740
}
3841
}
42+
43+
public Path getWorkingDirectoryPath() {
44+
return working_directory_path;
45+
}
46+
47+
protected String getPropertyWithDefault(final String property_key, final String default_value) {
48+
49+
final String value = properties.getProperty(property_key);
50+
return value == null || value.isBlank() ? default_value : value;
51+
}
52+
53+
protected static Duration parseTime(String element) {
54+
55+
element = element.strip();
56+
57+
try {
58+
final String[] parts = element.split(":");
59+
final String time_as_ISO = "PT" + hours(parts) + minutes(parts) + seconds(parts);
60+
61+
return Duration.parse(time_as_ISO);
62+
}
63+
catch (Exception e) {
64+
throw new RuntimeException("illegal time: " + element);
65+
}
66+
}
67+
68+
static String hours(final String[] parts) {
69+
return parts.length > 2 ? parts[0] + "H" : "";
70+
}
71+
72+
static String minutes(final String[] parts) {
73+
return (parts.length > 2 ? parts[1] : parts[0]) + "M";
74+
}
75+
76+
static String seconds(final String[] parts) {
77+
return (parts.length > 2 ? parts[2] : parts[1]) + "S";
78+
}
3979
}

src/main/java/lap_race/RawResult.java src/main/java/common/RawResult.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package lap_race;
1+
package common;
2+
3+
import lap_race.LapRace;
24

35
import java.time.Duration;
46

@@ -14,6 +16,14 @@ public RawResult(final String file_line) {
1416
final String bib_number_as_string = elements[0];
1517

1618
bib_number = Integer.parseInt(bib_number_as_string);
17-
recorded_finish_time = LapRace.parseTime(elements[1]);
19+
recorded_finish_time = Race.parseTime(elements[1]);
20+
}
21+
22+
public int getBibNumber() {
23+
return bib_number;
24+
}
25+
26+
public Duration getRecordedFinishTime() {
27+
return recorded_finish_time;
1828
}
1929
}

src/main/java/individual_race/IndividualRace.java

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ public class IndividualRace extends Race {
1010
// TODO variable number of prizes per category; open prizes in addition to gender categories; non-binary category; optional team prizes
1111

1212
public IndividualRace(final String config_file_path) throws IOException {
13-
1413
super(config_file_path);
1514
}
1615

src/main/java/lap_race/LapRace.java

+50-68
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package lap_race;
22

3+
import common.Category;
34
import common.Race;
5+
import common.RawResult;
46

57
import java.io.IOException;
6-
import java.nio.file.Path;
78
import java.nio.file.Paths;
89
import java.time.Duration;
910
import java.util.*;
@@ -17,6 +18,7 @@ public class LapRace extends Race {
1718
//////////////////////////////////////////////////////////////////////////////////////////////////
1819

1920
private record IndividualLegStart(int bib_number, int leg_number, Duration start_time) {}
21+
private record ResultWithLegIndex(TeamResult result, int leg_index) {}
2022

2123
static final String DUMMY_DURATION_STRING = "23:59:59";
2224
static final Duration DUMMY_DURATION = parseTime(DUMMY_DURATION_STRING);
@@ -25,11 +27,9 @@ private record IndividualLegStart(int bib_number, int leg_number, Duration start
2527

2628
//////////////////////////////////////////////////////////////////////////////////////////////////
2729

28-
Input input;
29-
Output output_CSV, output_HTML, output_text, output_PDF;
30-
Prizes prizes;
31-
32-
Path working_directory_path;
30+
LapRaceInput input;
31+
LapRaceOutput output_CSV, output_HTML, output_text, output_PDF;
32+
LapRacePrizes prizes;
3333

3434
int number_of_legs;
3535

@@ -121,14 +121,14 @@ private void readProperties() {
121121

122122
private void configureHelpers() {
123123

124-
input = new Input(this);
124+
input = new LapRaceInput(this);
125125

126-
output_CSV = new OutputCSV(this);
127-
output_HTML = new OutputHTML(this);
128-
output_text = new OutputText(this);
129-
output_PDF = new OutputPDF(this);
126+
output_CSV = new LapRaceOutputCSV(this);
127+
output_HTML = new LapRaceOutputHTML(this);
128+
output_text = new LapRaceOutputText(this);
129+
output_PDF = new LapRaceOutputPDF(this);
130130

131-
prizes = new Prizes(this);
131+
prizes = new LapRacePrizes(this);
132132
}
133133

134134
private void configureInputData() throws IOException {
@@ -243,12 +243,6 @@ private static IndividualLegStart getIndividualLegStart(String individual_leg_st
243243
return new IndividualLegStart(bib_number, leg_number, start_time);
244244
}
245245

246-
private String getPropertyWithDefault(final String property_key, final String default_value) {
247-
248-
final String value = properties.getProperty(property_key);
249-
return value == null || value.isBlank() ? default_value : value;
250-
}
251-
252246
private void initialiseResults() {
253247

254248
overall_results = new TeamResult[entries.length];
@@ -261,34 +255,52 @@ private void fillLegFinishTimes() {
261255

262256
for (final RawResult raw_result : raw_results) {
263257

264-
final int team_index = findIndexOfTeamWithBibNumber(raw_result.bib_number);
258+
final int team_index = findIndexOfTeamWithBibNumber(raw_result.getBibNumber());
265259
final TeamResult result = overall_results[team_index];
266260
final LegResult[] leg_results = result.leg_results;
267261

268262
final int leg_index = findIndexOfNextUnfilledLegResult(leg_results);
269263

270-
leg_results[leg_index].finish_time = raw_result.recorded_finish_time.plus(start_offset);
264+
leg_results[leg_index].finish_time = raw_result.getRecordedFinishTime().plus(start_offset);
271265

272266
// Provisionally this leg is not DNF since a finish time was recorded.
273267
// However, it might still be set to DNF in fillDNFs() if the runner missed a checkpoint.
274268
leg_results[leg_index].DNF = false;
275269
}
276270

277-
if (leg_times_swap_string != null) {
278-
for (final String leg_time_swap_string : leg_times_swap_string.split(",")) {
271+
if (leg_times_swap_string != null) swapLegTimes();
272+
}
279273

280-
final String[] swap = leg_time_swap_string.split("/");
281-
final int bib_number = Integer.parseInt(swap[0]);
282-
final int leg_number = Integer.parseInt(swap[1]);
283-
final int leg_index = leg_number - 1;
274+
private void swapLegTimes() {
275+
for (final String leg_time_swap : leg_times_swap_string.split(","))
276+
swapLegTimes(leg_time_swap);
277+
}
284278

285-
final TeamResult result = overall_results[findIndexOfTeamWithBibNumber(bib_number)];
279+
private void swapLegTimes(final String leg_time_swap) {
286280

287-
final Duration temp = result.leg_results[leg_index - 1].finish_time;
288-
result.leg_results[leg_index - 1].finish_time = result.leg_results[leg_index].finish_time;
289-
result.leg_results[leg_index].finish_time = temp;
290-
}
291-
}
281+
final ResultWithLegIndex result_with_leg = getResultWithLegIndex(leg_time_swap);
282+
283+
final LegResult[] leg_results = result_with_leg.result().leg_results;
284+
final int leg_index = result_with_leg.leg_index();
285+
286+
final Duration temp = leg_results[leg_index - 1].finish_time;
287+
288+
leg_results[leg_index - 1].finish_time = leg_results[leg_index].finish_time;
289+
leg_results[leg_index].finish_time = temp;
290+
}
291+
292+
private ResultWithLegIndex getResultWithLegIndex(final String bib_and_leg) {
293+
294+
// String of form "bib-number/leg-number"
295+
296+
final String[] elements = bib_and_leg.split("/");
297+
final int bib_number = Integer.parseInt(elements[0]);
298+
final int leg_number = Integer.parseInt(elements[1]);
299+
final int leg_index = leg_number - 1;
300+
301+
final TeamResult result = overall_results[findIndexOfTeamWithBibNumber(bib_number)];
302+
303+
return new ResultWithLegIndex(result, leg_index);
292304
}
293305

294306
private void fillDNFs() {
@@ -305,13 +317,9 @@ private void fillDNFs() {
305317
for (final String dnf_string : dnf_legs_string.split(",")) {
306318

307319
try {
308-
final String[] dnf = dnf_string.split("/");
309-
final int bib_number = Integer.parseInt(dnf[0]);
310-
final int leg_number = Integer.parseInt(dnf[1]);
311-
final int leg_index = leg_number - 1;
320+
final ResultWithLegIndex result_with_leg = getResultWithLegIndex(dnf_string);
312321

313-
final TeamResult result = overall_results[findIndexOfTeamWithBibNumber(bib_number)];
314-
result.leg_results[leg_index].DNF = true;
322+
result_with_leg.result.leg_results[result_with_leg.leg_index].DNF = true;
315323
}
316324
catch (Exception e) {
317325
throw new RuntimeException("illegal DNF time");
@@ -392,12 +400,12 @@ private void calculateResults() {
392400
Arrays.sort(overall_results);
393401
}
394402

395-
Integer getRecordedLegPosition(final int bib_number, final int leg_number) {
403+
int getRecordedLegPosition(final int bib_number, final int leg_number) {
396404

397405
int legs_completed = 0;
398406

399407
for (int i = 0; i < raw_results.length; i++) {
400-
if (raw_results[i].bib_number == bib_number) {
408+
if (raw_results[i].getBibNumber() == bib_number) {
401409
legs_completed++;
402410
if (legs_completed == leg_number) return i + 1;
403411
}
@@ -421,6 +429,7 @@ int findIndexOfTeamWithBibNumber(final int bib_number) {
421429

422430
throw new RuntimeException("unregistered team: " + bib_number);
423431
}
432+
424433
private void allocatePrizes() {
425434

426435
prizes.allocatePrizes();
@@ -453,33 +462,6 @@ private void printPrizes() throws IOException {
453462

454463
private void printCombined() throws IOException {
455464

456-
((OutputHTML)output_HTML).printCombined();
457-
}
458-
459-
static Duration parseTime(String element) {
460-
461-
element = element.strip();
462-
463-
try {
464-
final String[] parts = element.split(":");
465-
final String time_as_ISO = "PT" + hours(parts) + minutes(parts) + seconds(parts);
466-
467-
return Duration.parse(time_as_ISO);
468-
}
469-
catch (Exception e) {
470-
throw new RuntimeException("illegal time: " + element);
471-
}
472-
}
473-
474-
static String hours(final String[] parts) {
475-
return parts.length > 2 ? parts[0] + "H" : "";
476-
}
477-
478-
static String minutes(final String[] parts) {
479-
return (parts.length > 2 ? parts[1] : parts[0]) + "M";
480-
}
481-
482-
static String seconds(final String[] parts) {
483-
return (parts.length > 2 ? parts[2] : parts[1]) + "S";
465+
((LapRaceOutputHTML)output_HTML).printCombined();
484466
}
485467
}

src/main/java/lap_race/LapRaceCategory.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package lap_race;
22

3+
import common.Category;
4+
35
public enum LapRaceCategory implements Category {
46

57
// Declared in order of decreasing generality.

src/main/java/lap_race/Input.java src/main/java/lap_race/LapRaceInput.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package lap_race;
22

3+
import common.RawResult;
4+
35
import java.io.IOException;
46
import java.nio.file.Files;
57
import java.nio.file.Path;
68
import java.util.ArrayList;
79
import java.util.List;
810

9-
public class Input {
11+
public class LapRaceInput {
1012

1113
final LapRace race;
1214

@@ -16,7 +18,7 @@ public class Input {
1618
String entries_filename;
1719
String raw_results_filename;
1820

19-
public Input(final LapRace race) {
21+
public LapRaceInput(final LapRace race) {
2022

2123
this.race = race;
2224
configure();
@@ -36,7 +38,7 @@ private void readProperties() {
3638

3739
private void constructFilePaths() {
3840

39-
input_directory_path = race.working_directory_path.resolve("input");
41+
input_directory_path = race.getWorkingDirectoryPath().resolve("input");
4042
entries_path = input_directory_path.resolve(entries_filename);
4143
raw_results_path = input_directory_path.resolve(raw_results_filename);
4244
}
@@ -113,7 +115,7 @@ private static void loadRawResult(final List<RawResult> raw_results, String line
113115

114116
final RawResult previous_result = !raw_results.isEmpty() ? raw_results.get(raw_results.size() - 1) : null;
115117

116-
if (previous_result != null && previous_result.recorded_finish_time.compareTo(result.recorded_finish_time) > 0)
118+
if (previous_result != null && previous_result.getRecordedFinishTime().compareTo(result.getRecordedFinishTime()) > 0)
117119
throw new RuntimeException("result " + (raw_results.size() + 1) + " out of order");
118120

119121
raw_results.add(result);

src/main/java/lap_race/Output.java src/main/java/lap_race/LapRaceOutput.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package lap_race;
22

3+
import common.Category;
4+
35
import java.io.IOException;
46
import java.io.OutputStreamWriter;
57
import java.nio.file.Path;
68
import java.time.Duration;
79
import java.util.Arrays;
810
import java.util.List;
911

10-
public abstract class Output {
12+
public abstract class LapRaceOutput {
1113

1214
public static final String DNF_STRING = "DNF";
1315

@@ -33,7 +35,7 @@ public abstract class Output {
3335
String prizes_filename;
3436
Path output_directory_path;
3537

36-
public Output(final LapRace race) {
38+
public LapRaceOutput(final LapRace race) {
3739

3840
this.race = race;
3941
configure();
@@ -58,7 +60,7 @@ private void constructFilePaths() {
5860
detailed_results_filename = race_name_for_filenames + "_detailed_" + year;
5961
prizes_filename = race_name_for_filenames + "_prizes_" + year;
6062

61-
output_directory_path = race.working_directory_path.resolve("output");
63+
output_directory_path = race.getWorkingDirectoryPath().resolve("output");
6264
}
6365

6466
public void printLegResults() throws IOException {

0 commit comments

Comments
 (0)