Skip to content

Commit 85d481c

Browse files
authored
Merge branch 'main' into feat/jspecify-gax-auth
2 parents e937298 + 5e54547 commit 85d481c

18 files changed

Lines changed: 576 additions & 69 deletions

File tree

google-cloud-jar-parent/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
<dependency>
8787
<groupId>ch.qos.logback</groupId>
8888
<artifactId>logback-core</artifactId>
89-
<version>1.5.33</version>
89+
<version>1.5.34</version>
9090
<scope>test</scope>
9191
</dependency>
9292
<dependency>

java-bigquery-jdbc/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ package:
7070
cp target/google-cloud-bigquery-jdbc-*-all.jar $(PACKAGE_DESTINATION)/
7171

7272
build-it-standalone:
73-
mvn -Dmaven.test.skip=true package -f pom-it.xml
73+
mvn -Dmaven.test.skip=true package -f pom-it.xml -Dbigquery-jdbc.version=$(JDBC_DRIVER_VERSION)
7474

7575
run-it-standalone:
7676
java -cp $(JDBC_JAR):target-it/* org.junit.platform.console.ConsoleLauncher --select-class com.google.cloud.bigquery.jdbc.it.suites.ITDriverAgnosticTests

java-bigquery-jdbc/pom-it.xml

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1515
<maven.compiler.source>8</maven.compiler.source>
1616
<maven.compiler.target>8</maven.compiler.target>
17+
<bigquery-jdbc.version>1.2.0-SNAPSHOT</bigquery-jdbc.version><!-- {x-version-update:google-cloud-bigquery-jdbc:current} -->
1718
</properties>
1819

1920
<dependencies>
2021
<!-- Include the test classes from the main project -->
2122
<dependency>
2223
<groupId>com.google.cloud</groupId>
2324
<artifactId>google-cloud-bigquery-jdbc</artifactId>
24-
<version>1.0.0</version><!-- {x-version-update:google-cloud-bigquery-jdbc:current} -->
25+
<version>${bigquery-jdbc.version}</version>
2526
<type>test-jar</type>
2627
<scope>compile</scope>
2728
</dependency>
@@ -88,6 +89,20 @@
8889
<build>
8990
<directory>target-it</directory>
9091
<plugins>
92+
<plugin>
93+
<groupId>org.apache.maven.plugins</groupId>
94+
<artifactId>maven-compiler-plugin</artifactId>
95+
<executions>
96+
<execution>
97+
<id>default-compile</id>
98+
<phase>none</phase>
99+
</execution>
100+
<execution>
101+
<id>default-testCompile</id>
102+
<phase>none</phase>
103+
</execution>
104+
</executions>
105+
</plugin>
91106
<plugin>
92107
<groupId>org.apache.maven.plugins</groupId>
93108
<artifactId>maven-shade-plugin</artifactId>
@@ -99,21 +114,26 @@
99114
<goal>shade</goal>
100115
</goals>
101116
<configuration>
102-
<!--
103-
We exclude the main bigquery-jdbc framework classes.
104-
This jar should ONLY contain tests and their dependencies (Junit, Mockito, Truth),
105-
plus the test classes themselves. When running, the ACTUAL JDBC driver jar
106-
will be placed on the classpath.
107-
-->
108117
<createDependencyReducedPom>false</createDependencyReducedPom>
109-
<artifactSet>
110-
<excludes>
111-
<exclude>com.google.cloud:google-cloud-bigquery</exclude>
112-
<exclude>com.google.cloud:google-cloud-bigquerystorage</exclude>
113-
<exclude>io.grpc:*</exclude>
114-
<exclude>com.google.protobuf:*</exclude>
115-
</excludes>
116-
</artifactSet>
118+
<!-- Shading everything except junit & integration tests to avoid version conflicts -->
119+
<relocations>
120+
<relocation>
121+
<pattern>com.</pattern>
122+
<shadedPattern>com.google.bqjdbc.shaded.com.</shadedPattern>
123+
<excludes>com.google.cloud.bigquery.jdbc.it.**</excludes>
124+
</relocation>
125+
<relocation>
126+
<pattern>org.</pattern>
127+
<shadedPattern>com.google.bqjdbc.shaded.org.</shadedPattern>
128+
<excludes>
129+
<exclude>org.junit.**</exclude>
130+
</excludes>
131+
</relocation>
132+
<relocation>
133+
<pattern>io.</pattern>
134+
<shadedPattern>com.google.bqjdbc.shaded.io.</shadedPattern>
135+
</relocation>
136+
</relocations>
117137
<filters>
118138
<filter>
119139
<artifact>*:*</artifact>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
205205
boolean filterTablesOnDefaultDataset;
206206
String sslTrustStorePath;
207207
String sslTrustStorePassword;
208+
String sslTrustStoreType;
209+
String sslTrustStoreProvider;
208210
long maxBytesBilled;
209211
Map<String, String> labels;
210212
Integer httpConnectTimeout;
@@ -277,6 +279,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
277279

278280
this.sslTrustStorePath = ds.getSSLTrustStorePath();
279281
this.sslTrustStorePassword = ds.getSSLTrustStorePassword();
282+
this.sslTrustStoreType = ds.getSSLTrustStoreType();
283+
this.sslTrustStoreProvider = ds.getSSLTrustStoreProvider();
280284
this.httpConnectTimeout = ds.getHttpConnectTimeout();
281285
this.httpReadTimeout = ds.getHttpReadTimeout();
282286

@@ -285,6 +289,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
285289
proxyProperties,
286290
this.sslTrustStorePath,
287291
this.sslTrustStorePassword,
292+
this.sslTrustStoreType,
293+
this.sslTrustStoreProvider,
288294
this.httpConnectTimeout,
289295
this.httpReadTimeout,
290296
this.connectionClassName);
@@ -337,6 +343,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
337343
proxyProperties,
338344
this.sslTrustStorePath,
339345
this.sslTrustStorePassword,
346+
this.sslTrustStoreType,
347+
this.sslTrustStoreProvider,
340348
this.connectionClassName);
341349
this.enableSession = ds.getEnableSession();
342350
this.unsupportedHTAPIFallback = ds.getUnsupportedHTAPIFallback();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void initialize(TableName parentTable, BigQueryWriteClient client, RetrySettings
6060
WriteStream writeStream = client.createWriteStream(createWriteStreamRequest);
6161

6262
JsonStreamWriter.Builder jsonStreamWriterBuilder =
63-
JsonStreamWriter.newBuilder(writeStream.getName(), writeStream.getTableSchema());
63+
JsonStreamWriter.newBuilder(writeStream.getName(), writeStream.getTableSchema(), client);
6464

6565
if (retrySettings != null) {
6666
jsonStreamWriterBuilder.setRetrySettings(retrySettings);

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ static HttpTransportOptions getHttpTransportOptions(
130130
Map<String, String> proxyProperties,
131131
String sslTrustStorePath,
132132
String sslTrustStorePassword,
133+
String sslTrustStoreType,
134+
String sslTrustStoreProvider,
133135
Integer connectTimeout,
134136
Integer readTimeout,
135137
String callerClassName) {
@@ -143,7 +145,12 @@ static HttpTransportOptions getHttpTransportOptions(
143145
if (hasProxyOrSsl) {
144146
httpTransportOptionsBuilder.setHttpTransportFactory(
145147
getHttpTransportFactory(
146-
proxyProperties, sslTrustStorePath, sslTrustStorePassword, callerClassName));
148+
proxyProperties,
149+
sslTrustStorePath,
150+
sslTrustStorePassword,
151+
sslTrustStoreType,
152+
sslTrustStoreProvider,
153+
callerClassName));
147154
} else {
148155
httpTransportOptionsBuilder.setHttpTransportFactory(() -> DEFAULT_TRANSPORT);
149156
}
@@ -162,6 +169,8 @@ private static HttpTransportFactory getHttpTransportFactory(
162169
Map<String, String> proxyProperties,
163170
String sslTrustStorePath,
164171
String sslTrustStorePassword,
172+
String sslTrustStoreType,
173+
String sslTrustStoreProvider,
165174
String callerClassName) {
166175
LOG.finest("++enter++\t" + callerClassName);
167176
HttpClientBuilder httpClientBuilder = HttpClients.custom();
@@ -182,7 +191,7 @@ private static HttpTransportFactory getHttpTransportFactory(
182191

183192
if (sslTrustStorePath != null) {
184193
try (FileInputStream trustStoreStream = new FileInputStream(sslTrustStorePath)) {
185-
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
194+
KeyStore trustStore = loadKeyStore(sslTrustStoreType, sslTrustStoreProvider);
186195
char[] trustStorePasswordChars =
187196
sslTrustStorePassword != null ? sslTrustStorePassword.toCharArray() : null;
188197
trustStore.load(trustStoreStream, trustStorePasswordChars);
@@ -243,6 +252,8 @@ static TransportChannelProvider getTransportChannelProvider(
243252
Map<String, String> proxyProperties,
244253
String sslTrustStorePath,
245254
String sslTrustStorePassword,
255+
String sslTrustStoreType,
256+
String sslTrustStoreProvider,
246257
String callerClassName) {
247258
LOG.finest("++enter++\t" + callerClassName);
248259
boolean hasProxy = proxyProperties.containsKey(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME);
@@ -271,7 +282,7 @@ public ProxiedSocketAddress proxyFor(SocketAddress socketAddress) {
271282
instanceof io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder) {
272283
try (FileInputStream trustStoreStream =
273284
new FileInputStream(sslTrustStorePath)) {
274-
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
285+
KeyStore trustStore = loadKeyStore(sslTrustStoreType, sslTrustStoreProvider);
275286
char[] trustStorePasswordChars =
276287
sslTrustStorePassword != null
277288
? sslTrustStorePassword.toCharArray()
@@ -300,6 +311,15 @@ public ProxiedSocketAddress proxyFor(SocketAddress socketAddress) {
300311
return transportChannelProvider;
301312
}
302313

314+
private static KeyStore loadKeyStore(String type, String provider)
315+
throws GeneralSecurityException {
316+
String resolvedType =
317+
(type != null && !type.trim().isEmpty()) ? type.trim() : KeyStore.getDefaultType();
318+
return (provider != null && !provider.trim().isEmpty())
319+
? KeyStore.getInstance(resolvedType, provider.trim())
320+
: KeyStore.getInstance(resolvedType);
321+
}
322+
303323
private static HttpConnectProxiedSocketAddress getHttpConnectProxiedSocketAddress(
304324
InetSocketAddress socketAddress, Map<String, String> proxyProperties) {
305325
String proxyHost = proxyProperties.get(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME);

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.common.base.Splitter;
2323
import com.google.common.collect.ImmutableList;
2424
import com.google.common.net.UrlEscapers;
25+
import java.security.KeyStore;
2526
import java.util.Arrays;
2627
import java.util.Collections;
2728
import java.util.HashMap;
@@ -173,6 +174,8 @@ protected boolean removeEldestEntry(Map.Entry<String, Map<String, String>> eldes
173174
static final String REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME = "RequestGoogleDriveScope";
174175
static final String SSL_TRUST_STORE_PROPERTY_NAME = "SSLTrustStore";
175176
static final String SSL_TRUST_STORE_PWD_PROPERTY_NAME = "SSLTrustStorePwd";
177+
static final String SSL_TRUST_STORE_TYPE_PROPERTY_NAME = "SSLTrustStoreType";
178+
static final String SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME = "SSLTrustStoreProvider";
176179
static final int DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE = 0;
177180
static final String MAX_BYTES_BILLED_PROPERTY_NAME = "MaximumBytesBilled";
178181
static final Long DEFAULT_MAX_BYTES_BILLED_VALUE = 0L;
@@ -607,6 +610,17 @@ protected boolean removeEldestEntry(Map.Entry<String, Map<String, String>> eldes
607610
"The password for accessing the Java TrustStore that is specified using"
608611
+ " the property SSLTrustStore.")
609612
.build(),
613+
BigQueryConnectionProperty.newBuilder()
614+
.setName(SSL_TRUST_STORE_TYPE_PROPERTY_NAME)
615+
.setDescription(
616+
"The type of the Java TrustStore specified using the property SSLTrustStore.")
617+
.setLazyDefaultValue(KeyStore::getDefaultType)
618+
.build(),
619+
BigQueryConnectionProperty.newBuilder()
620+
.setName(SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME)
621+
.setDescription(
622+
"The security provider of the Java TrustStore specified using the property SSLTrustStore.")
623+
.build(),
610624
BigQueryConnectionProperty.newBuilder()
611625
.setName(HTTP_CONNECT_TIMEOUT_PROPERTY_NAME)
612626
.setDescription(

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ public class DataSource implements javax.sql.DataSource {
8989
private Integer metadataFetchThreadCount;
9090
private String sslTrustStorePath;
9191
private String sslTrustStorePassword;
92+
private String sslTrustStoreType;
93+
private String sslTrustStoreProvider;
9294
private Map<String, String> labels;
9395
private String requestReason;
9496
private Integer timeout;
@@ -261,6 +263,12 @@ public class DataSource implements javax.sql.DataSource {
261263
.put(
262264
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PWD_PROPERTY_NAME,
263265
DataSource::setSSLTrustStorePassword)
266+
.put(
267+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_TYPE_PROPERTY_NAME,
268+
DataSource::setSSLTrustStoreType)
269+
.put(
270+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME,
271+
DataSource::setSSLTrustStoreProvider)
264272
.put(
265273
BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME,
266274
(ds, val) ->
@@ -588,6 +596,15 @@ Properties createProperties() {
588596
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PWD_PROPERTY_NAME,
589597
String.valueOf(this.sslTrustStorePassword));
590598
}
599+
if (this.sslTrustStoreType != null) {
600+
connectionProperties.setProperty(
601+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_TYPE_PROPERTY_NAME, this.sslTrustStoreType);
602+
}
603+
if (this.sslTrustStoreProvider != null) {
604+
connectionProperties.setProperty(
605+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME,
606+
this.sslTrustStoreProvider);
607+
}
591608
if (this.labels != null) {
592609
connectionProperties.setProperty(
593610
BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME, serializeMap(this.labels));
@@ -1124,6 +1141,22 @@ public void setSSLTrustStorePassword(String sslTrustStorePassword) {
11241141
this.sslTrustStorePassword = sslTrustStorePassword;
11251142
}
11261143

1144+
public String getSSLTrustStoreType() {
1145+
return sslTrustStoreType;
1146+
}
1147+
1148+
public void setSSLTrustStoreType(String sslTrustStoreType) {
1149+
this.sslTrustStoreType = sslTrustStoreType;
1150+
}
1151+
1152+
public String getSSLTrustStoreProvider() {
1153+
return sslTrustStoreProvider;
1154+
}
1155+
1156+
public void setSSLTrustStoreProvider(String sslTrustStoreProvider) {
1157+
this.sslTrustStoreProvider = sslTrustStoreProvider;
1158+
}
1159+
11271160
public Map<String, String> getLabels() {
11281161
return labels;
11291162
}

java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcBaseTest.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
package com.google.cloud.bigquery.jdbc;
1818

1919
import com.google.cloud.bigquery.BigQuery;
20+
import com.google.cloud.bigquery.BigQueryOptions;
2021
import com.google.cloud.bigquery.jdbc.utils.TestUtilities;
2122
import com.google.cloud.bigquery.jdbc.utils.URIBuilder;
23+
import java.lang.reflect.Method;
24+
import java.sql.Connection;
2225
import java.sql.DriverManager;
23-
import java.sql.SQLException;
2426

2527
public class BigQueryJdbcBaseTest {
2628

@@ -48,12 +50,18 @@ public class BigQueryJdbcBaseTest {
4850

4951
protected static BigQuery getBigQuery(String connectionUrl) {
5052
try {
51-
return DriverManager.getConnection(connectionUrl)
52-
.unwrap(BigQueryConnection.class)
53-
.getBigQuery();
54-
} catch (SQLException e) {
55-
throw new RuntimeException("Failed to initialize BigQuery client", e);
53+
Class<?> bqConnClass = Class.forName("com.google.cloud.bigquery.jdbc.BigQueryConnection");
54+
Connection conn = DriverManager.getConnection(connectionUrl);
55+
Object unwrapped = conn.unwrap(bqConnClass);
56+
if (unwrapped != null) {
57+
Method method = bqConnClass.getDeclaredMethod("getBigQuery");
58+
method.setAccessible(true);
59+
return (BigQuery) method.invoke(unwrapped);
60+
}
61+
} catch (Throwable e) {
62+
// ignore for some set of tests; Proxy/TPC tests will fail if it doesn't work.
5663
}
64+
return BigQueryOptions.getDefaultInstance().getService();
5765
}
5866

5967
protected static URIBuilder getBaseUri() {

0 commit comments

Comments
 (0)