record CellFactory()

in extensions/vw/tabular/pdf/src/main/java/org/apache/causeway/extensions/tabular/pdf/factory/CellFactory.java [35:119]


record CellFactory(Row row, Cell template) {

    public Cell createCell(final int i, final float width, final List<Object> rowData) {

        Object cellValue = null;
        if (rowData.size() >= i) {
            cellValue = rowData.get(i);
            if (cellValue instanceof CharSequence seq) {
                cellValue = seq.toString()
                        .replaceAll("\r", "")
                        .replaceAll("\n", "<br>");
            }
        }
        if(cellValue==null) cellValue = "";

        var cell = switch(cellValue.getClass().getSimpleName()) {
            case "BufferedImage" -> row.createImageCell(width, (BufferedImage)cellValue);
            default -> row.createCell(width, toString(cellValue));
        };

        cell.copyCellStyle(template);

        return cell;
    }

    /**
     * @param cellValue not {@code null} nor {@link BufferedImage}
     */
    private String toString(final Object valueAsObj) {
        // String
        if(valueAsObj instanceof String value) {
            return value;
        }

        // boolean
        if(valueAsObj instanceof Boolean value) {
            return value ? "+" : "-";
        }

        // date
        if(valueAsObj instanceof Date value) {
            var dateTime = LocalDateTime.ofInstant(value.toInstant(), ZoneId.systemDefault());
            return DateTimeFormatter.ISO_DATE_TIME.format(dateTime);
        }
        if(valueAsObj instanceof LocalDate value) {
            return DateTimeFormatter.ISO_DATE.format(value);
        }
        if(valueAsObj instanceof LocalDateTime value) {
            return DateTimeFormatter.ISO_DATE_TIME.format(value);
        }
        if(valueAsObj instanceof OffsetDateTime value) {
            return DateTimeFormatter.ISO_DATE_TIME.format(value);
        }

        // number
        if(valueAsObj instanceof Double value) {
            value.toString();
        }
        if(valueAsObj instanceof Float value) {
            value.toString();
        }
        if(valueAsObj instanceof BigDecimal value) {
            value.toString();
        }
        if(valueAsObj instanceof BigInteger value) {
            value.toString();
        }
        if(valueAsObj instanceof Long value) {
            value.toString();
        }
        if(valueAsObj instanceof Integer value) {
            value.toString();
        }
        if(valueAsObj instanceof Short value) {
            value.toString();
        }
        if(valueAsObj instanceof Byte value) {
            value.toString();
        }

        // if all else fails fallback to value's toString method
        return valueAsObj.toString();
    }

}