package com.lordofthejars.nosqlunit.core;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
import com.lordofthejars.nosqlunit.annotation.ByContainer;
import com.lordofthejars.nosqlunit.annotation.ConnectionManager;
public class InjectAnnotationProcessor {
private String identifier;
public InjectAnnotationProcessor(String identifier) {
this.identifier = identifier;
}
void processInjectAnnotation(Class<?> clazz, Object testInstance,
Object injectionObject) {
if (isTargetSet(testInstance)) {
Set<Field> fields = new HashSet<Field>();
fields.addAll(IOUtils.getFieldsWithAnnotation(clazz, Inject.class));
fields.addAll(IOUtils.getFieldsWithAnnotation(clazz, ConnectionManager.class));
fields.addAll(IOUtils.getFieldsWithAnnotation(clazz, ByContainer.class));
for (Field field : fields) {
Annotation injectAnnotation = field.getAnnotation(Inject.class);
Annotation connectionManagerAnnotation = field.getAnnotation(ConnectionManager.class);
Annotation byContainerAnnotation = field.getAnnotation(ByContainer.class);
if (isInjectedAndNotExternallyManaged(injectAnnotation, byContainerAnnotation, connectionManagerAnnotation)) {
Annotation namedAnnotation = field
.getAnnotation(Named.class);
if (isNamedAnnotationNotPresent(namedAnnotation)
|| isIdentifierValueInNamedAnnotation(namedAnnotation)) {
if (field.getType().isInstance(injectionObject)) {
new FieldSetter(testInstance, field)
.set(injectionObject);
}
}
}
}
}
}
private boolean isInjectedAndNotExternallyManaged(
Annotation injectAnnotation, Annotation byContainerAnnotation,
Annotation connectionManagerAnnotation) {
return (injectAnnotation != null && byContainerAnnotation == null)
|| connectionManagerAnnotation != null;
}
private boolean isIdentifierValueInNamedAnnotation(
Annotation namedAnnotation) {
String namedValue = ((Named) namedAnnotation).value();
return "".equals(namedValue) || namedValue.equals(identifier);
}
private boolean isNamedAnnotationNotPresent(Annotation namedAnnotation) {
return namedAnnotation == null;
}
private boolean isTargetSet(Object testInstance) {
return testInstance != null;
}
}