package org.arquillian.cube.impl.client.enricher;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.arquillian.cube.HostIp;
import org.arquillian.cube.HostIpContext;
import org.arquillian.cube.impl.util.ReflectionUtil;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.test.spi.TestEnricher;
public class HostIpTestEnricher implements TestEnricher {
@Inject
Instance<HostIpContext> hostUriContext;
@Override
public void enrich(Object testCase) {
if (hostUriContext.get() != null) {
List<Field> fieldsWithAnnotation = ReflectionUtil.getFieldsWithAnnotation(testCase.getClass(), HostIp.class);
for (Field dockerHostIpField : fieldsWithAnnotation) {
if (!dockerHostIpField.isAccessible()) {
dockerHostIpField.setAccessible(true);
}
if (String.class.isAssignableFrom(dockerHostIpField.getType())) {
try {
dockerHostIpField.set(testCase, hostUriContext.get().getHost());
} catch (IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
}
}
}
}
@Override
public Object[] resolve(Method method) {
Object[] values = new Object[method.getParameterTypes().length];
if (hostUriContext.get() != null) {
Integer[] annotatedParameters = annotatedParameters(method);
Class<?>[] parameterTypes = method.getParameterTypes();
for (Integer i : annotatedParameters) {
if (String.class.isAssignableFrom(parameterTypes[i])) {
values[i] = hostUriContext.get().getHost();
}
}
}
return values;
}
private Integer[] annotatedParameters(Method method) {
List<Integer> parametersWithAnnotations = new ArrayList<>();
final Annotation[][] paramAnnotations = method.getParameterAnnotations();
for (int i = 0; i < paramAnnotations.length; i++) {
for (Annotation a : paramAnnotations[i]) {
if (a instanceof HostIp) {
parametersWithAnnotations.add(i);
}
}
}
return parametersWithAnnotations.toArray(new Integer[parametersWithAnnotations.size()]);
}
}