package cucumber.runtime.java.needle.injection;
import javax.inject.Named;
import de.akquinet.jbosscc.needle.injection.InjectionProvider;
import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation;
/**
* Needle Injection Provider for Instance with {@link Named} Annotation.
*
* @param <T>
* target type.
*/
public class NamedInjectionProvider<T> implements InjectionProvider<T> {
/**
* Value of @Named.
*/
private final String name;
/**
* value to return.
*/
private final T value;
/**
* Factory method for creating the provider.
*
* @param name
* name of interest
* @param value
* value to encapsulate.
* @return provider encapsulating the value.
*/
public static <T> NamedInjectionProvider<T> forNamedValue(final String name, final T value) {
return new NamedInjectionProvider<T>(name, value);
}
/**
* Constructs a provider for given @Named element encapsulating the value.
*
* @param name
* name of the interest.
* @param value
* value to return.
*/
protected NamedInjectionProvider(final String name, final T value) {
this.name = name;
this.value = value;
}
@Override
public T getInjectedObject(final Class<?> type) {
return value;
}
@Override
public Object getKey(final InjectionTargetInformation injectionTargetInformation) {
return name;
}
@Override
public boolean verify(final InjectionTargetInformation injectionTargetInformation) {
return injectionTargetInformation.isAnnotationPresent(Named.class)
&& ((Named) injectionTargetInformation.getAnnotation(Named.class)).value().equals(name)
&& value.getClass().isAssignableFrom(injectionTargetInformation.getType());
}
}