Skip to content

Commit 5c90f99

Browse files
committed
Roughly implemented it for now.
1 parent 7a45db8 commit 5c90f99

File tree

10 files changed

+269
-31
lines changed

10 files changed

+269
-31
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ target
99
.settings
1010
.factorypath
1111
.apt_generated
12+
.vscode/

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

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
package org.seasar.doma.boot.autoconfigure;
22

3+
import java.util.Optional;
4+
import java.util.function.Predicate;
5+
36
import javax.sql.DataSource;
47

58
import org.apache.commons.logging.Log;
69
import org.apache.commons.logging.LogFactory;
710
import org.seasar.doma.boot.DomaPersistenceExceptionTranslator;
11+
import org.seasar.doma.boot.DomaSpringBootSqlBuilderSettings;
12+
import org.seasar.doma.boot.ResourceLoaderScriptFileLoader;
813
import org.seasar.doma.boot.TryLookupEntityListenerProvider;
914
import org.seasar.doma.boot.autoconfigure.DomaProperties.DialectType;
1015
import org.seasar.doma.boot.event.DomaEventEntityListener;
1116
import org.seasar.doma.boot.event.DomaEventListenerFactory;
1217
import org.seasar.doma.jdbc.Config;
18+
import org.seasar.doma.jdbc.ConfigSupport;
19+
import org.seasar.doma.jdbc.DuplicateColumnHandler;
1320
import org.seasar.doma.jdbc.EntityListenerProvider;
1421
import org.seasar.doma.jdbc.JdbcLogger;
1522
import org.seasar.doma.jdbc.Naming;
23+
import org.seasar.doma.jdbc.ScriptFileLoader;
24+
import org.seasar.doma.jdbc.SqlBuilderSettings;
1625
import org.seasar.doma.jdbc.SqlFileRepository;
26+
import org.seasar.doma.jdbc.ThrowingDuplicateColumnHandler;
1727
import org.seasar.doma.jdbc.criteria.Entityql;
1828
import org.seasar.doma.jdbc.criteria.NativeSql;
1929
import org.seasar.doma.jdbc.criteria.QueryDsl;
@@ -27,6 +37,9 @@
2737
import org.seasar.doma.jdbc.dialect.PostgresDialect;
2838
import org.seasar.doma.jdbc.dialect.SqliteDialect;
2939
import org.seasar.doma.jdbc.dialect.StandardDialect;
40+
import org.seasar.doma.jdbc.statistic.DefaultStatisticManager;
41+
import org.seasar.doma.jdbc.statistic.StatisticManager;
42+
import org.springframework.beans.factory.ObjectProvider;
3043
import org.springframework.beans.factory.annotation.Autowired;
3144
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3245
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -38,6 +51,7 @@
3851
import org.springframework.context.annotation.Bean;
3952
import org.springframework.context.annotation.Configuration;
4053
import org.springframework.core.env.Environment;
54+
import org.springframework.core.io.ResourceLoader;
4155
import org.springframework.dao.support.PersistenceExceptionTranslator;
4256
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
4357

@@ -99,8 +113,7 @@ public Dialect dialect(Environment environment) {
99113
}
100114

101115
@Bean
102-
@ConditionalOnProperty(prefix = DomaProperties.DOMA_PREFIX, name = "exception-translation-enabled",
103-
matchIfMissing = true)
116+
@ConditionalOnProperty(prefix = DomaProperties.DOMA_PREFIX, name = "exception-translation-enabled", matchIfMissing = true)
104117
public PersistenceExceptionTranslator exceptionTranslator(Config config) {
105118
return new DomaPersistenceExceptionTranslator(
106119
new SQLErrorCodeSQLExceptionTranslator(config.getDataSource()));
@@ -141,6 +154,44 @@ public EntityListenerProvider tryLookupEntityListenerProvider() {
141154
return new TryLookupEntityListenerProvider();
142155
}
143156

157+
@Bean
158+
@ConditionalOnMissingBean
159+
public DuplicateColumnHandler duplicateColumnHandler() {
160+
if (domaProperties.isThrowExceptionIfDuplicateColumn()) {
161+
return new ThrowingDuplicateColumnHandler();
162+
}
163+
return ConfigSupport.defaultDuplicateColumnHandler;
164+
}
165+
166+
@Bean
167+
@ConditionalOnMissingBean
168+
public ScriptFileLoader scriptFileLoader(ResourceLoader resourceLoader) {
169+
return new ResourceLoaderScriptFileLoader(resourceLoader);
170+
}
171+
172+
@Bean
173+
@ConditionalOnMissingBean
174+
public SqlBuilderSettings sqlBuilderSettings(
175+
Optional<Predicate<String>> shouldRemoveBlockCommentOpt,
176+
Optional<Predicate<String>> shouldRemoveLineCommentOpt) {
177+
Predicate<String> shouldRemoveBlockComment = shouldRemoveBlockCommentOpt
178+
.orElseGet(() -> comment -> false);
179+
Predicate<String> shouldRemoveLineComment = shouldRemoveLineCommentOpt
180+
.orElseGet(() -> comment -> false);
181+
boolean shouldRemoveBlankLines = domaProperties.getSqlBuilderSettings()
182+
.isShouldRemoveBlankLines();
183+
boolean shouldRequireInListPadding = domaProperties.getSqlBuilderSettings()
184+
.isShouldRequireInListPadding();
185+
return new DomaSpringBootSqlBuilderSettings(shouldRemoveBlockComment,
186+
shouldRemoveLineComment, shouldRemoveBlankLines, shouldRequireInListPadding);
187+
}
188+
189+
@Bean
190+
@ConditionalOnMissingBean
191+
public StatisticManager statisticManager() {
192+
return new DefaultStatisticManager(domaProperties.getStatisticManager().isEnabled());
193+
}
194+
144195
@Bean
145196
@ConditionalOnMissingBean
146197
public DomaConfigBuilder domaConfigBuilder() {
@@ -152,7 +203,9 @@ public DomaConfigBuilder domaConfigBuilder() {
152203
public DomaConfig config(DataSource dataSource, Dialect dialect,
153204
SqlFileRepository sqlFileRepository, Naming naming, JdbcLogger jdbcLogger,
154205
EntityListenerProvider entityListenerProvider,
155-
DomaConfigBuilder domaConfigBuilder) {
206+
DomaConfigBuilder domaConfigBuilder, DuplicateColumnHandler duplicateColumnHandler,
207+
ScriptFileLoader scriptFileLoader, SqlBuilderSettings sqlBuilderSettings,
208+
StatisticManager statisticManager) {
156209
if (domaConfigBuilder.dataSource() == null) {
157210
domaConfigBuilder.dataSource(dataSource);
158211
}
@@ -171,6 +224,18 @@ public DomaConfig config(DataSource dataSource, Dialect dialect,
171224
if (domaConfigBuilder.entityListenerProvider() == null) {
172225
domaConfigBuilder.entityListenerProvider(entityListenerProvider);
173226
}
227+
if (domaConfigBuilder.duplicateColumnHandler() == null) {
228+
domaConfigBuilder.duplicateColumnHandler(duplicateColumnHandler);
229+
}
230+
if (domaConfigBuilder.scriptFileLoader() == null) {
231+
domaConfigBuilder.scriptFileLoader(scriptFileLoader);
232+
}
233+
if (domaConfigBuilder.sqlBuilderSettings() == null) {
234+
domaConfigBuilder.sqlBuilderSettings(sqlBuilderSettings);
235+
}
236+
if (domaConfigBuilder.statisticManager() == null) {
237+
domaConfigBuilder.statisticManager(statisticManager);
238+
}
174239
return domaConfigBuilder.build();
175240
}
176241

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

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.seasar.doma.jdbc.*;
66
import org.seasar.doma.jdbc.dialect.Dialect;
7+
import org.seasar.doma.jdbc.statistic.StatisticManager;
78

89
/**
910
* {@link Config} implementation used in doma-spring-boot.
@@ -26,6 +27,10 @@ public class DomaConfig implements Config {
2627
private final Commenter commenter;
2728
private final EntityListenerProvider entityListenerProvider;
2829
private final DomaProperties domaProperties;
30+
private final DuplicateColumnHandler duplicateColumnHandler;
31+
private final ScriptFileLoader scriptFileLoader;
32+
private final SqlBuilderSettings sqlBuilderSettings;
33+
private final StatisticManager statisticManager;
2934

3035
public DomaConfig(DomaConfigBuilder builder, DomaProperties domaProperties) {
3136
this.dataSource = builder.dataSource();
@@ -41,6 +46,10 @@ public DomaConfig(DomaConfigBuilder builder, DomaProperties domaProperties) {
4146
this.mapKeyNaming = builder.mapKeyNaming();
4247
this.commenter = builder.commenter();
4348
this.entityListenerProvider = builder.entityListenerProvider();
49+
this.duplicateColumnHandler = builder.duplicateColumnHandler();
50+
this.scriptFileLoader = builder.scriptFileLoader();
51+
this.sqlBuilderSettings = builder.sqlBuilderSettings();
52+
this.statisticManager = builder.statisticManager();
4453
this.domaProperties = domaProperties;
4554
}
4655

@@ -140,15 +149,22 @@ public EntityListenerProvider getEntityListenerProvider() {
140149
}
141150

142151
@Override
143-
public String toString() {
144-
return "DomaConfig{" + "dataSource=" + dataSource + ", dialect=" + dialect
145-
+ ", jdbcLogger=" + jdbcLogger + ", sqlFileRepository="
146-
+ sqlFileRepository + ", requiresNewController=" + requiresNewController
147-
+ ", classHelper=" + classHelper + ", commandImplementors="
148-
+ commandImplementors + ", queryImplementors=" + queryImplementors
149-
+ ", unknownColumnHandler=" + unknownColumnHandler + ", naming=" + naming
150-
+ ", mapKeyNaming=" + mapKeyNaming + ", commenter=" + commenter
151-
+ ", entityListenerProvider=" + entityListenerProvider
152-
+ ", domaProperties=" + domaProperties + '}';
152+
public DuplicateColumnHandler getDuplicateColumnHandler() {
153+
return this.duplicateColumnHandler;
154+
}
155+
156+
@Override
157+
public ScriptFileLoader getScriptFileLoader() {
158+
return this.scriptFileLoader;
159+
}
160+
161+
@Override
162+
public SqlBuilderSettings getSqlBuilderSettings() {
163+
return this.sqlBuilderSettings;
164+
}
165+
166+
@Override
167+
public StatisticManager getStatisticManager() {
168+
return this.statisticManager;
153169
}
154170
}

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

Lines changed: 82 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,21 @@ public class DomaProperties {
9797
*/
9898
private int batchSize = 0;
9999

100+
/**
101+
* Properties for <code>org.seasar.doma.jdbc.SqlBuilderSettings</code>.
102+
*/
103+
private SqlBuilderSettings sqlBuilderSettings = new SqlBuilderSettings();
104+
105+
/**
106+
* Whether to throw an exception when duplicate columns are detected.
107+
*/
108+
private boolean throwExceptionIfDuplicateColumn = false;
109+
110+
/**
111+
* Properties for <code>org.seasar.doma.jdbc.statistic.DefaultStatisticManager</code>.
112+
*/
113+
private StatisticManager statisticManager = new StatisticManager();
114+
100115
public DialectType getDialect() {
101116
return dialect;
102117
}
@@ -185,6 +200,30 @@ public void setBatchSize(int batchSize) {
185200
this.batchSize = batchSize;
186201
}
187202

203+
public SqlBuilderSettings getSqlBuilderSettings() {
204+
return sqlBuilderSettings;
205+
}
206+
207+
public void setSqlBuilderSettings(SqlBuilderSettings sqlBuilderSettings) {
208+
this.sqlBuilderSettings = sqlBuilderSettings;
209+
}
210+
211+
public boolean isThrowExceptionIfDuplicateColumn() {
212+
return throwExceptionIfDuplicateColumn;
213+
}
214+
215+
public void setThrowExceptionIfDuplicateColumn(boolean throwExceptionIfDuplicateColumn) {
216+
this.throwExceptionIfDuplicateColumn = throwExceptionIfDuplicateColumn;
217+
}
218+
219+
public StatisticManager getStatisticManager() {
220+
return statisticManager;
221+
}
222+
223+
public void setStatisticManager(StatisticManager statisticManager) {
224+
this.statisticManager = statisticManager;
225+
}
226+
188227
public DomaConfigBuilder initializeDomaConfigBuilder() {
189228
return new DomaConfigBuilder(this).dialect(dialect.create())
190229
.sqlFileRepository(sqlFileRepository.create()).naming(naming.naming());
@@ -267,7 +306,9 @@ private static JdbcLogger slf4jJdbcLogger() {
267306
return (JdbcLogger) Class.forName("org.seasar.doma.jdbc.Slf4jJdbcLogger")
268307
.getConstructor().newInstance();
269308
} catch (ReflectiveOperationException roe) {
270-
logger.warn("org.seasar.doma.jdbc.Slf4jJdbcLogger could not be instantiated either.", roe);
309+
logger.warn(
310+
"org.seasar.doma.jdbc.Slf4jJdbcLogger could not be instantiated either.",
311+
roe);
271312
}
272313
throw e;
273314
}
@@ -284,15 +325,45 @@ public JdbcLogger create() {
284325
}
285326
}
286327

287-
@Override
288-
public String toString() {
289-
return "DomaProperties{" + "dialect=" + dialect + ", sqlFileRepository="
290-
+ sqlFileRepository + ", naming=" + naming
291-
+ ", exceptionTranslationEnabled=" + exceptionTranslationEnabled
292-
+ ", dataSourceName='" + dataSourceName + '\'' + ", exceptionSqlLogType="
293-
+ exceptionSqlLogType + ", jdbcLogger="
294-
+ jdbcLogger + ", maxRows=" + maxRows + ", fetchSize="
295-
+ fetchSize + ", queryTimeout=" + queryTimeout + ", batchSize="
296-
+ batchSize + '}';
328+
public static class SqlBuilderSettings {
329+
330+
/**
331+
* Whether the blank lines should be removed.
332+
*/
333+
private boolean shouldRemoveBlankLines = false;
334+
335+
/**
336+
* Whether padding is required for elements in an "IN" list in SQL queries.
337+
*/
338+
private boolean shouldRequireInListPadding = false;
339+
340+
public boolean isShouldRemoveBlankLines() {
341+
return shouldRemoveBlankLines;
342+
}
343+
344+
public void setShouldRemoveBlankLines(boolean shouldRemoveBlankLines) {
345+
this.shouldRemoveBlankLines = shouldRemoveBlankLines;
346+
}
347+
348+
public boolean isShouldRequireInListPadding() {
349+
return shouldRequireInListPadding;
350+
}
351+
352+
public void setShouldRequireInListPadding(boolean shouldRequireInListPadding) {
353+
this.shouldRequireInListPadding = shouldRequireInListPadding;
354+
}
355+
}
356+
357+
public static class StatisticManager {
358+
359+
private boolean enabled = false;
360+
361+
public boolean isEnabled() {
362+
return enabled;
363+
}
364+
365+
public void setEnabled(boolean enabled) {
366+
this.enabled = enabled;
367+
}
297368
}
298369
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.seasar.doma.boot;
2+
3+
import java.util.function.Predicate;
4+
5+
import org.seasar.doma.jdbc.SqlBuilderSettings;
6+
7+
public class DomaSpringBootSqlBuilderSettings implements SqlBuilderSettings {
8+
9+
private final Predicate<String> shouldRemoveBlockComment;
10+
private final Predicate<String> shouldRemoveLineComment;
11+
private final boolean shouldRemoveBlankLines;
12+
private final boolean shouldRequireInListPadding;
13+
14+
public DomaSpringBootSqlBuilderSettings(Predicate<String> shouldRemoveBlockComment,
15+
Predicate<String> shouldRemoveLineComment, boolean shouldRemoveBlankLines,
16+
boolean shouldRequireInListPadding) {
17+
this.shouldRemoveBlockComment = shouldRemoveBlockComment;
18+
this.shouldRemoveLineComment = shouldRemoveLineComment;
19+
this.shouldRemoveBlankLines = shouldRemoveBlankLines;
20+
this.shouldRequireInListPadding = shouldRequireInListPadding;
21+
}
22+
23+
@Override
24+
public boolean shouldRemoveBlockComment(String comment) {
25+
return shouldRemoveBlockComment.test(comment);
26+
}
27+
28+
@Override
29+
public boolean shouldRemoveLineComment(String comment) {
30+
return shouldRemoveLineComment.test(comment);
31+
}
32+
33+
@Override
34+
public boolean shouldRemoveBlankLines() {
35+
return shouldRemoveBlankLines;
36+
}
37+
38+
@Override
39+
public boolean shouldRequireInListPadding() {
40+
return shouldRequireInListPadding;
41+
}
42+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.seasar.doma.boot;
2+
3+
import java.io.IOException;
4+
import java.io.UncheckedIOException;
5+
import java.net.URL;
6+
7+
import org.seasar.doma.jdbc.ScriptFileLoader;
8+
import org.springframework.core.io.ResourceLoader;
9+
10+
public class ResourceLoaderScriptFileLoader implements ScriptFileLoader {
11+
12+
private final ResourceLoader resourceLoader;
13+
14+
public ResourceLoaderScriptFileLoader(ResourceLoader resourceLoader) {
15+
this.resourceLoader = resourceLoader;
16+
}
17+
18+
@Override
19+
public URL loadAsURL(String path) {
20+
var resource = resourceLoader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + path);
21+
try {
22+
return resource.getURL();
23+
} catch (IOException e) {
24+
throw new UncheckedIOException(e);
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)