in baremaps-shapefile/src/main/java/org/apache/baremaps/shapefile/DbaseByteReader.java [110:162]
public void loadRow(List<Object> row) {
// TODO: ignore deleted records
getByteBuffer().get(); // denotes whether deleted or current
// read first part of record
var check = nextRowAvailable();
for (DBaseFieldDescriptor fieldDescriptor : this.fieldsDescriptors) {
byte[] data = new byte[fieldDescriptor.getLength()];
getByteBuffer().get(data);
int length = data.length;
while (length != 0 && Byte.toUnsignedInt(data[length - 1]) <= ' ') {
length--;
}
String value = new String(data, 0, length);
// TODO: move somewhere else
Object object = switch (fieldDescriptor.getType()) {
case CHARACTER -> value;
case NUMBER -> getNumber(fieldDescriptor, value);
case CURRENCY -> Double.parseDouble(value.trim());
case INTEGER -> Integer.parseInt(value.trim());
case DOUBLE -> Double.parseDouble(value.trim());
case AUTO_INCREMENT -> Integer.parseInt(value.trim());
case LOGICAL -> value;
case DATE -> {
if (value.trim().isEmpty()) {
yield null;
} else {
// Convert date string to LocalDate
// DBF date format is YYYYMMDD
try {
yield LocalDate.parse(value.trim(), DateTimeFormatter.ofPattern("yyyyMMdd"));
} catch (Exception e) {
// If parsing fails, return the original string
yield value;
}
}
}
case MEMO -> value;
case FLOATING_POINT -> value;
case PICTURE -> value;
case VARI_FIELD -> value;
case VARIANT -> value;
case TIMESTAMP -> value;
case DATE_TIME -> value;
};
row.add(object);
}
}