You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ad...@apache.org on 2014/10/30 17:41:13 UTC

[4/4] git commit: Use AutoValue to reduce bulk of Google Storage value types.

Use AutoValue to reduce bulk of Google Storage value types.


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

Branch: refs/heads/master
Commit: b8670b16e3793fb17255381faee6608d694c387a
Parents: cca44c2
Author: Adrian Cole <ac...@twitter.com>
Authored: Tue Oct 28 22:10:34 2014 -0700
Committer: Adrian Cole <ac...@twitter.com>
Committed: Thu Oct 30 09:40:44 2014 -0700

----------------------------------------------------------------------
 google-cloud-storage/pom.xml                    |   7 +-
 .../GoogleCloudStorageApiMetadata.java          |   3 +
 .../binders/MultipartUploadBinder.java          |   6 +-
 .../blobstore/GCSBlobStore.java                 |  48 +--
 .../functions/BlobMetadataToObjectTemplate.java |   7 +-
 ...ListContainerOptionsToListObjectOptions.java |   5 +-
 .../functions/BucketToStorageMetadata.java      |  10 +-
 .../functions/ObjectListToStorageMetadata.java  |  14 +-
 .../functions/ObjectToBlobMetadata.java         |  57 ++-
 .../SequentialMultipartUploadStrategy.java      |  13 +-
 .../config/GoogleCloudStorageParserModule.java  |  16 +-
 .../googlecloudstorage/domain/Bucket.java       | 321 +++++----------
 .../domain/BucketAccessControls.java            | 118 ++----
 .../domain/DefaultObjectAccessControls.java     | 180 ---------
 .../domain/DomainResourceReferences.java        |   4 -
 .../googlecloudstorage/domain/DomainUtils.java  |  38 --
 .../googlecloudstorage/domain/GCSObject.java    | 392 +++----------------
 .../domain/ListBucketAccessControls.java        | 112 ------
 .../domain/ListDefaultObjectAccessControls.java | 112 ------
 .../domain/ListObjectAccessControls.java        | 112 ------
 .../googlecloudstorage/domain/ListPage.java     | 129 +-----
 .../domain/ObjectAccessControls.java            | 152 ++-----
 .../googlecloudstorage/domain/Owner.java        |  34 ++
 .../googlecloudstorage/domain/ProjectTeam.java  |  55 +++
 .../googlecloudstorage/domain/Resource.java     | 169 --------
 .../domain/ResumableUpload.java                 | 112 +-----
 .../domain/internal/Action.java                 |  90 -----
 .../domain/internal/BucketCors.java             | 147 -------
 .../domain/internal/BucketLifeCycle.java        | 102 -----
 .../domain/internal/Condition.java              | 150 -------
 .../domain/internal/Logging.java                | 102 -----
 .../domain/internal/Owner.java                  |  99 -----
 .../domain/internal/ProjectTeam.java            | 116 ------
 .../domain/internal/Rule.java                   | 110 ------
 .../domain/internal/Versioning.java             |  94 -----
 .../domain/internal/Website.java                | 102 -----
 .../templates/BucketAccessControlsTemplate.java |  48 +--
 .../domain/templates/BucketTemplate.java        |  99 ++---
 .../domain/templates/ComposeObjectTemplate.java |  59 +--
 .../DefaultObjectAccessControlsTemplate.java    |  65 ---
 .../templates/ObjectAccessControlsTemplate.java |  46 +--
 .../domain/templates/ObjectTemplate.java        |  91 ++---
 .../features/BucketAccessControlsApi.java       |   7 +-
 .../DefaultObjectAccessControlsApi.java         |  51 +--
 .../features/ObjectAccessControlsApi.java       |  23 +-
 .../internal/NullSafeCopies.java                |  39 ++
 .../parser/ParseToResumableUpload.java          |  11 +-
 .../services/org.jclouds.apis.ApiMetadata       |  18 -
 .../BucketAccessControlsApiExpectTest.java      |  10 +-
 .../BucketAccessControlsApiLiveTest.java        |  29 +-
 .../features/BucketApiExpectTest.java           |   2 +-
 .../features/BucketApiLiveTest.java             |  81 ++--
 ...efaultObjectAccessControlsApiExpectTest.java |  16 +-
 .../DefaultObjectAccessControlsApiLiveTest.java |  45 +--
 .../ObjectAccessControlsApiExpectTest.java      |  21 +-
 .../features/ObjectApiLiveTest.java             | 168 ++++----
 .../features/ResumableUploadApiLiveTest.java    |  47 +--
 .../parse/BucketAclGetTest.java                 |   6 +-
 .../parse/BucketAclInsertTest.java              |   8 +-
 .../parse/BucketAclListTest.java                |  30 +-
 .../parse/BucketAclUpdateTest.java              |   7 +-
 .../parse/BucketUpdateTest.java                 |  28 +-
 .../parse/DefaultObjectAclGetTest.java          |  14 +-
 .../parse/DefaultObjectAclInsertTest.java       |   9 +-
 .../parse/DefaultObjectAclListTest.java         |  23 +-
 .../parse/FullBucketGetTest.java                |  54 +--
 .../parse/NoAclBucketListTest.java              |  33 +-
 .../parse/NoAclBucketTest.java                  |  28 +-
 .../parse/ObjectAclGetTest.java                 |  11 +-
 .../parse/ObjectAclInsertTest.java              |   7 +-
 .../parse/ObjectAclListTest.java                |  18 +-
 .../parse/ObjectAclUpdateTest.java              |   6 +-
 oauth/pom.xml                                   |   1 -
 73 files changed, 922 insertions(+), 3675 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/pom.xml
----------------------------------------------------------------------
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 84351be..7d9fb39 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -60,6 +60,11 @@
       <version>${jclouds.version}</version>
     </dependency>
     <dependency>
+      <groupId>com.google.auto.value</groupId>
+      <artifactId>auto-value</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.jclouds</groupId>
       <artifactId>jclouds-blobstore</artifactId>
       <version>${jclouds.version}</version>
@@ -136,4 +141,4 @@
       </build>
     </profile>
   </profiles>
-</project>
\ No newline at end of file
+</project>

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApiMetadata.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApiMetadata.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApiMetadata.java
index 67c380f..4cf6a49 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApiMetadata.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/GoogleCloudStorageApiMetadata.java
@@ -27,6 +27,7 @@ import static org.jclouds.reflect.Reflection2.typeToken;
 import java.net.URI;
 import java.util.Properties;
 
+import org.jclouds.apis.ApiMetadata;
 import org.jclouds.blobstore.BlobStoreContext;
 import org.jclouds.googlecloudstorage.blobstore.config.GCSBlobStoreContextModule;
 import org.jclouds.googlecloudstorage.config.GoogleCloudStorageHttpApiModule;
@@ -35,9 +36,11 @@ import org.jclouds.oauth.v2.config.OAuthAuthenticationModule;
 import org.jclouds.oauth.v2.config.OAuthModule;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
+import com.google.auto.service.AutoService;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
 
