diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 5c5d5bc84..cdfc936a6 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -73,7 +73,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { String connectionClassName = this.toString(); private static final String DEFAULT_JDBC_TOKEN_VALUE = "Google-BigQuery-JDBC-Driver"; private static final String DEFAULT_VERSION = "0.0.0"; - private static HeaderProvider HEADER_PROVIDER; + private HeaderProvider headerProvider; BigQueryReadClient bigQueryReadClient = null; BigQueryWriteClient bigQueryWriteClient = null; BigQuery bigQuery; @@ -125,7 +125,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { int writeAPIActivationRowCount; int writeAPIAppendRowCount; int requestGoogleDriveScope; - List additionalProjects; + String additionalProjects; boolean filterTablesOnDefaultDataset; String sslTrustStorePath; String sslTrustStorePassword; @@ -134,6 +134,9 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { Integer httpConnectTimeout; Integer httpReadTimeout; String requestReason; + Long connectionPoolSize; + Long listenerPoolSize; + String partnerToken; BigQueryConnection(String url) throws IOException { this.connectionUrl = url; @@ -142,49 +145,31 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.sqlWarnings = new ArrayList<>(); this.transactionStarted = false; this.isClosed = false; - this.labels = BigQueryJdbcUrlUtility.parseLabels(url, connectionClassName); - this.maxBytesBilled = - BigQueryJdbcUrlUtility.parseMaximumBytesBilled(url, this.connectionClassName); - this.retryTimeoutInSeconds = - BigQueryJdbcUrlUtility.parseRetryTimeoutInSecs(url, this.connectionClassName); + DataSource ds = DataSource.fromUrl(url); + + this.labels = ds.getLabels() != null ? ds.getLabels() : new java.util.HashMap<>(); + this.maxBytesBilled = ds.getMaximumBytesBilled(); + this.retryTimeoutInSeconds = ds.getTimeout(); this.retryTimeoutDuration = Duration.ofMillis(retryTimeoutInSeconds * 1000L); - this.retryInitialDelayInSeconds = - BigQueryJdbcUrlUtility.parseRetryInitialDelayInSecs(url, this.connectionClassName); + this.retryInitialDelayInSeconds = ds.getRetryInitialDelay(); this.retryInitialDelayDuration = Duration.ofMillis(retryInitialDelayInSeconds * 1000L); - this.retryMaxDelayInSeconds = - BigQueryJdbcUrlUtility.parseRetryMaxDelayInSecs(url, this.connectionClassName); + this.retryMaxDelayInSeconds = ds.getRetryMaxDelay(); this.retryMaxDelayDuration = Duration.ofMillis(retryMaxDelayInSeconds * 1000L); - this.jobTimeoutInSeconds = - BigQueryJdbcUrlUtility.parseJobTimeout(url, this.connectionClassName); + this.jobTimeoutInSeconds = ds.getJobTimeout(); this.authProperties = - BigQueryJdbcOAuthUtility.parseOAuthProperties(url, this.connectionClassName); - this.catalog = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.PROJECT_ID_PROPERTY_NAME, - BigQueryOptions.getDefaultProjectId(), - this.connectionClassName); - this.universeDomain = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_UNIVERSE_DOMAIN_VALUE, - this.connectionClassName); - this.overrideProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(url, this.connectionClassName); - if (universeDomain != null) { + BigQueryJdbcOAuthUtility.parseOAuthProperties(ds, this.connectionClassName); + this.catalog = ds.getProjectId(); + this.universeDomain = ds.getUniverseDomain(); + + this.overrideProperties = ds.getOverrideProperties(); + if (this.universeDomain != null) { this.overrideProperties.put( - BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, universeDomain); + BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, this.universeDomain); } this.credentials = BigQueryJdbcOAuthUtility.getCredentials( authProperties, overrideProperties, this.connectionClassName); - String defaultDatasetString = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.DEFAULT_DATASET_PROPERTY_NAME, - null, - this.connectionClassName); + String defaultDatasetString = ds.getDefaultDataset(); if (defaultDatasetString == null || defaultDatasetString.trim().isEmpty()) { this.defaultDataset = null; } else { @@ -199,94 +184,27 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { + " projectId.datasetId"); } } - this.location = - BigQueryJdbcUrlUtility.parseStringProperty( - url, BigQueryJdbcUrlUtility.LOCATION_PROPERTY_NAME, null, this.connectionClassName); - this.enableHighThroughputAPI = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_ENABLE_HTAPI_VALUE, - this.connectionClassName); - this.highThroughputMinTableSize = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_HTAPI_MIN_TABLE_SIZE_VALUE, - this.connectionClassName); - this.highThroughputActivationRatio = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.HTAPI_ACTIVATION_RATIO_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_HTAPI_ACTIVATION_RATIO_VALUE, - this.connectionClassName); - this.useQueryCache = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_USE_QUERY_CACHE, - this.connectionClassName); - this.useStatelessQueryMode = - BigQueryJdbcUrlUtility.parseJobCreationMode(url, this.connectionClassName); - this.queryDialect = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_QUERY_DIALECT_VALUE, - this.connectionClassName); - this.allowLargeResults = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_ALLOW_LARGE_RESULTS, - this.connectionClassName); - this.destinationTable = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME, - null, - this.connectionClassName); - this.destinationDataset = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.LARGE_RESULTS_DATASET_PROPERTY_NAME, - null, - this.connectionClassName); - this.destinationDatasetExpirationTime = - BigQueryJdbcUrlUtility.parseLongProperty( - url, - BigQueryJdbcUrlUtility.DESTINATION_DATASET_EXPIRATION_TIME_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_DESTINATION_DATASET_EXPIRATION_TIME_VALUE, - this.connectionClassName); - this.kmsKeyName = - BigQueryJdbcUrlUtility.parseStringProperty( - url, BigQueryJdbcUrlUtility.KMS_KEY_NAME_PROPERTY_NAME, null, this.connectionClassName); + this.location = ds.getLocation(); + this.enableHighThroughputAPI = ds.getEnableHighThroughputAPI(); + this.highThroughputMinTableSize = ds.getHighThroughputMinTableSize(); + this.highThroughputActivationRatio = ds.getHighThroughputActivationRatio(); + this.useQueryCache = ds.getUseQueryCache(); + this.useStatelessQueryMode = ds.getUseStatelessQueryMode(); + + this.queryDialect = ds.getQueryDialect(); + this.allowLargeResults = ds.getAllowLargeResults(); + this.destinationTable = ds.getDestinationTable(); + this.destinationDataset = ds.getDestinationDataset(); + this.destinationDatasetExpirationTime = ds.getDestinationDatasetExpirationTime(); + this.kmsKeyName = ds.getKmsKeyName(); Map proxyProperties = - BigQueryJdbcProxyUtility.parseProxyProperties(url, this.connectionClassName); - this.sslTrustStorePath = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, - null, - this.connectionClassName); - this.sslTrustStorePassword = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PWD_PROPERTY_NAME, - null, - this.connectionClassName); - this.httpConnectTimeout = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME, - null, - this.connectionClassName); - this.httpReadTimeout = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME, - null, - this.connectionClassName); + BigQueryJdbcProxyUtility.parseProxyProperties(ds, this.connectionClassName); + + this.sslTrustStorePath = ds.getSSLTrustStorePath(); + this.sslTrustStorePassword = ds.getSSLTrustStorePassword(); + this.httpConnectTimeout = ds.getHttpConnectTimeout(); + this.httpReadTimeout = ds.getHttpReadTimeout(); + this.httpTransportOptions = BigQueryJdbcProxyUtility.getHttpTransportOptions( proxyProperties, @@ -301,77 +219,27 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.sslTrustStorePath, this.sslTrustStorePassword, this.connectionClassName); - this.enableSession = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_ENABLE_SESSION_VALUE, - this.connectionClassName); - this.unsupportedHTAPIFallback = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_UNSUPPORTED_HTAPI_FALLBACK_VALUE, - this.connectionClassName); - this.maxResults = - BigQueryJdbcUrlUtility.parseLongProperty( - url, - BigQueryJdbcUrlUtility.MAX_RESULTS_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_MAX_RESULTS_VALUE, - this.connectionClassName); - Map queryPropertiesMap = - BigQueryJdbcUrlUtility.parseQueryProperties(url, this.connectionClassName); + this.enableSession = ds.getEnableSession(); + this.unsupportedHTAPIFallback = ds.getUnsupportedHTAPIFallback(); + this.maxResults = ds.getMaxResults(); + Map queryPropertiesMap = ds.getQueryProperties(); this.sessionInfoConnectionProperty = getSessionPropertyFromQueryProperties(queryPropertiesMap); this.queryProperties = convertMapToConnectionPropertiesList(queryPropertiesMap); - this.enableWriteAPI = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_ENABLE_WRITE_API_VALUE, - this.connectionClassName); - this.writeAPIActivationRowCount = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.SWA_ACTIVATION_ROW_COUNT_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_SWA_ACTIVATION_ROW_COUNT_VALUE, - this.connectionClassName); - this.writeAPIAppendRowCount = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_SWA_APPEND_ROW_COUNT_VALUE, - this.connectionClassName); - this.additionalProjects = - BigQueryJdbcUrlUtility.parseStringListProperty( - url, - BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME, - this.connectionClassName); - this.filterTablesOnDefaultDataset = - BigQueryJdbcUrlUtility.parseBooleanProperty( - url, - BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_FILTER_TABLES_ON_DEFAULT_DATASET_VALUE, - this.connectionClassName); - this.requestGoogleDriveScope = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE, - this.connectionClassName); - this.metadataFetchThreadCount = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE, - this.connectionClassName); - this.requestReason = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME, - null, - this.connectionClassName); + this.enableWriteAPI = ds.getEnableWriteAPI(); + this.writeAPIActivationRowCount = ds.getSwaActivationRowCount(); + this.writeAPIAppendRowCount = ds.getSwaAppendRowCount(); - HEADER_PROVIDER = createHeaderProvider(); + this.additionalProjects = ds.getAdditionalProjects(); + + this.filterTablesOnDefaultDataset = ds.getFilterTablesOnDefaultDataset(); + this.requestGoogleDriveScope = ds.getRequestGoogleDriveScope(); + this.metadataFetchThreadCount = ds.getMetadataFetchThreadCount(); + this.requestReason = ds.getRequestReason(); + this.connectionPoolSize = ds.getConnectionPoolSize(); + this.listenerPoolSize = ds.getListenerPoolSize(); + this.partnerToken = ds.getPartnerToken(); + + this.headerProvider = createHeaderProvider(); this.bigQuery = getBigQueryConnection(); } @@ -393,19 +261,11 @@ String getLibraryVersion(Class libraryClass) { return version != null ? version : DEFAULT_VERSION; } - private String buildPartnerToken(String url) { - String partnerTokenString = - BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, this.connectionClassName); - if (partnerTokenString == null || partnerTokenString.isEmpty()) { - return ""; - } - return partnerTokenString; - } - HeaderProvider createHeaderProvider() { - String partnerToken = buildPartnerToken(this.connectionUrl); - String headerToken = - DEFAULT_JDBC_TOKEN_VALUE + "/" + getLibraryVersion(this.getClass()) + partnerToken; + String headerToken = DEFAULT_JDBC_TOKEN_VALUE + "/" + getLibraryVersion(this.getClass()); + if (this.partnerToken != null && !this.partnerToken.isEmpty()) { + headerToken += this.partnerToken; + } Map headers = new java.util.HashMap<>(); headers.put("user-agent", headerToken); if (this.requestReason != null) { @@ -712,7 +572,7 @@ int getHighThroughputMinTableSize() { return highThroughputMinTableSize; } - List getAdditionalProjects() { + String getAdditionalProjects() { return this.additionalProjects; } @@ -760,6 +620,14 @@ Integer getHttpReadTimeout() { return httpReadTimeout; } + Long getConnectionPoolSize() { + return connectionPoolSize; + } + + Long getListenerPoolSize() { + return listenerPoolSize; + } + @Override public boolean isValid(int timeout) throws SQLException { if (timeout < 0) { @@ -1063,14 +931,14 @@ private BigQuery getBigQueryConnection() { bigQueryOptions.setTransportOptions(this.httpTransportOptions); } - BigQueryOptions options = bigQueryOptions.setHeaderProvider(HEADER_PROVIDER).build(); + BigQueryOptions options = bigQueryOptions.setHeaderProvider(this.headerProvider).build(); options.setQueryPreviewEnabled(String.valueOf(this.useStatelessQueryMode)); return options.getService(); } private BigQueryReadClient getBigQueryReadClientConnection() throws IOException { BigQueryReadSettings.Builder bigQueryReadSettings = - BigQueryReadSettings.newBuilder().setHeaderProvider(HEADER_PROVIDER); + BigQueryReadSettings.newBuilder().setHeaderProvider(this.headerProvider); if (getRetrySettings() != null) { bigQueryReadSettings.createReadSessionSettings().setRetrySettings(getRetrySettings()); } @@ -1112,7 +980,7 @@ private BigQueryReadClient getBigQueryReadClientConnection() throws IOException private BigQueryWriteClient getBigQueryWriteClientConnection() throws IOException { BigQueryWriteSettings.Builder bigQueryWriteSettings = - BigQueryWriteSettings.newBuilder().setHeaderProvider(HEADER_PROVIDER); + BigQueryWriteSettings.newBuilder().setHeaderProvider(this.headerProvider); if (getRetrySettings() != null) { bigQueryWriteSettings.createWriteStreamSettings().setRetrySettings(getRetrySettings()); } diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java index 75c455907..feca69ea1 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java @@ -5208,8 +5208,13 @@ private List getAccessibleCatalogNames() { accessibleCatalogs.add(primaryCatalog); } - List additionalProjects = this.connection.getAdditionalProjects(); - if (additionalProjects != null) { + String additionalProjectsStr = this.connection.getAdditionalProjects(); + if (additionalProjectsStr != null && !additionalProjectsStr.trim().isEmpty()) { + List additionalProjects = + com.google.common.base.Splitter.on(',') + .trimResults() + .omitEmptyStrings() + .splitToList(additionalProjectsStr); for (String project : additionalProjects) { if (project != null && !project.isEmpty()) { accessibleCatalogs.add(project); diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java index 68b00cb6c..d9af8b286 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java @@ -130,19 +130,17 @@ public Connection connect(String url, Properties info) throws SQLException { throw new BigQueryJdbcException(e.getMessage(), e); } + DataSource ds = DataSource.fromUrl(connectionUri); + // LogLevel - String logLevelStr = - BigQueryJdbcUrlUtility.parseUriProperty( - connectionUri, BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME); + String logLevelStr = ds.getLogLevel(); if (logLevelStr == null) { logLevelStr = System.getenv(BigQueryJdbcUrlUtility.LOG_LEVEL_ENV_VAR); } Level logLevel = BigQueryJdbcUrlUtility.parseLogLevel(logLevelStr); // LogPath - String logPath = - BigQueryJdbcUrlUtility.parseUriProperty( - connectionUri, BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME); + String logPath = ds.getLogPath(); if (logPath == null) { logPath = System.getenv(BigQueryJdbcUrlUtility.LOG_PATH_ENV_VAR); } @@ -217,7 +215,7 @@ public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) { propertyInfoList.add(driverProperty); } Map oAuthProperties = - BigQueryJdbcOAuthUtility.parseOAuthProperties(url, this.toString()); + BigQueryJdbcOAuthUtility.parseOAuthProperties(DataSource.fromUrl(url), this.toString()); for (Map.Entry authProperty : oAuthProperties.entrySet()) { propertyInfoList.add(new DriverPropertyInfo(authProperty.getKey(), authProperty.getValue())); } diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java index dcf31a7ff..21ecef95d 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java @@ -106,18 +106,16 @@ final class BigQueryJdbcOAuthUtility { * @return A map of OAuth properties. */ static Map parseOAuthProperties(String url, String callerClassName) { + return parseOAuthProperties(DataSource.fromUrl(url), callerClassName); + } + + static Map parseOAuthProperties(DataSource ds, String callerClassName) { LOG.finest("++enter++\t" + callerClassName); Map oauthProperties = new HashMap<>(); AuthType authType; try { - authType = - AuthType.fromValue( - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_OAUTH_TYPE_VALUE, - callerClassName)); + authType = AuthType.fromValue(ds.getOAuthType()); } catch (NumberFormatException exception) { throw new IllegalArgumentException(OAUTH_TYPE_ERROR_MESSAGE); } @@ -128,21 +126,10 @@ static Map parseOAuthProperties(String url, String callerClassNa // need: project id, OAuthServiceAcctEmail and OAuthPvtKey or OAuthPvtKeyPath that can be // .p12 or json. // TODO: validation if .p12 or json file can be in getPropertyInfo can be handy for user - String serviceAccountEmail = - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME); - String serviceAccountPK = - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME); - String serviceAccountPrivateKeyPath = - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME); - String p12Password = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.OAUTH_P12_PASSWORD_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_OAUTH_P12_PASSWORD_VALUE, - callerClassName); + String serviceAccountEmail = ds.getOAuthServiceAcctEmail(); + String serviceAccountPK = ds.getOAuthPvtKey(); + String serviceAccountPrivateKeyPath = ds.getOAuthPvtKeyPath(); + String p12Password = ds.getOAuthP12Password(); oauthProperties.put( BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME, serviceAccountEmail); @@ -157,48 +144,31 @@ static Map parseOAuthProperties(String url, String callerClassNa break; case GOOGLE_USER_ACCOUNT: oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME)); + BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, ds.getOAuthClientId()); oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME)); - int reqGoogleDriveScope = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE, - callerClassName); + BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, ds.getOAuthClientSecret()); + int reqGoogleDriveScope = ds.getRequestGoogleDriveScope(); oauthProperties.put( BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, String.valueOf(reqGoogleDriveScope)); LOG.fine("RequestGoogleDriveScope parsed."); break; case PRE_GENERATED_TOKEN: - String refreshToken = - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME); + String refreshToken = ds.getOAuthRefreshToken(); if (refreshToken != null) { oauthProperties.put( BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME, refreshToken); LOG.fine("OAuthRefreshToken provided."); oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME)); + BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, ds.getOAuthClientId()); LOG.fine("OAuthClientId provided."); oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME)); + BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, ds.getOAuthClientSecret()); LOG.fine("OAuthClientSecret provided."); break; } oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME)); + BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME, ds.getOAuthAccessToken()); LOG.fine("OAuthAccessToken provided."); break; case APPLICATION_DEFAULT_CREDENTIALS: @@ -208,38 +178,46 @@ static Map parseOAuthProperties(String url, String callerClassNa case EXTERNAL_ACCOUNT_AUTH: // For External account authentication (OAuth Type 4) // need: project id, OAuthPvtKey or OAuthPvtKeyPath or BYOID_PROPERTIES - String pvtKey = - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME); - String pvtKeyPath = - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME); + String pvtKey = ds.getOAuthPvtKey(); + String pvtKeyPath = ds.getOAuthPvtKeyPath(); if (pvtKey != null) { - oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME)); + oauthProperties.put(BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME, pvtKey); LOG.fine("OAuthPvtKey provided."); } else if (pvtKeyPath != null) { - oauthProperties.put( - BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseUriProperty( - url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME)); + oauthProperties.put(BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME, pvtKeyPath); LOG.fine("OAuthPvtKeyPath provided."); } else { - for (String property : BigQueryJdbcUrlUtility.BYOID_PROPERTIES) { - String value = - BigQueryJdbcUrlUtility.parseBYOIDProperty(url, property, callerClassName); - if (value != null) { - oauthProperties.put(property, value); - LOG.fine(property + " provided."); - } - } - String universeDomainProp = BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME; - String universeDomain = BigQueryJdbcUrlUtility.parseUriProperty(url, universeDomainProp); + if (ds.getByoidAudienceUri() != null) + oauthProperties.put( + BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME, ds.getByoidAudienceUri()); + if (ds.getByoidCredentialSource() != null) + oauthProperties.put( + BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME, + ds.getByoidCredentialSource()); + if (ds.getByoidPoolUserProject() != null) + oauthProperties.put( + BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME, + ds.getByoidPoolUserProject()); + if (ds.getByoidSAImpersonationUri() != null) + oauthProperties.put( + BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME, + ds.getByoidSAImpersonationUri()); + if (ds.getByoidSubjectTokenType() != null) + oauthProperties.put( + BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME, + ds.getByoidSubjectTokenType()); + if (ds.getByoidTokenUri() != null) + oauthProperties.put( + BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME, ds.getByoidTokenUri()); + + String universeDomain = ds.getUniverseDomain(); if (universeDomain != null) { - oauthProperties.put(universeDomainProp, universeDomain); - LOG.fine(universeDomainProp + " provided. Caller : " + callerClassName); + oauthProperties.put( + BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, universeDomain); + LOG.fine( + BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME + + " provided. Caller : " + + callerClassName); } } break; @@ -250,32 +228,20 @@ static Map parseOAuthProperties(String url, String callerClassNa || authType == AuthType.PRE_GENERATED_TOKEN) { oauthProperties.put( BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_EMAIL_VALUE, - callerClassName)); + ds.getOAuthSAImpersonationEmail()); oauthProperties.put( BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_CHAIN_VALUE, - callerClassName)); + ds.getOAuthSAImpersonationChain()); oauthProperties.put( BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_SCOPES_VALUE, - callerClassName)); + ds.getOAuthSAImpersonationScopes() != null + ? ds.getOAuthSAImpersonationScopes() + : BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_SCOPES_VALUE); oauthProperties.put( BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME, - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_VALUE, - callerClassName)); + ds.getOAuthSAImpersonationTokenLifetime() != null + ? ds.getOAuthSAImpersonationTokenLifetime() + : BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_VALUE); } return oauthProperties; } @@ -429,7 +395,8 @@ static UserAuthorizer getUserAuthorizer( } } catch (NumberFormatException e) { LOG.severe( - "Invalid value for RequestGoogleDriveScope, defaulting to not request Drive scope. Caller: " + "Invalid value for RequestGoogleDriveScope, defaulting to not request Drive scope." + + " Caller: " + callerClassName); } } diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java index b630505f2..52eef2739 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java @@ -61,34 +61,27 @@ final class BigQueryJdbcProxyUtility { private BigQueryJdbcProxyUtility() {} - static Map parseProxyProperties(String URL, String callerClassName) { + static Map parseProxyProperties(DataSource ds, String callerClassName) { LOG.finest("++enter++\t" + callerClassName); Map proxyProperties = new HashMap<>(); - String proxyHost = - BigQueryJdbcUrlUtility.parseUriProperty( - URL, BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME); + String proxyHost = ds.getProxyHost(); if (proxyHost != null) { proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME, proxyHost); } - String proxyPort = - BigQueryJdbcUrlUtility.parseUriProperty( - URL, BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME); + String proxyPort = ds.getProxyPort(); if (proxyPort != null) { if (!Pattern.compile(validPortRegex).matcher(proxyPort).find()) { throw new IllegalArgumentException( - "Illegal port number provided %s. Please provide a valid port number."); + String.format( + "Illegal port number provided %s. Please provide a valid port number.", proxyPort)); } proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME, proxyPort); } - String proxyUid = - BigQueryJdbcUrlUtility.parseUriProperty( - URL, BigQueryJdbcUrlUtility.PROXY_USER_ID_PROPERTY_NAME); + String proxyUid = ds.getProxyUid(); if (proxyUid != null) { proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_USER_ID_PROPERTY_NAME, proxyUid); } - String proxyPwd = - BigQueryJdbcUrlUtility.parseUriProperty( - URL, BigQueryJdbcUrlUtility.PROXY_PASSWORD_PROPERTY_NAME); + String proxyPwd = ds.getProxyPwd(); if (proxyPwd != null) { proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_PASSWORD_PROPERTY_NAME, proxyPwd); } @@ -114,6 +107,10 @@ static Map parseProxyProperties(String URL, String callerClassNa return proxyProperties; } + static Map parseProxyProperties(String URL, String callerClassName) { + return parseProxyProperties(DataSource.fromUrl(URL), callerClassName); + } + static HttpTransportOptions getHttpTransportOptions( Map proxyProperties, String sslTrustStorePath, diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 5ffa6c254..4dff1fcb2 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -19,11 +19,9 @@ import com.google.api.client.util.escape.CharEscapers; import com.google.cloud.bigquery.BigQueryOptions; import com.google.cloud.bigquery.exception.BigQueryJdbcRuntimeException; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.net.UrlEscapers; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -37,7 +35,6 @@ import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; /** * This class implements all the methods that parse Connection property values from the Connection @@ -134,7 +131,10 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final String BYOID_POOL_USER_PROJECT_PROPERTY_NAME = "BYOID_PoolUserProject"; static final String BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME = "BYOID_SA_Impersonation_Uri"; static final String BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME = "BYOID_SubjectTokenType"; + static final String DEFAULT_BYOID_SUBJECT_TOKEN_TYPE_VALUE = + "urn:ietf:params:oauth:tokentype:id_token"; static final String BYOID_TOKEN_URI_PROPERTY_NAME = "BYOID_TokenUri"; + static final String DEFAULT_BYOID_TOKEN_URI_VALUE = "https://sts.googleapis.com/v1/token"; static final String PARTNER_TOKEN_PROPERTY_NAME = "PartnerToken"; private static final Pattern PARTNER_TOKEN_PATTERN = Pattern.compile( @@ -513,7 +513,7 @@ protected boolean removeEldestEntry(Map.Entry> eldes + " Corresponds\n" + " to the subject_token_type property in the external account" + " configuration file.") - .setDefaultValue("urn:ietf:params:oauth:tokentype:id_token") + .setDefaultValue(DEFAULT_BYOID_SUBJECT_TOKEN_TYPE_VALUE) .build(), BigQueryConnectionProperty.newBuilder() .setName(BYOID_TOKEN_URI_PROPERTY_NAME) @@ -523,7 +523,7 @@ protected boolean removeEldestEntry(Map.Entry> eldes + " tokens. Corresponds to the token_url property in the external" + " account\n" + " configuration file.") - .setDefaultValue("https://sts.googleapis.com/v1/token") + .setDefaultValue(DEFAULT_BYOID_TOKEN_URI_VALUE) .build(), BigQueryConnectionProperty.newBuilder() .setName(PARTNER_TOKEN_PROPERTY_NAME) @@ -771,96 +771,6 @@ static boolean convertIntToBoolean(String value, String propertyName) { } } - // todo just make it a map - static Map parseQueryProperties(String url, String callerClassName) { - return parsePropertiesMap(url, QUERY_PROPERTIES_NAME, callerClassName); - } - - static Map parseLabels(String url, String callerClassName) { - return parsePropertiesMap(url, LABELS_PROPERTY_NAME, callerClassName); - } - - static String parseStringProperty( - String url, String propertyName, String defaultValue, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - String parsedValue = BigQueryJdbcUrlUtility.parseUriProperty(url, propertyName); - if (parsedValue != null) { - return parsedValue; - } - return defaultValue; - } - - static List parseStringListProperty( - String url, String propertyName, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - String rawValue = parseStringProperty(url, propertyName, null, callerClassName); - if (rawValue == null || rawValue.trim().isEmpty()) { - return Collections.emptyList(); - } - return Arrays.stream(rawValue.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .collect(Collectors.toList()); - } - - public static String parsePartnerTokenProperty(String url, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - // This property is expected to be set by partners only. For more details on exact format - // supported, refer b/396086960 - Matcher matcher = PARTNER_TOKEN_PATTERN.matcher(url); - if (matcher.find()) { - String rawToken = matcher.group(1).trim(); - String token = - (rawToken.startsWith("(") && rawToken.endsWith(")")) - ? rawToken.substring(1, rawToken.length() - 1).trim() - : rawToken; - - if (token.toUpperCase().startsWith("GPN:")) { - return " (" + token + ")"; - } - } - return null; - } - - static Integer parseIntProperty( - String url, String propertyName, Integer defaultValue, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - String parsedValue = BigQueryJdbcUrlUtility.parseUriProperty(url, propertyName); - if (parsedValue != null) { - try { - return Integer.parseInt(parsedValue); - } catch (NumberFormatException e) { - LOG.severe( - "Invalid integer value '%s' for property '%s'. Please provide a valid integer.", - parsedValue, propertyName); - throw new IllegalArgumentException( - String.format("Invalid integer value for property '%s': %s", propertyName, parsedValue), - e); - } - } - return defaultValue; - } - - static Long parseLongProperty( - String url, String propertyName, Long defaultValue, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - String parsedValue = BigQueryJdbcUrlUtility.parseUriProperty(url, propertyName); - if (parsedValue != null) { - return Long.parseLong(parsedValue); - } - return defaultValue; - } - - static Boolean parseBooleanProperty( - String url, String propertyName, Boolean defaultValue, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - String parsedValue = BigQueryJdbcUrlUtility.parseUriProperty(url, propertyName); - if (parsedValue != null) { - return convertIntToBoolean(parsedValue, propertyName); - } - return defaultValue; - } - public static Level parseLogLevel(String logLevelString) { int logLevel = logLevelString != null ? Integer.parseInt(logLevelString) : DEFAULT_LOG_LEVEL; switch (logLevel) { @@ -887,156 +797,21 @@ public static Level parseLogLevel(String logLevelString) { } } - static Map parseOverrideProperties(String url, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - Map overrideProps = new HashMap<>(); - Pattern pattern = - Pattern.compile( - String.format( - "(?is)(%s|%s)=([^;]+)", - ENDPOINT_OVERRIDES_PROPERTY_NAME, PRIVATE_SERVICE_CONNECT_PROPERTY_NAME)); - Matcher matcher = pattern.matcher(url); - String overridePropertiesString; - if (matcher.find() && matcher.groupCount() >= 1) { - try { - overridePropertiesString = - URLDecoder.decode(matcher.group(2), StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - throw new BigQueryJdbcRuntimeException(e); - } - } else { - return overrideProps; - } - for (String property : OVERRIDE_PROPERTIES) { - Pattern propertyPattern = Pattern.compile(String.format("(?i)%s=(.*?)(?:[,;]|$)", property)); - Matcher propertyMatcher = propertyPattern.matcher(overridePropertiesString); - if (propertyMatcher.find() && propertyMatcher.groupCount() >= 1) { - overrideProps.put(property, propertyMatcher.group(1)); - } - } - return overrideProps; - } - - public static boolean parseJobCreationMode(String url, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - - String jobCreationMode = - BigQueryJdbcUrlUtility.parseUriProperty(url, JOB_CREATION_MODE_PROPERTY_NAME); - - if (jobCreationMode == null) { - LOG.fine( - "%s value not provided, defaulting to %s. Caller: %s", - JOB_CREATION_MODE_PROPERTY_NAME, DEFAULT_JOB_CREATION_MODE, callerClassName); - // Default Job creation mode is JOB_CREATION_OPTIONAL(2) - // which translates to options.setQueryPreviewEnabled(true) - return true; - } - if (jobCreationMode.equalsIgnoreCase("1")) { - return false; - } else if (jobCreationMode.equalsIgnoreCase("2")) { - return true; - } else { - throw new NumberFormatException( - String.format( - "Invalid value for %s. Use 1 for JOB_CREATION_REQUIRED and 2 for" - + " JOB_CREATION_OPTIONAL.", - JOB_CREATION_MODE_PROPERTY_NAME)); - } - } - - public static String parseBYOIDProperty(String url, String property, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - - String value = BigQueryJdbcUrlUtility.parseUriProperty(url, property); - String defaultValue = BigQueryJdbcUrlUtility.getConnectionPropertyDefaultValue(property); - if (value != null) { - return value; - } else if (defaultValue != null) { - return defaultValue; - } - return null; - } - - public static String getConnectionPropertyDefaultValue(String propertyName) { - // TODO: change how we store properties because this method has to go through all of them - for (BigQueryConnectionProperty property : VALID_PROPERTIES) { - if (property.getName().equals(propertyName)) { - return property.getDefaultValue(); - } - } - return null; - } - - public static long parseRetryTimeoutInSecs(String url, String callerClassName) { - return BigQueryJdbcUrlUtility.parseLongProperty( - url, - RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME, - DEFAULT_RETRY_TIMEOUT_IN_SECS_VALUE, - callerClassName); - } - - public static long parseJobTimeout(String url, String callerClassName) { - return parseLongProperty( - url, JOB_TIMEOUT_PROPERTY_NAME, DEFAULT_JOB_TIMEOUT_VALUE, callerClassName); - } - - public static long parseRetryInitialDelayInSecs(String url, String callerClassName) { - return BigQueryJdbcUrlUtility.parseLongProperty( - url, RETRY_INITIAL_DELAY_PROPERTY_NAME, DEFAULT_RETRY_INITIAL_DELAY_VALUE, callerClassName); - } - - public static long parseRetryMaxDelayInSecs(String url, String callerClassName) { - return BigQueryJdbcUrlUtility.parseLongProperty( - url, RETRY_MAX_DELAY_PROPERTY_NAME, DEFAULT_RETRY_MAX_DELAY_VALUE, callerClassName); - } - - // Convenience Helper Methods - public static long parseConnectionPoolSize(String url, String callerClassName) { - if (url == null || url.isEmpty()) { - throw new BigQueryJdbcRuntimeException("Connection url is empty"); - } - return parseLongProperty( - url, - CONNECTION_POOL_SIZE_PROPERTY_NAME, - DEFAULT_CONNECTION_POOL_SIZE_VALUE, - callerClassName); - } - - public static long parseListenerPoolSize(String url, String callerClassName) { - if (url == null || url.isEmpty()) { - throw new BigQueryJdbcRuntimeException("Connection url is empty"); - } - return parseLongProperty( - url, LISTENER_POOL_SIZE_PROPERTY_NAME, DEFAULT_LISTENER_POOL_SIZE_VALUE, callerClassName); - } - - public static long parseMaximumBytesBilled(String url, String callerClassName) { - if (url == null || url.isEmpty()) { - throw new BigQueryJdbcRuntimeException("Connection url is empty"); - } - return parseLongProperty( - url, MAX_BYTES_BILLED_PROPERTY_NAME, DEFAULT_MAX_BYTES_BILLED_VALUE, callerClassName); - } - - private static Map parsePropertiesMap( - String url, String propertyName, String callerClassName) { - LOG.finest("++enter++\t" + callerClassName); - String propertiesString = BigQueryJdbcUrlUtility.parseUriProperty(url, propertyName); + static Map parsePropertiesMapFromValue( + String propertiesString, String propertyName, String context) { if (propertiesString == null || propertiesString.isEmpty()) { - LOG.fine("Unable to parse property name: %s from url: %s", propertyName, url); + LOG.fine("Unable to parse property name: %s from context: %s", propertyName, context); return null; } Map propertiesMap = new HashMap<>(); - String[] keyValuePairs = propertiesString.split(","); - - for (String keyValuePair : keyValuePairs) { - String[] parts = keyValuePair.split("="); - if (parts.length == 2) { - propertiesMap.put(parts[0], parts[1]); + for (String keyValuePair : Splitter.on(",").split(propertiesString)) { + List parts = Splitter.on("=").limit(2).splitToList(keyValuePair); + if (parts.size() == 2) { + propertiesMap.put(parts.get(0), parts.get(1)); } else { LOG.warning( - "Invalid KeyValue pair: %s found in url: %s for property name: %s", - keyValuePair, url, propertyName); + "Invalid KeyValue pair: %s found in context: %s for property name: %s", + keyValuePair, context, propertyName); } } return propertiesMap; diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java index 0bc012954..8504c0ba0 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java @@ -39,10 +39,8 @@ class BigQueryPooledConnection implements PooledConnection { BigQueryPooledConnection(Connection bqConnection) { this.bqConnection = bqConnection; this.id = UUID.randomUUID().toString(); - String connectionUrl = ((BigQueryConnection) bqConnection).getConnectionUrl(); - if (connectionUrl != null && !connectionUrl.isEmpty()) { - this.listenerPoolSize = - BigQueryJdbcUrlUtility.parseListenerPoolSize(connectionUrl, this.toString()); + if (bqConnection instanceof BigQueryConnection) { + this.listenerPoolSize = ((BigQueryConnection) bqConnection).getListenerPoolSize(); } if (getListenerPoolSize() > 0L) { listeners = new LinkedBlockingDeque<>(getListenerPoolSize().intValue()); diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 6f4c9c5f6..b46edbf25 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -25,7 +25,10 @@ import java.sql.SQLException; import java.util.Map; import java.util.Properties; +import java.util.function.BiConsumer; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * BigQuery JDBC implementation of {@link javax.sql.DataSource} @@ -91,6 +94,22 @@ public class DataSource implements javax.sql.DataSource { private Long maximumBytesBilled; private Integer swaActivationRowCount; private Integer swaAppendRowCount; + private String oAuthP12Password; + private String oAuthSAImpersonationEmail; + private String oAuthSAImpersonationChain; + private String oAuthSAImpersonationScopes; + private String oAuthSAImpersonationTokenLifetime; + private String oAuth2TokenUri; + private String byoidAudienceUri; + private String byoidCredentialSource; + private String byoidPoolUserProject; + private String byoidSAImpersonationUri; + private String byoidSubjectTokenType; + private String byoidTokenUri; + private String endpointOverrides; + private String privateServiceConnect; + private Long connectionPoolSize; + private Long listenerPoolSize; // Make sure the JDBC driver class is loaded. static { @@ -102,6 +121,244 @@ public class DataSource implements javax.sql.DataSource { } } + private static final Map> PROPERTY_SETTERS = + ImmutableMap.>builder() + .put(BigQueryJdbcUrlUtility.PROJECT_ID_PROPERTY_NAME, DataSource::setProjectId) + .put(BigQueryJdbcUrlUtility.DEFAULT_DATASET_PROPERTY_NAME, DataSource::setDefaultDataset) + .put(BigQueryJdbcUrlUtility.LOCATION_PROPERTY_NAME, DataSource::setLocation) + .put( + BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME, + (ds, val) -> + ds.setEnableHighThroughputAPI( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME, + (ds, val) -> + ds.setUnsupportedHTAPIFallback( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME, + (ds, val) -> ds.setHighThroughputMinTableSize(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.HTAPI_ACTIVATION_RATIO_PROPERTY_NAME, + (ds, val) -> ds.setHighThroughputActivationRatio(Integer.parseInt(val))) + .put(BigQueryJdbcUrlUtility.KMS_KEY_NAME_PROPERTY_NAME, DataSource::setKmsKeyName) + .put( + BigQueryJdbcUrlUtility.QUERY_PROPERTIES_NAME, + (ds, val) -> + ds.setQueryProperties( + BigQueryJdbcUrlUtility.parsePropertiesMapFromValue( + val, BigQueryJdbcUrlUtility.QUERY_PROPERTIES_NAME, "DataSource"))) + .put( + BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME, + (ds, val) -> + ds.setEnableSession( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME))) + .put(BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME, DataSource::setLogLevel) + .put(BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME, DataSource::setLogPath) + .put( + BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME, + (ds, val) -> ds.setOAuthType(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME, + DataSource::setOAuthServiceAcctEmail) + .put( + BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME, + DataSource::setOAuthPvtKeyPath) + .put(BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME, DataSource::setOAuthPvtKey) + .put( + BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME, + DataSource::setOAuthAccessToken) + .put( + BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME, + DataSource::setOAuthRefreshToken) + .put( + BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME, + (ds, val) -> + ds.setUseQueryCache( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME))) + .put(BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME, DataSource::setQueryDialect) + .put( + BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME, + (ds, val) -> + ds.setAllowLargeResults( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME, + DataSource::setDestinationTable) + .put( + BigQueryJdbcUrlUtility.LARGE_RESULTS_DATASET_PROPERTY_NAME, + DataSource::setDestinationDataset) + .put( + BigQueryJdbcUrlUtility.DESTINATION_DATASET_EXPIRATION_TIME_PROPERTY_NAME, + (ds, val) -> ds.setDestinationDatasetExpirationTime(Long.parseLong(val))) + .put( + BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, + DataSource::setUniverseDomain) + .put(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME, DataSource::setProxyHost) + .put(BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME, DataSource::setProxyPort) + .put(BigQueryJdbcUrlUtility.PROXY_USER_ID_PROPERTY_NAME, DataSource::setProxyUid) + .put(BigQueryJdbcUrlUtility.PROXY_PASSWORD_PROPERTY_NAME, DataSource::setProxyPwd) + .put(BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, DataSource::setOAuthClientId) + .put( + BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, + DataSource::setOAuthClientSecret) + .put( + BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME, + (ds, val) -> ds.setJobCreationMode(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.MAX_RESULTS_PROPERTY_NAME, + (ds, val) -> ds.setMaxResults(Long.parseLong(val))) + .put(BigQueryJdbcUrlUtility.PARTNER_TOKEN_PROPERTY_NAME, DataSource::setPartnerToken) + .put( + BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME, + (ds, val) -> + ds.setEnableWriteAPI( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME, + DataSource::setAdditionalProjects) + .put( + BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME, + (ds, val) -> + ds.setFilterTablesOnDefaultDataset( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, + BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, + (ds, val) -> ds.setRequestGoogleDriveScope(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, + (ds, val) -> ds.setMetadataFetchThreadCount(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, + DataSource::setSSLTrustStorePath) + .put( + BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PWD_PROPERTY_NAME, + DataSource::setSSLTrustStorePassword) + .put( + BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME, + (ds, val) -> + ds.setLabels( + BigQueryJdbcUrlUtility.parsePropertiesMapFromValue( + val, BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME, "DataSource"))) + .put(BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME, DataSource::setRequestReason) + .put( + BigQueryJdbcUrlUtility.RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME, + (ds, val) -> ds.setTimeout(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.JOB_TIMEOUT_PROPERTY_NAME, + (ds, val) -> ds.setJobTimeout(Integer.valueOf(val))) + .put( + BigQueryJdbcUrlUtility.RETRY_INITIAL_DELAY_PROPERTY_NAME, + (ds, val) -> ds.setRetryInitialDelay(Integer.valueOf(val))) + .put( + BigQueryJdbcUrlUtility.RETRY_MAX_DELAY_PROPERTY_NAME, + (ds, val) -> ds.setRetryMaxDelay(Integer.valueOf(val))) + .put( + BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME, + (ds, val) -> ds.setHttpConnectTimeout(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME, + (ds, val) -> ds.setHttpReadTimeout(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.OAUTH_P12_PASSWORD_PROPERTY_NAME, + DataSource::setOAuthP12Password) + .put( + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME, + DataSource::setOAuthSAImpersonationEmail) + .put( + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME, + DataSource::setOAuthSAImpersonationChain) + .put( + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME, + DataSource::setOAuthSAImpersonationScopes) + .put( + BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME, + DataSource::setOAuthSAImpersonationTokenLifetime) + .put(BigQueryJdbcUrlUtility.OAUTH2_TOKEN_URI_PROPERTY_NAME, DataSource::setOAuth2TokenUri) + .put( + BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME, + DataSource::setByoidAudienceUri) + .put( + BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME, + DataSource::setByoidCredentialSource) + .put( + BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME, + DataSource::setByoidPoolUserProject) + .put( + BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME, + DataSource::setByoidSAImpersonationUri) + .put( + BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME, + DataSource::setByoidSubjectTokenType) + .put(BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME, DataSource::setByoidTokenUri) + .put( + BigQueryJdbcUrlUtility.ENDPOINT_OVERRIDES_PROPERTY_NAME, + DataSource::setEndpointOverrides) + .put( + BigQueryJdbcUrlUtility.PRIVATE_SERVICE_CONNECT_PROPERTY_NAME, + DataSource::setPrivateServiceConnect) + .put( + BigQueryJdbcUrlUtility.MAX_BYTES_BILLED_PROPERTY_NAME, + (ds, val) -> ds.setMaximumBytesBilled(Long.parseLong(val))) + .put( + BigQueryJdbcUrlUtility.SWA_ACTIVATION_ROW_COUNT_PROPERTY_NAME, + (ds, val) -> ds.setSwaActivationRowCount(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME, + (ds, val) -> ds.setSwaAppendRowCount(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.CONNECTION_POOL_SIZE_PROPERTY_NAME, + (ds, val) -> ds.setConnectionPoolSize(Long.parseLong(val))) + .put( + BigQueryJdbcUrlUtility.LISTENER_POOL_SIZE_PROPERTY_NAME, + (ds, val) -> ds.setListenerPoolSize(Long.parseLong(val))) + .build(); + + public static DataSource fromUrl(String url) { + DataSource dataSource = new DataSource(); + dataSource.setURL(url); + Map properties = BigQueryJdbcUrlUtility.parseUrl(url); + for (Map.Entry entry : properties.entrySet()) { + BiConsumer setter = PROPERTY_SETTERS.get(entry.getKey()); + if (setter != null) { + setter.accept(dataSource, entry.getValue()); + } + } + return dataSource; + } + + public Map getOverrideProperties() { + String overridePropertiesString = null; + if (endpointOverrides != null && !endpointOverrides.isEmpty()) { + overridePropertiesString = endpointOverrides; + } else if (privateServiceConnect != null && !privateServiceConnect.isEmpty()) { + overridePropertiesString = privateServiceConnect; + } + + Map overrideProps = new java.util.HashMap<>(); + if (overridePropertiesString == null || overridePropertiesString.isEmpty()) { + return overrideProps; + } + + for (String property : BigQueryJdbcUrlUtility.OVERRIDE_PROPERTIES) { + Pattern propertyPattern = Pattern.compile(String.format("(?i)%s=(.*?)(?:[,;]|$)", property)); + Matcher propertyMatcher = propertyPattern.matcher(overridePropertiesString); + if (propertyMatcher.find() && propertyMatcher.groupCount() >= 1) { + overrideProps.put(property, propertyMatcher.group(1)); + } + } + return overrideProps; + } + /** An implementation of DataSource must include a public no-arg constructor. */ public DataSource() {} @@ -346,6 +603,16 @@ private Properties createProperties() { BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME, String.valueOf(this.swaAppendRowCount)); } + if (this.connectionPoolSize != null) { + connectionProperties.setProperty( + BigQueryJdbcUrlUtility.CONNECTION_POOL_SIZE_PROPERTY_NAME, + String.valueOf(this.connectionPoolSize)); + } + if (this.listenerPoolSize != null) { + connectionProperties.setProperty( + BigQueryJdbcUrlUtility.LISTENER_POOL_SIZE_PROPERTY_NAME, + String.valueOf(this.listenerPoolSize)); + } return connectionProperties; } @@ -372,13 +639,25 @@ public void setURL(String URL) { } public String getProjectId() { - return projectId; + return projectId != null + ? projectId + : com.google.cloud.bigquery.BigQueryOptions.getDefaultProjectId(); } public void setProjectId(String projectId) { this.projectId = projectId; } + public void setMaxResults(Long maxResults) { + this.maxResults = maxResults; + } + + public Long getMaxResults() { + return this.maxResults != null + ? this.maxResults + : (Long) BigQueryJdbcUrlUtility.DEFAULT_MAX_RESULTS_VALUE; + } + public String getDefaultDataset() { return defaultDataset; } @@ -413,20 +692,46 @@ public void setPartnerToken(String partnerToken) { this.partnerToken = partnerToken; } - public boolean getEnableHighThroughputAPI() { - return enableHighThroughputAPI; + public Boolean getEnableHighThroughputAPI() { + return enableHighThroughputAPI != null + ? enableHighThroughputAPI + : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_HTAPI_VALUE; } public void setEnableHighThroughputAPI(Boolean enableHighThroughputAPI) { this.enableHighThroughputAPI = enableHighThroughputAPI; } - public int getHighThroughputMinTableSize() { - return highThroughputMinTableSize; + public Integer getHighThroughputMinTableSize() { + return highThroughputMinTableSize != null + ? highThroughputMinTableSize + : (Integer) BigQueryJdbcUrlUtility.DEFAULT_HTAPI_MIN_TABLE_SIZE_VALUE; + } + + public Integer getHighThroughputActivationRatio() { + return highThroughputActivationRatio != null + ? highThroughputActivationRatio + : (Integer) BigQueryJdbcUrlUtility.DEFAULT_HTAPI_ACTIVATION_RATIO_VALUE; + } + + public Long getConnectionPoolSize() { + return connectionPoolSize != null + ? connectionPoolSize + : BigQueryJdbcUrlUtility.DEFAULT_CONNECTION_POOL_SIZE_VALUE; + } + + public void setConnectionPoolSize(Long connectionPoolSize) { + this.connectionPoolSize = connectionPoolSize; + } + + public Long getListenerPoolSize() { + return listenerPoolSize != null + ? listenerPoolSize + : BigQueryJdbcUrlUtility.DEFAULT_LISTENER_POOL_SIZE_VALUE; } - public int getHighThroughputActivationRatio() { - return highThroughputActivationRatio; + public void setListenerPoolSize(Long listenerPoolSize) { + this.listenerPoolSize = listenerPoolSize; } public void setHighThroughputMinTableSize(Integer highThroughputMinTableSize) { @@ -457,12 +762,16 @@ public void setUnsupportedHTAPIFallback(Boolean unsupportedHTAPIFallback) { this.unsupportedHTAPIFallback = unsupportedHTAPIFallback; } - public boolean getUnsupportedHTAPIFallback() { - return this.unsupportedHTAPIFallback; + public Boolean getUnsupportedHTAPIFallback() { + return this.unsupportedHTAPIFallback != null + ? this.unsupportedHTAPIFallback + : BigQueryJdbcUrlUtility.DEFAULT_UNSUPPORTED_HTAPI_FALLBACK_VALUE; } - public boolean getEnableSession() { - return enableSession; + public Boolean getEnableSession() { + return enableSession != null + ? enableSession + : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_SESSION_VALUE; } public void setEnableSession(Boolean enableSession) { @@ -486,7 +795,9 @@ public void setLogPath(String logPath) { } public String getUniverseDomain() { - return universeDomain; + return universeDomain != null + ? universeDomain + : BigQueryJdbcUrlUtility.DEFAULT_UNIVERSE_DOMAIN_VALUE; } public void setUniverseDomain(String universeDomain) { @@ -525,8 +836,8 @@ public void setProxyPwd(String proxyPwd) { this.proxyPwd = proxyPwd; } - public int getOAuthType() { - return oAuthType; + public Integer getOAuthType() { + return oAuthType != null ? oAuthType : BigQueryJdbcUrlUtility.DEFAULT_OAUTH_TYPE_VALUE; } public void setOAuthType(Integer oAuthType) { @@ -574,15 +885,17 @@ public void setOAuthRefreshToken(String oAuthRefreshToken) { } public Boolean getUseQueryCache() { - return useQueryCache; + return useQueryCache != null ? useQueryCache : BigQueryJdbcUrlUtility.DEFAULT_USE_QUERY_CACHE; } public String getQueryDialect() { - return queryDialect; + return queryDialect != null ? queryDialect : BigQueryJdbcUrlUtility.DEFAULT_QUERY_DIALECT_VALUE; } public Boolean getAllowLargeResults() { - return allowLargeResults; + return allowLargeResults != null + ? allowLargeResults + : BigQueryJdbcUrlUtility.DEFAULT_ALLOW_LARGE_RESULTS; } public String getDestinationTable() { @@ -594,7 +907,9 @@ public String getDestinationDataset() { } public Long getDestinationDatasetExpirationTime() { - return destinationDatasetExpirationTime; + return destinationDatasetExpirationTime != null + ? destinationDatasetExpirationTime + : (Long) BigQueryJdbcUrlUtility.DEFAULT_DESTINATION_DATASET_EXPIRATION_TIME_VALUE; } public void setUseQueryCache(Boolean useQueryCache) { @@ -638,7 +953,24 @@ public void setOAuthClientSecret(String oAuthClientSecret) { } public Integer getJobCreationMode() { - return jobCreationMode; + return jobCreationMode != null + ? jobCreationMode + : (Integer) BigQueryJdbcUrlUtility.DEFAULT_JOB_CREATION_MODE; + } + + public Boolean getUseStatelessQueryMode() { + Integer jobCreationModeVal = getJobCreationMode(); + if (jobCreationModeVal == 2) { + return true; + } else if (jobCreationModeVal == 1) { + return false; + } else { + throw new IllegalArgumentException( + String.format( + "Invalid value for %s. Use 1 for JOB_CREATION_REQUIRED and 2 for" + + " JOB_CREATION_OPTIONAL.", + BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME)); + } } public void setJobCreationMode(Integer jobCreationMode) { @@ -646,7 +978,9 @@ public void setJobCreationMode(Integer jobCreationMode) { } public Boolean getEnableWriteAPI() { - return enableWriteAPI; + return enableWriteAPI != null + ? enableWriteAPI + : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_WRITE_API_VALUE; } public void setEnableWriteAPI(Boolean enableWriteAPI) { @@ -662,7 +996,9 @@ public void setAdditionalProjects(String additionalProjects) { } public Boolean getFilterTablesOnDefaultDataset() { - return filterTablesOnDefaultDataset; + return filterTablesOnDefaultDataset != null + ? filterTablesOnDefaultDataset + : BigQueryJdbcUrlUtility.DEFAULT_FILTER_TABLES_ON_DEFAULT_DATASET_VALUE; } public void setFilterTablesOnDefaultDataset(Boolean filterTablesOnDefaultDataset) { @@ -670,7 +1006,9 @@ public void setFilterTablesOnDefaultDataset(Boolean filterTablesOnDefaultDataset } public Integer getRequestGoogleDriveScope() { - return requestGoogleDriveScope; + return requestGoogleDriveScope != null + ? requestGoogleDriveScope + : BigQueryJdbcUrlUtility.DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE; } public void setRequestGoogleDriveScope(Integer requestGoogleDriveScope) { @@ -678,7 +1016,9 @@ public void setRequestGoogleDriveScope(Integer requestGoogleDriveScope) { } public Integer getMetadataFetchThreadCount() { - return metadataFetchThreadCount; + return metadataFetchThreadCount != null + ? metadataFetchThreadCount + : BigQueryJdbcUrlUtility.DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE; } public void setMetadataFetchThreadCount(Integer metadataFetchThreadCount) { @@ -718,37 +1058,43 @@ public void setRequestReason(String requestReason) { } public Integer getTimeout() { - return timeout; + return timeout != null + ? timeout + : (int) BigQueryJdbcUrlUtility.DEFAULT_RETRY_TIMEOUT_IN_SECS_VALUE; } - public void setTimeout(Integer timeout) { - this.timeout = timeout; + public Integer getJobTimeout() { + return jobTimeout != null ? jobTimeout : (int) BigQueryJdbcUrlUtility.DEFAULT_JOB_TIMEOUT_VALUE; } - public Integer getJobTimeout() { - return jobTimeout; + public Integer getRetryInitialDelay() { + return retryInitialDelay != null + ? retryInitialDelay + : (int) BigQueryJdbcUrlUtility.DEFAULT_RETRY_INITIAL_DELAY_VALUE; } - public void setJobTimeout(Integer jobTimeout) { - this.jobTimeout = jobTimeout; + public Integer getRetryMaxDelay() { + return retryMaxDelay != null + ? retryMaxDelay + : (int) BigQueryJdbcUrlUtility.DEFAULT_RETRY_MAX_DELAY_VALUE; } - public Integer getRetryInitialDelay() { - return retryInitialDelay; + public void setJobTimeout(Integer jobTimeout) { + this.jobTimeout = jobTimeout; } public void setRetryInitialDelay(Integer retryInitialDelay) { this.retryInitialDelay = retryInitialDelay; } - public Integer getRetryMaxDelay() { - return retryMaxDelay; - } - public void setRetryMaxDelay(Integer retryMaxDelay) { this.retryMaxDelay = retryMaxDelay; } + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } + public Integer getHttpConnectTimeout() { return httpConnectTimeout; } @@ -766,7 +1112,9 @@ public void setHttpReadTimeout(Integer httpReadTimeout) { } public Long getMaximumBytesBilled() { - return maximumBytesBilled; + return maximumBytesBilled != null + ? maximumBytesBilled + : BigQueryJdbcUrlUtility.DEFAULT_MAX_BYTES_BILLED_VALUE; } public void setMaximumBytesBilled(Long maximumBytesBilled) { @@ -774,7 +1122,9 @@ public void setMaximumBytesBilled(Long maximumBytesBilled) { } public Integer getSwaActivationRowCount() { - return swaActivationRowCount; + return swaActivationRowCount != null + ? swaActivationRowCount + : BigQueryJdbcUrlUtility.DEFAULT_SWA_ACTIVATION_ROW_COUNT_VALUE; } public void setSwaActivationRowCount(Integer swaActivationRowCount) { @@ -782,13 +1132,133 @@ public void setSwaActivationRowCount(Integer swaActivationRowCount) { } public Integer getSwaAppendRowCount() { - return swaAppendRowCount; + return swaAppendRowCount != null + ? swaAppendRowCount + : BigQueryJdbcUrlUtility.DEFAULT_SWA_APPEND_ROW_COUNT_VALUE; } public void setSwaAppendRowCount(Integer swaAppendRowCount) { this.swaAppendRowCount = swaAppendRowCount; } + public String getOAuthP12Password() { + return oAuthP12Password != null + ? oAuthP12Password + : BigQueryJdbcUrlUtility.DEFAULT_OAUTH_P12_PASSWORD_VALUE; + } + + public void setOAuthP12Password(String oAuthP12Password) { + this.oAuthP12Password = oAuthP12Password; + } + + public String getOAuthSAImpersonationEmail() { + return oAuthSAImpersonationEmail; + } + + public void setOAuthSAImpersonationEmail(String oAuthSAImpersonationEmail) { + this.oAuthSAImpersonationEmail = oAuthSAImpersonationEmail; + } + + public String getOAuthSAImpersonationChain() { + return oAuthSAImpersonationChain; + } + + public void setOAuthSAImpersonationChain(String oAuthSAImpersonationChain) { + this.oAuthSAImpersonationChain = oAuthSAImpersonationChain; + } + + public String getOAuthSAImpersonationScopes() { + return oAuthSAImpersonationScopes; + } + + public void setOAuthSAImpersonationScopes(String oAuthSAImpersonationScopes) { + this.oAuthSAImpersonationScopes = oAuthSAImpersonationScopes; + } + + public String getOAuthSAImpersonationTokenLifetime() { + return oAuthSAImpersonationTokenLifetime; + } + + public void setOAuthSAImpersonationTokenLifetime(String oAuthSAImpersonationTokenLifetime) { + this.oAuthSAImpersonationTokenLifetime = oAuthSAImpersonationTokenLifetime; + } + + public String getOAuth2TokenUri() { + return oAuth2TokenUri; + } + + public void setOAuth2TokenUri(String oAuth2TokenUri) { + this.oAuth2TokenUri = oAuth2TokenUri; + } + + public String getByoidAudienceUri() { + return byoidAudienceUri; + } + + public void setByoidAudienceUri(String byoidAudienceUri) { + this.byoidAudienceUri = byoidAudienceUri; + } + + public String getByoidCredentialSource() { + return byoidCredentialSource; + } + + public void setByoidCredentialSource(String byoidCredentialSource) { + this.byoidCredentialSource = byoidCredentialSource; + } + + public String getByoidPoolUserProject() { + return byoidPoolUserProject; + } + + public void setByoidPoolUserProject(String byoidPoolUserProject) { + this.byoidPoolUserProject = byoidPoolUserProject; + } + + public String getByoidSAImpersonationUri() { + return byoidSAImpersonationUri; + } + + public void setByoidSAImpersonationUri(String byoidSAImpersonationUri) { + this.byoidSAImpersonationUri = byoidSAImpersonationUri; + } + + public String getByoidSubjectTokenType() { + return byoidSubjectTokenType != null + ? byoidSubjectTokenType + : BigQueryJdbcUrlUtility.DEFAULT_BYOID_SUBJECT_TOKEN_TYPE_VALUE; + } + + public void setByoidSubjectTokenType(String byoidSubjectTokenType) { + this.byoidSubjectTokenType = byoidSubjectTokenType; + } + + public String getByoidTokenUri() { + return byoidTokenUri != null + ? byoidTokenUri + : BigQueryJdbcUrlUtility.DEFAULT_BYOID_TOKEN_URI_VALUE; + } + + public void setByoidTokenUri(String byoidTokenUri) { + this.byoidTokenUri = byoidTokenUri; + } + + public String getEndpointOverrides() { + return endpointOverrides; + } + + public void setEndpointOverrides(String endpointOverrides) { + this.endpointOverrides = endpointOverrides; + } + + public String getPrivateServiceConnect() { + return privateServiceConnect; + } + + public void setPrivateServiceConnect(String privateServiceConnect) { + this.privateServiceConnect = privateServiceConnect; + } + @Override public PrintWriter getLogWriter() { return null; diff --git a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java index 412e4ca9e..a8f65c44e 100644 --- a/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java +++ b/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java @@ -40,9 +40,7 @@ public PooledConnection getPooledConnection() throws SQLException { throw new BigQueryJdbcRuntimeException( "Cannot get pooled connection: unable to get underlying physical connection"); } - String connectionURl = ((BigQueryConnection) bqConnection).getConnectionUrl(); - Long connectionPoolSize = - BigQueryJdbcUrlUtility.parseConnectionPoolSize(connectionURl, this.toString()); + Long connectionPoolSize = ((BigQueryConnection) bqConnection).getConnectionPoolSize(); if (connectionPoolManager == null) { connectionPoolManager = new PooledConnectionListener(connectionPoolSize); } diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 1cc0ad7bb..a5f148e2e 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -27,9 +27,6 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.Properties; import org.junit.Before; import org.junit.Test; @@ -243,9 +240,9 @@ public void testAdditionalProjects() throws IOException, BigQueryJdbcException { + "OAuthClientSecret=redactedToken;" + "AdditionalProjects=projA,projB"; try (BigQueryConnection conn1 = new BigQueryConnection(url1)) { - List additionalProjects1 = conn1.getAdditionalProjects(); + String additionalProjects1 = conn1.getAdditionalProjects(); assertNotNull(additionalProjects1); - assertEquals(Arrays.asList("projA", "projB"), additionalProjects1); + assertEquals("projA,projB", additionalProjects1); } catch (SQLException | IOException e) { throw new BigQueryJdbcException(e); } @@ -256,9 +253,9 @@ public void testAdditionalProjects() throws IOException, BigQueryJdbcException { + "OAuthClientSecret=redactedToken;" + "AdditionalProjects=projX"; try (BigQueryConnection conn2 = new BigQueryConnection(url2)) { - List additionalProjects2 = conn2.getAdditionalProjects(); + String additionalProjects2 = conn2.getAdditionalProjects(); assertNotNull(additionalProjects2); - assertEquals(Collections.singletonList("projX"), additionalProjects2); + assertEquals("projX", additionalProjects2); } catch (SQLException | IOException e) { throw new BigQueryJdbcException(e); } diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java index b7fc03162..bbabb486f 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java @@ -91,7 +91,7 @@ public void testInvalidTokenUriForAuthType0() { Map oauthProperties = BigQueryJdbcOAuthUtility.parseOAuthProperties(connectionString, null); Map overrideProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connectionString, null); + DataSource.fromUrl(connectionString).getOverrideProperties(); try { BigQueryJdbcOAuthUtility.getCredentials(oauthProperties, overrideProperties, null); @@ -235,7 +235,7 @@ public void testGenerateUserAuthURLOverrideOauthEndpoint() { Map authProperties = BigQueryJdbcOAuthUtility.parseOAuthProperties(connectionString, null); Map overrideProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connectionString, null); + DataSource.fromUrl(connectionString).getOverrideProperties(); UserAuthorizer userAuthorizer = BigQueryJdbcOAuthUtility.getUserAuthorizer( @@ -275,7 +275,7 @@ public void testParseOverridePropsForRefreshTokenAuth() { Map authProperties = BigQueryJdbcOAuthUtility.parseOAuthProperties(connectionString, null); Map overrideProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connectionString, null); + DataSource.fromUrl(connectionString).getOverrideProperties(); UserCredentials userCredentials = BigQueryJdbcOAuthUtility.getPreGeneratedRefreshTokenCredentials( @@ -296,9 +296,8 @@ public void testParseBYOIDProps() { "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:433;OAuthType=4;" + "ProjectId=MyBigQueryProject;" + "BYOID_AudienceUri=//iam.googleapis.com/locations/global/workforcePools/pool-id/providers/provider-id;" - + "BYOID_PoolUserProject=workforceProjectNumber;" - + "BYOID_CredentialSource={\"file\": \"C:\\\\Token.txt\"};" - + "BYOID_SA_Impersonation_Uri=testSA;" + + "BYOID_PoolUserProject=workforceProjectNumber;BYOID_CredentialSource={\"file\":" + + " \"C:\\\\Token.txt\"};BYOID_SA_Impersonation_Uri=testSA;" + "BYOID_SubjectTokenType=urn:ietf:params:oauth:tokentype:jwt;" + "BYOID_TokenUri=https://testuri.com/v1/token", null); diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java index 830e51533..9b65719cb 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java @@ -17,19 +17,12 @@ package com.google.cloud.bigquery.jdbc; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; import com.google.cloud.bigquery.exception.BigQueryJdbcRuntimeException; -import com.google.common.collect.Maps; -import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Properties; import org.junit.Test; @@ -160,281 +153,6 @@ public void testParseUrl_longUnknownProperty_sanitized() { assertThat(e.getMessage().length()).isLessThan(100); } - @Test - public void testOverridePropertiesFromURICompatibility() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PROJECTID=testProject;PrivateServiceConnectUris=" - + "BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - } - - @Test - public void testOverridePropertiesDoesNotAffectOriginalParsersAtEnd() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PrivateServiceConnectUris=" - + "BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443," - + "OAUTH2=https://oauth2-myprivateserver.p.googleapis.com;PROJECTID=testProject;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - assertThat(parsedPSCProperties.get("OAUTH2")) - .isEqualTo("https://oauth2-myprivateserver.p.googleapis.com"); - } - - @Test - public void testOverridePropertiesDoesNotParseOutsideOfPrivateServiceConnectUris() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PrivateServiceConnectUris=" - + "BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443;" - // Hard to see but semicolon ends it here. - + "OAUTH2=https://oauth2-myprivateserver.p.googleapis.com;PROJECTID=testProject;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - assertThat(parsedPSCProperties.get("OAUTH2")).isNull(); - } - - @Test - public void testOverridePropertiesDoesNotParserPropertiesInMiddle() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PrivateServiceConnectUris=" - + "BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com,OAUTHTYPE=2," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443," - + "OAUTH2=https://oauth2-myprivateserver.p.googleapis.com;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - assertThat(parsedPSCProperties.get("OAUTH2")) - .isEqualTo("https://oauth2-myprivateserver.p.googleapis.com"); - } - - @Test - public void testOverridePropertyBeforeProceedingOverrideParameterDoesNotParse() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com;" - + "PrivateServiceConnectUris=" - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443," - + "OAUTH2=https://oauth2-myprivateserver.p.googleapis.com;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertNull(parsedPSCProperties.get("BIGQUERY")); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - assertThat(parsedPSCProperties.get("OAUTH2")) - .isEqualTo("https://oauth2-myprivateserver.p.googleapis.com"); - } - - @Test - public void testOverridePropertiesFromURIGoogleExperience() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PROJECTID=testProject;EndpointOverrides=" - + "BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - } - - @Test - public void testAllOverridePropertiesFromURIGoogleExperience() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PROJECTID=testProject;EndpointOverrides=" - + "BIGQUERY=https://bigquery-myprivateserver.p.googleapis.com," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443," - + "OAUTH2=https://oauth2-myprivateserver.p.googleapis.com," - + "STS=https://sts-myprivateserver.p.googleapis.com;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - assertThat(parsedPSCProperties.get("OAUTH2")) - .isEqualTo("https://oauth2-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("STS")) - .isEqualTo("https://sts-myprivateserver.p.googleapis.com"); - } - - @Test - public void testCaseSensitivityOverridePropertiesFromURI() { - String connection_uri = - "bigquery://https://www.googleapis.com/bigquery/v2:443;PROJECTID=testProject;endpointOverrides=" - + "bigQuery=https://bigquery-myprivateserver.p.googleapis.com," - + "READ_API=https://bigquerystorage-myprivateserver.p.googleapis.com:443;"; - - Map parsedPSCProperties = - BigQueryJdbcUrlUtility.parseOverrideProperties(connection_uri, null); - - assertThat(parsedPSCProperties.get("BIGQUERY")) - .isEqualTo("https://bigquery-myprivateserver.p.googleapis.com"); - assertThat(parsedPSCProperties.get("READ_API")) - .isEqualTo("https://bigquerystorage-myprivateserver.p.googleapis.com:443"); - } - - @Test - public void testParseJobCreationModeDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;"; - - boolean jobCreationMode = BigQueryJdbcUrlUtility.parseJobCreationMode(connection_uri, null); - assertTrue(jobCreationMode); - } - - @Test - public void testParseJobCreationMode() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobCreationMode=1"; - - boolean jobCreationMode = BigQueryJdbcUrlUtility.parseJobCreationMode(connection_uri, null); - assertFalse(jobCreationMode); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobCreationMode=2"; - - jobCreationMode = BigQueryJdbcUrlUtility.parseJobCreationMode(connection_uri, null); - assertTrue(jobCreationMode); - } - - @Test - public void testParseJobCreationModeInvalidInteger() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobCreationMode=25"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseJobCreationMode(connection_uri, null)); - } - - @Test - public void testParseJobCreationModeInvalidString() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobCreationMode=JOB_CREATION_OPTIONAL"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseJobCreationMode(connection_uri, null)); - } - - @Test - public void testGetConnectionPropertyDefaultValue() { - assertEquals( - BigQueryJdbcUrlUtility.getConnectionPropertyDefaultValue("BYOID_TokenUri"), - "https://sts.googleapis.com/v1/token"); - } - - @Test - public void testParseRetryTimeoutInSecs() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "Timeout=10"; - - long retryTimeoutInSeconds = - BigQueryJdbcUrlUtility.parseRetryTimeoutInSecs(connection_uri, null); - assertEquals(10, retryTimeoutInSeconds); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "Timeout=20"; - - retryTimeoutInSeconds = BigQueryJdbcUrlUtility.parseRetryTimeoutInSecs(connection_uri, null); - assertEquals(20, retryTimeoutInSeconds); - } - - @Test - public void testParseRetryTimeoutInSecsDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long retryTimeoutInSeconds = - BigQueryJdbcUrlUtility.parseRetryTimeoutInSecs(connection_uri, null); - assertEquals(0, retryTimeoutInSeconds); - } - - @Test - public void testParseRetryTimeoutSecondsInvalidLong() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "Timeout=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseRetryTimeoutInSecs(connection_uri, null)); - } - - public void testParseJobTimeout() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobTimeout=10"; - - long jobTimeout = BigQueryJdbcUrlUtility.parseJobTimeout(connection_uri, null); - assertEquals(10, jobTimeout); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobTimeout=20"; - - jobTimeout = BigQueryJdbcUrlUtility.parseJobTimeout(connection_uri, null); - assertEquals(20, jobTimeout); - } - - @Test - public void testParseJobTimeoutDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long jobTimeout = BigQueryJdbcUrlUtility.parseJobTimeout(connection_uri, null); - assertEquals(0L, jobTimeout); - } - - @Test - public void testParseJobTimeoutInvalid() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "JobTimeout=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseJobTimeout(connection_uri, null)); - } - @Test public void testParsePartnerTokenProperty() { // Case with partner name and environment @@ -442,8 +160,7 @@ public void testParsePartnerTokenProperty() { "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "PartnerToken=(GPN:partner_company; dev);ProjectId=MyBigQueryProject;"; String expected = " (GPN:partner_company; dev)"; - String result = - BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, "testParsePartnerTokenProperty"); + String result = BigQueryJdbcUrlUtility.parseUriProperty(url, "PartnerToken"); assertThat(result).isEqualTo(expected); // Case with only partner name @@ -451,24 +168,24 @@ public void testParsePartnerTokenProperty() { "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "PartnerToken=(GPN:another_partner);ProjectId=MyBigQueryProject;"; expected = " (GPN:another_partner)"; - result = BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, "testParsePartnerTokenProperty"); + result = BigQueryJdbcUrlUtility.parseUriProperty(url, "PartnerToken"); assertThat(result).isEqualTo(expected); // Case when PartnerToken property is not present url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "ProjectId=MyBigQueryProject;"; - result = BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, "testParsePartnerTokenProperty"); + result = BigQueryJdbcUrlUtility.parseUriProperty(url, "PartnerToken"); assertNull(result); // Case when PartnerToken property is present but empty url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;PartnerToken=();"; - result = BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, "testParsePartnerTokenProperty"); + result = BigQueryJdbcUrlUtility.parseUriProperty(url, "PartnerToken"); assertNull(result); // Case when PartnerToken property is present but without partner name url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;PartnerToken=(env);"; - result = BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, "testParsePartnerTokenProperty"); + result = BigQueryJdbcUrlUtility.parseUriProperty(url, "PartnerToken"); assertNull(result); // Case with extra spaces around the values @@ -476,437 +193,10 @@ public void testParsePartnerTokenProperty() { "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "PartnerToken= ( GPN: partner_name ; test_env ) ;"; expected = " (GPN: partner_name ; test_env)"; - result = BigQueryJdbcUrlUtility.parsePartnerTokenProperty(url, "testParsePartnerTokenProperty"); + result = BigQueryJdbcUrlUtility.parseUriProperty(url, "PartnerToken"); assertThat(result).isEqualTo(expected); } - public void testParseRetryInitialDelayInSecs() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "RetryInitialDelay=10"; - - long retryInitialDelaySeconds = - BigQueryJdbcUrlUtility.parseRetryInitialDelayInSecs(connection_uri, null); - assertEquals(10, retryInitialDelaySeconds); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "RetryInitialDelay=20"; - - retryInitialDelaySeconds = - BigQueryJdbcUrlUtility.parseRetryInitialDelayInSecs(connection_uri, null); - assertEquals(20, retryInitialDelaySeconds); - } - - @Test - public void testParseRetryInitialDelayInSecsDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long retryInitialDelaySeconds = - BigQueryJdbcUrlUtility.parseRetryInitialDelayInSecs(connection_uri, null); - assertEquals(0, retryInitialDelaySeconds); - } - - @Test - public void testParseRetryInitialDelaySecondsInvalidLong() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "RetryInitialDelay=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseRetryInitialDelayInSecs(connection_uri, null)); - } - - @Test - public void testParseRetryMaxDelayInSecs() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "RetryMaxDelay=10"; - - long retryMaxDelaySeconds = - BigQueryJdbcUrlUtility.parseRetryMaxDelayInSecs(connection_uri, null); - assertEquals(10, retryMaxDelaySeconds); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "RetryMaxDelay=20"; - - retryMaxDelaySeconds = BigQueryJdbcUrlUtility.parseRetryMaxDelayInSecs(connection_uri, null); - assertEquals(20, retryMaxDelaySeconds); - } - - @Test - public void testParseRetryMaxDelayInSecsDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long retryMaxDelaySeconds = - BigQueryJdbcUrlUtility.parseRetryMaxDelayInSecs(connection_uri, null); - assertEquals(0, retryMaxDelaySeconds); - } - - @Test - public void testParseRetryMaxDelaySecondsInvalidLong() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "RetryMaxDelay=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseRetryMaxDelayInSecs(connection_uri, null)); - } - - @Test - public void testParseRequestGoogleDriveScope_Default() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;"; - Integer value = - BigQueryJdbcUrlUtility.parseIntProperty( - url, - BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, - BigQueryJdbcUrlUtility.DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE, - this.getClass().getName()); - assertEquals( - Integer.valueOf(BigQueryJdbcUrlUtility.DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE), value); - } - - // Connection Pool Size - - @Test - public void testParseConnectionPoolSize() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ConnectionPoolSize=10"; - long connectionPoolSize = BigQueryJdbcUrlUtility.parseConnectionPoolSize(connection_uri, null); - assertEquals(10, connectionPoolSize); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ConnectionPoolSize=20"; - - connectionPoolSize = BigQueryJdbcUrlUtility.parseConnectionPoolSize(connection_uri, null); - assertEquals(20, connectionPoolSize); - } - - @Test - public void testParseConnectionPoolSizeDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long connectionPoolSize = BigQueryJdbcUrlUtility.parseConnectionPoolSize(connection_uri, null); - assertEquals(10, connectionPoolSize); - } - - @Test - public void testParseConnectionPoolSizeDefaultNullConnectionUrl() { - assertThrows( - BigQueryJdbcRuntimeException.class, - () -> BigQueryJdbcUrlUtility.parseConnectionPoolSize(null, null)); - } - - @Test - public void testParseConnectionPoolSizeDefaultEmptyConnectionUrl() { - assertThrows( - BigQueryJdbcRuntimeException.class, - () -> BigQueryJdbcUrlUtility.parseConnectionPoolSize("", null)); - } - - @Test - public void testParseConnectionPoolSizeInvalidLong() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ConnectionPoolSize=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseConnectionPoolSize(connection_uri, null)); - } - - // Listener Pool Size - - @Test - public void testParseListenerPoolSize() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ListenerPoolSize=10"; - long listenerPoolSize = BigQueryJdbcUrlUtility.parseListenerPoolSize(connection_uri, null); - assertEquals(10, listenerPoolSize); - - connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ListenerPoolSize=20"; - - listenerPoolSize = BigQueryJdbcUrlUtility.parseListenerPoolSize(connection_uri, null); - assertEquals(20, listenerPoolSize); - } - - @Test - public void testParseListenerPoolSizeDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long listenerPoolSize = BigQueryJdbcUrlUtility.parseListenerPoolSize(connection_uri, null); - assertEquals(10, listenerPoolSize); - } - - @Test - public void testParseListenerPoolSizeDefaultNullConnectionUrl() { - assertThrows( - BigQueryJdbcRuntimeException.class, - () -> BigQueryJdbcUrlUtility.parseListenerPoolSize(null, null)); - } - - @Test - public void testParseListenerPoolSizeDefaultEmptyConnectionUrl() { - assertThrows( - BigQueryJdbcRuntimeException.class, - () -> BigQueryJdbcUrlUtility.parseListenerPoolSize("", null)); - } - - @Test - public void testParseListenerPoolSizeInvalidLong() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ListenerPoolSize=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseListenerPoolSize(connection_uri, null)); - } - - @Test - public void testParseStringListProperty_NullOrEmpty() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;ServiceAccountImpersonationScopes="; - List result = - BigQueryJdbcUrlUtility.parseStringListProperty(url, "NonExistentProp", "TestClass"); - assertEquals(Collections.emptyList(), result); - - result = - BigQueryJdbcUrlUtility.parseStringListProperty( - url, "ServiceAccountImpersonationScopes", "TestClass"); - assertEquals(Collections.emptyList(), result); - - String urlWithEmptyList = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;ServiceAccountImpersonationScopes=,,"; - result = - BigQueryJdbcUrlUtility.parseStringListProperty( - urlWithEmptyList, "ServiceAccountImpersonationScopes", "TestClass"); - assertEquals(Collections.emptyList(), result); - } - - @Test - public void testParseStringListProperty_SingleValue() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;ServiceAccountImpersonationScopes=project1"; - List result = - BigQueryJdbcUrlUtility.parseStringListProperty( - url, "ServiceAccountImpersonationScopes", "TestClass"); - assertEquals(Collections.singletonList("project1"), result); - } - - @Test - public void testParseStringListProperty_MultipleValues() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;ServiceAccountImpersonationScopes=project1,project2,project3"; - List result = - BigQueryJdbcUrlUtility.parseStringListProperty( - url, "ServiceAccountImpersonationScopes", "TestClass"); - assertEquals(Arrays.asList("project1", "project2", "project3"), result); - } - - @Test - public void testParseIntProperty_ValidInteger() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;HttpConnectTimeout=123"; - Integer defaultValue = 0; - Integer result = - BigQueryJdbcUrlUtility.parseIntProperty( - url, "HttpConnectTimeout", defaultValue, "TestClass"); - assertEquals(Integer.valueOf(123), result); - } - - @Test - public void testParseIntProperty_PropertyNotPresent() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;"; - Integer defaultValue = 42; - Integer result = - BigQueryJdbcUrlUtility.parseIntProperty( - url, "HttpConnectTimeout", defaultValue, "TestClass"); - assertEquals(defaultValue, result); - } - - @Test - public void testParseIntProperty_InvalidIntegerValue() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;HttpConnectTimeout=abc"; - Integer defaultValue = 77; - assertThrows( - IllegalArgumentException.class, - () -> - BigQueryJdbcUrlUtility.parseIntProperty( - url, "HttpConnectTimeout", defaultValue, "TestClass")); - } - - @Test - public void testParseIntProperty_EmptyStringValue() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;HttpConnectTimeout="; - Integer defaultValue = 88; - assertThrows( - IllegalArgumentException.class, - () -> - BigQueryJdbcUrlUtility.parseIntProperty( - url, "HttpConnectTimeout", defaultValue, "TestClass")); - } - - @Test - public void testParseMaxBytesBilled() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "MaximumBytesBilled=10000"; - - long maxBytesBilled = BigQueryJdbcUrlUtility.parseMaximumBytesBilled(connection_uri, null); - assertEquals(10000, maxBytesBilled); - } - - @Test - public void testParseMaxBytesBilledDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - long maxBytesBilled = BigQueryJdbcUrlUtility.parseMaximumBytesBilled(connection_uri, null); - assertEquals(0, maxBytesBilled); - } - - @Test - public void testParseMaxBytesBilledNullUrl() { - assertThrows( - BigQueryJdbcRuntimeException.class, - () -> BigQueryJdbcUrlUtility.parseMaximumBytesBilled(null, null)); - } - - @Test - public void testParseMaxBytesBilledEmptyUrl() { - assertThrows( - BigQueryJdbcRuntimeException.class, - () -> BigQueryJdbcUrlUtility.parseMaximumBytesBilled("", null)); - } - - @Test - public void testParseMaxBytesBilledInvalidLong() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "MaximumBytesBilled=invalid"; - - assertThrows( - NumberFormatException.class, - () -> BigQueryJdbcUrlUtility.parseMaximumBytesBilled(connection_uri, null)); - } - - @Test - public void testParseLabels() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "Labels=k1=v1,k2=v2,k3=v3;"; - - Map labels = BigQueryJdbcUrlUtility.parseLabels(connection_uri, null); - assertNotNull(labels); - assertFalse(labels.isEmpty()); - assertEquals(3, labels.size()); - - Map expected = - new HashMap() { - { - put("k1", "v1"); - put("k2", "v2"); - put("k3", "v3"); - } - }; - - assertTrue(Maps.difference(expected, labels).areEqual()); - } - - @Test - public void testParseLabelsEmpty() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;"; - - Map labels = BigQueryJdbcUrlUtility.parseLabels(connection_uri, null); - assertNull(labels); - } - - @Test - public void testParseHttpConnectTimeout() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "HttpConnectTimeout=10000"; - - Integer timeout = - BigQueryJdbcUrlUtility.parseIntProperty( - connection_uri, BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME, null, null); - assertEquals(Integer.valueOf(10000), timeout); - } - - @Test - public void testParseHttpConnectTimeoutDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - Integer timeout = - BigQueryJdbcUrlUtility.parseIntProperty( - connection_uri, BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME, null, null); - assertNull(timeout); - } - - @Test - public void testParseHttpReadTimeout() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "HttpReadTimeout=20000"; - - Integer timeout = - BigQueryJdbcUrlUtility.parseIntProperty( - connection_uri, BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME, null, null); - assertEquals(Integer.valueOf(20000), timeout); - } - - @Test - public void testParseHttpReadTimeoutDefault() { - String connection_uri = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject"; - - Integer timeout = - BigQueryJdbcUrlUtility.parseIntProperty( - connection_uri, BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME, null, null); - assertNull(timeout); - } - - @Test - public void testParseRequestReason() { - String url = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=3;ProjectId=testProject;RequestReason=testingRequestReason;"; - String requestReason = - BigQueryJdbcUrlUtility.parseStringProperty( - url, - BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME, - null, - "testParseRequestReason"); - assertEquals("testingRequestReason", requestReason); - } - @Test public void testAppendPropertiesToURL_propertyWithSemicolon_isEscaped() throws Exception { String url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;"; @@ -921,23 +211,4 @@ public void testAppendPropertiesToURL_propertyWithSemicolon_isEscaped() throws E assertThat(parsedProperties.get("ProjectId")).isEqualTo(complexValue); assertFalse(parsedProperties.containsKey("ExtraProperty")); } - - @Test - public void testEndpointOverrides_viaProperties() throws Exception { - String url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443"; - Properties props = new Properties(); - - String overrides = "OAUTH2=http://localhost:1234,BIGQUERY=http://localhost:9090"; - props.setProperty("EndpointOverrides", overrides); - - String updatedUrl = BigQueryJdbcUrlUtility.appendPropertiesToURL(url, null, props); - - Map parsedOverrides = - BigQueryJdbcUrlUtility.parseOverrideProperties(updatedUrl, null); - - assertThat(parsedOverrides).containsKey("OAUTH2"); - assertThat(parsedOverrides.get("OAUTH2")).isEqualTo("http://localhost:1234"); - assertThat(parsedOverrides).containsKey("BIGQUERY"); - assertThat(parsedOverrides.get("BIGQUERY")).isEqualTo("http://localhost:9090"); - } } diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnectionTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnectionTest.java index ee9d63beb..a394e53d0 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnectionTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnectionTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import java.io.IOException; @@ -35,6 +36,7 @@ public class BigQueryPooledConnectionTest { @Before public void setUp() throws IOException, SQLException { bigQueryConnection = mock(BigQueryConnection.class); + doReturn(LISTENER_POOL_SIZE).when(bigQueryConnection).getListenerPoolSize(); } @Test diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSourceTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSourceTest.java index bacfdae1d..e3ef8a27f 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSourceTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSourceTest.java @@ -18,12 +18,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import com.google.cloud.bigquery.exception.BigQueryJdbcRuntimeException; import java.sql.SQLException; import javax.sql.PooledConnection; import org.junit.Test; @@ -41,9 +39,13 @@ public void testGetPooledConnection() throws SQLException { BigQueryConnection bqConnection = mock(BigQueryConnection.class); doReturn(connectionUrl).when(bqConnection).getConnectionUrl(); + doReturn(LISTENER_POOL_SIZE).when(bqConnection).getListenerPoolSize(); + doReturn(CONNECTION_POOL_SIZE).when(bqConnection).getConnectionPoolSize(); PooledConnectionDataSource pooledDataSource = new PooledConnectionDataSource(); pooledDataSource.setConnection(bqConnection); + pooledDataSource.setListenerPoolSize(LISTENER_POOL_SIZE); + pooledDataSource.setConnectionPoolSize(CONNECTION_POOL_SIZE); PooledConnection pooledConnection = pooledDataSource.getPooledConnection(); assertNotNull(pooledConnection); @@ -54,27 +56,4 @@ public void testGetPooledConnection() throws SQLException { assertEquals( CONNECTION_POOL_SIZE, pooledDataSource.getConnectionPoolManager().getConnectionPoolSize()); } - - @Test - public void testGetPooledConnectionNoConnectionURl() throws SQLException { - BigQueryConnection bqConnection = mock(BigQueryConnection.class); - PooledConnectionDataSource pooledDataSource = new PooledConnectionDataSource(); - pooledDataSource.setConnection(bqConnection); - - assertThrows(BigQueryJdbcRuntimeException.class, () -> pooledDataSource.getPooledConnection()); - } - - @Test - public void testGetPooledConnectionFailInvalidConnectionURl() { - String connectionUrl = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType=3;ProjectId=testProject;" - + "ListenerPoolSize=invalid"; - BigQueryConnection bqConnection = mock(BigQueryConnection.class); - doReturn(connectionUrl).when(bqConnection).getConnectionUrl(); - - PooledConnectionDataSource pooledDataSource = new PooledConnectionDataSource(); - pooledDataSource.setConnection(bqConnection); - - assertThrows(NumberFormatException.class, () -> pooledDataSource.getPooledConnection()); - } } diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionListenerTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionListenerTest.java index d200709c4..2d1553f65 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionListenerTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/PooledConnectionListenerTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import java.io.IOException; @@ -37,6 +38,9 @@ public class PooledConnectionListenerTest { @Before public void setUp() throws IOException, SQLException { bigQueryConnection = mock(BigQueryConnection.class); + // Stub the listener pool size + doReturn(LISTENER_POOL_SIZE).when(bigQueryConnection).getListenerPoolSize(); + doReturn(CONNECTION_POOL_SIZE).when(bigQueryConnection).getConnectionPoolSize(); } @Test diff --git a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index 411a48871..22f5c1c76 100644 --- a/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -1508,7 +1508,7 @@ public void testDataSourceOAuthPvtKeyPath() throws SQLException, IOException { ds.setURL("jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;"); ds.setOAuthType(0); ds.setOAuthPvtKeyPath(tempFile.toPath().toString()); - assertEquals(0, ds.getOAuthType()); + assertEquals(0, ds.getOAuthType().intValue()); assertEquals(tempFile.toPath().toString(), ds.getOAuthPvtKeyPath()); }