Skip to content

Commit 3706343

Browse files
authored
Merge pull request #51 from domaframework/improve-dialect-autoconfig
Improve Dialect configuration
2 parents 6bb1820 + 7e94fdf commit 3706343

File tree

3 files changed

+138
-52
lines changed

3 files changed

+138
-52
lines changed

doma-spring-boot-autoconfigure/src/main/java/org/seasar/doma/boot/autoconfigure/DomaAutoConfiguration.java

Lines changed: 69 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@
1616
package org.seasar.doma.boot.autoconfigure;
1717

1818
import javax.sql.DataSource;
19+
20+
import org.apache.commons.logging.Log;
21+
import org.apache.commons.logging.LogFactory;
1922
import org.seasar.doma.boot.DomaPersistenceExceptionTranslator;
2023
import org.seasar.doma.boot.TryLookupEntityListenerProvider;
24+
import org.seasar.doma.boot.autoconfigure.DomaProperties.DialectType;
2125
import org.seasar.doma.boot.event.DomaEventEntityListener;
2226
import org.seasar.doma.boot.event.DomaEventListenerFactory;
2327
import org.seasar.doma.jdbc.Config;
@@ -26,16 +30,27 @@
2630
import org.seasar.doma.jdbc.SqlFileRepository;
2731
import org.seasar.doma.jdbc.criteria.Entityql;
2832
import org.seasar.doma.jdbc.criteria.NativeSql;
33+
import org.seasar.doma.jdbc.dialect.Db2Dialect;
2934
import org.seasar.doma.jdbc.dialect.Dialect;
35+
import org.seasar.doma.jdbc.dialect.H2Dialect;
36+
import org.seasar.doma.jdbc.dialect.HsqldbDialect;
37+
import org.seasar.doma.jdbc.dialect.MssqlDialect;
38+
import org.seasar.doma.jdbc.dialect.MysqlDialect;
39+
import org.seasar.doma.jdbc.dialect.OracleDialect;
40+
import org.seasar.doma.jdbc.dialect.PostgresDialect;
41+
import org.seasar.doma.jdbc.dialect.SqliteDialect;
42+
import org.seasar.doma.jdbc.dialect.StandardDialect;
3043
import org.springframework.beans.factory.annotation.Autowired;
3144
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3245
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3346
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3447
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3548
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
3649
import org.springframework.boot.context.properties.EnableConfigurationProperties;
50+
import org.springframework.boot.jdbc.DatabaseDriver;
3751
import org.springframework.context.annotation.Bean;
3852
import org.springframework.context.annotation.Configuration;
53+
import org.springframework.core.env.Environment;
3954
import org.springframework.dao.support.PersistenceExceptionTranslator;
4055
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
4156

