package cucumber.runtime.java.openejb;
import cucumber.runtime.CucumberException;
import cucumber.api.java.ObjectFactory;
import org.apache.openejb.OpenEjbContainer;
import javax.ejb.embeddable.EJBContainer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class OpenEJBObjectFactory implements ObjectFactory {
private final List<String> classes = new ArrayList<String>();
private final Map<Class<?>, Object> instances = new HashMap<Class<?>, Object>();
private EJBContainer container;
@Override
public void start() {
final StringBuilder callers = new StringBuilder();
for (Iterator<String> it = classes.iterator(); it.hasNext(); ) {
callers.append(it.next());
if (it.hasNext()) {
callers.append(",");
}
}
Properties properties = new Properties();
properties.setProperty(OpenEjbContainer.Provider.OPENEJB_ADDITIONNAL_CALLERS_KEY, callers.toString());
container = EJBContainer.createEJBContainer(properties);
}
@Override
public void stop() {
container.close();
instances.clear();
}
@Override
public boolean addClass(Class<?> clazz) {
classes.add(clazz.getName());
return true;
}
@Override
public <T> T getInstance(Class<T> type) {
if (instances.containsKey(type)) {
return type.cast(instances.get(type));
}
T object;
try {
object = type.newInstance();
container.getContext().bind("inject", object);
} catch (Exception e) {
throw new CucumberException("can't create " + type.getName(), e);
}
instances.put(type, object);
return object;
}
}