void init()

in src/main/java/com/aliyun/odps/jdbc/utils/ConnectionResource.java [247:549]


  void init(Properties info, Map<String, String> paramsInURL) {
    List<Map> maps = new ArrayList<Map>();
    if (paramsInURL.get(ODPS_CONF_URL_KEY) != null) {
      try {
        InputStream inputStream = new FileInputStream(paramsInURL.get(ODPS_CONF_URL_KEY));
        if (inputStream != null) {
          Properties props = new Properties();
          props.load(inputStream);
          maps.add(props);
        }
      } catch (IOException e) {
        throw new RuntimeException("Load odps conf failed:", e);
      }
    } else {
      maps.add(info);
      maps.add(paramsInURL);
    }

    accessId = tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, null, ACCESS_ID_PROP_KEY_ALT, ACCESS_ID_PROP_KEY, ACCESS_ID_URL_KEY);

    accessKey = tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, null, ACCESS_KEY_PROP_KEY_ALT, ACCESS_KEY_PROP_KEY, ACCESS_KEY_URL_KEY);
    if (accessKey != null) {
      try {
        accessKey = URLDecoder.decode(accessKey, CHARSET_DEFAULT_VALUE);
      } catch (UnsupportedEncodingException e) {
        accessKey = URLDecoder.decode(accessKey);
      }
    }

    useInstanceTunnel = Boolean.parseBoolean(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", USE_INSTANCE_TUNNEL_PROP_KEY,
            USE_INSTANCE_TUNNEL_URL_KEY));

    charset =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, CHARSET_DEFAULT_VALUE, CHARSET_PROP_KEY,
                                                 CHARSET_URL_KEY);
    project =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, PROJECT_PROP_KEY, PROJECT_URL_KEY);
    executeProject =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, EXECUTE_PROJECT_PROP_KEY,
                                                 EXECUTE_PROJECT_URL_KEY);
    logview =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, LOGVIEW_HOST_PROP_KEY,
                                                 LOGVIEW_URL_KEY);
    tunnelEndpoint =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, TUNNEL_ENDPOINT_PROP_KEY,
                                                 TUNNEL_ENDPOINT_URL_KEY);

    tunnelRetryTime = Integer.parseInt(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "6", TUNNEL_RESULT_RETRY_TIME_PROP_KEY,
                                                 TUNNEL_RESULT_RETRY_TIME_URL_KEY)
    );

    logConfFile =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, LOG_CONF_FILE_PROP_KEY,
                                                 LOG_CONF_FILE_URL_KEY);
    interactiveMode = Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", INTERACTIVE_MODE_PROP_KEY,
                                                 INTERACTIVE_MODE_URL_KEY));
    interactiveServiceName =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, INTERACTIVE_SERVICE_NAME_DEFAULT_VALUE,
                                                 SERVICE_NAME_PROP_KEY,
                                                 SERVICE_NAME_URL_KEY);
    majorVersion =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, MAJOR_VERSION_PROP_KEY,
                                                 MAJOR_VERSION_URL_KEY);
    enableOdpsLogger = Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", ENABLE_ODPS_LOGGER_PROP_KEY,
                                                 ENABLE_ODPS_LOGGER_URL_KEY)
    );

    fallbackPolicy.fallback4ResourceNotEnough(Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_RESOURCE_PROP_KEY,
                                                 FALLBACK_FOR_RESOURCE_URL_KEY)
    ));
    fallbackPolicy.fallback4RunningTimeout(Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_TIMEOUT_PROP_KEY,
                                                 FALLBACK_FOR_TIMEOUT_URL_KEY)
    ));
    fallbackPolicy.fallback4Upgrading(Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_UPGRADING_PROP_KEY,
                                                 FALLBACK_FOR_UPGRADING_URL_KEY)
    ));
    fallbackPolicy.fallback4UnsupportedFeature(Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_UNSUPPORTED_PROP_KEY,
                                                 FALLBACK_FOR_UNSUPPORTED_URL_KEY)
    ));
    fallbackPolicy.fallback4UnknownError(Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_UNKNOWN_PROP_KEY,
                                                 FALLBACK_FOR_UNKNOWN_URL_KEY)
    ));

    boolean alwaysFallback = Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", ALWAYS_FALLBACK_PROP_KEY,
                                                 ALWAYS_FALLBACK_URL_KEY)
    );
    if (alwaysFallback) {
      fallbackPolicy = FallbackPolicy.alwaysFallbackPolicy();
    }

    boolean disableFallback = Boolean.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", DISABLE_FALLBACK_PROP_KEY,
                                                 DISABLE_FALLBACK_URL_KEY)
    );
    if (disableFallback) {
      fallbackPolicy = FallbackPolicy.nonFallbackPolicy();
    }

    fallbackQuota =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, FALLBACK_QUOTA_PROP_KEY, FALLBACK_QUOTA_URL_KEY);

    stsToken =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, STS_TOKEN_PROP_KEY, STS_TOKEN_URL_KEY);

    autoSelectLimit = Long.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", AUTO_SELECT_LIMIT_PROP_KEY,
                                                 AUTO_SELECT_LIMIT_URL_KEY)
    );

    countLimit = Long.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", INSTANCE_TUNNEL_MAX_RECORD_PROP_KEY,
                                                 INSTANCE_TUNNEL_MAX_RECORD_URL_KEY)
    );
    if (countLimit <= 0L) {
      countLimit = null;
    }

    sizeLimit = Long.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", INSTANCE_TUNNEL_MAX_SIZE_PROP_KEY,
                                                 INSTANCE_TUNNEL_MAX_SIZE_URL_KEY)
    );
    if (sizeLimit <= 0L) {
      sizeLimit = null;
    }

    attachTimeout = Long.valueOf(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", ATTACH_TIMEOUT_PROP_KEY,
                                                 ATTACH_TIMEOUT_URL_KEY)
    );
    if (attachTimeout <= 0L) {
      attachTimeout = null;
    }

    disableConnSetting = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, "false", DISABLE_CONN_SETTING_PROP_KEY, DISABLE_CONN_SETTING_URL_KEY)
    );

    useProjectTimeZone = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, "false", USE_PROJECT_TIME_ZONE_PROP_KEY, USE_PROJECT_TIME_ZONE_URL_KEY)
    );

    enableLimit = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, "true", ENABLE_LIMIT_PROP_KEY, ENABLE_LIMIT_URL_KEY)
    );

    readTimeout =
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, READ_TIMEOUT_DEFAULT_VALUE, READ_TIMEOUT_PROP_KEY, READ_TIMEOUT_URL_KEY);
    connectTimeout =
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, CONNECT_TIMEOUT_DEFAULT_VALUE, CONNECT_TIMEOUT_PROP_KEY, CONNECT_TIMEOUT_URL_KRY);

    tunnelReadTimeout =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, READ_TIMEOUT_DEFAULT_VALUE, TUNNEL_READ_TIMEOUT_PROP_KEY, TUNNEL_READ_TIMEOUT_URL_KEY);
    tunnelConnectTimeout =
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, CONNECT_TIMEOUT_DEFAULT_VALUE, TUNNEL_CONNECT_TIMEOUT_PROP_KEY, TUNNEL_CONNECT_TIMEOUT_URL_KRY);

    String tunnelDownloadUseSingleReaderStr = tryGetFirstNonNullValueByAltMapAndAltKey(
            maps, "true", TUNNEL_DOWNLOAD_USE_SINGLE_READER_PROP_KEY, TUNNEL_DOWNLOAD_USE_SINGLE_READER_URL_KEY);
    checkValueIsValidBoolean(TUNNEL_DOWNLOAD_USE_SINGLE_READER_URL_KEY, tunnelDownloadUseSingleReaderStr);
    tunnelDownloadUseSingleReader = Boolean.parseBoolean(tunnelDownloadUseSingleReaderStr);

    // cancel enableLimit hint if autoSelectLimit turns on
    if (autoSelectLimit > 0) {
      enableLimit = false;
    }

    autoLimitFallback = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, "false", AUTO_FALLBACK_PROP_KEY, AUTO_LIMIT_FALLBACK_URL_KEY));

    enableCommandApi =
        Boolean.parseBoolean(
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", ENABLE_COMMAND_API_PROP_KEY,
                                                     ENABLE_COMMAND_API_URL_KEY));

    httpsCheck = Boolean.parseBoolean(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", HTTPS_CHECK_PROP_KEY,
                                                 HTTPS_CHECK_URL_KEY));

    skipSqlRewrite = Boolean.parseBoolean(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", SKIP_SQL_REWRITE_PROP_KEY,
                                                 SKIP_SQL_REWRITE_URL_KEY));

    skipSqlInjectCheck = Boolean.parseBoolean(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", SKIP_SQL_INJECT_CHECK_PROP_KEY,
                                                 SKIP_SQL_INJECT_CHECK_URL_KEY));

    retryTime = Integer.parseInt(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", RETRY_TIME_PROP_KEY, RETRY_TIME_URL_KEY)
    );

    logLevel = tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, LOG_LEVEL_PROP_KEY, LOG_LEVEL_URL_KEY);

    quotaName = tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, QUOTA_NAME_PROP_KEY, QUOTA_NAME_URL_KEY);
    verbose =
        Boolean.parseBoolean(
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", VERBOSE_PROP_KEY,
                                                     VERBOSE_PROP_KEY));
    async =
        Boolean.parseBoolean(
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, "async", ASYNC_PROP_KEY,
                                                     ASYNC_PROP_KEY));
    timeZone =
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, TIME_ZONE_URL_KEY,
                                                     TIME_ZONE_URL_KEY);

    fetchResultSplitSize =
            Long.parseLong(tryGetFirstNonNullValueByAltMapAndAltKey(maps, "10000", FETCH_RESULT_SPLIT_SIZE, FETCH_RESULT_SPLIT_SIZE));

    fetchResultPreloadSplitNum =
            Integer.parseInt(tryGetFirstNonNullValueByAltMapAndAltKey(maps, "5", FETCH_RESULT_PRELOAD_SPLIT_NUM, FETCH_RESULT_PRELOAD_SPLIT_NUM));

    fetchResultThreadNum = Integer.parseInt(tryGetFirstNonNullValueByAltMapAndAltKey(maps, "5", FETCH_RESULT_THREAD_NUM, FETCH_RESULT_THREAD_NUM));


    logviewVersion = Integer.parseInt(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "1", LOGVIEW_VERSION_PROP_KEY, LOGVIEW_VERSION_URL_KEY)
    );

    skipCheckIfSelect =
        Boolean.parseBoolean(
            tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", SKIP_CHECK_IF_SELECT,
                                                     SKIP_CHECK_IF_SELECT));

    longJobWarningThreshold = Long.parseLong(
        tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", LONG_JOB_WARNING_THRESHOLD, LONG_JOB_WARNING_THRESHOLD)
    );

    // odpsNamespaceSchema in url or prop |  odps.namespace.schema in settings | odpsNamespaceSchema field
    // key not exists                     |      not set                       | null
    // true/false                         |      true/false                    | true/false
    String odpsNamespaceSchemaStr = tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, null, ODPS_NAMESPACE_SCHEMA_PROP_KEY, ODPS_NAMESPACE_SCHEMA_URL_KEY);

    checkValueIsValidBoolean(ODPS_NAMESPACE_SCHEMA_URL_KEY, odpsNamespaceSchemaStr);

    // not set => use tenant flag in sql
    // set true/false => use set value as session flag
    if (odpsNamespaceSchemaStr != null) {
      odpsNamespaceSchema = Boolean.parseBoolean(odpsNamespaceSchemaStr);
      settings.put("odps.namespace.schema", odpsNamespaceSchemaStr);
    }

    schema = tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, null, SCHEMA_PROP_KEY, SCHEMA_URL_KEY);

    if (schema != null) {
      if (odpsNamespaceSchema == null) {
        odpsNamespaceSchema = true;
        settings.put("odps.namespace.schema", "true");
      } else if (odpsNamespaceSchema == false) {
        throw new RuntimeException("ERROR: connection config invalid: schema can not be set when odpsNamespaceSchema=false");
      }

      settings.put("odps.default.schema", schema);
    }
    // The option 'tableList' accepts table names in pattern:
    //   <project name>.<table name>(,<project name>.<table name>)*
    //
    // This option is used to accelerate table loading. For a project contains thousands of tables,
    // BI software such as Tableau may load all the tables when the software starts and it could
    // take several minutes before the user could really start using it. To avoid this situation,
    // users could specify the table names they are going to use and the driver will only load
    // these tables.
    String tablesStr = tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, null, TABLE_LIST_PROP_KEY, TABLE_LIST_URL_KEY);
    String[] reusedParts = new String[3];
    if (!StringUtils.isNullOrEmpty(tablesStr)) {
      for (String tableStr : tablesStr.split(",")) {
        String[] parts = tableStr.split("\\.");
        if (parts.length == 2) {
          reusedParts[0] = parts[0];
          reusedParts[1] = null;
          reusedParts[2] = parts[1];
        } else if (parts.length == 3) {
          reusedParts = parts;
        } else {
          throw new IllegalArgumentException("Invalid table name: " + tableStr);
        }
        tables.computeIfAbsent(reusedParts[0], p -> new HashMap<>());
        tables.get(reusedParts[0]).computeIfAbsent(reusedParts[1], p -> new LinkedList<>());
        tables.get(reusedParts[0]).get(reusedParts[1]).add(reusedParts[2]);
      }
    }

    String globalSettingsInJson = tryGetFirstNonNullValueByAltMapAndAltKey(
        maps, null, SETTINGS_URL_KEY, SETTINGS_PROP_KEY);
    if (globalSettingsInJson != null) {
      Type type = new TypeToken<Map<String, String>>() {
      }.getType();
      settings.putAll(GsonObjectBuilder.get().fromJson(globalSettingsInJson, type));
    }
  }