diff --git a/gcloud-java-examples/src/main/java/com/google/cloud/examples/storage/snippets/BlobSnippets.java b/gcloud-java-examples/src/main/java/com/google/cloud/examples/storage/snippets/BlobSnippets.java
new file mode 100644
index 000000000000..2ffcd4dd5a38
--- /dev/null
+++ b/gcloud-java-examples/src/main/java/com/google/cloud/examples/storage/snippets/BlobSnippets.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/*
+ * EDITING INSTRUCTIONS
+ * This file is referenced in Blob's javadoc. Any change to this file should be reflected in Blob's
+ * javadoc.
+ */
+
+package com.google.cloud.examples.storage.snippets;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.cloud.AuthCredentials;
+import com.google.cloud.ReadChannel;
+import com.google.cloud.ServiceAccountSigner;
+import com.google.cloud.WriteChannel;
+import com.google.cloud.storage.Blob;
+import com.google.cloud.storage.Blob.BlobSourceOption;
+import com.google.cloud.storage.BlobId;
+import com.google.cloud.storage.CopyWriter;
+import com.google.cloud.storage.Storage.SignUrlOption;
+import com.google.cloud.storage.StorageException;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This class contains a number of snippets for the {@link Blob} class.
+ */
+public class BlobSnippets {
+
+ private final Blob blob;
+
+ public BlobSnippets(Blob blob) {
+ this.blob = blob;
+ }
+
+ /**
+ * Example of checking if the blob exists.
+ */
+ // [TARGET exists(BlobSourceOption...)]
+ public boolean exists() {
+ // [START exists]
+ boolean exists = blob.exists();
+ if (exists) {
+ // the blob exists
+ } else {
+ // the blob was not found
+ }
+ // [END exists]
+ return exists;
+ }
+
+ /**
+ * Example of reading all bytes of the blob, if its generation matches the
+ * {@link Blob#generation()} value, otherwise a {@link StorageException} is thrown.
+ */
+ // [TARGET content(BlobSourceOption...)]
+ public byte[] content() {
+ // [START content]
+ byte[] content = blob.content(BlobSourceOption.generationMatch());
+ // [END content]
+ return content;
+ }
+
+ /**
+ * Example of getting the blob's latest information, if its generation does not match the
+ * {@link Blob#generation()} value, otherwise a {@link StorageException} is thrown.
+ */
+ // [TARGET reload(BlobSourceOption...)]
+ public Blob reload() {
+ // [START reload]
+ Blob latestBlob = blob.reload(BlobSourceOption.generationNotMatch());
+ if (latestBlob == null) {
+ // the blob was not found
+ }
+ // [END reload]
+ return latestBlob;
+ }
+
+ /**
+ * Example of replacing blob's metadata.
+ */
+ // [TARGET update(BlobTargetOption...)]
+ public Blob update() {
+ // [START update]
+ Map Example of checking if the blob exists.
+ * Example of reading all bytes of the blob, if its generation matches the
+ * {@link Blob#generation()} value, otherwise a {@link StorageException} is thrown.
+ * Example of getting the blob's latest information, if its generation does not match the
+ * {@link Blob#generation()} value, otherwise a {@link StorageException} is thrown.
+ * {@code
+ * boolean exists = blob.exists();
+ * if (exists) {
+ * // the blob exists
+ * } else {
+ * // the blob was not found
+ * }
+ * }
+ *
* @param options blob read options
* @return true if this blob exists, false otherwise
* @throws StorageException upon failure
@@ -336,16 +346,31 @@ public boolean exists(BlobSourceOption... options) {
/**
* Returns this blob's content.
*
+ * {@code
+ * byte[] content = blob.content(BlobSourceOption.generationMatch());
+ * }
+ *
* @param options blob read options
* @throws StorageException upon failure
*/
- public byte[] content(Storage.BlobSourceOption... options) {
- return storage.readAllBytes(blobId(), options);
+ public byte[] content(BlobSourceOption... options) {
+ return storage.readAllBytes(blobId(), toSourceOptions(this, options));
}
/**
* Fetches current blob's latest information. Returns {@code null} if the blob does not exist.
*
+ * {@code
+ * Blob latestBlob = blob.reload(BlobSourceOption.generationNotMatch());
+ * if (latestBlob == null) {
+ * // the blob was not found
+ * }
+ * }
+ *
* @param options blob read options
* @return a {@code Blob} object with latest information or {@code null} if not found
* @throws StorageException upon failure
@@ -367,12 +392,13 @@ public Blob reload(BlobSourceOption... options) {
* {@code blob}'s metadata to {@code null}.
*
Example usage of replacing blob's metadata: + *
Example of replacing blob's metadata. *
{@code
+ * Map newMetadata = new HashMap<>();
+ * newMetadata.put("key", "value");
* blob.toBuilder().metadata(null).build().update();
- * blob.toBuilder().metadata(newMetadata).build().update();
- * }
- *
+ * Blob updatedBlob = blob.toBuilder().metadata(newMetadata).build().update();
+ * }
*
* @param options update options
* @return a {@code Blob} object with updated information
@@ -385,6 +411,17 @@ public Blob update(BlobTargetOption... options) {
/**
* Deletes this blob.
*
+ * Example of deleting the blob, if its generation matches the {@link Blob#generation()} value, + * otherwise a {@link StorageException} is thrown. + *
{@code
+ * boolean deleted = blob.delete(BlobSourceOption.generationMatch());
+ * if (deleted) {
+ * // the blob was deleted
+ * } else {
+ * // the blob was not found
+ * }
+ * }
+ *
* @param options blob delete options
* @return {@code true} if blob was deleted, {@code false} if it was not found
* @throws StorageException upon failure
@@ -397,6 +434,14 @@ public boolean delete(BlobSourceOption... options) {
* Sends a copy request for the current blob to the target blob. Possibly also some of the
* metadata are copied (e.g. content-type).
*
+ * Example of copying the blob to a different bucket with a different name. + *
{@code
+ * String bucketName = "my_unique_bucket";
+ * String blobName = "copy_blob_name";
+ * CopyWriter copyWriter = blob.copyTo(BlobId.of(bucketName, blobName));
+ * Blob copiedBlob = copyWriter.result();
+ * }
+ *
* @param targetBlob target blob's id
* @param options source blob options
* @return a {@link CopyWriter} object that can be used to get information on the newly created
@@ -416,6 +461,13 @@ public CopyWriter copyTo(BlobId targetBlob, BlobSourceOption... options) {
* Sends a copy request for the current blob to the target bucket, preserving its name. Possibly
* copying also some of the metadata (e.g. content-type).
*
+ * Example of copying the blob to a different bucket, keeping the original name. + *
{@code
+ * String bucketName = "my_unique_bucket";
+ * CopyWriter copyWriter = blob.copyTo(bucketName);
+ * Blob copiedBlob = copyWriter.result();
+ * }
+ *
* @param targetBucket target bucket's name
* @param options source blob options
* @return a {@link CopyWriter} object that can be used to get information on the newly created
@@ -430,6 +482,14 @@ public CopyWriter copyTo(String targetBucket, BlobSourceOption... options) {
* Sends a copy request for the current blob to the target blob. Possibly also some of the
* metadata are copied (e.g. content-type).
*
+ * Example of copying the blob to a different bucket with a different name. + *
{@code
+ * String bucketName = "my_unique_bucket";
+ * String blobName = "copy_blob_name";
+ * CopyWriter copyWriter = blob.copyTo(bucketName, blobName);
+ * Blob copiedBlob = copyWriter.result();
+ * }
+ *
* @param targetBucket target bucket's name
* @param targetBlob target blob's name
* @param options source blob options
@@ -444,6 +504,18 @@ public CopyWriter copyTo(String targetBucket, String targetBlob, BlobSourceOptio
/**
* Returns a {@code ReadChannel} object for reading this blob's content.
*
+ * Example of reading the blob's content through a reader. + *
{@code
+ * try (ReadChannel reader = blob.reader()) {
+ * ByteBuffer bytes = ByteBuffer.allocate(64 * 1024);
+ * while (reader.read(bytes) > 0) {
+ * bytes.flip();
+ * // do something with bytes
+ * bytes.clear();
+ * }
+ * }
+ * }
+ *
* @param options blob read options
* @throws StorageException upon failure
*/
@@ -456,6 +528,18 @@ public ReadChannel reader(BlobSourceOption... options) {
* crc32c values in the current blob are ignored unless requested via the
* {@code BlobWriteOption.md5Match} and {@code BlobWriteOption.crc32cMatch} options.
*
+ * Example of writing the blob's content through a writer. + *
{@code
+ * byte[] content = "Hello, World!".getBytes(UTF_8);
+ * try (WriteChannel writer = blob.writer()) {
+ * try {
+ * writer.write(ByteBuffer.wrap(content, 0, content.length));
+ * } catch (Exception ex) {
+ * // handle exception
+ * }
+ * }
+ * }
+ *
* @param options target blob options
* @throws StorageException upon failure
*/
@@ -485,18 +569,18 @@ public WriteChannel writer(BlobWriteOption... options) {
* Example usage of creating a signed URL that is valid for 2 weeks, using the default - * credentials for signing the URL: + *
Example of creating a signed URL for the blob that is valid for 2 weeks, using the default + * credentials for signing the URL. *
{@code
- * blob.signUrl(14, TimeUnit.DAYS);
+ * URL signedUrl = blob.signUrl(14, TimeUnit.DAYS);
* }
*
- * Example usage of creating a signed URL passing the - * {@link SignUrlOption#signWith(ServiceAccountSigner)} option, that will be used for signing the - * URL: + *
Example of creating a signed URL for the blob passing the + * {@link SignUrlOption#signWith(ServiceAccountSigner)} option, that will be used to sign the URL. *
{@code
- * blob.signUrl(14, TimeUnit.DAYS, SignUrlOption.signWith(
- * AuthCredentials.createForJson(new FileInputStream("/path/to/key.json"))));
+ * String keyPath = "/path/to/key.json";
+ * URL signedUrl = blob.signUrl(14, TimeUnit.DAYS, SignUrlOption.signWith(
+ * AuthCredentials.createForJson(new FileInputStream(keyPath))));
* }
*
* @param duration time until the signed URL expires, expressed in {@code unit}. The finer