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:10 UTC

[1/4] Use AutoValue to reduce bulk of Google Storage value types.

Repository: jclouds-labs-google
Updated Branches:
  refs/heads/master cca44c2e6 -> b8670b16e


http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclInsertTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclInsertTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclInsertTest.java
index 0e7c509..b38ce42 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclInsertTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclInsertTest.java
@@ -16,13 +16,11 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class BucketAclInsertTest extends BaseGoogleCloudStorageParseTest<BucketAccessControls> {
@@ -38,9 +36,7 @@ public class BucketAclInsertTest extends BaseGoogleCloudStorageParseTest<BucketA
       return BucketAccessControls
                .builder()
                .id("jcloudtestbucket/allAuthenticatedUsers")
-               .selfLink(
-                        URI.create("https://content.googleapis.com/storage/v1/b/jcloudtestbucket/acl/allAuthenticatedUsers"))
-               .bucket("jcloudtestbucket").entity("allAuthenticatedUsers").role(Role.WRITER).etag("CAQ=").build();
+               .bucket("jcloudtestbucket").entity("allAuthenticatedUsers").role(Role.WRITER).build();
 
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclListTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclListTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclListTest.java
index 6428825..077eb46 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclListTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclListTest.java
@@ -16,34 +16,30 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
+import java.util.List;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
-import org.jclouds.googlecloudstorage.domain.ListBucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam.Team;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam.Team;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
+import org.jclouds.rest.annotations.SelectJson;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableList;
 
-public class BucketAclListTest extends BaseGoogleCloudStorageParseTest<ListBucketAccessControls> {
+public class BucketAclListTest extends BaseGoogleCloudStorageParseTest<List<BucketAccessControls>> {
 
    private BucketAccessControls item_1 = BucketAccessControls.builder().id("jcloudtestbucket/allUsers")
-            .selfLink(URI.create("https://content.googleapis.com/storage/v1/b/jcloudtestbucket/acl/allUsers"))
-            .bucket("jcloudtestbucket").entity("allUsers").role(Role.READER).etag("CAc=").build();
+            .bucket("jcloudtestbucket").entity("allUsers").role(Role.READER).build();
 
    private BucketAccessControls item_2 = BucketAccessControls
             .builder()
             .id("jcloudtestbucket/project-owners-1082289308625")
-            .selfLink(
-                     URI.create("https://content.googleapis.com/storage/v1/b/jcloudtestbucket/acl/project-owners-1082289308625"))
-            .projectTeam(ProjectTeam.builder().projectNumber("1082289308625").team(Team.OWNERS).build())
-            .bucket("jcloudtestbucket").entity("project-owners-1082289308625").role(Role.OWNER).etag("CAc=").build();
+            .projectTeam(ProjectTeam.create("1082289308625", Team.OWNERS))
+            .bucket("jcloudtestbucket").entity("project-owners-1082289308625").role(Role.OWNER).build();
 
    @Override
    public String resource() {
@@ -52,8 +48,8 @@ public class BucketAclListTest extends BaseGoogleCloudStorageParseTest<ListBucke
 
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
-   public ListBucketAccessControls expected() {
-      return ListBucketAccessControls.builder().kind(Kind.BUCKET_ACCESS_CONTROLS)
-               .items(ImmutableSet.of(item_1, item_2)).build();
+   @SelectJson("items")
+   public List<BucketAccessControls> expected() {
+      return ImmutableList.of(item_1, item_2);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclUpdateTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclUpdateTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclUpdateTest.java
index d111801..bfba5e1 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclUpdateTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclUpdateTest.java
@@ -16,13 +16,11 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class BucketAclUpdateTest extends BaseGoogleCloudStorageParseTest<BucketAccessControls> {
@@ -36,7 +34,6 @@ public class BucketAclUpdateTest extends BaseGoogleCloudStorageParseTest<BucketA
    @Consumes(MediaType.APPLICATION_JSON)
    public BucketAccessControls expected() {
       return BucketAccessControls.builder().id("jcloudtestbucket/allUsers")
-               .selfLink(URI.create("https://content.googleapis.com/storage/v1/b/jcloudtestbucket/acl/allUsers"))
-               .bucket("jcloudtestbucket").entity("allUsers").role(Role.OWNER).etag("CAg=").build();
+               .bucket("jcloudtestbucket").entity("allUsers").role(Role.OWNER).build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketUpdateTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketUpdateTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketUpdateTest.java
index 49c09fd..da57c19 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketUpdateTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketUpdateTest.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
@@ -25,7 +23,7 @@ import org.jclouds.date.internal.SimpleDateFormatDateService;
 import org.jclouds.googlecloudstorage.domain.Bucket;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Location;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
-import org.jclouds.googlecloudstorage.domain.internal.Owner;
+import org.jclouds.googlecloudstorage.domain.Owner;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class BucketUpdateTest extends BaseGoogleCloudStorageParseTest<Bucket> {
@@ -38,12 +36,22 @@ public class BucketUpdateTest extends BaseGoogleCloudStorageParseTest<Bucket> {
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
    public Bucket expected() {
-      return Bucket.builder().id("bhashbucket")
-               .selfLink(URI.create("https://www.googleapis.com/storage/v1/b/bhashbucket")).name("bhashbucket")
-               .projectNumber(Long.valueOf("1082289308625"))
-               .timeCreated(new SimpleDateFormatDateService().iso8601DateParse("2014-06-02T19:19:41.112z"))
-               .metageneration(Long.valueOf(204)).location(Location.US).storageClass(StorageClass.STANDARD)
-               .etag("CMwB").owner(Owner.builder().entity("project-owners-1082289308625").build()).build();
-
+      return Bucket.create(
+            "bhashbucket", // id
+            "bhashbucket", // name
+            1082289308625l, // projectNumber
+            new SimpleDateFormatDateService().iso8601DateParse("2014-06-02T19:19:41.112z"), // timeCreated
+            204l, // metageneration
+            null, // acl
+            null, // defaultObjectAcl
+            Owner.create("project-owners-1082289308625", null), // owner
+            Location.US, // location
+            null, // website
+            null, // logging
+            null, // versioning
+            null, // cors
+            null, // lifeCycle
+            StorageClass.STANDARD // storageClass
+      );
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclGetTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclGetTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclGetTest.java
index 150374d..0183d71 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclGetTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclGetTest.java
@@ -20,12 +20,12 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam.Team;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam.Team;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
-public class DefaultObjectAclGetTest extends BaseGoogleCloudStorageParseTest<DefaultObjectAccessControls> {
+public class DefaultObjectAclGetTest extends BaseGoogleCloudStorageParseTest<ObjectAccessControls> {
 
    @Override
    public String resource() {
@@ -34,9 +34,9 @@ public class DefaultObjectAclGetTest extends BaseGoogleCloudStorageParseTest<Def
 
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
-   public DefaultObjectAccessControls expected() {
-      return DefaultObjectAccessControls.builder().entity("project-owners-1082289308625").role(ObjectRole.OWNER)
-               .etag("CAk=").projectTeam(ProjectTeam.builder().projectNumber("1082289308625").team(Team.OWNERS).build())
+   public ObjectAccessControls expected() {
+      return ObjectAccessControls.builder().entity("project-owners-1082289308625").role(ObjectRole.OWNER)
+               .projectTeam(ProjectTeam.create("1082289308625", Team.OWNERS))
                .build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclInsertTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclInsertTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclInsertTest.java
index e14ab16..c449c42 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclInsertTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclInsertTest.java
@@ -19,11 +19,11 @@ package org.jclouds.googlecloudstorage.parse;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
-public class DefaultObjectAclInsertTest extends BaseGoogleCloudStorageParseTest<DefaultObjectAccessControls> {
+public class DefaultObjectAclInsertTest extends BaseGoogleCloudStorageParseTest<ObjectAccessControls> {
 
    @Override
    public String resource() {
@@ -32,8 +32,7 @@ public class DefaultObjectAclInsertTest extends BaseGoogleCloudStorageParseTest<
 
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
-   public DefaultObjectAccessControls expected() {
-      return DefaultObjectAccessControls.builder().entity("allUsers").role(ObjectRole.OWNER).etag("CAo=").build();
-
+   public ObjectAccessControls expected() {
+      return ObjectAccessControls.builder().entity("allUsers").role(ObjectRole.OWNER).build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclListTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclListTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclListTest.java
index ee7115c..afc66ae 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclListTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/DefaultObjectAclListTest.java
@@ -16,22 +16,24 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
+import java.util.Arrays;
+import java.util.List;
+
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.ListDefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam.Team;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam.Team;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
+import org.jclouds.rest.annotations.SelectJson;
 
-public class DefaultObjectAclListTest extends BaseGoogleCloudStorageParseTest<ListDefaultObjectAccessControls> {
+public class DefaultObjectAclListTest extends BaseGoogleCloudStorageParseTest<List<ObjectAccessControls>> {
 
-   private DefaultObjectAccessControls item_1 = DefaultObjectAccessControls.builder()
+   private ObjectAccessControls item_1 = ObjectAccessControls.builder()
             .entity("project-owners-1082289308625").role(ObjectRole.OWNER)
-            .projectTeam(ProjectTeam.builder().projectNumber("1082289308625").team(Team.OWNERS).build()).etag("CAk=")
+            .projectTeam(ProjectTeam.create("1082289308625", Team.OWNERS))
             .build();
 
    @Override
@@ -41,7 +43,8 @@ public class DefaultObjectAclListTest extends BaseGoogleCloudStorageParseTest<Li
 
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
-   public ListDefaultObjectAccessControls expected() {
-      return ListDefaultObjectAccessControls.builder().kind(Kind.OBJECT_ACCESS_CONTROLS).addItems(item_1).build();
+   @SelectJson("items")
+   public List<ObjectAccessControls> expected() {
+      return Arrays.asList(item_1);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/FullBucketGetTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/FullBucketGetTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/FullBucketGetTest.java
index e6ffa05..14d473b 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/FullBucketGetTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/FullBucketGetTest.java
@@ -16,23 +16,23 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
+import java.util.Arrays;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.googlecloudstorage.domain.Bucket;
+import org.jclouds.googlecloudstorage.domain.Bucket.Cors;
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Location;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.Bucket;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
-import org.jclouds.googlecloudstorage.domain.internal.BucketCors;
-import org.jclouds.googlecloudstorage.domain.internal.Owner;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam.Team;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
+import org.jclouds.googlecloudstorage.domain.Owner;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam.Team;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class FullBucketGetTest extends BaseGoogleCloudStorageParseTest<Bucket> {
@@ -40,17 +40,16 @@ public class FullBucketGetTest extends BaseGoogleCloudStorageParseTest<Bucket> {
    private final BucketAccessControls acl1 = BucketAccessControls
             .builder()
             .id("jcloudtestbucket3500/project-owners-1082289308625")
-            .selfLink(
-                     URI.create("https://www.googleapis.com/storage/v1/b/jcloudtestbucket3500/acl/project-owners-1082289308625"))
             .bucket("jcloudtestbucket3500").entity("project-owners-1082289308625").role(Role.OWNER)
-            .projectTeam(ProjectTeam.builder().projectNumber("1082289308625").team(Team.OWNERS).build()).etag("CAo=")
+            .projectTeam(ProjectTeam.create("1082289308625", Team.OWNERS))
             .build();
 
-   private final DefaultObjectAccessControls defObjectAcl = DefaultObjectAccessControls.builder()
-            .entity("project-owners-1082289308625").role(ObjectRole.OWNER).etag("CAo=").build();
+   private final ObjectAccessControls defObjectAcl = ObjectAccessControls.builder()
+            .entity("project-owners-1082289308625").role(ObjectRole.OWNER).build();
 
-   private final BucketCors bucketCors = BucketCors.builder().addOrigin("http://example.appspot.com").addMethod("GET")
-            .addMethod("HEAD").addResponseHeader("x-meta-goog-custom").maxAgeSeconds(10).build();
+   private final Cors bucketCors = Cors
+         .create(Arrays.asList("http://example.appspot.com"), Arrays.asList("GET", "HEAD"),
+               Arrays.asList("x-meta-goog-custom"), 10);
 
    @Override
    public String resource() {
@@ -60,13 +59,22 @@ public class FullBucketGetTest extends BaseGoogleCloudStorageParseTest<Bucket> {
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
    public Bucket expected() {
-      return Bucket.builder().id("jcloudtestbucket3500")
-               .selfLink(URI.create("https://www.googleapis.com/storage/v1/b/jcloudtestbucket3500"))
-               .name("jcloudtestbucket3500").projectNumber(Long.valueOf("1082289308625"))
-               .timeCreated(new SimpleDateFormatDateService().iso8601DateParse("2014-06-19T14:03:22.345Z"))
-               .metageneration(Long.valueOf(10)).owner(Owner.builder().entity("project-owners-1082289308625").build())
-               .location(Location.US).storageClass(StorageClass.STANDARD).etag("CAo=").addAcl(acl1)
-               .addDefaultObjectAcl(defObjectAcl).addCORS(bucketCors).build();
+      return Bucket.create(
+            "jcloudtestbucket3500", // id
+            "jcloudtestbucket3500", // name
+            1082289308625l, // projectNumber
+            new SimpleDateFormatDateService().iso8601DateParse("2014-06-19T14:03:22.345Z"), // timeCreated
+            10l, // metageneration
+            Arrays.asList(acl1), // acl
+            Arrays.asList(defObjectAcl), // defaultObjectAcl
+            Owner.create("project-owners-1082289308625", null), // owner
+            Location.US, // location
+            null, // website
+            null, // logging
+            null, // versioning
+            Arrays.asList(bucketCors), // cors
+            null, // lifeCycle
+            StorageClass.STANDARD // storageClass
+      );
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketListTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketListTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketListTest.java
index 220fd5b..af160fd 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketListTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketListTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
+import java.util.Arrays;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
@@ -26,28 +26,35 @@ import org.jclouds.googlecloudstorage.domain.Bucket;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Location;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
 import org.jclouds.googlecloudstorage.domain.ListPage;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-import org.jclouds.googlecloudstorage.domain.internal.Owner;
+import org.jclouds.googlecloudstorage.domain.Owner;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class NoAclBucketListTest extends BaseGoogleCloudStorageParseTest<ListPage<Bucket>> {
 
-   private Bucket item1 = Bucket.builder().id("bhashbucket")
-            .selfLink(URI.create("https://content.googleapis.com/storage/v1/b/bhashbucket")).name("bhashbucket")
-            .projectNumber(Long.valueOf("1082289308625"))
-            .timeCreated(new SimpleDateFormatDateService().iso8601DateParse("2014-06-02T19:19:41.112z"))
-            .metageneration(Long.valueOf(99)).owner(Owner.builder().entity("project-owners-1082289308625").build())
-            .location(Location.US).storageClass(StorageClass.STANDARD).etag("CGM=").build();
+   private Bucket item1 = Bucket.create("bhashbucket", // id
+         "bhashbucket", // name
+         1082289308625l, // projectNumber
+         new SimpleDateFormatDateService().iso8601DateParse("2014-06-02T19:19:41.112z"), // timeCreated
+         99l, // metageneration
+         null, // acl
+         null, // defaultObjectAcl
+         Owner.create("project-owners-1082289308625", null), // owner
+         Location.US, // location
+         null, // website
+         null, // logging
+         null, // versioning
+         null, // cors
+         null, // lifeCycle
+         StorageClass.STANDARD // storageClass
+   );
 
    @Override
    public String resource() {
       return "/no_acl_bucket_list.json";
    }
 
-   @Override
-   @Consumes(MediaType.APPLICATION_JSON)
+   @Override @Consumes(MediaType.APPLICATION_JSON)
    public ListPage<Bucket> expected() {
-      return ListPage.<Bucket> builder().kind(Kind.BUCKETS).nextPageToken("bhashbucket").addItem(item1).build();
+      return ListPage.create(Arrays.asList(item1), "bhashbucket", null);
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketTest.java
index 184af67..a2f4091 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/NoAclBucketTest.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
@@ -25,7 +23,7 @@ import org.jclouds.date.internal.SimpleDateFormatDateService;
 import org.jclouds.googlecloudstorage.domain.Bucket;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Location;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
-import org.jclouds.googlecloudstorage.domain.internal.Owner;
+import org.jclouds.googlecloudstorage.domain.Owner;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class NoAclBucketTest extends BaseGoogleCloudStorageParseTest<Bucket> {
@@ -38,12 +36,22 @@ public class NoAclBucketTest extends BaseGoogleCloudStorageParseTest<Bucket> {
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
    public Bucket expected() {
-      return Bucket.builder().id("bhashbucket")
-               .selfLink(URI.create("https://content.googleapis.com/storage/v1/b/bhashbucket")).name("bhashbucket")
-               .projectNumber(Long.valueOf("1082289308625"))
-               .timeCreated(new SimpleDateFormatDateService().iso8601DateParse("2014-06-02T19:19:41.112z"))
-               .metageneration(Long.valueOf(87)).owner(Owner.builder().entity("project-owners-1082289308625").build())
-               .location(Location.US).storageClass(StorageClass.STANDARD).etag("CFc=").build();
+      return Bucket.create(
+            "bhashbucket", // id
+            "bhashbucket", // name
+            1082289308625l, // projectNumber
+            new SimpleDateFormatDateService().iso8601DateParse("2014-06-02T19:19:41.112z"), // timeCreated
+            87l, // metageneration
+            null, // acl
+            null, // defaultObjectAcl
+            Owner.create("project-owners-1082289308625", null), // owner
+            Location.US, // location
+            null, // website
+            null, // logging
+            null, // versioning
+            null, // cors
+            null, // lifeCycle
+            StorageClass.STANDARD // storageClass
+      );
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclGetTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclGetTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclGetTest.java
index ff34b35..d50c284 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclGetTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclGetTest.java
@@ -16,15 +16,13 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
 import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam;
-import org.jclouds.googlecloudstorage.domain.internal.ProjectTeam.Team;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam;
+import org.jclouds.googlecloudstorage.domain.ProjectTeam.Team;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class ObjectAclGetTest extends BaseGoogleCloudStorageParseTest<ObjectAccessControls> {
@@ -44,10 +42,7 @@ public class ObjectAclGetTest extends BaseGoogleCloudStorageParseTest<ObjectAcce
                .generation(1394121608485000L)
                .entity("project-owners-1082289308625")
                .role(ObjectRole.OWNER)
-               .etag("CIix/dmj/rwCEAE=")
-               .projectTeam(ProjectTeam.builder().projectNumber("1082289308625").team(Team.OWNERS).build())
-               .selfLink(
-                        URI.create("https://www.googleapis.com/storage/v1/b/jcloudtestbucket/o/foo.txt/acl/project-owners-1082289308625"))
+               .projectTeam(ProjectTeam.create("1082289308625", Team.OWNERS))
                .id("jcloudtestbucket/foo.txt/1394121608485000/project-owners-1082289308625").build();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclInsertTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclInsertTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclInsertTest.java
index 9fc938c..595687b 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclInsertTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclInsertTest.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
@@ -37,13 +35,10 @@ public class ObjectAclInsertTest extends BaseGoogleCloudStorageParseTest<ObjectA
    public ObjectAccessControls expected() {
       return ObjectAccessControls
                .builder()
-               .selfLink(
-                        URI.create("https://www.googleapis.com/storage/v1/b/jcloudtestbucket/o/foo.txt/acl/user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d"))
                .bucket("jcloudtestbucket").object("foo.txt")
                .entity("user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d")
                .entityId("00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d").role(ObjectRole.OWNER)
-               .etag("CIix/dmj/rwCEAE=").build();
-
+               .build();
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclListTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclListTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclListTest.java
index 5e95b5b..7e7c4ed 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclListTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclListTest.java
@@ -16,28 +16,26 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.ListObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
+import org.jclouds.rest.annotations.SelectJson;
 
-public class ObjectAclListTest extends BaseGoogleCloudStorageParseTest<ListObjectAccessControls> {
+public class ObjectAclListTest extends BaseGoogleCloudStorageParseTest<List<ObjectAccessControls>> {
 
    private ObjectAccessControls item1 = ObjectAccessControls
             .builder()
             .id("jcloudtestbucket/foo.txt/1394121608485000/user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d")
-            .selfLink(
-                     URI.create("https://www.googleapis.com/storage/v1/b/jcloudtestbucket/o/foo.txt/acl/user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d"))
             .bucket("jcloudtestbucket").object("foo.txt").generation(Long.valueOf("1394121608485000"))
             .entity("user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d")
             .entityId("00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d").role(ObjectRole.OWNER)
-            .etag("CIix/dmj/rwCEAE=").build();
+            .build();
 
    @Override
    public String resource() {
@@ -46,8 +44,8 @@ public class ObjectAclListTest extends BaseGoogleCloudStorageParseTest<ListObjec
 
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
-   public ListObjectAccessControls expected() {
-      return ListObjectAccessControls.builder().kind(Kind.OBJECT_ACCESS_CONTROLS).addItems(item1).build();
+   @SelectJson("items")
+   public List<ObjectAccessControls> expected() {
+      return Arrays.asList(item1);
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclUpdateTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclUpdateTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclUpdateTest.java
index e48b2ee..5b5cd60 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclUpdateTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/ObjectAclUpdateTest.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
@@ -36,9 +34,7 @@ public class ObjectAclUpdateTest extends BaseGoogleCloudStorageParseTest<ObjectA
    @Consumes(MediaType.APPLICATION_JSON)
    public ObjectAccessControls expected() {
       return ObjectAccessControls.builder()
-               .selfLink(URI.create("https://www.googleapis.com/storage/v1/b/jcloudtestbucket/o/foo.txt/acl/allUsers"))
-               .bucket("jcloudtestbucket").object("foo.txt").entity("allUsers").role(ObjectRole.OWNER)
-               .etag("CIix/dmj/rwCEAQ=").build();
+               .bucket("jcloudtestbucket").object("foo.txt").entity("allUsers").role(ObjectRole.OWNER).build();
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/oauth/pom.xml
----------------------------------------------------------------------
diff --git a/oauth/pom.xml b/oauth/pom.xml
index 7c22dcb..a13d15b 100644
--- a/oauth/pom.xml
+++ b/oauth/pom.xml
@@ -51,7 +51,6 @@
     <dependency>
       <groupId>com.google.auto.value</groupId>
       <artifactId>auto-value</artifactId>
-      <version>1.0-rc2</version>
       <scope>provided</scope>
     </dependency>
     <dependency>


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

Posted by ad...@apache.org.
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());
-      }
-   }
-}


[2/4] Use AutoValue to reduce bulk of Google Storage value types.

Posted by ad...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectTemplate.java
index 9865609..836846e 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectTemplate.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectTemplate.java
@@ -17,31 +17,28 @@
 
 package org.jclouds.googlecloudstorage.domain.templates;
 
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
-import org.jclouds.googlecloudstorage.domain.DomainUtils;
 import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.hash.HashCode;
-import com.google.common.io.BaseEncoding;
 import com.google.common.net.MediaType;
 
 public class ObjectTemplate {
 
-   protected String name;
-   protected Long size;
-   protected String cacheControl;
-   protected String contentDisposition;
-   protected String contentEncoding;
-   protected String contentLanguage;
-   protected String contentType;
-   protected String crc32c;
-   protected String md5Hash;
+   private String name;
+   private Long size;
+   private String cacheControl;
+   private String contentDisposition;
+   private String contentEncoding;
+   private String contentLanguage;
+   private String contentType;
+   private String crc32c;
+   private String md5Hash;
    private Map<String, String> metadata = Maps.newLinkedHashMap();
-   protected Set<ObjectAccessControls> acl = Sets.newLinkedHashSet();
+   private List<ObjectAccessControls> acl = Lists.newArrayList();
 
    public ObjectTemplate name(String name) {
       this.name = name;
@@ -93,13 +90,13 @@ public class ObjectTemplate {
       return this;
    }
 
-   public ObjectTemplate crc32c(HashCode crc32c) {
-      this.crc32c = BaseEncoding.base64().encode(DomainUtils.reverse(crc32c.asBytes()));
+   public ObjectTemplate crc32c(String crc32c) {
+      this.crc32c = crc32c;
       return this;
    }
 
-   public ObjectTemplate md5Hash(HashCode md5Hash) {
-      this.md5Hash = BaseEncoding.base64().encode(md5Hash.asBytes());
+   public ObjectTemplate md5Hash(String md5Hash) {
+      this.md5Hash = crc32c;
       return this;
    }
 
@@ -108,80 +105,44 @@ public class ObjectTemplate {
       return this;
    }
 
-   public ObjectTemplate acl(Set<ObjectAccessControls> acl) {
+   public ObjectTemplate acl(List<ObjectAccessControls> acl) {
       this.acl.addAll(acl);
       return this;
    }
 
-   public String getCacheControl() {
+   public String cacheControl() {
       return cacheControl;
    }
 
-   public String getContentDisposition() {
+   public String contentDisposition() {
       return contentDisposition;
    }
 
-   public String getContentEncoding() {
+   public String contentEncoding() {
       return contentEncoding;
    }
 
-   public String getContentLanguage() {
+   public String contentLanguage() {
       return contentLanguage;
    }
 
-   public String getContentType() {
+   public String contentType() {
       return contentType;
    }
 
-   public HashCode getCrc32cHashcode() {
-      if (crc32c != null) {
-         HashCode hc = HashCode.fromBytes(DomainUtils.reverse(BaseEncoding.base64().decode(crc32c)));
-         return hc;
-      }
-      return null;
-   }
-
-   public HashCode getMd5HashCode() {
-      if (md5Hash != null) {
-         HashCode hc = HashCode.fromBytes(BaseEncoding.base64().decode(md5Hash));
-         return hc;
-      }
-      return null;
-   }
-
-   public Map<String, String> getAllCustomMetadata() {
+   public Map<String, String> metadata() {
       return metadata;
    }
 
-   public String getName() {
+   public String name() {
       return name;
    }
 
-   public Long getSize() {
+   public Long size() {
       return size;
    }
 
-   public Set<ObjectAccessControls> getAcl() {
+   public List<ObjectAccessControls> acl() {
       return acl;
    }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static ObjectTemplate fromObjectTemplate(ObjectTemplate objectTemplate) {
-      return Builder.fromObjectTemplate(objectTemplate);
-   }
-
-   public static class Builder {
-
-      public static ObjectTemplate fromObjectTemplate(ObjectTemplate in) {
-         return new ObjectTemplate().name(in.getName()).size(in.getSize()).acl(in.getAcl())
-                  .cacheControl(in.getCacheControl()).contentDisposition(in.getContentDisposition())
-                  .contentEncoding(in.getContentEncoding()).contentLanguage(in.getContentLanguage())
-                  .contentType(in.getContentType()).md5Hash(in.getMd5HashCode())
-                  .customMetadata(in.getAllCustomMetadata()).crc32c(in.getCrc32cHashcode());
-
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApi.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApi.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApi.java
index 338b3ba..3d428da 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApi.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApi.java
@@ -18,6 +18,8 @@ package org.jclouds.googlecloudstorage.features;
 
 import static org.jclouds.googlecloudstorage.reference.GoogleCloudStorageConstants.STORAGE_FULLCONTROL_SCOPE;
 
+import java.util.List;
+
 import javax.inject.Named;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -31,7 +33,6 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.ListBucketAccessControls;
 import org.jclouds.googlecloudstorage.domain.templates.BucketAccessControlsTemplate;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.javax.annotation.Nullable;
@@ -41,6 +42,7 @@ import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.PATCH;
 import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.SkipEncoding;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
@@ -130,7 +132,8 @@ public interface BucketAccessControlsApi {
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
    @Nullable
-   ListBucketAccessControls listBucketAccessControls(@PathParam("bucket") String bucketName);
+   @SelectJson("items")
+   List<BucketAccessControls> listBucketAccessControls(@PathParam("bucket") String bucketName);
 
    /**
     * Updates an ACL entry on the specified bucket

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApi.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApi.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApi.java
index 54dca83..9fda891 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApi.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApi.java
@@ -18,6 +18,8 @@ package org.jclouds.googlecloudstorage.features;
 
 import static org.jclouds.googlecloudstorage.reference.GoogleCloudStorageConstants.STORAGE_FULLCONTROL_SCOPE;
 
+import java.util.List;
+
 import javax.inject.Named;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -31,10 +33,9 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.ListDefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.templates.DefaultObjectAccessControlsTemplate;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
+import org.jclouds.googlecloudstorage.domain.templates.ObjectAccessControlsTemplate;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.oauth.v2.config.OAuthScopes;
@@ -43,6 +44,7 @@ import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.PATCH;
 import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.SkipEncoding;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
@@ -75,8 +77,8 @@ public interface DefaultObjectAccessControlsApi {
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
    @Nullable
-   DefaultObjectAccessControls getDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
-            @PathParam("entity") String entity);
+   ObjectAccessControls getDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
+         @PathParam("entity") String entity);
 
    /**
     * Creates a new ACL entry for specified object
@@ -94,8 +96,8 @@ public interface DefaultObjectAccessControlsApi {
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/b/{bucket}/defaultObjectAcl")
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
-   DefaultObjectAccessControls createDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
-            @BinderParam(BindToJsonPayload.class) DefaultObjectAccessControlsTemplate template);
+   ObjectAccessControls createDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
+            @BinderParam(BindToJsonPayload.class) ObjectAccessControlsTemplate template);
 
    /**
     * Permanently deletes the DefaultObjectAcessControl entry for the specified entity on the specified bucket.
@@ -108,7 +110,6 @@ public interface DefaultObjectAccessControlsApi {
     *
     * @return If successful, this method returns an empty response body
     */
-
    @Named("DefaultObjectAccessControls:delete")
    @DELETE
    @Consumes(MediaType.APPLICATION_JSON)
@@ -124,10 +125,6 @@ public interface DefaultObjectAccessControlsApi {
     *
     * @param bucketName
     *           Name of the bucket which contains the object
-    * @param objectName
-    *           Name of the bucket of that ACL is related
-    * @param generation
-    *           If present, selects a specific revision of this object
     *
     * @return ListObjectAccessControls resource
     *
@@ -141,20 +138,18 @@ public interface DefaultObjectAccessControlsApi {
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
    @Nullable
-   ListDefaultObjectAccessControls listDefaultObjectAccessControls(@PathParam("bucket") String bucketName);
+   @SelectJson("items")
+   List<ObjectAccessControls> listDefaultObjectAccessControls(@PathParam("bucket") String bucketName);
 
    /**
     * Retrieves ACL entries on a specified object
     *
     * @param bucketName
     *           Name of the bucket which contains the object
-    * @param generation
-    *           If present, selects a specific revision of this object
     *
     * @return DefaultObjectAccessControls resource
     *
     */
-
    @Named("DefaultObjectAccessControls:update")
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
@@ -162,22 +157,16 @@ public interface DefaultObjectAccessControlsApi {
    @Path("/b/{bucket}/defaultObjectAcl/{entity}")
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
-   DefaultObjectAccessControls updateDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
+   ObjectAccessControls updateDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
             @PathParam("entity") String entity,
-            @BinderParam(BindToJsonPayload.class) DefaultObjectAccessControls payload);
+            @BinderParam(BindToJsonPayload.class) ObjectAccessControls payload);
 
    /**
     * Retrieves ACL entries on a specified object
     *
     * @param bucketName
     *           Name of the bucket which contains the object
-    * @param generation
-    *           If present, selects a specific revision of this object
-    *
-    * @return DefaultObjectAccessControls resource
-    *
     */
-
    @Named("DefaultObjectAccessControls:update")
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
@@ -185,9 +174,9 @@ public interface DefaultObjectAccessControlsApi {
    @Path("/b/{bucket}/defaultObjectAcl/{entity}")
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
-   DefaultObjectAccessControls updateDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
+   ObjectAccessControls updateDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
             @PathParam("entity") String entity,
-            @BinderParam(BindToJsonPayload.class) DefaultObjectAccessControls payload,
+            @BinderParam(BindToJsonPayload.class) ObjectAccessControls payload,
             @QueryParam("role") ObjectRole role);
 
    /**
@@ -195,13 +184,7 @@ public interface DefaultObjectAccessControlsApi {
     *
     * @param bucketName
     *           Name of the bucket which contains the object
-    * @param generation
-    *           If present, selects a specific revision of this object
-    *
-    * @return DefaultObjectAccessControls resource
-    *
     */
-
    @Named("DefaultObjectAccessControls:patch")
    @PATCH
    @Consumes(MediaType.APPLICATION_JSON)
@@ -209,7 +192,7 @@ public interface DefaultObjectAccessControlsApi {
    @Path("/b/{bucket}/defaultObjectAcl/{entity}")
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
-   DefaultObjectAccessControls patchDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
+   ObjectAccessControls patchDefaultObjectAccessControls(@PathParam("bucket") String bucketName,
             @PathParam("entity") String entity,
-            @BinderParam(BindToJsonPayload.class) DefaultObjectAccessControls payload);
+            @BinderParam(BindToJsonPayload.class) ObjectAccessControls payload);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApi.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApi.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApi.java
index 5645757..5b0e0a9 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApi.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApi.java
@@ -18,6 +18,8 @@ package org.jclouds.googlecloudstorage.features;
 
 import static org.jclouds.googlecloudstorage.reference.GoogleCloudStorageConstants.STORAGE_FULLCONTROL_SCOPE;
 
+import java.util.List;
+
 import javax.inject.Named;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -31,7 +33,6 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.googlecloudstorage.domain.ListObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.templates.ObjectAccessControlsTemplate;
 import org.jclouds.javax.annotation.Nullable;
@@ -41,6 +42,7 @@ import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.PATCH;
 import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.SkipEncoding;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
@@ -93,7 +95,6 @@ public interface ObjectAccessControlsApi {
     *
     * @return an {@link ObjectAccessControls }
     */
-
    @Named("ObjectAccessControls:get")
    @GET
    @Consumes(MediaType.APPLICATION_JSON)
@@ -116,7 +117,6 @@ public interface ObjectAccessControlsApi {
     *
     * @return an {@link ObjectAccessControls }
     */
-
    @Named("ObjectAccessControls:insert")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
@@ -140,7 +140,6 @@ public interface ObjectAccessControlsApi {
     *
     * @return an {@link ObjectAccessControls }
     */
-
    @Named("ObjectAccessControls:insert")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
@@ -185,7 +184,6 @@ public interface ObjectAccessControlsApi {
     *           The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId,
     *           group-emailAddress, allUsers, or allAuthenticatedUsers
     */
-
    @Named("ObjectAccessControls:delete")
    @DELETE
    @Consumes(MediaType.APPLICATION_JSON)
@@ -201,13 +199,7 @@ public interface ObjectAccessControlsApi {
     *           Name of the bucket which contains the object
     * @param objectName
     *           Name of the bucket of that acl is related
-    * @param generation
-    *           If present, selects a specific revision of this object
-    *
-    * @return {@link ListObjectAccessControls } resource
-    *
     */
-
    @Named("ObjectAccessControls:list")
    @GET
    @Consumes(MediaType.APPLICATION_JSON)
@@ -215,8 +207,9 @@ public interface ObjectAccessControlsApi {
    @Path("/b/{bucket}/o/{object}/acl")
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
+   @SelectJson("items")
    @Nullable
-   ListObjectAccessControls listObjectAccessControls(@PathParam("bucket") String bucketName,
+   List<ObjectAccessControls> listObjectAccessControls(@PathParam("bucket") String bucketName,
             @PathParam("object") String objectName);
 
    /**
@@ -229,10 +222,7 @@ public interface ObjectAccessControlsApi {
     * @param generation
     *           If present, selects a specific revision of this object
     *
-    * @return a {@link ListObjectAccessControls }
-    *
     */
-
    @Named("ObjectAccessControls:list")
    @GET
    @Consumes(MediaType.APPLICATION_JSON)
@@ -240,8 +230,9 @@ public interface ObjectAccessControlsApi {
    @Path("/b/{bucket}/o/{object}/acl")
    @OAuthScopes(STORAGE_FULLCONTROL_SCOPE)
    @Fallback(NullOnNotFoundOr404.class)
+   @SelectJson("items")
    @Nullable
-   ListObjectAccessControls listObjectAccessControls(@PathParam("bucket") String bucketName,
+   List<ObjectAccessControls> listObjectAccessControls(@PathParam("bucket") String bucketName,
             @PathParam("object") String objectName, @QueryParam("generation") Long generation);
 
    /**

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/internal/NullSafeCopies.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/internal/NullSafeCopies.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/internal/NullSafeCopies.java
new file mode 100644
index 0000000..3cec1b4
--- /dev/null
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/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.googlecloudstorage.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-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/parser/ParseToResumableUpload.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/parser/ParseToResumableUpload.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/parser/ParseToResumableUpload.java
index fa3c318..ec0effa 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/parser/ParseToResumableUpload.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/parser/ParseToResumableUpload.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.googlecloudstorage.parser;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.util.regex.Pattern;
 
 import org.jclouds.googlecloudstorage.domain.ResumableUpload;
@@ -41,16 +43,19 @@ public class ParseToResumableUpload implements Function<HttpResponse, ResumableU
       if (range != null) {
          upperLimit = getUpperLimitFromRange(range);
          lowerLimit = getLowerLimitFromRange(range);
+         if (lowerLimit != null && upperLimit != null) {
+            checkArgument(lowerLimit < upperLimit, "lower range must less than upper range, was: %s - %s", lowerLimit,
+                  upperLimit);
+         }
       }
 
-      return ResumableUpload.builder().statusCode(response.getStatusCode()).contentLength(contentLength)
-               .uploadId(uploadId).rangeUpperValue(upperLimit).rangeLowerValue(lowerLimit).build();
+      return ResumableUpload.create(response.getStatusCode(), contentLength, uploadId, upperLimit, lowerLimit);
    }
 
    // Return the Id of the Upload
    private String getUploadId(String sessionUri) {
       return Splitter.on(Pattern.compile("\\&")).trimResults().omitEmptyStrings().withKeyValueSeparator("=")
-               .split(sessionUri).get("upload_id");
+            .split(sessionUri).get("upload_id");
    }
 
    private long getUpperLimitFromRange(String range) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/resources/META-INF/services/org.jclouds.apis.ApiMetadata
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/resources/META-INF/services/org.jclouds.apis.ApiMetadata b/google-cloud-storage/src/main/resources/META-INF/services/org.jclouds.apis.ApiMetadata
deleted file mode 100644
index 7528137..0000000
--- a/google-cloud-storage/src/main/resources/META-INF/services/org.jclouds.apis.ApiMetadata
+++ /dev/null
@@ -1,18 +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.
-#
-
-org.jclouds.googlecloudstorage.GoogleCloudStorageApiMetadata

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiExpectTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiExpectTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiExpectTest.java
index da61901..89ec40b 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiExpectTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiExpectTest.java
@@ -23,7 +23,7 @@ import static org.testng.AssertJUnit.assertNull;
 
 import javax.ws.rs.core.MediaType;
 
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.domain.templates.BucketAccessControlsTemplate;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiExpectTest;
 import org.jclouds.googlecloudstorage.parse.BucketAclGetTest;
@@ -109,11 +109,9 @@ public class BucketAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       BucketAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                insertRequest, CREATE_BUCKETACL_RESPONSE).getBucketAccessControlsApi();
 
-      BucketAccessControlsTemplate template = new BucketAccessControlsTemplate().entity("allAuthenticatedUsers").role(
-               Role.WRITER);
+      BucketAccessControlsTemplate template = BucketAccessControlsTemplate.create("allAuthenticatedUsers", Role.WRITER);
 
       assertEquals(api.createBucketAccessControls(EXPECTED_TEST_BUCKET, template), new BucketAclInsertTest().expected());
-
    }
 
    // Test deleteBucketAccessControls
@@ -160,7 +158,7 @@ public class BucketAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       BucketAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                update, updateResponse).getBucketAccessControlsApi();
 
-      BucketAccessControlsTemplate template = new BucketAccessControlsTemplate().entity("allUsers").role(Role.OWNER);
+      BucketAccessControlsTemplate template = BucketAccessControlsTemplate.create("allUsers", Role.OWNER);
 
       assertEquals(api.updateBucketAccessControls(EXPECTED_TEST_BUCKET, "allUsers", template),
                new BucketAclUpdateTest().expected());
@@ -183,7 +181,7 @@ public class BucketAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       BucketAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                patchRequest, patchResponse).getBucketAccessControlsApi();
 
-      BucketAccessControlsTemplate template = new BucketAccessControlsTemplate().entity("allUsers").role(Role.OWNER);
+      BucketAccessControlsTemplate template = BucketAccessControlsTemplate.create("allUsers", Role.OWNER);
 
       assertEquals(api.patchBucketAccessControls(EXPECTED_TEST_BUCKET, "allUsers", template),
                new BucketAclUpdateTest().expected());

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiLiveTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiLiveTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiLiveTest.java
index 93b2268..c44c38b 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiLiveTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketAccessControlsApiLiveTest.java
@@ -19,13 +19,12 @@ package org.jclouds.googlecloudstorage.features;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.jclouds.googlecloudstorage.domain.Bucket;
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
-import org.jclouds.googlecloudstorage.domain.ListBucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.domain.templates.BucketAccessControlsTemplate;
 import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiLiveTest;
@@ -48,21 +47,21 @@ public class BucketAccessControlsApiLiveTest extends BaseGoogleCloudStorageApiLi
    @Test(groups = "live")
    public void testCreateBucketAcl() {
       createBucket(BUCKET_NAME);
-      BucketAccessControlsTemplate bucketAcl = new BucketAccessControlsTemplate().entity("allUsers").role(Role.READER);
+      BucketAccessControlsTemplate bucketAcl = BucketAccessControlsTemplate.create("allUsers", Role.READER);
       BucketAccessControls response = api().createBucketAccessControls(BUCKET_NAME, bucketAcl);
 
       assertNotNull(response);
-      assertEquals(response.getId(), BUCKET_NAME + "/allUsers");
+      assertEquals(response.id(), BUCKET_NAME + "/allUsers");
    }
 
    @Test(groups = "live", dependsOnMethods = "testCreateBucketAcl")
    public void testUpdateBucketAcl() {
-      BucketAccessControlsTemplate template = new BucketAccessControlsTemplate().entity("allUsers").role(Role.WRITER);
+      BucketAccessControlsTemplate template = BucketAccessControlsTemplate.create("allUsers", Role.WRITER);
       BucketAccessControls response = api().updateBucketAccessControls(BUCKET_NAME, "allUsers", template);
 
       assertNotNull(response);
-      assertEquals(response.getId(), BUCKET_NAME + "/allUsers");
-      assertEquals(response.getRole(), Role.WRITER);
+      assertEquals(response.id(), BUCKET_NAME + "/allUsers");
+      assertEquals(response.role(), Role.WRITER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateBucketAcl")
@@ -70,27 +69,25 @@ public class BucketAccessControlsApiLiveTest extends BaseGoogleCloudStorageApiLi
       BucketAccessControls response = api().getBucketAccessControls(BUCKET_NAME, "allUsers");
 
       assertNotNull(response);
-      assertEquals(response.getId(), BUCKET_NAME + "/allUsers");
-      assertEquals(response.getRole(), Role.WRITER);
+      assertEquals(response.id(), BUCKET_NAME + "/allUsers");
+      assertEquals(response.role(), Role.WRITER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateBucketAcl")
    public void testListBucketAcl() {
-      ListBucketAccessControls response = api().listBucketAccessControls(BUCKET_NAME);
+      List<BucketAccessControls> response = api().listBucketAccessControls(BUCKET_NAME);
 
       assertNotNull(response);
-      assertEquals(response.getKind(), Kind.BUCKET_ACCESS_CONTROLS);
-      assertNotNull(response.getItems());
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateBucketAcl")
    public void testPatchBucketAcl() {
-      BucketAccessControlsTemplate template = new BucketAccessControlsTemplate().entity("allUsers").role(Role.READER);
+      BucketAccessControlsTemplate template = BucketAccessControlsTemplate.create("allUsers", Role.READER);
       BucketAccessControls response = api().patchBucketAccessControls(BUCKET_NAME, "allUsers", template);
 
       assertNotNull(response);
-      assertEquals(response.getId(), BUCKET_NAME + "/allUsers");
-      assertEquals(response.getRole(), Role.READER);
+      assertEquals(response.id(), BUCKET_NAME + "/allUsers");
+      assertEquals(response.role(), Role.READER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testPatchBucketAcl")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiExpectTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiExpectTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiExpectTest.java
index 6721ddc..ef41d71 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiExpectTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiExpectTest.java
@@ -26,7 +26,7 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Projection;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiExpectTest;
 import org.jclouds.googlecloudstorage.options.GetBucketOptions;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiLiveTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiLiveTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiLiveTest.java
index 3458706..c0ca7c6 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiLiveTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/BucketApiLiveTest.java
@@ -18,26 +18,26 @@ package org.jclouds.googlecloudstorage.features;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertNull;
 
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
+import org.jclouds.googlecloudstorage.domain.Bucket;
+import org.jclouds.googlecloudstorage.domain.Bucket.Cors;
+import org.jclouds.googlecloudstorage.domain.Bucket.Logging;
+import org.jclouds.googlecloudstorage.domain.Bucket.Versioning;
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Location;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Projection;
-import org.jclouds.googlecloudstorage.domain.Bucket;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass;
 import org.jclouds.googlecloudstorage.domain.ListPage;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-import org.jclouds.googlecloudstorage.domain.internal.BucketCors;
-import org.jclouds.googlecloudstorage.domain.internal.Logging;
-import org.jclouds.googlecloudstorage.domain.internal.Versioning;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiLiveTest;
 import org.jclouds.googlecloudstorage.options.DeleteBucketOptions;
@@ -71,27 +71,26 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
       BucketAccessControls acl = BucketAccessControls.builder().bucket(BUCKET_NAME).entity("allUsers").role(Role.OWNER)
                .build();
-      DefaultObjectAccessControls oac = DefaultObjectAccessControls.builder().bucket(BUCKET_NAME).entity("allUsers")
+      ObjectAccessControls oac = ObjectAccessControls.builder().bucket(BUCKET_NAME).entity("allUsers")
                .role(ObjectRole.OWNER).build();
-      BucketCors bucketCors = BucketCors.builder().addOrigin("http://example.appspot.com").addMethod("GET")
-               .addMethod("HEAD").addResponseHeader("x-meta-goog-custom").maxAgeSeconds(10).build();
-      Versioning version = Versioning.builder().enalbled(true).build();
+      Cors cors = Cors.create(Arrays.asList("http://example.appspot.com"), Arrays.asList("GET", "HEAD"),
+            Arrays.asList("x-meta-goog-custom"), 10);
+      Versioning version = Versioning.create(true);
 
-      Logging log = Logging.builder().logBucket(LOG_BUCKET_NAME).logObjectPrefix(BUCKET_NAME).build();
+      Logging log = Logging.create(LOG_BUCKET_NAME, BUCKET_NAME);
 
       BucketTemplate template = new BucketTemplate().name(BUCKET_NAME).addAcl(acl).addDefaultObjectAccessControls(oac)
                .versioning(version).location(Location.US_CENTRAL2).logging(log)
-               .storageClass(StorageClass.DURABLE_REDUCED_AVAILABILITY).addCORS(bucketCors);
+               .storageClass(StorageClass.DURABLE_REDUCED_AVAILABILITY).addCORS(cors);
 
       Bucket response = api().createBucket(PROJECT_NUMBER, template);
 
       assertNotNull(response);
-      assertNotNull(response.getCors());
-      assertTrue(response.getCors().size() == 1);
-      assertEquals(response.getKind(), Kind.BUCKET);
-      assertEquals(response.getName(), BUCKET_NAME);
-      assertEquals(response.getLocation(), Location.US_CENTRAL2);
-      assertTrue(response.getVersioning().isEnabled());
+      assertNotNull(response.cors());
+      assertTrue(response.cors().size() == 1);
+      assertEquals(response.name(), BUCKET_NAME);
+      assertEquals(response.location(), Location.US_CENTRAL2);
+      assertTrue(response.versioning().enabled());
    }
 
    @Test(groups = "live", dependsOnMethods = { "testCreateBucket" })
@@ -105,27 +104,25 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
    @Test(groups = "live")
    public void testCreateBucketWithOptions() {
-
-      DefaultObjectAccessControls oac = DefaultObjectAccessControls.builder().bucket(BUCKET_NAME_WITHOPTIONS)
+      ObjectAccessControls oac = ObjectAccessControls.builder().bucket(BUCKET_NAME_WITHOPTIONS)
                .entity("allUsers").role(ObjectRole.OWNER).build();
-      BucketCors bucketCors = BucketCors.builder().addOrigin("http://example.appspot.com").addMethod("GET")
-               .addMethod("HEAD").addResponseHeader("x-meta-goog-custom").maxAgeSeconds(10).build();
-      Versioning version = Versioning.builder().enalbled(true).build();
+      Cors cors = Cors.create(Arrays.asList("http://example.appspot.com"), Arrays.asList("GET", "HEAD"),
+            Arrays.asList("x-meta-goog-custom"), 10);
+      Versioning version = Versioning.create(true);
 
       BucketTemplate template = new BucketTemplate().name(BUCKET_NAME_WITHOPTIONS).addDefaultObjectAccessControls(oac)
                .versioning(version).location(Location.US_CENTRAL2)
-               .storageClass(StorageClass.DURABLE_REDUCED_AVAILABILITY).addCORS(bucketCors);
+               .storageClass(StorageClass.DURABLE_REDUCED_AVAILABILITY).addCORS(cors);
 
       InsertBucketOptions options = new InsertBucketOptions().projection(Projection.FULL);
 
       Bucket response = api().createBucket(PROJECT_NUMBER, template, options);
 
       assertNotNull(response);
-      assertNotNull(response.getCors());
-      assertEquals(response.getKind(), Kind.BUCKET);
-      assertEquals(response.getName(), BUCKET_NAME_WITHOPTIONS);
-      assertEquals(response.getLocation(), Location.US_CENTRAL2);
-      assertTrue(response.getVersioning().isEnabled());
+      assertNotNull(response.cors());
+      assertEquals(response.name(), BUCKET_NAME_WITHOPTIONS);
+      assertEquals(response.location(), Location.US_CENTRAL2);
+      assertTrue(response.versioning().enabled());
    }
 
    @Test(groups = "live", dependsOnMethods = "testCreateBucket")
@@ -136,8 +133,8 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       Bucket response = api().updateBucket(BUCKET_NAME, template);
 
       assertNotNull(response);
-      assertEquals(response.getName(), BUCKET_NAME);
-      assertNotNull(response.getAcl());
+      assertEquals(response.name(), BUCKET_NAME);
+      assertNotNull(response.acl());
    }
 
    @Test(groups = "live", dependsOnMethods = "testCreateBucketWithOptions")
@@ -150,10 +147,10 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
       assertNotNull(response);
 
-      metageneration = response.getMetageneration();
+      metageneration = response.metageneration();
 
-      assertEquals(response.getName(), BUCKET_NAME_WITHOPTIONS);
-      assertNotNull(response.getAcl());
+      assertEquals(response.name(), BUCKET_NAME_WITHOPTIONS);
+      assertNotNull(response.acl());
    }
 
    @Test(groups = "live", dependsOnMethods = "testCreateBucket")
@@ -161,8 +158,7 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       Bucket response = api().getBucket(BUCKET_NAME);
 
       assertNotNull(response);
-      assertEquals(response.getName(), BUCKET_NAME);
-      assertEquals(response.getKind(), Kind.BUCKET);
+      assertEquals(response.name(), BUCKET_NAME);
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateBucketWithOptions")
@@ -171,8 +167,7 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       Bucket response = api().getBucket(BUCKET_NAME_WITHOPTIONS, options);
 
       assertNotNull(response);
-      assertEquals(response.getName(), BUCKET_NAME_WITHOPTIONS);
-      assertEquals(response.getKind(), Kind.BUCKET);
+      assertEquals(response.name(), BUCKET_NAME_WITHOPTIONS);
    }
 
    @Test(groups = "live", dependsOnMethods = "testCreateBucket")
@@ -192,14 +187,14 @@ public class BucketApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
    @Test(groups = "live", dependsOnMethods = "testCreateBucket")
    public void testPatchBucket() {
-      Logging logging = Logging.builder().logBucket(LOG_BUCKET_NAME).logObjectPrefix(BUCKET_NAME).build();
+      Logging logging = Logging.create(LOG_BUCKET_NAME, BUCKET_NAME);
       BucketTemplate template = new BucketTemplate().name(BUCKET_NAME).logging(logging);
 
       Bucket response = api().patchBucket(BUCKET_NAME, template);
 
       assertNotNull(response);
-      assertEquals(response.getName(), BUCKET_NAME);
-      assertEquals(response.getLogging().getLogBucket(), LOG_BUCKET_NAME);
+      assertEquals(response.name(), BUCKET_NAME);
+      assertEquals(response.logging().logBucket(), LOG_BUCKET_NAME);
    }
 
    @Test(groups = "live", dependsOnMethods = { "testListBucket", "testGetBucket", "testUpdateBucket" })

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiExpectTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiExpectTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiExpectTest.java
index 2e09031..15bd44f 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiExpectTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiExpectTest.java
@@ -23,9 +23,9 @@ import static org.testng.AssertJUnit.assertNull;
 
 import javax.ws.rs.core.MediaType;
 
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.templates.DefaultObjectAccessControlsTemplate;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
+import org.jclouds.googlecloudstorage.domain.templates.ObjectAccessControlsTemplate;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiExpectTest;
 import org.jclouds.googlecloudstorage.parse.DefaultObjectAclGetTest;
 import org.jclouds.googlecloudstorage.parse.DefaultObjectAclInsertTest;
@@ -115,8 +115,7 @@ public class DefaultObjectAccessControlsApiExpectTest extends BaseGoogleCloudSto
       DefaultObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE),
                TOKEN_RESPONSE, insertRequest, CREATE_DEFAULT_OBJECT_ACL_RESPONSE).getDefaultObjectAccessControlsApi();
 
-      DefaultObjectAccessControlsTemplate template = new DefaultObjectAccessControlsTemplate().entity("allUsers").role(
-               ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create("allUsers", ObjectRole.OWNER);
 
       assertEquals(api.createDefaultObjectAccessControls(EXPECTED_TEST_BUCKET, template),
                new DefaultObjectAclInsertTest().expected());
@@ -166,8 +165,7 @@ public class DefaultObjectAccessControlsApiExpectTest extends BaseGoogleCloudSto
       DefaultObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE),
                TOKEN_RESPONSE, update, updateResponse).getDefaultObjectAccessControlsApi();
 
-      DefaultObjectAccessControls options = DefaultObjectAccessControls.builder().entity("allUsers")
-               .role(ObjectRole.OWNER).build();
+      ObjectAccessControls options = ObjectAccessControls.builder().entity("allUsers").role(ObjectRole.OWNER).build();
 
       assertEquals(api.updateDefaultObjectAccessControls(EXPECTED_TEST_BUCKET, "allUsers", options),
                new DefaultObjectAclInsertTest().expected());
@@ -191,8 +189,7 @@ public class DefaultObjectAccessControlsApiExpectTest extends BaseGoogleCloudSto
       DefaultObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE),
                TOKEN_RESPONSE, update, updateResponse).getDefaultObjectAccessControlsApi();
 
-      DefaultObjectAccessControls options = DefaultObjectAccessControls.builder().entity("allUsers")
-               .role(ObjectRole.OWNER).build();
+      ObjectAccessControls options = ObjectAccessControls.builder().entity("allUsers").role(ObjectRole.OWNER).build();
 
       assertEquals(api.updateDefaultObjectAccessControls(EXPECTED_TEST_BUCKET, "allUsers", options, ObjectRole.OWNER),
                new DefaultObjectAclInsertTest().expected());
@@ -215,8 +212,7 @@ public class DefaultObjectAccessControlsApiExpectTest extends BaseGoogleCloudSto
       DefaultObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE),
                TOKEN_RESPONSE, update, updateResponse).getDefaultObjectAccessControlsApi();
 
-      DefaultObjectAccessControls options = DefaultObjectAccessControls.builder().entity("allUsers")
-               .role(ObjectRole.OWNER).build();
+      ObjectAccessControls options = ObjectAccessControls.builder().entity("allUsers").role(ObjectRole.OWNER).build();
 
       assertEquals(api.patchDefaultObjectAccessControls(EXPECTED_TEST_BUCKET, "allUsers", options),
                new DefaultObjectAclInsertTest().expected());

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiLiveTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiLiveTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiLiveTest.java
index 4e131c5..d15391e 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiLiveTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/DefaultObjectAccessControlsApiLiveTest.java
@@ -19,15 +19,14 @@ package org.jclouds.googlecloudstorage.features;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.jclouds.googlecloudstorage.domain.Bucket;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-import org.jclouds.googlecloudstorage.domain.ListDefaultObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 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.internal.BaseGoogleCloudStorageApiLiveTest;
 import org.testng.annotations.Test;
 
@@ -48,56 +47,50 @@ public class DefaultObjectAccessControlsApiLiveTest extends BaseGoogleCloudStora
    @Test(groups = "live")
    public void testCreateDefaultObjectAcl() {
       createBucket(BUCKET_NAME);
-      DefaultObjectAccessControlsTemplate template = new DefaultObjectAccessControlsTemplate().entity("allUsers").role(
-               ObjectRole.READER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create("allUsers", ObjectRole.READER);
 
-      DefaultObjectAccessControls response = api().createDefaultObjectAccessControls(BUCKET_NAME, template);
+      ObjectAccessControls response = api().createDefaultObjectAccessControls(BUCKET_NAME, template);
 
       assertNotNull(response);
-      assertEquals(response.getEntity(), "allUsers");
-      assertEquals(response.getRole(), ObjectRole.READER);
+      assertEquals(response.entity(), "allUsers");
+      assertEquals(response.role(), ObjectRole.READER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testCreateDefaultObjectAcl")
    public void testUpdateDefaultObjectAcl() {
-      DefaultObjectAccessControls defaultObjectAcl = DefaultObjectAccessControls.builder().bucket(BUCKET_NAME)
+      ObjectAccessControls defaultObjectAcl = ObjectAccessControls.builder().bucket(BUCKET_NAME)
                .entity("allUsers").role(ObjectRole.OWNER).build();
-      DefaultObjectAccessControls response = api().updateDefaultObjectAccessControls(BUCKET_NAME, "allUsers",
-               defaultObjectAcl);
+      ObjectAccessControls response = api().updateDefaultObjectAccessControls(BUCKET_NAME, "allUsers", defaultObjectAcl);
 
       assertNotNull(response);
-      assertEquals(response.getEntity(), "allUsers");
-      assertEquals(response.getRole(), ObjectRole.OWNER);
+      assertEquals(response.entity(), "allUsers");
+      assertEquals(response.role(), ObjectRole.OWNER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateDefaultObjectAcl")
    public void testGetDefaultObjectAcl() {
-      DefaultObjectAccessControls response = api().getDefaultObjectAccessControls(BUCKET_NAME, "allUsers");
+      ObjectAccessControls response = api().getDefaultObjectAccessControls(BUCKET_NAME, "allUsers");
 
       assertNotNull(response);
-      assertEquals(response.getEntity(), "allUsers");
-      assertEquals(response.getRole(), ObjectRole.OWNER);
+      assertEquals(response.entity(), "allUsers");
+      assertEquals(response.role(), ObjectRole.OWNER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateDefaultObjectAcl")
    public void testListDefaultObjectAcl() {
-      ListDefaultObjectAccessControls response = api().listDefaultObjectAccessControls(BUCKET_NAME);
-
+      List<ObjectAccessControls> response = api().listDefaultObjectAccessControls(BUCKET_NAME);
       assertNotNull(response);
-      assertEquals(response.getKind(), Kind.OBJECT_ACCESS_CONTROLS);
-      assertNotNull(response.getItems());
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateDefaultObjectAcl")
    public void testPatchDefaultObjectAcl() {
-      DefaultObjectAccessControls defaultObjectAcl = DefaultObjectAccessControls.builder().bucket(BUCKET_NAME)
+      ObjectAccessControls defaultObjectAcl = ObjectAccessControls.builder().bucket(BUCKET_NAME)
                .entity("allUsers").role(ObjectRole.READER).build();
-      DefaultObjectAccessControls response = api().patchDefaultObjectAccessControls(BUCKET_NAME, "allUsers",
-               defaultObjectAcl);
+      ObjectAccessControls response = api().patchDefaultObjectAccessControls(BUCKET_NAME, "allUsers", defaultObjectAcl);
 
       assertNotNull(response);
-      assertEquals(response.getEntity(), "allUsers");
-      assertEquals(response.getRole(), ObjectRole.READER);
+      assertEquals(response.entity(), "allUsers");
+      assertEquals(response.role(), ObjectRole.READER);
    }
 
    @Test(groups = "live", dependsOnMethods = "testPatchDefaultObjectAcl")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApiExpectTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApiExpectTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApiExpectTest.java
index e40a020..2c7562b 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApiExpectTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectAccessControlsApiExpectTest.java
@@ -17,13 +17,13 @@
 
 package org.jclouds.googlecloudstorage.features;
 
+import static org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole.OWNER;
 import static org.jclouds.googlecloudstorage.reference.GoogleCloudStorageConstants.STORAGE_FULLCONTROL_SCOPE;
 import static org.testng.Assert.assertEquals;
 import static org.testng.AssertJUnit.assertNull;
 
 import javax.ws.rs.core.MediaType;
 
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
 import org.jclouds.googlecloudstorage.domain.templates.ObjectAccessControlsTemplate;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiExpectTest;
 import org.jclouds.googlecloudstorage.parse.ObjectAclGetTest;
@@ -151,8 +151,7 @@ public class ObjectAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       ObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                insertRequest, CREATE_OBJECT_ACL_RESPONSE).getObjectAccessControlsApi();
 
-      ObjectAccessControlsTemplate template = new ObjectAccessControlsTemplate().entity(EXPECTED_TEST_USER_ENTITY)
-               .role(ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create(EXPECTED_TEST_USER_ENTITY, OWNER);
 
       assertEquals(api.createObjectAccessControls(EXPECTED_TEST_BUCKET, EXPECTED_TEST_OBJECT, template),
                new ObjectAclInsertTest().expected());
@@ -173,8 +172,8 @@ public class ObjectAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       ObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                insertRequest, CREATE_OBJECT_ACL_RESPONSE).getObjectAccessControlsApi();
 
-      ObjectAccessControlsTemplate template = new ObjectAccessControlsTemplate().entity(
-               "user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d").role(ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate
+            .create("user-00b4903a97adfde729f0650133a7379693099d8d85d6b1b18255ca70bf89e31d", OWNER);
 
       assertEquals(
                api.createObjectAccessControls(EXPECTED_TEST_BUCKET, EXPECTED_TEST_OBJECT, template, Long.valueOf(100)),
@@ -199,8 +198,7 @@ public class ObjectAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       ObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                update, updateResponse).getObjectAccessControlsApi();
 
-      ObjectAccessControlsTemplate template = new ObjectAccessControlsTemplate().entity("allUsers").role(
-               ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create("allUsers", OWNER);
 
       assertEquals(api.updateObjectAccessControls(EXPECTED_TEST_BUCKET, EXPECTED_TEST_OBJECT, "allUsers", template),
                new ObjectAclUpdateTest().expected());
@@ -223,8 +221,7 @@ public class ObjectAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       ObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                update, updateResponse).getObjectAccessControlsApi();
 
-      ObjectAccessControlsTemplate template = new ObjectAccessControlsTemplate().entity("allUsers").role(
-               ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create("allUsers", OWNER);
 
       assertEquals(
                api.updateObjectAccessControls(EXPECTED_TEST_BUCKET, EXPECTED_TEST_OBJECT, "allUsers", template,
@@ -248,8 +245,7 @@ public class ObjectAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       ObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                patchRequest, patchResponse).getObjectAccessControlsApi();
 
-      ObjectAccessControlsTemplate template = new ObjectAccessControlsTemplate().entity("allUsers").role(
-               ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create("allUsers", OWNER);
 
       assertEquals(api.patchObjectAccessControls(EXPECTED_TEST_BUCKET, EXPECTED_TEST_OBJECT, "allUsers", template),
                new ObjectAclUpdateTest().expected());
@@ -272,8 +268,7 @@ public class ObjectAccessControlsApiExpectTest extends BaseGoogleCloudStorageApi
       ObjectAccessControlsApi api = requestsSendResponses(requestForScopes(STORAGE_FULLCONTROL_SCOPE), TOKEN_RESPONSE,
                patchRequest, patchResponse).getObjectAccessControlsApi();
 
-      ObjectAccessControlsTemplate template = new ObjectAccessControlsTemplate().entity("allUsers").role(
-               ObjectRole.OWNER);
+      ObjectAccessControlsTemplate template = ObjectAccessControlsTemplate.create("allUsers", OWNER);
       assertEquals(
                api.patchObjectAccessControls(EXPECTED_TEST_BUCKET, EXPECTED_TEST_OBJECT, "allUsers", template,
                         Long.valueOf(100)), new ObjectAclUpdateTest().expected());

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectApiLiveTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectApiLiveTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectApiLiveTest.java
index 6319683..b133b63 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectApiLiveTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ObjectApiLiveTest.java
@@ -16,13 +16,14 @@
  */
 package org.jclouds.googlecloudstorage.features;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
+import static com.google.common.io.BaseEncoding.base64;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.entry;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
 
 import java.io.IOException;
-import java.util.Set;
+import java.util.List;
 import java.util.UUID;
 
 import javax.ws.rs.core.MediaType;
@@ -34,7 +35,6 @@ import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Projection
 import org.jclouds.googlecloudstorage.domain.GCSObject;
 import org.jclouds.googlecloudstorage.domain.ListPage;
 import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
 import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate;
 import org.jclouds.googlecloudstorage.domain.templates.ComposeObjectTemplate;
 import org.jclouds.googlecloudstorage.domain.templates.ObjectTemplate;
@@ -56,12 +56,12 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.beust.jcommander.internal.Sets;
+import com.beust.jcommander.internal.Lists;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.hash.HashCode;
-import com.google.common.hash.HashFunction;
 import com.google.common.hash.Hashing;
 import com.google.common.io.ByteSource;
+import com.google.common.primitives.Bytes;
 
 public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
@@ -79,8 +79,8 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
    private Long metageneration;
    private Long generation;
-   private HashCode hcMd5;
-   private HashCode hcCrc32c;
+   private String md5Hash;
+   private String crc32c;
 
    private ObjectApi api() {
       return api.getObjectApi();
@@ -117,8 +117,8 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
                payload.getPayload().getContentMetadata().getContentLength(), payload.getPayload(), options);
 
       assertNotNull(gcsObject);
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME);
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME);
    }
 
    @Test(groups = "live", dependsOnMethods = "testSimpleUpload")
@@ -130,7 +130,7 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       assertNotNull(meta);
       assertEquals(meta.getContentType(), "text/plain");
 
-      testPayload.getPayload().getContentMetadata().setContentDisposition("attachement");
+      testPayload.getPayload().getContentMetadata().setContentDisposition("attachment");
 
       assertEquals(ByteStreams2.toByteArrayAndClose(impl.getPayload().openStream()),
                ByteStreams2.toByteArrayAndClose(testPayload.getPayload().openStream()));
@@ -147,16 +147,14 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().simpleUpload(BUCKET_NAME, "image/jpeg", contentLength, payload, options);
 
       assertNotNull(gcsObject);
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME2);
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME2);
 
       // This is a client side validation of md5
-      HashFunction hf = Hashing.md5();
-      hcMd5 = hf.newHasher().putBytes(testSource.read()).hash();
-
-      assertEquals(gcsObject.getMd5HashCode(), hcMd5);
+      md5Hash = base64().encode(testSource.hash(Hashing.md5()).asBytes());
+      // TODO: crc32c = without making a compile dep on guava 18.
 
-      // TODO: crc32c validation without making a compile dep on guava 18+
+      checkHashCodes(gcsObject);
    }
 
    @Test(groups = "live", dependsOnMethods = "testSimpleUpload")
@@ -165,12 +163,12 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
       assertNotNull(gcsObject);
 
-      metageneration = gcsObject.getMetageneration();
-      generation = gcsObject.getGeneration();
+      metageneration = gcsObject.metageneration();
+      generation = gcsObject.generation();
 
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME);
-      assertEquals(gcsObject.getContentType(), "text/plain");
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME);
+      assertEquals(gcsObject.contentType(), "text/plain");
    }
 
    @Test(groups = "live", dependsOnMethods = "testGetObject")
@@ -181,10 +179,10 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().getObject(BUCKET_NAME, UPLOAD_OBJECT_NAME, options);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME);
-      assertEquals(gcsObject.getContentType(), "text/plain");
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME);
+      assertEquals(gcsObject.contentType(), "text/plain");
    }
 
    @Test(groups = "live", dependsOnMethods = "testGetObject")
@@ -192,9 +190,9 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().copyObject(BUCKET_NAME2, COPIED_OBJECT_NAME, BUCKET_NAME, UPLOAD_OBJECT_NAME);
 
       assertNotNull(gcsObject);
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME2);
-      assertEquals(gcsObject.getName(), COPIED_OBJECT_NAME);
-      assertEquals(gcsObject.getContentType(), "text/plain");
+      assertEquals(gcsObject.bucket(), BUCKET_NAME2);
+      assertEquals(gcsObject.name(), COPIED_OBJECT_NAME);
+      assertEquals(gcsObject.contentType(), "text/plain");
 
       // Test for data
 
@@ -214,10 +212,10 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
                .copyObject(BUCKET_NAME2, UPLOAD_OBJECT_NAME, BUCKET_NAME, UPLOAD_OBJECT_NAME, options);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME2);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME);
-      assertEquals(gcsObject.getContentType(), "text/plain");
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME2);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME);
+      assertEquals(gcsObject.contentType(), "text/plain");
    }
 
    @Test(groups = "live", dependsOnMethods = "testCopyObjectWithOptions")
@@ -226,31 +224,29 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
                .role(ObjectRole.OWNER).build();
 
       ObjectTemplate destination = new ObjectTemplate().contentType("text/plain").addAcl(oacl);
-      Set<GCSObject> sourceList = Sets.newLinkedHashSet();
+      List<GCSObject> sourceList = Lists.newArrayList();
       sourceList.add(api().getObject(BUCKET_NAME2, UPLOAD_OBJECT_NAME));
       sourceList.add(api().getObject(BUCKET_NAME2, COPIED_OBJECT_NAME));
 
-      ComposeObjectTemplate requestTemplate = new ComposeObjectTemplate().sourceObjects(sourceList).destination(
-               destination);
+      ComposeObjectTemplate requestTemplate = ComposeObjectTemplate.create(sourceList, destination);
 
       GCSObject gcsObject = api().composeObjects(BUCKET_NAME2, COMPOSED_OBJECT, requestTemplate);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME2);
-      assertEquals(gcsObject.getName(), COMPOSED_OBJECT);
-      assertEquals(gcsObject.getContentType(), "text/plain");
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME2);
+      assertEquals(gcsObject.name(), COMPOSED_OBJECT);
+      assertEquals(gcsObject.contentType(), "text/plain");
    }
 
    @Test(groups = "live", dependsOnMethods = "testComposeObject")
    public void testComposeObjectWithOptions() {
       ObjectTemplate destination = new ObjectTemplate().contentType(MediaType.APPLICATION_JSON);
-      Set<GCSObject> sourceList = Sets.newLinkedHashSet();
+      List<GCSObject> sourceList = Lists.newArrayList();
       sourceList.add(api().getObject(BUCKET_NAME2, UPLOAD_OBJECT_NAME));
       sourceList.add(api().getObject(BUCKET_NAME2, COPIED_OBJECT_NAME));
 
-      ComposeObjectTemplate requestTemplate = new ComposeObjectTemplate().sourceObjects(sourceList).destination(
-               destination);
+      ComposeObjectTemplate requestTemplate = ComposeObjectTemplate.create(sourceList, destination);
 
       ComposeObjectOptions options = new ComposeObjectOptions().destinationPredefinedAcl(
                DestinationPredefinedAcl.BUCKET_OWNER_READ).ifMetagenerationNotMatch(RANDOM_LONG);
@@ -258,10 +254,10 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().composeObjects(BUCKET_NAME2, COMPOSED_OBJECT2, requestTemplate, options);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME2);
-      assertEquals(gcsObject.getName(), COMPOSED_OBJECT2);
-      assertEquals(gcsObject.getContentType(), MediaType.APPLICATION_JSON);
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME2);
+      assertEquals(gcsObject.name(), COMPOSED_OBJECT2);
+      assertEquals(gcsObject.contentType(), MediaType.APPLICATION_JSON);
    }
 
    @Test(groups = "live", dependsOnMethods = "testComposeObjectWithOptions")
@@ -270,7 +266,6 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
 
       assertNotNull(list);
       assertEquals(list.get(0) instanceof GCSObject, true);
-      assertEquals(list.getKind(), Kind.OBJECTS);
    }
 
    @Test(groups = "live", dependsOnMethods = "testComposeObjectWithOptions")
@@ -278,13 +273,12 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       ListObjectOptions options = new ListObjectOptions().maxResults(1);
       ListPage<GCSObject> list = api().listObjects(BUCKET_NAME, options);
 
-      while (list.nextMarker().isPresent()) {
+      while (list.nextPageToken() != null) {
          assertNotNull(list);
          assertEquals(list.get(0) instanceof GCSObject, true);
          assertEquals(list.size(), 1);
-         assertEquals(list.getKind(), Kind.OBJECTS);
 
-         options = new ListObjectOptions().maxResults(1).pageToken(list.getNextPageToken());
+         options = new ListObjectOptions().maxResults(1).pageToken(list.nextPageToken());
          list = api().listObjects(BUCKET_NAME, options);
       }
    }
@@ -299,10 +293,10 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().updateObject(BUCKET_NAME, UPLOAD_OBJECT_NAME2, template);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME2);
-      assertEquals(gcsObject.getContentType(), "image/jpeg");
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME2);
+      assertEquals(gcsObject.contentType(), "image/jpeg");
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateObject")
@@ -321,12 +315,12 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().updateObject(BUCKET_NAME, UPLOAD_OBJECT_NAME2, template, options);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME2);
-      assertEquals(gcsObject.getContentType(), "image/jpeg");
-      assertNotNull(gcsObject.getAllMetadata());
-      assertNotNull(gcsObject.getAllMetadata().get(METADATA_KEY), METADATA_VALUE);
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME2);
+      assertEquals(gcsObject.contentType(), "image/jpeg");
+      assertNotNull(gcsObject.metadata());
+      assertNotNull(gcsObject.metadata().get(METADATA_KEY), METADATA_VALUE);
    }
 
    @Test(groups = "live", dependsOnMethods = "testUpdateObjectWithOptions")
@@ -338,10 +332,10 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       GCSObject gcsObject = api().patchObject(BUCKET_NAME, UPLOAD_OBJECT_NAME2, template);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME2);
-      assertEquals(gcsObject.getContentType(), "image/jpeg");
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME2);
+      assertEquals(gcsObject.contentType(), "image/jpeg");
    }
 
    @Test(groups = "live", dependsOnMethods = "testPatchObject")
@@ -352,16 +346,17 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       UpdateObjectOptions options = new UpdateObjectOptions().ifMetagenerationNotMatch(RANDOM_LONG)
                .ifGenerationNotMatch(RANDOM_LONG);
 
+
       ObjectTemplate template = new ObjectTemplate().addAcl(oacl).contentType("image/jpeg")
                .contentDisposition("attachment");
       GCSObject gcsObject = api().patchObject(BUCKET_NAME, UPLOAD_OBJECT_NAME2, template, options);
 
       assertNotNull(gcsObject);
-      assertNotNull(gcsObject.getAcl());
-      assertEquals(gcsObject.getBucket(), BUCKET_NAME);
-      assertEquals(gcsObject.getName(), UPLOAD_OBJECT_NAME2);
-      assertEquals(gcsObject.getContentType(), "image/jpeg");
-      assertEquals(gcsObject.getContentDisposition(), "attachment");
+      assertNotNull(gcsObject.acl());
+      assertEquals(gcsObject.bucket(), BUCKET_NAME);
+      assertEquals(gcsObject.name(), UPLOAD_OBJECT_NAME2);
+      assertEquals(gcsObject.contentType(), "image/jpeg");
+      assertEquals(gcsObject.contentDisposition(), "attachment");
    }
 
    @Test(groups = "live", dependsOnMethods = "testPatchObjectsWithOptions")
@@ -377,23 +372,21 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
                .role(ObjectRole.OWNER).build();
 
       // This would trigger server side validation of md5
-      hcMd5 = byteSource.hash(Hashing.md5());
-
-      // TODO: template.crc32c without making a compile dep on guava 18.
+      md5Hash = base64().encode(byteSource.hash(Hashing.md5()).asBytes());
+      // TODO: crc32c = without making a compile dep on guava 18
 
       template.contentType("image/jpeg").addAcl(oacl).size(contentLength).name(MULTIPART_UPLOAD_OBJECT)
-               .contentLanguage("en").contentDisposition("attachment").md5Hash(hcMd5)
-               .customMetadata("custommetakey1", "custommetavalue1").crc32c(hcCrc32c)
+               .contentLanguage("en").contentDisposition("attachment").md5Hash(md5Hash)
+               .customMetadata("custommetakey1", "custommetavalue1").crc32c(crc32c)
                .customMetadata(ImmutableMap.of("Adrian", "powderpuff"));
 
       GCSObject gcsObject = api().multipartUpload(BUCKET_NAME, template, payloadImpl.getPayload());
 
-      assertThat(gcsObject.getBucket()).isEqualTo(BUCKET_NAME);
-      assertThat(gcsObject.getName()).isEqualTo(MULTIPART_UPLOAD_OBJECT);
-      assertThat(gcsObject.getMd5HashCode()).isEqualTo(hcMd5);
-      assertThat(gcsObject.getCrc32cHashcode()).isEqualTo(hcCrc32c);
+      assertThat(gcsObject.bucket()).isEqualTo(BUCKET_NAME);
+      assertThat(gcsObject.name()).isEqualTo(MULTIPART_UPLOAD_OBJECT);
+      checkHashCodes(gcsObject);
 
-      assertThat(gcsObject.getAllMetadata()).contains(entry("custommetakey1", "custommetavalue1"),
+      assertThat(gcsObject.metadata()).contains(entry("custommetakey1", "custommetavalue1"),
                entry("Adrian", "powderpuff")).doesNotContainKey("adrian");
 
       PayloadEnclosingImpl impl = api().download(BUCKET_NAME, MULTIPART_UPLOAD_OBJECT);
@@ -402,6 +395,13 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
                ByteStreams2.toByteArrayAndClose(payloadImpl.getPayload().openStream()));
    }
 
+   private void checkHashCodes(GCSObject gcsObject) {
+      assertEquals(HashCode.fromBytes(base64().decode(gcsObject.md5Hash())), md5Hash);
+      if (crc32c != null) {
+         assertEquals(HashCode.fromBytes(reverse(base64().decode(gcsObject.crc32c()))), crc32c);
+      }
+   }
+
    @Test(groups = "live", dependsOnMethods = "testMultipartJpegUpload")
    public void testDeleteObject() {
       api().deleteObject(BUCKET_NAME2, UPLOAD_OBJECT_NAME);
@@ -425,4 +425,10 @@ public class ObjectApiLiveTest extends BaseGoogleCloudStorageApiLiveTest {
       api.getBucketApi().deleteBucket(BUCKET_NAME);
       api.getBucketApi().deleteBucket(BUCKET_NAME2);
    }
+
+   private static byte[] reverse(byte[] b) {
+      List<Byte> hashByte = Bytes.asList(b);
+      List<Byte> reversedList = com.google.common.collect.Lists.reverse(hashByte);
+      return Bytes.toArray(reversedList);
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ResumableUploadApiLiveTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ResumableUploadApiLiveTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ResumableUploadApiLiveTest.java
index d484ae9..7718281 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ResumableUploadApiLiveTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/features/ResumableUploadApiLiveTest.java
@@ -16,23 +16,22 @@
  */
 package org.jclouds.googlecloudstorage.features;
 
-import static javax.ws.rs.core.Response.Status.OK;
 import static javax.ws.rs.core.Response.Status.CREATED;
-
+import static javax.ws.rs.core.Response.Status.OK;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNotEquals;
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.testng.Assert.assertNotNull;
+
 import java.io.IOException;
 import java.util.UUID;
 
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
 import org.jclouds.googlecloudstorage.domain.Bucket;
-import org.jclouds.googlecloudstorage.domain.DomainUtils;
+import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
+import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 import org.jclouds.googlecloudstorage.domain.ResumableUpload;
 import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate;
 import org.jclouds.googlecloudstorage.domain.templates.ObjectTemplate;
-import org.jclouds.googlecloudstorage.domain.ObjectAccessControls;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageApiLiveTest;
 import org.jclouds.io.Payloads;
 import org.jclouds.io.payloads.ByteSourcePayload;
@@ -80,22 +79,22 @@ public class ResumableUploadApiLiveTest extends BaseGoogleCloudStorageApiLiveTes
       ResumableUpload initResponse = api().initResumableUpload(BUCKET_NAME, "image/jpeg", contentLength, template);
 
       assertNotNull(initResponse);
-      assertEquals(initResponse.getStatusCode().intValue(), OK.getStatusCode());
-      assertNotNull(initResponse.getUploadId());
+      assertEquals(initResponse.statusCode(), OK.getStatusCode());
+      assertNotNull(initResponse.uploadId());
 
-      String uploadId = initResponse.getUploadId();
+      String uploadId = initResponse.uploadId();
 
       // Upload the payload
       ByteSourcePayload payload = Payloads.newByteSourcePayload(byteSource);
       ResumableUpload uploadResponse = api().upload(BUCKET_NAME, uploadId, "image/jpeg", byteSource.read().length + "",
                payload);
 
-      assertEquals(uploadResponse.getStatusCode().intValue(), OK.getStatusCode());
+      assertEquals(uploadResponse.statusCode(), OK.getStatusCode());
 
       // CheckStatus
       ResumableUpload status = api().checkStatus(BUCKET_NAME, uploadId, "bytes */*");
 
-      int code = status.getStatusCode();
+      int code = status.statusCode();
       assertNotEquals(code, INCOMPLETE);
    }
 
@@ -117,15 +116,15 @@ public class ResumableUploadApiLiveTest extends BaseGoogleCloudStorageApiLiveTes
       ResumableUpload initResponse = api().initResumableUpload(BUCKET_NAME, "application/pdf", contentLength, template);
 
       assertNotNull(initResponse);
-      assertEquals(initResponse.getStatusCode().intValue(), OK.getStatusCode());
-      assertNotNull(initResponse.getUploadId());
+      assertEquals(initResponse.statusCode(), OK.getStatusCode());
+      assertNotNull(initResponse.uploadId());
 
       // Get the upload_id for the session
-      String uploadId = initResponse.getUploadId();
+      String uploadId = initResponse.uploadId();
 
       // Check the status first
       ResumableUpload status = api().checkStatus(BUCKET_NAME, uploadId, "bytes */*");
-      int code = status.getStatusCode();
+      int code = status.statusCode();
       assertEquals(code, INCOMPLETE);
 
       // Uploads in 2 chunks.
@@ -137,16 +136,16 @@ public class ResumableUploadApiLiveTest extends BaseGoogleCloudStorageApiLiveTes
       // Uploading First chunk
       ByteSourcePayload payload = Payloads.newByteSourcePayload(byteSource.slice(offset, chunkSize));
       long length = byteSource.slice(offset, chunkSize).size();
-      String Content_Range = DomainUtils.generateContentRange(0L, length, totalSize);
+      String Content_Range = generateContentRange(0L, length, totalSize);
       ResumableUpload uploadResponse = api().chunkUpload(BUCKET_NAME, uploadId, "application/pdf", length,
                Content_Range, payload);
 
-      int code2 = uploadResponse.getStatusCode();
+      int code2 = uploadResponse.statusCode();
       assertEquals(code2, INCOMPLETE);
 
       // Read uploaded length
-      long lowerValue = uploadResponse.getRangeLowerValue();
-      long uploaded = uploadResponse.getRangeUpperValue();
+      long lowerValue = uploadResponse.rangeLowerValue();
+      long uploaded = uploadResponse.rangeUpperValue();
 
       assertThat(lowerValue).isEqualTo(0);
       assertThat(uploaded).isEqualTo(chunkSize - 1); // confirms chunk is totally uploaded
@@ -157,11 +156,11 @@ public class ResumableUploadApiLiveTest extends BaseGoogleCloudStorageApiLiveTes
       ByteSourcePayload payload2 = Payloads.newByteSourcePayload(byteSource.slice(uploaded + 1,
                byteSource.read().length - uploaded - 1));
       // Upload the 2nd chunk
-      String Content_Range2 = DomainUtils.generateContentRange(uploaded + 1, totalSize - 1, totalSize);
+      String Content_Range2 = generateContentRange(uploaded + 1, totalSize - 1, totalSize);
       ResumableUpload resumeResponse = api().chunkUpload(BUCKET_NAME, uploadId, "application/pdf", resumeLength,
                Content_Range2, payload2);
 
-      int code3 = resumeResponse.getStatusCode();
+      int code3 = resumeResponse.statusCode();
       assertThat(code3).isIn(OK.getStatusCode(), CREATED.getStatusCode()); // 200 or 201 if upload succeeded
    }
 
@@ -171,4 +170,8 @@ public class ResumableUploadApiLiveTest extends BaseGoogleCloudStorageApiLiveTes
       api.getObjectApi().deleteObject(BUCKET_NAME, CHUNKED_OBJECT_NAME);
       api.getBucketApi().deleteBucket(BUCKET_NAME);
    }
+
+   private 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/test/java/org/jclouds/googlecloudstorage/parse/BucketAclGetTest.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclGetTest.java b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclGetTest.java
index c1c41c7..21494f0 100644
--- a/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclGetTest.java
+++ b/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/parse/BucketAclGetTest.java
@@ -16,13 +16,11 @@
  */
 package org.jclouds.googlecloudstorage.parse;
 
-import java.net.URI;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 import org.jclouds.googlecloudstorage.internal.BaseGoogleCloudStorageParseTest;
 
 public class BucketAclGetTest extends BaseGoogleCloudStorageParseTest<BucketAccessControls> {
@@ -36,8 +34,6 @@ public class BucketAclGetTest extends BaseGoogleCloudStorageParseTest<BucketAcce
    @Consumes(MediaType.APPLICATION_JSON)
    public BucketAccessControls expected() {
       return BucketAccessControls.builder().bucket("jcloudtestbucket").entity("allUsers").role(Role.READER)
-               .etag("CAM=")
-               .selfLink(URI.create("https://content.googleapis.com/storage/v1/b/jcloudtestbucket/acl/allUsers"))
                .id("jcloudtestbucket/allUsers").build();
    }
 }


[3/4] Use AutoValue to reduce bulk of Google Storage value types.

Posted by ad...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListObjectAccessControls.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListObjectAccessControls.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListObjectAccessControls.java
deleted file mode 100644
index 2e2944d..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListObjectAccessControls.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;
-
-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.base.Objects.ToStringHelper;
-import com.google.common.collect.ImmutableSet;
-
-public class ListObjectAccessControls {
-
-   protected final Kind kind;
-   protected final Set<ObjectAccessControls> items;
-
-   protected ListObjectAccessControls(Kind kind, Set<ObjectAccessControls> items) {
-
-      this.kind = checkNotNull(kind, "kind");
-      this.items = checkNotNull(items, "items");
-   }
-
-   public Kind getKind() {
-      return kind;
-   }
-
-   public Set<ObjectAccessControls> getItems() {
-      return items;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(kind, items);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      ListObjectAccessControls that = ListObjectAccessControls.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.items, that.items);
-
-   }
-
-   protected 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().fromListObjectAccessControls(this);
-   }
-
-   public static final class Builder {
-
-      private Kind kind;
-      private ImmutableSet.Builder<ObjectAccessControls> items = ImmutableSet.builder();
-
-      public Builder kind(Kind kind) {
-         this.kind = checkNotNull(kind , "kind");
-         return this;
-      }
-
-      public Builder addItems(ObjectAccessControls bucketAccessControls) {
-         this.items.add(bucketAccessControls);
-         return this;
-      }
-
-      public Builder items(Set<ObjectAccessControls> items) {
-         this.items.addAll(items);
-         return this;
-      }
-
-      public ListObjectAccessControls build() {
-         return new ListObjectAccessControls(this.kind, items.build());
-      }
-
-      public Builder fromListObjectAccessControls(ListObjectAccessControls 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/ListPage.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java
index d01add6..147e3c7 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ListPage.java
@@ -16,136 +16,43 @@
  */
 package org.jclouds.googlecloudstorage.domain;
 
-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.List;
 
-import java.beans.ConstructorProperties;
-import java.util.Iterator;
-import java.util.Set;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
 
-import org.jclouds.collect.IterableWithMarker;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Optional;
+import com.google.common.collect.ForwardingList;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 
 /**
  * The collection returned from any <code>listFirstPage()</code> method.
  */
-public class ListPage<T> extends IterableWithMarker<T> {
+public class ListPage<T> extends ForwardingList<T> {
 
-   private final Kind kind;
+   private final List<T> items;
    private final String nextPageToken;
-   private final Iterable<T> items;
-   private final Set<String> prefixes;
+   private final List<String> prefixes;
 
-   @ConstructorProperties({ "kind", "nextPageToken", "items", "prefixes" })
-   protected ListPage(Kind kind, String nextPageToken, Iterable<T> items, Set<String> prefixes) {
+   public static <T> ListPage<T> create(Iterable<T> items, String nextPageToken, List<String> prefixes) {
+      return new ListPage<T>(items, nextPageToken, prefixes);
+   }
 
-      this.kind = checkNotNull(kind, "kind");
+   @SerializedNames({ "items", "nextPageToken", "prefixes" })
+   protected ListPage(Iterable<T> items, String nextPageToken, List<String> prefixes) {
+      this.items = items != null ? ImmutableList.copyOf(items) : ImmutableList.<T>of();
       this.nextPageToken = nextPageToken;
-      this.items = items != null ? ImmutableList.copyOf(items) : ImmutableList.<T> of();
-      this.prefixes = prefixes != null ? prefixes : ImmutableSet.<String> of();
-    }
-
-   public Kind getKind() {
-      return kind;
+      this.prefixes = prefixes != null ? prefixes : ImmutableList.<String>of();
    }
 
-   public String getNextPageToken() {
+   @Nullable public String nextPageToken() {
       return nextPageToken;
    }
 
-   public Set<String> getPrefixes() {
+   public List<String> prefixes() {
       return prefixes;
    }
 
-   @Override
-   public Optional<Object> nextMarker() {
-      return Optional.<Object> fromNullable(nextPageToken);
-   }
-
-   @Override
-   public Iterator<T> iterator() {
-      return checkNotNull(items, "items").iterator();
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(kind, items);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      ListPage<?> that = ListPage.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("nextPageToken", nextPageToken)
-               .add("items", items);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static <T> Builder<T> builder() {
-      return new Builder<T>();
-   }
-
-   public Builder<T> toBuilder() {
-      return new Builder<T>().fromPagedList(this);
-   }
-
-   public static final class Builder<T> {
-
-      private Kind kind;
-      private String nextPageToken;
-      private ImmutableList.Builder<T> items = ImmutableList.builder();
-      private ImmutableSet.Builder<String> prefixes = ImmutableSet.builder();
-
-      public Builder<T> kind(Kind kind) {
-         this.kind = kind;
-         return this;
-      }
-
-      public Builder<T> addItem(T item) {
-         this.items.add(item);
-         return this;
-      }
-
-      public Builder<T> items(Iterable<T> items) {
-         this.items.addAll(items);
-         return this;
-      }
-
-      public Builder<T> prefixes(Set<String> prefixes) {
-         this.prefixes.addAll(prefixes);
-         return this;
-      }
-
-      public Builder<T> nextPageToken(String nextPageToken) {
-         this.nextPageToken = nextPageToken;
-         return this;
-      }
-
-      public ListPage<T> build() {
-         return new ListPage<T>(kind, nextPageToken, items.build(), prefixes.build());
-      }
-
-      public Builder<T> fromPagedList(ListPage<T> in) {
-         return this.kind(in.getKind()).nextPageToken((String) in.nextMarker().orNull()).items(in)
-                  .prefixes(in.getPrefixes());
-
-      }
+   @Override protected List<T> delegate() {
+      return items;
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ObjectAccessControls.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ObjectAccessControls.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ObjectAccessControls.java
index 3cf559f..6d34f4c 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ObjectAccessControls.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ObjectAccessControls.java
@@ -16,132 +16,69 @@
  */
 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 org.jclouds.json.SerializedNames;
 
-import com.google.common.base.Objects;
+import com.google.auto.value.AutoValue;
 
 /**
  * Represents a Object Access Control Resource.
  *
  * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/objectAccessControls"/>
  */
-public class ObjectAccessControls extends Resource {
-
-   protected final String bucket;
-   protected final String entity;
-   protected final String object;
-   protected final Long generation;
-   protected final ObjectRole role;
-   protected final String email;
-   protected final String entityId;
-   protected final String domain;
-   protected final ProjectTeam projectTeam;
-
-   protected ObjectAccessControls(@Nullable String id, @Nullable URI selfLink, @Nullable String etag, String bucket,
-            @Nullable String object, @Nullable Long generation, 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.object = object;
-      this.generation = generation;
-      this.entityId = entityId;
-      this.role = checkNotNull(role, "role");
-      this.email = email;
-      this.domain = domain;
-      this.projectTeam = projectTeam;
-   }
+@AutoValue
+public abstract class ObjectAccessControls {
+   private final String kind = "storage#objectAccessControl";
 
-   public String getBucket() {
-      return bucket;
-   }
+   @Nullable public abstract String id();
 
-   public String getEntity() {
-      return entity;
-   }
+   @Nullable public abstract String bucket();
 
-   public ObjectRole getRole() {
-      return role;
-   }
+   @Nullable public abstract String object();
 
-   public String getEmail() {
-      return email;
-   }
+   @Nullable public abstract Long generation();
 
-   public String getObject() {
-      return object;
-   }
+   public abstract String entity();
 
-   public Long getGeneration() {
-      return generation;
-   }
+   @Nullable public abstract String entityId();
 
-   public String getDomain() {
-      return domain;
-   }
+   public abstract ObjectRole role();
 
-   public String getEntityId() {
-      return entityId;
-   }
+   @Nullable public abstract String email();
 
-   public ProjectTeam getProjectTeam() {
-      return projectTeam;
-   }
+   @Nullable public abstract String domain();
 
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      ObjectAccessControls that = ObjectAccessControls.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.bucket, that.bucket) && equal(this.object, that.object)
-               && equal(this.entity, that.entity) && equal(this.id , that.id);
-   }
+   @Nullable public abstract ProjectTeam projectTeam();
 
-   protected Objects.ToStringHelper string() {
-      return super.string().omitNullValues().add("bucket", bucket).add("entity", entity).add("entityId", entityId)
-               .add("object", object).add("generation", generation).add("role", role).add("email", email)
-               .add("domain", domain).add("projectTeam", projectTeam);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(kind, bucket, object, entity);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
+   @SerializedNames(
+         { "id", "bucket", "object", "generation", "entity", "entityId", "role", "email", "domain", "projectTeam" })
+   public static ObjectAccessControls create(String id, String bucket, String object, Long generation, String entity,
+         String entityId, ObjectRole role, String email, String domain, ProjectTeam projectTeam) {
+      return new AutoValue_ObjectAccessControls(id, bucket, object, generation, entity, entityId, role, email, domain,
+            projectTeam);
    }
 
    public static Builder builder() {
       return new Builder();
    }
 
-   public Builder toBuilder() {
-      return new Builder().fromObjectAccessControls(this);
-   }
-
-   public static final class Builder extends Resource.Builder<Builder> {
-
-      protected String object;
-      protected Long generation;
-      protected String bucket;
-      protected String entity;
-      protected String entityId;
-      protected ObjectRole role;
-      protected String email;
-      protected String domain;
-      protected ProjectTeam projectTeam;
+   public static final class Builder {
+      private String id;
+      private String object;
+      private Long generation;
+      private String bucket;
+      private String entity;
+      private String entityId;
+      private ObjectRole role;
+      private String email;
+      private String domain;
+      private ProjectTeam projectTeam;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
 
       public Builder bucket(String bucket) {
          this.bucket = bucket;
@@ -189,19 +126,8 @@ public class ObjectAccessControls extends Resource {
       }
 
       public ObjectAccessControls build() {
-         return new ObjectAccessControls(super.id, super.selfLink, super.etag, bucket, object, generation, entity,
-                  entityId, role, email, domain, projectTeam);
-      }
-
-      public Builder fromObjectAccessControls(ObjectAccessControls in) {
-         return super.fromResource(in).bucket(in.getBucket()).entity(in.getEntity()).entityId(in.getEntityId())
-                  .role(in.getRole()).email(in.getEmail()).domain(in.getDomain()).object(in.getObject())
-                  .generation(in.getGeneration()).projectTeam(in.getProjectTeam());
-      }
-
-      @Override
-      protected Builder self() {
-         return this;
+         return ObjectAccessControls
+               .create(id, bucket, object, generation, 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/Owner.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Owner.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Owner.java
new file mode 100644
index 0000000..57137e6
--- /dev/null
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Owner.java
@@ -0,0 +1,34 @@
+/*
+ * 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 org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class Owner {
+   public abstract String entity();
+
+   @Nullable public abstract String entityId();
+
+   @SerializedNames({"entity", "entityId"})
+   public static Owner create(String entity, String entityId) {
+      return new AutoValue_Owner(entity, entityId);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ProjectTeam.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ProjectTeam.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ProjectTeam.java
new file mode 100644
index 0000000..538e4c8
--- /dev/null
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ProjectTeam.java
@@ -0,0 +1,55 @@
+/*
+ * 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 org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current
+ * bucket's logs.
+ */
+@AutoValue
+public abstract class ProjectTeam {
+
+   public enum Team {
+      OWNERS, EDITORS, VIEWERS;
+
+      public String value() {
+         return name().toLowerCase();
+      }
+
+      @Override
+      public String toString() {
+         return value();
+      }
+
+      public static Team fromValue(String team) {
+         return valueOf(team.toUpperCase());
+      }
+   }
+
+   public abstract String projectNumber();
+
+   public abstract Team team();
+
+   @SerializedNames({ "projectNumber", "team" })
+   public static ProjectTeam create(String projectNumber, Team team) {
+      return new AutoValue_ProjectTeam(projectNumber, team);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Resource.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Resource.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Resource.java
deleted file mode 100644
index 89ef315..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/Resource.java
+++ /dev/null
@@ -1,169 +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.ToStringHelper;
-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.beans.ConstructorProperties;
-import java.net.URI;
-
-import org.jclouds.javax.annotation.Nullable;
-
-import com.google.common.base.CaseFormat;
-import com.google.common.base.Joiner;
-import com.google.common.base.Objects;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
-
-/**
- * Base class for Google Cloud Storage resources.
- */
-
-public class Resource {
-
-   public enum Kind {
-      BUCKET_ACCESS_CONTROL, BUCKET_ACCESS_CONTROLS,
-      BUCKET, BUCKETS,
-      OBJECT_ACCESS_CONTROL, OBJECT_ACCESS_CONTROLS,
-      OBJECT, OBJECTS,
-      COMPOSE_REQUEST;
-
-      public String value() {
-         return Joiner.on("#").join("storage", CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()));
-      }
-
-      @Override
-      public String toString() {
-         return value();
-      }
-
-      public static Kind fromValue(String kind) {
-         return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE,
-                  Iterables.getLast(Splitter.on("#").split(checkNotNull(kind, "kind")))));
-      }
-   }
-
-   protected final Kind kind;
-   protected final String id;
-   protected final URI selfLink;
-   protected final String etag;
-
-   @ConstructorProperties({ "kind", "id", "selfLink", "etag" })
-   protected Resource(Kind kind, @Nullable String id, @Nullable URI selfLink, @Nullable String etag) {
-      this.kind = checkNotNull(kind, "kind");
-      this.id = id;
-      this.selfLink = selfLink;
-      this.etag = etag;
-   }
-
-   public Kind getKind() {
-      return kind;
-   }
-
-   public String getId() {
-      return id;
-   }
-
-   public URI getSelfLink() {
-      return selfLink;
-   }
-
-   public String getEtag() {
-      return etag;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(kind, id, selfLink, etag);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      Resource that = Resource.class.cast(obj);
-      return equal(this.kind, that.kind) && equal(this.id, that.id);
-   }
-
-   protected ToStringHelper string() {
-      return toStringHelper(this).omitNullValues().add("kind", kind).add("id", id).add("selfLink", selfLink)
-               .add("etag", etag);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder<?> builder() {
-      return new ConcreteBuilder();
-   }
-
-   public Builder<?> toBuilder() {
-      return new ConcreteBuilder().fromResource(this);
-   }
-
-   public abstract static class Builder<T extends Builder<T>> {
-
-      protected abstract T self();
-
-      protected Kind kind;
-      protected String id;
-      protected URI selfLink;
-      protected String etag;
-
-      protected T kind(Kind kind) {
-         this.kind = kind;
-         return self();
-      }
-
-      public T id(String id) {
-         this.id = id;
-         return self();
-      }
-
-      public T selfLink(URI selfLink) {
-         this.selfLink = selfLink;
-         return self();
-      }
-
-      public T etag(String etag) {
-         this.etag = etag;
-         return self();
-      }
-
-      public Resource build() {
-         return new Resource(kind, id, selfLink, etag);
-      }
-
-      public T fromResource(Resource in) {
-         return this.kind(in.getKind()).id(in.getId()).selfLink(in.getSelfLink()).etag(in.getEtag());
-      }
-   }
-
-   private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
-      @Override
-      protected ConcreteBuilder 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/ResumableUpload.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ResumableUpload.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ResumableUpload.java
index ebb80a1..556347a 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ResumableUpload.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/ResumableUpload.java
@@ -16,118 +16,28 @@
  */
 package org.jclouds.googlecloudstorage.domain;
 
-import static com.google.common.base.Objects.toStringHelper;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
 import org.jclouds.javax.annotation.Nullable;
 
-import com.google.common.base.Objects.ToStringHelper;
+import com.google.auto.value.AutoValue;
 
 /**
  * Represents results of resumable upload response.
  */
-public class ResumableUpload {
-
-   protected final Integer statusCode;
-   protected final String uploadId;
-   protected final String contentLength;
-   protected final Long rangeUpperValue;
-   protected final Long rangeLowerValue;
-
-   private ResumableUpload(Integer statusCode, @Nullable String uploadId, @Nullable String contentLength,
-            @Nullable Long rangeLowerValue, @Nullable Long rangeUpperValue) {
-      if (rangeLowerValue != null && rangeUpperValue != null) {
-         checkArgument(rangeLowerValue < rangeUpperValue, "lower range must less than upper range, was: %s - %s",
-                  rangeLowerValue, rangeUpperValue);
-      }
-      this.statusCode = checkNotNull(statusCode, "statusCode");
-      this.uploadId = uploadId;
-      this.contentLength = contentLength;
-      this.rangeUpperValue = rangeUpperValue;
-      this.rangeLowerValue = rangeLowerValue;
-   }
-
-   public String getUploadId() {
-      return uploadId;
-   }
-
-   public Integer getStatusCode() {
-      return statusCode;
-   }
-
-   public String getContentLength() {
-      return contentLength;
-   }
-
-   public Long getRangeUpperValue() {
-      return rangeUpperValue;
-   }
-
-   public Long getRangeLowerValue() {
-      return rangeLowerValue;
-   }
-
-   protected ToStringHelper string() {
-      return toStringHelper(this).add("statusCode", statusCode).add("uploadId", uploadId)
-               .add("contentLength", contentLength).add("rangeUpperValue", rangeUpperValue)
-               .add("rangeLowerValue", rangeLowerValue);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public Builder toBuilder() {
-      return new Builder().fromResumableUpload(this);
-   }
-
-   public static final class Builder {
-
-      protected String uploadId;
-      protected Integer statusCode;
-      protected String contentLength;
-      protected Long rangeUpperValue;
-      protected Long rangeLowerValue;
-
-      public Builder uploadId(String uploadId) {
-         this.uploadId = uploadId;
-         return this;
-      }
-
-      public Builder statusCode(Integer statusCode) {
-         this.statusCode = statusCode;
-         return this;
-      }
+@AutoValue
+public abstract class ResumableUpload {
 
-      public Builder contentLength(String contentLength) {
-         this.contentLength = contentLength;
-         return this;
-      }
+   public abstract int statusCode();
 
-      public Builder rangeUpperValue(Long rangeUpperValue) {
-         this.rangeUpperValue = rangeUpperValue;
-         return this;
-      }
+   @Nullable public abstract String uploadId();
 
-      public Builder rangeLowerValue(Long rangeLowerValue) {
-         this.rangeLowerValue = rangeLowerValue;
-         return this;
-      }
+   @Nullable public abstract String contentLength();
 
-      public ResumableUpload build() {
-         return new ResumableUpload(statusCode, uploadId, contentLength, rangeLowerValue, rangeUpperValue);
-      }
+   @Nullable public abstract Long rangeUpperValue();
 
-      public Builder fromResumableUpload(ResumableUpload in) {
-         return this.statusCode(in.getStatusCode()).uploadId(in.getUploadId()).contentLength(in.getContentLength())
-                  .rangeUpperValue(in.getRangeUpperValue()).rangeLowerValue(in.getRangeLowerValue());
-      }
+   @Nullable public abstract Long rangeLowerValue();
 
+   public static ResumableUpload create(int statusCode, String uploadId, String contentLength, Long rangeLowerValue,
+         Long rangeUpperValue) {
+      return new AutoValue_ResumableUpload(statusCode, uploadId, contentLength, rangeLowerValue, rangeUpperValue);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Action.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Action.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Action.java
deleted file mode 100644
index 67431a3..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Action.java
+++ /dev/null
@@ -1,90 +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.internal;
-
-import static com.google.common.base.Objects.toStringHelper;
-
-import com.google.common.base.Objects;
-
-/**
- * This is an Internal Object used in BucketLifeCycles/Rules.
- */
-
-public class Action {
-   private final String type;
-
-   private Action(String type) {
-      this.type = type;
-   }
-
-   public String getType() {
-      return type;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(type);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      Action other = (Action) obj;
-      if (type == null) {
-         if (other.type != null)
-            return false;
-      } else if (!type.equals(other.type))
-         return false;
-      return true;
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("type", type);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private String type;
-
-      public Builder type(String type) {
-         this.type = type;
-         return this;
-      }
-
-      public Action build() {
-         return new Action(this.type);
-      }
-
-      public Builder fromAction(Action in) {
-         return this.type(in.getType());
-      }
-
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketCors.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketCors.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketCors.java
deleted file mode 100644
index 0be95c6..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketCors.java
+++ /dev/null
@@ -1,147 +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.internal;
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Objects.toStringHelper;
-
-import java.util.Set;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-
-/**
- * The bucket's Cross-Origin Resource Sharing (CORS) configuration.
- *
- * @see <a href= "https://developers.google.com/storage/docs/cross-origin" />
- */
-
-public class BucketCors {
-   private final Set<String> origin;
-   private final Set<String> method;
-   private final Set<String> responseHeader;
-   private final Integer maxAgeSeconds;
-   
-   private BucketCors(Set<String> origin, Set<String> method, Set<String> responseHeader,
-            Integer maxAgeSeconds) {
-      this.origin = origin.isEmpty() ? null : origin;
-      this.method = method.isEmpty() ? null : method;
-      this.responseHeader = responseHeader.isEmpty() ? null : responseHeader;
-      this.maxAgeSeconds = maxAgeSeconds;
-   }
-
-   public Set<String> getOrigin() {
-      return origin;
-   }
-
-   public Set<String> getMethod() {
-      return method;
-   }
-
-   public Set<String> getResponseHeader() {
-      return responseHeader;
-   }
-
-   public Integer getMaxAgeSeconds() {
-      return maxAgeSeconds;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(origin, method, responseHeader, maxAgeSeconds);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      BucketCors that = BucketCors.class.cast(obj);
-      return equal(this.origin, that.origin) && equal(this.method, that.method)
-               && equal(this.responseHeader, that.responseHeader) && equal(this.maxAgeSeconds, that.maxAgeSeconds);
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).omitNullValues().add("origin", origin).add("method", method).add("responseHeader", responseHeader)
-               .add("maxAgeSeconds", maxAgeSeconds);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-
-      private ImmutableSet.Builder<String> origin = ImmutableSet.builder();
-      private ImmutableSet.Builder<String> method = ImmutableSet.builder();
-      private ImmutableSet.Builder<String> reponseHeader = ImmutableSet.builder();
-      private Integer maxAgeSeconds;
-
-      public Builder addOrigin(String origin) {
-         this.origin.add(origin);
-         return this;
-      }
-
-      public Builder origin(Set<String> origin) {
-         this.origin.addAll(origin);
-         return this;
-      }
-
-      public Builder addMethod(String method) {
-         this.method.add(method);
-         return this;
-      }
-
-      public Builder method(Set<String> method) {
-         this.method.addAll(method);
-         return this;
-      }
-
-      public Builder addResponseHeader(String responseHeader) {
-         this.reponseHeader.add(responseHeader);
-         return this;
-      }
-
-      public Builder responseHeaders(Set<String> responseHeaders) {
-         this.reponseHeader.addAll(responseHeaders);
-         return this;
-      }
-
-      public Builder maxAgeSeconds(Integer maxAgeSeconds) {
-         this.maxAgeSeconds = maxAgeSeconds;
-         return this;
-      }
-
-      public BucketCors build() {
-         return new BucketCors(this.origin.build(), this.method.build(), this.reponseHeader.build(),
-                  this.maxAgeSeconds);
-      }
-
-      public Builder fromCors(BucketCors in) {
-         return this.maxAgeSeconds(in.getMaxAgeSeconds()).origin(in.getOrigin()).method(in.getMethod())
-                  .responseHeaders(in.getResponseHeader());
-      }
-
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketLifeCycle.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketLifeCycle.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketLifeCycle.java
deleted file mode 100644
index 07a7461..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/BucketLifeCycle.java
+++ /dev/null
@@ -1,102 +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.internal;
-
-import static com.google.common.base.Objects.toStringHelper;
-
-import java.util.Set;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-
-/**
- * The bucket's lifecycle configuration.
- *
- * @see <a href= "https://developers.google.com/storage/docs/lifecycle" />
- */
-
-public class BucketLifeCycle {
-
-   private final Set<Rule> rules;
-
-   private BucketLifeCycle(Set<Rule> rules) {
-      this.rules = rules.isEmpty() ? null : rules;
-   }
-
-   public Set<Rule> getRules() {
-      return rules;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(rules);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      BucketLifeCycle other = (BucketLifeCycle) obj;
-      if (rules == null) {
-         if (other.rules != null)
-            return false;
-      } else if (!rules.equals(other.rules))
-         return false;
-      return true;
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("rule", rules);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-
-      ImmutableSet.Builder<Rule> rules = ImmutableSet.builder();
-
-      public Builder addRule(Rule rule) {
-         this.rules.add(rule);
-         return this;
-      }
-
-      public Builder rule(Set<Rule> rules) {
-         this.rules.addAll(rules);
-         return this;
-      }
-
-      public BucketLifeCycle build() {
-         return new BucketLifeCycle(this.rules.build());
-      }
-
-      public Builder fromLifeCycle(BucketLifeCycle in) {
-         return this.rule(in.getRules());
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Condition.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Condition.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Condition.java
deleted file mode 100644
index d298fe7..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Condition.java
+++ /dev/null
@@ -1,150 +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.internal;
-
-import static com.google.common.base.Objects.toStringHelper;
-
-import java.util.Date;
-
-import org.jclouds.javax.annotation.Nullable;
-
-import com.google.common.base.Objects;
-
-/**
- * This is an Internal Object used in BucketLifeCycles/Rules.
- */
-
-public class Condition {
-   private final Integer age;
-   private final Date createdBefore;
-   private final Boolean isLive;
-   private final Integer numNewerVersions;
-
-   private Condition(@Nullable Integer age, @Nullable Date createdBefore, @Nullable Boolean isLive,
-            @Nullable Integer numNewerVersions) {
-      this.age = age;
-      this.createdBefore = createdBefore;
-      this.isLive = isLive;
-      this.numNewerVersions = numNewerVersions;
-   }
-
-   public Integer getAge() {
-      return age;
-   }
-
-   public Date getCreatedBefore() {
-      return createdBefore;
-   }
-
-   public Boolean getIsLive() {
-      return isLive;
-   }
-
-   public Integer getNumNewerVersions() {
-      return numNewerVersions;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(age, createdBefore, isLive, numNewerVersions);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      Condition other = (Condition) obj;
-      if (age == null) {
-         if (other.age != null)
-            return false;
-      } else if (!age.equals(other.age))
-         return false;
-      if (createdBefore == null) {
-         if (other.createdBefore != null)
-            return false;
-      } else if (!createdBefore.equals(other.createdBefore))
-         return false;
-      if (isLive == null) {
-         if (other.isLive != null)
-            return false;
-      } else if (!isLive.equals(other.isLive))
-         return false;
-      if (numNewerVersions == null) {
-         if (other.numNewerVersions != null)
-            return false;
-      } else if (!numNewerVersions.equals(other.numNewerVersions))
-         return false;
-      return true;
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("age", age).add("createdBefore", createdBefore).add("isLive", isLive)
-               .add("numNewerVersions", numNewerVersions);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static final class Builder {
-
-      private Integer age;
-      private Date createdBefore;
-      private Boolean isLive;
-      private Integer numNewerVersions;
-
-      public Builder age(Integer age) {
-         this.age = age;
-         return this;
-      }
-
-      public Builder createdBefore(Date createdBefore) {
-         this.createdBefore = createdBefore;
-         return this;
-      }
-
-      public Builder isLive(Boolean isLive) {
-         this.isLive = isLive;
-         return this;
-      }
-
-      public Builder numNewerVersions(Integer numNewerVersions) {
-         this.numNewerVersions = numNewerVersions;
-         return this;
-      }
-
-      public Condition build() {
-         return new Condition(this.age, this.createdBefore, this.isLive, this.numNewerVersions);
-      }
-
-      public Builder fromCondition(Condition in) {
-         return this.age(in.getAge()).createdBefore(in.getCreatedBefore()).isLive(in.getIsLive())
-                  .numNewerVersions(in.getNumNewerVersions());
-      }
-
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Logging.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Logging.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Logging.java
deleted file mode 100644
index 1bda912..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Logging.java
+++ /dev/null
@@ -1,102 +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.internal;
-
-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 com.google.common.base.Objects;
-
-/**
- * The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current
- * bucket's logs.
- *
- * @see <a href= "https://developers.google.com/storage/docs/accesslogs" />
- */
-
-public class Logging {
-   private final String logBucket;
-   private final String logObjectPrefix;
-
-   private Logging(String logBucket, String logObjectPrefix) {
-
-      this.logBucket =  checkNotNull(logBucket, "logBucket");
-      this.logObjectPrefix = checkNotNull(logObjectPrefix , "logObjectPrefix");
-   }
-
-   public String getLogBucket() {
-      return logBucket;
-   }
-
-   public String getLogObjectPrefix() {
-      return logObjectPrefix;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(logBucket, logObjectPrefix);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      Logging that = Logging.class.cast(obj);
-      return equal(this.logBucket, that.logBucket) && equal(this.logObjectPrefix, that.logObjectPrefix);
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("logBucket", logBucket).add("logObjectPrefix", logObjectPrefix);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private String logBucket;
-      private String logObjectPrefix;
-
-      public Builder logBucket(String logBucket) {
-         this.logBucket = logBucket;
-         return this;
-      }
-
-      public Builder logObjectPrefix(String logObjectPrefix) {
-         this.logObjectPrefix = logObjectPrefix;
-         return this;
-      }
-
-      public Logging build() {
-         return new Logging(this.logBucket, this.logObjectPrefix);
-      }
-
-      public Builder fromLogging(Logging in) {
-         return this.logBucket(in.getLogBucket()).logObjectPrefix(in.getLogObjectPrefix());
-      }
-
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Owner.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Owner.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Owner.java
deleted file mode 100644
index 6f9cbdf..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Owner.java
+++ /dev/null
@@ -1,99 +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.internal;
-
-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 org.jclouds.javax.annotation.Nullable;
-
-import com.google.common.base.Objects;
-
-/**
- * This is an internal object used in both Bucket and Object representation
- */
-
-public class Owner {
-   private final String entity;
-   private final String entityId;
-
-   private Owner(String entity, @Nullable String entityId) {
-      this.entity = checkNotNull(entity, "entity");
-      this.entityId = entityId;
-   }
-
-   public String getEntity() {
-      return entity;
-   }
-
-   public String getEntityId() {
-      return entityId;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(entity, entityId);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      Owner that = Owner.class.cast(obj);
-      return equal(this.entity, that.entity);
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).omitNullValues().add("entity", entity).add("entityId", entityId);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private String entity;
-      private String entityId;
-
-      public Builder entity(String entity) {
-         this.entity = entity;
-         return this;
-      }
-
-      public Builder entityId(String entityId) {
-         this.entityId = entityId;
-         return this;
-      }
-
-      public Owner build() {
-         return new Owner(this.entity, this.entityId);
-      }
-
-      public Builder fromOwner(Owner in) {
-         return this.entity(in.getEntity()).entityId(in.getEntityId());
-      }
-
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/ProjectTeam.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/ProjectTeam.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/ProjectTeam.java
deleted file mode 100644
index f4bda2c..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/ProjectTeam.java
+++ /dev/null
@@ -1,116 +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.internal;
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Objects.toStringHelper;
-
-import com.google.common.base.Objects;
-
-/**
- * The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current
- * bucket's logs.
- */
-
-public final class ProjectTeam {
-
-   public enum Team {
-      OWNERS, EDITORS, VIEWERS;
-      
-      public String value() {
-         return name().toLowerCase();
-      }
-
-      @Override
-      public String toString() {
-         return value();
-      }
-
-      public static Team fromValue(String team) {
-         return valueOf(team.toUpperCase());       
-      } 
-   }
-
-   private final String projectNumber;
-   private final Team team;
-
-   
-   private ProjectTeam(String projectNumber, Team team) {
-      this.projectNumber = projectNumber;
-      this.team = team;
-   }
-
-   public String getProjectNumber() {
-      return projectNumber;
-   }
-
-   public Team getTeam() {
-      return team;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(projectNumber, team);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      ProjectTeam that = ProjectTeam.class.cast(obj);
-      return equal(this.projectNumber, that.projectNumber) && equal(this.team, that.team);
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("projectNumber", projectNumber).add("team", team);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-
-      private String projectNumber;
-      private Team team;
-
-      public Builder projectNumber(String projectNumber) {
-         this.projectNumber = projectNumber;
-         return this;
-      }
-
-      public Builder team(Team team) {
-         this.team = team;
-         return this;
-      }
-
-      public ProjectTeam build() {
-         return new ProjectTeam(this.projectNumber, this.team);
-      }
-
-      public Builder fromProjectTeam(ProjectTeam in) {
-         return this.projectNumber(in.getProjectNumber()).team(in.getTeam());
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Rule.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Rule.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Rule.java
deleted file mode 100644
index 45d298e..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Rule.java
+++ /dev/null
@@ -1,110 +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.internal;
-
-import static com.google.common.base.Objects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Objects;
-
-/**
- * The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current
- * bucket's logs.
- */
-
-public class Rule {
-   private final Action action;
-   private final Condition condition;
-
-   private Rule(Action action, Condition condition) {
-      this.action = checkNotNull(action, "action");
-      this.condition = checkNotNull(condition, "condition");
-   }
-
-   public Action getAction() {
-      return action;
-   }
-
-   public Condition getCondition() {
-      return condition;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(action, condition);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      Rule other = (Rule) obj;
-      if (action == null) {
-         if (other.action != null)
-            return false;
-      } else if (!action.equals(other.action))
-         return false;
-      if (condition == null) {
-         if (other.condition != null)
-            return false;
-      } else if (!condition.equals(other.condition))
-         return false;
-      return true;
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("condition", condition).add("action", action);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private Action action;
-      private Condition condition;
-
-      public Builder action(Action action) {
-         this.action = action;
-         return this;
-      }
-
-      public Builder condtion(Condition condition) {
-         this.condition = condition;
-         return this;
-      }
-
-      public Rule build() {
-         return new Rule(this.action, this.condition);
-      }
-
-      public Builder fromRule(Rule in) {
-         return this.action(in.getAction()).condtion(in.getCondition());
-
-      }
-
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Versioning.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Versioning.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Versioning.java
deleted file mode 100644
index dd42113..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Versioning.java
+++ /dev/null
@@ -1,94 +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.internal;
-
-import static com.google.common.base.Objects.toStringHelper;
-
-import com.google.common.base.Objects;
-
-/**
- * The bucket's versioning configuration.
- *
- * @see <a href= "https://developers.google.com/storage/docs/object-versioning" />
- */
-
-public final class Versioning {
-   private final Boolean enabled;
-
-   private Versioning(Boolean enabled) {
-      this.enabled = enabled;
-   }
-
-   public Boolean isEnabled() {
-      return enabled;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(enabled);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      Versioning other = (Versioning) obj;
-      if (enabled == null) {
-         if (other.enabled != null)
-            return false;
-      } else if (!enabled.equals(other.enabled))
-         return false;
-      return true;
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("enabled", enabled);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-
-      private Boolean enabled;
-
-      public Builder enalbled(Boolean enabled) {
-         this.enabled = enabled;
-         return this;
-      }
-
-      public Versioning build() {
-         return new Versioning(this.enabled);
-      }
-
-      public Builder fromVersioning(Versioning in) {
-         return this.enalbled(in.isEnabled());
-      }
-
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Website.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Website.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Website.java
deleted file mode 100644
index 7218c85..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/internal/Website.java
+++ /dev/null
@@ -1,102 +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.internal;
-
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Objects.toStringHelper;
-
-import org.jclouds.javax.annotation.Nullable;
-
-import com.google.common.base.Objects;
-
-/**
- * This is a internal object in bucket resource
- *
- * @see <a href= "https://developers.google.com/storage/docs/website-configuration" />
- */
-
-public class Website {
-   private final String mainPageSuffix;
-   private final String notFoundPage;
-
-   private Website(@Nullable String mainPageSuffix, @Nullable String notFoundPage) {
-
-      this.mainPageSuffix = mainPageSuffix;
-      this.notFoundPage = notFoundPage;
-   }
-
-   public String getMainPageSuffix() {
-      return mainPageSuffix;
-   }
-
-   public String getNotFoundPage() {
-      return notFoundPage;
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(mainPageSuffix, notFoundPage);
-   }
-
-   @Override
-   public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null || getClass() != obj.getClass())
-         return false;
-      Website that = Website.class.cast(obj);
-      return equal(this.mainPageSuffix, that.mainPageSuffix);
-   }
-
-   protected Objects.ToStringHelper string() {
-      return toStringHelper(this).add("mainPageSuffix", mainPageSuffix).add("notFoundPage", notFoundPage);
-   }
-
-   @Override
-   public String toString() {
-      return string().toString();
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private String mainPageSuffix;
-      private String notFoundPage;
-
-      public Builder mainPageSuffix(String mainPageSuffix) {
-         this.mainPageSuffix = mainPageSuffix;
-         return this;
-      }
-
-      public Builder notFoundPage(String notFoundPage) {
-         this.notFoundPage = notFoundPage;
-         return this;
-      }
-
-      public Website build() {
-         return new Website(this.mainPageSuffix, this.notFoundPage);
-      }
-
-      public Builder fromWebsite(Website in) {
-         return this.mainPageSuffix(in.getMainPageSuffix()).notFoundPage(in.getNotFoundPage());
-      }
-
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketAccessControlsTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketAccessControlsTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketAccessControlsTemplate.java
index 3d62b76..04221aa 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketAccessControlsTemplate.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketAccessControlsTemplate.java
@@ -16,50 +16,18 @@
  */
 package org.jclouds.googlecloudstorage.domain.templates;
 
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.Role;
+import org.jclouds.googlecloudstorage.domain.BucketAccessControls.Role;
 
-/**
- * Represents a Object Access Control Resource.
- *
- * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/objectAccessControls"/>
- */
-public class BucketAccessControlsTemplate {
-
-   protected String entity;
-   protected Role role;
-
-   public BucketAccessControlsTemplate role(Role role) {
-      this.role = role;
-      return this;
-   }
-
-   public BucketAccessControlsTemplate entity(String entity) {
-      this.entity = entity;
-      return this;
-   }
+import com.google.auto.value.AutoValue;
 
-   public String getEntity() {
-      return entity;
-   }
-
-   public Role getRole() {
-      return role;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static BucketAccessControlsTemplate fromObjectAccessControlsTemplate(
-            BucketAccessControlsTemplate objectAccessControlsTemplate) {
-      return Builder.fromObjectAccessControlsTemplate(objectAccessControlsTemplate);
-   }
+@AutoValue
+public abstract class BucketAccessControlsTemplate {
 
-   public static class Builder {
+   public abstract String entity();
 
-      public static BucketAccessControlsTemplate fromObjectAccessControlsTemplate(BucketAccessControlsTemplate in) {
-         return new BucketAccessControlsTemplate().role(in.getRole()).entity(in.getEntity());
-      }
+   public abstract Role role();
 
+   public static BucketAccessControlsTemplate create(String entity, Role role) {
+      return new AutoValue_BucketAccessControlsTemplate(entity, role);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketTemplate.java
index 5e85bd0..7434757 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketTemplate.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/BucketTemplate.java
@@ -17,35 +17,35 @@
 
 package org.jclouds.googlecloudstorage.domain.templates;
 
-import java.util.Set;
+import java.util.List;
 
+import org.jclouds.googlecloudstorage.domain.Bucket.Cors;
+import org.jclouds.googlecloudstorage.domain.Bucket.LifeCycle;
+import org.jclouds.googlecloudstorage.domain.Bucket.Logging;
+import org.jclouds.googlecloudstorage.domain.Bucket.Versioning;
+import org.jclouds.googlecloudstorage.domain.Bucket.Website;
 import org.jclouds.googlecloudstorage.domain.BucketAccessControls;
-import org.jclouds.googlecloudstorage.domain.DefaultObjectAccessControls;
 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.googlecloudstorage.domain.ObjectAccessControls;
+import org.jclouds.googlecloudstorage.domain.Owner;
 
-import com.google.common.collect.Sets;
+import com.google.common.collect.Lists;
 
 public class BucketTemplate {
 
-   protected String name;
-   protected Long projectNumber;
-   protected Set<BucketAccessControls> acl = Sets.newLinkedHashSet();
-   protected Set<DefaultObjectAccessControls> defaultObjectAccessControls = Sets.newLinkedHashSet();
-   protected Owner owner;
-   protected Location location;
-   protected Website website;
-   protected Logging logging;
-   protected Versioning versioning;
-   protected Set<BucketCors> cors = Sets.newLinkedHashSet();
-   protected BucketLifeCycle lifeCycle;
-   protected StorageClass storageClass;
+   private String name;
+   private Long projectNumber;
+   private List<BucketAccessControls> acl = Lists.newArrayList();
+   private List<ObjectAccessControls> defaultObjectAccessControls = Lists.newArrayList();
+   private Owner owner;
+   private Location location;
+   private Website website;
+   private Logging logging;
+   private Versioning versioning;
+   private List<Cors> cors = Lists.newArrayList();
+   private LifeCycle lifeCycle;
+   private StorageClass storageClass;
 
    public BucketTemplate name(String name) {
       this.name = name;
@@ -82,7 +82,7 @@ public class BucketTemplate {
       return this;
    }
 
-   public BucketTemplate lifeCycle(BucketLifeCycle lifeCycle) {
+   public BucketTemplate lifeCycle(LifeCycle lifeCycle) {
       this.lifeCycle = lifeCycle;
       return this;
    }
@@ -97,97 +97,76 @@ public class BucketTemplate {
       return this;
    }
 
-   public BucketTemplate acl(Set<BucketAccessControls> acl) {
-
+   public BucketTemplate acl(List<BucketAccessControls> acl) {
       this.acl.addAll(acl);
       return this;
    }
 
-   public BucketTemplate addDefaultObjectAccessControls(DefaultObjectAccessControls oac) {
+   public BucketTemplate addDefaultObjectAccessControls(ObjectAccessControls oac) {
       this.defaultObjectAccessControls.add(oac);
       return this;
    }
 
-   public BucketTemplate defaultObjectAccessControls(Set<DefaultObjectAccessControls> defaultObjectAcl) {
+   public BucketTemplate defaultObjectAccessControls(List<ObjectAccessControls> defaultObjectAcl) {
       this.defaultObjectAccessControls.addAll(defaultObjectAcl);
       return this;
    }
 
-   public BucketTemplate addCORS(BucketCors cors) {
+   public BucketTemplate addCORS(Cors cors) {
       this.cors.add(cors);
       return this;
    }
 
-   public BucketTemplate cors(Set<BucketCors> cors) {
+   public BucketTemplate cors(List<Cors> cors) {
       this.cors.addAll(cors);
       return this;
    }
 
-   public Long getProjectNumber() {
+   public Long projectNumber() {
       return projectNumber;
    }
 
-   public String getName() {
+   public String name() {
       return name;
    }
 
-   public Set<BucketAccessControls> getAcl() {
+   public List<BucketAccessControls> acl() {
       return acl;
    }
 
-   public Set<DefaultObjectAccessControls> getDefaultObjectAccessControls() {
+   public List<ObjectAccessControls> defaultObjectAccessControls() {
       return defaultObjectAccessControls;
    }
 
-   public Owner getOwner() {
+   public Owner owner() {
       return owner;
    }
 
-   public Location getLocation() {
+   public Location location() {
       return location;
    }
 
-   public Website getWebsite() {
+   public Website website() {
       return website;
    }
 
-   public Logging getLogging() {
+   public Logging logging() {
       return logging;
    }
 
-   public Versioning getVersioning() {
+   public Versioning versioning() {
       return versioning;
    }
 
-   public Set<BucketCors> getCors() {
+   public List<Cors> cors() {
       return cors;
    }
 
-   public BucketLifeCycle getLifeCycle() {
+   public LifeCycle lifeCycle() {
       return lifeCycle;
    }
 
-   public StorageClass getStorageClass() {
+   public StorageClass storageClass() {
       return storageClass;
    }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static BucketTemplate fromBucketsTemplate(BucketTemplate bucketTemplate) {
-      return Builder.fromBucketsTemplate(bucketTemplate);
-   }
-
-   public static class Builder {
-
-      public static BucketTemplate fromBucketsTemplate(BucketTemplate in) {
-         return new BucketTemplate().name(in.getName()).projectNumber(in.getProjectNumber()).acl(in.getAcl())
-                  .defaultObjectAccessControls(in.getDefaultObjectAccessControls()).owner(in.getOwner())
-                  .location(in.getLocation()).website(in.getWebsite()).logging(in.getLogging())
-                  .versioning(in.getVersioning()).cors(in.getCors()).lifeCycle(in.getLifeCycle())
-                  .storageClass(in.getStorageClass());
-      }
-
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ComposeObjectTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ComposeObjectTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ComposeObjectTemplate.java
index 48372cc..0af32ea 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ComposeObjectTemplate.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ComposeObjectTemplate.java
@@ -17,63 +17,22 @@
 
 package org.jclouds.googlecloudstorage.domain.templates;
 
-import java.util.Set;
+import java.util.List;
 
 import org.jclouds.googlecloudstorage.domain.GCSObject;
-import org.jclouds.googlecloudstorage.domain.Resource.Kind;
 
-import com.google.common.collect.Sets;
+import com.google.auto.value.AutoValue;
 
-public class ComposeObjectTemplate {
+@AutoValue
+public abstract class ComposeObjectTemplate {
 
-   protected Kind kind;
-   protected ObjectTemplate destination;
-   protected Set<GCSObject> sourceObjects = Sets.newLinkedHashSet();
+   private final String kind = "storage/composeRequest";
 
-   public ComposeObjectTemplate() {
-      this.kind = Kind.COMPOSE_REQUEST;
-   }
-
-   public ComposeObjectTemplate destination(ObjectTemplate destination) {
-      this.destination = destination;
-      return this;
-   }
-
-   public ComposeObjectTemplate addsourceObject(GCSObject sourceObject) {
-      this.sourceObjects.add(sourceObject);
-      return this;
-   }
-
-   public ComposeObjectTemplate sourceObjects(Set<GCSObject> sourceObjects) {
-      this.sourceObjects.addAll(sourceObjects);
-      return this;
-   }
-
-   public Kind getKind() {
-      return kind;
-   }
-
-   public ObjectTemplate getDestination() {
-      return destination;
-   }
-
-   public Set<GCSObject> getSourceObjects() {
-      return sourceObjects;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static ComposeObjectTemplate fromComposeObjectTemplate(ComposeObjectTemplate composeTemplate) {
-      return Builder.fromComposeObjectTemplate(composeTemplate);
-   }
-
-   public static class Builder {
+   public abstract List<GCSObject> sourceObjects();
 
-      public static ComposeObjectTemplate fromComposeObjectTemplate(ComposeObjectTemplate in) {
-         return new ComposeObjectTemplate().sourceObjects(in.getSourceObjects()).destination(in.getDestination());
+   public abstract ObjectTemplate destination();
 
-      }
+   public static ComposeObjectTemplate create(List<GCSObject> sourceObjects, ObjectTemplate destination) {
+      return new AutoValue_ComposeObjectTemplate(sourceObjects, destination);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/DefaultObjectAccessControlsTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/DefaultObjectAccessControlsTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/DefaultObjectAccessControlsTemplate.java
deleted file mode 100644
index 48648ad..0000000
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/DefaultObjectAccessControlsTemplate.java
+++ /dev/null
@@ -1,65 +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.templates;
-
-import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
-
-/**
- * Represents a Object Access Control Resource
- *
- * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/objectAccessControls"/>
- */
-public class DefaultObjectAccessControlsTemplate {
-
-   private String entity;
-   private ObjectRole role;
-
-   public DefaultObjectAccessControlsTemplate role(ObjectRole role) {
-      this.role = role;
-      return this;
-   }
-
-   public DefaultObjectAccessControlsTemplate entity(String entity) {
-      this.entity = entity;
-      return this;
-   }
-
-   public String getEntity() {
-      return entity;
-   }
-
-   public ObjectRole getRole() {
-      return role;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static DefaultObjectAccessControlsTemplate fromObjectAccessControlsTemplate(
-            DefaultObjectAccessControlsTemplate objectAccessControlsTemplate) {
-      return Builder.fromObjectAccessControlsTemplate(objectAccessControlsTemplate);
-   }
-
-   public static class Builder {
-
-      public static DefaultObjectAccessControlsTemplate fromObjectAccessControlsTemplate(
-               DefaultObjectAccessControlsTemplate in) {
-         return new DefaultObjectAccessControlsTemplate().role(in.getRole()).entity(in.getEntity());
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b8670b16/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectAccessControlsTemplate.java
----------------------------------------------------------------------
diff --git a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectAccessControlsTemplate.java b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectAccessControlsTemplate.java
index a3f45ed..a8e1afb 100644
--- a/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectAccessControlsTemplate.java
+++ b/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/templates/ObjectAccessControlsTemplate.java
@@ -18,48 +18,16 @@ package org.jclouds.googlecloudstorage.domain.templates;
 
 import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.ObjectRole;
 
-/**
- * Represents a Object Access Control Resource.
- *
- * @see <a href= "https://developers.google.com/storage/docs/json_api/v1/objectAccessControls"/>
- */
-public class ObjectAccessControlsTemplate {
-
-   protected String entity;
-   protected ObjectRole role;
-
-   public ObjectAccessControlsTemplate role(ObjectRole role) {
-      this.role = role;
-      return this;
-   }
-
-   public ObjectAccessControlsTemplate entity(String entity) {
-      this.entity = entity;
-      return this;
-   }
+import com.google.auto.value.AutoValue;
 
-   public String getEntity() {
-      return entity;
-   }
-
-   public ObjectRole getRole() {
-      return role;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static ObjectAccessControlsTemplate fromObjectAccessControlsTemplate(
-            ObjectAccessControlsTemplate objectAccessControlsTemplate) {
-      return Builder.fromObjectAccessControlsTemplate(objectAccessControlsTemplate);
-   }
+@AutoValue
+public abstract class ObjectAccessControlsTemplate {
 
-   public static class Builder {
+   public abstract String entity();
 
-      public static ObjectAccessControlsTemplate fromObjectAccessControlsTemplate(ObjectAccessControlsTemplate in) {
-         return new ObjectAccessControlsTemplate().role(in.getRole()).entity(in.getEntity());
-      }
+   public abstract ObjectRole role();
 
+   public static ObjectAccessControlsTemplate create(String entity, ObjectRole role) {
+      return new AutoValue_ObjectAccessControlsTemplate(entity, role);
    }
 }