JCLOUDS-750 AutoValue all Docker value types.

Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/6cfb4351
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/6cfb4351
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/6cfb4351

Branch: refs/heads/1.8.x
Commit: 6cfb43514637ecfda2697399ca03c44bab9205a7
Parents: d536bd3
Author: Adrian Cole <[email protected]>
Authored: Sun Oct 26 12:28:39 2014 -0700
Committer: Adrian Cole <[email protected]>
Committed: Tue Oct 28 08:24:09 2014 -0700

----------------------------------------------------------------------
 docker/pom.xml                                  |   7 +-
 .../functions/ContainerToNodeMetadata.java      |  31 +-
 .../docker/compute/functions/ImageToImage.java  |   8 +-
 .../docker/compute/functions/StateToStatus.java |   2 +-
 .../strategy/DockerComputeServiceAdapter.java   |  28 +-
 .../docker/config/DockerParserModule.java       |  58 ++--
 .../java/org/jclouds/docker/domain/Config.java  | 311 ++++---------------
 .../org/jclouds/docker/domain/Container.java    | 265 +++-------------
 .../org/jclouds/docker/domain/ExposedPorts.java |  91 +-----
 .../org/jclouds/docker/domain/HostConfig.java   | 153 ++-------
 .../java/org/jclouds/docker/domain/Image.java   | 226 ++------------
 .../jclouds/docker/domain/NetworkSettings.java  | 109 ++-----
 .../java/org/jclouds/docker/domain/Port.java    |  73 +----
 .../java/org/jclouds/docker/domain/State.java   | 152 +--------
 .../java/org/jclouds/docker/domain/Version.java | 152 +--------
 .../jclouds/docker/internal/NullSafeCopies.java |  39 +++
 .../DockerComputeServiceAdapterLiveTest.java    |   4 +-
 .../functions/ContainerToNodeMetadataTest.java  |  38 +--
 .../compute/functions/ImageToImageTest.java     |  28 +-
 .../compute/functions/StateToStatusTest.java    |   8 +-
 .../docker/config/DockerParserModuleTest.java   |  45 +--
 .../docker/features/RemoteApiLiveTest.java      |  24 +-
 .../docker/features/RemoteApiMockTest.java      |  16 +-
 23 files changed, 418 insertions(+), 1450 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/pom.xml
----------------------------------------------------------------------
diff --git a/docker/pom.xml b/docker/pom.xml
index a35debb..f506ef5 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -62,7 +62,12 @@
       <artifactId>commons-compress</artifactId>
       <version>1.5</version>
     </dependency>
-
+    <dependency>
+      <groupId>com.google.auto.value</groupId>
+      <artifactId>auto-value</artifactId>
+      <version>1.0-rc2</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.jclouds.driver</groupId>
       <artifactId>jclouds-sshj</artifactId>

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
 
