Skip to content

Commit 3dc651e

Browse files
committed
Merge pull request #197 from chenchun/binding
Allow for null bindings
2 parents 2bc290d + 6ab93b4 commit 3dc651e

File tree

3 files changed

+52
-14
lines changed

3 files changed

+52
-14
lines changed

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

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ public void bind(ExposedPort exposedPort, Binding binding) {
7575
Binding[] bindings = ports.get(exposedPort);
7676
ports.put(exposedPort, (Binding[]) ArrayUtils.add(bindings, binding));
7777
} else {
78-
ports.put(exposedPort, new Binding[]{binding});
78+
if (binding == null) {
79+
ports.put(exposedPort, null);
80+
} else {
81+
ports.put(exposedPort, new Binding[]{binding});
82+
}
7983
}
8084
}
8185

@@ -282,12 +286,16 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali
282286

283287
Map.Entry<String, JsonNode> portNode = it.next();
284288
JsonNode bindingsArray = portNode.getValue();
285-
for (int i = 0; i < bindingsArray.size(); i++) {
286-
JsonNode bindingNode = bindingsArray.get(i);
287-
if (!bindingNode.equals(NullNode.getInstance())) {
288-
String hostIp = bindingNode.get("HostIp").textValue();
289-
int hostPort = bindingNode.get("HostPort").asInt();
290-
out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort));
289+
if (bindingsArray.equals(NullNode.getInstance())) {
290+
out.bind(ExposedPort.parse(portNode.getKey()), null);
291+
} else {
292+
for (int i = 0; i < bindingsArray.size(); i++) {
293+
JsonNode bindingNode = bindingsArray.get(i);
294+
if (!bindingNode.equals(NullNode.getInstance())) {
295+
String hostIp = bindingNode.get("HostIp").textValue();
296+
int hostPort = bindingNode.get("HostPort").asInt();
297+
out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort));
298+
}
291299
}
292300
}
293301
}
@@ -304,14 +312,18 @@ public void serialize(Ports portBindings, JsonGenerator jsonGen,
304312
jsonGen.writeStartObject();
305313
for(Entry<ExposedPort, Binding[]> entry : portBindings.getBindings().entrySet()){
306314
jsonGen.writeFieldName(entry.getKey().toString());
307-
jsonGen.writeStartArray();
308-
for (Binding binding : entry.getValue()) {
309-
jsonGen.writeStartObject();
310-
jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp());
311-
jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString());
312-
jsonGen.writeEndObject();
315+
if (entry.getValue() != null) {
316+
jsonGen.writeStartArray();
317+
for (Binding binding : entry.getValue()) {
318+
jsonGen.writeStartObject();
319+
jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp());
320+
jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString());
321+
jsonGen.writeEndObject();
322+
}
323+
jsonGen.writeEndArray();
324+
} else {
325+
jsonGen.writeNull();
313326
}
314-
jsonGen.writeEndArray();
315327
}
316328
jsonGen.writeEndObject();
317329
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class Ports_SerializingTest {
1313
private final ObjectMapper objectMapper = new ObjectMapper();
1414
private final String jsonWithDoubleBindingForOnePort =
1515
"{\"80/tcp\":[{\"HostIp\":\"10.0.0.1\",\"HostPort\":\"80\"},{\"HostIp\":\"10.0.0.2\",\"HostPort\":\"80\"}]}";
16+
private final String jsonWithNullBindingForOnePort = "{\"80/tcp\":null}";
1617

1718
@Test
1819
public void deserializingPortWithMultipleBindings() throws Exception {
@@ -39,4 +40,20 @@ public void serializingEmptyBinding() throws Exception {
3940
Ports ports = new Ports(ExposedPort.tcp(80), new Binding(null, null));
4041
assertEquals(objectMapper.writeValueAsString(ports), "{\"80/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"\"}]}");
4142
}
43+
44+
@Test
45+
public void deserializingPortWithNullBindings() throws Exception {
46+
Ports ports = objectMapper.readValue(jsonWithNullBindingForOnePort, Ports.class);
47+
Map<ExposedPort, Binding[]> map = ports.getBindings();
48+
assertEquals(map.size(), 1);
49+
50+
assertEquals(map.get(ExposedPort.tcp(80)), null);
51+
}
52+
53+
@Test
54+
public void serializingWithNullBindings() throws Exception {
55+
Ports ports = new Ports();
56+
ports.bind(ExposedPort.tcp(80), null);
57+
assertEquals(objectMapper.writeValueAsString(ports), jsonWithNullBindingForOnePort);
58+
}
4259
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.dockerjava.api.model;
22

33
import static org.testng.Assert.assertEquals;
4+
import static org.testng.Assert.assertTrue;
45

56
import java.util.Map;
67

@@ -54,4 +55,12 @@ public void addTwoBindingsForSameExposedPort() {
5455
assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080, BINDING_9090 });
5556
}
5657

58+
@Test
59+
public void addNullBindings() {
60+
ports.add(new PortBinding(null, TCP_80));
61+
Map<ExposedPort, Binding[]> bindings = ports.getBindings();
62+
// one key with two values
63+
assertEquals(bindings.size(), 1);
64+
assertEquals(bindings.get(TCP_80), null);
65+
}
5766
}

0 commit comments

Comments
 (0)