/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you 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.
 */
package org.apache.calcite.avatica;

import org.apache.calcite.avatica.ha.LBStrategy;
import org.apache.calcite.avatica.remote.AvaticaHttpClientFactory;
import org.apache.calcite.avatica.remote.HostnameVerificationConfigurable.HostnameVerification;
import org.apache.calcite.avatica.remote.Service;

import java.io.File;

/**
 * Connection configuration.
 */
public interface ConnectionConfig {
  /** @see BuiltInConnectionProperty#SCHEMA */
  String schema();
  /** @see BuiltInConnectionProperty#TIME_ZONE */
  String timeZone();
  /** @see BuiltInConnectionProperty#FACTORY */
  Service.Factory factory();
  /** @see BuiltInConnectionProperty#URL */
  String url();
  /** @see BuiltInConnectionProperty#SERIALIZATION */
  String serialization();
  /** @see BuiltInConnectionProperty#AUTHENTICATION */
  String authentication();
  /** @see BuiltInConnectionProperty#AVATICA_USER */
  String avaticaUser();
  /** @see BuiltInConnectionProperty#AVATICA_PASSWORD */
  String avaticaPassword();
  /** @see BuiltInConnectionProperty#HTTP_CLIENT_FACTORY */
  AvaticaHttpClientFactory httpClientFactory();
  /** @see BuiltInConnectionProperty#HTTP_CLIENT_IMPL */
  String httpClientClass();
  /** @see BuiltInConnectionProperty#PRINCIPAL */
  String kerberosPrincipal();
  /** @see BuiltInConnectionProperty#KEYTAB */
  File kerberosKeytab();
  /** @see BuiltInConnectionProperty#KEYSTORE_TYPE */
  String keystoreType();
  /** @see BuiltInConnectionProperty#TRUSTSTORE */
  File truststore();
  /** @see BuiltInConnectionProperty#TRUSTSTORE_PASSWORD */
  String truststorePassword();
  /** @see BuiltInConnectionProperty#KEYSTORE */
  File keystore();
  /** @see BuiltInConnectionProperty#KEYSTORE_PASSWORD */
  String keystorePassword();
  /** @see BuiltInConnectionProperty#KEY_PASSWORD */
  String keyPassword();
  /** @see BuiltInConnectionProperty#HOSTNAME_VERIFICATION */
  HostnameVerification hostnameVerification();
  /** @see BuiltInConnectionProperty#TRANSPARENT_RECONNECTION */
  boolean transparentReconnectionEnabled();
  /** @see BuiltInConnectionProperty#FETCH_SIZE */
  int fetchSize();
  /** @see BuiltInConnectionProperty#USE_CLIENT_SIDE_LB #**/
  boolean useClientSideLb();
  /** @see BuiltInConnectionProperty#LB_URLS **/
  String getLbURLs();
  /** @see BuiltInConnectionProperty#LB_STRATEGY **/
  LBStrategy getLBStrategy();
  /** @see BuiltInConnectionProperty#LB_CONNECTION_FAILOVER_RETRIES **/
  int getLBConnectionFailoverRetries();
  /** @see BuiltInConnectionProperty#LB_CONNECTION_FAILOVER_SLEEP_TIME **/
  long getLBConnectionFailoverSleepTime();
  /** @see BuiltInConnectionProperty#HTTP_CONNECTION_TIMEOUT **/
  long getHttpConnectionTimeout();
}

// End ConnectionConfig.java
