in aws-android-sdk-appsync/src/main/java/com/amazonaws/mobileconnectors/appsync/AWSAppSyncClient.java [146:274]
private AWSAppSyncClient(AWSAppSyncClient.Builder builder) {
applicationContext = builder.mContext.getApplicationContext();
if (builder.mClientDatabasePrefix != null) {
clientDatabasePrefix = builder.mClientDatabasePrefix;
querySqlStoreName = clientDatabasePrefix + DATABASE_NAME_DELIMITER + DEFAULT_QUERY_SQL_STORE_NAME;
mutationSqlStoreName = clientDatabasePrefix + DATABASE_NAME_DELIMITER + DEFAULT_MUTATION_SQL_STORE_NAME;
deltaSyncSqlStoreName = clientDatabasePrefix + DATABASE_NAME_DELIMITER + DEFAULT_DELTA_SYNC_SQL_STORE_NAME;
}
//Create the Signer interceptor. The notion of "Signer" is overloaded here as apart
//from the SigV4 signer, the other signers add request headers and don't sign the request per se
AppSyncSigV4SignerInterceptor appSyncSigV4SignerInterceptor = null;
if (builder.mCredentialsProvider != null) {
appSyncSigV4SignerInterceptor = new AppSyncSigV4SignerInterceptor(builder.mCredentialsProvider, builder.mRegion.getName());
} else if (builder.mCognitoUserPoolsAuthProvider != null) {
appSyncSigV4SignerInterceptor = new AppSyncSigV4SignerInterceptor(builder.mCognitoUserPoolsAuthProvider, builder.mRegion.getName());
} else if (builder.mOidcAuthProvider != null) {
appSyncSigV4SignerInterceptor = new AppSyncSigV4SignerInterceptor(builder.mOidcAuthProvider);
} else if (builder.mAWSLambdaAuthProvider != null) {
appSyncSigV4SignerInterceptor = new AppSyncSigV4SignerInterceptor(builder.mAWSLambdaAuthProvider);
} else if (builder.mApiKey != null) {
appSyncSigV4SignerInterceptor = new AppSyncSigV4SignerInterceptor(builder.mApiKey, builder.mRegion.getName(), getClientSubscriptionUUID(builder.mApiKey.getAPIKey()));
} else {
throw new RuntimeException("Client requires credentials. Please use #apiKey() #credentialsProvider() or #cognitoUserPoolsAuthProvider() to set the credentials.");
}
//Create the HTTP client
OkHttpClient.Builder okHttpClientBuilder;
if (builder.mOkHttpClient == null) {
okHttpClientBuilder = new OkHttpClient.Builder();
} else {
okHttpClientBuilder = builder.mOkHttpClient.newBuilder();
}
//Add the signer and retry handler to the OKHTTP chain
OkHttpClient okHttpClient = okHttpClientBuilder
.addInterceptor(new RetryInterceptor())
.addInterceptor(appSyncSigV4SignerInterceptor)
.build();
//Setup up the local store
if (builder.mNormalizedCacheFactory == null) {
AppSyncSqlHelper appSyncSqlHelper = AppSyncSqlHelper.create(applicationContext, querySqlStoreName);
//Create NormalizedCacheFactory
builder.mNormalizedCacheFactory = new SqlNormalizedCacheFactory(appSyncSqlHelper);
}
AppSyncMutationsSqlHelper mutationsSqlHelper = new AppSyncMutationsSqlHelper(builder.mContext, mutationSqlStoreName);
AppSyncMutationSqlCacheOperations sqlCacheOperations = new AppSyncMutationSqlCacheOperations(mutationsSqlHelper);
mutationsToRetryAfterConflictResolution = new HashMap<>();
//Instantiate the optimistic update interceptor
AppSyncOptimisticUpdateInterceptor optimisticUpdateInterceptor = new AppSyncOptimisticUpdateInterceptor();
//Instantiate the custom network Invoker
AppSyncCustomNetworkInvoker networkInvoker =
new AppSyncCustomNetworkInvoker(HttpUrl.parse(builder.mServerUrl),
okHttpClient,
new ScalarTypeAdapters(builder.customTypeAdapters),
builder.mPersistentMutationsCallback,
builder.mS3ObjectManager);
mAppSyncOfflineMutationManager = new AppSyncOfflineMutationManager(builder.mContext,
builder.customTypeAdapters,
sqlCacheOperations,
networkInvoker);
//Create the Apollo Client and setup the interceptor chain.
ApolloClient.Builder clientBuilder = ApolloClient.builder()
.serverUrl(builder.mServerUrl)
.normalizedCache(builder.mNormalizedCacheFactory, builder.mResolver)
.addApplicationInterceptor(optimisticUpdateInterceptor)
.addApplicationInterceptor(new AppSyncOfflineMutationInterceptor(
mAppSyncOfflineMutationManager,
false,
builder.mContext,
mutationsToRetryAfterConflictResolution,
this,
builder.mConflictResolver,
builder.mMutationQueueExecutionTimeout))
.addApplicationInterceptor(new AppSyncComplexObjectsInterceptor(builder.mS3ObjectManager))
.okHttpClient(okHttpClient);
//Add custom type builders
for (ScalarType scalarType : builder.customTypeAdapters.keySet()) {
clientBuilder.addCustomTypeAdapter(scalarType, builder.customTypeAdapters.get(scalarType));
}
if (builder.mDispatcher != null) {
clientBuilder.dispatcher(builder.mDispatcher);
}
if (builder.mCacheHeaders != null) {
clientBuilder.defaultCacheHeaders(builder.mCacheHeaders);
}
if (builder.mDefaultResponseFetcher != null) {
clientBuilder.defaultResponseFetcher(builder.mDefaultResponseFetcher);
}
//Add Subscription manager
RealSubscriptionManager subscriptionManager = new RealSubscriptionManager(
builder.mContext.getApplicationContext(),
builder.mSubscriptionsAutoReconnect);
clientBuilder.subscriptionManager(subscriptionManager);
//Build the Apollo Client
mApolloClient = clientBuilder.build();
//Add reference to Apollo Client in the Subscription manager.
subscriptionManager.setApolloClient(mApolloClient);
mSyncStore = new AppSyncStore(mApolloClient.apolloStore());
optimisticUpdateInterceptor.setStore(mApolloClient.apolloStore());
subscriptionManager.setStore(mApolloClient.apolloStore());
subscriptionManager.setScalarTypeAdapters(new ScalarTypeAdapters(builder.customTypeAdapters));
mS3ObjectManager = builder.mS3ObjectManager;
SubscriptionAuthorizer subscriptionAuthorizer = new SubscriptionAuthorizer(builder);
webSocketConnectionManager = new WebSocketConnectionManager(
applicationContext,
builder.mServerUrl,
subscriptionAuthorizer,
new ApolloResponseBuilder(builder.customTypeAdapters, mApolloClient.apolloStore().networkResponseNormalizer()),
builder.mSubscriptionsAutoReconnect);
}