package org.arquillian.cube.docker.impl.client.containerobject;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Logger;
import org.arquillian.cube.ContainerObjectConfiguration;
import org.arquillian.cube.ContainerObjectFactory;
import org.arquillian.cube.CubeController;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.docker.impl.model.DockerCube;
import org.arquillian.cube.spi.CubeRegistry;
import org.jboss.arquillian.core.api.Injector;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.spi.ServiceLoader;
import org.jboss.arquillian.test.spi.TestEnricher;
/**
* An implementation of {@link ContainerObjectFactory} for Docker images.
*
* @author <a href="mailto:rivasdiaz@gmail.com">Ramon Rivas</a>
* @see DockerContainerObjectBuilder
*/
public class DockerContainerObjectFactory implements ContainerObjectFactory {
private static final Logger logger = Logger.getLogger(DockerContainerObjectFactory.class.getName());
@Inject Instance<ServiceLoader> serviceLoaderInstance;
@Inject Instance<DockerClientExecutor> dockerClientExecutorInstance;
@Inject Instance<CubeRegistry> cubeRegistryInstance;
@Inject Instance<CubeController> cubeControllerInstance;
@Inject Instance<Injector> injectorInstance;
@Override
public <T> T createContainerObject(Class<T> containerObjectClass) {
return createContainerObject(containerObjectClass, CubeContainerObjectConfiguration.empty(), null);
}
@Override
public <T> T createContainerObject(Class<T> containerObjectClass, ContainerObjectConfiguration configuration) {
return createContainerObject(containerObjectClass, configuration, null);
}
public <T> T createContainerObject(Class<T> containerObjectClass, ContainerObjectConfiguration configuration,
Object containerObjectContainer) {
if (configuration == null) {
throw new IllegalArgumentException("configuration cannot be null");
}
try {
return new DockerContainerObjectBuilder<T>(dockerClientExecutorInstance.get(), cubeControllerInstance.get(),
cubeRegistryInstance.get())
.withEnrichers(serviceLoaderInstance.get().all(TestEnricher.class))
.withContainerObjectClass(containerObjectClass)
.withContainerObjectConfiguration(configuration)
.withContainerObjectContainer(containerObjectContainer)
.onCubeCreated(this::onCubeCreated)
.build();
} catch (IllegalAccessException | IOException | InvocationTargetException e) {
throw new IllegalArgumentException(e);
}
}
private void onCubeCreated(DockerCube cube) {
injectorInstance.get().inject(cube);
cubeRegistryInstance.get().addCube(cube);
}
}