@@ -51,13 +66,49 @@
5166
@EnableConfigurationProperties(DomaProperties.class)
5267
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
5368
public class DomaAutoConfiguration {
69+
70+
private static final Log logger = LogFactory.getLog(DomaAutoConfiguration.class);
71+
5472
@Autowired
5573
private DomaProperties domaProperties;
5674

5775
@Bean
5876
@ConditionalOnMissingBean
59-
public Dialect dialect() {
60-
return domaProperties.getDialect().create();
77+
public Dialect dialect(Environment environment) {
78+
DialectType dialectType = domaProperties.getDialect();
79+
if (dialectType != null) {
80+
return dialectType.create();
81+
}
82+
String url = environment.getProperty("spring.datasource.url");
83+
if (url != null) {
84+
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(url);
85+
switch (databaseDriver) {
86+
case DB2:
87+
return new Db2Dialect();
88+
case H2:
89+
return new H2Dialect();
90+
case HSQLDB:
91+
return new HsqldbDialect();
92+
case SQLSERVER:
93+
case JTDS:
94+
return new MssqlDialect();
95+
case MYSQL:
96+
return new MysqlDialect();
97+
case ORACLE:
98+
return new OracleDialect();
99+
case POSTGRESQL:
100+
return new PostgresDialect();
101+
case SQLITE:
102+
return new SqliteDialect();
103+
default:
104+
break;
105+
}
106+
}
107+
if (logger.isWarnEnabled()) {
108+
logger.warn(
109+
"StandardDialect was selected because no explicit configuration and it is not possible to guess from 'spring.datasource.url property'");
110+
}
111+
return new StandardDialect();
61112
}
62113

63114
@Bean
@@ -128,20 +179,20 @@ public DomaConfig config(DataSource dataSource, Dialect dialect,
128179
return domaConfigBuilder.build();
129180
}
130181

131-
@Configuration
132-
@ConditionalOnClass({ Entityql.class, NativeSql.class })
133-
public static class CriteriaConfiguration {
134-
135-
@Bean
136-
@ConditionalOnMissingBean(Entityql.class)
137-
public Entityql entityql(Config config) {
138-
return new Entityql(config);
139-
}
140-
141-
@Bean
142-
@ConditionalOnMissingBean(NativeSql.class)
143-
public NativeSql nativeSql(Config config) {
144-
return new NativeSql(config);
145-
}
146-
}
182+
@Configuration
183+
@ConditionalOnClass({ Entityql.class, NativeSql.class })
184+
public static class CriteriaConfiguration {
185+
186+
@Bean
187+
@ConditionalOnMissingBean(Entityql.class)
188+
public Entityql entityql(Config config) {
189+
return new Entityql(config);
190+
}
191+
192+
@Bean
193+
@ConditionalOnMissingBean(NativeSql.class)
194+
public NativeSql nativeSql(Config config) {
195+
return new NativeSql(config);
196+
}
197+
}
147198
}

doma-spring-boot-autoconfigure/src/main/java/org/seasar/doma/boot/autoconfigure/DomaProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class DomaProperties {
3535
/**
3636
* Dialect of database used by Doma.
3737
*/
38-
private DialectType dialect = DialectType.STANDARD;
38+
private DialectType dialect;
3939

4040
/**
4141
* Type of {@link SqlFileRepository}.

doma-spring-boot-autoconfigure/src/test/java/org/seasar/doma/boot/autoconfigure/DomaAutoConfigurationTest.java

Lines changed: 68 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.sql.SQLException;
2222
import java.sql.SQLTimeoutException;
2323
import java.util.Collections;
24+
import java.util.HashMap;
2425
import java.util.Map;
2526

2627
import javax.sql.DataSource;
@@ -29,10 +30,18 @@
2930
import org.junit.Before;
3031
import org.junit.Test;
3132
import org.seasar.doma.boot.DomaPersistenceExceptionTranslator;
32-
import org.seasar.doma.jdbc.*;
33+
import org.seasar.doma.jdbc.Config;
34+
import org.seasar.doma.jdbc.EntityListenerProvider;
35+
import org.seasar.doma.jdbc.GreedyCacheSqlFileRepository;
36+
import org.seasar.doma.jdbc.JdbcException;
37+
import org.seasar.doma.jdbc.Naming;
38+
import org.seasar.doma.jdbc.NoCacheSqlFileRepository;
39+
import org.seasar.doma.jdbc.SqlFileRepository;
40+
import org.seasar.doma.jdbc.UtilLoggingJdbcLogger;
3341
import org.seasar.doma.jdbc.criteria.Entityql;
3442
import org.seasar.doma.jdbc.criteria.NativeSql;
3543
import org.seasar.doma.jdbc.dialect.Dialect;
44+
import org.seasar.doma.jdbc.dialect.H2Dialect;
3645
import org.seasar.doma.jdbc.dialect.MysqlDialect;
3746
import org.seasar.doma.jdbc.dialect.PostgresDialect;
3847
import org.seasar.doma.jdbc.dialect.StandardDialect;
@@ -197,28 +206,54 @@ public void testSQLExceptionTranslator() {
197206
}
198207
}
199208

200-
@Test
201-
public void testAutoRegisteredCriteriaAPI() {
202-
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
203-
this.context.refresh();
204-
Entityql entityql = this.context.getBean(Entityql.class);
205-
assertNotNull(entityql);
206-
NativeSql nativeSql = this.context.getBean(NativeSql.class);
207-
assertNotNull(nativeSql);
208-
}
209+
@Test
210+
public void testAutoRegisteredCriteriaAPI() {
211+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
212+
this.context.refresh();
213+
Entityql entityql = this.context.getBean(Entityql.class);
214+
assertNotNull(entityql);
215+
NativeSql nativeSql = this.context.getBean(NativeSql.class);
216+
assertNotNull(nativeSql);
217+
}
218+
219+
@Test
220+
public void testCriteriaAPIWithConfig() {
221+
this.context.register(MyCriteriaAPIConfig.class, DomaAutoConfiguration.class,
222+
DataSourceAutoConfiguration.class);
223+
this.context.refresh();
224+
Map<String, Entityql> entityqlBeans = this.context.getBeansOfType(Entityql.class);
225+
assertEquals(1, entityqlBeans.size());
226+
assertNotNull(entityqlBeans.get("myEntityql"));
227+
Map<String, NativeSql> nativeSqlBeans = this.context.getBeansOfType(NativeSql.class);
228+
assertEquals(1, nativeSqlBeans.size());
229+
assertNotNull(nativeSqlBeans.get("myNativeSql"));
230+
}
209231

210-
@Test
211-
public void testCriteriaAPIWithConfig() {
212-
this.context.register(MyCriteriaAPIConfig.class, DomaAutoConfiguration.class,
213-
DataSourceAutoConfiguration.class);
214-
this.context.refresh();
215-
Map<String, Entityql> entityqlBeans = this.context.getBeansOfType(Entityql.class);
216-
assertEquals(1, entityqlBeans.size());
217-
assertNotNull(entityqlBeans.get("myEntityql"));
218-
Map<String, NativeSql> nativeSqlBeans = this.context.getBeansOfType(NativeSql.class);
219-
assertEquals(1, nativeSqlBeans.size());
220-
assertNotNull(nativeSqlBeans.get("myNativeSql"));
221-
}
232+
@Test
233+
public void testDialectByDataSourceUrl() {
234+
MutablePropertySources sources = context.getEnvironment()
235+
.getPropertySources();
236+
sources.addFirst(new MapPropertySource("test",
237+
Collections.singletonMap("spring.datasource.url", "jdbc:h2:mem:example")));
238+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
239+
this.context.refresh();
240+
Dialect dialect = this.context.getBean(Dialect.class);
241+
assertThat(dialect, is(instanceOf(H2Dialect.class)));
242+
}
243+
244+
@Test
245+
public void testDialectByDomaPropertiesIgnoreDataSourceUrl() {
246+
MutablePropertySources sources = context.getEnvironment()
247+
.getPropertySources();
248+
Map<String, Object> source = new HashMap<>();
249+
source.put("spring.datasource.url", "jdbc:h2:mem:example");
250+
source.put("doma.dialect", "POSTGRES");
251+
sources.addFirst(new MapPropertySource("test", source));
252+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
253+
this.context.refresh();
254+
Dialect dialect = this.context.getBean(Dialect.class);
255+
assertThat(dialect, is(instanceOf(PostgresDialect.class)));
256+
}
222257

223258
@After
224259
public void tearDown() {
@@ -287,17 +322,17 @@ public static void addEnvironment(ConfigurableApplicationContext context,
287322
}
288323
}
289324

290-
@Configuration
291-
public static class MyCriteriaAPIConfig {
325+
@Configuration
326+
public static class MyCriteriaAPIConfig {
292327

293-
@Bean
294-
public Entityql myEntityql(Config config) {
295-
return new Entityql(config);
296-
}
328+
@Bean
329+
public Entityql myEntityql(Config config) {
330+
return new Entityql(config);
331+
}
297332

298-
@Bean
299-
public NativeSql myNativeSql(Config config) {
300-
return new NativeSql(config);
301-
}
302-
}
333+
@Bean
334+
public NativeSql myNativeSql(Config config) {
335+
return new NativeSql(config);
336+
}
337+
}
303338
}

0 commit comments

Comments
 (0)