Skip to content

Commit 62a608d

Browse files
committed
Merge pull request #131 from magnayn/pr3
Utility classes and streamed JSON representations
2 parents f897dd0 + b4d30f6 commit 62a608d

10 files changed

Lines changed: 259 additions & 41 deletions

File tree

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.github.dockerjava.api.command;
22

3+
import com.github.dockerjava.api.model.EventStreamItem;
4+
import com.github.dockerjava.api.model.PushEventStreamItem;
5+
6+
import java.io.IOException;
37
import java.io.InputStream;
48

59
/**
@@ -9,7 +13,7 @@
913
* TODO: http://docs.docker.com/reference/builder/#dockerignore
1014
*
1115
*/
12-
public interface BuildImageCmd extends DockerCmd<InputStream>{
16+
public interface BuildImageCmd extends DockerCmd<BuildImageCmd.Response>{
1317

1418
public BuildImageCmd withTag(String tag);
1519

@@ -37,7 +41,10 @@ public interface BuildImageCmd extends DockerCmd<InputStream>{
3741

3842
public BuildImageCmd withQuiet(boolean quiet);
3943

40-
public static interface Exec extends DockerCmdExec<BuildImageCmd, InputStream> {
44+
public static interface Exec extends DockerCmdExec<BuildImageCmd, BuildImageCmd.Response> {
4145
}
4246

47+
public static abstract class Response extends InputStream {
48+
public abstract Iterable<EventStreamItem> getItems() throws IOException;
49+
}
4350
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.github.dockerjava.api.command;
22

3+
import java.io.IOException;
34
import java.io.InputStream;
45

56
import com.github.dockerjava.api.NotFoundException;
67
import com.github.dockerjava.api.model.AuthConfig;
8+
import com.github.dockerjava.api.model.PushEventStreamItem;
79

810
/**
911
* Push the latest image to the repository.
1012
*
1113
* @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
1214
*/
13-
public interface PushImageCmd extends DockerCmd<InputStream>{
15+
public interface PushImageCmd extends DockerCmd<PushImageCmd.Response>{
1416

1517
public String getName();
1618

@@ -33,10 +35,13 @@ public interface PushImageCmd extends DockerCmd<InputStream>{
3335
/**
3436
* @throws NotFoundException No such image
3537
*/
36-
@Override
37-
public InputStream exec() throws NotFoundException;
38+
public Response exec() throws NotFoundException;
3839

39-
public static interface Exec extends DockerCmdExec<PushImageCmd, InputStream> {
40+
public static interface Exec extends DockerCmdExec<PushImageCmd, Response> {
41+
}
42+
43+
public static abstract class Response extends InputStream {
44+
public abstract Iterable<PushEventStreamItem> getItems() throws IOException;
4045
}
4146

4247
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.github.dockerjava.api.model;
2+
3+
4+
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
8+
import java.io.Serializable;
9+
10+
import jersey.repackaged.com.google.common.base.Objects;
11+
12+
/**
13+
* Represents an event stream
14+
*/
15+
@JsonIgnoreProperties(ignoreUnknown=true)
16+
public class EventStreamItem implements Serializable {
17+
18+
@JsonProperty("stream")
19+
private String stream;
20+
21+
// {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}}
22+
@JsonProperty("error")
23+
private String error;
24+
25+
@JsonProperty("errorDetail")
26+
private ErrorDetail errorDetail;
27+
28+
public String getStream() {
29+
return stream;
30+
}
31+
32+
public String getError() {
33+
return error;
34+
}
35+
36+
public ErrorDetail getErrorDetail() {
37+
return errorDetail;
38+
}
39+
40+
@JsonIgnoreProperties(ignoreUnknown=true)
41+
public static class ErrorDetail implements Serializable {
42+
@JsonProperty("code")
43+
String code;
44+
@JsonProperty("message")
45+
String message;
46+
47+
@Override
48+
public String toString() {
49+
return Objects.toStringHelper(this)
50+
.add("code", code)
51+
.add("message", message)
52+
.toString();
53+
}
54+
}
55+
56+
@Override
57+
public String toString() {
58+
return Objects.toStringHelper(this)
59+
.add("stream", stream)
60+
.add("error", error)
61+
.add("errorDetail", errorDetail)
62+
.toString();
63+
}
64+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
6+
import java.io.Serializable;
7+
8+
import jersey.repackaged.com.google.common.base.Objects;
9+
10+
/**
11+
* Represents an item returned from push
12+
*/
13+
@JsonIgnoreProperties(ignoreUnknown=true)
14+
public class PushEventStreamItem implements Serializable {
15+
16+
@JsonProperty("status")
17+
private String status;
18+
19+
@JsonProperty("progress")
20+
private String progress;
21+
22+
@JsonProperty("progressDetail")
23+
private ProgressDetail progressDetail;
24+
25+
26+
public String getStatus() {
27+
return status;
28+
}
29+
30+
public String getProgress() {
31+
return progress;
32+
}
33+
34+
public ProgressDetail getProgressDetail() {
35+
return progressDetail;
36+
}
37+
38+
@JsonIgnoreProperties(ignoreUnknown=true)
39+
public static class ProgressDetail implements Serializable {
40+
@JsonProperty("current")
41+
int current;
42+
43+
44+
@Override
45+
public String toString() {
46+
return "current " + current;
47+
}
48+
}
49+
50+
@Override
51+
public String toString() {
52+
return Objects.toStringHelper(this)
53+
.add("status", status)
54+
.add("progress", progress)
55+
.add("progressDetail", progressDetail)
56+
.toString();
57+
}
58+
}

src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
* Build an image from Dockerfile.
3333
*
3434
*/
35-
public class BuildImageCmdImpl extends
36-
AbstrDockerCmd<BuildImageCmd, InputStream> implements BuildImageCmd {
35+
public class BuildImageCmdImpl extends AbstrDockerCmd<BuildImageCmd, BuildImageCmd.Response> implements BuildImageCmd {
3736

3837
private static final Pattern ADD_OR_COPY_PATTERN = Pattern
3938
.compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$");

src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull;
44

5-
import java.io.InputStream;
6-
75
import com.github.dockerjava.api.NotFoundException;
86
import com.github.dockerjava.api.command.PushImageCmd;
97

@@ -12,7 +10,7 @@
1210
*
1311
* @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
1412
*/
15-
public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd<PushImageCmd, InputStream> implements PushImageCmd {
13+
public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd<PushImageCmd, PushImageCmd.Response> implements PushImageCmd {
1614

1715
private String name;
1816
private String tag;
@@ -63,7 +61,7 @@ public String toString() {
6361
* @throws NotFoundException No such image
6462
*/
6563
@Override
66-
public InputStream exec() throws NotFoundException {
64+
public Response exec() throws NotFoundException {
6765
return super.exec();
6866
}
6967
}

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

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.github.dockerjava.jaxrs;
22

3+
4+
35
import static javax.ws.rs.client.Entity.entity;
46

7+
import java.io.IOException;
58
import java.io.InputStream;
9+
import java.util.Iterator;
610

711
import javax.ws.rs.client.WebTarget;
812
import javax.ws.rs.core.MediaType;
@@ -13,9 +17,16 @@
1317
import org.slf4j.Logger;
1418
import org.slf4j.LoggerFactory;
1519

20+
import com.fasterxml.jackson.databind.ObjectMapper;
21+
import com.fasterxml.jackson.databind.ObjectReader;
1622
import com.github.dockerjava.api.command.BuildImageCmd;
23+
import com.github.dockerjava.api.command.PushImageCmd;
24+
import com.github.dockerjava.api.model.EventStreamItem;
25+
import com.github.dockerjava.api.model.PushEventStreamItem;
26+
27+
import jersey.repackaged.com.google.common.collect.ImmutableList;
1728

18-
public class BuildImageCmdExec extends AbstrDockerCmdExec<BuildImageCmd, InputStream> implements BuildImageCmd.Exec {
29+
public class BuildImageCmdExec extends AbstrDockerCmdExec<BuildImageCmd, BuildImageCmd.Response> implements BuildImageCmd.Exec {
1930

2031
private static final Logger LOGGER = LoggerFactory
2132
.getLogger(BuildImageCmdExec.class);
@@ -25,7 +36,7 @@ public BuildImageCmdExec(WebTarget baseResource) {
2536
}
2637

2738
@Override
28-
protected InputStream execute(BuildImageCmd command) {
39+
protected ResponseImpl execute(BuildImageCmd command) {
2940
WebTarget webResource = getBaseResource().path("/build");
3041

3142
if(command.getTag() != null) {
@@ -45,12 +56,38 @@ protected InputStream execute(BuildImageCmd command) {
4556
webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED);
4657
webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024*1024);
4758

48-
LOGGER.debug("POST: {}", webResource);
49-
return webResource
50-
.request()
51-
.accept(MediaType.TEXT_PLAIN)
52-
.post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class);
59+
60+
LOGGER.debug("POST: {}", webResource);
61+
InputStream is = webResource
62+
.request()
63+
.accept(MediaType.TEXT_PLAIN)
64+
.post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class);
65+
66+
return new ResponseImpl(is);
5367

5468
}
69+
public static class ResponseImpl extends BuildImageCmd.Response {
70+
71+
private final InputStream proxy;
72+
73+
public ResponseImpl(InputStream proxy) {
74+
this.proxy = proxy;
75+
}
76+
77+
@Override
78+
public Iterable<EventStreamItem> getItems() throws IOException {
79+
ObjectMapper mapper = new ObjectMapper();
80+
// we'll be reading instances of MyBean
81+
ObjectReader reader = mapper.reader(EventStreamItem.class);
82+
// and then do other configuration, if any, and read:
83+
Iterator<EventStreamItem> items = reader.readValues(proxy);
84+
85+
return ImmutableList.copyOf(items);
86+
}
5587

88+
@Override
89+
public int read() throws IOException {
90+
return proxy.read();
91+
}
92+
}
5693
}

0 commit comments

Comments
 (0)