| 1 | |
package org.jbehave.core.steps.guice; |
| 2 | |
|
| 3 | |
import java.lang.reflect.Type; |
| 4 | |
import java.util.ArrayList; |
| 5 | |
import java.util.List; |
| 6 | |
|
| 7 | |
import org.jbehave.core.configuration.Configuration; |
| 8 | |
import org.jbehave.core.steps.AbstractStepsFactory; |
| 9 | |
import org.jbehave.core.steps.InjectableStepsFactory; |
| 10 | |
|
| 11 | |
import com.google.inject.Binding; |
| 12 | |
import com.google.inject.Injector; |
| 13 | |
import com.google.inject.Key; |
| 14 | |
|
| 15 | |
|
| 16 | |
|
| 17 | |
|
| 18 | |
|
| 19 | |
|
| 20 | |
|
| 21 | |
|
| 22 | |
|
| 23 | |
|
| 24 | |
public class GuiceStepsFactory extends AbstractStepsFactory { |
| 25 | |
|
| 26 | |
private final Injector injector; |
| 27 | |
|
| 28 | |
public GuiceStepsFactory(Configuration configuration, Injector injector) { |
| 29 | 6 | super(configuration); |
| 30 | 6 | this.injector = injector; |
| 31 | 6 | } |
| 32 | |
|
| 33 | |
@Override |
| 34 | |
protected List<Class<?>> stepsTypes() { |
| 35 | 6 | List<Class<?>> types = new ArrayList<Class<?>>(); |
| 36 | 6 | addTypes(injector, types); |
| 37 | 6 | return types; |
| 38 | |
} |
| 39 | |
|
| 40 | |
|
| 41 | |
|
| 42 | |
|
| 43 | |
|
| 44 | |
|
| 45 | |
|
| 46 | |
private void addTypes(Injector injector, List<Class<?>> types) { |
| 47 | 66 | for (Binding<?> binding : injector.getBindings().values()) { |
| 48 | 232 | Key<?> key = binding.getKey(); |
| 49 | 232 | Type type = key.getTypeLiteral().getType(); |
| 50 | 232 | if (hasAnnotatedMethods(type)) { |
| 51 | 4 | types.add(((Class<?>)type)); |
| 52 | |
} |
| 53 | 232 | } |
| 54 | 66 | if (injector.getParent() != null) { |
| 55 | 60 | addTypes(injector.getParent(), types); |
| 56 | |
} |
| 57 | 66 | } |
| 58 | |
|
| 59 | |
public Object createInstanceOfType(Class<?> type) { |
| 60 | 5 | List<Object> instances = new ArrayList<Object>(); |
| 61 | 5 | addInstances(injector, type, instances); |
| 62 | 5 | if ( !instances.isEmpty() ){ |
| 63 | 5 | return instances.iterator().next(); |
| 64 | |
} |
| 65 | 0 | return new StepsInstanceNotFound(type, this); |
| 66 | |
} |
| 67 | |
|
| 68 | |
private void addInstances(Injector injector, Class<?> type, List<Object> instances) { |
| 69 | 35 | for (Binding<?> binding : injector.getBindings().values()) { |
| 70 | 130 | Key<?> key = binding.getKey(); |
| 71 | 130 | if (type.equals(key.getTypeLiteral().getType())) { |
| 72 | 5 | instances.add(injector.getInstance(key)); |
| 73 | |
} |
| 74 | 130 | } |
| 75 | 35 | if (injector.getParent() != null) { |
| 76 | 30 | addInstances(injector.getParent(), type, instances); |
| 77 | |
} |
| 78 | 35 | } |
| 79 | |
} |