diff --git a/pom.xml b/pom.xml index 4a9af78d9..b8f45ccdb 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,6 @@ 1.7.5 1.3.9 0.3 - 18.0 1.51 2014-11-16T14-41-27 @@ -150,12 +149,6 @@ ${slf4j-api.version} - - com.google.guava - guava - ${guava.version} - - org.bouncycastle bcpkix-jdk15on diff --git a/src/main/java/com/github/dockerjava/Preconditions.java b/src/main/java/com/github/dockerjava/Preconditions.java new file mode 100644 index 000000000..183e640b7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/Preconditions.java @@ -0,0 +1,145 @@ +/* Copyright (C) 2008 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava; + + +public final class Preconditions { + private Preconditions() {} + + /** + * Ensures the truth of an expression involving one or more parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessageTemplate a template for the exception message should the check fail. The + * message is formed by replacing each {@code %s} placeholder in the template with an + * argument. These are matched by position - the first {@code %s} gets {@code + * errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message + * in square braces. Unmatched placeholders will be left as-is. + * @param errorMessageArgs the arguments to be substituted into the message template. Arguments + * are converted to strings using {@link String#valueOf(Object)}. + * @throws IllegalArgumentException if {@code expression} is false + * @throws NullPointerException if the check fails and either {@code errorMessageTemplate} or + * {@code errorMessageArgs} is null (don't let this happen) + */ + public static void checkArgument(boolean expression, + String errorMessageTemplate, + Object... errorMessageArgs) { + if (!expression) { + throw new IllegalArgumentException(Preconditions.format(errorMessageTemplate, errorMessageArgs)); + } + } + + /** + * Ensures that an object reference passed as a parameter to the calling method is not null. + * + * @param reference an object reference + * @param errorMessage the exception message to use if the check fails; will be converted to a + * string using {@link String#valueOf(Object)} + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference, Object errorMessage) { + if (reference == null) { + throw new NullPointerException(String.valueOf(errorMessage)); + } + return reference; + } + + /** + * Ensures the truth of an expression involving one or more parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessage the exception message to use if the check fails; will be converted to a + * string using {@link String#valueOf(Object)} + * @throws IllegalArgumentException if {@code expression} is false + */ + public static void checkArgument(boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalArgumentException(String.valueOf(errorMessage)); + } + } + + /** + * Ensures that an object reference passed as a parameter to the calling method is not null. + * + * @param reference an object reference + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference) { + if (reference == null) { + throw new NullPointerException(); + } + return reference; + } + + /** + * Ensures the truth of an expression involving the state of the calling instance, but not + * involving any parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessage the exception message to use if the check fails; will be converted to a + * string using {@link String#valueOf(Object)} + * @throws IllegalStateException if {@code expression} is false + */ + public static void checkState(boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalStateException(String.valueOf(errorMessage)); + } + } + + /** + * Substitutes each {@code %s} in {@code template} with an argument. These are matched by + * position: the first {@code %s} gets {@code args[0]}, etc. If there are more arguments than + * placeholders, the unmatched arguments will be appended to the end of the formatted message in + * square braces. + * + * @param template a non-null string containing 0 or more {@code %s} placeholders. + * @param args the arguments to be substituted into the message template. Arguments are converted + * to strings using {@link String#valueOf(Object)}. Arguments can be null. + */ + // Note that this is somewhat-improperly used from Verify.java as well. + public static String format(String template, Object... args) { + template = String.valueOf(template); // null -> "null" + + // start substituting the arguments into the '%s' placeholders + StringBuilder builder = new StringBuilder(template.length() + 16 * args.length); + int templateStart = 0; + int i = 0; + while (i < args.length) { + int placeholderStart = template.indexOf("%s", templateStart); + if (placeholderStart == -1) { + break; + } + builder.append(template.substring(templateStart, placeholderStart)); + builder.append(args[i++]); + templateStart = placeholderStart + 2; + } + builder.append(template.substring(templateStart)); + + // if we run out of placeholders, append the extra args in square braces + if (i < args.length) { + builder.append(" ["); + builder.append(args[i++]); + while (i < args.length) { + builder.append(", "); + builder.append(args[i++]); + } + builder.append(']'); + } + + return builder.toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index e479b2698..099da368f 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -1,8 +1,9 @@ package com.github.dockerjava.api.command; +import static com.github.dockerjava.jaxrs.util.guava.Guava.join; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Joiner; /** * @@ -28,17 +29,15 @@ public String[][] getProcesses() { @Override public String toString() { - Joiner joiner = Joiner.on("; ").skipNulls(); - StringBuffer buffer = new StringBuffer(); buffer.append("["); for(String[] fields: processes) { - buffer.append("[" + joiner.join(fields) + "]"); + buffer.append("[" + join(fields, "; ", true) + "]"); } buffer.append("]"); return "TopContainerResponse{" + - "titles=" + joiner.join(titles) + + "titles=" + join(titles, "; ", true) + ", processes=" + buffer.toString() + '}'; } diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java index b0b325157..76b0ddbf9 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -1,10 +1,11 @@ package com.github.dockerjava.api.model; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Preconditions; public class Device { @@ -22,10 +23,10 @@ public Device() { public Device(String cGroupPermissions, String pathInContainer, String pathOnHost) { - Preconditions.checkNotNull(cGroupPermissions, + checkNotNull(cGroupPermissions, "cGroupPermissions is null"); - Preconditions.checkNotNull(pathInContainer, "pathInContainer is null"); - Preconditions.checkNotNull(pathOnHost, "pathOnHost is null"); + checkNotNull(pathInContainer, "pathInContainer is null"); + checkNotNull(pathOnHost, "pathOnHost is null"); this.cGroupPermissions = cGroupPermissions; this.pathInContainer = pathInContainer; this.pathOnHost = pathOnHost; diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index 5cdcb70bc..e08dd1384 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -1,10 +1,11 @@ package com.github.dockerjava.api.model; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Preconditions; /** * Container restart policy @@ -36,7 +37,7 @@ public RestartPolicy() { } private RestartPolicy(int maximumRetryCount, String name) { - Preconditions.checkNotNull(name, "name is null"); + checkNotNull(name, "name is null"); this.maximumRetryCount = maximumRetryCount; this.name = name; } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 21e5778fd..9a7a2e9fa 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,20 +1,22 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.DockerClientException; -import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.core.NameParser.HostnameReposName; -import com.github.dockerjava.core.NameParser.ReposTag; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Serializable; import java.net.URI; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Properties; +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.core.NameParser.HostnameReposName; +import com.github.dockerjava.core.NameParser.ReposTag; + public class DockerClientConfig implements Serializable { private static final long serialVersionUID = -4307357472441531489L; @@ -39,18 +41,23 @@ public class DockerClientConfig implements Serializable { /** * A map from the environment name to the interval name. */ - private static final Map ENV_NAME_TO_IO_NAME = ImmutableMap.builder() - .put("DOCKER_URL", DOCKER_IO_URL_PROPERTY) - .put("DOCKER_VERSION", DOCKER_IO_VERSION_PROPERTY) - .put("DOCKER_USERNAME", DOCKER_IO_USERNAME_PROPERTY) - .put("DOCKER_PASSWORD", DOCKER_IO_PASSWORD_PROPERTY) - .put("DOCKER_EMAIL", DOCKER_IO_EMAIL_PROPERTY) - .put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY) - .put("DOCKER_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY) - .put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY) - .put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY) - .put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY) - .build(); + // Immutable ish + private static final Map ENV_NAME_TO_IO_NAME; + static { + Map m = new HashMap(); + m.put("DOCKER_URL", DOCKER_IO_URL_PROPERTY); + m.put("DOCKER_VERSION", DOCKER_IO_VERSION_PROPERTY); + m.put("DOCKER_USERNAME", DOCKER_IO_USERNAME_PROPERTY); + m.put("DOCKER_PASSWORD", DOCKER_IO_PASSWORD_PROPERTY); + m.put("DOCKER_EMAIL", DOCKER_IO_EMAIL_PROPERTY); + m.put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY); + m.put("DOCKER_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY); + m.put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY); + m.put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY); + m.put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY); + ENV_NAME_TO_IO_NAME = Collections.unmodifiableMap(m); + } + private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; private URI uri; private final String version, username, password, email, serverAddress, dockerCfgPath; @@ -370,7 +377,7 @@ public DockerClientConfigBuilder withProperties(Properties p) { } public final DockerClientConfigBuilder withUri(String uri) { - Preconditions.checkNotNull(uri, "uri was not specified"); + checkNotNull(uri, "uri was not specified"); this.uri = URI.create(uri); return this; } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 556c7f91e..f1175921c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.google.common.base.Preconditions.checkNotNull; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.Closeable; import java.io.File; @@ -8,10 +8,75 @@ import java.io.InputStream; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventCallback; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.core.command.*; -import com.google.common.base.Preconditions; +import com.github.dockerjava.core.command.AttachContainerCmdImpl; +import com.github.dockerjava.core.command.AuthCmdImpl; +import com.github.dockerjava.core.command.BuildImageCmdImpl; +import com.github.dockerjava.core.command.CommitCmdImpl; +import com.github.dockerjava.core.command.ContainerDiffCmdImpl; +import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; +import com.github.dockerjava.core.command.CreateContainerCmdImpl; +import com.github.dockerjava.core.command.CreateImageCmdImpl; +import com.github.dockerjava.core.command.EventsCmdImpl; +import com.github.dockerjava.core.command.ExecCreateCmdImpl; +import com.github.dockerjava.core.command.ExecStartCmdImpl; +import com.github.dockerjava.core.command.InfoCmdImpl; +import com.github.dockerjava.core.command.InspectContainerCmdImpl; +import com.github.dockerjava.core.command.InspectImageCmdImpl; +import com.github.dockerjava.core.command.KillContainerCmdImpl; +import com.github.dockerjava.core.command.ListContainersCmdImpl; +import com.github.dockerjava.core.command.ListImagesCmdImpl; +import com.github.dockerjava.core.command.LogContainerCmdImpl; +import com.github.dockerjava.core.command.PauseContainerCmdImpl; +import com.github.dockerjava.core.command.PingCmdImpl; +import com.github.dockerjava.core.command.PullImageCmdImpl; +import com.github.dockerjava.core.command.PushImageCmdImpl; +import com.github.dockerjava.core.command.RemoveContainerCmdImpl; +import com.github.dockerjava.core.command.RemoveImageCmdImpl; +import com.github.dockerjava.core.command.RestartContainerCmdImpl; +import com.github.dockerjava.core.command.SearchImagesCmdImpl; +import com.github.dockerjava.core.command.StartContainerCmdImpl; +import com.github.dockerjava.core.command.StopContainerCmdImpl; +import com.github.dockerjava.core.command.TagImageCmdImpl; +import com.github.dockerjava.core.command.TopContainerCmdImpl; +import com.github.dockerjava.core.command.UnpauseContainerCmdImpl; +import com.github.dockerjava.core.command.VersionCmdImpl; +import com.github.dockerjava.core.command.WaitContainerCmdImpl; /** * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -33,7 +98,7 @@ private DockerClientImpl(String serverUrl) { } private DockerClientImpl(DockerClientConfig dockerClientConfig) { - Preconditions.checkNotNull(dockerClientConfig, + checkNotNull(dockerClientConfig, "config was not specified"); this.dockerClientConfig = dockerClientConfig; } @@ -58,7 +123,7 @@ public static DockerClientImpl getInstance(String serverUrl) { public DockerClientImpl withDockerCmdExecFactory( DockerCmdExecFactory dockerCmdExecFactory) { - Preconditions.checkNotNull(dockerCmdExecFactory, + checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); this.dockerCmdExecFactory = dockerCmdExecFactory; this.dockerCmdExecFactory.init(dockerClientConfig); @@ -66,7 +131,7 @@ public DockerClientImpl withDockerCmdExecFactory( } private DockerCmdExecFactory getDockerCmdExecFactory() { - Preconditions.checkNotNull(dockerCmdExecFactory, + checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); return dockerCmdExecFactory; } diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index 269b87658..fe5e65099 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core; -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; @@ -35,7 +34,7 @@ public class KeystoreSSLConfig implements SSLConfig, Serializable { */ public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { this.keystorePassword = keystorePassword; - Preconditions.checkNotNull(keystore); + checkNotNull(keystore); this.keystore = keystore; } @@ -50,8 +49,8 @@ public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { */ public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - Preconditions.checkNotNull(pfxFile); - Preconditions.checkNotNull(password); + checkNotNull(pfxFile); + checkNotNull(password); keystore = KeyStore.getInstance("pkcs12"); keystore.load(new FileInputStream(pfxFile), password.toCharArray()); keystorePassword = password; @@ -126,8 +125,10 @@ public int hashCode() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("keystore", keystore) + return new StringBuilder() + .append(this.getClass().getSimpleName()).append("{") + .append("keystore=").append(keystore) + .append("}") .toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 6415d0c18..d60db72c5 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -1,16 +1,18 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.DockerClientException; -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.glassfish.jersey.SslConfigurator; +import static com.github.dockerjava.Preconditions.checkNotNull; -import javax.net.ssl.SSLContext; import java.io.Serializable; -import java.security.KeyStore; import java.security.Security; +import javax.net.ssl.SSLContext; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.glassfish.jersey.SslConfigurator; + +import com.github.dockerjava.api.DockerClientException; + + /** * SSL Config from local files. */ @@ -19,7 +21,7 @@ public class LocalDirectorySSLConfig implements SSLConfig, Serializable { private final String dockerCertPath; public LocalDirectorySSLConfig(String dockerCertPath) { - Preconditions.checkNotNull(dockerCertPath); + checkNotNull(dockerCertPath); this.dockerCertPath = dockerCertPath; } @@ -88,8 +90,10 @@ public int hashCode() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("dockerCertPath", dockerCertPath) + return new StringBuilder() + .append(this.getClass().getSimpleName()).append("{") + .append("dockerCertPath=").append(dockerCertPath) + .append("}") .toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 96e92da4b..8069ed6b1 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -1,17 +1,16 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.IOException; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.codec.binary.Base64; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; -import com.google.common.base.Preconditions; - -import org.apache.commons.codec.binary.Base64; - public abstract class AbstrAuthCfgDockerCmd, RES_T> extends AbstrDockerCmd { @@ -31,7 +30,7 @@ public AuthConfig getAuthConfig() { } public T withAuthConfig(AuthConfig authConfig) { - Preconditions.checkNotNull(authConfig, "authConfig was not specified"); + checkNotNull(authConfig, "authConfig was not specified"); return withOptionalAuthConfig(authConfig); } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 54312c50c..ed289c98a 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.IOException; import org.slf4j.Logger; @@ -8,7 +10,6 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdExec; -import com.google.common.base.Preconditions; public abstract class AbstrDockerCmd, RES_T> implements DockerCmd { @@ -17,7 +18,7 @@ public abstract class AbstrDockerCmd, RES_T> impl protected DockerCmdExec execution; public AbstrDockerCmd(DockerCmdExec execution) { - Preconditions.checkNotNull(execution, "execution was not specified"); + checkNotNull(execution, "execution was not specified"); this.execution = execution; } diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index 930fbdfdd..6ac220c0e 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.AttachContainerCmd; -import com.google.common.base.Preconditions; - /** * Attach to container * @@ -66,7 +66,7 @@ public boolean hasStderrEnabled() { @Override public AttachContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index ec3406b17..b2286bc85 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -1,5 +1,9 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; +import static com.github.dockerjava.Preconditions.checkState; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -24,7 +28,6 @@ import com.github.dockerjava.core.GoLangFileMatch; import com.github.dockerjava.core.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; -import com.google.common.base.Preconditions; /** * @@ -49,7 +52,7 @@ public class BuildImageCmdImpl extends public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFolder) { super(exec); - Preconditions.checkNotNull(dockerFolder, "dockerFolder is null"); + checkNotNull(dockerFolder, "dockerFolder is null"); tarFile = buildDockerFolderTar(dockerFolder); try { withTarInputStream(FileUtils.openInputStream(tarFile)); @@ -61,7 +64,7 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFolder) { public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { super(exec); - Preconditions.checkNotNull(tarInputStream, "tarInputStream is null"); + checkNotNull(tarInputStream, "tarInputStream is null"); withTarInputStream(tarInputStream); } @@ -72,14 +75,14 @@ public InputStream getTarInputStream() { @Override public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - Preconditions.checkNotNull(tarInputStream, "tarInputStream is null"); + checkNotNull(tarInputStream, "tarInputStream is null"); this.tarInputStream = tarInputStream; return this; } @Override public BuildImageCmdImpl withTag(String tag) { - Preconditions.checkNotNull(tag, "Tag is null"); + checkNotNull(tag, "Tag is null"); this.tag = tag; return this; } @@ -157,11 +160,11 @@ public String toString() { } protected File buildDockerFolderTar(File dockerFolder) { - Preconditions.checkArgument(dockerFolder.exists(), + checkArgument(dockerFolder.exists(), "Path %s doesn't exist", dockerFolder); - Preconditions.checkArgument(dockerFolder.isDirectory(), + checkArgument(dockerFolder.isDirectory(), "Folder %s doesn't exist", dockerFolder); - Preconditions.checkState(new File(dockerFolder, "Dockerfile").exists(), + checkState(new File(dockerFolder, "Dockerfile").exists(), "Dockerfile doesn't exist in " + dockerFolder); // ARCHIVE TAR diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index ee9c4db6e..6ba3d4a34 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -1,15 +1,15 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonProperty; - import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; -import com.google.common.base.Preconditions; /** * @@ -86,7 +86,7 @@ public String getContainerId() { @Override public CommitCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -152,7 +152,7 @@ public CommitCmdImpl withAttachStdout() { @Override public CommitCmdImpl withCmd(String... cmd) { - Preconditions.checkNotNull(cmd, "cmd was not specified"); + checkNotNull(cmd, "cmd was not specified"); this.cmd = cmd; return this; } @@ -165,28 +165,28 @@ public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { @Override public CommitCmdImpl withAuthor(String author) { - Preconditions.checkNotNull(author, "author was not specified"); + checkNotNull(author, "author was not specified"); this.author = author; return this; } @Override public CommitCmdImpl withMessage(String message) { - Preconditions.checkNotNull(message, "message was not specified"); + checkNotNull(message, "message was not specified"); this.message = message; return this; } @Override public CommitCmdImpl withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } @Override public CommitCmdImpl withRepository(String repository) { - Preconditions.checkNotNull(repository, "repository was not specified"); + checkNotNull(repository, "repository was not specified"); this.repository = repository; return this; } @@ -204,7 +204,7 @@ public String[] getEnv() { @Override public CommitCmdImpl withEnv(String... env) { - Preconditions.checkNotNull(env, "env was not specified"); + checkNotNull(env, "env was not specified"); this.env = env; return this; } @@ -216,7 +216,7 @@ public ExposedPorts getExposedPorts() { @Override public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { - Preconditions.checkNotNull(exposedPorts, "exposedPorts was not specified"); + checkNotNull(exposedPorts, "exposedPorts was not specified"); this.exposedPorts = exposedPorts; return this; } @@ -228,7 +228,7 @@ public String getHostname() { @Override public CommitCmdImpl withHostname(String hostname) { - Preconditions.checkNotNull(hostname, "hostname was not specified"); + checkNotNull(hostname, "hostname was not specified"); this.hostname = hostname; return this; } @@ -240,7 +240,7 @@ public Integer getMemory() { @Override public CommitCmdImpl withMemory(Integer memory) { - Preconditions.checkNotNull(memory, "memory was not specified"); + checkNotNull(memory, "memory was not specified"); this.memory = memory; return this; } @@ -252,7 +252,7 @@ public Integer getMemorySwap() { @Override public CommitCmdImpl withMemorySwap(Integer memorySwap) { - Preconditions.checkNotNull(memorySwap, "memorySwap was not specified"); + checkNotNull(memorySwap, "memorySwap was not specified"); this.memorySwap = memorySwap; return this; } @@ -264,7 +264,7 @@ public boolean isOpenStdin() { @Override public CommitCmdImpl withOpenStdin(boolean openStdin) { - Preconditions.checkNotNull(openStdin, "openStdin was not specified"); + checkNotNull(openStdin, "openStdin was not specified"); this.openStdin = openStdin; return this; } @@ -276,7 +276,7 @@ public String[] getPortSpecs() { @Override public CommitCmdImpl withPortSpecs(String... portSpecs) { - Preconditions.checkNotNull(portSpecs, "portSpecs was not specified"); + checkNotNull(portSpecs, "portSpecs was not specified"); this.portSpecs = portSpecs; return this; } @@ -320,7 +320,7 @@ public String getUser() { @Override public CommitCmdImpl withUser(String user) { - Preconditions.checkNotNull(user, "user was not specified"); + checkNotNull(user, "user was not specified"); this.user = user; return this; } @@ -332,7 +332,7 @@ public Volumes getVolumes() { @Override public CommitCmdImpl withVolumes(Volumes volumes) { - Preconditions.checkNotNull(volumes, "volumes was not specified"); + checkNotNull(volumes, "volumes was not specified"); this.volumes = volumes; return this; } @@ -344,7 +344,7 @@ public String getWorkingDir() { @Override public CommitCmdImpl withWorkingDir(String workingDir) { - Preconditions.checkNotNull(workingDir, "workingDir was not specified"); + checkNotNull(workingDir, "workingDir was not specified"); this.workingDir = workingDir; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index f6a414b1b..68293107d 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.DockerException; @@ -8,8 +10,6 @@ import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.model.ChangeLog; -import com.google.common.base.Preconditions; - /** * Inspect changes on a container's filesystem * @@ -32,7 +32,7 @@ public String getContainerId() { @Override public ContainerDiffCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } 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 929b6bf5f..2d91bb72e 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -1,15 +1,15 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonProperty; - import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.google.common.base.Preconditions; /** * @@ -44,14 +44,14 @@ public String getResource() { @Override public CopyFileFromContainerCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public CopyFileFromContainerCmdImpl withResource(String resource) { - Preconditions.checkNotNull(resource, "resource was not specified"); + checkNotNull(resource, "resource was not specified"); this.resource = resource; return this; } @@ -63,7 +63,7 @@ public String getHostPath() { @Override public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { - Preconditions.checkNotNull(hostPath, "hostPath was not specified"); + checkNotNull(hostPath, "hostPath was not specified"); this.hostPath = hostPath; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index b8cde7fe0..ea6d721e7 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -14,7 +16,7 @@ import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; -import com.google.common.base.Preconditions; + /** * @@ -49,13 +51,13 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { @@ -31,7 +32,7 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { } public ExecCreateCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 3b21f9b2f..8f9028d2e 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.command.ExecStartCmd; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.InputStream; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.ExecStartCmd; + public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { private String execId; @@ -24,7 +25,7 @@ public String getExecId() { @Override public ExecStartCmd withExecId(String execId) { - Preconditions.checkNotNull(execId, "execId was not specified"); + checkNotNull(execId, "execId was not specified"); this.execId = execId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index 0fd55b761..f48101b89 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.google.common.base.Preconditions; - /** * Inspect the details of a container. */ @@ -25,7 +25,7 @@ public String getContainerId() { @Override public InspectContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index b52b15d53..11a0ea7f5 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -1,10 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; -import com.google.common.base.Preconditions; /** * Inspect the details of an image. @@ -25,7 +26,7 @@ public String getImageId() { @Override public InspectImageCmd withImageId(String imageId) { - Preconditions.checkNotNull(imageId, "imageId was not specified"); + checkNotNull(imageId, "imageId was not specified"); this.imageId = imageId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index f8ca070fc..ccc7b58b0 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -1,9 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; -import com.google.common.base.Preconditions; /** * Kill a running container. @@ -29,14 +30,14 @@ public String getSignal() { @Override public KillContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public KillContainerCmd withSignal(String signal) { - Preconditions.checkNotNull(signal, "signal was not specified"); + checkNotNull(signal, "signal was not specified"); this.signal = signal; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index c2ebd4911..5bfe61afe 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -1,11 +1,13 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -import com.google.common.base.Preconditions; /** * List containers @@ -68,21 +70,21 @@ public ListContainersCmd withShowSize(boolean showSize) { @Override public ListContainersCmd withLimit(int limit) { - Preconditions.checkArgument(limit > 0, "limit must be greater 0"); + checkArgument(limit > 0, "limit must be greater 0"); this.limit = limit; return this; } @Override public ListContainersCmd withSince(String since) { - Preconditions.checkNotNull(since, "since was not specified"); + checkNotNull(since, "since was not specified"); this.sinceId = since; return this; } @Override public ListContainersCmd withBefore(String before) { - Preconditions.checkNotNull(before, "before was not specified"); + checkNotNull(before, "before was not specified"); this.beforeId = before; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 451a0ac57..01c5eb01a 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; -import com.google.common.base.Preconditions; - /** * List images * @@ -41,7 +41,7 @@ public ListImagesCmd withShowAll(boolean showAll) { @Override public ListImagesCmd withFilters(String filter) { - Preconditions.checkNotNull(filter, "filters have not been specified"); + checkNotNull(filter, "filters have not been specified"); this.filters = filter; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index 26c9a3b03..b71a149c9 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.LogContainerCmd; -import com.google.common.base.Preconditions; - /** * Get container logs * @@ -67,7 +67,7 @@ public boolean hasStderrEnabled() { @Override public LogContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index fa6b816f7..4d8702b11 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PauseContainerCmd; -import com.google.common.base.Preconditions; - /** * Pause a container. * @@ -27,7 +27,7 @@ public String getContainerId() { @Override public PauseContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index bcd3613b4..b4cde7947 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.model.AuthConfig; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.InputStream; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.AuthConfig; + /** * * Pull image from repository. @@ -37,21 +38,21 @@ public String getRegistry() { @Override public PullImageCmd withRepository(String repository) { - Preconditions.checkNotNull(repository, "repository was not specified"); + checkNotNull(repository, "repository was not specified"); this.repository = repository; return this; } @Override public PullImageCmd withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } @Override public PullImageCmd withRegistry(String registry) { - Preconditions.checkNotNull(registry, "registry was not specified"); + checkNotNull(registry, "registry was not specified"); this.registry = registry; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index 56f587158..2a2795503 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PushImageCmd; -import com.google.common.base.Preconditions; - /** * Push the latest image to the repository. * @@ -37,7 +37,7 @@ public String getTag() { */ @Override public PushImageCmd withName(String name) { - Preconditions.checkNotNull(name, "name was not specified"); + checkNotNull(name, "name was not specified"); this.name = name; return this; } @@ -47,7 +47,7 @@ public PushImageCmd withName(String name) { */ @Override public PushImageCmd withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 31344fdb7..84d7cc12f 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.google.common.base.Preconditions; - /** * Remove a container. * @@ -39,7 +39,7 @@ public boolean hasForceEnabled() { @Override public RemoveContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index dda905fe7..6e7f4fb17 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveImageCmd; -import com.google.common.base.Preconditions; - /** * * Remove an image, deleting any tags it might have. @@ -38,7 +38,7 @@ public boolean hasNoPruneEnabled() { @Override public RemoveImageCmd withImageId(String imageId) { - Preconditions.checkNotNull(imageId, "imageId was not specified"); + checkNotNull(imageId, "imageId was not specified"); this.imageId = imageId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index f82a65b62..0f105e53b 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -1,10 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RestartContainerCmd; -import com.google.common.base.Preconditions; - /** * Restart a running container. * @@ -34,14 +35,14 @@ public int getTimeout() { @Override public RestartContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public RestartContainerCmd withtTimeout(int timeout) { - Preconditions.checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 3ca878f18..7462cdbdc 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.command.SearchImagesCmd; import com.github.dockerjava.api.model.SearchItem; -import com.google.common.base.Preconditions; - /** * Search images * @@ -29,7 +29,7 @@ public String getTerm() { @Override public SearchImagesCmd withTerm(String term) { - Preconditions.checkNotNull(term, "term was not specified"); + checkNotNull(term, "term was not specified"); this.term = term; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index 63ff4ff0e..1ca2124db 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core.command; import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; +import static com.github.dockerjava.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; @@ -20,7 +21,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; -import com.google.common.base.Preconditions; + /** * Start a container @@ -158,7 +159,7 @@ public Capability[] getCapDrop() { @Override @JsonIgnore public StartContainerCmd withBinds(Bind... binds) { - Preconditions.checkNotNull(binds, "binds was not specified"); + checkNotNull(binds, "binds was not specified"); this.binds = new Binds(binds); return this; } @@ -166,21 +167,21 @@ public StartContainerCmd withBinds(Bind... binds) { @Override @JsonIgnore public StartContainerCmd withLinks(Link... links) { - Preconditions.checkNotNull(links, "links was not specified"); + checkNotNull(links, "links was not specified"); this.links = new Links(links); return this; } @Override public StartContainerCmd withLxcConf(LxcConf... lxcConf) { - Preconditions.checkNotNull(lxcConf, "lxcConf was not specified"); + checkNotNull(lxcConf, "lxcConf was not specified"); this.lxcConf = lxcConf; return this; } @Override public StartContainerCmd withPortBindings(Ports portBindings) { - Preconditions.checkNotNull(portBindings, + checkNotNull(portBindings, "portBindings was not specified"); this.portBindings = portBindings; return this; @@ -188,7 +189,7 @@ public StartContainerCmd withPortBindings(Ports portBindings) { @Override public StartContainerCmd withPortBindings(PortBinding... portBindings) { - Preconditions.checkNotNull(portBindings, "portBindings was not specified"); + checkNotNull(portBindings, "portBindings was not specified"); if (this.portBindings == null) { this.portBindings = new Ports(); } @@ -210,65 +211,63 @@ public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts) { @Override public StartContainerCmd withDns(String... dns) { - Preconditions.checkNotNull(dns, "dns was not specified"); + checkNotNull(dns, "dns was not specified"); this.dns = dns; return this; } @Override public StartContainerCmd withDnsSearch(String... dnsSearch) { - Preconditions.checkNotNull(dnsSearch, "dnsSearch was not specified"); + checkNotNull(dnsSearch, "dnsSearch was not specified"); this.dnsSearch = dnsSearch; return this; } @Override public StartContainerCmd withVolumesFrom(String volumesFrom) { - Preconditions - .checkNotNull(volumesFrom, "volumesFrom was not specified"); + checkNotNull(volumesFrom, "volumesFrom was not specified"); this.volumesFrom = volumesFrom; return this; } @Override public StartContainerCmd withContainerId(String containerId) { - Preconditions - .checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public StartContainerCmd withNetworkMode(String networkMode) { - Preconditions.checkNotNull(networkMode, "networkMode was not specified"); + checkNotNull(networkMode, "networkMode was not specified"); this.networkMode = networkMode; return this; } @Override public StartContainerCmd withDevices(Device... devices) { - Preconditions.checkNotNull(devices, "devices was not specified"); + checkNotNull(devices, "devices was not specified"); this.devices = devices; return this; } @Override public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { - Preconditions.checkNotNull(restartPolicy, "restartPolicy was not specified"); + checkNotNull(restartPolicy, "restartPolicy was not specified"); this.restartPolicy = restartPolicy; return this; } @Override public StartContainerCmd withCapAdd(Capability... capAdd) { - Preconditions.checkNotNull(capAdd, "capAdd was not specified"); + checkNotNull(capAdd, "capAdd was not specified"); this.capAdd = capAdd; return this; } @Override public StartContainerCmd withCapDrop(Capability... capDrop) { - Preconditions.checkNotNull(capDrop, "capDrop was not specified"); + checkNotNull(capDrop, "capDrop was not specified"); this.capDrop = capDrop; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index 7033cad6b..26372b9fc 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; import com.github.dockerjava.api.command.StopContainerCmd; -import com.google.common.base.Preconditions; - /** * Stop a running container. * @@ -36,14 +37,14 @@ public int getTimeout() { @Override public StopContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public StopContainerCmd withTimeout(int timeout) { - Preconditions.checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index fe981218a..cdcc74502 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -1,8 +1,9 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.command.TagImageCmd; -import com.google.common.base.Preconditions; /** * Tag an image into a repository @@ -47,21 +48,21 @@ public boolean hasForceEnabled() { @Override public TagImageCmd withImageId(String imageId) { - Preconditions.checkNotNull(imageId, "imageId was not specified"); + checkNotNull(imageId, "imageId was not specified"); this.imageId = imageId; return this; } @Override public TagImageCmd withRepository(String repository) { - Preconditions.checkNotNull(repository, "repository was not specified"); + checkNotNull(repository, "repository was not specified"); this.repository = repository; return this; } @Override public TagImageCmd withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 92b825231..c49698cf7 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; -import com.google.common.base.Preconditions; - /** * List processes running inside a container */ @@ -32,7 +32,7 @@ public String getPsArgs() { @Override public TopContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -40,7 +40,7 @@ public TopContainerCmd withContainerId(String containerId) { @Override public TopContainerCmd withPsArgs(String psArgs) { - Preconditions.checkNotNull(psArgs, "psArgs was not specified"); + checkNotNull(psArgs, "psArgs was not specified"); this.psArgs = psArgs; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 3ecc0acb3..97d12eaa6 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.UnpauseContainerCmd; -import com.google.common.base.Preconditions; - /** * Unpause a container. * @@ -27,7 +27,7 @@ public String getContainerId() { @Override public UnpauseContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index 80baf2cc1..c5952e53b 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -1,7 +1,8 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.command.WaitContainerCmd; -import com.google.common.base.Preconditions; /** * Wait a container @@ -24,7 +25,7 @@ public String getContainerId() { @Override public WaitContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; 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 727055f96..4e63d8a4a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -1,5 +1,7 @@ package com.github.dockerjava.jaxrs; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.IOException; import javax.ws.rs.ProcessingException; @@ -8,21 +10,18 @@ import org.apache.commons.codec.binary.Base64; import com.fasterxml.jackson.databind.ObjectMapper; - import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; -import com.google.common.base.Preconditions; - public abstract class AbstrDockerCmdExec, RES_T> implements DockerCmdExec { private WebTarget baseResource; public AbstrDockerCmdExec(WebTarget baseResource) { - Preconditions.checkNotNull(baseResource, + checkNotNull(baseResource, "baseResource was not specified"); this.baseResource = baseResource; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java index a4adb1bb7..23d6d1ab9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java @@ -22,10 +22,6 @@ -import com.google.common.collect.Queues; - -import org.newsclub.net.unix.AFUNIXSocket; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -34,8 +30,11 @@ import java.net.SocketAddress; import java.net.SocketException; import java.nio.channels.SocketChannel; +import java.util.ArrayDeque; import java.util.Queue; +import org.newsclub.net.unix.AFUNIXSocket; + /** * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options * until the socket is connected. This is necessary because the Apache HTTP client attempts to @@ -50,7 +49,7 @@ public class ApacheUnixSocket extends Socket { private final AFUNIXSocket inner; - private final Queue optionsToSet = Queues.newArrayDeque(); + private final Queue optionsToSet = new ArrayDeque(); public ApacheUnixSocket() throws IOException { this.inner = AFUNIXSocket.newInstance(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index c91b0d565..3f59a2839 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,13 +1,16 @@ package com.github.dockerjava.jaxrs; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import com.github.dockerjava.api.DockerClientException; -import com.github.dockerjava.api.command.*; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.util.JsonClientFilter; -import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; -import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; + +import java.io.IOException; +import java.net.URI; +import java.util.logging.Logger; + +import javax.net.ssl.SSLContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.WebTarget; + import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; @@ -19,13 +22,46 @@ import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; -import javax.net.ssl.SSLContext; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import java.io.IOException; -import java.net.URI; -import java.util.logging.Logger; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.JsonClientFilter; +import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; +import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -35,7 +71,7 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @Override public void init(DockerClientConfig dockerClientConfig) { - Preconditions.checkNotNull(dockerClientConfig, "config was not specified"); + checkNotNull(dockerClientConfig, "config was not specified"); ClientConfig clientConfig = new ClientConfig(); clientConfig.connectorProvider(new ApacheConnectorProvider()); @@ -99,7 +135,7 @@ private org.apache.http.config.Registry getSchemeRegist } protected WebTarget getBaseResource() { - Preconditions.checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); + checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); return baseResource; } @@ -270,7 +306,7 @@ public EventsCmd.Exec createEventsCmdExec() { @Override public void close() throws IOException { - Preconditions.checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); + checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); client.close(); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index ffd757e93..ba15e995a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,10 +1,18 @@ package com.github.dockerjava.jaxrs; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; @@ -12,13 +20,6 @@ import com.github.dockerjava.api.command.EventCallback; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -import com.google.common.base.Preconditions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); @@ -54,8 +55,8 @@ private EventNotifier(EventCallback eventCallback, WebTarget webTarget) { } public static EventNotifier create(EventCallback eventCallback, WebTarget webTarget) { - Preconditions.checkNotNull(eventCallback, "An EventCallback must be provided"); - Preconditions.checkNotNull(webTarget, "An WebTarget must be provided"); + checkNotNull(eventCallback, "An EventCallback must be provided"); + checkNotNull(webTarget, "An WebTarget must be provided"); return new EventNotifier(eventCallback, webTarget); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 1fe38617c..84ede89b4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -1,20 +1,19 @@ package com.github.dockerjava.jaxrs; +import static com.github.dockerjava.jaxrs.util.guava.Guava.urlPathSegmentEscaper; + import java.util.List; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; -import com.google.common.net.UrlEscapers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; -import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; - public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { 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 7f7e06c73..42898008f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java @@ -1,6 +1,8 @@ package com.github.dockerjava.jaxrs.util; import java.io.IOException; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; @@ -8,8 +10,6 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import com.google.common.collect.ImmutableSet; - import org.glassfish.jersey.filter.LoggingFilter; /** @@ -21,10 +21,15 @@ */ public class SelectiveLoggingFilter extends LoggingFilter { - private static final Set SKIPPED_CONTENT = ImmutableSet.builder() - .add(MediaType.APPLICATION_OCTET_STREAM) - .add("application/tar") - .build(); + // Immutable'ish + private static final Set SKIPPED_CONTENT; + static { + Set s = new HashSet(); + s.add(MediaType.APPLICATION_OCTET_STREAM); + s.add("application/tar"); + SKIPPED_CONTENT = Collections.unmodifiableSet(s); + } + public SelectiveLoggingFilter(Logger logger, boolean b) { super(logger, b); diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java new file mode 100644 index 000000000..13f87142a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2008 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava.jaxrs.util.guava; + +public class Guava { + + static final String URL_PATH_OTHER_SAFE_CHARS_LACKING_PLUS = + "-._~" + // Unreserved characters. + "!$'()*,;&=" + // The subdelim characters (excluding '+'). + "@:"; // The gendelim characters permitted in paths. + + public static PercentEscaper urlPathSegmentEscaper() { + return URL_PATH_SEGMENT_ESCAPER; + } + + private static final PercentEscaper URL_PATH_SEGMENT_ESCAPER = + new PercentEscaper(URL_PATH_OTHER_SAFE_CHARS_LACKING_PLUS + "+", false); + + public static String join(String[] joins, String sep, boolean skipNulls) { + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < joins.length; i++) { + if(skipNulls && joins[i] == null) { + continue; + } + sb.append(joins[i]); + if(i < joins.length -1) { + sb.append(sep); + } + } + return sb.toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java new file mode 100644 index 000000000..b8c2b2711 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2008 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.github.dockerjava.jaxrs.util.guava; + +import com.github.dockerjava.Preconditions; + +/** + * A {@code UnicodeEscaper} that escapes some set of Java characters using a + * UTF-8 based percent encoding scheme. The set of safe characters (those which + * remain unescaped) can be specified on construction. + * + *

