JBehaveNeedleConfiguration.java
package org.jbehave.core.steps.needle.configuration;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import org.needle4j.injection.InjectionProvider;
import org.needle4j.injection.InjectionProviderInstancesSupplier;
/**
* Reads jbehave-needle.properties to initialize additional {@link InjectionProvider}s.
*
* @author Jan Galinski, Holisticon AG (jan.galinski@holisticon.de)
* @author Simon Zambrovski, Holisticon AG (simon.zambrovski@holisticon.de)
*/
public class JBehaveNeedleConfiguration {
/**
* Default properties field name.
*/
public static final String RESOURCE_JBEHAVE_NEEDLE = "jbehave-needle";
private final LoadResourceBundle loadResourceBundle = LoadResourceBundle.INSTANCE;
private final ReadInjectionProviderClassNames readInjectionProviderClassNames =
ReadInjectionProviderClassNames.INSTANCE;
private final CreateInstanceByDefaultConstructor createInstance = CreateInstanceByDefaultConstructor.INSTANCE;
private final Set<InjectionProvider<?>> injectionProviders = new HashSet<>();
/**
* Creates new instance from default resource {@link #RESOURCE_JBEHAVE_NEEDLE}.
*/
public JBehaveNeedleConfiguration() {
this(RESOURCE_JBEHAVE_NEEDLE);
}
public JBehaveNeedleConfiguration(final String resourceName) {
final ResourceBundle resourceBundle = loadResourceBundle.apply(resourceName);
final Set<String> classNames = readInjectionProviderClassNames.apply(resourceBundle);
for (final String className : classNames) {
try {
final Class<?> clazz = Class.forName(className);
if (isInjectionProvider(clazz)) {
injectionProviders.add((InjectionProvider<?>) createInstance.apply(clazz));
} else if (isInjectionProviderInstanceSupplier(clazz)) {
final InjectionProviderInstancesSupplier supplier =
(InjectionProviderInstancesSupplier) createInstance.apply(clazz);
final Set<InjectionProvider<?>> providers = supplier.get();
if (providers != null) {
injectionProviders.addAll(providers);
}
}
} catch (final Exception e) {
throw new IllegalStateException("failed to initialize custom injection providers", e);
}
}
}
public InjectionProvider<?>[] getInjectionProviders() {
return injectionProviders.toArray(new InjectionProvider<?>[injectionProviders.size()]);
}
/**
* Checks if given class is an {@link InjectionProvider}
*
* @param type
* Class to check
* @return <code>true</code> if type can be cast to {@link InjectionProvider}
*/
static boolean isInjectionProvider(final Class<?> type) {
return InjectionProvider.class.isAssignableFrom(type);
}
/**
* Checks if given class is an {@link InjectionProviderInstancesSupplier}
*
* @param type
* Class to check
* @return <code>true</code> if type can be cast to {@link InjectionProviderInstancesSupplier}
*/
static boolean isInjectionProviderInstanceSupplier(final Class<?> type) {
return InjectionProviderInstancesSupplier.class.isAssignableFrom(type);
}
}