Skip to content

Commit f3979dc

Browse files
Refactor Database Starters (#67)
* Refactor Database Starters --------- Signed-off-by: Anders Swanson <anders.swanson@oracle.com>
1 parent e9f6b9b commit f3979dc

File tree

12 files changed

+214
-82
lines changed

12 files changed

+214
-82
lines changed

database/starters/oracle-spring-boot-starter-aqjms/pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,10 @@
5151

5252
<dependencies>
5353

54-
<dependency>
55-
<groupId>org.springframework.boot</groupId>
56-
<artifactId>spring-boot-starter</artifactId>
57-
</dependency>
5854
<dependency>
5955
<groupId>com.oracle.database.spring</groupId>
6056
<artifactId>oracle-spring-boot-starter-ucp</artifactId>
6157
<version>${project.version}</version>
62-
<type>pom</type>
63-
<scope>compile</scope>
6458
</dependency>
6559
<dependency>
6660
<groupId>org.springframework</groupId>
@@ -88,6 +82,12 @@
8882
<groupId>jakarta.management.j2ee</groupId>
8983
<artifactId>jakarta.management.j2ee-api</artifactId>
9084
</dependency>
85+
86+
<dependency>
87+
<groupId>org.springframework.boot</groupId>
88+
<artifactId>spring-boot-starter-test</artifactId>
89+
<scope>test</scope>
90+
</dependency>
9191
</dependencies>
9292

9393
<build>

database/starters/oracle-spring-boot-starter-aqjms/src/main/java/com/oracle/spring/aqjms/AqJmsAutoConfiguration.java

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,19 @@
33

44
package com.oracle.spring.aqjms;
55

6+
import javax.sql.DataSource;
7+
8+
import java.sql.SQLException;
9+
10+
import com.oracle.spring.ucp.UCPAutoConfiguration;
11+
import jakarta.annotation.PostConstruct;
612
import jakarta.jms.ConnectionFactory;
713

14+
import oracle.jdbc.pool.OracleDataSource;
15+
import oracle.ucp.jdbc.PoolDataSourceImpl;
816
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.boot.autoconfigure.AutoConfiguration;
18+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
919
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1020
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1121
import org.springframework.context.annotation.Bean;
@@ -14,39 +24,22 @@
1424
import oracle.jakarta.jms.AQjmsFactory;
1525
import oracle.ucp.jdbc.PoolDataSource;
1626
import oracle.ucp.jdbc.PoolDataSourceFactory;
27+
import org.springframework.util.ClassUtils;
1728

1829
/**
1930
* This class autowires the configuration and injects both a JDBC DataSource
2031
* and a JMSConnectionFactory into your application.
2132
*/
22-
@Configuration
23-
@EnableConfigurationProperties(AqJmsConfigurationProperties.class)
33+
@AutoConfiguration
34+
@ConditionalOnClass({UCPAutoConfiguration.class})
2435
public class AqJmsAutoConfiguration {
25-
26-
@Autowired
27-
private AqJmsConfigurationProperties properties;
28-
29-
@Bean
30-
@ConditionalOnMissingBean
31-
public PoolDataSource dataSource() {
32-
PoolDataSource ds = PoolDataSourceFactory.getPoolDataSource();
33-
try {
34-
ds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
35-
ds.setURL(properties.getUrl());
36-
ds.setUser(properties.getUsername());
37-
ds.setPassword(properties.getPassword());
38-
} catch (Exception ignore) {}
39-
return ds;
40-
}
41-
4236
@Bean
4337
@ConditionalOnMissingBean
44-
public ConnectionFactory aqJmsConnectionFactory(PoolDataSource ds) {
38+
public ConnectionFactory aqJmsConnectionFactory(DataSource ds) {
4539
ConnectionFactory connectionFactory = null;
4640
try {
4741
connectionFactory = AQjmsFactory.getConnectionFactory(ds);
4842
} catch (Exception ignore) {}
4943
return connectionFactory;
5044
}
51-
5245
}

database/starters/oracle-spring-boot-starter-aqjms/src/main/java/com/oracle/spring/aqjms/AqJmsConfigurationProperties.java

Lines changed: 0 additions & 51 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) 2024, Oracle and/or its affiliates.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
3+
package com.oracle.spring.aqjms;
4+
5+
import javax.sql.DataSource;
6+
7+
import com.oracle.spring.ucp.UCPAutoConfiguration;
8+
import jakarta.jms.ConnectionFactory;
9+
import oracle.ucp.jdbc.PoolDataSourceImpl;
10+
import org.junit.jupiter.api.Assertions;
11+
import org.junit.jupiter.api.Test;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.test.context.SpringBootTest;
14+
import org.springframework.context.annotation.Import;
15+
import org.springframework.test.context.TestPropertySource;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
19+
@SpringBootTest(classes = {AqJmsAutoConfiguration.class, UCPAutoConfiguration.class})
20+
@Import(Config.class)
21+
public class AqJmsAutoConfigurationTest {
22+
@Autowired
23+
DataSource dataSource;
24+
25+
@Autowired
26+
ConnectionFactory connectionFactory;
27+
28+
@Test
29+
void dataSourceConfigured() {
30+
assertThat(dataSource).isNotNull();
31+
if (dataSource instanceof PoolDataSourceImpl ds) {
32+
assertThat(ds.getInitialPoolSize()).isEqualTo(15);
33+
assertThat(ds.getConnectionFactoryClassName()).isEqualTo("oracle.jdbc.pool.OracleDataSource");
34+
assertThat(ds.getConnectionPoolName()).isEqualTo("SpringConnectionPool");
35+
} else {
36+
Assertions.fail("Datasource is not a PoolDataSourceImpl: " + dataSource.getClass().getName());
37+
}
38+
}
39+
40+
@Test
41+
void aqjmsFactoryConfigured() {
42+
assertThat(connectionFactory).isNotNull();
43+
}
44+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.oracle.spring.aqjms;
2+
3+
import javax.sql.DataSource;
4+
5+
import oracle.ucp.jdbc.PoolDataSourceFactory;
6+
import org.springframework.boot.test.context.TestConfiguration;
7+
import org.springframework.context.annotation.Bean;
8+
9+
@TestConfiguration
10+
public class Config {
11+
@Bean
12+
DataSource dataSource() {
13+
return PoolDataSourceFactory.getPoolDataSource();
14+
}
15+
}

database/starters/oracle-spring-boot-starter-ucp/pom.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@
4848
</scm>
4949

5050
<dependencies>
51+
<dependency>
52+
<groupId>org.springframework.boot</groupId>
53+
<artifactId>spring-boot-configuration-processor</artifactId>
54+
</dependency>
5155
<dependency>
5256
<groupId>org.springframework.boot</groupId>
5357
<artifactId>spring-boot-starter</artifactId>
@@ -62,6 +66,18 @@
6266
<groupId>com.oracle.database.jdbc</groupId>
6367
<artifactId>ucp</artifactId>
6468
<scope>compile</scope>
69+
<exclusions>
70+
<exclusion>
71+
<groupId>com.zaxxer</groupId>
72+
<artifactId>HikariCP</artifactId>
73+
</exclusion>
74+
</exclusions>
75+
</dependency>
76+
77+
<dependency>
78+
<groupId>org.springframework.boot</groupId>
79+
<artifactId>spring-boot-starter-test</artifactId>
80+
<scope>test</scope>
6581
</dependency>
6682
</dependencies>
6783
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright (c) 2024, Oracle and/or its affiliates.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
3+
package com.oracle.spring.ucp;
4+
5+
import javax.sql.DataSource;
6+
7+
import java.sql.SQLException;
8+
9+
import jakarta.annotation.PostConstruct;
10+
import oracle.jdbc.pool.OracleDataSource;
11+
import oracle.ucp.jdbc.PoolDataSourceImpl;
12+
import org.springframework.boot.autoconfigure.AutoConfiguration;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
14+
15+
@AutoConfiguration
16+
@ConditionalOnClass({OracleDataSource.class})
17+
public class UCPAutoConfiguration {
18+
private final DataSource dataSource;
19+
20+
public UCPAutoConfiguration(DataSource dataSource) {
21+
this.dataSource = dataSource;
22+
}
23+
24+
@PostConstruct
25+
public void init() {
26+
if (dataSource instanceof PoolDataSourceImpl ds) {
27+
try {
28+
ds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
29+
setIfNull(ds.getConnectionPoolName(), () -> ds.setConnectionPoolName("SpringConnectionPool"));
30+
setIfNull(ds.getInitialPoolSize(), () -> ds.setInitialPoolSize(15));
31+
} catch (SQLException e) {
32+
throw new RuntimeException(e);
33+
}
34+
}
35+
}
36+
37+
private <T> void setIfNull(T value, Setter setter) throws SQLException {
38+
if (value == null) {
39+
setter.set();
40+
} else if (value instanceof Integer intValue) {
41+
if (intValue < 1) {
42+
setter.set();
43+
}
44+
}
45+
}
46+
47+
private interface Setter {
48+
void set() throws SQLException;
49+
}
50+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2+
com.oracle.spring.ucp.UCPAutoConfiguration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.oracle.spring.ucp.UCPAutoConfiguration
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.oracle.spring.ucp;
2+
3+
import javax.sql.DataSource;
4+
5+
import oracle.ucp.jdbc.PoolDataSourceFactory;
6+
import org.springframework.boot.test.context.TestConfiguration;
7+
import org.springframework.context.annotation.Bean;
8+
9+
@TestConfiguration
10+
public class Config {
11+
@Bean
12+
DataSource dataSource() {
13+
return PoolDataSourceFactory.getPoolDataSource();
14+
}
15+
}

0 commit comments

Comments
 (0)