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

org.polyglotted.xpathstax.data.BasicValue Maven / Gradle / Ivy

package org.polyglotted.xpathstax.data;

import static java.text.DateFormat.getDateTimeInstance;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;

public class BasicValue extends PrimitiveValue {

    public BasicValue(Object data) {
        super(data);
    }

    public BigDecimal asBigDecimal(BigDecimal defaultValue) {
        try {
            if (isNull()) {
                return defaultValue;

            } else if (data instanceof Number) {
                return BigDecimal.valueOf(((Number) data).doubleValue());
            }
            return new BigDecimal(asString(), MathContext.UNLIMITED);

        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    public BigInteger asBigInteger(BigInteger defaultValue) {
        try {
            if (isNull()) {
                return defaultValue;

            } else if (data instanceof Number) {
                return BigInteger.valueOf(((Number) data).longValue());
            }
            return new BigInteger(asString());

        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    public Date asDate(Date defaultValue) {
        return asDate(defaultValue, null);
    }

    public Date asDate(Date defaultValue, String datePattern) {
        if (isNull()) {
            return defaultValue;

        } else if (data instanceof Date) {
            return (Date) data;
        }
        try {
            DateFormat format = (datePattern == null) ? getDateTimeInstance() : new SimpleDateFormat(datePattern);
            return format.parse(asString());
        } catch (ParseException e) {
            return defaultValue;
        }
    }

    public > E asEnum(Class clazz, E defaultValue) {
        if (isNull()) {
            return defaultValue;

        } else if (clazz.isAssignableFrom(data.getClass())) {
            return clazz.cast(data);
        }
        try {
            return Enum.valueOf(clazz, asString());
        } catch (Exception e) {
            return asXmlEnumValue(clazz, defaultValue);
        }
    }

    public > E asXmlEnumValue(Class clazz, E defaultValue) {
        if (!clazz.isAnnotationPresent(XmlEnum.class)) {
            return defaultValue;
        }

        E result = null;
        for (Field fld : clazz.getDeclaredFields()) {
            if (fld.isEnumConstant() && fld.isAnnotationPresent(XmlEnumValue.class)) {
                String xmlValue = fld.getAnnotation(XmlEnumValue.class).value();
                if (xmlValue.equals(asString())) {
                    try {
                        result = clazz.cast(fld.get(null));
                    } catch (Exception e) {
                        //ignore
                    }
                    break;
                }
            }
        }
        return (result == null) ? defaultValue : result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy