Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.util.List;
import java.util.Map;

import javax.annotation.CheckForNull;
Expand Down Expand Up @@ -34,10 +35,18 @@ public interface BuildImageCmd extends AsyncDockerCmd<BuildImageCmd, BuildRespon

/**
* "t" in API
* @deprecated use {@link #getTags()}
*/
@CheckForNull
@Deprecated
String getTag();

/**
* Multple "t" tags.
*/
@CheckForNull
List<String> getTags();

/**
* "remote" in API
*/
Expand Down Expand Up @@ -109,8 +118,14 @@ public interface BuildImageCmd extends AsyncDockerCmd<BuildImageCmd, BuildRespon

// setters

/**
* @deprecated use #withTags()
*/
@Deprecated
BuildImageCmd withTag(String tag);

BuildImageCmd withTags(List<String> tags);

BuildImageCmd withRemote(URI remote);

BuildImageCmd withBaseDirectory(File baseDirectory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.io.InputStream;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.github.dockerjava.api.command.BuildImageCmd;
Expand All @@ -15,6 +16,8 @@
import com.github.dockerjava.core.dockerfile.Dockerfile;
import com.github.dockerjava.core.util.FilePathUtil;

import javax.annotation.CheckForNull;

/**
*
* Build an image from Dockerfile.
Expand All @@ -24,8 +27,11 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd<BuildImageCmd, BuildR

private InputStream tarInputStream;

@Deprecated
private String tag;

private List<String> tags;

private Boolean noCache;

private Boolean remove = true;
Expand Down Expand Up @@ -82,11 +88,17 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) {

// getters API

@Deprecated
@Override
public String getTag() {
return tag;
}

@CheckForNull
public List<String> getTags() {
return tags;
}

@Override
public URI getRemote() {
return remote;
Expand Down Expand Up @@ -178,13 +190,23 @@ public Long getShmsize() {

// setters

/**
* @deprecated use #withTags()
*/
@Deprecated
@Override
public BuildImageCmdImpl withTag(String tag) {
checkNotNull(tag, "Tag is null");
this.tag = tag;
return this;
}

@Override
public BuildImageCmdImpl withTags(List<String> tags) {
this.tags = tags;
return this;
}

@Override
public BuildImageCmd withRemote(URI remote) {
this.remote = remote;
Expand Down
82 changes: 74 additions & 8 deletions src/main/java/com/github/dockerjava/netty/WebTarget.java
Original file line number Diff line number Diff line change
@@ -1,41 +1,56 @@
package com.github.dockerjava.netty;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.handler.codec.http.HttpConstants;
import org.apache.commons.lang.StringUtils;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

/**
* This class is basically a replacement of javax.ws.rs.client.WebTarget to allow simpler migration of JAX-RS code to a netty based
* This class is basically a replacement of {@link javax.ws.rs.client.WebTarget} to allow simpler migration of JAX-RS code to a netty based
* implementation.
*
* @author Marcus Linke
*/
public class WebTarget {
private static final ObjectMapper MAPPER = new ObjectMapper();

private final ChannelProvider channelProvider;

private final ImmutableList<String> path;

private final ImmutableMap<String, String> queryParams;
/**
* Multiple values for the same name param.
*/
private final ImmutableMap<String, List<String>> queryParamsList;

private static final String PATH_SEPARATOR = "/";

public WebTarget(ChannelProvider channelProvider) {
this(channelProvider, ImmutableList.<String>of(), ImmutableMap.<String, String>of());
this(channelProvider, ImmutableList.<String>of(), ImmutableMap.<String, String>of(),
ImmutableMap.<String, List<String>>of());
}

private WebTarget(ChannelProvider channelProvider,
ImmutableList<String> path,
ImmutableMap<String, String> queryParams) {
ImmutableMap<String, String> queryParams,
ImmutableMap<String, List<String>> queryParamsList) {
this.channelProvider = channelProvider;
this.path = path;
this.queryParams = queryParams;
this.queryParamsList = queryParamsList;
}

public WebTarget path(String... components) {
Expand All @@ -45,15 +60,21 @@ public WebTarget path(String... components) {
newPath.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR)));
}

return new WebTarget(channelProvider, newPath.build(), queryParams);
return new WebTarget(channelProvider, newPath.build(), queryParams, queryParamsList);
}

public InvocationBuilder request() {
String resource = PATH_SEPARATOR + StringUtils.join(path, PATH_SEPARATOR);

List<String> params = new ArrayList<>();
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
params.add(entry.getKey() + "=" + entry.getValue());
params.add(entry.getKey() + "=" + encodeComponent(entry.getValue(), HttpConstants.DEFAULT_CHARSET));
}

