Skip to content

Commit

Permalink
Roughly implemented it for now.
Browse files Browse the repository at this point in the history
  • Loading branch information
backpaper0 committed Jan 30, 2025
1 parent 7a45db8 commit 5c90f99
Show file tree
Hide file tree
Showing 10 changed files with 269 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ target
.settings
.factorypath
.apt_generated
.vscode/
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
package org.seasar.doma.boot.autoconfigure;

import java.util.Optional;
import java.util.function.Predicate;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.seasar.doma.boot.DomaPersistenceExceptionTranslator;
import org.seasar.doma.boot.DomaSpringBootSqlBuilderSettings;
import org.seasar.doma.boot.ResourceLoaderScriptFileLoader;
import org.seasar.doma.boot.TryLookupEntityListenerProvider;
import org.seasar.doma.boot.autoconfigure.DomaProperties.DialectType;
import org.seasar.doma.boot.event.DomaEventEntityListener;
import org.seasar.doma.boot.event.DomaEventListenerFactory;
import org.seasar.doma.jdbc.Config;
import org.seasar.doma.jdbc.ConfigSupport;
import org.seasar.doma.jdbc.DuplicateColumnHandler;
import org.seasar.doma.jdbc.EntityListenerProvider;
import org.seasar.doma.jdbc.JdbcLogger;
import org.seasar.doma.jdbc.Naming;
import org.seasar.doma.jdbc.ScriptFileLoader;
import org.seasar.doma.jdbc.SqlBuilderSettings;
import org.seasar.doma.jdbc.SqlFileRepository;
import org.seasar.doma.jdbc.ThrowingDuplicateColumnHandler;
import org.seasar.doma.jdbc.criteria.Entityql;
import org.seasar.doma.jdbc.criteria.NativeSql;
import org.seasar.doma.jdbc.criteria.QueryDsl;
Expand All @@ -27,6 +37,9 @@
import org.seasar.doma.jdbc.dialect.PostgresDialect;
import org.seasar.doma.jdbc.dialect.SqliteDialect;
import org.seasar.doma.jdbc.dialect.StandardDialect;
import org.seasar.doma.jdbc.statistic.DefaultStatisticManager;
import org.seasar.doma.jdbc.statistic.StatisticManager;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
Expand All @@ -38,6 +51,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.dao.support.PersistenceExceptionTranslator;
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;

Expand Down Expand Up @@ -99,8 +113,7 @@ public Dialect dialect(Environment environment) {
}

