Skip to content

Commit 6124775

Browse files
committed
Reset CopyFileFromContainerCmd for compatibility purpose
1 parent f44ee8f commit 6124775

12 files changed

Lines changed: 284 additions & 34 deletions

src/main/java/com/github/dockerjava/api/DockerClient.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.github.dockerjava.api.command.CommitCmd;
1212
import com.github.dockerjava.api.command.ContainerDiffCmd;
1313
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
14+
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
15+
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
1416
import com.github.dockerjava.api.command.CreateContainerCmd;
1517
import com.github.dockerjava.api.command.CreateImageCmd;
1618
import com.github.dockerjava.api.command.EventsCmd;
@@ -44,7 +46,6 @@
4446
import com.github.dockerjava.api.exception.DockerException;
4547
import com.github.dockerjava.api.model.AuthConfig;
4648
import com.github.dockerjava.api.model.Identifier;
47-
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
4849

4950
// https://godoc.org/github.com/fsouza/go-dockerclient
5051
public interface DockerClient extends Closeable {
@@ -122,6 +123,8 @@ public interface DockerClient extends Closeable {
122123

123124
public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource);
124125

126+
public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource);
127+
125128
public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource);
126129

127130
public ContainerDiffCmd containerDiffCmd(String containerId);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.github.dockerjava.api.command;
2+
3+
import java.io.InputStream;
4+
5+
import javax.annotation.CheckForNull;
6+
import javax.annotation.Nonnull;
7+
8+
import com.github.dockerjava.api.exception.NotFoundException;
9+
10+
public interface CopyFileFromContainerCmd extends SyncDockerCmd<InputStream> {
11+
12+
@CheckForNull
13+
public String getContainerId();
14+
15+
@CheckForNull
16+
public String getHostPath();
17+
18+
@CheckForNull
19+
public String getResource();
20+
21+
public CopyFileFromContainerCmd withContainerId(@Nonnull String containerId);
22+
23+
public CopyFileFromContainerCmd withHostPath(String hostPath);
24+
25+
public CopyFileFromContainerCmd withResource(@Nonnull String resource);
26+
27+
/**
28+
* Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks.
29+
*
30+
* @throws NotFoundException
31+
* No such container
32+
*/
33+
@Override
34+
public InputStream exec() throws NotFoundException;
35+
36+
public static interface Exec extends DockerCmdSyncExec<CopyFileFromContainerCmd, InputStream> {
37+
}
38+
}

src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public interface DockerCmdExecFactory extends Closeable {
5555

5656
public LogContainerCmd.Exec createLogContainerCmdExec();
5757

58+
public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec();
59+
5860
public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec();
5961

6062
public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec();

src/main/java/com/github/dockerjava/core/DockerClientImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.github.dockerjava.api.command.CommitCmd;
1515
import com.github.dockerjava.api.command.ContainerDiffCmd;
1616
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
17+
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
1718
import com.github.dockerjava.api.command.CreateContainerCmd;
1819
import com.github.dockerjava.api.command.CreateImageCmd;
1920
import com.github.dockerjava.api.command.DockerCmdExecFactory;
@@ -55,6 +56,7 @@
5556
import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl;
5657
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
5758
import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl;
59+
import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl;
5860
import com.github.dockerjava.core.command.CreateContainerCmdImpl;
5961
import com.github.dockerjava.core.command.CreateImageCmdImpl;
6062
import com.github.dockerjava.core.command.EventsCmdImpl;
@@ -299,6 +301,12 @@ public LogContainerCmd logContainerCmd(String containerId) {
299301
return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId);
300302
}
301303

304+
@Override
305+
public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource) {
306+
return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(),
307+
containerId, resource);
308+
}
309+
302310
@Override
303311
public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource) {
304312
return new CopyArchiveFromContainerCmdImpl(getDockerCmdExecFactory().createCopyArchiveFromContainerCmdExec(),
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import static com.google.common.base.Preconditions.checkNotNull;
4+
5+
import java.io.InputStream;
6+
7+
import com.fasterxml.jackson.annotation.JsonProperty;
8+
import com.github.dockerjava.api.exception.NotFoundException;
9+
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
10+
11+
/**
12+
*
13+
* Copy files or folders from a container.
14+
*
15+
*/
16+
public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd<CopyFileFromContainerCmd, InputStream> implements
17+
CopyFileFromContainerCmd {
18+
19+
private String containerId;
20+
21+
@JsonProperty("HostPath")
22+
private String hostPath = ".";
23+
24+
@JsonProperty("Resource")
25+
private String resource;
26+
27+
public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) {
28+
super(exec);
29+
withContainerId(containerId);
30+
withResource(resource);
31+
}
32+
33+
@Override
34+
public String getContainerId() {
35+
return containerId;
36+
}
37+
38+
@Override
39+
public String getResource() {
40+
return resource;
41+
}
42+
43+
@Override
44+
public CopyFileFromContainerCmdImpl withContainerId(String containerId) {
45+
checkNotNull(containerId, "containerId was not specified");
46+
this.containerId = containerId;
47+
return this;
48+
}
49+
50+
@Override
51+
public CopyFileFromContainerCmdImpl withResource(String resource) {
52+
checkNotNull(resource, "resource was not specified");
53+
this.resource = resource;
54+
return this;
55+
}
56+
57+
@Override
58+
public String getHostPath() {
59+
return hostPath;
60+
}
61+
62+
@Override
63+
public CopyFileFromContainerCmdImpl withHostPath(String hostPath) {
64+
checkNotNull(hostPath, "hostPath was not specified");
65+
this.hostPath = hostPath;
66+
return this;
67+
}
68+
69+
/**
70+
* @throws NotFoundException
71+
* No such container
72+
*/
73+
@Override
74+
public InputStream exec() throws NotFoundException {
75+
return super.exec();
76+
}
77+
}

src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
2020
import org.apache.commons.io.FileUtils;
2121

22-
import com.github.dockerjava.core.TarDirWalker;
2322
import com.google.common.io.ByteStreams;
2423

2524
public class CompressArchiveUtil {

src/main/java/com/github/dockerjava/core/TarDirWalker.java renamed to src/main/java/com/github/dockerjava/core/util/TarDirWalker.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package com.github.dockerjava.core;
2-
3-
import static com.github.dockerjava.core.FilePathUtil.relativize;
1+
package com.github.dockerjava.core.util;
42

53
import java.io.IOException;
64
import java.nio.file.FileVisitResult;
@@ -27,14 +25,14 @@ public TarDirWalker(Path basePath, TarArchiveOutputStream tarArchiveOutputStream
2725
@Override
2826
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
2927
if (!dir.equals(basePath)) {
30-
tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(relativize(basePath, dir)));
28+
tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(FilePathUtil.relativize(basePath, dir)));
3129
}
3230
return FileVisitResult.CONTINUE;
3331
}
3432

3533
@Override
3634
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
37-
CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(relativize(basePath, file)), file);
35+
CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(FilePathUtil.relativize(basePath, file)), file);
3836
return FileVisitResult.CONTINUE;
3937
}
4038

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.github.dockerjava.jaxrs;
2+
3+
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
4+
import com.github.dockerjava.core.DockerClientConfig;
5+
import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
import javax.ws.rs.client.WebTarget;
10+
import javax.ws.rs.core.MediaType;
11+
import javax.ws.rs.core.Response;
12+
import java.io.InputStream;
13+
14+
import static javax.ws.rs.client.Entity.entity;
15+
16+
public class CopyFileFromContainerCmdExec extends AbstrSyncDockerCmdExec<CopyFileFromContainerCmd, InputStream>
17+
implements CopyFileFromContainerCmd.Exec {
18+
19+
private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class);
20+
21+
public CopyFileFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
22+
super(baseResource, dockerClientConfig);
23+
}
24+
25+
@Override
26+
protected InputStream execute(CopyFileFromContainerCmd command) {
27+
WebTarget webResource = getBaseResource().path("/containers/{id}/copy").resolveTemplate("id",
28+
command.getContainerId());
29+
30+
LOGGER.trace("POST: " + webResource.toString());
31+
32+
Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE)
33+
.post(entity(command, MediaType.APPLICATION_JSON));
34+
35+
return new WrappedResponseInputStream(response);
36+
}
37+
38+
}

src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,38 @@
11
package com.github.dockerjava.jaxrs;
22

