Skip to content

Commit

Permalink
Exposing TransportChannelProvider & CredentialsProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
schmidt-sebastian committed May 29, 2018
1 parent a83f9ed commit c9d9bdb
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
package com.google.cloud.firestore;

import com.google.api.core.InternalApi;
import com.google.api.gax.core.CredentialsProvider;
import com.google.api.gax.core.GoogleCredentialsProvider;
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.api.gax.rpc.TransportChannelProvider;
import com.google.cloud.ServiceDefaults;
import com.google.cloud.ServiceOptions;
import com.google.cloud.TransportOptions;
Expand All @@ -26,6 +30,7 @@
import com.google.cloud.grpc.GrpcTransportOptions;
import com.google.common.collect.ImmutableSet;
import java.io.IOException;
import java.util.Objects;
import java.util.Set;
import javax.annotation.Nonnull;

Expand All @@ -38,11 +43,12 @@ public final class FirestoreOptions extends ServiceOptions<Firestore, FirestoreO
.add("https://www.googleapis.com/auth/cloud-platform")
.add("https://www.googleapis.com/auth/datastore")
.build();
private static final String DEFAULT_HOST = FirestoreSettings.getDefaultEndpoint();
private static final String DEFAULT_DATABASE_ID = "(default)";
private static final long serialVersionUID = -5853552236134770088L;

private static final long serialVersionUID = -5853552236134770089L;

private final String databaseId;
private final TransportChannelProvider channelProvider;
private final CredentialsProvider credentialsProvider;

