public void loadRow()

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);
    }
  }