+@AutoService(ApiMetadata.class)
 public class GoogleCloudStorageApiMetadata extends BaseHttpApiMetadata<GoogleCloudStorageApi> {
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/binders/MultipartUploadBinder.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/binders/MultipartUploadBinder.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/binders/MultipartUploadBinder.java
index f8f1451..dfd4f7e 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/binders/MultipartUploadBinder.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/binders/MultipartUploadBinder.java
@@ -41,15 +41,15 @@ public class MultipartUploadBinder implements MapBinder {
       ObjectTemplate template = (ObjectTemplate) postParams.get("template");
       Payload payload = (Payload) postParams.get("payload");
 
-      String contentType = checkNotNull(template.getContentType(), "contentType");
-      Long length = checkNotNull(template.getSize(), "contentLength");
+      String contentType = checkNotNull(template.cacheControl(), "contentType");
+      Long length = checkNotNull(template.size(), "contentLength");
 
       StringPayload jsonPayload = Payloads.newStringPayload(new Gson().toJson(template));
 
       payload.getContentMetadata().setContentLength(length);
 
       Part jsonPart = Part.create("Metadata", jsonPayload, new Part.PartOptions().contentType(APPLICATION_JSON));
-      Part mediaPart = Part.create(template.getName(), payload, new Part.PartOptions().contentType(contentType));
+      Part mediaPart = Part.create(template.name(), payload, new Part.PartOptions().contentType(contentType));
 
       MultipartForm compPayload = new MultipartForm(BOUNDARY_HEADER, jsonPart, mediaPart);
       request.setPayload(compPayload);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GCSBlobStore.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GCSBlobStore.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GCSBlobStore.java
index e0d433c..c388857 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GCSBlobStore.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GCSBlobStore.java
@@ -17,6 +17,7 @@
 package org.jclouds.googlecloudstorage.blobstore;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.io.BaseEncoding.base64;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
@@ -27,9 +28,10 @@ import javax.inject.Singleton;
 import org.jclouds.blobstore.BlobStoreContext;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.BlobMetadata;
+import org.jclouds.blobstore.domain.MutableBlobMetadata;
 import org.jclouds.blobstore.domain.PageSet;
 import org.jclouds.blobstore.domain.StorageMetadata;
-import org.jclouds.blobstore.domain.internal.BlobBuilderImpl;
+import org.jclouds.blobstore.domain.internal.BlobImpl;
 import org.jclouds.blobstore.domain.internal.PageSetImpl;
 import org.jclouds.blobstore.internal.BaseBlobStore;
 import org.jclouds.blobstore.options.CreateContainerOptions;
@@ -52,11 +54,11 @@ import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole
 import org.jclouds.googlecloudstorage.domain.GCSObject;
 import org.jclouds.googlecloudstorage.domain.ListPage;
 import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate;
-import org.jclouds.googlecloudstorage.domain.templates.DefaultObjectAccessControlsTemplate;
+import org.jclouds.googlecloudstorage.domain.templates.ObjectAccessControlsTemplate;
 import org.jclouds.googlecloudstorage.domain.templates.ObjectTemplate;
 import org.jclouds.googlecloudstorage.options.ListObjectOptions;
 import org.jclouds.http.HttpResponseException;
-import org.jclouds.http.internal.PayloadEnclosingImpl;
+import org.jclouds.io.Payload;
 
 import com.google.common.base.Charsets;
 import com.google.common.base.Function;
@@ -137,8 +139,8 @@ public class GCSBlobStore extends BaseBlobStore {
       Bucket bucket = api.getBucketApi().createBucket(projectId.get(), template);
       if (options.isPublicRead()) {
          try {
-            DefaultObjectAccessControlsTemplate doAclTemplate = new DefaultObjectAccessControlsTemplate().entity(
-                     "allUsers").role(ObjectRole.READER);
+            ObjectAccessControlsTemplate doAclTemplate = ObjectAccessControlsTemplate
+                  .create("allUsers", ObjectRole.READER);
             api.getDefaultObjectAccessControlsApi().createDefaultObjectAccessControls(container, doAclTemplate);
          } catch (HttpResponseException e) {
             // If DefaultObjectAccessControls operation fail, Reverse create operation the operation.
@@ -196,9 +198,9 @@ public class GCSBlobStore extends BaseBlobStore {
       ObjectTemplate template = blobMetadataToObjectTemplate.apply(blob.getMetadata());
 
       if (md5 != null) {
-         template.md5Hash(md5);
+         template.md5Hash(base64().encode(md5.asBytes()));
       }
-      return api.getObjectApi().multipartUpload(container, template, blob.getPayload()).getEtag();
+      return api.getObjectApi().multipartUpload(container, template, blob.getPayload()).etag();
    }
 
    @Override
@@ -217,24 +219,16 @@ public class GCSBlobStore extends BaseBlobStore {
 
    @Override
    public Blob getBlob(String container, String name, org.jclouds.blobstore.options.GetOptions options) {
-      PayloadEnclosingImpl impl = api.getObjectApi().download(container, name);
-
       GCSObject gcsObject = api.getObjectApi().getObject(container, name);
       if (gcsObject == null) {
          return null;
       }
-      Blob blob = new BlobBuilderImpl().payload(impl.getPayload()).payload(impl.getPayload())
-               .contentType(gcsObject.getContentType()).contentDisposition(gcsObject.getContentDisposition())
-               .contentEncoding(gcsObject.getContentEncoding()).contentLanguage(gcsObject.getContentLanguage())
-               .contentLength(gcsObject.getSize()).contentMD5(gcsObject.getMd5HashCode()).name(gcsObject.getName())
-               .userMetadata(gcsObject.getAllMetadata()).build();
-      blob.getMetadata().setContainer(container);
-      blob.getMetadata().setLastModified(gcsObject.getUpdated());
-      blob.getMetadata().setETag(gcsObject.getEtag());
-      blob.getMetadata().setPublicUri(gcsObject.getMediaLink());
-      blob.getMetadata().setUserMetadata(gcsObject.getAllMetadata());
-      blob.getMetadata().setUri(gcsObject.getSelfLink());
-      blob.getMetadata().setId(gcsObject.getId());
+      MutableBlobMetadata metadata = objectToBlobMetadata.apply(gcsObject);
+      Blob blob = new BlobImpl(metadata);
+      // TODO: Does getObject not get the payload?!
+      Payload payload = api.getObjectApi().download(container, name).getPayload();
+      payload.setContentMetadata(metadata.getContentMetadata()); // Doing this first retains it on setPayload.
+      blob.setPayload(payload);
       return blob;
    }
 
@@ -255,19 +249,9 @@ public class GCSBlobStore extends BaseBlobStore {
       if (list == null) {
          return api.getBucketApi().deleteBucket(container);
       }
-      if (!list.iterator().hasNext() && list.getPrefixes().isEmpty())
+      if (!list.iterator().hasNext() && list.prefixes().isEmpty())
          return api.getBucketApi().deleteBucket(container);
 
       return false;
    }
-
-   public Set<String> listPrefixes(String container, ListContainerOptions options) {
-      ListObjectOptions gcsOptions = listContainerOptionsToListObjectOptions.apply(options);
-      Set<String> prefixes = api.getObjectApi().listObjects(container, gcsOptions).getPrefixes();
-      return prefixes;
-   }
-
-   public Set<String> listPrefixes(String container) {
-      return listPrefixes(container, ListContainerOptions.NONE);
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java
index d604f7c..e40ce49 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java
@@ -16,9 +16,9 @@
  */
 package org.jclouds.googlecloudstorage.blobstore.functions;
 
-import java.util.Map;
+import static com.google.common.io.BaseEncoding.base64;
 
-import javax.inject.Singleton;
+import java.util.Map;
 
 import org.jclouds.blobstore.domain.BlobMetadata;
 import org.jclouds.googlecloudstorage.domain.templates.ObjectTemplate;
@@ -27,7 +27,6 @@ import org.jclouds.io.ContentMetadata;
 import com.google.common.base.Function;
 import com.google.common.hash.HashCode;
 
-@Singleton
 public class BlobMetadataToObjectTemplate implements Function<BlobMetadata, ObjectTemplate> {
 
    public ObjectTemplate apply(BlobMetadata from) {
@@ -50,7 +49,7 @@ public class BlobMetadataToObjectTemplate implements Function<BlobMetadata, Obje
                .contentEncoding(contentEncoding).contentLanguage(contentLanguage)
                .contentDisposition(contentDisposition).name(name).customMetadata(userMeta);
       if (md5 != null) {
-         template.md5Hash(md5);
+         template.md5Hash(base64().encode(md5.asBytes()));
       }
       return template;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobStoreListContainerOptionsToListObjectOptions.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobStoreListContainerOptionsToListObjectOptions.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobStoreListContainerOptionsToListObjectOptions.java
index d4f8ef1..581e9ce 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobStoreListContainerOptionsToListObjectOptions.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobStoreListContainerOptionsToListObjectOptions.java
@@ -16,14 +16,13 @@
  */
 package org.jclouds.googlecloudstorage.blobstore.functions;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import org.jclouds.blobstore.options.ListContainerOptions;
 import org.jclouds.googlecloudstorage.options.ListObjectOptions;
 
 import com.google.common.base.Function;
-import com.google.inject.Singleton;
-import static com.google.common.base.Preconditions.checkNotNull;
 
-@Singleton
 public class BlobStoreListContainerOptionsToListObjectOptions implements
          Function<ListContainerOptions, ListObjectOptions> {
    public ListObjectOptions apply(ListContainerOptions from) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BucketToStorageMetadata.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BucketToStorageMetadata.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BucketToStorageMetadata.java
index e402c6b..f96462a 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BucketToStorageMetadata.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BucketToStorageMetadata.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.googlecloudstorage.blobstore.functions;
 
+import javax.inject.Inject;
+
 import org.jclouds.blobstore.domain.MutableStorageMetadata;
 import org.jclouds.blobstore.domain.StorageMetadata;
 import org.jclouds.blobstore.domain.StorageType;
@@ -25,21 +27,17 @@ import org.jclouds.googlecloudstorage.domain.Bucket;
 
 import com.google.common.base.Function;
 import com.google.common.base.Supplier;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
 
-@Singleton
 public class BucketToStorageMetadata implements Function<Bucket, StorageMetadata> {
    private Supplier<Location> defaultLocation;
 
-   @Inject
-   BucketToStorageMetadata(Supplier<Location> defaultLocation) {
+   @Inject BucketToStorageMetadata(Supplier<Location> defaultLocation) {
       this.defaultLocation = defaultLocation;
    }
 
    public StorageMetadata apply(Bucket from) {
       MutableStorageMetadata to = new MutableStorageMetadataImpl();
-      to.setName(from.getName());
+      to.setName(from.name());
       to.setLocation(defaultLocation.get());
       to.setType(StorageType.CONTAINER);
       return to;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectListToStorageMetadata.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectListToStorageMetadata.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectListToStorageMetadata.java
index 341e44e..a5c6f73 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectListToStorageMetadata.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectListToStorageMetadata.java
@@ -17,6 +17,9 @@
 package org.jclouds.googlecloudstorage.blobstore.functions;
 
 import java.util.Map;
+
+import javax.inject.Inject;
+
 import org.jclouds.blobstore.domain.BlobMetadata;
 import org.jclouds.blobstore.domain.PageSet;
 import org.jclouds.blobstore.domain.StorageMetadata;
@@ -25,26 +28,21 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
 import org.jclouds.blobstore.domain.internal.StorageMetadataImpl;
 import org.jclouds.googlecloudstorage.domain.GCSObject;
 import org.jclouds.googlecloudstorage.domain.ListPage;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
 
-@Singleton
 public class ObjectListToStorageMetadata implements Function<ListPage<GCSObject>, PageSet<? extends StorageMetadata>> {
    private final ObjectToBlobMetadata object2blobMd;
 
-   @Inject
-   public ObjectListToStorageMetadata(ObjectToBlobMetadata object2blobMd) {
+   @Inject public ObjectListToStorageMetadata(ObjectToBlobMetadata object2blobMd) {
       this.object2blobMd = object2blobMd;
    }
 
    public PageSet<? extends StorageMetadata> apply(ListPage<GCSObject> from) {
       if (from == null) {
-         from = ListPage.<GCSObject> builder().kind(Kind.OBJECTS).build();
+         from = ListPage.create(null, null, null);
       }
 
       return new PageSetImpl<StorageMetadata>(Iterables.transform(Iterables.transform(from, object2blobMd),
@@ -59,7 +57,7 @@ public class ObjectListToStorageMetadata implements Function<ListPage<GCSObject>
                      }
                      return input;
                   }
-               }), from.getNextPageToken());
+               }), from.nextPageToken());
 
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java
index ced893a..8515b3f 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java
@@ -16,56 +16,45 @@
  */
 package org.jclouds.googlecloudstorage.blobstore.functions;
 
-import java.util.Map;
-
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.jclouds.blobstore.domain.MutableBlobMetadata;
 import org.jclouds.blobstore.domain.StorageType;
 import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
 import org.jclouds.blobstore.strategy.IfDirectoryReturnNameStrategy;
 import org.jclouds.googlecloudstorage.domain.GCSObject;
+import org.jclouds.javax.annotation.Nullable;
+
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.hash.HashCode;
+import com.google.common.io.BaseEncoding;
 
-@Singleton
 public class ObjectToBlobMetadata implements Function<GCSObject, MutableBlobMetadata> {
    private final IfDirectoryReturnNameStrategy ifDirectoryReturnName;
 
-   @Inject
-   public ObjectToBlobMetadata(IfDirectoryReturnNameStrategy ifDirectoryReturnName) {
+   @Inject public ObjectToBlobMetadata(IfDirectoryReturnNameStrategy ifDirectoryReturnName) {
       this.ifDirectoryReturnName = ifDirectoryReturnName;
    }
 
    public MutableBlobMetadata apply(GCSObject from) {
-      if (from == null)
+      if (from == null) {
          return null;
+      }
       MutableBlobMetadata to = new MutableBlobMetadataImpl();
-
-      if (from.getMd5HashCode() != null)
-         to.getContentMetadata().setContentMD5(from.getMd5HashCode());
-      if (from.getContentType() != null)
-         to.getContentMetadata().setContentType(from.getContentType());
-      if (from.getContentDisposition() != null)
-         to.getContentMetadata().setContentDisposition(from.getContentDisposition());
-      if (from.getContentEncoding() != null)
-         to.getContentMetadata().setContentEncoding(from.getContentEncoding());
-      if (from.getContentLanguage() != null)
-         to.getContentMetadata().setContentLanguage(from.getContentLanguage());
-      if (from.getSize() != null)
-         to.getContentMetadata().setContentLength(from.getSize());
-      if (from.getUpdated() != null)
-         to.setLastModified(from.getUpdated());
-      to.setContainer(from.getBucket());
-      Map<String, String> userMeta = from.getAllMetadata() == null ? ImmutableMap.<String, String> of() : from
-               .getAllMetadata();
-      to.setUserMetadata(userMeta);
-      to.setETag(from.getEtag());
-      to.setName(from.getName());
-      to.setUri(from.getSelfLink());
-      to.setId(from.getId());
-      to.setPublicUri(from.getMediaLink());
+      to.getContentMetadata().setContentMD5(toHashCode(from.md5Hash()));
+      to.getContentMetadata().setContentType(from.contentType());
+      to.getContentMetadata().setContentDisposition(from.contentDisposition());
+      to.getContentMetadata().setContentEncoding(from.contentEncoding());
+      to.getContentMetadata().setContentLanguage(from.contentLanguage());
+      to.getContentMetadata().setContentLength(from.size());
+      to.setLastModified(from.updated());
+      to.setContainer(from.bucket());
+      to.setUserMetadata(from.metadata());
+      to.setETag(from.etag());
+      to.setName(from.name());
+      to.setUri(from.selfLink());
+      to.setId(from.id());
+      to.setPublicUri(from.mediaLink());
 
       String directoryName = ifDirectoryReturnName.execute(to);
       if (directoryName != null) {
@@ -76,4 +65,8 @@ public class ObjectToBlobMetadata implements Function<GCSObject, MutableBlobMeta
       }
       return to;
    }
+
+   private static HashCode toHashCode(@Nullable String hashCode) {
+      return hashCode == null ? null : HashCode.fromBytes(BaseEncoding.base64().decode(hashCode));
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
index fb9d049..c244f5c 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
@@ -18,7 +18,7 @@ package org.jclouds.googlecloudstorage.blobstore.strategy.internal;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Set;
+import java.util.List;
 
 import javax.annotation.Resource;
 import javax.inject.Named;
@@ -36,7 +36,7 @@ import org.jclouds.io.Payload;
 import org.jclouds.io.PayloadSlicer;
 import org.jclouds.logging.Logger;
 
-import com.google.common.collect.Sets;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 public class SequentialMultipartUploadStrategy extends MultipartUploadStrategy {
@@ -68,9 +68,8 @@ public class SequentialMultipartUploadStrategy extends MultipartUploadStrategy {
    public String execute(String container, Blob blob) {
 
       ObjectTemplate destination = blob2ObjectTemplate.apply(blob.getMetadata());
-      ComposeObjectTemplate template = new ComposeObjectTemplate().destination(destination);
 
-      Set<GCSObject> sourceList = Sets.newLinkedHashSet();
+      List<GCSObject> sourceList = Lists.newArrayList();
 
       String key = blob.getMetadata().getName();
       Payload payload = blob.getPayload();
@@ -95,12 +94,12 @@ public class SequentialMultipartUploadStrategy extends MultipartUploadStrategy {
                      blob2ObjectTemplate.apply(blobPart.getMetadata()), blobPart.getPayload());
             sourceList.add(object);
          }
-         template = template.sourceObjects(sourceList);
-         return api.getObjectApi().composeObjects(container, key, template).getEtag();
+         ComposeObjectTemplate template = ComposeObjectTemplate.create(sourceList, destination);
+         return api.getObjectApi().composeObjects(container, key, template).etag();
       } else {
          return api.getObjectApi()
                   .multipartUpload(container, blob2ObjectTemplate.apply(blob.getMetadata()), blob.getPayload())
-                  .getEtag();
+                  .etag();
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/config/GoogleCloudStorageParserModule.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/config/GoogleCloudStorageParserModule.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/config/GoogleCloudStorageParserModule.java
index 6ae9278..e2639ff 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/config/GoogleCloudStorageParserModule.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/config/GoogleCloudStorageParserModule.java
@@ -59,16 +59,16 @@ public class GoogleCloudStorageParserModule extends AbstractModule {
          JsonObject bucketTemplate = (JsonObject) context.serialize(template, BucketTemplateInternal.class);
 
          // deal with bucketAccessControls
-         if (!(src.getAcl() == null) && (src.getAcl().isEmpty())) {
+         if (!(src.acl() == null) && (src.acl().isEmpty())) {
             bucketTemplate.add("acl", null);
          }
          // deal with DefaultObjectAccessControls
-         if (!(src.getDefaultObjectAccessControls() == null) && (src.getDefaultObjectAccessControls().isEmpty())) {
+         if (!(src.defaultObjectAccessControls() == null) && (src.defaultObjectAccessControls().isEmpty())) {
             bucketTemplate.add("defaultObjectAccessControls", null);
          }
 
          // deal with Cors
-         if (!(src.getCors() == null) && (src.getCors().isEmpty())) {
+         if (!(src.cors() == null) && (src.cors().isEmpty())) {
             bucketTemplate.add("cors", null);
          }
 
@@ -77,11 +77,11 @@ public class GoogleCloudStorageParserModule extends AbstractModule {
 
       private static class BucketTemplateInternal extends BucketTemplate {
          private BucketTemplateInternal(BucketTemplate template) {
-            name(template.getName()).projectNumber(template.getProjectNumber()).acl(template.getAcl())
-                     .defaultObjectAccessControls(template.getDefaultObjectAccessControls()).owner(template.getOwner())
-                     .location(template.getLocation()).website(template.getWebsite()).logging(template.getLogging())
-                     .versioning(template.getVersioning()).cors(template.getCors()).lifeCycle(template.getLifeCycle())
-                     .storageClass(template.getStorageClass());
+            name(template.name()).projectNumber(template.projectNumber()).acl(template.acl())
+                  .defaultObjectAccessControls(template.defaultObjectAccessControls()).owner(template.owner())
+                  .location(template.location()).website(template.website()).logging(template.logging())
+                  .versioning(template.versioning()).cors(template.cors()).lifeCycle(template.lifeCycle())
+                  .storageClass(template.storageClass());
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Bucket.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Bucket.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Bucket.java
index d80a99e..1c8e41a 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Bucket.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Bucket.java
@@ -17,282 +17,165 @@
 
 package org.jclouds.googlecloudstorage.domain;
 
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.googlecloudstorage.internal.NullSafeCopies.copyOf;
 
-import java.net.URI;
 import java.util.Date;
-import java.util.Set;
+import java.util.List;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Location;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
-import org.jclouds.googlecloudstorage.domain.internal.BucketCors;
-import org.jclouds.googlecloudstorage.domain.internal.BucketLifeCycle;
-import org.jclouds.googlecloudstorage.domain.internal.Logging;
-import org.jclouds.googlecloudstorage.domain.internal.Owner;
-import org.jclouds.googlecloudstorage.domain.internal.Versioning;
-import org.jclouds.googlecloudstorage.domain.internal.Website;
-
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
+import com.google.auto.value.AutoValue;
 
 /**
  * The Bucket represents a bucket in Google Cloud Storage. There is a single global namespace shared by all buckets.
- * 
+ *
  * @see <a href = " https://developers.google.com/storage/docs/json_api/v1/buckets"/>
  */
-public class Bucket extends Resource {
-
-   private final String name;
-   private final Long projectNumber;
-   private final Date timeCreated;
-   private final Long metageneration;
-   private final Set<BucketAccessControls> acl;
-   private final Set<DefaultObjectAccessControls> defaultObjectAcl;
-   private final Owner owner;
-   private final Location location;
-   private final Website website;
-   private final Logging logging;
-   private final Versioning versioning;
-   private final Set<BucketCors> cors;
-   private final BucketLifeCycle lifeCycle;
-   private final StorageClass storageClass;
-
-   private Bucket(String id,  URI selfLink, String name, String etag, @Nullable Long projectNumber, Date timeCreated,
-            Long metageneration, Set<BucketAccessControls> acl, Set<DefaultObjectAccessControls> defaultObjectAcl,
-            Owner owner, @Nullable Location location, @Nullable Website website, @Nullable Logging logging,
-            @Nullable Versioning versioning, Set<BucketCors> cors, @Nullable BucketLifeCycle lifeCycle,
-            @Nullable StorageClass storageClass) {
-
-      super(Kind.BUCKET, id, selfLink, etag);
-      this.projectNumber = projectNumber;
-      this.timeCreated = checkNotNull(timeCreated, "timeCreated");
-      this.metageneration = checkNotNull(metageneration, "metageneration");
-      this.acl = acl.isEmpty() ? null : acl;
-      this.defaultObjectAcl = defaultObjectAcl.isEmpty() ? null : defaultObjectAcl;
-      this.owner = checkNotNull(owner, "Owner");
-      this.location = location;
-      this.website = website;
-      this.logging = logging;
-      this.versioning = versioning;
-      this.cors = cors.isEmpty() ? null : cors;
-      this.lifeCycle = lifeCycle;
-      this.storageClass = storageClass;
-      this.name = checkNotNull(name, "name");
-   }
+@AutoValue
+public abstract class Bucket {
+   @AutoValue
+   public abstract static class Cors {
+      public abstract List<String> origin();
 
-   public Long getProjectNumber() {
-      return projectNumber;
-   }
+      public abstract List<String> method();
 
-   public String getName() {
-      return name;
-   }
+      public abstract List<String> responseHeader();
 
-   public Date getTimeCreated() {
-      return timeCreated;
-   }
+      public abstract Integer maxAgeSeconds();
 
-   public Long getMetageneration() {
-      return metageneration;
+      @SerializedNames({ "origin", "method", "responseHeader", "maxAgeSeconds" })
+      public static Cors create(List<String> origin, List<String> method, List<String> responseHeader,
+            Integer maxAgeSeconds) {
+         return new AutoValue_Bucket_Cors(copyOf(origin), copyOf(method), copyOf(responseHeader), maxAgeSeconds);
+      }
    }
 
-   public Set<BucketAccessControls> getAcl() {
-      return acl;
-   }
+   @AutoValue
+   public abstract static class Logging {
+      public abstract String logBucket();
 
-   public Set<DefaultObjectAccessControls> getDefaultObjectAcl() {
-      return defaultObjectAcl;
-   }
+      @Nullable public abstract String logObjectPrefix();
 
-   public Owner getOwner() {
-      return owner;
+      @SerializedNames({ "logBucket", "logObjectPrefix" })
+      public static Logging create(String logBucket, String logObjectPrefix) {
+         return new AutoValue_Bucket_Logging(logBucket, logObjectPrefix);
+      }
    }
 
-   public Location getLocation() {
-      return location;
-   }
+   @AutoValue
+   public abstract static class LifeCycle {
 
-   public Website getWebsite() {
-      return website;
-   }
+      @AutoValue
+      public abstract static class Rule {
 
-   public Logging getLogging() {
-      return logging;
-   }
+         @AutoValue
+         public abstract static class Action {
+            public abstract String type();
 
-   public Versioning getVersioning() {
-      return versioning;
-   }
+            @SerializedNames("type")
+            public static Action create(String type) {
+               return new AutoValue_Bucket_LifeCycle_Rule_Action(type);
+            }
+         }
 
-   public Set<BucketCors> getCors() {
-      return cors;
-   }
+         @AutoValue
+         public abstract static class Condition {
+            @Nullable public abstract Integer age();
 
-   public BucketLifeCycle getLifeCycle() {
-      return lifeCycle;
-   }
+            @Nullable public abstract Date createdBefore();
 
-   public StorageClass getStorageClass() {
-      return storageClass;
-   }
+            @Nullable public abstract Boolean isLive();
 
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      Bucket that = Bucket.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.name, that.name)
-               && equal(this.projectNumber, that.projectNumber);
+            @Nullable public abstract Integer numNewerVersions();
 
-   }
+            @SerializedNames({ "age", "createdBefore", "isLive", "numNewerVersions" })
+            public static Condition create(Integer age, Date createdBefore, Boolean isLive, Integer numNewerVersions) {
+               return new AutoValue_Bucket_LifeCycle_Rule_Condition(age, createdBefore, isLive, numNewerVersions);
+            }
+         }
 
-   protected Objects.ToStringHelper string() {
-      return super.string().omitNullValues().add("name", name).add("timeCreated", timeCreated)
-               .add("projectNumber", projectNumber).add("metageneration", metageneration).add("acl", acl)
-               .add("defaultObjectAcl", defaultObjectAcl).add("owner", owner).add("location", location)
-               .add("website", website).add("logging", logging).add("versioning", versioning).add("cors", cors)
-               .add("lifeCycle", lifeCycle).add("storageClass", storageClass);
+         public abstract Action action();
 
-   }
+         public abstract Condition condition();
 
-   @Override
-   public String toString() {
-      return string().toString();
-   }
+         @SerializedNames({ "action", "condition" })
+         public static Rule create(Action action, Condition condition) {
+            return new AutoValue_Bucket_LifeCycle_Rule(action, condition);
+         }
+      }
 
-   public static Builder builder() {
-      return new Builder();
-   }
+      public abstract List<Rule> rules();
 
-   public Builder toBuilder() {
-      return new Builder().fromBucket(this);
+      @SerializedNames("rules")
+      public static LifeCycle create(List<Rule> rules) {
+         return new AutoValue_Bucket_LifeCycle(copyOf(rules));
+      }
    }
 
-   public static final class Builder extends Resource.Builder<Builder> {
-
-      private String name;
-      private Long projectNumber;
-      private Date timeCreated;
-      private Long metageneration;
-      private ImmutableSet.Builder<BucketAccessControls> acl = ImmutableSet.builder();
-      private ImmutableSet.Builder<DefaultObjectAccessControls> defaultObjectAcl = ImmutableSet.builder();
-      private Owner owner;
-      private Location location;
-      private Website website;
-      private Logging logging;
-      private Versioning versioning;
-      private ImmutableSet.Builder<BucketCors> cors = ImmutableSet.builder();
-      private BucketLifeCycle lifeCycle;
-      private StorageClass storageClass;
-
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
+   @AutoValue
+   public abstract static class Website {
+      @Nullable public abstract String mainPageSuffix();
 
-      public Builder projectNumber(Long projectNumber) {
-         this.projectNumber = projectNumber;
-         return this;
-      }
+      @Nullable public abstract String notFoundPage();
 
-      public Builder timeCreated(Date timeCreated) {
-         this.timeCreated = timeCreated;
-         return this;
+      @SerializedNames({ "mainPageSuffix", "notFoundPage" })
+      public static Website create(String mainPageSuffix, String notFoundPage) {
+         return new AutoValue_Bucket_Website(mainPageSuffix, notFoundPage);
       }
+   }
 
-      public Builder metageneration(Long metageneration) {
-         this.metageneration = metageneration;
-         return this;
-      }
+   @AutoValue
+   public abstract static class Versioning {
+      public abstract Boolean enabled();
 
-      public Builder owner(Owner owner) {
-         this.owner = owner;
-         return this;
+      @SerializedNames("enabled")
+      public static Versioning create(Boolean enabled) {
+         return new AutoValue_Bucket_Versioning(enabled);
       }
+   }
 
-      public Builder location(Location location) {
-         this.location = location;
-         return this;
-      }
+   public abstract String id();
 
-      public Builder website(Website website) {
-         this.website = website;
-         return this;
-      }
+   public abstract String name();
 
-      public Builder logging(Logging logging) {
-         this.logging = logging;
-         return this;
-      }
+   @Nullable public abstract Long projectNumber();
 
-      public Builder versioning(Versioning versioning) {
-         this.versioning = versioning;
-         return this;
-      }
+   public abstract Date timeCreated();
 
-      public Builder lifeCycle(BucketLifeCycle lifeCycle) {
-         this.lifeCycle = lifeCycle;
-         return this;
-      }
+   public abstract Long metageneration();
 
-      public Builder storageClass(StorageClass storageClass) {
-         this.storageClass = storageClass;
-         return this;
-      }
+   public abstract List<BucketAccessControls> acl();
 
-      public Builder addAcl(BucketAccessControls bucketAccessControls) {
-         this.acl.add(bucketAccessControls);
-         return this;
-      }
+   public abstract List<ObjectAccessControls> defaultObjectAcl();
 
-      public Builder acl(Set<BucketAccessControls> acl) {
-         this.acl.addAll(acl);
-         return this;
-      }
+   public abstract Owner owner();
 
-      public Builder addDefaultObjectAcl(DefaultObjectAccessControls defaultObjectAccessControls) {
-         this.defaultObjectAcl.add(defaultObjectAccessControls);
-         return this;
-      }
+   @Nullable public abstract Location location();
 
-      public Builder defaultObjectAcl(Set<DefaultObjectAccessControls> defaultObjectAcl) {
-         this.defaultObjectAcl.addAll(defaultObjectAcl);
-         return this;
-      }
+   @Nullable public abstract Website website();
 
-      public Builder addCORS(BucketCors cors) {
-         this.cors.add(cors);
-         return this;
-      }
+   @Nullable public abstract Logging logging();
 
-      public Builder cors(Set<BucketCors> cors) {
-         this.cors.addAll(cors);
-         return this;
-      }
+   @Nullable public abstract Versioning versioning();
 
-      @Override
-      protected Builder self() {
-         return this;
-      }
+   public abstract List<Cors> cors();
 
-      public Bucket build() {
-         return new Bucket(super.id, super.selfLink, name, super.etag, projectNumber, timeCreated, metageneration,
-                  acl.build(), defaultObjectAcl.build(), owner, location, website, logging, versioning, cors.build(),
-                  lifeCycle, storageClass);
-      }
+   @Nullable public abstract LifeCycle lifeCycle();
 
-      public Builder fromBucket(Bucket in) {
-         return super.fromResource(in).name(in.getName()).projectNumber(in.getProjectNumber())
-                  .timeCreated(in.getTimeCreated()).metageneration(in.getMetageneration()).acl(in.getAcl())
-                  .defaultObjectAcl(in.getDefaultObjectAcl()).owner(in.getOwner()).location(in.getLocation())
-                  .website(in.getWebsite()).logging(in.getLogging()).versioning(in.getVersioning()).cors(in.getCors())
-                  .lifeCycle(in.getLifeCycle()).storageClass(in.getStorageClass());
-      }
-   }
+   @Nullable public abstract StorageClass storageClass();
 
+   @SerializedNames(
+         { "id", "name", "projectNumber", "timeCreated", "metageneration", "acl", "defaultObjectAcl", "owner",
+               "location", "website", "logging", "versioning", "cors", "lifeCycle", "storageClass" })
+   public static Bucket create(String id, String name, Long projectNumber, Date timeCreated, Long metageneration,
+         List<BucketAccessControls> acl, List<ObjectAccessControls> defaultObjectAcl, Owner owner,
+         Location location, Website website, Logging logging, Versioning versioning, List<Cors> cors,
+         LifeCycle lifeCycle, StorageClass storageClass) {
+      return new AutoValue_Bucket(id, name, projectNumber, timeCreated, metageneration, copyOf(acl),
+            copyOf(defaultObjectAcl), owner, location, website, logging, versioning, copyOf(cors), lifeCycle,
+            storageClass);
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/BucketAccessControls.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/BucketAccessControls.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/BucketAccessControls.java
index 6d0d0ed..f6fc12f 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/BucketAccessControls.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/BucketAccessControls.java
@@ -16,110 +16,55 @@
  */
 package org.jclouds.googlecloudstorage.domain;
 
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.net.URI;
-
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
+import com.google.auto.value.AutoValue;
 
 /**
  * Represents a BucketAccessControls Resource
  *
  * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/bucketAccessControls" />
  */
-public class BucketAccessControls extends Resource {
-
-   private final String bucket;
-   private final String entity;
-   private final Role role;
-   private final String email;
-   private final String domain;
-   private final String entityId;
-   private final ProjectTeam projectTeam;
-
-   private BucketAccessControls(@Nullable String id, @Nullable URI selfLink, @Nullable String etag, String bucket,
-            String entity, @Nullable String entityId, Role role, @Nullable String email, @Nullable String domain,
-            @Nullable ProjectTeam projectTeam) {
-      super(Kind.BUCKET_ACCESS_CONTROL, id == null ? (bucket + "/" + entity) : id, selfLink, etag);
-
-      this.bucket = checkNotNull(bucket, "bucket");
-      this.entity = checkNotNull(entity, "entity");
-      this.entityId = entityId;
-      this.role = checkNotNull(role, "role");
-      this.email = email;
-      this.domain = domain;
-      this.projectTeam = projectTeam;
-   }
+@AutoValue
+public abstract class BucketAccessControls {
 
-   public String getBucket() {
-      return bucket;
+   public enum Role {
+      READER, WRITER, OWNER
    }
 
-   public String getEntity() {
-      return entity;
-   }
+   public abstract String kind();
 
-   public Role getRole() {
-      return role;
-   }
+   public abstract String id();
 
-   public String getEmail() {
-      return email;
-   }
+   public abstract String bucket();
 
-   public String getDomain() {
-      return domain;
-   }
+   public abstract String entity();
 
-   public String getEntityId() {
-      return entityId;
-   }
+   @Nullable public abstract String entityId();
 
-   public ProjectTeam getProjectTeam() {
-      return projectTeam;
-   }
+   public abstract Role role();
 
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      BucketAccessControls that = BucketAccessControls.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.bucket, that.bucket) && equal(this.entity, that.entity)
-               && equal(this.id, that.id);
-   }
+   @Nullable public abstract String email();
 
-   protected Objects.ToStringHelper string() {
-      return super.string().omitNullValues().add("bucket", bucket).add("entity", entity).add("entityId", entityId)
-               .add("role", role).add("email", email).add("domain", domain);
-   }
+   @Nullable public abstract String domain();
 
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(kind, bucket, entity);
-   }
+   @Nullable public abstract ProjectTeam projectTeam();
 
-   @Override
-   public String toString() {
-      return string().toString();
+   @SerializedNames({ "id", "bucket", "entity", "entityId", "role", "email", "domain", "projectTeam" })
+   public static BucketAccessControls create(String id, String bucket, String entity, String entityId, Role role,
+         String email, String domain, ProjectTeam projectTeam) {
+      return new AutoValue_BucketAccessControls("storage#bucketAccessControl",
+            id == null ? (bucket + "/" + entity) : id, bucket, entity, entityId, role, email, domain, projectTeam);
    }
 
    public static Builder builder() {
       return new Builder();
    }
 
-   public Builder toBuilder() {
-      return new Builder().fromBucketACL(this);
-   }
-
-   public static final class Builder extends Resource.Builder<Builder> {
+   public static final class Builder {
 
+      private String id;
       private String bucket;
       private String entity;
       private String entityId;
@@ -128,6 +73,11 @@ public class BucketAccessControls extends Resource {
       private String domain;
       private ProjectTeam projectTeam;
 
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
       public Builder bucket(String bucket) {
          this.bucket = bucket;
          return this;
@@ -164,19 +114,7 @@ public class BucketAccessControls extends Resource {
       }
 
       public BucketAccessControls build() {
-         return new BucketAccessControls(super.id, super.selfLink, super.etag, bucket, entity, entityId, role, email,
-                  domain, projectTeam);
-      }
-
-      public Builder fromBucketACL(BucketAccessControls bACL) {
-         return super.fromResource(bACL).bucket(bACL.getBucket()).entity(bACL.getEntity()).entityId(bACL.getEntityId())
-                  .role(bACL.getRole()).email(bACL.getEmail()).domain(bACL.getDomain())
-                  .projectTeam(bACL.getProjectTeam());
-      }
-
-      @Override
-      protected Builder self() {
-         return this;
+         return BucketAccessControls.create(id, bucket, entity, entityId, role, email, domain, projectTeam);
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java
deleted file mode 100644
index aeddc41..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DefaultObjectAccessControls.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.googlecloudstorage.domain;
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.net.URI;
-
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
-import org.jclouds.javax.annotation.Nullable;
-
-import com.google.common.base.Objects;
-
-/**
- * Represents a DefaultObjectAccessControls Resource
- *
- * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/defaultObjectAccessControls"/>
- */
-public class DefaultObjectAccessControls extends Resource {
-
-   private final String bucket;
-   private final String entity;
-   private final ObjectRole role;
-   private final String email;
-   private final String entityId;
-   private final String domain;
-   private final ProjectTeam projectTeam;
-
-   private DefaultObjectAccessControls(@Nullable String id, @Nullable URI selfLink, @Nullable String etag,
-            @Nullable String bucket, String entity, @Nullable String entityId, ObjectRole role, @Nullable String email,
-            @Nullable String domain, @Nullable ProjectTeam projectTeam) {
-      super(Kind.OBJECT_ACCESS_CONTROL, id, selfLink, etag);
-
-      this.bucket = bucket;
-      this.entity = checkNotNull(entity, "entity");
-      this.entityId = entityId;
-      this.role = checkNotNull(role, "role");
-      this.email = email;
-      this.domain = domain;
-      this.projectTeam = projectTeam;
-   }
-
-   public String getBucket() {
-      return bucket;
-   }
-
-   public String getEntity() {
-      return entity;
-   }
-
-   public ObjectRole getRole() {
-      return role;
-   }
-
-   public String getEmail() {
-      return email;
-   }
-
-   public String getDomain() {
-      return domain;
-   }
-
-   public String getEntityId() {
-      return entityId;
-   }
-
-   public ProjectTeam getProjectTeam() {
-      return projectTeam;
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      DefaultObjectAccessControls that = DefaultObjectAccessControls.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.entity, that.entity) && equal(this.role, that.role);
-   }
-
-   protected Objects.ToStringHelper string() {
-      return super.string().omitNullValues().add("bucket", bucket).add("entity", entity).add("entityId", entityId)
-               .add("role", role).add("email", email).add("domain", domain);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(kind, entity);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return new Builder().fromObjectAccessControls(this);
-   }
-
-   public static final class Builder extends Resource.Builder<Builder> {
-
-      private String bucket;
-      private String entity;
-      private String entityId;
-      private ObjectRole role;
-      private String email;
-      private String domain;
-      private ProjectTeam projectTeam;
-
-      public Builder bucket(String bucket) {
-         this.bucket = bucket;
-         return this;
-      }
-
-      public Builder entity(String entity) {
-         this.entity = entity;
-         return this;
-      }
-
-      public Builder entityId(String entityId) {
-         this.entityId = entityId;
-         return this;
-      }
-
-      public Builder role(ObjectRole role) {
-         this.role = role;
-         return this;
-      }
-
-      public Builder email(String email) {
-         this.email = email;
-         return this;
-      }
-
-      public Builder domain(String domain) {
-         this.domain = domain;
-         return this;
-      }
-
-      public Builder projectTeam(ProjectTeam projectTeam) {
-         this.projectTeam = projectTeam;
-         return this;
-      }
-
-      public DefaultObjectAccessControls build() {
-         return new DefaultObjectAccessControls(super.id, super.selfLink, super.etag, bucket, entity, entityId, role,
-                  email, domain, projectTeam);
-      }
-
-      public Builder fromObjectAccessControls(DefaultObjectAccessControls in) {
-         return super.fromResource(in).bucket(in.getBucket()).entity(in.getEntity()).entityId(in.getEntityId())
-                  .role(in.getRole()).email(in.getEmail()).domain(in.getDomain()).projectTeam(in.getProjectTeam());
-      }
-
-      @Override
-      protected Builder self() {
-         return this;
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java
index 272074b..dd8a07b 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java
@@ -23,10 +23,6 @@ public final class DomainResourceReferences {
    private DomainResourceReferences() {
    }
 
-   public enum Role {
-      READER, WRITER, OWNER
-   }
-
    public enum ObjectRole {
       READER, OWNER
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainUtils.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainUtils.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainUtils.java
deleted file mode 100644
index c175691..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainUtils.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.googlecloudstorage.domain;
-
-import java.util.List;
-
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Bytes;
-
-public final class DomainUtils {
-
-   private DomainUtils() {
-   }
-
-   public static byte[] reverse(byte[] b) {
-      List<Byte> hashByte = Bytes.asList(b);
-      List<Byte> reversedList = Lists.reverse(hashByte);
-      return Bytes.toArray(reversedList);
-   }
-
-   public static String  generateContentRange(Long lowerLimit, Long upperLimit, Long totalSize) {
-      return  "bytes " + lowerLimit + "-" + upperLimit + "/" + totalSize;
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/GCSObject.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/GCSObject.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/GCSObject.java
index 865cd90..7b3fc7f 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/GCSObject.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/GCSObject.java
@@ -17,365 +17,63 @@
 
 package org.jclouds.googlecloudstorage.domain;
 
-import static com.google.common.base.Objects.equal;
+import static org.jclouds.googlecloudstorage.internal.NullSafeCopies.copyOf;
 
 import java.net.URI;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
-import org.jclouds.googlecloudstorage.domain.internal.Owner;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.hash.HashCode;
-import com.google.common.io.BaseEncoding;
+import com.google.auto.value.AutoValue;
 
 /**
  * This class represent an object in a Google Cloud Storage Bucket.
  *
  * @see <a href = "https://developers.google.com/storage/docs/json_api/v1/Objects"/>
  */
-public class GCSObject extends Resource {
-
-   private final String name;
-   private final String bucket;
-   private final Long generation;
-   private final Long metageneration;
-   private final String contentType;
-   private final Date updated;
-   private final Date timeDeleted;
-   private final StorageClass storageClass;
-   private final Long size;
-   private final String md5Hash;
-   private final URI mediaLink;
-   private final Map<String, String> metadata;
-   private final String contentEncoding;
-   private final String contentDisposition;
-   private final String contentLanguage;
-   private final String cacheControl;
-   private final Set<ObjectAccessControls> acl;
-   private final Owner owner;
-   private final String crc32c;
-   private final Integer componentCount;
-
-   private GCSObject(String id, URI selfLink, String etag, String name, String bucket, Long generation,
-            Long metageneration, String contentType, Date updated, Date timeDeleted, StorageClass storageClass,
-            Long size, String md5Hash, URI mediaLink, Map<String, String> metadata, String contentEncoding,
-            String contentDisposition, String contentLanguage, String cacheControl, Set<ObjectAccessControls> acl,
-            Owner owner, String crc32c, Integer componentCount) {
-      super(Kind.OBJECT, id, selfLink, etag);
-      this.name = name;
-      this.bucket = bucket;
-      this.generation = generation;
-      this.metageneration = metageneration;
-      this.contentType = contentType;
-      this.updated = updated;
-      this.timeDeleted = timeDeleted;
-      this.storageClass = storageClass;
-      this.size = size;
-      this.md5Hash = md5Hash;
-      this.mediaLink = mediaLink;
-      this.metadata = (metadata == null) ? ImmutableMap.<String, String> of() : metadata;
-      this.contentEncoding = contentEncoding;
-      this.contentDisposition = contentDisposition;
-      this.contentLanguage = contentLanguage;
-      this.cacheControl = cacheControl;
-      this.acl = acl;
-      this.owner = owner;
-      this.crc32c = crc32c;
-      this.componentCount = componentCount;
-   }
-
-   public String getName() {
-      return name;
-   }
-
-   public String getBucket() {
-      return bucket;
-   }
-
-   public Long getGeneration() {
-      return generation;
-   }
-
-   public Long getMetageneration() {
-      return metageneration;
-   }
-
-   public String getContentType() {
-      return contentType;
-   }
-
-   public Date getUpdated() {
-      return updated;
-   }
-
-   public Date getTimeDeleted() {
-      return timeDeleted;
-   }
-
-   public StorageClass getStorageClass() {
-      return storageClass;
-   }
-
-   public Long getSize() {
-      return size;
-   }
-
-   private String getMd5Hash() {
-      return md5Hash;
-   }
-
-   public HashCode getMd5HashCode() {
-      if (md5Hash != null) {
-         HashCode hc = HashCode.fromBytes(BaseEncoding.base64().decode(md5Hash));
-         return hc;
-      }
-      return null;
-   }
-
-   public URI getMediaLink() {
-      return mediaLink;
-   }
-
-   public Map<String, String> getAllMetadata() {
-      return this.metadata;
-   }
-
-   public String getContentEncoding() {
-      return contentEncoding;
-   }
-
-   public String getContentDisposition() {
-      return contentDisposition;
-   }
-
-   public String getContentLanguage() {
-      return contentLanguage;
-   }
-
-   public String getCacheControl() {
-      return cacheControl;
-   }
-
-   public Set<ObjectAccessControls> getAcl() {
-      return acl;
-   }
-
-   public Owner getOwner() {
-      return owner;
-   }
-
-   private String getCrc32c() {
-      return crc32c;
-   }
-
-   public HashCode getCrc32cHashcode() {
-      if (crc32c != null) {
-         HashCode hc = HashCode.fromBytes(DomainUtils.reverse(BaseEncoding.base64().decode(crc32c)));
-         return hc;
-      }
-      return null;
-
-   }
-
-   public Integer getComponentCount() {
-      return componentCount;
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      GCSObject that = GCSObject.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.name, that.name) && equal(this.bucket, that.bucket);
-
-   }
-
-   protected Objects.ToStringHelper string() {
-      return super.string().omitNullValues().add("name", name).add("bucket", bucket).add("generation", generation)
-               .add("metageneration", metageneration).add("timeDeleted", timeDeleted).add("updated", updated)
-               .add("storageClass", storageClass).add("size", size).add("md5Hash", md5Hash).add("mediaLink", mediaLink)
-               .add("metadata", metadata).add("contentEncoding", contentEncoding)
-               .add("contentDisposition", contentDisposition).add("contentLanguage", contentLanguage)
-               .add("cacheControl", cacheControl).add("crc32c", crc32c).add("componentCount", componentCount)
-               .add("acl", acl).add("owner", owner);
-
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return new Builder().fromGCSObject(this);
-   }
-
-   protected static final class Builder extends Resource.Builder<Builder> {
-
-      private String name;
-      private String bucket;
-      private Long generation;
-      private Long metageneration;
-      private String contentType;
-      private Date updated;
-      private Date timeDeleted;
-      private StorageClass storageClass;
-      private Long size;
-      private String md5Hash;
-      private URI mediaLink;
-      private ImmutableMap.Builder<String, String> metadata = ImmutableMap.builder();
-      private String contentEncoding;
-      private String contentDisposition;
-      private String contentLanguage;
-      private String cacheControl;
-      private ImmutableSet.Builder<ObjectAccessControls> acl = ImmutableSet.builder();
-      private Owner owner;
-      private String crc32c;
-      private Integer componentCount;
-
-      protected Builder name(String name) {
-         this.name = name;
-         return this;
-      }
-
-      protected Builder bucket(String bucket) {
-         this.bucket = bucket;
-         return this;
-      }
-
-      protected Builder generation(Long generation) {
-         this.generation = generation;
-         return this;
-      }
-
-      protected Builder metageneration(Long metageneration) {
-         this.metageneration = metageneration;
-         return this;
-      }
-
-      protected Builder customMetadata(Map<String, String> metadata) {
-         this.metadata.putAll(metadata);
-         return this;
-      }
-
-      protected Builder addCustomMetadata(String key, String value) {
-         this.metadata.put(key, value);
-         return this;
-      }
-
-      protected Builder size(Long size) {
-         this.size = size;
-         return this;
-      }
-
-      protected Builder componentCount(Integer componentCount) {
-         this.componentCount = componentCount;
-         return this;
-      }
-
-      protected Builder contentType(String contentType) {
-         this.contentType = contentType;
-         return this;
-      }
-
-      /** Requires base64 encoded crc32c string */
-      protected Builder md5Hash(String md5Hash) {
-         this.md5Hash = md5Hash;
-         return this;
-      }
-
-      protected Builder mediaLink(URI mediaLink) {
-         this.mediaLink = mediaLink;
-         return this;
-      }
-
-      protected Builder contentEncoding(String contentEncoding) {
-         this.contentEncoding = contentEncoding;
-         return this;
-      }
-
-      protected Builder contentDisposition(String contentDisposition) {
-         this.contentDisposition = contentDisposition;
-         return this;
-      }
-
-      protected Builder contentLanguage(String contentLanguage) {
-         this.contentLanguage = contentLanguage;
-         return this;
-      }
-
-      protected Builder cacheControl(String cacheControl) {
-         this.cacheControl = cacheControl;
-         return this;
-      }
-
-      protected Builder updated(Date updated) {
-         this.updated = updated;
-         return this;
-      }
-
-      protected Builder timeDeleted(Date timeDeleted) {
-         this.timeDeleted = timeDeleted;
-         return this;
-      }
-
-      protected Builder owner(Owner owner) {
-         this.owner = owner;
-         return this;
-      }
-
-      protected Builder storageClass(StorageClass storageClass) {
-         this.storageClass = storageClass;
-         return this;
-      }
-
-      protected Builder addAcl(ObjectAccessControls bucketAccessControls) {
-         this.acl.add(bucketAccessControls);
-         return this;
-      }
-
-      protected Builder acl(Set<ObjectAccessControls> acl) {
-         this.acl.addAll(acl);
-         return this;
-      }
-
-      /** Requires base64 encoded crc32c string */
-      protected Builder crc32c(String crc32c) {
-         this.crc32c = crc32c;
-         return this;
-      }
-
-      @Override
-      protected Builder self() {
-         return this;
-      }
-
-      public GCSObject build() {
-         return new GCSObject(super.id, super.selfLink, super.etag, name, bucket, generation, metageneration,
-                  contentType, updated, timeDeleted, storageClass, size, md5Hash, mediaLink, metadata.build(),
-                  contentEncoding, contentDisposition, contentLanguage, cacheControl, acl.build(), owner, crc32c,
-                  componentCount);
-      }
-
-      protected Builder fromGCSObject(GCSObject in) {
-         return super.fromResource(in).name(in.getName()).bucket(in.getBucket()).generation(in.getGeneration())
-                  .metageneration(in.getMetageneration()).contentEncoding(in.getContentEncoding())
-                  .contentDisposition(in.getContentDisposition()).contentLanguage(in.getContentLanguage())
-                  .md5Hash(in.getMd5Hash()).mediaLink(in.getMediaLink()).timeDeleted(in.getTimeDeleted())
-                  .cacheControl(in.getCacheControl()).crc32c(in.getCrc32c()).size(in.getSize())
-                  .contentType(in.getContentType()).acl(in.getAcl()).owner(in.getOwner())
-                  .storageClass(in.getStorageClass()).customMetadata(in.getAllMetadata());
-      }
+@AutoValue
+// TODO: nullable sweep
+public abstract class GCSObject {
+
+   public abstract String id();
+   public abstract URI selfLink();
+   public abstract String etag();
+   public abstract String name();
+   public abstract String bucket();
+   public abstract Long generation();
+   public abstract Long metageneration();
+   public abstract String contentType();
+   public abstract Date updated();
+   public abstract Date timeDeleted();
+   public abstract StorageClass storageClass();
+   public abstract Long size();
+   @Nullable public abstract String md5Hash();
+   public abstract URI mediaLink();
+   public abstract Map<String, String> metadata();
+   public abstract String contentEncoding();
+   public abstract String contentDisposition();
+   public abstract String contentLanguage();
+   public abstract String cacheControl();
+   public abstract List<ObjectAccessControls> acl();
+   public abstract Owner owner();
+   @Nullable public abstract String crc32c();
+   public abstract Integer componentCount();
+
+   @SerializedNames(
+         { "id", "selfLink", "etag", "name", "bucket", "generation", "metageneration", "contentType", "updated",
+               "timeDeleted", "storageClass", "size", "md5Hash", "mediaLink", "metadata", "contentEncoding",
+               "contentDisposition", "contentLanguage", "cacheControl", "acl", "owner", "crc32c", "componentCount" })
+   public static GCSObject create(String id, URI selfLink, String etag, String name, String bucket, Long generation,
+         Long metageneration, String contentType, Date updated, Date timeDeleted, StorageClass storageClass, Long size,
+         String md5Hash, URI mediaLink, Map<String, String> metadata, String contentEncoding, String contentDisposition,
+         String contentLanguage, String cacheControl, List<ObjectAccessControls> acl, Owner owner, String crc32c,
+         Integer componentCount) {
+      return new AutoValue_GCSObject(id, selfLink, etag, name, bucket, generation, metageneration, contentType, updated,
+            timeDeleted, storageClass, size, md5Hash, mediaLink, copyOf(metadata), contentEncoding, contentDisposition,
+            contentLanguage, cacheControl, copyOf(acl), owner, crc32c, componentCount);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListBucketAccessControls.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListBucketAccessControls.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListBucketAccessControls.java
deleted file mode 100644
index 0a28d60..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListBucketAccessControls.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.googlecloudstorage.domain;
-
-/**
- * Represents the structure of a response from DefaultObjectAccessControls list operation
- * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/bucketAccessControls/list"/>
- */
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Objects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Set;
-
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-
-public class ListBucketAccessControls {
-
-   private final Kind kind;
-   private final Set<BucketAccessControls> items;
-
-   private ListBucketAccessControls(Kind kind, Set<BucketAccessControls> items) {
-
-      this.kind = checkNotNull(kind, "kind");
-      this.items = checkNotNull(items, "items");
-   }
-
-   public Kind getKind() {
-      return kind;
-   }
-
-   public Set<BucketAccessControls> getItems() {
-      return items;
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      ListBucketAccessControls that = ListBucketAccessControls.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.items, that.items);
-
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).omitNullValues().add("kind", kind).add("items", items);
-
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return new Builder().fromListBucketAccessControls(this);
-   }
-
-   public static final class Builder {
-
-      private Kind kind;
-      private ImmutableSet.Builder<BucketAccessControls> items = ImmutableSet.builder();
-
-      public Builder kind(Kind kind) {
-         this.kind = kind;
-         return this;
-      }
-
-      public Builder addItems(BucketAccessControls bucketAccessControls) {
-         this.items.add(bucketAccessControls);
-         return this;
-      }
-
-      public Builder items(Set<BucketAccessControls> items) {
-         this.items.addAll(items);
-         return this;
-      }
-
-      public ListBucketAccessControls build() {
-         return new ListBucketAccessControls(this.kind, items.build());
-      }
-
-      public Builder fromListBucketAccessControls(ListBucketAccessControls in) {
-         return this.kind(in.getKind()).items(in.getItems());
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java
deleted file mode 100644
index 2813e9c..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListDefaultObjectAccessControls.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.googlecloudstorage.domain;
-
-/**
- * Represents the structure of a response from DefaultObjectAccessControls list operation
- * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/defaultObjectAccessControls/list"/>
- */
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Objects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Set;
-
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-
-public class ListDefaultObjectAccessControls {
-
-   private final Kind kind;
-   private final Set<DefaultObjectAccessControls> items;
-
-   private ListDefaultObjectAccessControls(Kind kind, Set<DefaultObjectAccessControls> items) {
-
-      this.kind = checkNotNull(kind, "kind");
-      this.items = checkNotNull(items, "items");
-   }
-
-   public Kind getKind() {
-      return kind;
-   }
-
-   public Set<DefaultObjectAccessControls> getItems() {
-      return items;
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      ListDefaultObjectAccessControls that = ListDefaultObjectAccessControls.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.items, that.items);
-
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).omitNullValues().add("kind", kind).add("items", items);
-
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return new Builder().fromListDefaultObjectAccessControls(this);
-   }
-
-   public static final class Builder {
-
-      private Kind kind;
-      private ImmutableSet.Builder<DefaultObjectAccessControls> items = ImmutableSet.builder();
-
-      public Builder kind(Kind kind) {
-         this.kind = kind;
-         return this;
-      }
-
-      public Builder addItems(DefaultObjectAccessControls defaultObjectAccessControls) {
-         this.items.add(defaultObjectAccessControls);
-         return this;
-      }
-
-      public Builder items(Set<DefaultObjectAccessControls> items) {
-         this.items.addAll(items);
-         return this;
-      }
-
-      public ListDefaultObjectAccessControls build() {
-         return new ListDefaultObjectAccessControls(this.kind, items.build());
-      }
-
-      public Builder fromListDefaultObjectAccessControls(ListDefaultObjectAccessControls in) {
-         return this.kind(in.getKind()).items(in.getItems());
-      }
-   }
-}