Skip to content

Commit

Permalink
header-based record RecordDefinitionReader
Browse files Browse the repository at this point in the history
  • Loading branch information
jflamy committed Jan 30, 2025
1 parent 147ca1f commit faa0013
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 271 deletions.
2 changes: 1 addition & 1 deletion launch/owlcms h2 no reset.launch
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
<mapEntry key="OWLCMS_BACKDOOR" value="127.0.0.1,[0:0:0:0:0:0:0:1]"/>
<mapEntry key="OWLCMS_PORT" value="8080"/>
<mapEntry key="OWLCMS_UPDATEKEY" value="mapetitevacheamalauxpattes"/>
<mapEntry key="_OWLCMS_VIDEODATA" value="http://owlcms.local:8091"/>
<mapEntry key="_JDBC_DATABASE_PASSWORD" value="postgres"/>
<mapEntry key="_JDBC_DATABASE_URL" value="jdbc:postgresql://localhost:5432/owlcms_db"/>
<mapEntry key="_JDBC_DATABASE_USERNAME" value="postgres"/>
Expand All @@ -22,6 +21,7 @@
<mapEntry key="_OWLCMS_H2SERVERPORT" value="9092"/>
<mapEntry key="_OWLCMS_PIN" value="1234"/>
<mapEntry key="_OWLCMS_REMOTE" value="http://localhost:8082"/>
<mapEntry key="_OWLCMS_VIDEODATA" value="http://owlcms.local:8091"/>
<mapEntry key="__JDBC_DATABASE_URL" value="jdbc:h2:file:./database/scolaire.mv.db"/>
</mapAttribute>
<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
Expand Down
294 changes: 51 additions & 243 deletions owlcms/src/main/java/app/owlcms/data/records/RecordDefinitionReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,19 @@
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;
import org.apache.poi.ss.usermodel.WorkbookFactory;
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;
Expand All @@ -58,9 +51,6 @@ public class RecordDefinitionReader {

public static List<String> 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;
Expand All @@ -85,239 +75,57 @@ public static List<String> 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) {
Expand Down
26 changes: 0 additions & 26 deletions owlcms/src/main/java/app/owlcms/data/records/RecordEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Loading

0 comments on commit faa0013

Please sign in to comment.