001package de.cuioss.test.jsf.generator;
002
003import static de.cuioss.tools.collect.CollectionLiterals.immutableList;
004
005import java.math.BigDecimal;
006import java.math.BigInteger;
007import java.util.Date;
008import java.util.List;
009import java.util.stream.Collectors;
010
011import javax.faces.convert.BigDecimalConverter;
012import javax.faces.convert.BigIntegerConverter;
013import javax.faces.convert.BooleanConverter;
014import javax.faces.convert.ByteConverter;
015import javax.faces.convert.CharacterConverter;
016import javax.faces.convert.Converter;
017import javax.faces.convert.DateTimeConverter;
018import javax.faces.convert.DoubleConverter;
019import javax.faces.convert.EnumConverter;
020import javax.faces.convert.FloatConverter;
021import javax.faces.convert.IntegerConverter;
022import javax.faces.convert.LongConverter;
023import javax.faces.convert.NumberConverter;
024import javax.faces.convert.ShortConverter;
025
026import de.cuioss.test.generator.Generators;
027import de.cuioss.test.generator.TypedGenerator;
028import de.cuioss.test.jsf.config.ComponentConfigurator;
029
030/**
031 * Hybrid class that acts as an {@link TypedGenerator} and
032 * {@link ComponentConfigurator}.
033 *
034 * @author Oliver Wolff
035 */
036@SuppressWarnings("rawtypes")
037public class JsfProvidedConverter implements TypedGenerator<Class> {
038
039    /** Defines all converter types provided by JSF. */
040    @SuppressWarnings("java:S2386") // owolff: false positive -> immutableList
041    public static final List<ConverterDescriptor> JSF_CONVERTER = immutableList(
042            new ConverterDescriptor(BigDecimalConverter.class, BigDecimal.class, BigDecimalConverter.CONVERTER_ID),
043            new ConverterDescriptor(BigIntegerConverter.class, BigInteger.class, BigIntegerConverter.CONVERTER_ID),
044            new ConverterDescriptor(BooleanConverter.class, Boolean.class, BooleanConverter.CONVERTER_ID),
045            new ConverterDescriptor(ByteConverter.class, Byte.class, ByteConverter.CONVERTER_ID),
046            new ConverterDescriptor(CharacterConverter.class, Character.class, CharacterConverter.CONVERTER_ID),
047            new ConverterDescriptor(DateTimeConverter.class, Date.class, DateTimeConverter.CONVERTER_ID),
048            new ConverterDescriptor(DoubleConverter.class, Double.class, DoubleConverter.CONVERTER_ID),
049            new ConverterDescriptor(EnumConverter.class, Enum.class, EnumConverter.CONVERTER_ID),
050            new ConverterDescriptor(FloatConverter.class, Float.class, FloatConverter.CONVERTER_ID),
051            new ConverterDescriptor(IntegerConverter.class, Integer.class, IntegerConverter.CONVERTER_ID),
052            new ConverterDescriptor(LongConverter.class, Long.class, LongConverter.CONVERTER_ID),
053            new ConverterDescriptor(NumberConverter.class, Number.class, NumberConverter.CONVERTER_ID),
054            new ConverterDescriptor(ShortConverter.class, Short.class, ShortConverter.CONVERTER_ID));
055
056    /** Defines a generator for all converter types provided by JSF. */
057    public static final TypedGenerator<ConverterDescriptor> CONVERTER_CLASS_GERNERATOR = Generators
058            .fixedValues(JSF_CONVERTER);
059
060    /** A generator for every id of registered generator. */
061    public static final TypedGenerator<String> CONVERTER_ID_GENERATOR = Generators
062            .fixedValues(JSF_CONVERTER.stream().map(ConverterDescriptor::getConverterId).collect(Collectors.toList()));
063
064    /** A generator for a subset of types a generator is registered as default. */
065    public static final TypedGenerator<Class<?>> TARGET_TYPE_GENERATOR = Generators
066            .fixedValues(immutableList(Integer.class, Double.class, Float.class, Boolean.class, BigInteger.class));
067
068    @SuppressWarnings("unchecked")
069    @Override
070    public Class<Converter> next() {
071        return (Class<Converter>) CONVERTER_CLASS_GERNERATOR.next().getConverterClass();
072    }
073
074    @Override
075    public Class<Class> getType() {
076        return Class.class;
077    }
078
079}