@Bean
@ConditionalOnProperty(prefix = DomaProperties.DOMA_PREFIX, name = "exception-translation-enabled",
matchIfMissing = true)
@ConditionalOnProperty(prefix = DomaProperties.DOMA_PREFIX, name = "exception-translation-enabled", matchIfMissing = true)
public PersistenceExceptionTranslator exceptionTranslator(Config config) {
return new DomaPersistenceExceptionTranslator(
new SQLErrorCodeSQLExceptionTranslator(config.getDataSource()));
Expand Down Expand Up @@ -141,6 +154,44 @@ public EntityListenerProvider tryLookupEntityListenerProvider() {
return new TryLookupEntityListenerProvider();
}

@Bean
@ConditionalOnMissingBean
public DuplicateColumnHandler duplicateColumnHandler() {
if (domaProperties.isThrowExceptionIfDuplicateColumn()) {
return new ThrowingDuplicateColumnHandler();
}
return ConfigSupport.defaultDuplicateColumnHandler;
}

@Bean
@ConditionalOnMissingBean
public ScriptFileLoader scriptFileLoader(ResourceLoader resourceLoader) {
return new ResourceLoaderScriptFileLoader(resourceLoader);
}

@Bean
@ConditionalOnMissingBean
public SqlBuilderSettings sqlBuilderSettings(
Optional<Predicate<String>> shouldRemoveBlockCommentOpt,
Optional<Predicate<String>> shouldRemoveLineCommentOpt) {
Predicate<String> shouldRemoveBlockComment = shouldRemoveBlockCommentOpt
.orElseGet(() -> comment -> false);
Predicate<String> shouldRemoveLineComment = shouldRemoveLineCommentOpt
.orElseGet(() -> comment -> false);
boolean shouldRemoveBlankLines = domaProperties.getSqlBuilderSettings()
.isShouldRemoveBlankLines();
boolean shouldRequireInListPadding = domaProperties.getSqlBuilderSettings()
.isShouldRequireInListPadding();
return new DomaSpringBootSqlBuilderSettings(shouldRemoveBlockComment,
shouldRemoveLineComment, shouldRemoveBlankLines, shouldRequireInListPadding);
}

@Bean
@ConditionalOnMissingBean
public StatisticManager statisticManager() {
return new DefaultStatisticManager(domaProperties.getStatisticManager().isEnabled());
}

@Bean
@ConditionalOnMissingBean
public DomaConfigBuilder domaConfigBuilder() {
Expand All @@ -152,7 +203,9 @@ public DomaConfigBuilder domaConfigBuilder() {
public DomaConfig config(DataSource dataSource, Dialect dialect,
SqlFileRepository sqlFileRepository, Naming naming, JdbcLogger jdbcLogger,
EntityListenerProvider entityListenerProvider,
DomaConfigBuilder domaConfigBuilder) {
DomaConfigBuilder domaConfigBuilder, DuplicateColumnHandler duplicateColumnHandler,
ScriptFileLoader scriptFileLoader, SqlBuilderSettings sqlBuilderSettings,
StatisticManager statisticManager) {
if (domaConfigBuilder.dataSource() == null) {
domaConfigBuilder.dataSource(dataSource);
}
Expand All @@ -171,6 +224,18 @@ public DomaConfig config(DataSource dataSource, Dialect dialect,
if (domaConfigBuilder.entityListenerProvider() == null) {
domaConfigBuilder.entityListenerProvider(entityListenerProvider);
}
if (domaConfigBuilder.duplicateColumnHandler() == null) {
domaConfigBuilder.duplicateColumnHandler(duplicateColumnHandler);
}
if (domaConfigBuilder.scriptFileLoader() == null) {
domaConfigBuilder.scriptFileLoader(scriptFileLoader);
}
if (domaConfigBuilder.sqlBuilderSettings() == null) {
domaConfigBuilder.sqlBuilderSettings(sqlBuilderSettings);
}
if (domaConfigBuilder.statisticManager() == null) {
domaConfigBuilder.statisticManager(statisticManager);
}
return domaConfigBuilder.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import org.seasar.doma.jdbc.*;
import org.seasar.doma.jdbc.dialect.Dialect;
import org.seasar.doma.jdbc.statistic.StatisticManager;

/**
* {@link Config} implementation used in doma-spring-boot.
Expand All @@ -26,6 +27,10 @@ public class DomaConfig implements Config {
private final Commenter commenter;
private final EntityListenerProvider entityListenerProvider;
private final DomaProperties domaProperties;
private final DuplicateColumnHandler duplicateColumnHandler;
private final ScriptFileLoader scriptFileLoader;
private final SqlBuilderSettings sqlBuilderSettings;
private final StatisticManager statisticManager;

public DomaConfig(DomaConfigBuilder builder, DomaProperties domaProperties) {
this.dataSource = builder.dataSource();
Expand All @@ -41,6 +46,10 @@ public DomaConfig(DomaConfigBuilder builder, DomaProperties domaProperties) {
this.mapKeyNaming = builder.mapKeyNaming();
this.commenter = builder.commenter();
this.entityListenerProvider = builder.entityListenerProvider();
this.duplicateColumnHandler = builder.duplicateColumnHandler();
this.scriptFileLoader = builder.scriptFileLoader();
this.sqlBuilderSettings = builder.sqlBuilderSettings();
this.statisticManager = builder.statisticManager();
this.domaProperties = domaProperties;
}

Expand Down Expand Up @@ -140,15 +149,22 @@ public EntityListenerProvider getEntityListenerProvider() {
}

@Override
public String toString() {
return "DomaConfig{" + "dataSource=" + dataSource + ", dialect=" + dialect
+ ", jdbcLogger=" + jdbcLogger + ", sqlFileRepository="
+ sqlFileRepository + ", requiresNewController=" + requiresNewController
+ ", classHelper=" + classHelper + ", commandImplementors="
+ commandImplementors + ", queryImplementors=" + queryImplementors
+ ", unknownColumnHandler=" + unknownColumnHandler + ", naming=" + naming
+ ", mapKeyNaming=" + mapKeyNaming + ", commenter=" + commenter
+ ", entityListenerProvider=" + entityListenerProvider
+ ", domaProperties=" + domaProperties + '}';
public DuplicateColumnHandler getDuplicateColumnHandler() {
return this.duplicateColumnHandler;
}

@Override
public ScriptFileLoader getScriptFileLoader() {
return this.scriptFileLoader;
}

@Override
public SqlBuilderSettings getSqlBuilderSettings() {
return this.sqlBuilderSettings;
}

@Override
public StatisticManager getStatisticManager() {
return this.statisticManager;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,21 @@ public class DomaProperties {
*/
private int batchSize = 0;

/**
* Properties for <code>org.seasar.doma.jdbc.SqlBuilderSettings</code>.
*/
private SqlBuilderSettings sqlBuilderSettings = new SqlBuilderSettings();

/**
* Whether to throw an exception when duplicate columns are detected.
*/
private boolean throwExceptionIfDuplicateColumn = false;

/**
* Properties for <code>org.seasar.doma.jdbc.statistic.DefaultStatisticManager</code>.
*/
private StatisticManager statisticManager = new StatisticManager();

public DialectType getDialect() {
return dialect;
}
Expand Down Expand Up @@ -185,6 +200,30 @@ public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}

public SqlBuilderSettings getSqlBuilderSettings() {
return sqlBuilderSettings;
}

public void setSqlBuilderSettings(SqlBuilderSettings sqlBuilderSettings) {
this.sqlBuilderSettings = sqlBuilderSettings;
}

public boolean isThrowExceptionIfDuplicateColumn() {
return throwExceptionIfDuplicateColumn;
}

public void setThrowExceptionIfDuplicateColumn(boolean throwExceptionIfDuplicateColumn) {
this.throwExceptionIfDuplicateColumn = throwExceptionIfDuplicateColumn;
}

public StatisticManager getStatisticManager() {
return statisticManager;
}

public void setStatisticManager(StatisticManager statisticManager) {
this.statisticManager = statisticManager;
}

public DomaConfigBuilder initializeDomaConfigBuilder() {
return new DomaConfigBuilder(this).dialect(dialect.create())
.sqlFileRepository(sqlFileRepository.create()).naming(naming.naming());
Expand Down Expand Up @@ -267,7 +306,9 @@ private static JdbcLogger slf4jJdbcLogger() {
return (JdbcLogger) Class.forName("org.seasar.doma.jdbc.Slf4jJdbcLogger")
.getConstructor().newInstance();
} catch (ReflectiveOperationException roe) {
logger.warn("org.seasar.doma.jdbc.Slf4jJdbcLogger could not be instantiated either.", roe);
logger.warn(
"org.seasar.doma.jdbc.Slf4jJdbcLogger could not be instantiated either.",
roe);
}
throw e;
}
Expand All @@ -284,15 +325,45 @@ public JdbcLogger create() {
}
}

@Override
public String toString() {
return "DomaProperties{" + "dialect=" + dialect + ", sqlFileRepository="
+ sqlFileRepository + ", naming=" + naming
+ ", exceptionTranslationEnabled=" + exceptionTranslationEnabled
+ ", dataSourceName='" + dataSourceName + '\'' + ", exceptionSqlLogType="
+ exceptionSqlLogType + ", jdbcLogger="
+ jdbcLogger + ", maxRows=" + maxRows + ", fetchSize="
+ fetchSize + ", queryTimeout=" + queryTimeout + ", batchSize="
+ batchSize + '}';
public static class SqlBuilderSettings {

/**
* Whether the blank lines should be removed.
*/
private boolean shouldRemoveBlankLines = false;

/**
* Whether padding is required for elements in an "IN" list in SQL queries.
*/
private boolean shouldRequireInListPadding = false;

public boolean isShouldRemoveBlankLines() {
return shouldRemoveBlankLines;
}

public void setShouldRemoveBlankLines(boolean shouldRemoveBlankLines) {
this.shouldRemoveBlankLines = shouldRemoveBlankLines;
}

public boolean isShouldRequireInListPadding() {
return shouldRequireInListPadding;
}

public void setShouldRequireInListPadding(boolean shouldRequireInListPadding) {
this.shouldRequireInListPadding = shouldRequireInListPadding;
}
}

public static class StatisticManager {

private boolean enabled = false;

public boolean isEnabled() {
return enabled;
}

public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.seasar.doma.boot;

import java.util.function.Predicate;

import org.seasar.doma.jdbc.SqlBuilderSettings;

public class DomaSpringBootSqlBuilderSettings implements SqlBuilderSettings {

private final Predicate<String> shouldRemoveBlockComment;
private final Predicate<String> shouldRemoveLineComment;
private final boolean shouldRemoveBlankLines;
private final boolean shouldRequireInListPadding;

public DomaSpringBootSqlBuilderSettings(Predicate<String> shouldRemoveBlockComment,
Predicate<String> shouldRemoveLineComment, boolean shouldRemoveBlankLines,
boolean shouldRequireInListPadding) {
this.shouldRemoveBlockComment = shouldRemoveBlockComment;
this.shouldRemoveLineComment = shouldRemoveLineComment;
this.shouldRemoveBlankLines = shouldRemoveBlankLines;
this.shouldRequireInListPadding = shouldRequireInListPadding;
}

@Override
public boolean shouldRemoveBlockComment(String comment) {
return shouldRemoveBlockComment.test(comment);
}

@Override
public boolean shouldRemoveLineComment(String comment) {
return shouldRemoveLineComment.test(comment);
}

@Override
public boolean shouldRemoveBlankLines() {
return shouldRemoveBlankLines;
}

@Override
public boolean shouldRequireInListPadding() {
return shouldRequireInListPadding;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.seasar.doma.boot;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URL;

import org.seasar.doma.jdbc.ScriptFileLoader;
import org.springframework.core.io.ResourceLoader;

public class ResourceLoaderScriptFileLoader implements ScriptFileLoader {

private final ResourceLoader resourceLoader;

public ResourceLoaderScriptFileLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}

@Override
public URL loadAsURL(String path) {
var resource = resourceLoader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + path);
try {
return resource.getURL();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
Loading

0 comments on commit 5c90f99

Please sign in to comment.