diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java index d7c8a3245..0c2df94ad 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -75,7 +75,11 @@ public void bind(ExposedPort exposedPort, Binding binding) { Binding[] bindings = ports.get(exposedPort); ports.put(exposedPort, (Binding[]) ArrayUtils.add(bindings, binding)); } else { - ports.put(exposedPort, new Binding[]{binding}); + if (binding == null) { + ports.put(exposedPort, null); + } else { + ports.put(exposedPort, new Binding[]{binding}); + } } } @@ -282,12 +286,16 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali Map.Entry portNode = it.next(); JsonNode bindingsArray = portNode.getValue(); - for (int i = 0; i < bindingsArray.size(); i++) { - JsonNode bindingNode = bindingsArray.get(i); - if (!bindingNode.equals(NullNode.getInstance())) { - String hostIp = bindingNode.get("HostIp").textValue(); - int hostPort = bindingNode.get("HostPort").asInt(); - out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort)); + if (bindingsArray.equals(NullNode.getInstance())) { + out.bind(ExposedPort.parse(portNode.getKey()), null); + } else { + for (int i = 0; i < bindingsArray.size(); i++) { + JsonNode bindingNode = bindingsArray.get(i); + if (!bindingNode.equals(NullNode.getInstance())) { + String hostIp = bindingNode.get("HostIp").textValue(); + int hostPort = bindingNode.get("HostPort").asInt(); + out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort)); + } } } } @@ -304,14 +312,18 @@ public void serialize(Ports portBindings, JsonGenerator jsonGen, jsonGen.writeStartObject(); for(Entry entry : portBindings.getBindings().entrySet()){ jsonGen.writeFieldName(entry.getKey().toString()); - jsonGen.writeStartArray(); - for (Binding binding : entry.getValue()) { - jsonGen.writeStartObject(); - jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp()); - jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString()); - jsonGen.writeEndObject(); + if (entry.getValue() != null) { + jsonGen.writeStartArray(); + for (Binding binding : entry.getValue()) { + jsonGen.writeStartObject(); + jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp()); + jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString()); + jsonGen.writeEndObject(); + } + jsonGen.writeEndArray(); + } else { + jsonGen.writeNull(); } - jsonGen.writeEndArray(); } jsonGen.writeEndObject(); } diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java index 259310698..9190eefd2 100644 --- a/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java @@ -13,6 +13,7 @@ public class Ports_SerializingTest { private final ObjectMapper objectMapper = new ObjectMapper(); private final String jsonWithDoubleBindingForOnePort = "{\"80/tcp\":[{\"HostIp\":\"10.0.0.1\",\"HostPort\":\"80\"},{\"HostIp\":\"10.0.0.2\",\"HostPort\":\"80\"}]}"; + private final String jsonWithNullBindingForOnePort = "{\"80/tcp\":null}"; @Test public void deserializingPortWithMultipleBindings() throws Exception { @@ -39,4 +40,20 @@ public void serializingEmptyBinding() throws Exception { Ports ports = new Ports(ExposedPort.tcp(80), new Binding(null, null)); assertEquals(objectMapper.writeValueAsString(ports), "{\"80/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"\"}]}"); } + + @Test + public void deserializingPortWithNullBindings() throws Exception { + Ports ports = objectMapper.readValue(jsonWithNullBindingForOnePort, Ports.class); + Map map = ports.getBindings(); + assertEquals(map.size(), 1); + + assertEquals(map.get(ExposedPort.tcp(80)), null); + } + + @Test + public void serializingWithNullBindings() throws Exception { + Ports ports = new Ports(); + ports.bind(ExposedPort.tcp(80), null); + assertEquals(objectMapper.writeValueAsString(ports), jsonWithNullBindingForOnePort); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java index 20e47df9a..18c7f0f09 100644 --- a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.model; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; import java.util.Map; @@ -54,4 +55,12 @@ public void addTwoBindingsForSameExposedPort() { assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080, BINDING_9090 }); } + @Test + public void addNullBindings() { + ports.add(new PortBinding(null, TCP_80)); + Map bindings = ports.getBindings(); + // one key with two values + assertEquals(bindings.size(), 1); + assertEquals(bindings.get(TCP_80), null); + } }