cucumber.java.runtime.osgi.OsgiObjectFactoryBase Maven / Gradle / Ivy
package cucumber.java.runtime.osgi;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
import cucumber.api.java.ObjectFactory;
import cucumber.runtime.CucumberException;
public abstract class OsgiObjectFactoryBase implements ObjectFactory {
private final Map, Object> instances = new HashMap, Object>();
@Override
public void start() {
// No-op
}
@Override
public void stop() {
instances.clear();
}
@Override
public boolean addClass(Class> glueClass) {
return true;
}
@Override
public T getInstance(Class glueClass) {
T instance = glueClass.cast(instances.get(glueClass));
if (instance == null) {
instance = cacheNewInstance(glueClass);
prepareGlueInstance(instance);
}
return instance;
}
protected abstract void prepareGlueInstance(Object instance);
private T cacheNewInstance(Class type) {
try {
Constructor constructor = type.getConstructor();
T instance = constructor.newInstance();
instances.put(type, instance);
return instance;
} catch (NoSuchMethodException e) {
throw new CucumberException(String.format("%s doesn't have an empty constructor. If you need DI, put cucumber-picocontainer on the classpath", type), e);
} catch (Exception e) {
throw new CucumberException(String.format("Failed to instantiate %s", type), e);
}
}
}