This class is primarily used for creating URI escapers in UrlEscapers + * but can be used directly if required. While URI escapers impose + * specific semantics on which characters are considered 'safe', this class has + * a minimal set of restrictions. + * + *

When escaping a String, the following rules apply: + *

    + *
  • All specified safe characters remain unchanged. + *
  • If {@code plusForSpace} was specified, the space character " " is + * converted into a plus sign {@code "+"}. + *
  • All other characters are converted into one or more bytes using UTF-8 + * encoding and each byte is then represented by the 3-character string + * "%XX", where "XX" is the two-digit, uppercase, hexadecimal representation + * of the byte value. + *
+ * + *

For performance reasons the only currently supported character encoding of + * this class is UTF-8. + * + *

Note: This escaper produces uppercase hexadecimal sequences. From + * RFC 3986:
+ * "URI producers and normalizers should use uppercase hexadecimal digits + * for all percent-encodings." + * + * @author David Beaumont + * @since 15.0 + */ +public final class PercentEscaper extends UnicodeEscaper { + + // In some escapers spaces are escaped to '+' + private static final char[] PLUS_SIGN = { '+' }; + + // Percent escapers output upper case hex digits (uri escapers require this). + private static final char[] UPPER_HEX_DIGITS = + "0123456789ABCDEF".toCharArray(); + + /** + * If true we should convert space to the {@code +} character. + */ + private final boolean plusForSpace; + + /** + * An array of flags where for any {@code char c} if {@code safeOctets[c]} is + * true then {@code c} should remain unmodified in the output. If + * {@code c > safeOctets.length} then it should be escaped. + */ + private final boolean[] safeOctets; + + /** + * Constructs a percent escaper with the specified safe characters and + * optional handling of the space character. + * + *

Not that it is allowed, but not necessarily desirable to specify {@code %} + * as a safe character. This has the effect of creating an escaper which has no + * well defined inverse but it can be useful when escaping additional characters. + * + * @param safeChars a non null string specifying additional safe characters + * for this escaper (the ranges 0..9, a..z and A..Z are always safe and + * should not be specified here) + * @param plusForSpace true if ASCII space should be escaped to {@code +} + * rather than {@code %20} + * @throws IllegalArgumentException if any of the parameters were invalid + */ + public PercentEscaper(String safeChars, boolean plusForSpace) { + // TODO(user): Switch to static factory methods for creation now that class is final. + // TODO(user): Support escapers where alphanumeric chars are not safe. + Preconditions.checkNotNull(safeChars); // eager for GWT. + // Avoid any misunderstandings about the behavior of this escaper + if (safeChars.matches(".*[0-9A-Za-z].*")) { + throw new IllegalArgumentException( + "Alphanumeric characters are always 'safe' and should not be " + + "explicitly specified"); + } + safeChars += "abcdefghijklmnopqrstuvwxyz" + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "0123456789"; + // Avoid ambiguous parameters. Safe characters are never modified so if + // space is a safe character then setting plusForSpace is meaningless. + if (plusForSpace && safeChars.contains(" ")) { + throw new IllegalArgumentException( + "plusForSpace cannot be specified when space is a 'safe' character"); + } + this.plusForSpace = plusForSpace; + this.safeOctets = createSafeOctets(safeChars); + } + + /** + * Creates a boolean array with entries corresponding to the character values + * specified in safeChars set to true. The array is as small as is required to + * hold the given character information. + */ + private static boolean[] createSafeOctets(String safeChars) { + int maxChar = -1; + char[] safeCharArray = safeChars.toCharArray(); + for (char c : safeCharArray) { + maxChar = Math.max(c, maxChar); + } + boolean[] octets = new boolean[maxChar + 1]; + for (char c : safeCharArray) { + octets[c] = true; + } + return octets; + } + + /* + * Overridden for performance. For unescaped strings this improved the + * performance of the uri escaper from ~760ns to ~400ns as measured by + * CharEscapersBenchmark. + */ + @Override + protected int nextEscapeIndex(CharSequence csq, int index, int end) { + Preconditions.checkNotNull(csq); + for (; index < end; index++) { + char c = csq.charAt(index); + if (c >= safeOctets.length || !safeOctets[c]) { + break; + } + } + return index; + } + + /* + * Overridden for performance. For unescaped strings this improved the + * performance of the uri escaper from ~400ns to ~170ns as measured by + * CharEscapersBenchmark. + */ + @Override + public String escape(String s) { + Preconditions.checkNotNull(s); + int slen = s.length(); + for (int index = 0; index < slen; index++) { + char c = s.charAt(index); + if (c >= safeOctets.length || !safeOctets[c]) { + return escapeSlow(s, index); + } + } + return s; + } + + /** + * Escapes the given Unicode code point in UTF-8. + */ + @Override + protected char[] escape(int cp) { + // We should never get negative values here but if we do it will throw an + // IndexOutOfBoundsException, so at least it will get spotted. + if (cp < safeOctets.length && safeOctets[cp]) { + return null; + } else if (cp == ' ' && plusForSpace) { + return PLUS_SIGN; + } else if (cp <= 0x7F) { + // Single byte UTF-8 characters + // Start with "%--" and fill in the blanks + char[] dest = new char[3]; + dest[0] = '%'; + dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; + dest[1] = UPPER_HEX_DIGITS[cp >>> 4]; + return dest; + } else if (cp <= 0x7ff) { + // Two byte UTF-8 characters [cp >= 0x80 && cp <= 0x7ff] + // Start with "%--%--" and fill in the blanks + char[] dest = new char[6]; + dest[0] = '%'; + dest[3] = '%'; + dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[1] = UPPER_HEX_DIGITS[0xC | cp]; + return dest; + } else if (cp <= 0xffff) { + // Three byte UTF-8 characters [cp >= 0x800 && cp <= 0xffff] + // Start with "%E-%--%--" and fill in the blanks + char[] dest = new char[9]; + dest[0] = '%'; + dest[1] = 'E'; + dest[3] = '%'; + dest[6] = '%'; + dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[2] = UPPER_HEX_DIGITS[cp]; + return dest; + } else if (cp <= 0x10ffff) { + char[] dest = new char[12]; + // Four byte UTF-8 characters [cp >= 0xffff && cp <= 0x10ffff] + // Start with "%F-%--%--%--" and fill in the blanks + dest[0] = '%'; + dest[1] = 'F'; + dest[3] = '%'; + dest[6] = '%'; + dest[9] = '%'; + dest[11] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[10] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[2] = UPPER_HEX_DIGITS[cp & 0x7]; + return dest; + } else { + // If this ever happens it is due to bug in UnicodeEscaper, not bad input. + throw new IllegalArgumentException( + "Invalid unicode character value " + cp); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java new file mode 100644 index 000000000..a58239484 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java @@ -0,0 +1,304 @@ +/* + * Copyright (C) 2008 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.github.dockerjava.jaxrs.util.guava; + + +import com.github.dockerjava.Preconditions; + +/** + * An Escaper that converts literal text into a format safe for + * inclusion in a particular context (such as an XML document). Typically (but + * not always), the inverse process of "unescaping" the text is performed + * automatically by the relevant parser. + * + *

For example, an XML escaper would convert the literal string {@code + * "Foo"} into {@code "Foo<Bar>"} to prevent {@code ""} from + * being confused with an XML tag. When the resulting XML document is parsed, + * the parser API will return this text as the original literal string {@code + * "Foo"}. + * + *

Note: This class is similar to CharEscaper but with one + * very important difference. A CharEscaper can only process Java + * UTF16 characters in + * isolation and may not cope when it encounters surrogate pairs. This class + * facilitates the correct escaping of all Unicode characters. + * + *

As there are important reasons, including potential security issues, to + * handle Unicode correctly if you are considering implementing a new escaper + * you should favor using UnicodeEscaper wherever possible. + * + *

A {@code UnicodeEscaper} instance is required to be stateless, and safe + * when used concurrently by multiple threads. + * + *

Several popular escapers are defined as constants in classes like + * com.google.common.html.HtmlEscapers, com.google.common.xml.XmlEscapers, + * and SourceCodeEscapers. To create + * your own escapers extend this class and implement the #escape(int) + * method. + * + * @author David Beaumont + * @since 15.0 + */ +public abstract class UnicodeEscaper { + /** The amount of padding (chars) to use when growing the escape buffer. */ + private static final int DEST_PAD = 32; + + /** Constructor for use by subclasses. */ + protected UnicodeEscaper() {} + + /** + * Returns the escaped form of the given Unicode code point, or {@code null} + * if this code point does not need to be escaped. When called as part of an + * escaping operation, the given code point is guaranteed to be in the range + * {@code 0 <= cp <= Character#MAX_CODE_POINT}. + * + *

If an empty array is returned, this effectively strips the input + * character from the resulting text. + * + *

If the character does not need to be escaped, this method should return + * {@code null}, rather than an array containing the character representation + * of the code point. This enables the escaping algorithm to perform more + * efficiently. + * + *

If the implementation of this method cannot correctly handle a + * particular code point then it should either throw an appropriate runtime + * exception or return a suitable replacement character. It must never + * silently discard invalid input as this may constitute a security risk. + * + * @param cp the Unicode code point to escape if necessary + * @return the replacement characters, or {@code null} if no escaping was + * needed + */ + protected abstract char[] escape(int cp); + + /** + * Scans a sub-sequence of characters from a given CharSequence, + * returning the index of the next character that requires escaping. + * + *

Note: When implementing an escaper, it is a good idea to override + * this method for efficiency. The base class implementation determines + * successive Unicode code points and invokes #escape(int) for each of + * them. If the semantics of your escaper are such that code points in the + * supplementary range are either all escaped or all unescaped, this method + * can be implemented more efficiently using CharSequence#charAt(int). + * + *

Note however that if your escaper does not escape characters in the + * supplementary range, you should either continue to validate the correctness + * of any surrogate characters encountered or provide a clear warning to users + * that your escaper does not validate its input. + * + *

See com.google.common.net.PercentEscaper for an example. + * + * @param csq a sequence of characters + * @param start the index of the first character to be scanned + * @param end the index immediately after the last character to be scanned + * @throws IllegalArgumentException if the scanned sub-sequence of {@code csq} + * contains invalid surrogate pairs + */ + protected int nextEscapeIndex(CharSequence csq, int start, int end) { + int index = start; + while (index < end) { + int cp = codePointAt(csq, index, end); + if (cp < 0 || escape(cp) != null) { + break; + } + index += Character.isSupplementaryCodePoint(cp) ? 2 : 1; + } + return index; + } + + /** + * Returns the escaped form of a given literal string. + * + *

If you are escaping input in arbitrary successive chunks, then it is not + * generally safe to use this method. If an input string ends with an + * unmatched high surrogate character, then this method will throw + * IllegalArgumentException. You should ensure your input is valid UTF-16 before calling this + * method. + * + *

Note: When implementing an escaper it is a good idea to override + * this method for efficiency by inlining the implementation of + * #nextEscapeIndex(CharSequence, int, int) directly. Doing this for + * com.google.common.net.PercentEscaper more than doubled the + * performance for unescaped strings (as measured by CharEscapersBenchmark}. + * + * @param string the literal string to be escaped + * @return the escaped form of {@code string} + * @throws NullPointerException if {@code string} is null + * @throws IllegalArgumentException if invalid surrogate characters are + * encountered + */ + public String escape(String string) { + Preconditions.checkNotNull(string); + int end = string.length(); + int index = nextEscapeIndex(string, 0, end); + return index == end ? string : escapeSlow(string, index); + } + + /** + * Returns the escaped form of a given literal string, starting at the given + * index. This method is called by the #escape(String) method when it + * discovers that escaping is required. It is protected to allow subclasses + * to override the fastpath escaping function to inline their escaping test. + * See CharEscaperBuilder for an example usage. + * + *

This method is not reentrant and may only be invoked by the top level + * #escape(String) method. + * + * @param s the literal string to be escaped + * @param index the index to start escaping from + * @return the escaped form of {@code string} + * @throws NullPointerException if {@code string} is null + * @throws IllegalArgumentException if invalid surrogate characters are + * encountered + */ + protected final String escapeSlow(String s, int index) { + int end = s.length(); + + // Get a destination buffer and setup some loop variables. + char[] dest = new char[1024]; + int destIndex = 0; + int unescapedChunkStart = 0; + + while (index < end) { + int cp = codePointAt(s, index, end); + if (cp < 0) { + throw new IllegalArgumentException( + "Trailing high surrogate at end of input"); + } + // It is possible for this to return null because nextEscapeIndex() may + // (for performance reasons) yield some false positives but it must never + // give false negatives. + char[] escaped = escape(cp); + int nextIndex = index + (Character.isSupplementaryCodePoint(cp) ? 2 : 1); + if (escaped != null) { + int charsSkipped = index - unescapedChunkStart; + + // This is the size needed to add the replacement, not the full + // size needed by the string. We only regrow when we absolutely must. + int sizeNeeded = destIndex + charsSkipped + escaped.length; + if (dest.length < sizeNeeded) { + int destLength = sizeNeeded + (end - index) + DEST_PAD; + dest = growBuffer(dest, destIndex, destLength); + } + // If we have skipped any characters, we need to copy them now. + if (charsSkipped > 0) { + s.getChars(unescapedChunkStart, index, dest, destIndex); + destIndex += charsSkipped; + } + if (escaped.length > 0) { + System.arraycopy(escaped, 0, dest, destIndex, escaped.length); + destIndex += escaped.length; + } + // If we dealt with an escaped character, reset the unescaped range. + unescapedChunkStart = nextIndex; + } + index = nextEscapeIndex(s, nextIndex, end); + } + + // Process trailing unescaped characters - no need to account for escaped + // length or padding the allocation. + int charsSkipped = end - unescapedChunkStart; + if (charsSkipped > 0) { + int endIndex = destIndex + charsSkipped; + if (dest.length < endIndex) { + dest = growBuffer(dest, destIndex, endIndex); + } + s.getChars(unescapedChunkStart, end, dest, destIndex); + destIndex = endIndex; + } + return new String(dest, 0, destIndex); + } + + /** + * Returns the Unicode code point of the character at the given index. + * + *

Unlike Character#codePointAt(CharSequence, int) or + * String#codePointAt(int) this method will never fail silently when + * encountering an invalid surrogate pair. + * + *

The behaviour of this method is as follows: + *

    + *
  1. If {@code index >= end}, IndexOutOfBoundsException is thrown. + *
  2. If the character at the specified index is not a surrogate, it is + * returned. + *
  3. If the first character was a high surrogate value, then an attempt is + * made to read the next character. + *
      + *
    1. If the end of the sequence was reached, the negated value of + * the trailing high surrogate is returned. + *
    2. If the next character was a valid low surrogate, the code point + * value of the high/low surrogate pair is returned. + *
    3. If the next character was not a low surrogate value, then + * IllegalArgumentException is thrown. + *
    + *
  4. If the first character was a low surrogate value, + * IllegalArgumentException is thrown. + *
+ * + * @param seq the sequence of characters from which to decode the code point + * @param index the index of the first character to decode + * @param end the index beyond the last valid character to decode + * @return the Unicode code point for the given index or the negated value of + * the trailing high surrogate character at the end of the sequence + */ + protected static int codePointAt(CharSequence seq, int index, int end) { + Preconditions.checkNotNull(seq); + if (index < end) { + char c1 = seq.charAt(index++); + if (c1 < Character.MIN_HIGH_SURROGATE || + c1 > Character.MAX_LOW_SURROGATE) { + // Fast path (first test is probably all we need to do) + return c1; + } else if (c1 <= Character.MAX_HIGH_SURROGATE) { + // If the high surrogate was the last character, return its inverse + if (index == end) { + return -c1; + } + // Otherwise look for the low surrogate following it + char c2 = seq.charAt(index); + if (Character.isLowSurrogate(c2)) { + return Character.toCodePoint(c1, c2); + } + throw new IllegalArgumentException( + "Expected low surrogate but got char '" + c2 + + "' with value " + (int) c2 + " at index " + index + + " in '" + seq + "'"); + } else { + throw new IllegalArgumentException( + "Unexpected low surrogate character '" + c1 + + "' with value " + (int) c1 + " at index " + (index - 1) + + " in '" + seq + "'"); + } + } + throw new IndexOutOfBoundsException("Index exceeds specified range"); + } + + /** + * Helper method to grow the character buffer as needed, this only happens + * once in a while so it's ok if it's in a method call. If the index passed + * in is 0 then no copying will be done. + */ + private static char[] growBuffer(char[] dest, int index, int size) { + char[] copy = new char[size]; + if (index > 0) { + System.arraycopy(dest, 0, copy, 0, index); + } + return copy; + } +}