package org.needle4j.junit;
import static org.needle4j.injection.InjectionProviders.providersForInstancesSuppliers;
import static org.needle4j.injection.InjectionProviders.providersToArray;
import static org.needle4j.injection.InjectionProviders.providersToSet;
import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;
import org.needle4j.NeedleTestcase;
import org.needle4j.configuration.NeedleConfiguration;
import org.needle4j.injection.InjectionConfiguration;
import org.needle4j.injection.InjectionProvider;
import org.needle4j.injection.InjectionProviderInstancesSupplier;
import org.needle4j.mock.MockProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
* @param <B>
* type of builder, needed for type-safe "return this"
* @param <R>
* type of rule to build
*/
@SuppressWarnings("unchecked")
public abstract class AbstractNeedleRuleBuilder<B, R extends NeedleTestcase> extends AbstractRuleBuilder<B, R> {
private final Logger logger = LoggerFactory.getLogger(AbstractNeedleRuleBuilder.class);
private Class<? extends MockProvider> mockProviderClass;
private Class<?>[] withAnnotations = {};
private final Set<InjectionProvider<?>> providers = new HashSet<InjectionProvider<?>>();
public B withMockProvider(final Class<? extends MockProvider> mockProviderClass) {
this.mockProviderClass = mockProviderClass;
return (B) this;
}
public B addProvider(final InjectionProvider<?>... injectionProviders) {
providers.addAll(providersToSet(injectionProviders));
return (B) this;
}
public B addAnnotation(final Class<? extends Annotation>... annotations) {
this.withAnnotations = annotations;
return (B) this;
}
public B addSupplier(final InjectionProviderInstancesSupplier... suppliers) {
this.providers.addAll(providersToSet(providersForInstancesSuppliers(suppliers)));
return (B) this;
}
private Set<Class<Annotation>> getCustomInjectionAnnotations() {
final Set<Class<Annotation>> annotations = new HashSet<Class<Annotation>>();
for (final Class<?> annotationClass : withAnnotations) {
if (annotationClass.isAnnotation()) {
annotations.add((Class<Annotation>) annotationClass);
} else {
logger.warn("ignore class {}", annotationClass);
}
}
return annotations;
}
@Override
protected final R build(final NeedleConfiguration needleConfiguration) {
if (this.mockProviderClass != null) {
needleConfiguration.setMockProviderClassName(this.mockProviderClass.getCanonicalName());
}
final InjectionConfiguration injectionConfiguration = new InjectionConfiguration(needleConfiguration);
injectionConfiguration.addGlobalInjectionAnnotation(getCustomInjectionAnnotations());
return build(injectionConfiguration, providersToArray(providers));
}
protected abstract R build(final InjectionConfiguration injectionConfiguration,
final InjectionProvider<?>... injectionProvider);
}