package io.swagger.inflector.converters; import io.swagger.inflector.validators.*; import io.swagger.models.Model; import io.swagger.models.parameters.Parameter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; public class InputConverter { private static final Logger LOGGER = LoggerFactory.getLogger(InputConverter.class); private static InputConverter INSTANCE = new InputConverter(); private List<Validator> validationChain = new ArrayList<Validator>(); private List<Converter> converterChain = new ArrayList<Converter>(); public static InputConverter getInstance() { return INSTANCE; } public List<Validator> getValidators() { return validationChain; } public List<Converter> getConverters() { return converterChain; } public void addConverter(Converter converter) { boolean matched = false; for(Converter c : converterChain) { if(c.getClass().getName().equals(converter.getClass().getName())) { matched = true; } } if(!matched) { LOGGER.debug("adding " + converter.getClass().getName()); converterChain.add(converter); } else { LOGGER.debug("skipping " + converter.getClass().getName()); } } public void addConverter(Converter converter, boolean first) { boolean matched = false; for(Converter c : converterChain) { if(c.getClass().getName().equals(converter.getClass().getName())) { matched = true; } } if(!matched) converterChain.add(0, converter); } public InputConverter defaultConverters() { converterChain.clear(); converterChain.add(new DefaultConverter()); return this; } public void addValidator(Validator validator) { boolean matched = false; for(Validator v : validationChain) { if(v.getClass().getName().equals(validator.getClass().getName())) { matched = true; } } if(!matched) validationChain.add(validator); } public void addValidator(Validator validator, boolean first) { boolean matched = false; for(Validator v : validationChain) { if(v.getClass().getName().equals(validator.getClass().getName())) { matched = true; } } if(!matched) validationChain.add(0, validator); } public InputConverter defaultValidators() { validationChain.clear(); validationChain.add(new DefaultValidator()); validationChain.add(new NumericValidator()); validationChain.add(new StringTypeValidator()); return this; } public Object convertAndValidate(List<String> value, Parameter parameter, Class<?> cls, Map<String, Model> definitions) throws ConversionException, ValidationException { Iterator<Converter> itr = converterChain.iterator(); Object o = null; if(itr.hasNext()) { Converter converter = itr.next(); LOGGER.debug("using converter `" + converter.getClass().getName() + "`"); o = converter.convert(value, parameter, cls, definitions, itr); } validate(o, parameter); return o; } public void validate(Object value, Parameter parameter) throws ValidationException { Iterator<Validator> itr = validationChain.iterator(); if(itr.hasNext()) { Validator validator = itr.next(); validator.validate(value, parameter, itr); } } }