diff --git a/src/main/java/com/google/firebase/FirebaseOptions.java b/src/main/java/com/google/firebase/FirebaseOptions.java index 8e7a29ccb..a7aeed498 100644 --- a/src/main/java/com/google/firebase/FirebaseOptions.java +++ b/src/main/java/com/google/firebase/FirebaseOptions.java @@ -24,6 +24,7 @@ import com.google.api.client.util.Key; import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.firestore.FirestoreOptions; +import com.google.cloud.storage.StorageOptions; import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; @@ -86,6 +87,8 @@ public GoogleCredentials get() { private final ThreadManager threadManager; private final FirestoreOptions firestoreOptions; + private final StorageOptions storageOptions; + private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) { this.databaseUrl = builder.databaseUrl; this.credentialsSupplier = checkNotNull( @@ -113,6 +116,7 @@ private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) { checkArgument(builder.readTimeout >= 0); this.readTimeout = builder.readTimeout; this.firestoreOptions = builder.firestoreOptions; + this.storageOptions = builder.storageOptions; } /** @@ -216,6 +220,10 @@ FirestoreOptions getFirestoreOptions() { return firestoreOptions; } + public StorageOptions getStorageOptions() { + return storageOptions; + } + /** * Creates an empty builder. * @@ -251,6 +259,8 @@ public static final class Builder { @Key("storageBucket") private String storageBucket; + private StorageOptions storageOptions; + @Key("serviceAccountId") private String serviceAccountId; private Supplier credentialsSupplier; @@ -290,6 +300,7 @@ public Builder(FirebaseOptions options) { connectTimeout = options.connectTimeout; readTimeout = options.readTimeout; firestoreOptions = options.firestoreOptions; + storageOptions = options.storageOptions; } /** @@ -495,6 +506,11 @@ public Builder setReadTimeout(int readTimeout) { return this; } + public Builder setStorageOptions(StorageOptions storageOptions) { + this.storageOptions = storageOptions; + return this; + } + /** * Builds the {@link FirebaseOptions} instance from the previously set options. * diff --git a/src/main/java/com/google/firebase/cloud/StorageClient.java b/src/main/java/com/google/firebase/cloud/StorageClient.java index 955abd7e2..a755c8d03 100644 --- a/src/main/java/com/google/firebase/cloud/StorageClient.java +++ b/src/main/java/com/google/firebase/cloud/StorageClient.java @@ -19,6 +19,8 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.cloud.firestore.Firestore; +import com.google.cloud.firestore.FirestoreOptions; import com.google.cloud.storage.Bucket; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; @@ -27,6 +29,7 @@ import com.google.firebase.FirebaseApp; import com.google.firebase.ImplFirebaseTrampolines; import com.google.firebase.internal.FirebaseService; +import com.google.firebase.internal.NonNull; /** * StorageClient provides access to Google Cloud Storage APIs. You can specify a default cloud @@ -56,8 +59,12 @@ public static synchronized StorageClient getInstance(FirebaseApp app) { StorageClientService service = ImplFirebaseTrampolines.getService(app, SERVICE_ID, StorageClientService.class); if (service == null) { - Storage storage = StorageOptions.newBuilder() + StorageOptions userOptions = app.getOptions().getStorageOptions(); + StorageOptions.Builder builder = userOptions != null ? userOptions.toBuilder() : + StorageOptions.newBuilder(); + Storage storage = builder .setCredentials(ImplFirebaseTrampolines.getCredentials(app)) + .setProjectId(ImplFirebaseTrampolines.getProjectId(app)) .build() .getService(); StorageClient client = new StorageClient(app, storage); @@ -66,6 +73,16 @@ public static synchronized StorageClient getInstance(FirebaseApp app) { return service.getInstance(); } + @NonNull + public static Storage getStorage(FirebaseApp app) { + return getInstance(app).storage; + } + + @NonNull + public static Storage getStorage() { + return getStorage(FirebaseApp.getInstance()); + } + /** * Returns the default cloud storage bucket associated with the current app. This is the bucket * configured via {@link com.google.firebase.FirebaseOptions} when initializing the app. If diff --git a/src/test/java/com/google/firebase/cloud/StorageClientIT.java b/src/test/java/com/google/firebase/cloud/StorageClientIT.java index 57fe58b82..4f4791b42 100644 --- a/src/test/java/com/google/firebase/cloud/StorageClientIT.java +++ b/src/test/java/com/google/firebase/cloud/StorageClientIT.java @@ -21,10 +21,16 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.storage.Blob; import com.google.cloud.storage.Bucket; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; import com.google.common.io.CharStreams; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; import com.google.firebase.testing.IntegrationTestUtils; +import com.google.firebase.testing.ServiceAccount; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -87,5 +93,4 @@ private Blob createTextBlob(Bucket bucket, String contents) { String fileName = "data_" + System.currentTimeMillis() + ".txt"; return bucket.create(fileName, contents.getBytes(), "text/plain"); } - } diff --git a/src/test/java/com/google/firebase/cloud/StorageClientTest.java b/src/test/java/com/google/firebase/cloud/StorageClientTest.java index 190fad6cc..a59c8df3e 100644 --- a/src/test/java/com/google/firebase/cloud/StorageClientTest.java +++ b/src/test/java/com/google/firebase/cloud/StorageClientTest.java @@ -16,15 +16,19 @@ package com.google.firebase.cloud; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.storage.Bucket; import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; +import com.google.firebase.ImplFirebaseTrampolines; import com.google.firebase.TestOnlyImplFirebaseTrampolines; import com.google.firebase.testing.ServiceAccount; import java.io.IOException; @@ -126,4 +130,34 @@ public void testBucket() throws IOException { assertSame(mockBucket, client.bucket()); assertSame(mockBucket, client.bucket("mock-bucket-name")); } + + @Test + public void testAbsentStorageOptions() throws Exception { + String projectId = "test-proj"; + FirebaseOptions options = FirebaseOptions.builder() + .setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream())) + .setProjectId(projectId) + .build(); + + FirebaseApp.initializeApp(options); + Storage storage = StorageClient.getStorage(); + assertEquals(projectId, storage.getOptions().getProjectId()); + assertEquals("https://storage.googleapis.com", storage.getOptions().getHost()); + } + + @Test + public void testStorageOptions() throws IOException { + FirebaseApp app = FirebaseApp.initializeApp(FirebaseOptions.builder() + .setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream())) + .setProjectId("explicit-project-id") + .setStorageOptions(StorageOptions.newBuilder() + .setHost("explicit-host") + .build()) + .build()); + Storage storage1 = StorageClient.getStorage(app); + assertEquals("explicit-project-id", storage1.getOptions().getProjectId()); + assertEquals("explicit-host", storage1.getOptions().getHost()); + + assertSame(storage1, StorageClient.getStorage()); + } }