Skip to content

Commit fdb9e77

Browse files
author
Marcus Linke
committed
Fix issue #205
1 parent f148c20 commit fdb9e77

File tree

10 files changed

+235
-73
lines changed

10 files changed

+235
-73
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public class InspectContainerResponse {
7777
private VolumeBinds volumes;
7878

7979
@JsonProperty("VolumesRW")
80-
private Volumes volumesRW;
80+
private VolumesRW volumesRW;
8181

8282
public String getId() {
8383
return id;
@@ -125,8 +125,8 @@ public VolumeBind[] getVolumes() {
125125
}
126126

127127
@JsonIgnore
128-
public Volume[] getVolumesRW() {
129-
return volumesRW.getVolumes();
128+
public VolumeRW[] getVolumesRW() {
129+
return volumesRW.getVolumesRW();
130130
}
131131

132132
public String getHostnamePath() {

src/main/java/com/github/dockerjava/api/model/AccessMode.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ public enum AccessMode {
1515
* The default {@link AccessMode}: {@link #rw}
1616
*/
1717
public static final AccessMode DEFAULT = rw;
18+
19+
public static final AccessMode fromBoolean(boolean accessMode) {
20+
return accessMode ? rw : ro;
21+
}
22+
23+
public final boolean toBoolean() {
24+
return this.equals(AccessMode.rw) ? true: false;
25+
}
1826

1927

2028
}

src/main/java/com/github/dockerjava/api/model/Bind.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ public static Bind parse(String serialized) {
5353
String[] parts = serialized.split(":");
5454
switch (parts.length) {
5555
case 2: {
56-
return new Bind(parts[0], Volume.parse(parts[1]));
56+
return new Bind(parts[0], new Volume(parts[1]));
5757
}
5858
case 3: {
5959
AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase());
60-
return new Bind(parts[0], Volume.parse(parts[1]), accessMode);
60+
return new Bind(parts[0], new Volume(parts[1]), accessMode);
6161
}
6262
default: {
6363
throw new IllegalArgumentException();
@@ -96,7 +96,7 @@ public int hashCode() {
9696
*/
9797
@Override
9898
public String toString() {
99-
return path + ":" + volume.toString() + ":" + accessMode.toString();
99+
return path + ":" + volume.getPath() + ":" + accessMode.toString();
100100
}
101101

102102
}

src/main/java/com/github/dockerjava/api/model/Volume.java

Lines changed: 2 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -24,42 +24,18 @@
2424
*
2525
* @see Bind
2626
*/
27-
@JsonDeserialize(using = Volume.Deserializer.class)
28-
@JsonSerialize(using = Volume.Serializer.class)
2927
public class Volume {
3028

3129
private String path;
3230

33-
private AccessMode accessMode = AccessMode.rw;
34-
3531
public Volume(String path) {
3632
this.path = path;
3733
}
38-
39-
public Volume(String path, AccessMode accessMode) {
40-
this.path = path;
41-
this.accessMode = accessMode;
42-
}
4334

4435
public String getPath() {
4536
return path;
4637
}
47-
48-
public AccessMode getAccessMode() {
49-
return accessMode;
50-
}
5138

52-
public static Volume parse(String serialized) {
53-
return new Volume(serialized);
54-
}
55-
56-
/**
57-
* Returns a string representation of this {@link Volume} suitable
58-
* for inclusion in a JSON message.
59-
* The returned String is simply the container path, {@link #getPath()}.
60-
*
61-
* @return a string representation of this {@link Volume}
62-
*/
6339
@Override
6440
public String toString() {
6541
return getPath();
@@ -69,48 +45,14 @@ public String toString() {
6945
public boolean equals(Object obj) {
7046
if (obj instanceof Volume) {
7147
Volume other = (Volume) obj;
72-
return new EqualsBuilder().append(path, other.getPath()).append(accessMode, other.getAccessMode())
73-
.isEquals();
48+
return new EqualsBuilder().append(path, other.getPath()).isEquals();
7449
} else
7550
return super.equals(obj);
7651
}
7752

7853
@Override
7954
public int hashCode() {
80-
return new HashCodeBuilder().append(path).append(accessMode).toHashCode();
55+
return new HashCodeBuilder().append(path).toHashCode();
8156
}
82-
83-
public static class Serializer extends JsonSerializer<Volume> {
84-
85-
@Override
86-
public void serialize(Volume volume, JsonGenerator jsonGen,
87-
SerializerProvider serProvider) throws IOException,
88-
JsonProcessingException {
89-
90-
jsonGen.writeStartObject();
91-
jsonGen.writeFieldName(volume.getPath());
92-
jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
93-
jsonGen.writeEndObject();
94-
}
95-
96-
}
97-
98-
public static class Deserializer extends JsonDeserializer<Volume> {
99-
@Override
100-
public Volume deserialize(JsonParser jsonParser,
101-
DeserializationContext deserializationContext)
102-
throws IOException, JsonProcessingException {
103-
ObjectCodec oc = jsonParser.getCodec();
104-
JsonNode node = oc.readTree(jsonParser);
105-
if (!node.equals(NullNode.getInstance())) {
106-
Entry<String, JsonNode> field = node.fields().next();
107-
return Volume.parse(field.getKey());
108-
} else {
109-
return null;
110-
}
111-
}
112-
}
113-
114-
11557

11658
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import java.io.IOException;
4+
import java.util.Map.Entry;
5+
6+
import org.apache.commons.lang.builder.EqualsBuilder;
7+
import org.apache.commons.lang.builder.HashCodeBuilder;
8+
9+
import com.fasterxml.jackson.core.JsonGenerator;
10+
import com.fasterxml.jackson.core.JsonParser;
11+
import com.fasterxml.jackson.core.JsonProcessingException;
12+
import com.fasterxml.jackson.core.ObjectCodec;
13+
import com.fasterxml.jackson.databind.DeserializationContext;
14+
import com.fasterxml.jackson.databind.JsonDeserializer;
15+
import com.fasterxml.jackson.databind.JsonNode;
16+
import com.fasterxml.jackson.databind.JsonSerializer;
17+
import com.fasterxml.jackson.databind.SerializerProvider;
18+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
19+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
20+
import com.fasterxml.jackson.databind.node.NullNode;
21+
22+
/**
23+
* Represents a bind mounted volume in a Docker container.
24+
*
25+
* @see Bind
26+
*/
27+
@JsonDeserialize(using = VolumeRW.Deserializer.class)
28+
@JsonSerialize(using = VolumeRW.Serializer.class)
29+
public class VolumeRW {
30+
31+
private Volume volume;
32+
33+
private AccessMode accessMode = AccessMode.rw;
34+
35+
public VolumeRW(Volume volume) {
36+
this.volume = volume;
37+
}
38+
39+
public VolumeRW(Volume volume, AccessMode accessMode) {
40+
this.volume = volume;
41+
this.accessMode = accessMode;
42+
}
43+
44+
public Volume getVolume() {
45+
return volume;
46+
}
47+
48+
public AccessMode getAccessMode() {
49+
return accessMode;
50+
}
51+
52+
53+
/**
54+
* Returns a string representation of this {@link VolumeRW} suitable
55+
* for inclusion in a JSON message.
56+
* The returned String is simply the container path, {@link #getPath()}.
57+
*
58+
* @return a string representation of this {@link VolumeRW}
59+
*/
60+
@Override
61+
public String toString() {
62+
return getVolume() + ":" + getAccessMode();
63+
}
64+
65+
@Override
66+
public boolean equals(Object obj) {
67+
if (obj instanceof VolumeRW) {
68+
VolumeRW other = (VolumeRW) obj;
69+
return new EqualsBuilder().append(getVolume(), other.getVolume()).append(accessMode, other.getAccessMode())
70+
.isEquals();
71+
} else
72+
return super.equals(obj);
73+
}
74+
75+
@Override
76+
public int hashCode() {
77+
return new HashCodeBuilder().append(getVolume()).append(getAccessMode()).toHashCode();
78+
}
79+
80+
public static class Serializer extends JsonSerializer<VolumeRW> {
81+
82+
@Override
83+
public void serialize(VolumeRW volumeRW, JsonGenerator jsonGen,
84+
SerializerProvider serProvider) throws IOException,
85+
JsonProcessingException {
86+
87+
jsonGen.writeStartObject();
88+
jsonGen.writeFieldName(volumeRW.getVolume().getPath());
89+
jsonGen.writeString(Boolean.toString(volumeRW.getAccessMode().toBoolean()));
90+
jsonGen.writeEndObject();
91+
}
92+
93+
}
94+
95+
public static class Deserializer extends JsonDeserializer<VolumeRW> {
96+
@Override
97+
public VolumeRW deserialize(JsonParser jsonParser,
98+
DeserializationContext deserializationContext)
99+
throws IOException, JsonProcessingException {
100+
ObjectCodec oc = jsonParser.getCodec();
101+
JsonNode node = oc.readTree(jsonParser);
102+
if (!node.equals(NullNode.getInstance())) {
103+
Entry<String, JsonNode> field = node.fields().next();
104+
String volume = field.getKey();
105+
AccessMode accessMode = AccessMode.fromBoolean(field.getValue().asBoolean());
106+
return new VolumeRW(new Volume(volume), accessMode);
107+
} else {
108+
return null;
109+
}
110+
}
111+
}
112+
113+
114+
115+
}

src/main/java/com/github/dockerjava/api/model/Volumes.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public void serialize(Volumes volumes, JsonGenerator jsonGen,
4848
jsonGen.writeStartObject();
4949
for (Volume volume : volumes.getVolumes()) {
5050
jsonGen.writeFieldName(volume.getPath());
51-
jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
51+
jsonGen.writeStartObject();
52+
jsonGen.writeEndObject();
53+
//jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
5254
}
5355
jsonGen.writeEndObject();
5456
}
@@ -66,7 +68,8 @@ public Volumes deserialize(JsonParser jsonParser, DeserializationContext deseria
6668

6769
Map.Entry<String, JsonNode> field = it.next();
6870
if (!field.getValue().equals(NullNode.getInstance())) {
69-
Volume volume = Volume.parse(field.getKey());
71+
String path = field.getKey();
72+
Volume volume = new Volume(path);
7073
volumes.add(volume);
7174
}
7275
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Iterator;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import com.fasterxml.jackson.core.JsonParser;
10+
import com.fasterxml.jackson.core.JsonProcessingException;
11+
import com.fasterxml.jackson.core.ObjectCodec;
12+
import com.fasterxml.jackson.databind.DeserializationContext;
13+
import com.fasterxml.jackson.databind.JsonDeserializer;
14+
import com.fasterxml.jackson.databind.JsonNode;
15+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
16+
import com.fasterxml.jackson.databind.node.NullNode;
17+
18+
// This is not going to be serialized
19+
@JsonDeserialize(using = VolumesRW.Deserializer.class)
20+
public class VolumesRW {
21+
private final VolumeRW[] volumesRW;
22+
23+
public VolumesRW(VolumeRW... binds) {
24+
this.volumesRW = binds;
25+
}
26+
27+
public VolumeRW[] getVolumesRW() {
28+
return volumesRW;
29+
}
30+
31+
public static final class Deserializer extends JsonDeserializer<VolumesRW> {
32+
@Override
33+
public VolumesRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
34+
35+
List<VolumeRW> volumesRW = new ArrayList<VolumeRW>();
36+
ObjectCodec oc = jsonParser.getCodec();
37+
JsonNode node = oc.readTree(jsonParser);
38+
39+
40+
for (Iterator<Map.Entry<String, JsonNode>> it = node.fields(); it.hasNext();) {
41+
Map.Entry<String, JsonNode> field = it.next();
42+
JsonNode value = field.getValue();
43+
44+
if (!value.equals(NullNode.getInstance())) {
45+
if (!value.isBoolean()){
46+
throw deserializationContext.mappingException("Expected access mode for '"+field.getKey()+"' in host but got '"+ value+"'.");
47+
}
48+
49+
VolumeRW bind = new VolumeRW(new Volume(field.getKey()), AccessMode.fromBoolean(value.asBoolean()));
50+
volumesRW.add(bind);
51+
}
52+
}
53+
return new VolumesRW(volumesRW.toArray(new VolumeRW[volumesRW.size()]));
54+
}
55+
}
56+
57+
}

src/test/java/com/github/dockerjava/api/model/VolumeTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
public class VolumeTest {
88
@Test
9-
public void stringify() {
10-
assertEquals(Volume.parse("/path").toString(), "/path");
9+
public void getPath() {
10+
assertEquals(new Volume("/path").getPath(), "/path");
1111
}
1212
}

0 commit comments

Comments
 (0)