From 5a7e79c0f7750d0e5ddc3937c493138d2bbd8ffe Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 27 Jan 2015 21:33:24 +0100 Subject: [PATCH 1/2] Fix some CFX interoperability issues --- .../command/CopyFileFromContainerCmdImpl.java | 14 - .../jaxrs/AttachContainerCmdExec.java | 33 +- .../dockerjava/jaxrs/ExecCreateCmdExec.java | 5 +- .../dockerjava/jaxrs/ExecStartCmdExec.java | 5 +- .../jaxrs/KillContainerCmdExec.java | 19 +- .../jaxrs/PauseContainerCmdExec.java | 21 +- .../dockerjava/jaxrs/PullImageCmdExec.java | 52 +-- .../dockerjava/jaxrs/PushImageCmdExec.java | 29 +- .../jaxrs/RestartContainerCmdExec.java | 16 +- .../jaxrs/StopContainerCmdExec.java | 13 +- .../dockerjava/jaxrs/TagImageCmdExec.java | 6 +- .../jaxrs/WaitContainerCmdExec.java | 4 +- .../dockerjava/jaxrs/util/LoggingFilter.java | 330 ++++++++++++++++++ .../jaxrs/util/SelectiveLoggingFilter.java | 1 - 14 files changed, 436 insertions(+), 112 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index 2d91bb72e..fe1a57b62 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -84,18 +84,4 @@ public String toString() { public InputStream exec() throws NotFoundException { return super.exec(); } - -// protected InputStream impl() throws DockerException { -// -// CopyFileFromContainerCmd command = this; -// -// WebTarget webResource = -// baseResource.path("/containers/{id}/copy").resolveTemplate("id", command.getContainerId()); -// -// LOGGER.trace("POST: " + webResource.toString()); -// -// return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); -// } - - } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index 5ed84c341..1fafd1f0e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import java.io.InputStream; import javax.ws.rs.client.WebTarget; @@ -13,29 +11,34 @@ import com.github.dockerjava.api.command.AttachContainerCmd; -public class AttachContainerCmdExec extends AbstrDockerCmdExec implements AttachContainerCmd.Exec { - +public class AttachContainerCmdExec extends + AbstrDockerCmdExec implements + AttachContainerCmd.Exec { + private static final Logger LOGGER = LoggerFactory .getLogger(AttachContainerCmdExec.class); - + public AttachContainerCmdExec(WebTarget baseResource) { super(baseResource); } @Override protected InputStream execute(AttachContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/attach") - .resolveTemplate("id", command.getContainerId()) - .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") - // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0"); + WebTarget webResource = getBaseResource() + .path("/containers/{id}/attach") + .resolveTemplate("id", command.getContainerId()) + .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") + // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("stream", + command.hasFollowStreamEnabled() ? "1" : "0"); LOGGER.trace("POST: {}", webResource); - - return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(null, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + + return webResource.request() + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(null, Response.class).readEntity(InputStream.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index 69346efd5..02ea4d8ae 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -25,6 +25,9 @@ protected ExecCreateCmdResponse execute(ExecCreateCmd command) { LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); + return webResource + .request() + .accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index ae4c71816..effd39045 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -26,6 +26,9 @@ protected InputStream execute(ExecStartCmd command) { LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + return webResource + .request() + .accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index 28496edc9..21a6b9d67 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -10,25 +8,28 @@ import com.github.dockerjava.api.command.KillContainerCmd; -public class KillContainerCmdExec extends AbstrDockerCmdExec implements KillContainerCmd.Exec { - +public class KillContainerCmdExec extends + AbstrDockerCmdExec implements + KillContainerCmd.Exec { + private static final Logger LOGGER = LoggerFactory .getLogger(KillContainerCmdExec.class); - + public KillContainerCmdExec(WebTarget baseResource) { super(baseResource); } @Override protected Void execute(KillContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/kill").resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/kill") + .resolveTemplate("id", command.getContainerId()); - if(command.getSignal() != null) { + if (command.getSignal() != null) { webResource = webResource.queryParam("signal", command.getSignal()); } - + LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(null, MediaType.APPLICATION_JSON)); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index ee84a3209..6b3eeaf08 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -1,19 +1,19 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.PauseContainerCmd; -public class PauseContainerCmdExec extends AbstrDockerCmdExec implements PauseContainerCmd.Exec { +public class PauseContainerCmdExec extends + AbstrDockerCmdExec implements + PauseContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(PauseContainerCmdExec.class); public PauseContainerCmdExec(WebTarget baseResource) { super(baseResource); @@ -21,13 +21,12 @@ public PauseContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(PauseContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/pause") - .resolveTemplate("id", command.getContainerId()); - + WebTarget webResource = getBaseResource() + .path("/containers/{id}/pause").resolveTemplate("id", + command.getContainerId()); + LOGGER.trace("POST: {}", webResource); - webResource.request() - .accept(MediaType.APPLICATION_JSON) - .post(entity(null, MediaType.APPLICATION_JSON), Response.class); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index dea72f429..725483f85 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -1,22 +1,24 @@ package com.github.dockerjava.jaxrs; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.model.AuthConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.InputStream; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.io.InputStream; -import static javax.ws.rs.client.Entity.entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.AuthConfig; + +public class PullImageCmdExec extends + AbstrDockerCmdExec implements + PullImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(PullImageCmdExec.class); -public class PullImageCmdExec extends AbstrDockerCmdExec implements PullImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); - public PullImageCmdExec(WebTarget baseResource) { super(baseResource); } @@ -24,22 +26,24 @@ public PullImageCmdExec(WebTarget baseResource) { @Override protected InputStream execute(PullImageCmd command) { WebTarget webResource = getBaseResource().path("/images/create") - .queryParam("tag", command.getTag()) - .queryParam("fromImage", command.getRepository()) - .queryParam("registry", command.getRegistry()); + .queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()) + .queryParam("registry", command.getRegistry()); LOGGER.trace("POST: {}", webResource); - return resourceWithOptionalAuthConfig(command, webResource.request()) - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(Response.class, MediaType.APPLICATION_JSON)).readEntity(InputStream.class); + return resourceWithOptionalAuthConfig(command, webResource.request()) + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null) + .readEntity(InputStream.class); } - private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, Invocation.Builder request) { - AuthConfig authConfig = command.getAuthConfig(); - if (authConfig != null) { - request = request.header("X-Registry-Auth", registryAuth(authConfig)); - } - return request; - } + private Invocation.Builder resourceWithOptionalAuthConfig( + PullImageCmd command, Invocation.Builder request) { + AuthConfig authConfig = command.getAuthConfig(); + if (authConfig != null) { + request = request.header("X-Registry-Auth", + registryAuth(authConfig)); + } + return request; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 9454a0e73..b970d42fc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,12 +1,9 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import java.io.InputStream; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,28 +11,30 @@ import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.model.AuthConfig; -public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); - +public class PushImageCmdExec extends + AbstrDockerCmdExec implements + PushImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(PushImageCmdExec.class); + public PushImageCmdExec(WebTarget baseResource) { super(baseResource); } @Override protected InputStream execute(PushImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push") - .queryParam("tag", command.getTag()); + WebTarget webResource = getBaseResource().path( + "/images/" + name(command) + "/push").queryParam("tag", + command.getTag()); final String registryAuth = registryAuth(command.getAuthConfig()); LOGGER.trace("POST: {}", webResource); - return webResource - .request() - .header("X-Registry-Auth", registryAuth) - .accept(MediaType.APPLICATION_JSON) - .post(entity(Response.class, MediaType.APPLICATION_JSON)).readEntity(InputStream.class); + return webResource.request().header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON).post(null) + .readEntity(InputStream.class); } - + private String name(PushImageCmd command) { String name = command.getName(); AuthConfig authConfig = command.getAuthConfig(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index fe544f134..b08aa0328 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -10,9 +8,12 @@ import com.github.dockerjava.api.command.RestartContainerCmd; -public class RestartContainerCmdExec extends AbstrDockerCmdExec implements RestartContainerCmd.Exec { +public class RestartContainerCmdExec extends + AbstrDockerCmdExec implements + RestartContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(RestartContainerCmdExec.class); public RestartContainerCmdExec(WebTarget baseResource) { super(baseResource); @@ -20,12 +21,13 @@ public RestartContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(RestartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/restart") + WebTarget webResource = getBaseResource() + .path("/containers/{id}/restart") .resolveTemplate("id", command.getContainerId()) .queryParam("t", String.valueOf(command.getTimeout())); - + LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(null, MediaType.APPLICATION_JSON_TYPE)); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index 337c71b2e..956f3d0b7 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -10,9 +8,12 @@ import com.github.dockerjava.api.command.StopContainerCmd; -public class StopContainerCmdExec extends AbstrDockerCmdExec implements StopContainerCmd.Exec { +public class StopContainerCmdExec extends + AbstrDockerCmdExec implements + StopContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(StopContainerCmdExec.class); public StopContainerCmdExec(WebTarget baseResource) { super(baseResource); @@ -23,9 +24,9 @@ protected Void execute(StopContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/stop") .resolveTemplate("id", command.getContainerId()) .queryParam("t", String.valueOf(command.getTimeout())); - + LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(null, MediaType.APPLICATION_JSON)); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index d8545e339..b1c770bab 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -1,10 +1,6 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +24,7 @@ protected Void execute(TagImageCmd command) { .queryParam("force", command.hasForceEnabled() ? "1" : "0"); LOGGER.trace("POST: {}", webResource); - webResource.request().post(entity(null, MediaType.APPLICATION_JSON), Response.class); + webResource.request().post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index e6f95586c..1b81eee33 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -27,7 +25,7 @@ protected Integer execute(WaitContainerCmd command) { LOGGER.trace("POST: {}", webResource); ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON) - .post(entity(null, MediaType.TEXT_PLAIN), ObjectNode.class); + .post(null, ObjectNode.class); return ObjectNode.get("StatusCode").asInt(); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java new file mode 100644 index 000000000..5a37720ad --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java @@ -0,0 +1,330 @@ +package com.github.dockerjava.jaxrs.util; + +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2011-2014 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * http://glassfish.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ + + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Logger; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.WriterInterceptor; +import javax.ws.rs.ext.WriterInterceptorContext; + +import javax.annotation.Priority; + + +/** + * Universal logging filter. + * + * Can be used on client or server side. Has the highest priority. + * + * @author Pavel Bucek (pavel.bucek at oracle.com) + * @author Martin Matula (martin.matula at oracle.com) + */ +@PreMatching +@Priority(Integer.MIN_VALUE) +@SuppressWarnings("ClassWithMultipleLoggers") +public class LoggingFilter implements ContainerRequestFilter, ClientRequestFilter, ContainerResponseFilter, + ClientResponseFilter, WriterInterceptor { + + private static final Logger LOGGER = Logger.getLogger(LoggingFilter.class.getName()); + private static final String NOTIFICATION_PREFIX = "* "; + private static final String REQUEST_PREFIX = "> "; + private static final String RESPONSE_PREFIX = "< "; + private static final String ENTITY_LOGGER_PROPERTY = LoggingFilter.class.getName() + ".entityLogger"; + + private static final Comparator>> COMPARATOR = + new Comparator>>() { + + @Override + public int compare(final Map.Entry> o1, final Map.Entry> o2) { + return o1.getKey().compareToIgnoreCase(o2.getKey()); + } + }; + + private static final int DEFAULT_MAX_ENTITY_SIZE = 8 * 1024; + + // + @SuppressWarnings("NonConstantLogger") + private final Logger logger; + private final AtomicLong _id = new AtomicLong(0); + private final boolean printEntity; + private final int maxEntitySize; + + /** + * Create a logging filter logging the request and response to a default JDK + * logger, named as the fully qualified class name of this class. Entity + * logging is turned off by default. + */ + public LoggingFilter() { + this(LOGGER, false); + } + + /** + * Create a logging filter with custom logger and custom settings of entity + * logging. + * + * @param logger the logger to log requests and responses. + * @param printEntity if true, entity will be logged as well up to the default maxEntitySize, which is 8KB + */ + @SuppressWarnings("BooleanParameter") + public LoggingFilter(final Logger logger, final boolean printEntity) { + this.logger = logger; + this.printEntity = printEntity; + this.maxEntitySize = DEFAULT_MAX_ENTITY_SIZE; + } + + /** + * Creates a logging filter with custom logger and entity logging turned on, but potentially limiting the size + * of entity to be buffered and logged. + * + * @param logger the logger to log requests and responses. + * @param maxEntitySize maximum number of entity bytes to be logged (and buffered) - if the entity is larger, + * logging filter will print (and buffer in memory) only the specified number of bytes + * and print "...more..." string at the end. + */ + public LoggingFilter(final Logger logger, final int maxEntitySize) { + this.logger = logger; + this.printEntity = true; + this.maxEntitySize = maxEntitySize; + } + + private void log(final StringBuilder b) { + if (logger != null) { + logger.info(b.toString()); + } + } + + private StringBuilder prefixId(final StringBuilder b, final long id) { + b.append(Long.toString(id)).append(" "); + return b; + } + + private void printRequestLine(final StringBuilder b, final String note, final long id, final String method, final URI uri) { + prefixId(b, id).append(NOTIFICATION_PREFIX) + .append(note) + .append(" on thread ").append(Thread.currentThread().getName()) + .append("\n"); + prefixId(b, id).append(REQUEST_PREFIX).append(method).append(" "). + append(uri.toASCIIString()).append("\n"); + } + + private void printResponseLine(final StringBuilder b, final String note, final long id, final int status) { + prefixId(b, id).append(NOTIFICATION_PREFIX) + .append(note) + .append(" on thread ").append(Thread.currentThread().getName()).append("\n"); + prefixId(b, id).append(RESPONSE_PREFIX). + append(Integer.toString(status)). + append("\n"); + } + + private void printPrefixedHeaders(final StringBuilder b, final long id, final String prefix, final MultivaluedMap headers) { + for (final Map.Entry> headerEntry : getSortedHeaders(headers.entrySet())) { + final List val = headerEntry.getValue(); + final String header = headerEntry.getKey(); + + if (val.size() == 1) { + prefixId(b, id).append(prefix).append(header).append(": ").append(val.get(0)).append("\n"); + } else { + final StringBuilder sb = new StringBuilder(); + boolean add = false; + for (final Object s : val) { + if (add) { + sb.append(','); + } + add = true; + sb.append(s); + } + prefixId(b, id).append(prefix).append(header).append(": ").append(sb.toString()).append("\n"); + } + } + } + + private Set>> getSortedHeaders(final Set>> headers) { + final TreeSet>> sortedHeaders = new TreeSet>>(COMPARATOR); + sortedHeaders.addAll(headers); + return sortedHeaders; + } + + private InputStream logInboundEntity(final StringBuilder b, InputStream stream) throws IOException { + if (!stream.markSupported()) { + stream = new BufferedInputStream(stream); + } + stream.mark(maxEntitySize + 1); + final byte[] entity = new byte[maxEntitySize + 1]; + final int entitySize = stream.read(entity); + b.append(new String(entity, 0, Math.min(entitySize, maxEntitySize))); + if (entitySize > maxEntitySize) { + b.append("...more..."); + } + b.append('\n'); + stream.reset(); + return stream; + } + + @Override + public void filter(final ClientRequestContext context) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printRequestLine(b, "Sending client request", id, context.getMethod(), context.getUri()); + printPrefixedHeaders(b, id, REQUEST_PREFIX, context.getStringHeaders()); + + if (printEntity && context.hasEntity()) { + final OutputStream stream = new LoggingStream(b, context.getEntityStream()); + context.setEntityStream(stream); + context.setProperty(ENTITY_LOGGER_PROPERTY, stream); + // not calling log(b) here - it will be called by the interceptor + } else { + log(b); + } + } + + @Override + public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printResponseLine(b, "Client response received", id, responseContext.getStatus()); + printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getHeaders()); + + if (printEntity && responseContext.hasEntity()) { + responseContext.setEntityStream(logInboundEntity(b, responseContext.getEntityStream())); + } + + log(b); + } + + @Override + public void filter(final ContainerRequestContext context) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printRequestLine(b, "Server has received a request", id, context.getMethod(), context.getUriInfo().getRequestUri()); + printPrefixedHeaders(b, id, REQUEST_PREFIX, context.getHeaders()); + + if (printEntity && context.hasEntity()) { + context.setEntityStream(logInboundEntity(b, context.getEntityStream())); + } + + log(b); + } + + @Override + public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printResponseLine(b, "Server responded with a response", id, responseContext.getStatus()); + printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getStringHeaders()); + + if (printEntity && responseContext.hasEntity()) { + final OutputStream stream = new LoggingStream(b, responseContext.getEntityStream()); + responseContext.setEntityStream(stream); + requestContext.setProperty(ENTITY_LOGGER_PROPERTY, stream); + // not calling log(b) here - it will be called by the interceptor + } else { + log(b); + } + } + + @Override + public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContext) throws IOException, WebApplicationException { + final LoggingStream stream = (LoggingStream) writerInterceptorContext.getProperty(ENTITY_LOGGER_PROPERTY); + writerInterceptorContext.proceed(); + if (stream != null) { + log(stream.getStringBuilder()); + } + } + + private class LoggingStream extends OutputStream { + private final StringBuilder b; + private final OutputStream inner; + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + LoggingStream(final StringBuilder b, final OutputStream inner) { + this.b = b; + this.inner = inner; + } + + StringBuilder getStringBuilder() { + // write entity to the builder + final byte[] entity = baos.toByteArray(); + + b.append(new String(entity, 0, Math.min(entity.length, maxEntitySize))); + if (entity.length > maxEntitySize) { + b.append("...more..."); + } + b.append('\n'); + + return b; + } + + @Override + public void write(final int i) throws IOException { + if (baos.size() <= maxEntitySize) { + baos.write(i); + } + inner.write(i); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java index 42898008f..9c577fd54 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java @@ -10,7 +10,6 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.glassfish.jersey.filter.LoggingFilter; /** * A version of the logging filter that will avoid trying to log entities which can cause From db4cf1d5821b8e6d96660f4af288b74e9e86155d Mon Sep 17 00:00:00 2001 From: Nuno Santos Date: Wed, 28 Jan 2015 13:49:47 +0100 Subject: [PATCH 2/2] Patched LoggingFilter to work with CXF. Added missing @Override tags. --- .../java/com/github/dockerjava/api/DockerClient.java | 1 + .../com/github/dockerjava/api/command/CommitCmd.java | 1 + .../dockerjava/api/command/ContainerDiffCmd.java | 2 ++ .../api/command/CopyFileFromContainerCmd.java | 1 + .../dockerjava/api/command/DockerCmdExecFactory.java | 1 + .../dockerjava/api/command/InspectContainerCmd.java | 1 + .../github/dockerjava/api/command/InspectImageCmd.java | 1 + .../dockerjava/api/command/KillContainerCmd.java | 1 + .../github/dockerjava/api/command/LogContainerCmd.java | 1 + .../dockerjava/api/command/PauseContainerCmd.java | 1 + .../github/dockerjava/api/command/PushImageCmd.java | 1 + .../dockerjava/api/command/RemoveContainerCmd.java | 1 + .../github/dockerjava/api/command/RemoveImageCmd.java | 1 + .../dockerjava/api/command/RestartContainerCmd.java | 1 + .../dockerjava/api/command/StartContainerCmd.java | 1 + .../dockerjava/api/command/StopContainerCmd.java | 1 + .../github/dockerjava/api/command/TopContainerCmd.java | 1 + .../dockerjava/api/command/UnpauseContainerCmd.java | 1 + .../java/com/github/dockerjava/api/model/Links.java | 1 - .../dockerjava/core/command/ExecCreateCmdImpl.java | 10 ++++++++++ .../github/dockerjava/jaxrs/AbstrDockerCmdExec.java | 1 + .../github/dockerjava/jaxrs/RemoveImageCmdExec.java | 1 - .../github/dockerjava/jaxrs/util/LoggingFilter.java | 2 +- .../core/command/WaitContainerCmdImplTest.java | 1 - 24 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 53b212605..f7addfa27 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -105,6 +105,7 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public EventsCmd eventsCmd(EventCallback eventCallback); + @Override public void close() throws IOException; } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index 5eb5a3e8b..ac0a7bb5e 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -106,6 +106,7 @@ public interface CommitCmd extends DockerCmd{ /** * @throws NotFoundException No such container */ + @Override public String exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index 516ea3650..21d99045d 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -13,6 +13,7 @@ public interface ContainerDiffCmd extends DockerCmd> { public ContainerDiffCmd withContainerId(String containerId); + @Override public String toString(); /** @@ -20,6 +21,7 @@ public interface ContainerDiffCmd extends DockerCmd> { * @throws InternalServerErrorException server error * @throws DockerException unexpected http status code */ + @Override public List exec() throws NotFoundException; public static interface Exec extends DockerCmdExec> { diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index 0ebd3cc10..8d2bfbb41 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -21,6 +21,7 @@ public interface CopyFileFromContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index df26743e1..73381d692 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -75,6 +75,7 @@ public interface DockerCmdExecFactory extends Closeable { public EventsCmd.Exec createEventsCmdExec(); + @Override public void close() throws IOException; } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index ca6a9a695..f67fe4aea 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -11,6 +11,7 @@ public interface InspectContainerCmd extends DockerCmd /** * @throws NotFoundException No such container */ + @Override public InspectContainerResponse exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index f25234879..d064badba 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -14,6 +14,7 @@ public interface InspectImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ + @Override public InspectImageResponse exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index aff39f9e5..b9522cb8c 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -18,6 +18,7 @@ public interface KillContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index e0f20f9a8..36a41beb5 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -58,6 +58,7 @@ public interface LogContainerCmd extends DockerCmd{ /** * @throws NotFoundException No such container */ + @Override public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index a05733f94..652d433e4 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -17,6 +17,7 @@ public interface PauseContainerCmd extends DockerCmd{ /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index c746fd7c2..f50beb01e 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -33,6 +33,7 @@ public interface PushImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ + @Override public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index be9b9d259..b9c1f9437 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -27,6 +27,7 @@ public interface RemoveContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index 212c9290c..be65ca41e 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -41,6 +41,7 @@ public interface RemoveImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 793919c24..8da41d38a 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -21,6 +21,7 @@ public interface RestartContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index ef96267f7..40fb23a9f 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -135,6 +135,7 @@ public interface StartContainerCmd extends DockerCmd { * @throws NotModifiedException * Container already started */ + @Override public Void exec() throws NotFoundException, NotModifiedException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index 7e706c06e..19c248552 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -24,6 +24,7 @@ public interface StopContainerCmd extends DockerCmd { * @throws NotFoundException No such container * @throws NotModifiedException Container already stopped */ + @Override public Void exec() throws NotFoundException, NotModifiedException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index c7818a79d..63865c2a6 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -18,6 +18,7 @@ public interface TopContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public TopContainerResponse exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index e74df14cf..166bfa6a8 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -17,6 +17,7 @@ public interface UnpauseContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java index d901ea8d2..9bbef25d0 100644 --- a/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/src/main/java/com/github/dockerjava/api/model/Links.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Map; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 219b789da..5819fa498 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -31,48 +31,58 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { withContainerId(containerId); } + @Override public ExecCreateCmd withContainerId(String containerId) { checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } + @Override public ExecCreateCmd withAttachStdin(boolean attachStdin) { this.attachStdin = attachStdin; return this; } + @Override public ExecCreateCmd withAttachStdin() { return withAttachStdin(true); } + @Override public ExecCreateCmd withAttachStdout(boolean attachStdout) { this.attachStdout = attachStdout; return this; } + @Override public ExecCreateCmd withAttachStdout() { return withAttachStdout(true); } + @Override public ExecCreateCmd withAttachStderr(boolean attachStderr) { this.attachStderr = attachStderr; return this; } + @Override public ExecCreateCmd withAttachStderr() { return withAttachStderr(true); } + @Override public ExecCreateCmd withTty(boolean tty) { this.tty = tty; return this; } + @Override public ExecCreateCmd withTty() { return withTty(true); } + @Override public ExecCreateCmd withCmd(String... cmd) { this.cmd = cmd; return this; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 4e63d8a4a..95c13b26f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -39,6 +39,7 @@ protected String registryAuth(AuthConfig authConfig) { } } + @Override public RES_T exec(CMD_T command) { // this hack works because of ResponseStatusExceptionFilter RES_T result; diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index 6bfeecd71..d5d7b8000 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -1,7 +1,6 @@ package com.github.dockerjava.jaxrs; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java index 5a37720ad..9679f230a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java @@ -211,7 +211,7 @@ private InputStream logInboundEntity(final StringBuilder b, InputStream stream) } stream.mark(maxEntitySize + 1); final byte[] entity = new byte[maxEntitySize + 1]; - final int entitySize = stream.read(entity); + final int entitySize = Math.max(0, stream.read(entity)); b.append(new String(entity, 0, Math.min(entitySize, maxEntitySize))); if (entitySize > maxEntitySize) { b.append("...more..."); diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 32434eead..19c7057d2 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -16,7 +16,6 @@ import org.testng.annotations.Test; import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse;