Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add some component definitions #261

Merged
merged 3 commits into from
Feb 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,7 +37,11 @@
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.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
Expand All @@ -38,6 +52,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 +114,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 +155,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(
@Qualifier("shouldRemoveBlockComment") Optional<Predicate<String>> shouldRemoveBlockCommentOpt,
@Qualifier("shouldRemoveLineComment") 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 +204,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 +225,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 @@ -6,6 +6,7 @@

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

/**
Expand Down Expand Up @@ -40,6 +41,10 @@ public class DomaConfigBuilder {
private MapKeyNaming mapKeyNaming = ConfigSupport.defaultMapKeyNaming;
private Commenter commenter = ConfigSupport.defaultCommenter;
private EntityListenerProvider entityListenerProvider;
private DuplicateColumnHandler duplicateColumnHandler;
private ScriptFileLoader scriptFileLoader;
private SqlBuilderSettings sqlBuilderSettings;
private StatisticManager statisticManager;

public DomaConfigBuilder(DomaProperties domaProperties) {
this.domaProperties = Objects.requireNonNull(domaProperties);
Expand Down Expand Up @@ -174,6 +179,42 @@ public DomaConfigBuilder entityListenerProvider(
return this;
}

public DuplicateColumnHandler duplicateColumnHandler() {
return duplicateColumnHandler;
}

public DomaConfigBuilder duplicateColumnHandler(DuplicateColumnHandler duplicateColumnHandler) {
this.duplicateColumnHandler = duplicateColumnHandler;
return this;
}

public ScriptFileLoader scriptFileLoader() {
return scriptFileLoader;
}

public DomaConfigBuilder scriptFileLoader(ScriptFileLoader scriptFileLoader) {
this.scriptFileLoader = scriptFileLoader;
return this;
}

public SqlBuilderSettings sqlBuilderSettings() {
return sqlBuilderSettings;
}

public DomaConfigBuilder sqlBuilderSettings(SqlBuilderSettings sqlBuilderSettings) {
this.sqlBuilderSettings = sqlBuilderSettings;
return this;
}

public StatisticManager statisticManager() {
return statisticManager;
}

public DomaConfigBuilder statisticManager(StatisticManager statisticManager) {
this.statisticManager = statisticManager;
return this;
}

public DomaConfig build() {
return new DomaConfig(this, domaProperties);
}
Expand Down
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;
}
}
}
Loading
Loading