From 37f08e971084a85775a33c51542254c1bab29281 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Mon, 27 Feb 2017 17:19:57 -0800 Subject: [PATCH 1/8] POSC support for Storage --- .../java/com/google/cloud/storage/Blob.java | 6 ++++ .../com/google/cloud/storage/BlobInfo.java | 30 +++++++++++++++++++ .../google/cloud/storage/BlobInfoTest.java | 6 ++++ .../cloud/storage/it/ITStorageTest.java | 25 ++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java index 6c09cbecc12d..af9aae929315 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java @@ -361,6 +361,12 @@ public Builder setMetadata(Map metadata) { return this; } + @Override + public Builder setStorageClass(String storageClass) { + infoBuilder.setStorageClass(storageClass); + return this; + } + @Override Builder setMetageneration(Long metageneration) { infoBuilder.setMetageneration(metageneration); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java index 150a11d6793b..c05063a46efa 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java @@ -78,6 +78,7 @@ public StorageObject apply(BlobInfo blobInfo) { private final String contentEncoding; private final String contentDisposition; private final String contentLanguage; + private final String storageClass; private final Integer componentCount; private final boolean isDirectory; private final CustomerEncryption customerEncryption; @@ -340,6 +341,11 @@ public abstract static class Builder { @Deprecated public abstract Builder metadata(Map metadata); + /** + * Sets the blob's storage class. + */ + public abstract Builder setStorageClass(String storageClass); + /** * Sets the blob's user provided metadata. */ @@ -357,6 +363,7 @@ public abstract static class Builder { abstract Builder setCustomerEncryption(CustomerEncryption customerEncryption); + /** * Creates a {@code BlobInfo} object. */ @@ -388,6 +395,7 @@ static final class BuilderImpl extends Builder { private Long createTime; private Boolean isDirectory; private CustomerEncryption customerEncryption; + private String storageClass; BuilderImpl(BlobId blobId) { this.blobId = blobId; @@ -417,6 +425,7 @@ static final class BuilderImpl extends Builder { updateTime = blobInfo.updateTime; createTime = blobInfo.createTime; isDirectory = blobInfo.isDirectory; + storageClass = blobInfo.storageClass; } @Override @@ -582,6 +591,12 @@ public Builder setMetadata(Map metadata) { return this; } + @Override + public Builder setStorageClass(String storageClass) { + this.storageClass = storageClass; + return this; + } + @Override Builder setMetageneration(Long metageneration) { this.metageneration = metageneration; @@ -649,6 +664,7 @@ public BlobInfo build() { updateTime = builder.updateTime; createTime = builder.createTime; isDirectory = firstNonNull(builder.isDirectory, Boolean.FALSE); + storageClass = builder.storageClass; } /** @@ -1106,6 +1122,13 @@ public CustomerEncryption getCustomerEncryption() { return customerEncryption; } + /** + * Returns the storage class of the blob. + */ + public String getStorageClass() { + return storageClass; + } + /** * Returns a builder for the current blob. */ @@ -1163,6 +1186,10 @@ public ObjectAccessControl apply(Acl acl) { if (owner != null) { storageObject.setOwner(new Owner().setEntity(owner.toPb())); } + if (storageClass != null) { + storageObject.setStorageClass(storageClass); + } + Map pbMetadata = metadata; if (metadata != null && !Data.isNull(metadata)) { pbMetadata = Maps.newHashMapWithExpectedSize(metadata.size()); @@ -1341,6 +1368,9 @@ public Acl apply(ObjectAccessControl objectAccessControl) { builder.setCustomerEncryption( CustomerEncryption.fromPb(storageObject.getCustomerEncryption())); } + if (storageObject.getStorageClass() != null) { + builder.setStorageClass(storageObject.getStorageClass()); + } return builder.build(); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java index 7af723c45040..7f0580cd978f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java @@ -66,6 +66,8 @@ public class BlobInfoTest { private static final String KEY_SHA256 = "keySha"; private static final CustomerEncryption CUSTOMER_ENCRYPTION = new CustomerEncryption(ENCRYPTION_ALGORITHM, KEY_SHA256); + private static final String STORAGE_CLASS = "COLDLINE"; + private static final BlobInfo BLOB_INFO = BlobInfo.newBuilder("b", "n", GENERATION) .setAcl(ACL) .setComponentCount(COMPONENT_COUNT) @@ -88,6 +90,7 @@ public class BlobInfoTest { .setSize(SIZE) .setUpdateTime(UPDATE_TIME) .setCreateTime(CREATE_TIME) + .setStorageClass(STORAGE_CLASS) .build(); private static final BlobInfo DIRECTORY_INFO = BlobInfo.newBuilder("b", "n/") .setSize(0L) @@ -188,6 +191,7 @@ public void testBuilder() { assertEquals(SIZE, BLOB_INFO.getSize()); assertEquals(UPDATE_TIME, BLOB_INFO.getUpdateTime()); assertEquals(CREATE_TIME, BLOB_INFO.getCreateTime()); + assertEquals(STORAGE_CLASS, BLOB_INFO.getStorageClass()); assertFalse(BLOB_INFO.isDirectory()); assertEquals("b", DIRECTORY_INFO.getBucket()); assertEquals("n/", DIRECTORY_INFO.getName()); @@ -296,6 +300,7 @@ private void compareBlobs(BlobInfo expected, BlobInfo value) { assertEquals(expected.getSelfLink(), value.getSelfLink()); assertEquals(expected.getSize(), value.getSize()); assertEquals(expected.getUpdateTime(), value.getUpdateTime()); + assertEquals(expected.getStorageClass(), value.getStorageClass()); } private void compareCustomerEncryptions(CustomerEncryption expected, CustomerEncryption value) { @@ -342,6 +347,7 @@ public void testToPbAndFromPb() { assertNull(blobInfo.getSelfLink()); assertEquals(0L, (long) blobInfo.getSize()); assertNull(blobInfo.getUpdateTime()); + assertNull(blobInfo.getStorageClass()); assertTrue(blobInfo.isDirectory()); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java index a3d754323e65..7a2506f0f66d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java @@ -100,6 +100,8 @@ public class ITStorageTest { new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); private static final byte[] COMPRESSED_CONTENT = BaseEncoding.base64() .decode("H4sIAAAAAAAAAPNIzcnJV3DPz0/PSVVwzskvTVEILskvSkxPVQQA/LySchsAAAA="); + private static final String STORAGE_CLASS_COLDLINE = "COLDLINE"; + private static final String STORAGE_CLASS_STANDARD = "STANDARD"; @BeforeClass public static void beforeClass() throws NoSuchAlgorithmException, InvalidKeySpecException { @@ -789,6 +791,29 @@ public void testCopyBlobUpdateMetadata() { assertTrue(storage.delete(BUCKET, targetBlobName)); } + @Test + public void testCopyBlobUpdateStorageClass() { + String sourceBlobName = "test-copy-blob-update-storage-class-source"; + BlobId source = BlobId.of(BUCKET, sourceBlobName); + BlobInfo sourceInfo = + BlobInfo.newBuilder(source).setStorageClass(STORAGE_CLASS_STANDARD).build(); + Blob remoteSourceBlob = storage.create(sourceInfo, BLOB_BYTE_CONTENT); + assertNotNull(remoteSourceBlob); + assertEquals(STORAGE_CLASS_STANDARD, remoteSourceBlob.getStorageClass()); + + String targetBlobName = "test-copy-blob-update-storage-class-target"; + BlobInfo targetInfo = BlobInfo + .newBuilder(BUCKET, targetBlobName).setStorageClass(STORAGE_CLASS_COLDLINE).build(); + Storage.CopyRequest req = Storage.CopyRequest.of(source, targetInfo); + CopyWriter copyWriter = storage.copy(req); + assertEquals(BUCKET, copyWriter.getResult().getBucket()); + assertEquals(targetBlobName, copyWriter.getResult().getName()); + assertEquals(STORAGE_CLASS_COLDLINE, copyWriter.getResult().getStorageClass()); + assertTrue(copyWriter.isDone()); + assertTrue(remoteSourceBlob.delete()); + assertTrue(storage.delete(BUCKET, targetBlobName)); + } + @Test public void testCopyBlobNoContentType() { String sourceBlobName = "test-copy-blob-no-content-type-source"; From 8e2ac060964786bfc48946370391d44d7c4abd9b Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 13:57:55 -0800 Subject: [PATCH 2/8] Fix PR update --- .../main/java/com/google/cloud/storage/BlobInfo.java | 1 - .../main/java/com/google/cloud/storage/Storage.java | 2 +- .../java/com/google/cloud/storage/BlobInfoTest.java | 2 +- .../com/google/cloud/storage/it/ITStorageTest.java | 11 +++++------ 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java index c05063a46efa..9d94fb89ff52 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java @@ -363,7 +363,6 @@ public abstract static class Builder { abstract Builder setCustomerEncryption(CustomerEncryption customerEncryption); - /** * Creates a {@code BlobInfo} object. */ diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java index 021270c364b6..bce663008dcd 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java @@ -1527,7 +1527,7 @@ public static Builder newBuilder() { * String bucketName = "my_unique_bucket"; * Bucket bucket = storage.create(BucketInfo.newBuilder(bucketName) * // See here for possible values: http://g.co/cloud/storage/docs/storage-classes - * .setStorageClass("COLDLINE") + * .setStorageClass(StorageClass.COLDLINE) * // Possible values: http://g.co/cloud/storage/docs/bucket-locations#location-mr * .setLocation("asia") * .build()); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java index 7f0580cd978f..69fe371ae848 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java @@ -66,7 +66,7 @@ public class BlobInfoTest { private static final String KEY_SHA256 = "keySha"; private static final CustomerEncryption CUSTOMER_ENCRYPTION = new CustomerEncryption(ENCRYPTION_ALGORITHM, KEY_SHA256); - private static final String STORAGE_CLASS = "COLDLINE"; + private static final String STORAGE_CLASS = StorageClass.COLDLINE; private static final BlobInfo BLOB_INFO = BlobInfo.newBuilder("b", "n", GENERATION) .setAcl(ACL) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java index 7a2506f0f66d..48ae816e8c3d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java @@ -44,6 +44,7 @@ import com.google.cloud.storage.Storage.BucketField; import com.google.cloud.storage.StorageBatch; import com.google.cloud.storage.StorageBatchResult; +import com.google.cloud.storage.StorageClass; import com.google.cloud.storage.StorageException; import com.google.cloud.storage.testing.RemoteStorageHelper; import com.google.common.collect.ImmutableList; @@ -100,8 +101,6 @@ public class ITStorageTest { new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); private static final byte[] COMPRESSED_CONTENT = BaseEncoding.base64() .decode("H4sIAAAAAAAAAPNIzcnJV3DPz0/PSVVwzskvTVEILskvSkxPVQQA/LySchsAAAA="); - private static final String STORAGE_CLASS_COLDLINE = "COLDLINE"; - private static final String STORAGE_CLASS_STANDARD = "STANDARD"; @BeforeClass public static void beforeClass() throws NoSuchAlgorithmException, InvalidKeySpecException { @@ -796,19 +795,19 @@ public void testCopyBlobUpdateStorageClass() { String sourceBlobName = "test-copy-blob-update-storage-class-source"; BlobId source = BlobId.of(BUCKET, sourceBlobName); BlobInfo sourceInfo = - BlobInfo.newBuilder(source).setStorageClass(STORAGE_CLASS_STANDARD).build(); + BlobInfo.newBuilder(source).setStorageClass(StorageClass.STANDARD).build(); Blob remoteSourceBlob = storage.create(sourceInfo, BLOB_BYTE_CONTENT); assertNotNull(remoteSourceBlob); - assertEquals(STORAGE_CLASS_STANDARD, remoteSourceBlob.getStorageClass()); + assertEquals(StorageClass.STANDARD, remoteSourceBlob.getStorageClass()); String targetBlobName = "test-copy-blob-update-storage-class-target"; BlobInfo targetInfo = BlobInfo - .newBuilder(BUCKET, targetBlobName).setStorageClass(STORAGE_CLASS_COLDLINE).build(); + .newBuilder(BUCKET, targetBlobName).setStorageClass(StorageClass.COLDLINE).build(); Storage.CopyRequest req = Storage.CopyRequest.of(source, targetInfo); CopyWriter copyWriter = storage.copy(req); assertEquals(BUCKET, copyWriter.getResult().getBucket()); assertEquals(targetBlobName, copyWriter.getResult().getName()); - assertEquals(STORAGE_CLASS_COLDLINE, copyWriter.getResult().getStorageClass()); + assertEquals(StorageClass.COLDLINE, copyWriter.getResult().getStorageClass()); assertTrue(copyWriter.isDone()); assertTrue(remoteSourceBlob.delete()); assertTrue(storage.delete(BUCKET, targetBlobName)); From 6f6444c30e41bb3a0dacf392cd69f6af4a6c93f5 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 13:58:48 -0800 Subject: [PATCH 3/8] Add StorageClass --- .../google/cloud/storage/StorageClass.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java new file mode 100644 index 000000000000..f9eb77fc2359 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java @@ -0,0 +1,46 @@ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.storage; + +/** + * String constants for the names of the storage classes. + */ +public class StorageClass { + /** + * Name for the multi-regional storage class. + */ + public static String MULTI_REGIONAL = "MULTI_REGIONAL"; + + /** + * Name for the regional storage class. + */ + public static String REGIONAL = "REGIONAL"; + + /** + * Name for the Nearline storage class. + */ + public static String NEARLINE = "NEARLINE"; + + /** + * Name for the Codeline storage class. + */ + public static String COLDLINE = "COLDLINE"; + + /** + * Name for the standard storage class. + */ + public static String STANDARD = "STANDARD"; +} From 96298ae1458e7f7000bbe62a8ff95adf8465b959 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 14:11:36 -0800 Subject: [PATCH 4/8] Make strings final --- .../java/com/google/cloud/storage/StorageClass.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java index f9eb77fc2359..8902f060fac8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java @@ -22,25 +22,25 @@ public class StorageClass { /** * Name for the multi-regional storage class. */ - public static String MULTI_REGIONAL = "MULTI_REGIONAL"; + public static final String MULTI_REGIONAL = "MULTI_REGIONAL"; /** * Name for the regional storage class. */ - public static String REGIONAL = "REGIONAL"; + public static final String REGIONAL = "REGIONAL"; /** * Name for the Nearline storage class. */ - public static String NEARLINE = "NEARLINE"; + public static final String NEARLINE = "NEARLINE"; /** * Name for the Codeline storage class. */ - public static String COLDLINE = "COLDLINE"; + public static final String COLDLINE = "COLDLINE"; /** * Name for the standard storage class. */ - public static String STANDARD = "STANDARD"; + public static final String STANDARD = "STANDARD"; } From b99e7338c3b8ead7719dcf07ae9c41004d0264e0 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 14:55:36 -0800 Subject: [PATCH 5/8] rename to StorageClasses --- .../main/java/com/google/cloud/storage/Storage.java | 2 +- .../storage/{StorageClass.java => StorageClasses.java} | 2 +- .../java/com/google/cloud/storage/BlobInfoTest.java | 2 +- .../com/google/cloud/storage/it/ITStorageTest.java | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) rename google-cloud-storage/src/main/java/com/google/cloud/storage/{StorageClass.java => StorageClasses.java} (97%) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java index bce663008dcd..be2edabff82f 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java @@ -1527,7 +1527,7 @@ public static Builder newBuilder() { * String bucketName = "my_unique_bucket"; * Bucket bucket = storage.create(BucketInfo.newBuilder(bucketName) * // See here for possible values: http://g.co/cloud/storage/docs/storage-classes - * .setStorageClass(StorageClass.COLDLINE) + * .setStorageClass(StorageClasses.COLDLINE) * // Possible values: http://g.co/cloud/storage/docs/bucket-locations#location-mr * .setLocation("asia") * .build()); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java similarity index 97% rename from google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java rename to google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java index 8902f060fac8..3f3b160b2d1d 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java @@ -18,7 +18,7 @@ /** * String constants for the names of the storage classes. */ -public class StorageClass { +public class StorageClasses { /** * Name for the multi-regional storage class. */ diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java index 69fe371ae848..db82fa40d47f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java @@ -66,7 +66,7 @@ public class BlobInfoTest { private static final String KEY_SHA256 = "keySha"; private static final CustomerEncryption CUSTOMER_ENCRYPTION = new CustomerEncryption(ENCRYPTION_ALGORITHM, KEY_SHA256); - private static final String STORAGE_CLASS = StorageClass.COLDLINE; + private static final String STORAGE_CLASS = StorageClasses.COLDLINE; private static final BlobInfo BLOB_INFO = BlobInfo.newBuilder("b", "n", GENERATION) .setAcl(ACL) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java index 48ae816e8c3d..7e4d25e3bccb 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java @@ -44,7 +44,7 @@ import com.google.cloud.storage.Storage.BucketField; import com.google.cloud.storage.StorageBatch; import com.google.cloud.storage.StorageBatchResult; -import com.google.cloud.storage.StorageClass; +import com.google.cloud.storage.StorageClasses; import com.google.cloud.storage.StorageException; import com.google.cloud.storage.testing.RemoteStorageHelper; import com.google.common.collect.ImmutableList; @@ -795,19 +795,19 @@ public void testCopyBlobUpdateStorageClass() { String sourceBlobName = "test-copy-blob-update-storage-class-source"; BlobId source = BlobId.of(BUCKET, sourceBlobName); BlobInfo sourceInfo = - BlobInfo.newBuilder(source).setStorageClass(StorageClass.STANDARD).build(); + BlobInfo.newBuilder(source).setStorageClass(StorageClasses.STANDARD).build(); Blob remoteSourceBlob = storage.create(sourceInfo, BLOB_BYTE_CONTENT); assertNotNull(remoteSourceBlob); - assertEquals(StorageClass.STANDARD, remoteSourceBlob.getStorageClass()); + assertEquals(StorageClasses.STANDARD, remoteSourceBlob.getStorageClass()); String targetBlobName = "test-copy-blob-update-storage-class-target"; BlobInfo targetInfo = BlobInfo - .newBuilder(BUCKET, targetBlobName).setStorageClass(StorageClass.COLDLINE).build(); + .newBuilder(BUCKET, targetBlobName).setStorageClass(StorageClasses.COLDLINE).build(); Storage.CopyRequest req = Storage.CopyRequest.of(source, targetInfo); CopyWriter copyWriter = storage.copy(req); assertEquals(BUCKET, copyWriter.getResult().getBucket()); assertEquals(targetBlobName, copyWriter.getResult().getName()); - assertEquals(StorageClass.COLDLINE, copyWriter.getResult().getStorageClass()); + assertEquals(StorageClasses.COLDLINE, copyWriter.getResult().getStorageClass()); assertTrue(copyWriter.isDone()); assertTrue(remoteSourceBlob.delete()); assertTrue(storage.delete(BUCKET, targetBlobName)); From 3a8828757978a1073a8724441bf122d66d2fceb5 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 15:35:08 -0800 Subject: [PATCH 6/8] Switch to StorageClass enum --- .../storage/snippets/StorageSnippets.java | 3 +- .../java/com/google/cloud/storage/Blob.java | 2 +- .../com/google/cloud/storage/BlobInfo.java | 15 +++--- .../java/com/google/cloud/storage/Bucket.java | 4 +- .../com/google/cloud/storage/BucketInfo.java | 20 ++++---- .../com/google/cloud/storage/Storage.java | 2 +- .../google/cloud/storage/StorageClasses.java | 46 ------------------- .../google/cloud/storage/BlobInfoTest.java | 2 +- .../google/cloud/storage/BucketInfoTest.java | 2 +- .../com/google/cloud/storage/BucketTest.java | 2 +- .../cloud/storage/it/ITStorageTest.java | 10 ++-- 11 files changed, 32 insertions(+), 76 deletions(-) delete mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java diff --git a/google-cloud-examples/src/main/java/com/google/cloud/examples/storage/snippets/StorageSnippets.java b/google-cloud-examples/src/main/java/com/google/cloud/examples/storage/snippets/StorageSnippets.java index e0b78afc9292..0355663786c6 100644 --- a/google-cloud-examples/src/main/java/com/google/cloud/examples/storage/snippets/StorageSnippets.java +++ b/google-cloud-examples/src/main/java/com/google/cloud/examples/storage/snippets/StorageSnippets.java @@ -53,6 +53,7 @@ import com.google.cloud.storage.Storage.SignUrlOption; import com.google.cloud.storage.StorageBatch; import com.google.cloud.storage.StorageBatchResult; +import com.google.cloud.storage.StorageClass; import com.google.cloud.storage.StorageException; import java.io.ByteArrayInputStream; @@ -100,7 +101,7 @@ public Bucket createBucketWithStorageClassAndLocation(String bucketName) { // [START createBucketWithStorageClassAndLocation] Bucket bucket = storage.create(BucketInfo.newBuilder(bucketName) // See here for possible values: http://g.co/cloud/storage/docs/storage-classes - .setStorageClass("COLDLINE") + .setStorageClass(StorageClass.COLDLINE) // Possible values: http://g.co/cloud/storage/docs/bucket-locations#location-mr .setLocation("asia") .build()); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java index af9aae929315..ec74935128c2 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java @@ -362,7 +362,7 @@ public Builder setMetadata(Map metadata) { } @Override - public Builder setStorageClass(String storageClass) { + public Builder setStorageClass(StorageClass storageClass) { infoBuilder.setStorageClass(storageClass); return this; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java index 9d94fb89ff52..799f65410b5e 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java @@ -24,6 +24,7 @@ import com.google.api.services.storage.model.ObjectAccessControl; import com.google.api.services.storage.model.StorageObject; import com.google.api.services.storage.model.StorageObject.Owner; +import com.google.cloud.storage.Blob.Builder; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; @@ -78,7 +79,7 @@ public StorageObject apply(BlobInfo blobInfo) { private final String contentEncoding; private final String contentDisposition; private final String contentLanguage; - private final String storageClass; + private final StorageClass storageClass; private final Integer componentCount; private final boolean isDirectory; private final CustomerEncryption customerEncryption; @@ -344,7 +345,7 @@ public abstract static class Builder { /** * Sets the blob's storage class. */ - public abstract Builder setStorageClass(String storageClass); + public abstract Builder setStorageClass(StorageClass storageClass); /** * Sets the blob's user provided metadata. @@ -394,7 +395,7 @@ static final class BuilderImpl extends Builder { private Long createTime; private Boolean isDirectory; private CustomerEncryption customerEncryption; - private String storageClass; + private StorageClass storageClass; BuilderImpl(BlobId blobId) { this.blobId = blobId; @@ -591,7 +592,7 @@ public Builder setMetadata(Map metadata) { } @Override - public Builder setStorageClass(String storageClass) { + public Builder setStorageClass(StorageClass storageClass) { this.storageClass = storageClass; return this; } @@ -1124,7 +1125,7 @@ public CustomerEncryption getCustomerEncryption() { /** * Returns the storage class of the blob. */ - public String getStorageClass() { + public StorageClass getStorageClass() { return storageClass; } @@ -1186,7 +1187,7 @@ public ObjectAccessControl apply(Acl acl) { storageObject.setOwner(new Owner().setEntity(owner.toPb())); } if (storageClass != null) { - storageObject.setStorageClass(storageClass); + storageObject.setStorageClass(storageClass.toString()); } Map pbMetadata = metadata; @@ -1368,7 +1369,7 @@ public Acl apply(ObjectAccessControl objectAccessControl) { CustomerEncryption.fromPb(storageObject.getCustomerEncryption())); } if (storageObject.getStorageClass() != null) { - builder.setStorageClass(storageObject.getStorageClass()); + builder.setStorageClass(StorageClass.valueOf(storageObject.getStorageClass())); } return builder.build(); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java index ffde1389fab8..490aabda7b52 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java @@ -549,12 +549,12 @@ public Builder setDeleteRules(Iterable rules) { @Override @Deprecated - public Builder storageClass(String storageClass) { + public Builder storageClass(StorageClass storageClass) { return setStorageClass(storageClass); } @Override - public Builder setStorageClass(String storageClass) { + public Builder setStorageClass(StorageClass storageClass) { infoBuilder.setStorageClass(storageClass); return this; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java index 283d34b3bf5e..e428142e625d 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java @@ -80,7 +80,7 @@ public com.google.api.services.storage.model.Bucket apply(BucketInfo bucketInfo) private final List acl; private final List defaultAcl; private final String location; - private final String storageClass; + private final StorageClass storageClass; /** * Base class for bucket's delete rules. Allows to configure automatic deletion of blobs and blobs @@ -416,14 +416,14 @@ public abstract static class Builder { * here. */ @Deprecated - public abstract Builder storageClass(String storageClass); + public abstract Builder storageClass(StorageClass storageClass); /** * Sets the bucket's storage class. This defines how blobs in the bucket are stored and * determines the SLA and the cost of storage. A list of supported values is available * here. */ - public abstract Builder setStorageClass(String storageClass); + public abstract Builder setStorageClass(StorageClass storageClass); /** * Sets the bucket's location. Data for blobs in the bucket resides in physical storage within @@ -519,7 +519,7 @@ static final class BuilderImpl extends Builder { private String indexPage; private String notFoundPage; private List deleteRules; - private String storageClass; + private StorageClass storageClass; private String location; private String etag; private Long createTime; @@ -631,12 +631,12 @@ public Builder setDeleteRules(Iterable rules) { @Override @Deprecated - public Builder storageClass(String storageClass) { + public Builder storageClass(StorageClass storageClass) { return setStorageClass(storageClass); } @Override - public Builder setStorageClass(String storageClass) { + public Builder setStorageClass(StorageClass storageClass) { this.storageClass = storageClass; return this; } @@ -928,7 +928,7 @@ public String getLocation() { * @see Storage Classes */ @Deprecated - public String storageClass() { + public StorageClass storageClass() { return getStorageClass(); } @@ -938,7 +938,7 @@ public String storageClass() { * * @see Storage Classes */ - public String getStorageClass() { + public StorageClass getStorageClass() { return storageClass; } @@ -1048,7 +1048,7 @@ com.google.api.services.storage.model.Bucket toPb() { bucketPb.setLocation(location); } if (storageClass != null) { - bucketPb.setStorageClass(storageClass); + bucketPb.setStorageClass(storageClass.toString()); } if (cors != null) { bucketPb.setCors(transform(cors, Cors.TO_PB_FUNCTION)); @@ -1138,7 +1138,7 @@ static BucketInfo fromPb(com.google.api.services.storage.model.Bucket bucketPb) builder.setLocation(bucketPb.getLocation()); } if (bucketPb.getStorageClass() != null) { - builder.setStorageClass(bucketPb.getStorageClass()); + builder.setStorageClass(StorageClass.valueOf(bucketPb.getStorageClass())); } if (bucketPb.getCors() != null) { builder.setCors(transform(bucketPb.getCors(), Cors.FROM_PB_FUNCTION)); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java index be2edabff82f..bce663008dcd 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java @@ -1527,7 +1527,7 @@ public static Builder newBuilder() { * String bucketName = "my_unique_bucket"; * Bucket bucket = storage.create(BucketInfo.newBuilder(bucketName) * // See here for possible values: http://g.co/cloud/storage/docs/storage-classes - * .setStorageClass(StorageClasses.COLDLINE) + * .setStorageClass(StorageClass.COLDLINE) * // Possible values: http://g.co/cloud/storage/docs/bucket-locations#location-mr * .setLocation("asia") * .build()); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java deleted file mode 100644 index 3f3b160b2d1d..000000000000 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClasses.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.cloud.storage; - -/** - * String constants for the names of the storage classes. - */ -public class StorageClasses { - /** - * Name for the multi-regional storage class. - */ - public static final String MULTI_REGIONAL = "MULTI_REGIONAL"; - - /** - * Name for the regional storage class. - */ - public static final String REGIONAL = "REGIONAL"; - - /** - * Name for the Nearline storage class. - */ - public static final String NEARLINE = "NEARLINE"; - - /** - * Name for the Codeline storage class. - */ - public static final String COLDLINE = "COLDLINE"; - - /** - * Name for the standard storage class. - */ - public static final String STANDARD = "STANDARD"; -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java index db82fa40d47f..f3d9b7a90e2f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java @@ -66,7 +66,7 @@ public class BlobInfoTest { private static final String KEY_SHA256 = "keySha"; private static final CustomerEncryption CUSTOMER_ENCRYPTION = new CustomerEncryption(ENCRYPTION_ALGORITHM, KEY_SHA256); - private static final String STORAGE_CLASS = StorageClasses.COLDLINE; + private static final StorageClass STORAGE_CLASS = StorageClass.COLDLINE; private static final BlobInfo BLOB_INFO = BlobInfo.newBuilder("b", "n", GENERATION) .setAcl(ACL) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java index 2ccf8283d417..f7c7e6a32530 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java @@ -57,7 +57,7 @@ public class BucketInfoTest { private static final String INDEX_PAGE = "index.html"; private static final String NOT_FOUND_PAGE = "error.html"; private static final String LOCATION = "ASIA"; - private static final String STORAGE_CLASS = "STANDARD"; + private static final StorageClass STORAGE_CLASS = StorageClass.STANDARD; private static final Boolean VERSIONING_ENABLED = true; private static final BucketInfo BUCKET_INFO = BucketInfo.newBuilder("b") .setAcl(ACL) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java index 15886adb2e95..33cacebd12a0 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java @@ -74,7 +74,7 @@ public class BucketTest { private static final String INDEX_PAGE = "index.html"; private static final String NOT_FOUND_PAGE = "error.html"; private static final String LOCATION = "ASIA"; - private static final String STORAGE_CLASS = "STANDARD"; + private static final StorageClass STORAGE_CLASS = StorageClass.STANDARD; private static final Boolean VERSIONING_ENABLED = true; private static final BucketInfo FULL_BUCKET_INFO = BucketInfo.newBuilder("b") .setAcl(ACLS) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java index 7e4d25e3bccb..48ae816e8c3d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java @@ -44,7 +44,7 @@ import com.google.cloud.storage.Storage.BucketField; import com.google.cloud.storage.StorageBatch; import com.google.cloud.storage.StorageBatchResult; -import com.google.cloud.storage.StorageClasses; +import com.google.cloud.storage.StorageClass; import com.google.cloud.storage.StorageException; import com.google.cloud.storage.testing.RemoteStorageHelper; import com.google.common.collect.ImmutableList; @@ -795,19 +795,19 @@ public void testCopyBlobUpdateStorageClass() { String sourceBlobName = "test-copy-blob-update-storage-class-source"; BlobId source = BlobId.of(BUCKET, sourceBlobName); BlobInfo sourceInfo = - BlobInfo.newBuilder(source).setStorageClass(StorageClasses.STANDARD).build(); + BlobInfo.newBuilder(source).setStorageClass(StorageClass.STANDARD).build(); Blob remoteSourceBlob = storage.create(sourceInfo, BLOB_BYTE_CONTENT); assertNotNull(remoteSourceBlob); - assertEquals(StorageClasses.STANDARD, remoteSourceBlob.getStorageClass()); + assertEquals(StorageClass.STANDARD, remoteSourceBlob.getStorageClass()); String targetBlobName = "test-copy-blob-update-storage-class-target"; BlobInfo targetInfo = BlobInfo - .newBuilder(BUCKET, targetBlobName).setStorageClass(StorageClasses.COLDLINE).build(); + .newBuilder(BUCKET, targetBlobName).setStorageClass(StorageClass.COLDLINE).build(); Storage.CopyRequest req = Storage.CopyRequest.of(source, targetInfo); CopyWriter copyWriter = storage.copy(req); assertEquals(BUCKET, copyWriter.getResult().getBucket()); assertEquals(targetBlobName, copyWriter.getResult().getName()); - assertEquals(StorageClasses.COLDLINE, copyWriter.getResult().getStorageClass()); + assertEquals(StorageClass.COLDLINE, copyWriter.getResult().getStorageClass()); assertTrue(copyWriter.isDone()); assertTrue(remoteSourceBlob.delete()); assertTrue(storage.delete(BUCKET, targetBlobName)); From 821bd4e37a2d60a1de6d3918496119ea5ae38142 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 15:38:33 -0800 Subject: [PATCH 7/8] Add StorageClass --- .../google/cloud/storage/StorageClass.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java new file mode 100644 index 000000000000..0c94e546c5d5 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java @@ -0,0 +1,48 @@ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.storage; + +/** + * Enums for the storage classes. + * See https://cloud.google.com/storage/docs/storage-classes for details. + */ +public enum StorageClass { + + /** + * Multi-regional storage class. + */ + REGIONAL, + + /** + * Multi-regional storage class. + */ + MULTI_REGIONAL, + + /** + * Nearline storage class. + */ + NEARLINE, + + /** + * Coldline storage class. + */ + COLDLINE, + + /** + * Standard storage class. + */ + STANDARD +} From b3fc31d519da02f4352f84a374c8ae3df1e2bee3 Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Fri, 3 Mar 2017 15:39:22 -0800 Subject: [PATCH 8/8] Fix docs --- .../src/main/java/com/google/cloud/storage/StorageClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java index 0c94e546c5d5..2c543f31c0b1 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java @@ -22,7 +22,7 @@ public enum StorageClass { /** - * Multi-regional storage class. + * Regional storage class. */ REGIONAL,