b/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
index 3ec7f5c..7b070fb 100644
--- 
a/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
+++ 
b/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
@@ -76,26 +76,25 @@ public class ContainerToNodeMetadata implements 
Function<Container, NodeMetadata
 
    @Override
    public NodeMetadata apply(Container container) {
-      String name = cleanUpName(container.getName());
+      String name = cleanUpName(container.name());
       String group = nodeNamingConvention.extractGroup(name);
       NodeMetadataBuilder builder = new NodeMetadataBuilder();
-      builder.ids(container.getId())
+      builder.ids(container.id())
               .name(name)
               .group(group)
-              .hostname(container.getContainerConfig().getHostname())
+              .hostname(container.config().hostname())
                // TODO Set up hardware
               .hardware(new HardwareBuilder()
                       .id("")
-                      .ram(container.getContainerConfig().getMemory())
-                      .processor(new 
Processor(container.getContainerConfig().getCpuShares(), 
container.getContainerConfig().getCpuShares()))
+                      .ram(container.config().memory())
+                      .processor(new Processor(container.config().cpuShares(), 
container.config().cpuShares()))
                       .build());
-      builder.status(toPortableStatus.apply(container.getState()));
-      builder.imageId(container.getImage());
+      builder.status(toPortableStatus.apply(container.state()));
       builder.loginPort(getLoginPort(container));
       builder.publicAddresses(getPublicIpAddresses());
       builder.privateAddresses(getPrivateIpAddresses(container));
       builder.location(Iterables.getOnlyElement(locations.get()));
-      String imageId = container.getImage();
+      String imageId = container.image();
       builder.imageId(imageId);
       if (images.get().containsKey(imageId)) {
           Image image = images.get().get(imageId);
@@ -110,8 +109,8 @@ public class ContainerToNodeMetadata implements 
Function<Container, NodeMetadata
    }
 
    private Iterable<String> getPrivateIpAddresses(Container container) {
-      if (container.getNetworkSettings() == null) return ImmutableList.of();
-      return ImmutableList.of(container.getNetworkSettings().getIpAddress());
+      if (container.networkSettings() == null) return ImmutableList.of();
+      return ImmutableList.of(container.networkSettings().ipAddress());
    }
 
    private List<String> getPublicIpAddresses() {
@@ -120,16 +119,16 @@ public class ContainerToNodeMetadata implements 
Function<Container, NodeMetadata
    }
 
    protected static int getLoginPort(Container container) {
-      if (container.getNetworkSettings() != null) {
-          Map<String, List<Map<String, String>>> ports = 
container.getNetworkSettings().getPorts();
+      if (container.networkSettings() != null) {
+          Map<String, List<Map<String, String>>> ports = 
container.networkSettings().ports();
           if (ports != null && ports.containsKey("22/tcp")) {
             return 
Integer.parseInt(getOnlyElement(ports.get("22/tcp")).get("HostPort"));
           }
       // this is needed in case the container list is coming from 
listContainers
-      } else if (container.getPorts() != null) {
-         for (Port port : container.getPorts()) {
-            if (port.getPrivatePort() == 22) {
-               return port.getPublicPort();
+      } else if (container.ports() != null) {
+         for (Port port : container.ports()) {
+            if (port.privatePort() == 22) {
+               return port.publicPort();
             }
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/compute/functions/ImageToImage.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/compute/functions/ImageToImage.java 
b/docker/src/main/java/org/jclouds/docker/compute/functions/ImageToImage.java
index 4e3358d..551c441 100644
--- 
a/docker/src/main/java/org/jclouds/docker/compute/functions/ImageToImage.java
+++ 
b/docker/src/main/java/org/jclouds/docker/compute/functions/ImageToImage.java
@@ -44,7 +44,7 @@ public class ImageToImage implements 
Function<org.jclouds.docker.domain.Image, o
    @Override
    public Image apply(org.jclouds.docker.domain.Image from) {
       checkNotNull(from, "image");
-      String description = checkNotNull(Iterables.getFirst(from.getRepoTags(), 
"image must have at least one repo tag"));
+      String description = checkNotNull(Iterables.getFirst(from.repoTags(), 
"image must have at least one repo tag"));
 
       OsFamily osFamily = osFamily().apply(description);
       String osVersion = parseVersion(description);
@@ -57,7 +57,7 @@ public class ImageToImage implements 
Function<org.jclouds.docker.domain.Image, o
               .build();
 
       return new ImageBuilder()
-              .ids(from.getId())
+              .ids(from.id())
               .name(get(Splitter.on(":").split(description), 0))
               .description(description)
               .operatingSystem(os)
@@ -66,8 +66,8 @@ public class ImageToImage implements 
Function<org.jclouds.docker.domain.Image, o
    }
 
    private boolean is64bit(org.jclouds.docker.domain.Image inspectedImage) {
-      if (inspectedImage.getArchitecture() == null) return true;
-      return inspectedImage.getArchitecture().matches("x86_64|amd64");
+      if (inspectedImage.architecture() == null) return true;
+      return inspectedImage.architecture().matches("x86_64|amd64");
    }
 
    /**

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/compute/functions/StateToStatus.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/compute/functions/StateToStatus.java 
b/docker/src/main/java/org/jclouds/docker/compute/functions/StateToStatus.java
index 2d87384..ef9f616 100644
--- 
a/docker/src/main/java/org/jclouds/docker/compute/functions/StateToStatus.java
+++ 
b/docker/src/main/java/org/jclouds/docker/compute/functions/StateToStatus.java
@@ -32,7 +32,7 @@ public class StateToStatus implements Function<State, Status> 
{
    @Override
    public Status apply(final State state) {
       if (state == null) return Status.UNRECOGNIZED;
-      return state.isRunning() ? Status.RUNNING : Status.TERMINATED;
+      return state.running() ? Status.RUNNING : Status.TERMINATED;
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
 
b/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
index d1c1260..fa83ffc 100644
--- 
a/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
+++ 
b/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
@@ -89,7 +89,7 @@ public class DockerComputeServiceAdapter implements
       }
 
       Config.Builder containerConfigBuilder = Config.builder()
-              .imageId(imageId)
+              .image(imageId)
               .exposedPorts(exposedPorts);
 
       if (templateOptions.getCommands().isPresent()) {
@@ -123,7 +123,7 @@ public class DockerComputeServiceAdapter implements
 
       logger.debug(">> creating new container with containerConfig(%s)", 
containerConfig);
       Container container = api.getRemoteApi().createContainer(name, 
containerConfig);
-      logger.trace("<< container(%s)", container.getId());
+      logger.trace("<< container(%s)", container.id());
 
       HostConfig.Builder hostConfigBuilder = HostConfig.builder()
               .publishAllPorts(true)
@@ -140,13 +140,13 @@ public class DockerComputeServiceAdapter implements
       }
       HostConfig hostConfig = hostConfigBuilder.build();
 
-      api.getRemoteApi().startContainer(container.getId(), hostConfig);
-      container = api.getRemoteApi().inspectContainer(container.getId());
-      if (container.getState().getExitCode() != 0) {
-         destroyNode(container.getId());
-         throw new IllegalStateException(String.format("Container %s has not 
started correctly", container.getId()));
+      api.getRemoteApi().startContainer(container.id(), hostConfig);
+      container = api.getRemoteApi().inspectContainer(container.id());
+      if (container.state().exitCode() != 0) {
+         destroyNode(container.id());
+         throw new IllegalStateException(String.format("Container %s has not 
started correctly", container.id()));
       }
-      return new NodeAndInitialCredentials<Container>(container, 
container.getId(),
+      return new NodeAndInitialCredentials<Container>(container, 
container.id(),
               
LoginCredentials.builder().user(loginUser).password(loginUserPassword).build());
    }
 
@@ -166,9 +166,11 @@ public class DockerComputeServiceAdapter implements
       Set<Image> images = Sets.newHashSet();
       for (Image image : api.getRemoteApi().listImages()) {
          // less efficient than just listImages but returns richer json that 
needs repoTags coming from listImages
-         Image inspected = api.getRemoteApi().inspectImage(image.getId());
-         if (inspected.getRepoTags().isEmpty()) {
-            inspected = 
Image.builder().fromImage(inspected).repoTags(image.getRepoTags()).build();
+         Image inspected = api.getRemoteApi().inspectImage(image.id());
+         if (inspected.repoTags().isEmpty()) {
+            inspected = Image.create(inspected.id(), inspected.parent(), 
inspected.created(), inspected.container(),
+                  inspected.dockerVersion(), inspected.architecture(), 
inspected.os(), inspected.size(),
+                  inspected.virtualSize(), image.repoTags());
          }
          images.add(inspected);
       }
@@ -182,7 +184,7 @@ public class DockerComputeServiceAdapter implements
 
          @Override
          public boolean apply(Image input) {
-            return input.getId().equals(imageId);
+            return input.id().equals(imageId);
          }
       }, null);
    }
@@ -192,7 +194,7 @@ public class DockerComputeServiceAdapter implements
       Set<Container> containers = Sets.newHashSet();
       for (Container container : 
api.getRemoteApi().listContainers(ListContainerOptions.Builder.all(true))) {
          // less efficient than just listNodes but returns richer json
-         
containers.add(api.getRemoteApi().inspectContainer(container.getId()));
+         containers.add(api.getRemoteApi().inspectContainer(container.id()));
       }
       return containers;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/config/DockerParserModule.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/config/DockerParserModule.java 
b/docker/src/main/java/org/jclouds/docker/config/DockerParserModule.java
index 533184f..ea777a4 100644
--- a/docker/src/main/java/org/jclouds/docker/config/DockerParserModule.java
+++ b/docker/src/main/java/org/jclouds/docker/config/DockerParserModule.java
@@ -16,47 +16,35 @@
  */
 package org.jclouds.docker.config;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonDeserializationContext;
-import com.google.gson.JsonDeserializer;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParseException;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import org.jclouds.docker.domain.Container;
+import java.lang.reflect.Field;
+
 import org.jclouds.json.config.GsonModule;
 
-import javax.inject.Singleton;
-import java.lang.reflect.Type;
-import java.util.Map;
+import com.google.gson.FieldNamingPolicy;
+import com.google.gson.FieldNamingStrategy;
+import com.google.inject.AbstractModule;
 
 public class DockerParserModule extends AbstractModule {
-
-   @Override
-   protected void configure() {
+   @Override protected void configure() {
+      bind(FieldNamingStrategy.class).toInstance(FIELD_NAMING_STRATEGY);
       
bind(GsonModule.DateAdapter.class).to(GsonModule.Iso8601DateAdapter.class);
    }
 
-   @Provides
-   @Singleton
-   public Map<Type, Object> provideCustomAdapterBindings() {
-      return new ImmutableMap.Builder<Type, Object>()
-              .put(Container.class, new ContainerTypeAdapter())
-              .build();
-   }
-
-   protected static class ContainerTypeAdapter implements 
JsonDeserializer<Container> {
-
-      @Override
-      public Container deserialize(JsonElement json, Type typeOfT, 
JsonDeserializationContext context) throws
-              JsonParseException {
-         Gson gson = new GsonBuilder().serializeNulls().create();
-         final JsonObject jsonObject = json.getAsJsonObject();
-         return gson.fromJson(jsonObject, Container.class);
+   /** When serializing, Most fields are UpperCamelCase, with some exceptions. 
*/
+   private static final FieldNamingStrategy FIELD_NAMING_STRATEGY = new 
FieldNamingStrategy() {
+      private final FieldNamingStrategy delegate = 
FieldNamingPolicy.UPPER_CAMEL_CASE;
+
+      @Override public String translateName(Field f) {
+         String result = delegate.translateName(f);
+         // IP not Ip as code wins over docs 
https://github.com/docker/docker/blob/master/daemon/network_settings.go
+         if (result.equals("IpAddress")) {
+            return "IPAddress";
+         } else if (result.equals("IpPrefixLen")) {
+            return "IPPrefixLen";
+         } else if (result.equals("Ip")) {
+            return "IP";
+         }
+         return result;
       }
-   }
-
+   };
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/Config.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Config.java 
b/docker/src/main/java/org/jclouds/docker/domain/Config.java
index f5190fa..396ab2f 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Config.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Config.java
@@ -17,260 +17,78 @@
 package org.jclouds.docker.domain;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
 
-import java.beans.ConstructorProperties;
 import java.util.List;
 import java.util.Map;
 
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
+import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.gson.annotations.SerializedName;
-
-public class Config {
-
-   @SerializedName("Hostname")
-   private final String hostname;
-   @SerializedName("Domainname")
-   private final String domainName;
-   @SerializedName("User")
-   private final String user;
-   @SerializedName("Memory")
-   private final int memory;
-   @SerializedName("MemorySwap")
-   private final int memorySwap;
-   @SerializedName("CpuShares")
-   private final int cpuShares;
-   @SerializedName("AttachStdin")
-   private final boolean attachStdin;
-   @SerializedName("AttachStdout")
-   private final boolean attachStdout;
-   @SerializedName("AttachStderr")
-   private final boolean attachStderr;
-   @SerializedName("ExposedPorts")
-   private final Map<String, ?> exposedPorts;
-   @SerializedName("Tty")
-   private final boolean tty;
-   @SerializedName("OpenStdin")
-   private final boolean openStdin;
-   @SerializedName("StdinOnce")
-   private final boolean stdinOnce;
-   @SerializedName("Env")
-   private final List<String> env;
-   @SerializedName("Cmd")
-   private final List<String> cmd;
-   @SerializedName("Dns")
-   private final List<String> dns;
-   @SerializedName("Image")
-   private final String imageId;
-   @SerializedName("Volumes")
-   private final Map<String, ?> volumes;
-   @SerializedName("VolumesFrom")
-   private final String volumesFrom;
-   @SerializedName("WorkingDir")
-   private final String workingDir;
-   @SerializedName("Entrypoint")
-   private final List<String> entrypoint;
-   @SerializedName("NetworkDisabled")
-   private final boolean networkDisabled;
-   @SerializedName("OnBuild")
-   private final List<String> onBuild;
-
-
-   @ConstructorProperties({ "Hostname", "Domainname", "User", "Memory", 
"MemorySwap", "CpuShares", "AttachStdin",
-           "AttachStdout", "AttachStderr", "ExposedPorts", "Tty", "OpenStdin", 
"StdinOnce", "Env", "Cmd",
-           "Dns", "Image", "Volumes", "VolumesFrom", "WorkingDir", 
"Entrypoint", "NetworkDisabled", "OnBuild" })
-   protected Config(@Nullable String hostname, @Nullable String domainName, 
@Nullable String user,
-                             int memory, int memorySwap, int cpuShares, 
boolean attachStdin, boolean attachStdout,
-                             boolean attachStderr, Map<String, ?> 
exposedPorts, boolean tty, boolean openStdin,
-                             boolean stdinOnce, @Nullable List<String> env, 
@Nullable List<String> cmd,
-                             @Nullable List<String> dns, String imageId, 
@Nullable Map<String, ?> volumes,
-                             @Nullable String volumesFrom, @Nullable String 
workingDir, @Nullable List<String> entrypoint,
-                             @Nullable boolean networkDisabled, @Nullable 
List<String> onBuild) {
-      this.hostname = hostname;
-      this.domainName = domainName;
-      this.user = user;
-      this.memory = checkNotNull(memory, "memory");
-      this.memorySwap = checkNotNull(memorySwap, "memorySwap");
-      this.cpuShares = checkNotNull(cpuShares, "cpuShares");
-      this.attachStdin = checkNotNull(attachStdin, "attachStdin");
-      this.attachStdout = checkNotNull(attachStdout, "attachStdout");
-      this.attachStderr = checkNotNull(attachStderr, "attachStderr");
-      this.exposedPorts = exposedPorts != null ? 
ImmutableMap.copyOf(exposedPorts) : ImmutableMap.<String, Object> of();
-      this.tty = checkNotNull(tty, "tty");
-      this.openStdin = checkNotNull(openStdin, "openStdin");
-      this.stdinOnce = checkNotNull(stdinOnce, "stdinOnce");
-      this.env = env != null ? ImmutableList.copyOf(env) : 
ImmutableList.<String> of();
-      this.cmd = cmd != null ? ImmutableList.copyOf(cmd) : 
ImmutableList.<String> of();
-      this.dns = dns != null ? ImmutableList.copyOf(dns) : 
ImmutableList.<String> of();
-      this.imageId = checkNotNull(imageId, "imageId");
-      this.volumes = volumes != null ? ImmutableMap.copyOf(volumes) : 
ImmutableMap.<String, Object> of();
-      this.volumesFrom = volumesFrom;
-      this.workingDir = workingDir;
-      this.entrypoint = entrypoint;
-      this.networkDisabled = networkDisabled;
-      this.onBuild = onBuild != null ? ImmutableList.copyOf(onBuild) : 
ImmutableList.<String> of();
-   }
-
-   public String getHostname() {
-      return hostname;
-   }
 
-   public String getDomainName() {
-      return domainName;
-   }
+@AutoValue
+public abstract class Config {
+   @Nullable public abstract String hostname();
 
-   public String getUser() {
-      return user;
-   }
-
-   public int getMemory() {
-      return memory;
-   }
+   @Nullable public abstract String domainname();
 
-   public int getMemorySwap() {
-      return memorySwap;
-   }
+   @Nullable public abstract String user();
 
-   public int getCpuShares() {
-      return cpuShares;
-   }
+   public abstract int memory();
 
-   public boolean isAttachStdin() {
-      return attachStdin;
-   }
+   public abstract int memorySwap();
 
-   public boolean isAttachStdout() {
-      return attachStdout;
-   }
+   public abstract int cpuShares();
 
-   public boolean isAttachStderr() {
-      return attachStderr;
-   }
+   public abstract boolean attachStdin();
 
-   public Map<String, ?> getExposedPorts() {
-      return exposedPorts;
-   }
+   public abstract boolean attachStdout();
 
-   public boolean isTty() {
-      return tty;
-   }
+   public abstract boolean attachStderr();
 
-   public boolean isOpenStdin() {
-      return openStdin;
-   }
+   public abstract Map<String, ?> exposedPorts();
 
-   public boolean isStdinOnce() {
-      return stdinOnce;
-   }
+   public abstract boolean tty();
 
-   public List<String> getEnv() {
-      return env;
-   }
+   public abstract boolean openStdin();
 
-   public List<String> getCmd() {
-      return cmd;
-   }
+   public abstract boolean stdinOnce();
 
-   public List<String> getDns() {
-      return dns;
-   }
+   public abstract List<String> env();
 
-   public String getImageId() {
-      return imageId;
-   }
+   public abstract List<String> cmd();
 
-   public Map<String, ?> getVolumes() {
-      return volumes;
-   }
+   public abstract List<String> dns();
 
-   public String getVolumesFrom() {
-      return volumesFrom;
-   }
+   public abstract String image();
 
-   public String getWorkingDir() {
-      return workingDir;
-   }
+   public abstract Map<String, ?> volumes();
 
-   public List<String> getEntrypoint() {
-      return entrypoint;
-   }
+   @Nullable public abstract String volumesFrom();
 
-   public boolean isNetworkDisabled() {
-      return networkDisabled;
-   }
+   @Nullable public abstract String workingDir();
 
-   public List<String> getOnBuild() {
-      return onBuild;
-   }
+   public abstract List<String> entrypoint();
 
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      Config that = (Config) o;
-
-      return Objects.equal(this.hostname, that.hostname) &&
-              Objects.equal(this.domainName, that.domainName) &&
-              Objects.equal(this.user, that.user) &&
-              Objects.equal(this.memory, that.memory) &&
-              Objects.equal(this.memorySwap, that.memorySwap) &&
-              Objects.equal(this.cpuShares, that.cpuShares) &&
-              Objects.equal(this.attachStdin, that.attachStdin) &&
-              Objects.equal(this.attachStdout, that.attachStdout) &&
-              Objects.equal(this.attachStderr, that.attachStderr) &&
-              Objects.equal(this.exposedPorts, that.exposedPorts) &&
-              Objects.equal(this.tty, that.tty) &&
-              Objects.equal(this.openStdin, that.openStdin) &&
-              Objects.equal(this.stdinOnce, that.stdinOnce) &&
-              Objects.equal(this.env, that.env) &&
-              Objects.equal(this.cmd, that.cmd) &&
-              Objects.equal(this.dns, that.dns) &&
-              Objects.equal(this.imageId, that.imageId) &&
-              Objects.equal(this.volumes, that.volumes) &&
-              Objects.equal(this.volumesFrom, that.volumesFrom) &&
-              Objects.equal(this.workingDir, that.workingDir) &&
-              Objects.equal(this.entrypoint, that.entrypoint) &&
-              Objects.equal(this.onBuild, that.onBuild);
-   }
+   public abstract boolean networkDisabled();
 
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(hostname, domainName, user, memory, memorySwap, 
cpuShares, attachStdin, attachStdout,
-              attachStderr, exposedPorts, tty, openStdin, stdinOnce, env, cmd, 
dns, imageId, volumes,
-              volumesFrom, workingDir, entrypoint, networkDisabled, onBuild);
-   }
+   public abstract List<String> onBuild();
 
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("hostname", hostname)
-              .add("domainName", domainName)
-              .add("user", user)
-              .add("memory", memory)
-              .add("memorySwap", memorySwap)
-              .add("cpuShares", cpuShares)
-              .add("attachStdin", attachStdin)
-              .add("attachStdout", attachStdout)
-              .add("attachStderr", attachStderr)
-              .add("exposedPorts", exposedPorts)
-              .add("tty", tty)
-              .add("openStdin", openStdin)
-              .add("stdinOnce", stdinOnce)
-              .add("env", env)
-              .add("cmd", cmd)
-              .add("dns", dns)
-              .add("imageId", imageId)
-              .add("volumes", volumes)
-              .add("volumesFrom", volumesFrom)
-              .add("workingDir", workingDir)
-              .add("entrypoint", entrypoint)
-              .add("networkDisabled", networkDisabled)
-              .add("onBuild", onBuild)
-              .toString();
+   @SerializedNames(
+         { "Hostname", "Domainname", "User", "Memory", "MemorySwap", 
"CpuShares", "AttachStdin", "AttachStdout",
+               "AttachStderr", "ExposedPorts", "Tty", "OpenStdin", 
"StdinOnce", "Env", "Cmd", "Dns", "Image", "Volumes",
+               "VolumesFrom", "WorkingDir", "Entrypoint", "NetworkDisabled", 
"OnBuild" })
+   public static Config create(String hostname, String domainname, String 
user, int memory, int memorySwap,
+         int cpuShares, boolean attachStdin, boolean attachStdout, boolean 
attachStderr, Map<String, ?> exposedPorts,
+         boolean tty, boolean openStdin, boolean stdinOnce, List<String> env, 
List<String> cmd, List<String> dns,
+         String image, Map<String, ?> volumes, String volumesFrom, String 
workingDir, List<String> entrypoint,
+         boolean networkDisabled, List<String> onBuild) {
+      return new AutoValue_Config(hostname, domainname, user, memory, 
memorySwap, cpuShares, attachStdin, attachStdout,
+            attachStderr, copyOf(exposedPorts), tty, openStdin, stdinOnce, 
copyOf(env), copyOf(cmd), copyOf(dns), image,
+            copyOf(volumes), volumesFrom, workingDir, copyOf(entrypoint), 
networkDisabled, copyOf(onBuild));
    }
 
    public static Builder builder() {
@@ -283,7 +101,7 @@ public class Config {
 
    public static final class Builder {
       private String hostname;
-      private String domainName;
+      private String domainname;
       private String user;
       private int memory;
       private int memorySwap;
@@ -298,7 +116,7 @@ public class Config {
       private boolean stdinOnce;
       private List<String> cmd = ImmutableList.of();
       private List<String> dns = ImmutableList.of();
-      private String imageId;
+      private String image;
       private Map<String, ?> volumes = ImmutableMap.of();
       private String volumesFrom;
       private String workingDir;
@@ -311,8 +129,8 @@ public class Config {
          return this;
       }
 
-      public Builder domainName(String domainName) {
-         this.domainName = domainName;
+      public Builder domainname(String domainname) {
+         this.domainname = domainname;
          return this;
       }
 
@@ -386,8 +204,8 @@ public class Config {
          return this;
       }
 
-      public Builder imageId(String imageId) {
-         this.imageId = imageId;
+      public Builder image(String image) {
+         this.image = image;
          return this;
       }
 
@@ -422,36 +240,19 @@ public class Config {
       }
 
       public Config build() {
-         return new Config(hostname, domainName, user, memory, memorySwap, 
cpuShares, attachStdin, attachStdout,
-                 attachStderr, exposedPorts, tty, openStdin, stdinOnce, env, 
cmd, dns, imageId, volumes,
-                 volumesFrom, workingDir, entrypoint, networkDisabled, 
onBuild);
+         return Config.create(hostname, domainname, user, memory, memorySwap, 
cpuShares, attachStdin, attachStdout,
+               attachStderr, exposedPorts, tty, openStdin, stdinOnce, env, 
cmd, dns, image, volumes, volumesFrom,
+               workingDir, entrypoint, networkDisabled, onBuild);
       }
 
       public Builder fromConfig(Config in) {
-         return this
-                 .hostname(in.getHostname())
-                 .domainName(in.getDomainName())
-                 .user(in.getUser())
-                 .memory(in.getMemory())
-                 .memorySwap(in.getMemorySwap())
-                 .cpuShares(in.getCpuShares())
-                 .attachStdin(in.isAttachStdin())
-                 .attachStdout(in.isAttachStdout())
-                 .attachStderr(in.isAttachStderr())
-                 .exposedPorts(in.getExposedPorts())
-                 .tty(in.isTty())
-                 .openStdin(in.isOpenStdin())
-                 .stdinOnce(in.isStdinOnce())
-                 .env(in.getEnv())
-                 .cmd(in.getCmd())
-                 .dns(in.getDns())
-                 .imageId(in.getImageId())
-                 .volumes(in.getVolumes())
-                 .volumesFrom(in.getVolumesFrom())
-                 .workingDir(in.getWorkingDir())
-                 .entrypoint(in.getEntrypoint())
-                 .networkDisabled(in.isNetworkDisabled())
-                 .onBuild(in.getOnBuild());
+         return 
hostname(in.hostname()).domainname(in.domainname()).user(in.user()).memory(in.memory())
+               
.memorySwap(in.memorySwap()).cpuShares(in.cpuShares()).attachStdin(in.attachStdin())
+               
.attachStdout(in.attachStdout()).attachStderr(in.attachStderr()).exposedPorts(in.exposedPorts())
+               
.tty(in.tty()).openStdin(in.openStdin()).stdinOnce(in.stdinOnce()).env(in.env()).cmd(in.cmd())
+               
.dns(in.dns()).image(in.image()).volumes(in.volumes()).volumesFrom(in.volumesFrom())
+               
.workingDir(in.workingDir()).entrypoint(in.entrypoint()).networkDisabled(in.networkDisabled())
+               .onBuild(in.onBuild());
       }
 
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/Container.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Container.java 
b/docker/src/main/java/org/jclouds/docker/domain/Container.java
index 2752529..b06c3a5 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Container.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Container.java
@@ -16,221 +16,69 @@
  */
 package org.jclouds.docker.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gson.annotations.SerializedName;
-import org.jclouds.javax.annotation.Nullable;
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
 
-import java.beans.ConstructorProperties;
 import java.util.List;
 import java.util.Map;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-public class Container {
-
-   @SerializedName("Id")
-   private final String id;
-   @SerializedName("Name")
-   private final String name;
-   @SerializedName("Created")
-   private final String created;
-   @SerializedName("Path")
-   private final String path;
-   @SerializedName("Args")
-   private final String[] args;
-   @SerializedName("Config")
-   private final Config containerConfig;
-   @SerializedName("State")
-   private final State state;
-   @SerializedName("Image")
-   private final String image;
-   @SerializedName("NetworkSettings")
-   private final NetworkSettings networkSettings;
-   @SerializedName("ResolvConfPath")
-   private final String resolvConfPath;
-   @SerializedName("Driver")
-   private final String driver;
-   @SerializedName("ExecDriver")
-   private final String execDriver;
-   @SerializedName("Volumes")
-   private final Map<String, String> volumes;
-   @SerializedName("VolumesRW")
-   private final Map<String, Boolean> volumesRW;
-   @SerializedName("Command")
-   private final String command;
-   @SerializedName("Status")
-   private final String status;
-   @SerializedName("HostConfig")
-   private final HostConfig hostConfig;
-   @SerializedName("Ports")
-   private final List<Port> ports;
-   @SerializedName("HostnamePath")
-   private final String hostnamePath;
-
-   @ConstructorProperties({ "Id", "Name", "Created", "Path", "Args", "Config", 
"State", "Image", "NetworkSettings",
-           "ResolvConfPath", "Driver", "ExecDriver", "Volumes", "VolumesRW", 
"Command", "Status", "HostConfig",
-           "Ports", "HostnamePath" })
-   protected Container(String id, @Nullable String name, @Nullable String 
created, @Nullable String path, @Nullable String[] args,
-                       @Nullable Config containerConfig, @Nullable State 
state, @Nullable String image, @Nullable NetworkSettings networkSettings,
-                       @Nullable String resolvConfPath, @Nullable String 
driver, @Nullable String execDriver, @Nullable Map<String, String> volumes,
-                       @Nullable Map<String, Boolean> volumesRW, @Nullable 
String command, @Nullable String status,
-                       @Nullable HostConfig hostConfig, @Nullable List<Port> 
ports, @Nullable String hostnamePath) {
-      this.id = checkNotNull(id, "id");
-      this.name = name;
-      this.created = created;
-      this.path = path;
-      this.args = args;
-      this.containerConfig = containerConfig;
-      this.state = state;
-      this.image = image;
-      this.networkSettings = networkSettings;
-      this.resolvConfPath = resolvConfPath;
-      this.driver = driver;
-      this.execDriver = execDriver;
-      this.volumes = volumes != null ? ImmutableMap.copyOf(volumes) : 
ImmutableMap.<String, String>of();
-      this.volumesRW = volumesRW != null ? ImmutableMap.copyOf(volumesRW) : 
ImmutableMap.<String, Boolean>of();
-      this.command = command;
-      this.status = status;
-      this.hostConfig = hostConfig;
-      this.ports = ports != null ? ImmutableList.copyOf(ports) : 
ImmutableList.<Port>of();
-      this.hostnamePath = hostnamePath;
-   }
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-   public String getId() {
-      return id;
-   }
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
-   public String getName() {
-      return name;
-   }
+@AutoValue
+public abstract class Container {
+   public abstract String id();
 
-   public String getCreated() {
-      return created;
-   }
+   @Nullable public abstract String name();
 
-   public String getPath() {
-      return path;
-   }
+   @Nullable public abstract String created();
 
-   public String[] getArgs() {
-      return args;
-   }
+   @Nullable public abstract String path();
 
-   public Config getContainerConfig() {
-      return containerConfig;
-   }
+   public abstract List<String> args();
 
-   public State getState() {
-      return state;
-   }
+   @Nullable public abstract Config config();
 
-   public String getImage() {
-      return image;
-   }
+   @Nullable public abstract State state();
 
-   public NetworkSettings getNetworkSettings() {
-      return networkSettings;
-   }
+   @Nullable public abstract String image();
 
-   public String getResolvConfPath() {
-      return resolvConfPath;
-   }
+   @Nullable public abstract NetworkSettings networkSettings();
 
-   public String getDriver() {
-      return driver;
-   }
+   @Nullable public abstract String resolvConfPath();
 
-   public String getExecDriver() {
-      return execDriver;
-   }
+   @Nullable public abstract String driver();
 
-   public Map<String, String> getVolumes() {
-      return volumes;
-   }
-
-   public Map<String, Boolean> getvolumesRW() {
-      return volumesRW;
-   }
+   @Nullable public abstract String execDriver();
 
-   public String getCommand() {
-      return command;
-   }
+   public abstract Map<String, String> volumes();
 
-   public String getStatus() {
-      return status;
-   }
+   public abstract Map<String, Boolean> volumesRW();
 
-   public HostConfig getHostConfig() {
-      return hostConfig;
-   }
+   @Nullable public abstract String command();
 
-   public List<Port> getPorts() {
-      return ports;
-   }
+   @Nullable public abstract String status();
 
-   public String getHostnamePath() {
-      return hostnamePath;
-   }
+   @Nullable public abstract HostConfig hostConfig();
 
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      Container that = (Container) o;
-
-      return Objects.equal(this.id, that.id) &&
-              Objects.equal(this.name, that.name) &&
-              Objects.equal(this.created, that.created) &&
-              Objects.equal(this.path, that.path) &&
-              Objects.equal(this.args, that.args) &&
-              Objects.equal(this.containerConfig, that.containerConfig) &&
-              Objects.equal(this.state, that.state) &&
-              Objects.equal(this.image, that.image) &&
-              Objects.equal(this.networkSettings, that.networkSettings) &&
-              Objects.equal(this.resolvConfPath, that.resolvConfPath) &&
-              Objects.equal(this.driver, that.driver) &&
-              Objects.equal(this.execDriver, that.execDriver) &&
-              Objects.equal(this.volumes, that.volumes) &&
-              Objects.equal(this.volumesRW, that.volumesRW) &&
-              Objects.equal(this.command, that.command) &&
-              Objects.equal(this.status, that.status) &&
-              Objects.equal(this.hostConfig, that.hostConfig) &&
-              Objects.equal(this.ports, that.ports) &&
-              Objects.equal(this.hostnamePath, that.hostnamePath);
-   }
+   public abstract List<Port> ports();
 
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(id, name, created, path, args, containerConfig, 
state, image, networkSettings, resolvConfPath,
-              driver, execDriver, volumes, volumesRW, command, status, 
hostConfig, ports, hostnamePath);
-   }
+   @Nullable public abstract String hostnamePath();
 
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("id", id)
-              .add("name", name)
-              .add("created", created)
-              .add("path", path)
-              .add("args", args)
-              .add("containerConfig", containerConfig)
-              .add("state", state)
-              .add("image", image)
-              .add("networkSettings", networkSettings)
-              .add("resolvConfPath", resolvConfPath)
-              .add("driver", driver)
-              .add("execDriver", execDriver)
-              .add("volumes", volumes)
-              .add("volumesRW", volumesRW)
-              .add("command", command)
-              .add("status", status)
-              .add("hostConfig", hostConfig)
-              .add("ports", ports)
-              .add("hostnamePath", hostnamePath)
-              .toString();
+   @SerializedNames(
+         { "Id", "Name", "Created", "Path", "Args", "Config", "State", 
"Image", "NetworkSettings", "ResolvConfPath",
+               "Driver", "ExecDriver", "Volumes", "VolumesRW", "Command", 
"Status", "HostConfig", "Ports",
+               "HostnamePath" })
+   public static Container create(String id, String name, String created, 
String path, List<String> args, Config config,
+         State state, String image, NetworkSettings networkSettings, String 
resolvConfPath, String driver,
+         String execDriver, Map<String, String> volumes, Map<String, Boolean> 
volumesRW, String command, String status,
+         HostConfig hostConfig, List<Port> ports, String hostnamePath) {
+      return new AutoValue_Container(id, name, created, path, copyOf(args), 
config, state, image, networkSettings,
+            resolvConfPath, driver, execDriver, copyOf(volumes), 
copyOf(volumesRW), command, status, hostConfig,
+            copyOf(ports), hostnamePath);
    }
 
    public static Builder builder() {
@@ -247,8 +95,8 @@ public class Container {
       private String name;
       private String created;
       private String path;
-      private String[] args;
-      private Config containerConfig;
+      private List<String> args;
+      private Config config;
       private State state;
       private String image;
       private NetworkSettings networkSettings;
@@ -283,13 +131,13 @@ public class Container {
          return this;
       }
 
-      public Builder args(String[] args) {
+      public Builder args(List<String> args) {
          this.args = args;
          return this;
       }
 
-      public Builder containerConfig(Config containerConfig) {
-         this.containerConfig = containerConfig;
+      public Builder config(Config config) {
+         this.config = config;
          return this;
       }
 
@@ -359,31 +207,16 @@ public class Container {
       }
 
       public Container build() {
-         return new Container(id, name, created, path, args, containerConfig, 
state, image, networkSettings, resolvConfPath,
+         return Container.create(id, name, created, path, args, config, state, 
image, networkSettings, resolvConfPath,
                  driver, execDriver, volumes, volumesRW, command, status, 
hostConfig, ports, hostnamePath);
       }
 
       public Builder fromContainer(Container in) {
-         return this
-                 .id(in.getId())
-                 .name(in.getName())
-                 .created(in.getCreated())
-                 .path(in.getPath())
-                 .args(in.getArgs())
-                 .containerConfig(in.getContainerConfig())
-                 .state(in.getState())
-                 .image(in.getImage())
-                 .networkSettings(in.getNetworkSettings())
-                 .resolvConfPath(in.getResolvConfPath())
-                 .driver(in.getDriver())
-                 .execDriver(in.getExecDriver())
-                 .volumes(in.getVolumes())
-                 .volumesRW(in.getvolumesRW())
-                 .command(in.getCommand())
-                 .status(in.getStatus())
-                 .hostConfig(in.getHostConfig())
-                 .ports(in.getPorts())
-                 .hostnamePath(in.getHostnamePath());
+         return 
this.id(in.id()).name(in.name()).created(in.created()).path(in.path()).args(in.args())
+               
.config(in.config()).state(in.state()).image(in.image()).networkSettings(in.networkSettings())
+               
.resolvConfPath(in.resolvConfPath()).driver(in.driver()).execDriver(in.execDriver())
+               
.volumes(in.volumes()).volumesRW(in.volumesRW()).command(in.command()).status(in.status())
+               
.hostConfig(in.hostConfig()).ports(in.ports()).hostnamePath(in.hostnamePath());
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/ExposedPorts.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/ExposedPorts.java 
b/docker/src/main/java/org/jclouds/docker/domain/ExposedPorts.java
index b7a831a..413c84f 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/ExposedPorts.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/ExposedPorts.java
@@ -16,91 +16,22 @@
  */
 package org.jclouds.docker.domain;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import java.beans.ConstructorProperties;
-import java.util.Set;
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
 
-import org.jclouds.javax.annotation.Nullable;
+import java.util.List;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-import com.google.gson.annotations.SerializedName;
+import org.jclouds.json.SerializedNames;
 
-public class ExposedPorts {
+import com.google.auto.value.AutoValue;
 
-   @SerializedName("PortAndProtocol")
-   private final String portAndProtocol;
-   @SerializedName("HostPorts")
-   private final Set<String> hostPorts;
+@AutoValue
+public abstract class ExposedPorts {
+   public abstract String portAndProtocol();
 
-   @ConstructorProperties({ "PortAndProtocol", "HostPorts" })
-   protected ExposedPorts(String portAndProtocol, @Nullable Set<String> 
hostPorts) {
-      this.portAndProtocol = checkNotNull(portAndProtocol, "portAndProtocol");
-      this.hostPorts = hostPorts != null ? ImmutableSet.copyOf(hostPorts) : 
ImmutableSet.<String> of();
-   }
-
-   public String getPortAndProtocol() {
-      return portAndProtocol;
-   }
-
-   public Set<String> getHostPorts() {
-      return hostPorts;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      ExposedPorts that = (ExposedPorts) o;
-
-      return Objects.equal(this.portAndProtocol, that.portAndProtocol) &&
-             Objects.equal(this.hostPorts, that.hostPorts);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(portAndProtocol, hostPorts);
-   }
-
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("portAndProtocol", portAndProtocol)
-              .add("hostPorts", hostPorts)
-              .toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return builder().fromExposedPorts(this);
-   }
-
-   public static final class Builder {
-
-      private String portAndProtocol;
-      private Set<String> hostPorts = ImmutableSet.of();
-
-      public Builder portAndProtocol(String portAndProtocol) {
-         this.portAndProtocol = portAndProtocol;
-         return this;
-      }
-
-      public Builder hostPorts(Set<String> hostPorts) {
-         this.hostPorts = ImmutableSet.copyOf(checkNotNull(hostPorts, 
"hostPorts"));
-         return this;
-      }
-
-      public ExposedPorts build() {
-         return new ExposedPorts(portAndProtocol, hostPorts);
-      }
+   public abstract List<String> hostPorts();
 
-      public Builder fromExposedPorts(ExposedPorts in) {
-         return this.portAndProtocol(in.getPortAndProtocol())
-                 .hostPorts(in.getHostPorts());
-      }
+   @SerializedNames({ "PortAndProtocol", "HostPorts" })
+   public static ExposedPorts create(String portAndProtocol, List<String> 
hostPorts) {
+      return new AutoValue_ExposedPorts(portAndProtocol, copyOf(hostPorts));
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java 
b/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
index 275961f..757157c 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
@@ -17,136 +17,47 @@
 package org.jclouds.docker.domain;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import java.beans.ConstructorProperties;
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
+
 import java.util.List;
 import java.util.Map;
 
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
+import com.google.auto.value.AutoValue;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.gson.annotations.SerializedName;
-
-public class HostConfig {
-
-   @SerializedName("ContainerIDFile")
-   private final String containerIDFile;
-   @SerializedName("Binds")
-   private final List<String> binds;
-   @SerializedName("LxcConf")
-   private final Map<String, String> lxcConf;
-   @SerializedName("Privileged")
-   private final boolean privileged;
-   @SerializedName("Dns")
-   private final String dns;
-   @SerializedName("DnsSearch")
-   private final String dnsSearch;
-   @SerializedName("PortBindings")
-   private final Map<String, List<Map<String, String>>> portBindings;
-   @SerializedName("Links")
-   private final List<String> links;
-   @SerializedName("PublishAllPorts")
-   private final boolean publishAllPorts;
-   @SerializedName("VolumesFrom")
-   private final List<String> volumesFrom;
-
-   @ConstructorProperties({ "ContainerIDFile", "Binds", "LxcConf", 
"Privileged", "Dns", "DnsSearch", "PortBindings",
-           "Links", "PublishAllPorts", "VolumesFrom" })
-   protected HostConfig(@Nullable String containerIDFile, @Nullable 
List<String> binds,
-                        Map<String, String> lxcConf, boolean privileged, 
@Nullable String dns,
-                        @Nullable String dnsSearch, @Nullable Map<String, 
List<Map<String, String>>> portBindings,
-                        @Nullable List<String> links, boolean publishAllPorts, 
@Nullable List<String> volumesFrom) {
-      this.containerIDFile = containerIDFile;
-      this.binds = binds != null ? ImmutableList.copyOf(binds) : 
ImmutableList.<String> of();
-      this.lxcConf = lxcConf != null ? ImmutableMap.copyOf(lxcConf) : 
ImmutableMap.<String, String> of();
-      this.privileged = checkNotNull(privileged, "privileged");
-      this.dns = dns;
-      this.dnsSearch = dnsSearch;
-      this.portBindings = portBindings != null ? 
ImmutableMap.copyOf(portBindings) : ImmutableMap.<String, List<Map<String, 
String>>> of();
-      this.links = links != null ? ImmutableList.copyOf(links) : 
ImmutableList.<String> of();
-      this.publishAllPorts = checkNotNull(publishAllPorts, "publishAllPorts");
-      this.volumesFrom = volumesFrom != null ? 
ImmutableList.copyOf(volumesFrom) : ImmutableList.<String> of();
-   }
-
-   public String getContainerIDFile() {
-      return containerIDFile;
-   }
-
-   public List<String> getBinds() {
-      return binds;
-   }
 
-   public Map<String, String> getLxcConf() {
-      return lxcConf;
-   }
+@AutoValue
+public abstract class HostConfig {
+   @Nullable public abstract String containerIDFile();
 
-   public boolean isPrivileged() {
-      return privileged;
-   }
+   public abstract List<String> binds();
 
-   public String getDns() { return dns; }
+   public abstract Map<String, String> lxcConf();
 
-   public String getDnsSearch() { return dnsSearch; }
+   public abstract boolean privileged();
 
-   public Map<String, List<Map<String, String>>> getPortBindings() {
-      return portBindings;
-   }
+   @Nullable public abstract String dns();
 
-   @Nullable
-   public List<String> getLinks() {
-      return links;
-   }
+   @Nullable public abstract String dnsSearch();
 
-   public boolean isPublishAllPorts() {
-      return publishAllPorts;
-   }
+   public abstract Map<String, List<Map<String, String>>> portBindings();
 
-   public List<String> getVolumesFrom() {
-      return volumesFrom;
-   }
+   public abstract List<String> links();
 
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      HostConfig that = (HostConfig) o;
-
-      return Objects.equal(this.containerIDFile, that.containerIDFile) &&
-              Objects.equal(this.binds, that.binds) &&
-              Objects.equal(this.lxcConf, that.lxcConf) &&
-              Objects.equal(this.privileged, that.privileged) &&
-              Objects.equal(this.dns, that.dns) &&
-              Objects.equal(this.dnsSearch, that.dnsSearch) &&
-              Objects.equal(this.portBindings, that.portBindings) &&
-              Objects.equal(this.links, that.links) &&
-              Objects.equal(this.publishAllPorts, that.publishAllPorts) &&
-              Objects.equal(this.volumesFrom, that.volumesFrom);
-   }
+   public abstract boolean publishAllPorts();
 
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(containerIDFile, binds, lxcConf, privileged, 
dns, dnsSearch, portBindings, links,
-              publishAllPorts, volumesFrom);
-   }
+   public abstract List<String> volumesFrom();
 
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("containerIDFile", containerIDFile)
-              .add("binds", binds)
-              .add("lxcConf", lxcConf)
-              .add("privileged", privileged)
-              .add("dns", dns)
-              .add("dnsSearch", dnsSearch)
-              .add("portBindings", portBindings)
-              .add("links", links)
-              .add("publishAllPorts", publishAllPorts)
-              .add("volumesFrom", volumesFrom)
-              .toString();
+   @SerializedNames({ "ContainerIDFile", "Binds", "LxcConf", "Privileged", 
"Dns", "DnsSearch", "PortBindings",
+           "Links", "PublishAllPorts", "VolumesFrom" })
+   public static HostConfig create(String containerIDFile, List<String> binds, 
Map<String, String> lxcConf,
+         boolean privileged, String dns, String dnsSearch, Map<String, 
List<Map<String, String>>> portBindings,
+         List<String> links, boolean publishAllPorts, List<String> 
volumesFrom) {
+      return new AutoValue_HostConfig(containerIDFile, copyOf(binds), 
copyOf(lxcConf), privileged, dns, dnsSearch,
+            copyOf(portBindings), copyOf(links), publishAllPorts, 
copyOf(volumesFrom));
    }
 
    public static Builder builder() {
@@ -221,22 +132,14 @@ public class HostConfig {
       }
 
       public HostConfig build() {
-         return new HostConfig(containerIDFile, binds, lxcConf, privileged, 
dns, dnsSearch, portBindings, links,
-                 publishAllPorts, volumesFrom);
+         return HostConfig.create(containerIDFile, binds, lxcConf, privileged, 
dns, dnsSearch, portBindings, links,
+               publishAllPorts, volumesFrom);
       }
 
       public Builder fromHostConfig(HostConfig in) {
-         return this
-                 .containerIDFile(in.getContainerIDFile())
-                 .binds(in.getBinds())
-                 .lxcConf(in.getLxcConf())
-                 .privileged(in.isPrivileged())
-                 .dns(in.getDns())
-                 .dnsSearch(in.getDnsSearch())
-                 .links(in.getLinks())
-                 .portBindings(in.getPortBindings())
-                 .publishAllPorts(in.isPublishAllPorts())
-                 .volumesFrom(in.getVolumesFrom());
+         return 
this.containerIDFile(in.containerIDFile()).binds(in.binds()).lxcConf(in.lxcConf())
+               
.privileged(in.privileged()).dns(in.dns()).dnsSearch(in.dnsSearch()).links(in.links())
+               
.portBindings(in.portBindings()).publishAllPorts(in.publishAllPorts()).volumesFrom(in.volumesFrom());
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/Image.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Image.java 
b/docker/src/main/java/org/jclouds/docker/domain/Image.java
index 186ece3..99b2594 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Image.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Image.java
@@ -16,224 +16,42 @@
  */
 package org.jclouds.docker.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.gson.annotations.SerializedName;
-import org.jclouds.javax.annotation.Nullable;
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
 
-import java.beans.ConstructorProperties;
 import java.util.List;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-public class Image {
-
-   @SerializedName("Id")
-   private final String id;
-   @SerializedName("Parent")
-   private final String parent;
-   @SerializedName("Created")
-   private final String created;
-   @SerializedName("Container")
-   private final String container;
-   @SerializedName("DockerVersion")
-   private final String dockerVersion;
-   @SerializedName("Architecture")
-   private final String architecture;
-   @SerializedName("Os")
-   private final String os;
-   @SerializedName("Size")
-   private final long size;
-   @SerializedName("VirtualSize")
-   private final long virtualSize;
-   @SerializedName("RepoTags")
-   private final List<String> repoTags;
-
-   @ConstructorProperties({ "Id", "Parent", "Created", "Container", 
"DockerVersion", "Architecture", "Os", "Size",
-           "VirtualSize", "RepoTags", "Architecture" })
-   protected Image(String id, @Nullable String parent, @Nullable String 
created, @Nullable String container,
-                @Nullable String dockerVersion, @Nullable String architecture, 
@Nullable String os, long size,
-                @Nullable long virtualSize, @Nullable List<String> repoTags) {
-      this.id = checkNotNull(id, "id");
-      this.parent = parent;
-      this.created = created;
-      this.container = container;
-      this.dockerVersion = dockerVersion;
-      this.architecture = architecture;
-      this.os = os;
-      this.size = size;
-      this.virtualSize = virtualSize;
-      this.repoTags = repoTags != null ? ImmutableList.copyOf(repoTags) : 
ImmutableList.<String> of();
-   }
-
-   public String getId() {
-      return id;
-   }
-
-   public String getParent() {
-      return parent;
-   }
-
-   public String getCreated() {
-      return created;
-   }
-
-   public String getContainer() {
-      return container;
-   }
-
-   public String getDockerVersion() {
-      return dockerVersion;
-   }
-
-   public String getArchitecture() {
-      return architecture;
-   }
-
-   public String getOs() {
-      return os;
-   }
-
-   public long getSize() {
-      return size;
-   }
-
-   public long getVirtualSize() {
-      return virtualSize;
-   }
-
-   public List<String> getRepoTags() {
-      return repoTags;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      Image that = (Image) o;
-
-      return Objects.equal(this.id, that.id) &&
-              Objects.equal(this.parent, that.parent) &&
-              Objects.equal(this.created, that.created) &&
-              Objects.equal(this.container, that.container) &&
-              Objects.equal(this.dockerVersion, that.dockerVersion) &&
-              Objects.equal(this.architecture, that.architecture) &&
-              Objects.equal(this.os, that.os) &&
-              Objects.equal(this.size, that.size) &&
-              Objects.equal(this.virtualSize, that.virtualSize);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(id, parent, created, container, dockerVersion, 
architecture, os, size,
-              virtualSize);
-   }
-
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("id", id)
-              .add("parent", parent)
-              .add("created", created)
-              .add("container", container)
-              .add("dockerVersion", dockerVersion)
-              .add("architecture", architecture)
-              .add("os", os)
-              .add("size", size)
-              .add("virtualSize", virtualSize)
-              .add("repoTags", repoTags)
-              .toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return builder().fromImage(this);
-   }
-
-   public static final class Builder {
-
-      private String id;
-      private String parent;
-      private String created;
-      private String container;
-      private String dockerVersion;
-      private String architecture;
-      private String os;
-      private long size;
-      private long virtualSize;
-      private List<String> repoTags = ImmutableList.of();
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
+import com.google.auto.value.AutoValue;
 
-      public Builder parent(String parent) {
-         this.parent = parent;
-         return this;
-      }
+@AutoValue
+public abstract class Image {
+   public abstract String id();
 
-      public Builder created(String created) {
-         this.created = created;
-         return this;
-      }
+   @Nullable public abstract String parent();
 
-      public Builder container(String container) {
-         this.container = container;
-         return this;
-      }
+   @Nullable public abstract String created();
 
-      public Builder dockerVersion(String dockerVersion) {
-         this.dockerVersion = dockerVersion;
-         return this;
-      }
+   @Nullable public abstract String container();
 
-      public Builder architecture(String architecture) {
-         this.architecture = architecture;
-         return this;
-      }
+   @Nullable public abstract String dockerVersion();
 
-      public Builder os(String os) {
-         this.os = os;
-         return this;
-      }
+   @Nullable public abstract String architecture();
 
-      public Builder size(long size) {
-         this.size = size;
-         return this;
-      }
+   @Nullable public abstract String os();
 
-      public Builder virtualSize(long virtualSize) {
-         this.virtualSize = virtualSize;
-         return this;
-      }
+   public abstract long size();
 
-      public Builder repoTags(List<String> repoTags) {
-         this.repoTags = ImmutableList.copyOf(checkNotNull(repoTags, 
"repoTags"));
-         return this;
-      }
+   @Nullable public abstract long virtualSize();
 
-      public Image build() {
-         return new Image(id, parent, created, container, dockerVersion, 
architecture, os, size,
-                 virtualSize, repoTags);
-      }
+   public abstract List<String> repoTags();
 
-      public Builder fromImage(Image in) {
-         return this
-                 .id(in.getId())
-                 .parent(in.getParent())
-                 .created(in.getCreated())
-                 .container(in.getContainer())
-                 .dockerVersion(in.getDockerVersion())
-                 .architecture(in.getArchitecture())
-                 .os(in.getOs())
-                 .size(in.getSize())
-                 .virtualSize(in.getVirtualSize());
-                 //DO NOT add .repoTags(in.getRepoTags());
-      }
+   @SerializedNames({ "Id", "Parent", "Created", "Container", "DockerVersion", 
"Architecture", "Os", "Size",
+         "VirtualSize", "RepoTags", "Architecture" })
+   public static Image create(String id, String parent, String created, String 
container, String dockerVersion,
+         String architecture, String os, long size, long virtualSize, 
List<String> repoTags) {
+      return new AutoValue_Image(id, parent, created, container, 
dockerVersion, architecture, os, size, virtualSize,
+            copyOf(repoTags));
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java 
b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
index 23f3fbe..f99bd7f 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
@@ -16,97 +16,36 @@
  */
 package org.jclouds.docker.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableMap;
-import com.google.gson.annotations.SerializedName;
-import org.jclouds.javax.annotation.Nullable;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
 
-import java.beans.ConstructorProperties;
 import java.util.List;
 import java.util.Map;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-public class NetworkSettings {
-
-   @SerializedName("IPAddress")
-   private final String ipAddress;
-   @SerializedName("IPPrefixLen")
-   private final int ipPrefixLen;
-   @SerializedName("Gateway")
-   private final String gateway;
-   @SerializedName("Bridge")
-   private final String bridge;
-   @SerializedName("PortMapping")
-   private final String portMapping;
-   @SerializedName("Ports")
-   private final Map<String, List<Map<String, String>>> ports;
-
-   @ConstructorProperties({ "IPAddress", "IPPrefixLen", "Gateway", "Bridge", 
"PortMapping", "Ports" })
-   protected NetworkSettings(String ipAddress, int ipPrefixLen, String 
gateway, String bridge,
-                          @Nullable String portMapping, @Nullable Map<String, 
List<Map<String, String>>> ports) {
-      this.ipAddress = checkNotNull(ipAddress, "ipAddress");
-      this.ipPrefixLen = checkNotNull(ipPrefixLen, "ipPrefixLen");
-      this.gateway = checkNotNull(gateway, "gateway");
-      this.bridge = checkNotNull(bridge, "bridge");
-      this.portMapping = portMapping;
-      this.ports = ports != null ? ImmutableMap.copyOf(ports) : 
ImmutableMap.<String, List<Map<String, String>>> of();
-   }
-
-   public String getIpAddress() {
-      return ipAddress;
-   }
-
-   public int getIpPrefixLen() {
-      return ipPrefixLen;
-   }
-
-   public String getGateway() {
-      return gateway;
-   }
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-   public String getBridge() {
-      return bridge;
-   }
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableMap;
 
-   public String getPortMapping() {
-      return portMapping;
-   }
+@AutoValue
+public abstract class NetworkSettings {
+   public abstract String ipAddress();
 
-   public Map<String, List<Map<String, String>>> getPorts() {
-      return ports;
-   }
+   public abstract int ipPrefixLen();
 
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
+   public abstract String gateway();
 
-      NetworkSettings that = (NetworkSettings) o;
+   public abstract String bridge();
 
-      return Objects.equal(this.ipAddress, that.ipAddress) &&
-              Objects.equal(this.ipPrefixLen, that.ipPrefixLen) &&
-              Objects.equal(this.gateway, that.gateway) &&
-              Objects.equal(this.bridge, that.bridge) &&
-              Objects.equal(this.portMapping, that.portMapping) &&
-              Objects.equal(this.ports, that.ports);
-   }
+   @Nullable public abstract String portMapping();
 
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(ipAddress, ipPrefixLen, gateway, bridge, 
portMapping, ports);
-   }
+   public abstract Map<String, List<Map<String, String>>> ports();
 
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("ipAddress", ipAddress)
-              .add("ipPrefixLen", ipPrefixLen)
-              .add("gateway", gateway)
-              .add("bridge", bridge)
-              .add("portMapping", portMapping)
-              .add("ports", ports)
-              .toString();
+   @SerializedNames({ "IPAddress", "IPPrefixLen", "Gateway", "Bridge", 
"PortMapping", "Ports" })
+   public static NetworkSettings create(String ipAddress, int ipPrefixLen, 
String gateway, String bridge,
+         String portMapping, Map<String, List<Map<String, String>>> ports) {
+      return new AutoValue_NetworkSettings(ipAddress, ipPrefixLen, gateway, 
bridge, portMapping, copyOf(ports));
    }
 
    public static Builder builder() {
@@ -157,19 +96,13 @@ public class NetworkSettings {
       }
 
       public NetworkSettings build() {
-         return new NetworkSettings(ipAddress, ipPrefixLen, gateway, bridge, 
portMapping, ports);
+         return NetworkSettings.create(ipAddress, ipPrefixLen, gateway, 
bridge, portMapping, ports);
       }
 
       public Builder fromNetworkSettings(NetworkSettings in) {
-         return this
-                 .ipAddress(in.getIpAddress())
-                 .ipPrefixLen(in.getIpPrefixLen())
-                 .gateway(in.getGateway())
-                 .bridge(in.getBridge())
-                 .portMapping(in.getPortMapping())
-                 .ports(in.getPorts());
+         return 
this.ipAddress(in.ipAddress()).ipPrefixLen(in.ipPrefixLen()).gateway(in.gateway()).bridge(in.bridge())
+               .portMapping(in.portMapping()).ports(in.ports());
       }
-
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/Port.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Port.java 
b/docker/src/main/java/org/jclouds/docker/domain/Port.java
index b49dfa6..0522be1 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Port.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Port.java
@@ -16,73 +16,22 @@
  */
 package org.jclouds.docker.domain;
 
-import com.google.common.base.Objects;
-import com.google.gson.annotations.SerializedName;
+import org.jclouds.json.SerializedNames;
 
-import java.beans.ConstructorProperties;
+import com.google.auto.value.AutoValue;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+@AutoValue
+public abstract class Port {
+   public abstract String ip();
 
-public class Port {
+   public abstract int privatePort();
 
-   @SerializedName("PrivatePort")
-   private final int privatePort;
-   @SerializedName("PublicPort")
-   private final int publicPort;
-   @SerializedName("Type")
-   private final String type;
-   @SerializedName("IP")
-   private final String ip;
+   public abstract int publicPort();
 
-   @ConstructorProperties({ "PrivatePort", "PublicPort", "Type", "IP" })
-   protected Port(int privatePort, int publicPort, String type, String ip) {
-      this.privatePort = checkNotNull(privatePort, "privatePort");
-      this.publicPort = checkNotNull(publicPort, "publicPort");
-      this.type = checkNotNull(type, "type");
-      this.ip = checkNotNull(ip, "ip");
-   }
-
-   public int getPrivatePort() {
-      return privatePort;
-   }
-
-   public int getPublicPort() {
-      return publicPort;
-   }
-
-   public String getType() {
-      return type;
-   }
-
-   public String getIp() {
-      return ip;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      Port that = (Port) o;
-
-      return Objects.equal(this.privatePort, that.privatePort) &&
-              Objects.equal(this.publicPort, that.publicPort) &&
-              Objects.equal(this.type, that.type) &&
-              Objects.equal(this.ip, that.ip);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(privatePort, publicPort, type, ip);
-   }
+   public abstract String type();
 
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("privatePort", privatePort)
-              .add("publicPort", publicPort)
-              .add("type", type)
-              .add("ip", ip)
-              .toString();
+   @SerializedNames({ "IP", "PrivatePort", "PublicPort", "Type" })
+   public static Port create(String ip, int privatePort, int publicPort, 
String type) {
+      return new AutoValue_Port(ip, privatePort, publicPort, type);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/State.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/State.java 
b/docker/src/main/java/org/jclouds/docker/domain/State.java
index ac1ba85..c0a8586 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/State.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/State.java
@@ -16,151 +16,27 @@
  */
 package org.jclouds.docker.domain;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import java.beans.ConstructorProperties;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
-import com.google.gson.annotations.SerializedName;
+import com.google.auto.value.AutoValue;
 
-public class State {
-   @SerializedName("Pid")
-   private final int pid;
-   @SerializedName("Running")
-   private final boolean running;
-   @SerializedName("ExitCode")
-   private final int exitCode;
-   @SerializedName("StartedAt")
-   private final String startedAt;
-   @SerializedName("FinishedAt")
-   private final String finishedAt;
-   @SerializedName("Ghost")
-   private final boolean ghost;
+@AutoValue
+public abstract class State {
+   public abstract int pid();
 
-   @ConstructorProperties({ "Pid", "Running", "ExitCode", "StartedAt", 
"FinishedAt", "Ghost" })
-   protected State(int pid, boolean running, int exitCode, String startedAt, 
String finishedAt, boolean ghost) {
-      this.pid = checkNotNull(pid, "pid");
-      this.running = checkNotNull(running, "running");
-      this.exitCode = checkNotNull(exitCode, "exitCode");
-      this.startedAt = checkNotNull(startedAt, "startedAt");
-      this.finishedAt = checkNotNull(finishedAt, "finishedAt");
-      this.ghost = checkNotNull(ghost, "ghost");
-   }
-
-   public int getPid() {
-      return pid;
-   }
-
-   public boolean isRunning() {
-      return running;
-   }
-
-   public int getExitCode() {
-      return exitCode;
-   }
-
-   public String getStartedAt() {
-      return startedAt;
-   }
-
-   public String getFinishedAt() {
-      return finishedAt;
-   }
-
-   public boolean isGhost() {
-      return ghost;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      State that = (State) o;
-
-      return Objects.equal(this.pid, that.pid) &&
-              Objects.equal(this.running, that.running) &&
-              Objects.equal(this.exitCode, that.exitCode) &&
-              Objects.equal(this.startedAt, that.startedAt) &&
-              Objects.equal(this.finishedAt, that.finishedAt) &&
-              Objects.equal(this.ghost, that.ghost);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(pid, running, exitCode, startedAt, finishedAt, 
ghost);
-   }
-
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("pid", pid)
-              .add("running", running)
-              .add("exitCode", exitCode)
-              .add("startedAt", startedAt)
-              .add("finishedAt", finishedAt)
-              .add("ghost", ghost)
-              .toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return builder().fromState(this);
-   }
-
-   public static final class Builder {
-
-      private int pid;
-      private boolean running;
-      private int exitCode;
-      private String startedAt;
-      private String finishedAt;
-      private boolean ghost;
-
-      public Builder pid(int pid) {
-         this.pid = pid;
-         return this;
-      }
-
-      public Builder running(boolean running) {
-         this.running = running;
-         return this;
-      }
-
-      public Builder exitCode(int exitCode) {
-         this.exitCode = exitCode;
-         return this;
-      }
+   public abstract boolean running();
 
-      public Builder startedAt(String startedAt) {
-         this.startedAt = startedAt;
-         return this;
-      }
+   public abstract int exitCode();
 
-      public Builder finishedAt(String finishedAt) {
-         this.finishedAt = finishedAt;
-         return this;
-      }
+   public abstract String startedAt();
 
-      public Builder ghost(boolean ghost) {
-         this.ghost = ghost;
-         return this;
-      }
+   public abstract String finishedAt();
 
-      public State build() {
-         return new State(pid, running, exitCode, startedAt, finishedAt, 
ghost);
-      }
+   public abstract boolean ghost();
 
-      public Builder fromState(State in) {
-         return this
-                 .pid(in.getPid())
-                 .running(in.isRunning())
-                 .exitCode(in.getExitCode())
-                 .startedAt(in.getStartedAt())
-                 .finishedAt(in.getFinishedAt())
-                 .ghost(in.isGhost());
-      }
+   @SerializedNames({ "Pid", "Running", "ExitCode", "StartedAt", "FinishedAt", 
"Ghost" })
+   public static State create(int pid, boolean running, int exitCode, String 
startedAt, String finishedAt,
+         boolean ghost) {
+      return new AutoValue_State(pid, running, exitCode, startedAt, 
finishedAt, ghost);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/domain/Version.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Version.java 
b/docker/src/main/java/org/jclouds/docker/domain/Version.java
index 445a225..ee0ba19 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Version.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Version.java
@@ -16,151 +16,27 @@
  */
 package org.jclouds.docker.domain;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import java.beans.ConstructorProperties;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
-import com.google.gson.annotations.SerializedName;
+import com.google.auto.value.AutoValue;
 
-public class Version {
-   @SerializedName("Arch")
-   private final String arch;
-   @SerializedName("GitCommit")
-   private final String gitCommit;
-   @SerializedName("GoVersion")
-   private final String goVersion;
-   @SerializedName("KernelVersion")
-   private final String kernelVersion;
-   @SerializedName("Os")
-   private final String os;
-   @SerializedName("Version")
-   private final String version;
+@AutoValue
+public abstract class Version {
+   public abstract String arch();
 
-   @ConstructorProperties({ "Arch", "GitCommit", "GoVersion", "KernelVersion", 
"Os", "Version" })
-   protected Version(String arch, String gitCommit, String goVersion, String 
kernelVersion, String os, String version) {
-      this.arch = checkNotNull(arch, "arch");
-      this.gitCommit = checkNotNull(gitCommit, "gitCommit");
-      this.goVersion = checkNotNull(goVersion, "goVersion");
-      this.kernelVersion = checkNotNull(kernelVersion, "kernelVersion");
-      this.os = checkNotNull(os, "os");
-      this.version = checkNotNull(version, "version");
-   }
-
-   public String getArch() {
-      return arch;
-   }
-
-   public String getGitCommit() {
-      return gitCommit;
-   }
-
-   public String getGoVersion() {
-      return goVersion;
-   }
-
-   public String getKernelVersion() {
-      return kernelVersion;
-   }
-
-   public String getOs() {
-      return os;
-   }
-
-   public String getVersion() {
-      return version;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      Version that = (Version) o;
-
-      return Objects.equal(this.arch, that.arch) &&
-              Objects.equal(this.gitCommit, that.gitCommit) &&
-              Objects.equal(this.goVersion, that.goVersion) &&
-              Objects.equal(this.kernelVersion, that.kernelVersion) &&
-              Objects.equal(this.os, that.os) &&
-              Objects.equal(this.version, that.version);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(arch, gitCommit, goVersion, kernelVersion, os, 
version);
-   }
-
-   @Override
-   public String toString() {
-      return Objects.toStringHelper(this)
-              .add("arch", arch)
-              .add("gitCommit", gitCommit)
-              .add("goVersion", goVersion)
-              .add("kernelVersion", kernelVersion)
-              .add("os", os)
-              .add("version", version)
-              .toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return builder().fromVersion(this);
-   }
-
-   public static final class Builder {
-
-      private String arch;
-      private String gitCommit;
-      private String goVersion;
-      private String kernelVersion;
-      private String os;
-      private String version;
-
-      public Builder arch(String arch) {
-         this.arch = arch;
-         return this;
-      }
-
-      public Builder gitCommit(String gitCommit) {
-         this.gitCommit = gitCommit;
-         return this;
-      }
-
-      public Builder goVersion(String goVersion) {
-         this.goVersion = goVersion;
-         return this;
-      }
+   public abstract String gitCommit();
 
-      public Builder kernelVersion(String kernelVersion) {
-         this.kernelVersion = kernelVersion;
-         return this;
-      }
+   public abstract String goVersion();
 
-      public Builder os(String os) {
-         this.os = os;
-         return this;
-      }
+   public abstract String kernelVersion();
 
-      public Builder version(String version) {
-         this.version = version;
-         return this;
-      }
+   public abstract String os();
 
-      public Version build() {
-         return new Version(arch, gitCommit, goVersion, kernelVersion, os, 
version);
-      }
+   public abstract String version();
 
-      public Builder fromVersion(Version in) {
-         return this
-                 .arch(in.getArch())
-                 .gitCommit(in.getGitCommit())
-                 .goVersion(in.getGoVersion())
-                 .kernelVersion(in.getKernelVersion())
-                 .os(in.getOs())
-                 .version(in.getVersion());
-      }
+   @SerializedNames({ "Arch", "GitCommit", "GoVersion", "KernelVersion", "Os", 
"Version" })
+   public static Version create(String arch, String gitCommit, String 
goVersion, String kernelVersion, String os,
+         String version) {
+      return new AutoValue_Version(arch, gitCommit, goVersion, kernelVersion, 
os, version);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/main/java/org/jclouds/docker/internal/NullSafeCopies.java
----------------------------------------------------------------------
diff --git 
a/docker/src/main/java/org/jclouds/docker/internal/NullSafeCopies.java 
b/docker/src/main/java/org/jclouds/docker/internal/NullSafeCopies.java
new file mode 100644
index 0000000..c02d449
--- /dev/null
+++ b/docker/src/main/java/org/jclouds/docker/internal/NullSafeCopies.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.jclouds.docker.internal;
+
+import java.util.List;
+import java.util.Map;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class NullSafeCopies {
+
+   public static <K, V> Map<K, V> copyOf(@Nullable Map<K, V> map) {
+      return map != null ? ImmutableMap.copyOf(map) : ImmutableMap.<K, V>of();
+   }
+
+   public static <E> List<E> copyOf(@Nullable List<E> list) {
+      return list != null ? ImmutableList.copyOf(list) : ImmutableList.<E>of();
+   }
+
+   private NullSafeCopies() {
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6cfb4351/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git 
a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
 
b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
index faee982..b64dace 100644
--- 
a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
+++ 
b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
@@ -61,7 +61,7 @@ public class DockerComputeServiceAdapterLiveTest extends 
BaseDockerApiLiveTest {
               .osDescriptionMatches("jclouds/default:latest").build();
 
       guest = adapter.createNodeWithGroupEncodedIntoName(group, name, 
template);
-      assertEquals(guest.getNodeId(), guest.getNode().getId() + "");
+      assertEquals(guest.getNodeId(), guest.getNode().id() + "");
    }
 
    public void testListHardwareProfiles() {
@@ -76,7 +76,7 @@ public class DockerComputeServiceAdapterLiveTest extends 
BaseDockerApiLiveTest {
    @AfterGroups(groups = "live")
    protected void tearDown() {
       if (guest != null) {
-         adapter.destroyNode(guest.getNode().getId() + "");
+         adapter.destroyNode(guest.getNode().id() + "");
       }
       super.tearDown();
    }

Reply via email to