private AWSAppSyncClient()

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);
    }