diff --git a/launch/owlcms h2 no reset.launch b/launch/owlcms h2 no reset.launch
index c5d29980e..99cababd4 100644
--- a/launch/owlcms h2 no reset.launch
+++ b/launch/owlcms h2 no reset.launch
@@ -11,7 +11,6 @@
-
@@ -22,6 +21,7 @@
+
diff --git a/owlcms/src/main/java/app/owlcms/data/records/RecordDefinitionReader.java b/owlcms/src/main/java/app/owlcms/data/records/RecordDefinitionReader.java
index 12c30fb69..69888dfe0 100644
--- a/owlcms/src/main/java/app/owlcms/data/records/RecordDefinitionReader.java
+++ b/owlcms/src/main/java/app/owlcms/data/records/RecordDefinitionReader.java
@@ -12,18 +12,12 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.MessageFormat;
-import java.time.LocalDate;
-import java.time.Year;
-import java.time.YearMonth;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
@@ -31,7 +25,6 @@
import org.slf4j.LoggerFactory;
import app.owlcms.Main;
-import app.owlcms.data.athlete.Gender;
import app.owlcms.data.competition.Competition;
import app.owlcms.data.jpa.JPAService;
import app.owlcms.data.records.RecordEvent.MissingAgeGroup;
@@ -58,9 +51,6 @@ public class RecordDefinitionReader {
public static List createRecords(Workbook workbook, String name, String baseName) {
cleanUp(baseName);
- DateTimeFormatter ymdFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- DateTimeFormatter ymFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
- DateTimeFormatter yFormatter = DateTimeFormatter.ofPattern("yyyy");
return JPAService.runInTransaction(em -> {
int iRecord = 0;
@@ -85,239 +75,57 @@ public static List createRecords(Workbook workbook, String name, String
logger.debug("[" + sheet.getSheetName() + "," + cell.getAddress() + "]");
switch (iColumn) {
- case 0: { // A
- String cellValue = cell.getStringCellValue();
- String trim = cellValue.trim();
- if (trim.isEmpty()) {
- // stop processing sheet on first row with an empty first cell
- break processSheet;
- }
- rec.setRecordFederation(trim);
- break;
- }
-
- case 1: { // B
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setRecordName(cellValue);
- break;
- }
-
- case 2: { // C
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setAgeGrp(cellValue);
- break;
- }
-
- case 3: { // D
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim().toUpperCase() : cellValue;
- rec.setGender(Gender.valueOf(cellValue));
- break;
- }
-
- case 4: { // E
- long cellValue = Math.round(cell.getNumericCellValue());
- rec.setAgeGrpLower(Math.toIntExact(cellValue));
- break;
- }
-
- case 5: { // F
- long cellValue = Math.round(cell.getNumericCellValue());
- rec.setAgeGrpUpper(Math.toIntExact(cellValue));
- if (rec.getAgeGrpUpper() < rec.getAgeGrpLower()) {
- throw new Exception(cellValue
- + " upper limit on age category should be >= to "
- + rec.getAgeGrpLower());
-
- }
- break;
- }
-
- case 6: { // G
- long cellValue = Math.round(cell.getNumericCellValue());
- rec.setBwCatLower(Math.toIntExact(cellValue));
- break;
- }
-
- case 7: { // H
- try {
- String cellValue = cell.getStringCellValue();
- rec.setBwCatString(cellValue);
- try {
- if (cellValue.startsWith(">") || cellValue.startsWith("+")) {
- rec.setBwCatUpper(999);
- rec.setBwCatString(">" + rec.getBwCatLower());
- } else {
- rec.setBwCatUpper(Integer.parseInt(cellValue));
- }
-
- } catch (NumberFormatException e) {
- if (cellValue != null && !cellValue.isBlank()) {
- startupLogger
- .error("[" + sheet.getSheetName() + "," + cell.getAddress()
- + "]");
- logger.error(
- "[" + sheet.getSheetName() + "," + cell.getAddress() + "]");
- }
- }
- logger.debug("normal {} {} {}", iRecord, rec.getBwCatUpper(),
- rec.getBwCatLower());
- if (rec.getBwCatUpper() < rec.getBwCatLower()) {
- throw new Exception(cellValue
- + " upper limit on bodyweight category should be >= to "
- + rec.getAgeGrpLower());
-
- }
- } catch (IllegalStateException e) {
- long cellValue = Math.round(cell.getNumericCellValue());
- rec.setBwCatString(Long.toString(cellValue));
- rec.setBwCatUpper(Math.toIntExact(cellValue));
- logger.debug("illegalstate {} {} {}", iRecord, rec.getBwCatUpper(),
- rec.getBwCatLower());
- if (rec.getBwCatUpper() <= rec.getBwCatLower()) {
- throw new Exception(cellValue
- + " upper limit on bodyweight category should be > to "
- + rec.getBwCatLower());
- }
- }
- break;
- }
-
- case 8: { // I
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setRecordLift(cellValue);
- break;
- }
-
- case 9: { // J
- rec.setRecordValue(cell.getNumericCellValue());
- break;
- }
-
- case 10: { // K
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setAthleteName(cellValue);
- break;
- }
-
- case 11: { // L
- if (cell.getCellType() == CellType.NUMERIC) {
- long cellValue = Math.round(cell.getNumericCellValue());
- int intExact = Math.toIntExact(cellValue);
- if (cellValue < 3000) {
- rec.setBirthYear(intExact);
- logger.debug("number {}", intExact);
- } else {
- LocalDate epoch = LocalDate.of(1900, 1, 1);
- LocalDate plusDays = epoch.plusDays(intExact - 2);
- // Excel quirks: 1 is 1900-01-01 and mistakenly assumes 1900-02-29 existed
- rec.setBirthDate(plusDays);
- logger.debug("plusDays {}", rec.getRecordDateAsString());
- }
- } else if (cell.getCellType() == CellType.STRING) {
- String cellValue = cell.getStringCellValue();
- logger.debug("string value = '{}'", cellValue);
- try {
- LocalDate date = LocalDate.parse(cellValue, ymdFormatter);
- rec.setBirthDate(date);
- logger.debug("date {}", date);
- } catch (DateTimeParseException e) {
- try {
- YearMonth date = YearMonth.parse(cellValue, ymFormatter);
- rec.setBirthYear(date.getYear());
- logger.debug("datemonth {}", date.getYear());
- } catch (DateTimeParseException e2) {
- try {
- Year date = Year.parse(cellValue, yFormatter);
- rec.setBirthYear(date.getValue());
- logger.debug("year {}", date.getValue());
- } catch (DateTimeParseException e3) {
- throw new Exception(cellValue
- + " not in yyyy-MM-dd or yyyy-MM or yyyy date format");
- }
- }
- }
- }
- break;
- }
-
- case 12: { // M
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setNation(cellValue);
- break;
- }
-
- case 13: { // N
- if (cell.getCellType() == CellType.NUMERIC) {
- long cellValue = Math.round(cell.getNumericCellValue());
- int intExact = Math.toIntExact(cellValue);
- if (cellValue < 3000) {
- rec.setRecordYear(intExact);
- logger.debug("number {}", intExact);
- } else {
- LocalDate epoch = LocalDate.of(1900, 1, 1);
- LocalDate plusDays = epoch.plusDays(intExact - 2);
- // Excel quirks: 1 is 1900-01-01 and mistakenly assumes 1900-02-29 existed
- rec.setRecordDate(plusDays);
- logger.debug("plusDays {}", rec.getRecordDateAsString());
- }
- } else if (cell.getCellType() == CellType.STRING) {
- String cellValue = cell.getStringCellValue();
- if (cellValue != null && cellValue.isBlank()) {
- break;
- }
- logger.debug("string value = '{}'", cellValue);
- try {
- LocalDate date = LocalDate.parse(cellValue, ymdFormatter);
- rec.setRecordDate(date);
- logger.debug("date {}", date);
- } catch (DateTimeParseException e) {
- try {
- YearMonth date = YearMonth.parse(cellValue, ymFormatter);
- rec.setRecordYear(date.getYear());
- logger.debug("datemonth {}", date.getYear());
- } catch (DateTimeParseException e2) {
- try {
- Year date = Year.parse(cellValue, yFormatter);
- rec.setRecordYear(date.getValue());
- logger.debug("year {}", date.getValue());
- } catch (DateTimeParseException e3) {
- throw new Exception(cellValue
- + " not in yyyy-MM-dd or yyyy-MM or yyyy date format");
- }
- }
- }
-
- }
- break;
- }
- case 14: { // O
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setEventLocation(cellValue);
- break;
- }
- case 15: { // P is used for new records
- break;
- }
- case 16: { // Q
- if (cell.getCellType() == CellType.NUMERIC) {
- // String cellValue = NumberToTextConverter.toText(cell.getNumericCellValue());
- rec.setEvent("");
- break;
- }
- String cellValue = cell.getStringCellValue();
- cellValue = cellValue != null ? cellValue.trim() : cellValue;
- rec.setEvent(cellValue);
- break;
- }
-
- }
+ case 0: // A
+ RecordEventSetters.setFederation(rec, cell.getStringCellValue());
+ break;
+ case 1: // B
+ RecordEventSetters.setRecordName(rec, cell.getStringCellValue());
+ break;
+ case 2: // C
+ RecordEventSetters.setAgeGroup(rec, cell.getStringCellValue());
+ break;
+ case 3: // D
+ RecordEventSetters.setGender(rec, cell.getStringCellValue());
+ break;
+ case 4: // E
+ RecordEventSetters.setAgeLower(rec, cell.getNumericCellValue());
+ break;
+ case 5: // F
+ RecordEventSetters.setAgeUpper(rec, cell.getNumericCellValue());
+ break;
+ case 6: // G
+ RecordEventSetters.setBwLower(rec, cell.getNumericCellValue());
+ break;
+ case 7: // H
+ RecordEventSetters.setBwUpper(rec, cell.getStringCellValue(), cell.getCellType());
+ break;
+ case 8: // I
+ RecordEventSetters.setRecordLift(rec, cell.getStringCellValue());
+ break;
+ case 9: // J
+ RecordEventSetters.setRecordValue(rec, cell.getNumericCellValue());
+ break;
+ case 10: // K
+ RecordEventSetters.setAthleteName(rec, cell.getStringCellValue());
+ break;
+ case 11: // L
+ RecordEventSetters.setBirthDate(rec, cell.getStringCellValue(), cell.getCellType());
+ break;
+ case 12: // M
+ RecordEventSetters.setNation(rec, cell.getStringCellValue());
+ break;
+ case 13: // N
+ RecordEventSetters.setRecordDate(rec, cell.getStringCellValue(), cell.getCellType());
+ break;
+ case 14: // O
+ RecordEventSetters.setEventLocation(rec, cell.getStringCellValue());
+ break;
+ case 15: // P is used for new records
+ break;
+ case 16: // Q
+ RecordEventSetters.setEvent(rec, cell.getStringCellValue(), cell.getCellType());
+ break;
+ }
iColumn++;
} catch (Exception e) {
diff --git a/owlcms/src/main/java/app/owlcms/data/records/RecordEvent.java b/owlcms/src/main/java/app/owlcms/data/records/RecordEvent.java
index 8d2a28a0c..5a5e8326c 100644
--- a/owlcms/src/main/java/app/owlcms/data/records/RecordEvent.java
+++ b/owlcms/src/main/java/app/owlcms/data/records/RecordEvent.java
@@ -121,32 +121,6 @@ public static RecordEvent newRecord(Athlete a, RecordEvent rec, Double value, Gr
setId(IdUtils.getTimeBasedId());
}
- // @Override
- // public boolean equals(Object obj) {
- // if (this == obj) {
- // return true;
- // }
- // if ((obj == null) || (getClass() != obj.getClass())) {
- // return false;
- // }
- // RecordEvent other = (RecordEvent) obj;
- // return Objects.equals(this.ageGrp, other.ageGrp) && this.ageGrpLower == other.ageGrpLower
- // && this.ageGrpUpper == other.ageGrpUpper && Objects.equals(this.athleteName, other.athleteName)
- // && Objects.equals(this.birthDate, other.birthDate) && Objects.equals(this.birthYear, other.birthYear)
- // && this.bwCatLower == other.bwCatLower && Objects.equals(this.bwCatString, other.bwCatString)
- // && Objects.equals(this.bwCatUpper, other.bwCatUpper)
- // && Objects.equals(this.categoryString, other.categoryString)
- // && Objects.equals(this.event, other.event) && Objects.equals(this.eventLocation, other.eventLocation)
- // && this.gender == other.gender && Objects.equals(this.groupNameString, other.groupNameString)
- // && Objects.equals(this.id, other.id) && Objects.equals(this.nation, other.nation)
- // && Objects.equals(this.recordDate, other.recordDate)
- // && Objects.equals(this.recordFederation, other.recordFederation) && this.recordLift == other.recordLift
- // && Objects.equals(this.recordName, other.recordName)
- // && Objects.equals(this.recordValue, other.recordValue)
- // && Objects.equals(this.fileName, other.fileName)
- // && this.recordYear == other.recordYear;
- // }
-
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/owlcms/src/main/java/app/owlcms/data/records/RecordEventSetters.java b/owlcms/src/main/java/app/owlcms/data/records/RecordEventSetters.java
new file mode 100644
index 000000000..7813c28fb
--- /dev/null
+++ b/owlcms/src/main/java/app/owlcms/data/records/RecordEventSetters.java
@@ -0,0 +1,186 @@
+package app.owlcms.data.records;
+
+import java.time.LocalDate;
+import java.time.Year;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import org.apache.poi.ss.usermodel.CellType;
+import app.owlcms.data.athlete.Gender;
+import org.slf4j.LoggerFactory;
+import ch.qos.logback.classic.Logger;
+
+public class RecordEventSetters {
+ private final static Logger logger = (Logger) LoggerFactory.getLogger(RecordEventSetters.class);
+ private final static DateTimeFormatter ymdFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ private final static DateTimeFormatter ymFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
+ private final static DateTimeFormatter yFormatter = DateTimeFormatter.ofPattern("yyyy");
+
+ public static void setFederation(RecordEvent rec, String cellValue) {
+ String trim = cellValue.trim();
+ if (trim.isEmpty()) {
+ throw new IllegalArgumentException("Federation cannot be empty");
+ }
+ rec.setRecordFederation(trim);
+ }
+
+ public static void setRecordName(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setRecordName(cellValue);
+ }
+
+ public static void setAgeGroup(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setAgeGrp(cellValue);
+ }
+
+ public static void setGender(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim().toUpperCase() : cellValue;
+ rec.setGender(Gender.valueOf(cellValue));
+ }
+
+ public static void setAgeLower(RecordEvent rec, double cellValue) {
+ rec.setAgeGrpLower(Math.toIntExact(Math.round(cellValue)));
+ }
+
+ public static void setAgeUpper(RecordEvent rec, double cellValue) {
+ int value = Math.toIntExact(Math.round(cellValue));
+ if (value < rec.getAgeGrpLower()) {
+ throw new IllegalArgumentException(value + " upper limit on age category should be >= to " + rec.getAgeGrpLower());
+ }
+ rec.setAgeGrpUpper(value);
+ }
+
+ public static void setBwLower(RecordEvent rec, double cellValue) {
+ rec.setBwCatLower(Math.toIntExact(Math.round(cellValue)));
+ }
+
+ public static void setBwUpper(RecordEvent rec, String cellValue, CellType cellType) {
+ if (cellType == CellType.STRING) {
+ rec.setBwCatString(cellValue);
+ try {
+ if (cellValue.startsWith(">") || cellValue.startsWith("+")) {
+ rec.setBwCatUpper(999);
+ rec.setBwCatString(">" + rec.getBwCatLower());
+ } else {
+ rec.setBwCatUpper(Integer.parseInt(cellValue));
+ }
+ } catch (NumberFormatException e) {
+ if (cellValue != null && !cellValue.isBlank()) {
+ throw new IllegalArgumentException("Invalid bodyweight upper limit: " + cellValue);
+ }
+ }
+ if (rec.getBwCatUpper() < rec.getBwCatLower()) {
+ throw new IllegalArgumentException(cellValue + " upper limit on bodyweight category should be >= to " + rec.getBwCatLower());
+ }
+ } else {
+ long numericValue = Math.round(Double.parseDouble(cellValue));
+ rec.setBwCatString(Long.toString(numericValue));
+ rec.setBwCatUpper(Math.toIntExact(numericValue));
+ if (rec.getBwCatUpper() <= rec.getBwCatLower()) {
+ throw new IllegalArgumentException(numericValue + " upper limit on bodyweight category should be > to " + rec.getBwCatLower());
+ }
+ }
+ }
+
+ public static void setRecordLift(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setRecordLift(cellValue);
+ }
+
+ public static void setRecordValue(RecordEvent rec, double cellValue) {
+ rec.setRecordValue(cellValue);
+ }
+
+ public static void setAthleteName(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setAthleteName(cellValue);
+ }
+
+ public static void setBirthDate(RecordEvent rec, String cellValue, CellType cellType) {
+ if (cellType == CellType.NUMERIC) {
+ long numericValue = Math.round(Double.parseDouble(cellValue));
+ if (numericValue < 3000) {
+ rec.setBirthYear(Math.toIntExact(numericValue));
+ logger.debug("number {}", numericValue);
+ } else {
+ LocalDate epoch = LocalDate.of(1900, 1, 1);
+ LocalDate plusDays = epoch.plusDays(numericValue - 2);
+ rec.setBirthDate(plusDays);
+ logger.debug("plusDays {}", rec.getRecordDateAsString());
+ }
+ } else {
+ parseDateOrYear(rec, cellValue, "birth");
+ }
+ }
+
+ public static void setNation(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setNation(cellValue);
+ }
+
+ public static void setRecordDate(RecordEvent rec, String cellValue, CellType cellType) {
+ if (cellType == CellType.NUMERIC) {
+ long numericValue = Math.round(Double.parseDouble(cellValue));
+ if (numericValue < 3000) {
+ rec.setRecordYear(Math.toIntExact(numericValue));
+ logger.debug("number {}", numericValue);
+ } else {
+ LocalDate epoch = LocalDate.of(1900, 1, 1);
+ LocalDate plusDays = epoch.plusDays(numericValue - 2);
+ rec.setRecordDate(plusDays);
+ logger.debug("plusDays {}", rec.getRecordDateAsString());
+ }
+ } else if (cellValue != null && !cellValue.isBlank()) {
+ parseDateOrYear(rec, cellValue, "record");
+ }
+ }
+
+ public static void setEventLocation(RecordEvent rec, String cellValue) {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setEventLocation(cellValue);
+ }
+
+ public static void setEvent(RecordEvent rec, String cellValue, CellType cellType) {
+ if (cellType == CellType.NUMERIC) {
+ rec.setEvent("");
+ } else {
+ cellValue = cellValue != null ? cellValue.trim() : cellValue;
+ rec.setEvent(cellValue);
+ }
+ }
+
+ private static void parseDateOrYear(RecordEvent rec, String cellValue, String type) {
+ try {
+ LocalDate date = LocalDate.parse(cellValue, ymdFormatter);
+ if (type.equals("birth")) {
+ rec.setBirthDate(date);
+ } else {
+ rec.setRecordDate(date);
+ }
+ logger.debug("date {}", date);
+ } catch (DateTimeParseException e) {
+ try {
+ YearMonth date = YearMonth.parse(cellValue, ymFormatter);
+ if (type.equals("birth")) {
+ rec.setBirthYear(date.getYear());
+ } else {
+ rec.setRecordYear(date.getYear());
+ }
+ logger.debug("datemonth {}", date.getYear());
+ } catch (DateTimeParseException e2) {
+ try {
+ Year date = Year.parse(cellValue, yFormatter);
+ if (type.equals("birth")) {
+ rec.setBirthYear(date.getValue());
+ } else {
+ rec.setRecordYear(date.getValue());
+ }
+ logger.debug("year {}", date.getValue());
+ } catch (DateTimeParseException e3) {
+ throw new IllegalArgumentException(cellValue + " not in yyyy-MM-dd or yyyy-MM or yyyy date format");
+ }
+ }
+ }
+ }
+}
diff --git a/shared/src/main/java/app/owlcms/servlet/StopProcessingException.java b/shared/src/main/java/app/owlcms/servlet/StopProcessingException.java
index 16c6f8eea..853322528 100644
--- a/shared/src/main/java/app/owlcms/servlet/StopProcessingException.java
+++ b/shared/src/main/java/app/owlcms/servlet/StopProcessingException.java
@@ -12,7 +12,6 @@
* to the web server, where it will be ignored instead of polluting the logs.
*
*/
-@SuppressWarnings("serial")
public class StopProcessingException extends RuntimeException {
/**