Skip to content

Commit d3b8bde

Browse files
feat(jdbc): centralize connection properties from BigQueryConnection and DataSource (#4116)
1 parent ecbf402 commit d3b8bde

16 files changed

+801
-1451
lines changed

google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java

Lines changed: 79 additions & 207 deletions
Large diffs are not rendered by default.

google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5208,8 +5208,13 @@ private List<String> getAccessibleCatalogNames() {
52085208
accessibleCatalogs.add(primaryCatalog);
52095209
}
52105210

5211-
List<String> additionalProjects = this.connection.getAdditionalProjects();
5212-
if (additionalProjects != null) {
5211+
String additionalProjectsStr = this.connection.getAdditionalProjects();
5212+
if (additionalProjectsStr != null && !additionalProjectsStr.trim().isEmpty()) {
5213+
List<String> additionalProjects =
5214+
com.google.common.base.Splitter.on(',')
5215+
.trimResults()
5216+
.omitEmptyStrings()
5217+
.splitToList(additionalProjectsStr);
52135218
for (String project : additionalProjects) {
52145219
if (project != null && !project.isEmpty()) {
52155220
accessibleCatalogs.add(project);

google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,17 @@ public Connection connect(String url, Properties info) throws SQLException {
130130
throw new BigQueryJdbcException(e.getMessage(), e);
131131
}
132132

133+
DataSource ds = DataSource.fromUrl(connectionUri);
134+
133135
// LogLevel
134-
String logLevelStr =
135-
BigQueryJdbcUrlUtility.parseUriProperty(
136-
connectionUri, BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME);
136+
String logLevelStr = ds.getLogLevel();
137137
if (logLevelStr == null) {
138138
logLevelStr = System.getenv(BigQueryJdbcUrlUtility.LOG_LEVEL_ENV_VAR);
139139
}
140140
Level logLevel = BigQueryJdbcUrlUtility.parseLogLevel(logLevelStr);
141141

142142
// LogPath
143-
String logPath =
144-
BigQueryJdbcUrlUtility.parseUriProperty(
145-
connectionUri, BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME);
143+
String logPath = ds.getLogPath();
146144
if (logPath == null) {
147145
logPath = System.getenv(BigQueryJdbcUrlUtility.LOG_PATH_ENV_VAR);
148146
}
@@ -153,7 +151,7 @@ public Connection connect(String url, Properties info) throws SQLException {
153151
BigQueryJdbcRootLogger.setLevel(logLevel, logPath);
154152

155153
// Logging starts from here.
156-
BigQueryConnection connection = new BigQueryConnection(connectionUri);
154+
BigQueryConnection connection = new BigQueryConnection(connectionUri, ds);
157155
LOG.info(
158156
"Driver info : { {Database Product Name : %s}, "
159157
+ "{Database Product Version : %s}, "
@@ -216,8 +214,10 @@ public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) {
216214
driverProperty.description = prop.getDescription();
217215
propertyInfoList.add(driverProperty);
218216
}
217+
218+
DataSource ds = DataSource.fromUrl(connectionUri);
219219
Map<String, String> oAuthProperties =
220-
BigQueryJdbcOAuthUtility.parseOAuthProperties(url, this.toString());
220+
BigQueryJdbcOAuthUtility.parseOAuthProperties(ds, this.toString());
221221
for (Map.Entry<String, String> authProperty : oAuthProperties.entrySet()) {
222222
propertyInfoList.add(new DriverPropertyInfo(authProperty.getKey(), authProperty.getValue()));
223223
}

google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java

Lines changed: 62 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,13 @@ final class BigQueryJdbcOAuthUtility {
106106
* @param url The URL to parse.
107107
* @return A map of OAuth properties.
108108
*/
109-
static Map<String, String> parseOAuthProperties(String url, String callerClassName) {
109+
static Map<String, String> parseOAuthProperties(DataSource ds, String callerClassName) {
110110
LOG.finest("++enter++\t" + callerClassName);
111111
Map<String, String> oauthProperties = new HashMap<>();
112112

113113
AuthType authType;
114114
try {
115-
authType =
116-
AuthType.fromValue(
117-
BigQueryJdbcUrlUtility.parseIntProperty(
118-
url,
119-
BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME,
120-
BigQueryJdbcUrlUtility.DEFAULT_OAUTH_TYPE_VALUE,
121-
callerClassName));
115+
authType = AuthType.fromValue(ds.getOAuthType());
122116
} catch (NumberFormatException exception) {
123117
throw new IllegalArgumentException(OAUTH_TYPE_ERROR_MESSAGE);
124118
}
@@ -129,21 +123,10 @@ static Map<String, String> parseOAuthProperties(String url, String callerClassNa
129123
// need: project id, OAuthServiceAcctEmail and OAuthPvtKey or OAuthPvtKeyPath that can be
130124
// .p12 or json.
131125
// TODO: validation if .p12 or json file can be in getPropertyInfo can be handy for user
132-
String serviceAccountEmail =
133-
BigQueryJdbcUrlUtility.parseUriProperty(
134-
url, BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME);
135-
String serviceAccountPK =
136-
BigQueryJdbcUrlUtility.parseUriProperty(
137-
url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME);
138-
String serviceAccountPrivateKeyPath =
139-
BigQueryJdbcUrlUtility.parseUriProperty(
140-
url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME);
141-
String p12Password =
142-
BigQueryJdbcUrlUtility.parseStringProperty(
143-
url,
144-
BigQueryJdbcUrlUtility.OAUTH_P12_PASSWORD_PROPERTY_NAME,
145-
BigQueryJdbcUrlUtility.DEFAULT_OAUTH_P12_PASSWORD_VALUE,
146-
callerClassName);
126+
String serviceAccountEmail = ds.getOAuthServiceAcctEmail();
127+
String serviceAccountPK = ds.getOAuthPvtKey();
128+
String serviceAccountPrivateKeyPath = ds.getOAuthPvtKeyPath();
129+
String p12Password = ds.getOAuthP12Password();
147130

148131
oauthProperties.put(
149132
BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME, serviceAccountEmail);
@@ -158,48 +141,31 @@ static Map<String, String> parseOAuthProperties(String url, String callerClassNa
158141
break;
159142
case GOOGLE_USER_ACCOUNT:
160143
oauthProperties.put(
161-
BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME,
162-
BigQueryJdbcUrlUtility.parseUriProperty(
163-
url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME));
144+
BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, ds.getOAuthClientId());
164145
oauthProperties.put(
165-
BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME,
166-
BigQueryJdbcUrlUtility.parseUriProperty(
167-
url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME));
168-
int reqGoogleDriveScope =
169-
BigQueryJdbcUrlUtility.parseIntProperty(
170-
url,
171-
BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME,
172-
BigQueryJdbcUrlUtility.DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE,
173-
callerClassName);
146+
BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, ds.getOAuthClientSecret());
147+
int reqGoogleDriveScope = ds.getRequestGoogleDriveScope();
174148
oauthProperties.put(
175149
BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME,
176150
String.valueOf(reqGoogleDriveScope));
177151
LOG.fine("RequestGoogleDriveScope parsed.");
178152
break;
179153
case PRE_GENERATED_TOKEN:
180-
String refreshToken =
181-
BigQueryJdbcUrlUtility.parseUriProperty(
182-
url, BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME);
154+
String refreshToken = ds.getOAuthRefreshToken();
183155
if (refreshToken != null) {
184156
oauthProperties.put(
185157
BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME, refreshToken);
186158
LOG.fine("OAuthRefreshToken provided.");
187159
oauthProperties.put(
188-
BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME,
189-
BigQueryJdbcUrlUtility.parseUriProperty(
190-
url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME));
160+
BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, ds.getOAuthClientId());
191161
LOG.fine("OAuthClientId provided.");
192162
oauthProperties.put(
193-
BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME,
194-
BigQueryJdbcUrlUtility.parseUriProperty(
195-
url, BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME));
163+
BigQueryJdbcUrlUtility.OAUTH_CLIENT_SECRET_PROPERTY_NAME, ds.getOAuthClientSecret());
196164
LOG.fine("OAuthClientSecret provided.");
197165
break;
198166
}
199167
oauthProperties.put(
200-
BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME,
201-
BigQueryJdbcUrlUtility.parseUriProperty(
202-
url, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME));
168+
BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_PROPERTY_NAME, ds.getOAuthAccessToken());
203169
LOG.fine("OAuthAccessToken provided.");
204170
break;
205171
case APPLICATION_DEFAULT_CREDENTIALS:
@@ -209,38 +175,52 @@ static Map<String, String> parseOAuthProperties(String url, String callerClassNa
209175
case EXTERNAL_ACCOUNT_AUTH:
210176
// For External account authentication (OAuth Type 4)
211177
// need: project id, OAuthPvtKey or OAuthPvtKeyPath or BYOID_PROPERTIES
212-
String pvtKey =
213-
BigQueryJdbcUrlUtility.parseUriProperty(
214-
url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME);
215-
String pvtKeyPath =
216-
BigQueryJdbcUrlUtility.parseUriProperty(
217-
url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME);
178+
String pvtKey = ds.getOAuthPvtKey();
179+
String pvtKeyPath = ds.getOAuthPvtKeyPath();
218180
if (pvtKey != null) {
219-
oauthProperties.put(
220-
BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME,
221-
BigQueryJdbcUrlUtility.parseUriProperty(
222-
url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME));
181+
oauthProperties.put(BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PROPERTY_NAME, pvtKey);
223182
LOG.fine("OAuthPvtKey provided.");
224183
} else if (pvtKeyPath != null) {
225-
oauthProperties.put(
226-
BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME,
227-
BigQueryJdbcUrlUtility.parseUriProperty(
228-
url, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME));
184+
oauthProperties.put(BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME, pvtKeyPath);
229185
LOG.fine("OAuthPvtKeyPath provided.");
230186
} else {
231-
for (String property : BigQueryJdbcUrlUtility.BYOID_PROPERTIES) {
232-
String value =
233-
BigQueryJdbcUrlUtility.parseBYOIDProperty(url, property, callerClassName);
234-
if (value != null) {
235-
oauthProperties.put(property, value);
236-
LOG.fine(property + " provided.");
237-
}
187+
if (ds.getByoidAudienceUri() != null) {
188+
oauthProperties.put(
189+
BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME, ds.getByoidAudienceUri());
190+
}
191+
if (ds.getByoidCredentialSource() != null) {
192+
oauthProperties.put(
193+
BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME,
194+
ds.getByoidCredentialSource());
238195
}
239-
String universeDomainProp = BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME;
240-
String universeDomain = BigQueryJdbcUrlUtility.parseUriProperty(url, universeDomainProp);
196+
if (ds.getByoidPoolUserProject() != null) {
197+
oauthProperties.put(
198+
BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME,
199+
ds.getByoidPoolUserProject());
200+
}
201+
if (ds.getByoidSAImpersonationUri() != null) {
202+
oauthProperties.put(
203+
BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME,
204+
ds.getByoidSAImpersonationUri());
205+
}
206+
if (ds.getByoidSubjectTokenType() != null) {
207+
oauthProperties.put(
208+
BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME,
209+
ds.getByoidSubjectTokenType());
210+
}
211+
if (ds.getByoidTokenUri() != null) {
212+
oauthProperties.put(
213+
BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME, ds.getByoidTokenUri());
214+
}
215+
216+
String universeDomain = ds.getUniverseDomain();
241217
if (universeDomain != null) {
242-
oauthProperties.put(universeDomainProp, universeDomain);
243-
LOG.fine(universeDomainProp + " provided. Caller : " + callerClassName);
218+
oauthProperties.put(
219+
BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME, universeDomain);
220+
LOG.fine(
221+
BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME
222+
+ " provided. Caller : "
223+
+ callerClassName);
244224
}
245225
}
246226
break;
@@ -251,32 +231,20 @@ static Map<String, String> parseOAuthProperties(String url, String callerClassNa
251231
|| authType == AuthType.PRE_GENERATED_TOKEN) {
252232
oauthProperties.put(
253233
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME,
254-
BigQueryJdbcUrlUtility.parseStringProperty(
255-
url,
256-
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME,
257-
BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_EMAIL_VALUE,
258-
callerClassName));
234+
ds.getOAuthSAImpersonationEmail());
259235
oauthProperties.put(
260236
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME,
261-
BigQueryJdbcUrlUtility.parseStringProperty(
262-
url,
263-
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME,
264-
BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_CHAIN_VALUE,
265-
callerClassName));
237+
ds.getOAuthSAImpersonationChain());
266238
oauthProperties.put(
267239
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME,
268-
BigQueryJdbcUrlUtility.parseStringProperty(
269-
url,
270-
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME,
271-
BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_SCOPES_VALUE,
272-
callerClassName));
240+
ds.getOAuthSAImpersonationScopes() != null
241+
? ds.getOAuthSAImpersonationScopes()
242+
: BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_SCOPES_VALUE);
273243
oauthProperties.put(
274244
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME,
275-
BigQueryJdbcUrlUtility.parseStringProperty(
276-
url,
277-
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME,
278-
BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_VALUE,
279-
callerClassName));
245+
ds.getOAuthSAImpersonationTokenLifetime() != null
246+
? ds.getOAuthSAImpersonationTokenLifetime()
247+
: BigQueryJdbcUrlUtility.DEFAULT_OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_VALUE);
280248
}
281249
return oauthProperties;
282250
}
@@ -437,7 +405,8 @@ static UserAuthorizer getUserAuthorizer(
437405
}
438406
} catch (NumberFormatException e) {
439407
LOG.severe(
440-
"Invalid value for RequestGoogleDriveScope, defaulting to not request Drive scope. Caller: "
408+
"Invalid value for RequestGoogleDriveScope, defaulting to not request Drive scope."
409+
+ " Caller: "
441410
+ callerClassName);
442411
}
443412
}

google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,34 +61,27 @@ final class BigQueryJdbcProxyUtility {
6161

6262
private BigQueryJdbcProxyUtility() {}
6363

64-
static Map<String, String> parseProxyProperties(String URL, String callerClassName) {
64+
static Map<String, String> parseProxyProperties(DataSource ds, String callerClassName) {
6565
LOG.finest("++enter++\t" + callerClassName);
6666
Map<String, String> proxyProperties = new HashMap<>();
67-
String proxyHost =
68-
BigQueryJdbcUrlUtility.parseUriProperty(
69-
URL, BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME);
67+
String proxyHost = ds.getProxyHost();
7068
if (proxyHost != null) {
7169
proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME, proxyHost);
7270
}
73-
String proxyPort =
74-
BigQueryJdbcUrlUtility.parseUriProperty(
75-
URL, BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME);
71+
String proxyPort = ds.getProxyPort();
7672
if (proxyPort != null) {
7773
if (!Pattern.compile(validPortRegex).matcher(proxyPort).find()) {
7874
throw new IllegalArgumentException(
79-
"Illegal port number provided %s. Please provide a valid port number.");
75+
String.format(
76+
"Illegal port number provided %s. Please provide a valid port number.", proxyPort));
8077
}
8178
proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME, proxyPort);
8279
}
83-
String proxyUid =
84-
BigQueryJdbcUrlUtility.parseUriProperty(
85-
URL, BigQueryJdbcUrlUtility.PROXY_USER_ID_PROPERTY_NAME);
80+
String proxyUid = ds.getProxyUid();
8681
if (proxyUid != null) {
8782
proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_USER_ID_PROPERTY_NAME, proxyUid);
8883
}
89-
String proxyPwd =
90-
BigQueryJdbcUrlUtility.parseUriProperty(
91-
URL, BigQueryJdbcUrlUtility.PROXY_PASSWORD_PROPERTY_NAME);
84+
String proxyPwd = ds.getProxyPwd();
9285
if (proxyPwd != null) {
9386
proxyProperties.put(BigQueryJdbcUrlUtility.PROXY_PASSWORD_PROPERTY_NAME, proxyPwd);
9487
}
@@ -114,6 +107,10 @@ static Map<String, String> parseProxyProperties(String URL, String callerClassNa
114107
return proxyProperties;
115108
}
116109

110+
static Map<String, String> parseProxyProperties(String URL, String callerClassName) {
111+
return parseProxyProperties(DataSource.fromUrl(URL), callerClassName);
112+
}
113+
117114
static HttpTransportOptions getHttpTransportOptions(
118115
Map<String, String> proxyProperties,
119116
String sslTrustStorePath,

0 commit comments

Comments
 (0)