JBehaveNeedleConfiguration.java

  1. package org.jbehave.core.steps.needle.configuration;

  2. import java.util.HashSet;
  3. import java.util.ResourceBundle;
  4. import java.util.Set;

  5. import org.needle4j.injection.InjectionProvider;
  6. import org.needle4j.injection.InjectionProviderInstancesSupplier;

  7. /**
  8.  * Reads jbehave-needle.properties to initialize additional {@link InjectionProvider}s.
  9.  *
  10.  * @author Jan Galinski, Holisticon AG (jan.galinski@holisticon.de)
  11.  * @author Simon Zambrovski, Holisticon AG (simon.zambrovski@holisticon.de)
  12.  */
  13. public class JBehaveNeedleConfiguration {
  14.     /**
  15.      * Default properties field name.
  16.      */
  17.     public static final String RESOURCE_JBEHAVE_NEEDLE = "jbehave-needle";

  18.     private final LoadResourceBundle loadResourceBundle = LoadResourceBundle.INSTANCE;
  19.     private final ReadInjectionProviderClassNames readInjectionProviderClassNames =
  20.             ReadInjectionProviderClassNames.INSTANCE;
  21.     private final CreateInstanceByDefaultConstructor createInstance = CreateInstanceByDefaultConstructor.INSTANCE;

  22.     private final Set<InjectionProvider<?>> injectionProviders = new HashSet<>();

  23.     /**
  24.      * Creates new instance from default resource {@link #RESOURCE_JBEHAVE_NEEDLE}.
  25.      */
  26.     public JBehaveNeedleConfiguration() {
  27.         this(RESOURCE_JBEHAVE_NEEDLE);
  28.     }

  29.     public JBehaveNeedleConfiguration(final String resourceName) {
  30.         final ResourceBundle resourceBundle = loadResourceBundle.apply(resourceName);
  31.         final Set<String> classNames = readInjectionProviderClassNames.apply(resourceBundle);

  32.         for (final String className : classNames) {
  33.             try {
  34.                 final Class<?> clazz = Class.forName(className);
  35.                 if (isInjectionProvider(clazz)) {
  36.                     injectionProviders.add((InjectionProvider<?>) createInstance.apply(clazz));
  37.                 } else if (isInjectionProviderInstanceSupplier(clazz)) {
  38.                     final InjectionProviderInstancesSupplier supplier =
  39.                             (InjectionProviderInstancesSupplier) createInstance.apply(clazz);
  40.                     final Set<InjectionProvider<?>> providers = supplier.get();
  41.                     if (providers != null) {
  42.                         injectionProviders.addAll(providers);
  43.                     }
  44.                 }
  45.             } catch (final Exception e) {
  46.                 throw new IllegalStateException("failed to initialize custom injection providers", e);
  47.             }
  48.         }
  49.     }

  50.     public InjectionProvider<?>[] getInjectionProviders() {
  51.         return injectionProviders.toArray(new InjectionProvider<?>[injectionProviders.size()]);
  52.     }

  53.     /**
  54.      * Checks if given class is an {@link InjectionProvider}
  55.      *
  56.      * @param type
  57.      *            Class to check
  58.      * @return <code>true</code> if type can be cast to {@link InjectionProvider}
  59.      */
  60.     static boolean isInjectionProvider(final Class<?> type) {
  61.         return InjectionProvider.class.isAssignableFrom(type);
  62.     }

  63.     /**
  64.      * Checks if given class is an {@link InjectionProviderInstancesSupplier}
  65.      *
  66.      * @param type
  67.      *            Class to check
  68.      * @return <code>true</code> if type can be cast to {@link InjectionProviderInstancesSupplier}
  69.      */
  70.     static boolean isInjectionProviderInstanceSupplier(final Class<?> type) {
  71.         return InjectionProviderInstancesSupplier.class.isAssignableFrom(type);
  72.     }
  73. }