diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index b8b0af838..e621994c7 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -18,7 +18,7 @@ com.fasterxml.jackson.core - jackson-databind + jackson-annotations ${jackson.version} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java index a7957a945..06aff4ecf 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java @@ -1,25 +1,11 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.stream.Stream; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; -@JsonSerialize(using = Binds.Serializer.class) -@JsonDeserialize(using = Binds.Deserializer.class) public class Binds implements Serializable { private static final long serialVersionUID = 1L; @@ -33,39 +19,16 @@ public Bind[] getBinds() { return binds; } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(Binds binds, JsonGenerator jsonGen, SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - // - jsonGen.writeStartArray(); - for (Bind bind : binds.getBinds()) { - jsonGen.writeString(bind.toString()); - } - jsonGen.writeEndArray(); - // - } - + @JsonValue + public String[] toPrimitive() { + return Stream.of(binds).map(Bind::toString).toArray(String[]::new); } - public static class Deserializer extends JsonDeserializer { - @Override - public Binds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - List binds = new ArrayList<>(); - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - for (Iterator it = node.elements(); it.hasNext();) { - - JsonNode field = it.next(); - binds.add(Bind.parse(field.asText())); - - } - return new Binds(binds.toArray(new Bind[0])); - } + @JsonCreator + public static Binds fromPrimitive(String[] binds) { + return new Binds( + Stream.of(binds).map(Bind::parse).toArray(Bind[]::new) + ); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java index ef4f93eb1..523a35729 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java @@ -4,6 +4,7 @@ import java.io.Serializable; +@Deprecated public class ErrorResponse implements Serializable { private static final long serialVersionUID = 1L; diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java index 1d0ac8bc8..d273b60cc 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPort.java @@ -3,22 +3,10 @@ import static com.github.dockerjava.api.model.InternetProtocol.TCP; import static com.github.dockerjava.api.model.InternetProtocol.UDP; -import java.io.IOException; import java.io.Serializable; -import java.util.Map.Entry; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import com.github.dockerjava.api.model.Ports.Binding; import lombok.EqualsAndHashCode; @@ -27,8 +15,6 @@ * {@link InternetProtocol}. It can be published by Docker by {@link Ports#bind(ExposedPort, Binding) binding} it to a host port, * represented by a {@link Binding}. */ -@JsonDeserialize(using = ExposedPort.Deserializer.class) -@JsonSerialize(using = ExposedPort.Serializer.class) @EqualsAndHashCode public class ExposedPort implements Serializable { private static final long serialVersionUID = 1L; @@ -120,6 +106,7 @@ public static ExposedPort udp(int port) { * @throws IllegalArgumentException * if the specification cannot be parsed */ + @JsonCreator public static ExposedPort parse(String serialized) throws IllegalArgumentException { try { String[] parts = serialized.split("/"); @@ -143,36 +130,8 @@ public static ExposedPort parse(String serialized) throws IllegalArgumentExcepti * @return a string representation of this {@link ExposedPort} */ @Override + @JsonValue public String toString() { return port + "/" + protocol.toString(); } - - public static class Deserializer extends JsonDeserializer { - @Override - public ExposedPort deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - if (!node.equals(NullNode.getInstance())) { - Entry field = node.fields().next(); - return ExposedPort.parse(field.getKey()); - } else { - return null; - } - } - } - - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(ExposedPort exposedPort, JsonGenerator jsonGen, SerializerProvider serProvider) - throws IOException, JsonProcessingException { - - jsonGen.writeStartObject(); - jsonGen.writeFieldName(exposedPort.toString()); - jsonGen.writeEndObject(); - } - - } - } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java index c20e84cec..445cba2de 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java @@ -1,27 +1,14 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; -@JsonSerialize(using = ExposedPorts.Serializer.class) -@JsonDeserialize(using = ExposedPorts.Deserializer.class) public class ExposedPorts implements Serializable { private static final long serialVersionUID = 1L; @@ -39,40 +26,19 @@ public ExposedPort[] getExposedPorts() { return exposedPorts; } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(ExposedPorts exposedPorts, JsonGenerator jsonGen, SerializerProvider serProvider) - throws IOException, JsonProcessingException { - - jsonGen.writeStartObject(); - for (ExposedPort exposedPort : exposedPorts.getExposedPorts()) { - jsonGen.writeFieldName(exposedPort.toString()); - jsonGen.writeStartObject(); - jsonGen.writeEndObject(); - } - jsonGen.writeEndObject(); - } - + @JsonCreator + public static ExposedPorts fromPrimitive(Map object) { + return new ExposedPorts( + object.keySet().stream().map(ExposedPort::parse).toArray(ExposedPort[]::new) + ); } - public static class Deserializer extends JsonDeserializer { - @Override - public ExposedPorts deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - List exposedPorts = new ArrayList<>(); - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - for (Iterator> it = node.fields(); it.hasNext();) { - - Map.Entry field = it.next(); - if (!field.getValue().equals(NullNode.getInstance())) { - exposedPorts.add(ExposedPort.parse(field.getKey())); - } - } - return new ExposedPorts(exposedPorts.toArray(new ExposedPort[0])); - } + @JsonValue + public Map toPrimitive() { + return Stream.of(exposedPorts).collect(Collectors.toMap( + ExposedPort::toString, + __ -> new Object() + )); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Links.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Links.java index 1c32984ee..18bfc75ba 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Links.java @@ -1,26 +1,12 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; +import java.util.stream.Stream; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; -@JsonSerialize(using = Links.Serializer.class) -@JsonDeserialize(using = Links.Deserializer.class) public class Links implements Serializable { private static final long serialVersionUID = 1L; @@ -38,37 +24,15 @@ public Link[] getLinks() { return links; } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(final Links links, final JsonGenerator jsonGen, final SerializerProvider serProvider) - throws IOException, JsonProcessingException { - jsonGen.writeStartArray(); - for (final Link link : links.getLinks()) { - jsonGen.writeString(link.toString()); - } - jsonGen.writeEndArray(); - } - + @JsonCreator + public static Links fromPrimitive(String[] links) { + return new Links( + Stream.of(links).map(Link::parse).toArray(Link[]::new) + ); } - public static class Deserializer extends JsonDeserializer { - - @Override - public Links deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - final List binds = new ArrayList<>(); - final ObjectCodec oc = jsonParser.getCodec(); - final JsonNode node = oc.readTree(jsonParser); - for (final Iterator it = node.elements(); it.hasNext();) { - - final JsonNode element = it.next(); - if (!element.equals(NullNode.getInstance())) { - binds.add(Link.parse(element.asText())); - } - } - return new Links(binds.toArray(new Link[0])); - } + @JsonValue + public String[] toPrimitive() { + return Stream.of(links).map(Link::toString).toArray(String[]::new); } - } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Ports.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Ports.java index a2ae85e23..b278e8fc4 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -1,25 +1,16 @@ package com.github.dockerjava.api.model; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import lombok.EqualsAndHashCode; -import java.io.IOException; import java.io.Serializable; import java.util.HashMap; -import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * A container for port bindings, made available as a {@link Map} via its {@link #getBindings()} method. @@ -31,8 +22,6 @@ * @see NetworkSettings#getPorts() */ @SuppressWarnings(value = "checkstyle:equalshashcode") -@JsonDeserialize(using = Ports.Deserializer.class) -@JsonSerialize(using = Ports.Serializer.class) public class Ports implements Serializable { private static final long serialVersionUID = 1L; @@ -259,60 +248,40 @@ public String toString() { } } - public static class Deserializer extends JsonDeserializer { - @Override - public Ports deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - Ports out = new Ports(); - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - for (Iterator> it = node.fields(); it.hasNext();) { + @JsonCreator + public static Ports fromPrimitive(Map>> map) { + Ports out = new Ports(); + for (Entry>> entry : map.entrySet()) { + ExposedPort exposedPort = ExposedPort.parse(entry.getKey()); - Map.Entry portNode = it.next(); - JsonNode bindingsArray = portNode.getValue(); - 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(); - String hostPort = bindingNode.get("HostPort").textValue(); - out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort)); - } - } + if (entry.getValue() == null) { + out.bind(exposedPort, null); + } else { + for (Map binding : entry.getValue()) { + out.bind(exposedPort, new Binding(binding.get("HostIp"), binding.get("HostPort"))); } } - return out; } + return out; } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(Ports portBindings, JsonGenerator jsonGen, SerializerProvider serProvider) - throws IOException, JsonProcessingException { - - jsonGen.writeStartObject(); - for (Entry entry : portBindings.getBindings().entrySet()) { - jsonGen.writeFieldName(entry.getKey().toString()); - 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.getHostPortSpec() == null ? "" : binding.getHostPortSpec()); - jsonGen.writeEndObject(); - } - jsonGen.writeEndArray(); - } else { - jsonGen.writeNull(); - } - } - jsonGen.writeEndObject(); - } - + @JsonValue + public Map>> toPrimitive() { + // Use reduce-like collect to be able to put nulls into the values + return ports.entrySet().stream().collect( + HashMap::new, + (map, entry) -> { + List> value = entry.getValue() == null ? null : Stream.of(entry.getValue()) + .map(binding -> { + Map result = new HashMap<>(); + result.put("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp()); + result.put("HostPort", binding.getHostPortSpec() == null ? "" : binding.getHostPortSpec()); + return result; + }) + .collect(Collectors.toList()); + map.put(entry.getKey().toString(), value); + }, + HashMap::putAll + ); } - } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volume.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volume.java index aad95a265..14308ef23 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -1,11 +1,12 @@ package com.github.dockerjava.api.model; import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; import lombok.EqualsAndHashCode; import javax.annotation.Nonnull; import java.io.Serializable; +import java.util.Map; /** * Represents a bind mounted volume in a Docker container. @@ -30,8 +31,8 @@ public class Volume implements Serializable { */ @Nonnull @JsonCreator - public static Volume parse(@JsonProperty("path") String path) { - return new Volume(path); + public static Volume parse(Map primitive) { + return new Volume(primitive.get("path")); } private String path; @@ -50,6 +51,7 @@ public String getPath() { } @Override + @JsonValue public String toString() { return getPath(); } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java index 3c1d4ab47..6de15ee38 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java @@ -1,28 +1,13 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; -// This is not going to be serialized -@JsonDeserialize(using = VolumeBinds.Deserializer.class) -@JsonSerialize(using = VolumeBinds.Serializer.class) public class VolumeBinds implements Serializable { private static final long serialVersionUID = 1L; @@ -36,41 +21,21 @@ public VolumeBind[] getBinds() { return binds; } - public static final class Serializer extends JsonSerializer { - - @Override - public void serialize(VolumeBinds value, JsonGenerator jgen, SerializerProvider provider) throws IOException, - JsonProcessingException { - jgen.writeStartObject(); - for (final VolumeBind bind : value.binds) { - jgen.writeStringField(bind.getContainerPath(), bind.getHostPath()); - } - jgen.writeEndObject(); - } + @JsonCreator + public static VolumeBinds fromPrimitive(Map primitive) { + return new VolumeBinds( + primitive.entrySet().stream() + .map(it -> new VolumeBind(it.getValue(), it.getKey())) + .toArray(VolumeBind[]::new) + ); } - public static final class Deserializer extends JsonDeserializer { - @Override - public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - List binds = new ArrayList<>(); - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - for (Iterator> it = node.fields(); it.hasNext();) { - Map.Entry field = it.next(); - JsonNode value = field.getValue(); - if (!value.equals(NullNode.getInstance())) { - if (!value.isTextual()) { - throw deserializationContext.mappingException("Expected path for '" + field.getKey() - + "'in host but got '" + value + "'."); - } - VolumeBind bind = new VolumeBind(value.asText(), field.getKey()); - binds.add(bind); - } - } - return new VolumeBinds(binds.toArray(new VolumeBind[binds.size()])); - } + @JsonValue + public Map toPrimitive() { + return Stream.of(binds).collect(Collectors.toMap( + VolumeBind::getContainerPath, + VolumeBind::getHostPath + )); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeRW.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeRW.java index 0c698ae6c..66ba57ced 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -1,21 +1,12 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; +import java.util.Collections; +import java.util.Map; import java.util.Map.Entry; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import lombok.EqualsAndHashCode; /** @@ -24,8 +15,6 @@ * @see Bind * @deprecated since {@link RemoteApiVersion#VERSION_1_20} */ -@JsonDeserialize(using = VolumeRW.Deserializer.class) -@JsonSerialize(using = VolumeRW.Serializer.class) @Deprecated @EqualsAndHashCode public class VolumeRW implements Serializable { @@ -63,35 +52,15 @@ public String toString() { return getVolume() + ":" + getAccessMode(); } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(VolumeRW volumeRW, JsonGenerator jsonGen, SerializerProvider serProvider) - throws IOException, JsonProcessingException { - - jsonGen.writeStartObject(); - jsonGen.writeFieldName(volumeRW.getVolume().getPath()); - jsonGen.writeString(Boolean.toString(volumeRW.getAccessMode().toBoolean())); - jsonGen.writeEndObject(); - } - + @JsonCreator + public static VolumeRW fromPrimitive(Map map) { + Entry entry = map.entrySet().iterator().next(); + return new VolumeRW(new Volume(entry.getKey()), AccessMode.fromBoolean(entry.getValue())); } - public static class Deserializer extends JsonDeserializer { - @Override - public VolumeRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - if (!node.equals(NullNode.getInstance())) { - Entry field = node.fields().next(); - String volume = field.getKey(); - AccessMode accessMode = AccessMode.fromBoolean(field.getValue().asBoolean()); - return new VolumeRW(new Volume(volume), accessMode); - } else { - return null; - } - } + @JsonValue + public Map toPrimitive() { + return Collections.singletonMap(volume.getPath(), accessMode.toBoolean()); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volumes.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volumes.java index b6844b987..2badd1ca8 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volumes.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Volumes.java @@ -1,27 +1,14 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; -@JsonSerialize(using = Volumes.Serializer.class) -@JsonDeserialize(using = Volumes.Deserializer.class) public class Volumes implements Serializable { private static final long serialVersionUID = 1L; @@ -39,42 +26,19 @@ public Volume[] getVolumes() { return volumes; } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(Volumes volumes, JsonGenerator jsonGen, SerializerProvider serProvider) - throws IOException, JsonProcessingException { - - jsonGen.writeStartObject(); - for (Volume volume : volumes.getVolumes()) { - jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeStartObject(); - jsonGen.writeEndObject(); - } - jsonGen.writeEndObject(); - } - + @JsonCreator + public static Volumes fromPrimitive(Map map) { + return new Volumes( + map.keySet().stream().map(Volume::new).toArray(Volume[]::new) + ); } - public static class Deserializer extends JsonDeserializer { - @Override - public Volumes deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - List volumes = new ArrayList<>(); - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - for (Iterator> it = node.fields(); it.hasNext();) { - - Map.Entry field = it.next(); - if (!field.getValue().equals(NullNode.getInstance())) { - String path = field.getKey(); - Volume volume = new Volume(path); - volumes.add(volume); - } - } - return new Volumes(volumes.toArray(new Volume[0])); - } + @JsonValue + public Map toPrimitive() { + return Stream.of(volumes).collect(Collectors.toMap( + Volume::getPath, + __ -> new Object() + )); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java index b70fa0384..98165afa9 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -1,23 +1,11 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import lombok.EqualsAndHashCode; -@JsonSerialize(using = VolumesFrom.Serializer.class) -@JsonDeserialize(using = VolumesFrom.Deserializer.class) @EqualsAndHashCode public class VolumesFrom implements Serializable { private static final long serialVersionUID = 1L; @@ -52,6 +40,7 @@ public AccessMode getAccessMode() { * @throws IllegalArgumentException * if the specification cannot be parsed */ + @JsonCreator public static VolumesFrom parse(String serialized) { try { String[] parts = serialized.split(":"); @@ -79,32 +68,9 @@ public static VolumesFrom parse(String serialized) { * @return a string representation of this {@link VolumesFrom} */ @Override + @JsonValue public String toString() { return container + ":" + accessMode.toString(); } - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(VolumesFrom volumeFrom, JsonGenerator jsonGen, SerializerProvider serProvider) - throws IOException, JsonProcessingException { - - jsonGen.writeString(volumeFrom.toString()); - - } - - } - - public static class Deserializer extends JsonDeserializer { - @Override - public VolumesFrom deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - return VolumesFrom.parse(node.asText()); - - } - } - } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesRW.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesRW.java index 8fcaffb8d..8afd3e230 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesRW.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/VolumesRW.java @@ -1,28 +1,14 @@ package com.github.dockerjava.api.model; -import java.io.IOException; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.ObjectCodec; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; // This is not going to be serialized -@JsonSerialize(using = VolumesRW.Serializer.class) -@JsonDeserialize(using = VolumesRW.Deserializer.class) public class VolumesRW implements Serializable { private static final long serialVersionUID = 1L; @@ -36,45 +22,20 @@ public VolumeRW[] getVolumesRW() { return volumesRW; } - public static final class Serializer extends JsonSerializer { - - @Override - public void serialize(VolumesRW value, JsonGenerator jgen, SerializerProvider provider) throws IOException, - JsonProcessingException { - jgen.writeStartObject(); - for (final VolumeRW volumeRW : value.volumesRW) { - jgen.writeBooleanField(volumeRW.getVolume().getPath(), volumeRW.getAccessMode().toBoolean()); - } - jgen.writeEndObject(); - } - + @JsonCreator + public static VolumesRW fromPrimitive(Map map) { + return new VolumesRW( + map.entrySet().stream() + .map(entry -> new VolumeRW(new Volume(entry.getKey()), AccessMode.fromBoolean(entry.getValue()))) + .toArray(VolumeRW[]::new) + ); } - public static final class Deserializer extends JsonDeserializer { - @Override - public VolumesRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - List volumesRW = new ArrayList<>(); - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - - for (Iterator> it = node.fields(); it.hasNext();) { - Map.Entry field = it.next(); - JsonNode value = field.getValue(); - - if (!value.equals(NullNode.getInstance())) { - if (!value.isBoolean()) { - throw deserializationContext.mappingException("Expected access mode for '" + field.getKey() - + "' in host but got '" + value + "'."); - } - - VolumeRW bind = new VolumeRW(new Volume(field.getKey()), AccessMode.fromBoolean(value.asBoolean())); - volumesRW.add(bind); - } - } - return new VolumesRW(volumesRW.toArray(new VolumeRW[volumesRW.size()])); - } + @JsonValue + public Map toPrimitive() { + return Stream.of(volumesRW).collect(Collectors.toMap( + it -> it.getVolume().getPath(), + it -> it.getAccessMode().toBoolean() + )); } - } diff --git a/docker-java-core/pom.xml b/docker-java-core/pom.xml index df1a74d1e..3fa7ce306 100644 --- a/docker-java-core/pom.xml +++ b/docker-java-core/pom.xml @@ -46,6 +46,12 @@ ${commons-lang.version} + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + com.google.guava guava diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 226b95c05..b64c0e7e6 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; @@ -40,7 +41,7 @@ public interface DockerClientConfig { SSLConfig getSSLConfig(); default ObjectMapper getObjectMapper() { - return DefaultObjectMapperHolder.INSTANCE.getObjectMapper(); + return DefaultObjectMapperHolder.INSTANCE.getObjectMapper().copy(); } } @@ -49,8 +50,8 @@ enum DefaultObjectMapperHolder { private final ObjectMapper objectMapper = new ObjectMapper() // TODO .setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL) - // TODO .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); public ObjectMapper getObjectMapper() { return objectMapper; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/docker-java-core/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index 7ad1c135a..0a849f4f3 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -9,10 +9,10 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.core.DefaultDockerClientConfig; /** * @@ -30,7 +30,7 @@ public class JsonStreamProcessor implements ResponseStreamProcessor { @Deprecated public JsonStreamProcessor(Class clazz) { this( - new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES), + DefaultDockerClientConfig.createDefaultConfigBuilder().build().getObjectMapper(), clazz ); } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java index 5849fc3fb..b576d7a05 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java @@ -9,7 +9,7 @@ public abstract class AbstrAsyncDockerCmd, A_RES_T> implements AsyncDockerCmd { - protected DockerCmdAsyncExec execution; + protected transient DockerCmdAsyncExec execution; public AbstrAsyncDockerCmd(DockerCmdAsyncExec execution) { checkNotNull(execution, "execution was not specified"); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index b2c9d36ce..10e6b5212 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -21,7 +21,7 @@ public abstract class AbstrDockerCmd, RES_T> impl private static final Logger LOGGER = LoggerFactory.getLogger(AbstrDockerCmd.class); - protected DockerCmdSyncExec execution; + protected transient DockerCmdSyncExec execution; public AbstrDockerCmd(DockerCmdSyncExec execution) { checkNotNull(execution, "execution was not specified"); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java index 78211bdec..d1d2adc3e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java @@ -20,9 +20,9 @@ public abstract class AbstrDockerCmdExec { - private final DockerClientConfig dockerClientConfig; + private final transient DockerClientConfig dockerClientConfig; - private final WebTarget baseResource; + private final transient WebTarget baseResource; public AbstrDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { checkNotNull(baseResource, "baseResource was not specified"); diff --git a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java index c0c6e3d48..d696bc800 100644 --- a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java +++ b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java @@ -9,7 +9,7 @@ import javax.ws.rs.client.ClientResponseFilter; import javax.ws.rs.core.MediaType; -import com.fasterxml.jackson.databind.DeserializationFeature; +import com.github.dockerjava.core.DefaultDockerClientConfig; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +40,7 @@ public class ResponseStatusExceptionFilter implements ClientResponseFilter { @Deprecated public ResponseStatusExceptionFilter() { - this(new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); + this(DefaultDockerClientConfig.createDefaultConfigBuilder().build().getObjectMapper()); } public ResponseStatusExceptionFilter(ObjectMapper objectMapper) { diff --git a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java index 7478b83f6..8830edb77 100644 --- a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java +++ b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java @@ -2,12 +2,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.InvocationBuilder; import com.github.dockerjava.core.async.ResultCallbackTemplate; import com.github.dockerjava.netty.handler.FramedResponseStreamHandler; @@ -86,14 +85,14 @@ public void onNext(Void object) { @Deprecated public NettyInvocationBuilder(ChannelProvider channelProvider, String resource) { this( - new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES), + DefaultDockerClientConfig.createDefaultConfigBuilder().build().getObjectMapper(), channelProvider, resource ); } public NettyInvocationBuilder(ObjectMapper objectMapper, ChannelProvider channelProvider, String resource) { - this.objectMapper = objectMapper.copy().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + this.objectMapper = objectMapper; this.channelProvider = channelProvider; this.resource = resource; } diff --git a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java index e209cd231..492308ad6 100644 --- a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java +++ b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java @@ -12,8 +12,8 @@ import java.util.Objects; import java.util.Set; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.WebTarget; import com.google.common.collect.ImmutableSet; import io.netty.handler.codec.http.HttpConstants; @@ -50,7 +50,7 @@ public class NettyWebTarget implements WebTarget { @Deprecated public NettyWebTarget(ChannelProvider channelProvider, String host) { this( - new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES), + DefaultDockerClientConfig.createDefaultConfigBuilder().build().getObjectMapper(), channelProvider, host, ImmutableList.of(), diff --git a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java index 963937061..30e1831f8 100644 --- a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java +++ b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java @@ -1,6 +1,6 @@ package com.github.dockerjava.netty.handler; -import com.fasterxml.jackson.databind.SerializationFeature; +import com.github.dockerjava.core.DefaultDockerClientConfig; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; @@ -17,11 +17,7 @@ @Deprecated public class JsonRequestHandler extends MessageToByteEncoder { - private ObjectMapper mapper = new ObjectMapper(); - - public JsonRequestHandler() { - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - } + private ObjectMapper mapper = DefaultDockerClientConfig.createDefaultConfigBuilder().build().getObjectMapper(); @Override protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { diff --git a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java index b46d062f9..0d13bd306 100644 --- a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java +++ b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java @@ -1,7 +1,6 @@ package com.github.dockerjava.netty.handler; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.SerializationFeature; +import com.github.dockerjava.core.DefaultDockerClientConfig; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -26,9 +25,7 @@ public class JsonResponseCallbackHandler extends SimpleChannelInboundHandler< @Deprecated public JsonResponseCallbackHandler(TypeReference typeReference, ResultCallback callback) { this( - new ObjectMapper() - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS), + DefaultDockerClientConfig.createDefaultConfigBuilder().build().getObjectMapper(), typeReference, callback ); diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/BindPropagationTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/BindPropagationTest.java new file mode 100644 index 000000000..25c9edd26 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/BindPropagationTest.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class BindPropagationTest { + + @Test + public void toJson() throws Exception { + String value = JSONTestHelper.getMapper().writeValueAsString(BindPropagation.R_PRIVATE); + + assertThat(value, is("\"rprivate\"")); + } + + @Test + public void fromJson() throws Exception { + BindPropagation value = JSONTestHelper.getMapper().readValue("\"rprivate\"", BindPropagation.class); + + assertThat(value, is(BindPropagation.R_PRIVATE)); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/BindsTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/BindsTest.java new file mode 100644 index 000000000..54ccb0e25 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/BindsTest.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class BindsTest { + + @Test + public void usesToJson() throws Exception { + Binds binds = new Binds( + Bind.parse("/foo:/bar:rw"), + Bind.parse("/bip:/bop:ro") + ); + String json = JSONTestHelper.getMapper().writeValueAsString(binds); + + assertThat(json, is("[\"/foo:/bar:rw\",\"/bip:/bop:ro\"]")); + } + + @Test + public void usesFromJson() throws Exception { + Binds binds = JSONTestHelper.getMapper().readValue("[\"/foo:/bar:rw\",\"/bip:/bop:ro\"]", Binds.class); + + assertThat(binds, notNullValue()); + assertThat(binds.getBinds(), arrayContaining( + Bind.parse("/foo:/bar:rw"), + Bind.parse("/bip:/bop:ro") + )); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java new file mode 100644 index 000000000..c69e1f04f --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ExposedPortsTest { + + @Test + public void usesToJson() throws Exception { + ExposedPorts ports = new ExposedPorts( + new ExposedPort(80), + new ExposedPort(123, InternetProtocol.UDP) + ); + String json = JSONTestHelper.getMapper().writeValueAsString(ports); + + assertThat(json, is("{\"80/tcp\":{},\"123/udp\":{}}")); + } + + @Test + public void usesFromJson() throws Exception { + ExposedPorts ports = JSONTestHelper.getMapper().readValue("{\"80/tcp\":{},\"123/udp\":{}}", ExposedPorts.class); + + assertThat(ports, notNullValue()); + assertThat(ports.getExposedPorts(), arrayContaining( + new ExposedPort(80), + new ExposedPort(123, InternetProtocol.UDP) + )); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/LinksTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/LinksTest.java new file mode 100644 index 000000000..379744165 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/LinksTest.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class LinksTest { + + @Test + public void usesToJson() throws Exception { + Links links = new Links( + new Link("/foo", "/bar"), + new Link("bip", "bop") + ); + String json = JSONTestHelper.getMapper().writeValueAsString(links); + + assertThat(json, is("[\"/foo:/bar\",\"bip:bop\"]")); + } + + @Test + public void usesFromJson() throws Exception { + Links links = JSONTestHelper.getMapper().readValue("[\"/foo:/bar\",\"bip:bop\"]", Links.class); + + assertThat(links, notNullValue()); + assertThat(links.getLinks(), arrayContaining( + new Link("foo", "bar"), + new Link("bip", "bop") + )); + } + +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java index 0d509dbfa..f0ed49364 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java @@ -6,10 +6,23 @@ import java.io.IOException; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; public class VolumeBindsTest { + @Test + public void usesToJson() throws Exception { + VolumeBinds binds = new VolumeBinds( + new VolumeBind("/bar", "/foo"), + new VolumeBind("/bop", "/bip") + ); + String json = JSONTestHelper.getMapper().writeValueAsString(binds); + + assertThat(json, is("{\"/foo\":\"/bar\",\"/bip\":\"/bop\"}")); + } + @Test public void t() throws IOException { String s = "{\"/data\":\"/some/path\"}"; diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumesRWTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumesRWTest.java new file mode 100644 index 000000000..53f1213ad --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumesRWTest.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class VolumesRWTest { + + @Test + public void usesToJson() throws Exception { + VolumesRW volumes = new VolumesRW( + new VolumeRW(new Volume("/foo")), + new VolumeRW(new Volume("/bar"), AccessMode.ro) + ); + String json = JSONTestHelper.getMapper().writeValueAsString(volumes); + + assertThat(json, is("{\"/foo\":true,\"/bar\":false}")); + } + + @Test + public void usesFromJson() throws Exception { + VolumesRW volumes = JSONTestHelper.getMapper().readValue("{\"/foo\":true,\"/bar\":false}", VolumesRW.class); + + assertThat(volumes, notNullValue()); + assertThat(volumes.getVolumesRW(), arrayContaining( + new VolumeRW(new Volume("/foo")), + new VolumeRW(new Volume("/bar"), AccessMode.ro) + )); + } + +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumesTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumesTest.java new file mode 100644 index 000000000..3470e4963 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumesTest.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class VolumesTest { + + @Test + public void usesToJson() throws Exception { + Volumes volumes = new Volumes( + new Volume("/foo"), + new Volume("/bar") + ); + String json = JSONTestHelper.getMapper().writeValueAsString(volumes); + + assertThat(json, is("{\"/foo\":{},\"/bar\":{}}")); + } + + @Test + public void usesFromJson() throws Exception { + Volumes volumes = JSONTestHelper.getMapper().readValue("{\"/foo\":{},\"/bar\":{}}", Volumes.class); + + assertThat(volumes, notNullValue()); + assertThat(volumes.getVolumes(), arrayContaining( + new Volume("/foo"), + new Volume("/bar") + )); + } +}