package com.softwaremill.common.cdi.autofactory.extension.parameter.converter; import com.softwaremill.common.cdi.autofactory.FactoryParameter; import com.softwaremill.common.cdi.autofactory.extension.MethodParameterIndexer; import com.softwaremill.common.cdi.autofactory.extension.QualifierAnnotationsFilter; import com.softwaremill.common.cdi.autofactory.extension.parameter.BeanManagerParameterValue; import com.softwaremill.common.cdi.autofactory.extension.parameter.FactoryParameterParameterValue; import com.softwaremill.common.cdi.autofactory.extension.parameter.ParameterValue; import javax.enterprise.inject.spi.AnnotatedConstructor; import javax.enterprise.inject.spi.AnnotatedParameter; import java.util.List; /** * @author Adam Warski (adam at warski dot org) */ public class MixedConstructorConverter implements ConstructorToParameterValuesConverter { private final QualifierAnnotationsFilter qualifierAnnotationsFilter; private final AnnotatedConstructor<?> constructor; private final MethodParameterIndexer methodParameterIndexer; public MixedConstructorConverter(QualifierAnnotationsFilter qualifierAnnotationsFilter, AnnotatedConstructor<?> constructor, MethodParameterIndexer methodParameterIndexer) { this.qualifierAnnotationsFilter = qualifierAnnotationsFilter; this.constructor = constructor; this.methodParameterIndexer = methodParameterIndexer; } public ParameterValue[] convert() { List<? extends AnnotatedParameter<?>> constructorParameters = constructor.getParameters(); ParameterValue[] constructorParameterValues = new ParameterValue[constructorParameters.size()]; for (int i = 0; i < constructorParameters.size(); i++) { AnnotatedParameter<?> parameter = constructorParameters.get(i); constructorParameterValues[i] = createParameterValue(parameter); } return constructorParameterValues; } private ParameterValue createParameterValue(AnnotatedParameter parameter) { if (parameter.getAnnotation(FactoryParameter.class) != null) { return new FactoryParameterParameterValue(methodParameterIndexer.getIndexForArgument(parameter.getBaseType())); } else { return new BeanManagerParameterValue(parameter.getBaseType(), qualifierAnnotationsFilter.filter(parameter.getAnnotations())); } } }