for (Map.Entry<String, List<String>> entry : queryParamsList.entrySet()) {
for (String entryValueValue : entry.getValue()) {
params.add(entry.getKey() + "=" + encodeComponent(entryValueValue, HttpConstants.DEFAULT_CHARSET));
}
}

if (!params.isEmpty()) {
Expand All @@ -63,21 +84,58 @@ public InvocationBuilder request() {
return new InvocationBuilder(channelProvider, resource);
}

/**
* @see io.netty.handler.codec.http.QueryStringEncoder
*/
private static String encodeComponent(String s, Charset charset) {
// TODO: Optimize me.
try {
return URLEncoder.encode(s, charset.name()).replace("+", "%20");
} catch (UnsupportedEncodingException ignored) {
throw new UnsupportedCharsetException(charset.name());
}
}

public WebTarget resolveTemplate(String name, Object value) {
ImmutableList.Builder<String> newPath = ImmutableList.builder();
for (String component : path) {
component = component.replaceAll("\\{" + name + "\\}", value.toString());
newPath.add(component);
}
return new WebTarget(channelProvider, newPath.build(), queryParams);
return new WebTarget(channelProvider, newPath.build(), queryParams, queryParamsList);
}

public WebTarget queryParam(String name, Object value) {
ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String>builder().putAll(queryParams);
if (value != null) {
builder.put(name, value.toString());
}
return new WebTarget(channelProvider, path, builder.build());
return new WebTarget(channelProvider, path, builder.build(), queryParamsList);
}

public WebTarget queryParamsList(String name, List<?> values) {
ImmutableMap.Builder<String, List<String>> builder = ImmutableMap.<String, List<String>>builder().putAll(queryParamsList);
if (values != null) {
ImmutableList.Builder<String> valueBuilder = ImmutableList.builder();
for (Object value : values) {
valueBuilder.add(value.toString());
}
builder.put(name, valueBuilder.build());
}
return new WebTarget(channelProvider, path, queryParams, builder.build());
}

public WebTarget queryParamsJsonMap(String name, Map<String, String> values) {
if (values != null && !values.isEmpty()) {
try {
// when param value is JSON string
return queryParam(name, MAPPER.writeValueAsString(values));
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
return this;
}
}

@Override
Expand All @@ -97,14 +155,22 @@ public boolean equals(Object o) {
if (path != null ? !path.equals(webTarget.path) : webTarget.path != null) {
return false;
}
return queryParams != null ? queryParams.equals(webTarget.queryParams) : webTarget.queryParams == null;
if (queryParams != null ? !queryParams.equals(webTarget.queryParams) : webTarget.queryParams != null) {
return false;
}
if (queryParamsList != null ? !queryParamsList.equals(webTarget.queryParamsList) : webTarget.queryParamsList != null) {
return false;
}

return true;
}

@Override
public int hashCode() {
int result = channelProvider != null ? channelProvider.hashCode() : 0;
result = 31 * result + (path != null ? path.hashCode() : 0);
result = 31 * result + (queryParams != null ? queryParams.hashCode() : 0);
result = 31 * result + (queryParamsList != null ? queryParamsList.hashCode() : 0);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec<BuildImageCmd, Bu
BuildImageCmd.Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class);

private static final ObjectMapper MAPPER = new ObjectMapper();

public BuildImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}
Expand Down Expand Up @@ -58,6 +56,9 @@ protected Void execute0(BuildImageCmd command, ResultCallback<BuildResponseItem>
if (command.getTag() != null) {
webTarget = webTarget.queryParam("t", command.getTag());
}
if (command.getTags() != null) {
webTarget = webTarget.queryParamsList("t", command.getTags());
}
if (command.getRemote() != null) {
webTarget = webTarget.queryParam("remote", command.getRemote().toString());
}
Expand Down Expand Up @@ -86,13 +87,17 @@ protected Void execute0(BuildImageCmd command, ResultCallback<BuildResponseItem>
webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus());
}

webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs());
if (command.getBuildArgs() != null) {
webTarget = webTarget.queryParamsJsonMap("buildargs", command.getBuildArgs());
}

if (command.getShmsize() != null) {
webTarget = webTarget.queryParam("shmsize", command.getShmsize());
}

webTarget = writeMap(webTarget, "labels", command.getLabels());
if (command.getLabels() != null) {
webTarget = webTarget.queryParamsJsonMap("labels", command.getLabels());
}

LOGGER.trace("POST: {}", webTarget);

Expand All @@ -106,16 +111,4 @@ protected Void execute0(BuildImageCmd command, ResultCallback<BuildResponseItem>

return null;
}

private WebTarget writeMap(WebTarget webTarget, String name, Map<String, String> value) {
if (value != null && !value.isEmpty()) {
try {
return webTarget.queryParam(name, MAPPER.writeValueAsString(value));
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
return webTarget;
}
}
}