Coverage Report - org.jbehave.core.steps.needle.configuration.JBehaveNeedleConfiguration
 
Classes in this File Line Coverage Branch Coverage Complexity
JBehaveNeedleConfiguration
38%
10/26
12%
1/8
2.2
 
 1  
 package org.jbehave.core.steps.needle.configuration;
 2  
 
 3  
 import java.util.HashSet;
 4  
 import java.util.ResourceBundle;
 5  
 import java.util.Set;
 6  
 
 7  
 import de.akquinet.jbosscc.needle.injection.InjectionProvider;
 8  
 import de.holisticon.toolbox.needle.provider.InjectionProviderInstancesSupplier;
 9  
 
 10  
 /**
 11  
  * Reads jbehave-needle.properties to initialize additional {@link InjectionProvider}s.
 12  
  * 
 13  
  * @author Jan Galinski, Holisticon AG (jan.galinski@holisticon.de)
 14  
  * @author Simon Zambrovski, Holisticon AG (simon.zambrovski@holisticon.de)
 15  
  */
 16  
 public class JBehaveNeedleConfiguration {
 17  
         /**
 18  
          * Default properties field name.
 19  
          */
 20  
         public static final String RESOURCE_JBEHAVE_NEEDLE = "jbehave-needle";
 21  
 
 22  9
         private final LoadResourceBundle loadResourceBundle = LoadResourceBundle.INSTANCE;
 23  9
         private final ReadInjectionProviderClassNames readInjectionProviderClassNames = ReadInjectionProviderClassNames.INSTANCE;
 24  9
         private final CreateInstanceByDefaultConstructor createInstance = CreateInstanceByDefaultConstructor.INSTANCE;
 25  
 
 26  9
         private final Set<InjectionProvider<?>> injectionProviders = new HashSet<InjectionProvider<?>>();
 27  
 
 28  
         /**
 29  
          * Creates new instance from default resource {@link #RESOURCE_JBEHAVE_NEEDLE}.
 30  
          */
 31  
         public JBehaveNeedleConfiguration() {
 32  0
                 this(RESOURCE_JBEHAVE_NEEDLE);
 33  0
         }
 34  
 
 35  9
         public JBehaveNeedleConfiguration(final String resourceName) {
 36  9
                 final ResourceBundle resourceBundle = loadResourceBundle.apply(resourceName);
 37  9
                 final Set<String> classNames = readInjectionProviderClassNames.apply(resourceBundle);
 38  
 
 39  9
                 for (final String className : classNames) {
 40  
                         try {
 41  0
                                 final Class<?> clazz = Class.forName(className);
 42  0
                                 if (isInjectionProvider(clazz)) {
 43  0
                                         injectionProviders.add((InjectionProvider<?>) createInstance.apply(clazz));
 44  0
                                 } else if (isInjectionProviderInstanceSupplier(clazz)) {
 45  0
                                         final InjectionProviderInstancesSupplier supplier = (InjectionProviderInstancesSupplier) createInstance
 46  
                                                         .apply(clazz);
 47  0
                                         final Set<InjectionProvider<?>> providers = supplier.get();
 48  0
                                         if (providers != null) {
 49  0
                                                 injectionProviders.addAll(providers);
 50  
                                         }
 51  
                                 }
 52  0
                         } catch (final Exception e) {
 53  0
                                 throw new IllegalStateException("failed to initialize custom injection providers", e);
 54  0
                         }
 55  0
                 }
 56  9
         }
 57  
 
 58  
         public InjectionProvider<?>[] getInjectionProviders() {
 59  9
                 return injectionProviders.toArray(new InjectionProvider<?>[injectionProviders.size()]);
 60  
         }
 61  
 
 62  
         /**
 63  
          * Checks if given class is an {@link InjectionProvider}
 64  
          * 
 65  
          * @param type
 66  
          *            Class to check
 67  
          * @return <code>true</code> if type can be cast to {@link InjectionProvider}
 68  
          */
 69  
         static boolean isInjectionProvider(final Class<?> type) {
 70  0
                 return InjectionProvider.class.isAssignableFrom(type);
 71  
         }
 72  
 
 73  
         /**
 74  
          * Checks if given class is an {@link InjectionProviderInstancesSupplier}
 75  
          * 
 76  
          * @param type
 77  
          *            Class to check
 78  
          * @return <code>true</code> if type can be cast to {@link InjectionProviderInstancesSupplier}
 79  
          */
 80  
         static boolean isInjectionProviderInstanceSupplier(final Class<?> type) {
 81  0
                 return InjectionProviderInstancesSupplier.class.isAssignableFrom(type);
 82  
         }
 83  
 }