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

com.ontology2.centipede.parser.RWOption Maven / Gradle / Ivy

package com.ontology2.centipede.parser;

import com.ontology2.centipede.errors.MisconfigurationException;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class RWOption  {
    private final Field field;
    private final Class substitutor;

    private final boolean isRequired;
    private String name;
    private String defaultValue;
    private String description;
    private Type type;

    public RWOption(Field f) {
        Option o=f.getAnnotation(Option.class);
        this.isRequired=(f.getAnnotation(Required.class)!=null);

        this.field=f;
        this.name=o.name();
        this.defaultValue=o.defaultValue();
        this.description=o.description();
        if(!Object.class.equals(o.contextualConverter())
            &&  !ContextualConverter.class.isAssignableFrom(o.contextualConverter()))
            throw new MisconfigurationException("A contextualConverter must be a ContextualConverter for option "+name);
        this.substitutor=o.contextualConverter();
    }

    public boolean isRequired() {
        return isRequired;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDefaultValue() {
        return defaultValue;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type=type;
    }

    public Field getField() {
        return field;
    }

    public boolean isList() {
        return type instanceof ParameterizedType
                && List.class.isAssignableFrom(
                (Class) ((ParameterizedType) type).getRawType());
    }

    public Class getContextualConverter() {
        return substitutor;
    }

    //
    // Only valid if the field is a List,  something horrible is likely to happen otherwise
    //

    public Class getElementType() {
        ParameterizedType that=(ParameterizedType) type;
        return (Class) that.getActualTypeArguments()[0];
    }

    public Object convertFrom(HasOptions context,ConversionService conversionService,String value) throws IllegalAccessException {
        if(Object.class.equals(getContextualConverter())) {
            Type toType= isList() ? getElementType() : getType();
            return conversionService.convert(
                    value
                    , TypeDescriptor.valueOf(String.class)
                    , TypeDescriptor.valueOf((Class) toType)
            );
        } else {
            try {
                ContextualConverter cc=(ContextualConverter ) getContextualConverter().newInstance();
                return cc.convert(value, context);
            } catch(InstantiationException x) {
                throw new MisconfigurationException("The contextual converter "+getContextualConverter()+" must have a zero argument constructor");
            }
        }
    };
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy