Skip to content

Commit 3d4615e

Browse files
authored
support dbcp2.BasicDataSource in jdbcio lineage (#33801)
1 parent 41cda9f commit 3d4615e

File tree

2 files changed

+51
-18
lines changed

2 files changed

+51
-18
lines changed

sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/JdbcUtil.java

+36-18
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.Lists;
7676
import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.io.ByteStreams;
7777
import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.io.Files;
78+
import org.apache.commons.dbcp2.BasicDataSource;
7879
import org.checkerframework.checker.nullness.qual.Nullable;
7980
import org.joda.time.DateTime;
8081
import org.joda.time.Duration;
@@ -712,24 +713,41 @@ void reportLineage(Lineage lineage, @Nullable KV<@Nullable String, String> table
712713
String maybeSqlInstance;
713714
String url;
714715
try {
715-
Class<?> hikariClass = Class.forName("com.zaxxer.hikari.HikariDataSource");
716-
if (!hikariClass.isInstance(dataSource)) {
717-
return null;
718-
}
719-
Method getProperties = hikariClass.getMethod("getDataSourceProperties");
720-
Properties properties = (Properties) getProperties.invoke(dataSource);
721-
if (properties == null) {
722-
return null;
723-
}
724-
maybeSqlInstance = properties.getProperty("cloudSqlInstance");
725-
if (maybeSqlInstance == null) {
726-
// not a cloudSqlInstance
727-
return null;
728-
}
729-
Method getUrl = hikariClass.getMethod("getJdbcUrl");
730-
url = (String) getUrl.invoke(dataSource);
731-
if (url == null) {
732-
return null;
716+
if (dataSource instanceof BasicDataSource) {
717+
// try default data source implementation
718+
BasicDataSource source = (BasicDataSource) dataSource;
719+
Method getProperties = source.getClass().getDeclaredMethod("getConnectionProperties");
720+
getProperties.setAccessible(true);
721+
Properties properties = (Properties) getProperties.invoke(dataSource);
722+
if (properties == null) {
723+
return null;
724+
}
725+
maybeSqlInstance = properties.getProperty("cloudSqlInstance");
726+
if (maybeSqlInstance == null) {
727+
// not a cloudSqlInstance
728+
return null;
729+
}
730+
url = source.getUrl();
731+
} else { // try recommended as per best practice
732+
Class<?> hikariClass = Class.forName("com.zaxxer.hikari.HikariDataSource");
733+
if (!hikariClass.isInstance(dataSource)) {
734+
return null;
735+
}
736+
Method getProperties = hikariClass.getMethod("getDataSourceProperties");
737+
Properties properties = (Properties) getProperties.invoke(dataSource);
738+
if (properties == null) {
739+
return null;
740+
}
741+
maybeSqlInstance = properties.getProperty("cloudSqlInstance");
742+
if (maybeSqlInstance == null) {
743+
// not a cloudSqlInstance
744+
return null;
745+
}
746+
Method getUrl = hikariClass.getMethod("getJdbcUrl");
747+
url = (String) getUrl.invoke(dataSource);
748+
if (url == null) {
749+
return null;
750+
}
733751
}
734752
} catch (ClassNotFoundException
735753
| InvocationTargetException

sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcUtilTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableList;
4848
import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableMap;
4949
import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.Lists;
50+
import org.apache.commons.dbcp2.BasicDataSource;
5051
import org.checkerframework.checker.nullness.qual.Nullable;
5152
import org.joda.time.DateTime;
5253
import org.junit.Rule;
@@ -329,6 +330,20 @@ public void testFqnFromHikariDataSourcePostgreSql() {
329330
components.getSegments());
330331
}
331332

333+
@Test
334+
public void testFqnFromBasicDataSourcePostgreSql() {
335+
BasicDataSource source = new BasicDataSource();
336+
source.setUrl("jdbc:postgresql:///postgres");
337+
source.setUsername("postgres");
338+
source.setConnectionProperties(
339+
"cloudSqlInstance=example.com:project:some-region:instance-name");
340+
JdbcUtil.FQNComponents components = JdbcUtil.FQNComponents.of(source);
341+
assertEquals("cloudsql_postgresql", components.getScheme());
342+
assertEquals(
343+
ImmutableList.of("example.com:project", "some-region", "instance-name", "postgres"),
344+
components.getSegments());
345+
}
346+
332347
@Test
333348
public void testFqnFromHikariDataSourceMySql() {
334349
HikariConfig config = new HikariConfig();

0 commit comments

Comments
 (0)