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 { /**