public static class DefaultFirestoreFactory implements FirestoreFactory {

Expand Down Expand Up @@ -82,53 +88,123 @@ protected boolean projectIdRequired() {

@Override
protected String getDefaultHost() {
return DEFAULT_HOST;
return FirestoreDefaults.INSTANCE.getHost();
}

public String getDatabaseId() {
return databaseId;
}

public CredentialsProvider getCredentialsProvider() {
return credentialsProvider;
}

public TransportChannelProvider getTransportChannelProvider() {
return channelProvider;
}

public static class Builder extends ServiceOptions.Builder<Firestore, FirestoreOptions, Builder> {

private String databaseId = DEFAULT_DATABASE_ID;
private String databaseId = FirestoreDefaults.INSTANCE.getDatabaseId();
private TransportChannelProvider channelProvider =
FirestoreDefaults.INSTANCE.getTransportChannelProvider();
private CredentialsProvider credentialsProvider =
FirestoreDefaults.INSTANCE.getCredentialsProvider();

private Builder() {}

private Builder(FirestoreOptions options) {
super(options);
this.databaseId = options.databaseId;
this.channelProvider = options.channelProvider;
this.credentialsProvider = options.credentialsProvider;
}

/**
* Sets the {@link TransportOptions} to use with this Firestore client.
*
* @param transportOptions A GrpcTransportOptions object that defines the transport options for
* this client.
*/
@Nonnull
@Override
public Builder setTransportOptions(@Nonnull TransportOptions transportOptions) {
if (!(transportOptions instanceof GrpcTransportOptions)) {
throw new IllegalArgumentException(
"Only grpc transport is allowed for " + API_SHORT_NAME + ".");
"Only GRPC transport is allowed for " + API_SHORT_NAME + ".");
}
return super.setTransportOptions(transportOptions);
}

@Override
/**
* Sets the {@link TransportChannelProvider} to use with this Firestore client.
*
* @param channelProvider A InstantiatingGrpcChannelProvider object that defines the transport
* provider for this client.
*/
@Nonnull
public FirestoreOptions build() {
return new FirestoreOptions(this);
public Builder setChannelProvider(@Nonnull TransportChannelProvider channelProvider) {
if (!(channelProvider instanceof InstantiatingGrpcChannelProvider)) {
throw new IllegalArgumentException(
"Only GRPC channels are allowed for " + API_SHORT_NAME + ".");
}
this.channelProvider = channelProvider;
return this;
}

/**
* Sets the {@link CredentialsProvider} to use with this Firestore client.
*
* @param credentialsProvider A GoogleCredentialsProvider object that defines the credential
* provider for this client.
*/
@Nonnull
public Builder setCredentialsProvider(@Nonnull CredentialsProvider credentialsProvider) {
if (!(credentialsProvider instanceof GoogleCredentialsProvider)) {
throw new IllegalArgumentException(
"Only Google credentials are allowed for " + API_SHORT_NAME + ".");
}
this.credentialsProvider = credentialsProvider;
return this;
}

/**
* Sets the database ID to use with this Firestore client.
*
* @param databaseId The Firestore database ID to use with this client.
*/
public Builder setDatabaseId(String databaseId) {
this.databaseId = databaseId;
return this;
}

@Override
@Nonnull
public FirestoreOptions build() {
return new FirestoreOptions(this);
}
}

@InternalApi("This class should only be extended within google-cloud-java")
protected FirestoreOptions(Builder builder) {
super(FirestoreFactory.class, FirestoreRpcFactory.class, builder, new FirestoreDefaults());

this.databaseId = builder.databaseId;
this.channelProvider = builder.channelProvider;
this.credentialsProvider = builder.credentialsProvider;
}

private static class FirestoreDefaults implements ServiceDefaults<Firestore, FirestoreOptions> {
private static final FirestoreDefaults INSTANCE = new FirestoreDefaults();

private final String HOST = FirestoreSettings.getDefaultEndpoint();
private final String DATABASE_ID = "(default)";
private final GrpcTransportOptions TRANSPORT_OPTIONS =
getDefaultTransportOptionsBuilder().build();
private final TransportChannelProvider CHANNEL_PROVIDER =
getDefaultTransportChannelProviderBuilder().build();
private final CredentialsProvider CREDENTIALS_PROVIDER =
getDefaultCredentialsProviderBuilder().build();

@Nonnull
@Override
Expand All @@ -144,14 +220,45 @@ public FirestoreRpcFactory getDefaultRpcFactory() {

@Nonnull
@Override
public TransportOptions getDefaultTransportOptions() {
return getDefaultGrpcTransportOptions();
public GrpcTransportOptions getDefaultTransportOptions() {
return TRANSPORT_OPTIONS;
}

@Nonnull
TransportChannelProvider getTransportChannelProvider() {
return CHANNEL_PROVIDER;
}

@Nonnull
String getHost() {
return HOST;
}

@Nonnull
String getDatabaseId() {
return DATABASE_ID;
}

@Nonnull
CredentialsProvider getCredentialsProvider() {
return CREDENTIALS_PROVIDER;
}
}

@Nonnull
public static GrpcTransportOptions.Builder getDefaultTransportOptionsBuilder() {
return GrpcTransportOptions.newBuilder();
}

@Nonnull
public static GrpcTransportOptions getDefaultGrpcTransportOptions() {
return GrpcTransportOptions.newBuilder().build();
public static InstantiatingGrpcChannelProvider.Builder
getDefaultTransportChannelProviderBuilder() {
return FirestoreSettings.defaultGrpcTransportProviderBuilder();
}

@Nonnull
public static GoogleCredentialsProvider.Builder getDefaultCredentialsProviderBuilder() {
return FirestoreSettings.defaultCredentialsProviderBuilder();
}

@Override
Expand All @@ -164,13 +271,22 @@ FirestoreRpc getFirestoreRpc() {
}

@Override
public boolean equals(Object obj) {
return obj instanceof FirestoreOptions && baseEquals((FirestoreOptions) obj);
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
FirestoreOptions that = (FirestoreOptions) o;
return Objects.equals(databaseId, that.databaseId)
&& Objects.equals(channelProvider, that.channelProvider)
&& baseEquals(that);
}

@Override
public int hashCode() {
return baseHashCode();
return Objects.hash(databaseId, channelProvider, baseHashCode());
}

@Nonnull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.google.api.gax.core.GaxProperties;
import com.google.api.gax.grpc.GrpcCallContext;
import com.google.api.gax.grpc.GrpcTransportChannel;
import com.google.api.gax.rpc.ApiClientHeaderProvider;
import com.google.api.gax.rpc.BidiStreamingCallable;
import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.HeaderProvider;
Expand Down Expand Up @@ -105,11 +104,8 @@ public GrpcFirestoreRpc(final FirestoreOptions options) throws IOException {
DatabaseRootName databaseName =
DatabaseRootName.of(options.getProjectId(), options.getDatabaseId());

settingsBuilder.setCredentialsProvider(
GrpcTransportOptions.setUpCredentialsProvider(options));
settingsBuilder.setTransportChannelProvider(
GrpcTransportOptions.setUpChannelProvider(
FirestoreSettings.defaultGrpcTransportProviderBuilder(), options));
settingsBuilder.setCredentialsProvider(options.getCredentialsProvider());
settingsBuilder.setTransportChannelProvider(options.getTransportChannelProvider());

HeaderProvider internalHeaderProvider =
FirestoreSettings.defaultApiClientHeaderProviderBuilder()
Expand Down

0 comments on commit c9d9bdb

Please sign in to comment.