All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.panteleyev.commons.xml.Converter Maven / Gradle / Ivy

The newest version!
/*
 Copyright © 2024 Petr Panteleyev 
 SPDX-License-Identifier: BSD-2-Clause
 */
package org.panteleyev.commons.xml;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;

final class Converter {
    static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_DATE;

    private static final String TYPE_STRING = "java.lang.String";
    private static final String TYPE_BIG_DECIMAL = "java.math.BigDecimal";
    private static final String TYPE_BOOLEAN = "java.lang.Boolean";
    private static final String TYPE_BOOL = "boolean";
    private static final String TYPE_INTEGER = "java.lang.Integer";
    private static final String TYPE_INT = "int";
    private static final String TYPE_LONG = "java.lang.Long";
    private static final String TYPE_LONG_P = "long";
    private static final String TYPE_DOUBLE = "java.lang.Double";
    private static final String TYPE_DOUBLE_P = "double";
    private static final String TYPE_UUID = "java.util.UUID";
    private static final String TYPE_LOCAL_DATE = "java.time.LocalDate";
    private static final String TYPE_LOCAL_DATE_TIME = "java.time.LocalDateTime";
    private static final String TYPE_BYTE_ARRAY = "byte[]";

    static String valueToString(Object value, boolean localDateAsEpochDay) {
        Objects.requireNonNull(value);

        if (value.getClass().getTypeName().equals(TYPE_BYTE_ARRAY)) {
            return Base64.getEncoder().encodeToString((byte[]) value);
        } else {
            return switch (value) {
                case String stringValue -> stringValue;
                case LocalDateTime localDateTime -> localDateTime.format(DATE_TIME_FORMATTER);
                case Enum enumValue -> enumValue.name();
                case LocalDate localDate when localDateAsEpochDay -> Long.toString(localDate.toEpochDay());
                case LocalDate localDate -> localDate.format(DATE_FORMATTER);
                default -> value.toString();
            };
        }
    }

    @SuppressWarnings({"rawtypes", "unchecked"})
    static  Optional stringToValue(Class type, String stringValue, boolean localDateAsEpochDay) {
        if (stringValue == null) {
            return Optional.empty();
        }

        if (type.isEnum()) {
            return Optional.of((T) Enum.valueOf((Class) type, stringValue));
        } else {
            var typeName = type.getTypeName();
            if (typeName.equals(TYPE_STRING)) {
                return Optional.of((T) stringValue);
            } else {
                if (stringValue.isBlank()) {
                    return Optional.empty();
                } else {
                    return Optional.ofNullable((T) switch (typeName) {
                        case TYPE_INT -> Integer.parseInt(stringValue);
                        case TYPE_INTEGER -> Integer.valueOf(stringValue);
                        case TYPE_LONG_P -> Long.parseLong(stringValue);
                        case TYPE_LONG -> Long.valueOf(stringValue);
                        case TYPE_BOOL -> Boolean.parseBoolean(stringValue);
                        case TYPE_BOOLEAN -> Boolean.valueOf(stringValue);
                        case TYPE_DOUBLE -> Double.valueOf(stringValue);
                        case TYPE_DOUBLE_P -> Double.parseDouble(stringValue);
                        case TYPE_BIG_DECIMAL -> new BigDecimal(stringValue);
                        case TYPE_UUID -> UUID.fromString(stringValue);
                        case TYPE_LOCAL_DATE -> localDateAsEpochDay ?
                                LocalDate.ofEpochDay(Long.parseLong(stringValue)) :
                                LocalDate.parse(stringValue, DATE_FORMATTER);
                        case TYPE_LOCAL_DATE_TIME -> LocalDateTime.parse(stringValue, DATE_TIME_FORMATTER);
                        case TYPE_BYTE_ARRAY -> Base64.getDecoder().decode(stringValue);
                        default -> throw new IllegalArgumentException("Unsupported type: " + typeName);
                    });
                }
            }
        }
    }

    private Converter() {
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy