package org.arquillian.cube.impl.client.container.remote;
import java.io.OutputStream;
import java.util.List;
import org.arquillian.cube.ChangeLog;
import org.arquillian.cube.CubeController;
import org.arquillian.cube.CubeID;
import org.arquillian.cube.TopContainer;
import org.arquillian.cube.impl.client.container.remote.command.ChangesOnFilesystemCommand;
import org.arquillian.cube.impl.client.container.remote.command.CopyFileDirectoryCommand;
import org.arquillian.cube.impl.client.container.remote.command.CreateCubeCommand;
import org.arquillian.cube.impl.client.container.remote.command.DestroyCubeCommand;
import org.arquillian.cube.impl.client.container.remote.command.StartCubeCommand;
import org.arquillian.cube.impl.client.container.remote.command.StopCubeCommand;
import org.arquillian.cube.impl.client.container.remote.command.TopCommand;
import org.jboss.arquillian.container.test.spi.command.CommandService;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.spi.ServiceLoader;
public class ContainerCubeController implements CubeController {
@Inject
private Instance<ServiceLoader> serviceLoader;
@Override
public void create(CubeID cubeId) {
this.create(cubeId.get());
}
@Override
public void start(CubeID cubeId) {
this.start(cubeId.get());
}
@Override
public void stop(CubeID cubeId) {
this.stop(cubeId.get());
}
@Override
public void destroy(CubeID cubeId) {
this.destroy(cubeId.get());
}
@Override
public void create(String cubeId) {
getCommandService().execute(new CreateCubeCommand(cubeId));
}
@Override
public void start(String cubeId) {
getCommandService().execute(new StartCubeCommand(cubeId));
}
@Override
public void stop(String cubeId) {
getCommandService().execute(new StopCubeCommand(cubeId));
}
@Override
public void destroy(String cubeId) {
getCommandService().execute(new DestroyCubeCommand(cubeId));
}
@Override
public void copyFileDirectoryFromContainer(String cubeId, String from,
String to) {
getCommandService().execute(new CopyFileDirectoryCommand(cubeId, from, to));
}
@Override
public void copyFileDirectoryFromContainer(CubeID cubeId, String from,
String to) {
copyFileDirectoryFromContainer(cubeId.get(), from, to);
}
@Override
public List<ChangeLog> changesOnFilesystem(String cubeId) {
return getCommandService().execute(new ChangesOnFilesystemCommand(cubeId));
}
@Override
public List<ChangeLog> changesOnFilesystem(CubeID cubeId) {
return changesOnFilesystem(cubeId.get());
}
@Override
public void copyLog(String containerId, boolean follow,
boolean stdout, boolean stderr, boolean timestamps, int tail,
OutputStream outputStream) {
throw new UnsupportedOperationException(
"This operation is only supported for tests running in client mode. https://docs.jboss.org/author/display/ARQ/Test+run+modes");
}
@Override
public void copyLog(CubeID containerId, boolean follow,
boolean stdout, boolean stderr, boolean timestamps, int tail,
OutputStream outputStream) {
copyLog(containerId.get(), follow, stdout, stderr, timestamps, tail, outputStream);
}
@Override
public TopContainer top(String cubeId) {
return getCommandService().execute(new TopCommand(cubeId));
}
@Override
public TopContainer top(CubeID cubeId) {
return top(cubeId.get());
}
private CommandService getCommandService() {
ServiceLoader loader = serviceLoader.get();
if (loader == null) {
throw new IllegalStateException("No " + ServiceLoader.class.getName() + " found in context");
}
CommandService service = loader.onlyOne(CommandService.class);
if (service == null) {
throw new IllegalStateException("No " + CommandService.class.getName() + " found in context");
}
return service;
}
}