package org.arquillian.cube.docker.impl.client.metadata; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; import org.arquillian.cube.impl.util.IOUtil; import org.arquillian.cube.spi.metadata.CanCopyFromContainer; public class CopyFromContainer implements CanCopyFromContainer { private String cubeId; private DockerClientExecutor executor; public CopyFromContainer(String cubeId, DockerClientExecutor executor) { this.cubeId = cubeId; this.executor = executor; } @Override public void copyDirectory(String from, String to) { InputStream response = executor.getFileOrDirectoryFromContainerAsTar(cubeId, from); Path toPath = Paths.get(to); File toPathFile = toPath.toFile(); if (toPathFile.exists() && toPathFile.isFile()) { throw new IllegalArgumentException(String.format( "%s parameter should be a directory in copy operation but you set an already existing file not a directory. Check %s in your local directory because currently is a file.", "to", toPath.normalize().toString())); } try { Files.createDirectories(toPath); IOUtil.untar(response, toPathFile); } catch (IOException e) { throw new IllegalStateException(e); } } @Override public void copyLog(boolean follow, boolean stdout, boolean stderr, boolean timestamps, int tail, OutputStream outputStream) { try { executor.copyLog(cubeId, follow, stdout, stderr, timestamps, tail, outputStream); } catch (IOException e) { throw new IllegalStateException(e); } } }