3+
import static com.google.common.base.Preconditions.checkNotNull;
4+
5+
import java.io.IOException;
6+
import java.net.URI;
7+
8+
import javax.net.ssl.SSLContext;
9+
import javax.ws.rs.client.Client;
10+
import javax.ws.rs.client.ClientBuilder;
11+
import javax.ws.rs.client.ClientRequestFilter;
12+
import javax.ws.rs.client.ClientResponseFilter;
13+
import javax.ws.rs.client.WebTarget;
14+
15+
import org.apache.http.config.RegistryBuilder;
16+
import org.apache.http.conn.socket.ConnectionSocketFactory;
17+
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
18+
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
19+
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
20+
import org.glassfish.jersey.CommonProperties;
21+
import org.glassfish.jersey.apache.connector.ApacheClientProperties;
22+
import org.glassfish.jersey.client.ClientConfig;
23+
import org.glassfish.jersey.client.ClientProperties;
24+
import org.slf4j.Logger;
25+
import org.slf4j.LoggerFactory;
26+
327
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
4-
import com.github.dockerjava.api.exception.DockerClientException;
528
import com.github.dockerjava.api.command.AttachContainerCmd;
629
import com.github.dockerjava.api.command.AuthCmd;
730
import com.github.dockerjava.api.command.BuildImageCmd;
831
import com.github.dockerjava.api.command.CommitCmd;
932
import com.github.dockerjava.api.command.ContainerDiffCmd;
1033
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
34+
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
35+
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
1136
import com.github.dockerjava.api.command.CreateContainerCmd;
1237
import com.github.dockerjava.api.command.CreateImageCmd;
1338
import com.github.dockerjava.api.command.DockerCmdExecFactory;
@@ -39,34 +64,12 @@
3964
import com.github.dockerjava.api.command.UnpauseContainerCmd;
4065
import com.github.dockerjava.api.command.VersionCmd;
4166
import com.github.dockerjava.api.command.WaitContainerCmd;
67+
import com.github.dockerjava.api.exception.DockerClientException;
4268
import com.github.dockerjava.core.DockerClientConfig;
43-
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
4469
import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider;
4570
import com.github.dockerjava.jaxrs.filter.JsonClientFilter;
4671
import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter;
4772
import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter;
48-
import org.apache.http.config.RegistryBuilder;
49-
import org.apache.http.conn.socket.ConnectionSocketFactory;
50-
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
51-
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
52-
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
53-
import org.glassfish.jersey.CommonProperties;
54-
import org.glassfish.jersey.apache.connector.ApacheClientProperties;
55-
import org.glassfish.jersey.client.ClientConfig;
56-
import org.glassfish.jersey.client.ClientProperties;
57-
import org.slf4j.Logger;
58-
import org.slf4j.LoggerFactory;
59-
60-
import javax.net.ssl.SSLContext;
61-
import javax.ws.rs.client.Client;
62-
import javax.ws.rs.client.ClientBuilder;
63-
import javax.ws.rs.client.ClientRequestFilter;
64-
import javax.ws.rs.client.ClientResponseFilter;
65-
import javax.ws.rs.client.WebTarget;
66-
import java.io.IOException;
67-
import java.net.URI;
68-
69-
import static com.google.common.base.Preconditions.checkNotNull;
7073

7174
//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
7275
// see https://github.com/docker-java/docker-java/issues/196
@@ -174,7 +177,7 @@ public void init(DockerClientConfig dockerClientConfig) {
174177
}
175178

176179
private org.apache.http.config.Registry<ConnectionSocketFactory> getSchemeRegistry(final URI originalUri,
177-
SSLContext sslContext) {
180+
SSLContext sslContext) {
178181
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
179182
registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
180183
if (sslContext != null) {
@@ -315,6 +318,11 @@ public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec()
315318
return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
316319
}
317320

321+
@Override
322+
public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
323+
return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
324+
}
325+
318326
@Override
319327
public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
320328
return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());

src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import com.github.dockerjava.api.command.CommitCmd;
1313
import com.github.dockerjava.api.command.ContainerDiffCmd;
1414
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
15+
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
16+
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
1517
import com.github.dockerjava.api.command.CreateContainerCmd;
1618
import com.github.dockerjava.api.command.CreateContainerResponse;
1719
import com.github.dockerjava.api.command.CreateImageCmd;
@@ -46,7 +48,6 @@
4648
import com.github.dockerjava.api.command.VersionCmd;
4749
import com.github.dockerjava.api.command.WaitContainerCmd;
4850
import com.github.dockerjava.api.model.BuildResponseItem;
49-
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
5051

5152
/**
5253
* Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution
@@ -237,6 +238,11 @@ public LogContainerCmd.Exec createLogContainerCmdExec() {
237238
return delegate.createLogContainerCmdExec();
238239
}
239240

241+
@Override
242+
public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
243+
return delegate.createCopyFileFromContainerCmdExec();
244+
}
245+
240246
@Override
241247
public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
242248
return delegate.createCopyArchiveFromContainerCmdExec();

0 commit comments

Comments
 (0)