001/* 002 * Copyright 2012-2017 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.boot.autoconfigure.jooq; 018 019import javax.sql.DataSource; 020 021import org.jooq.ConnectionProvider; 022import org.jooq.DSLContext; 023import org.jooq.ExecuteListenerProvider; 024import org.jooq.RecordListenerProvider; 025import org.jooq.RecordMapperProvider; 026import org.jooq.TransactionProvider; 027import org.jooq.VisitListenerProvider; 028import org.jooq.conf.Settings; 029import org.jooq.impl.DataSourceConnectionProvider; 030import org.jooq.impl.DefaultConfiguration; 031import org.jooq.impl.DefaultDSLContext; 032import org.jooq.impl.DefaultExecuteListenerProvider; 033 034import org.springframework.beans.factory.ObjectProvider; 035import org.springframework.boot.autoconfigure.AutoConfigureAfter; 036import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 037import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; 038import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 039import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 040import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 041import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration; 042import org.springframework.boot.context.properties.EnableConfigurationProperties; 043import org.springframework.context.annotation.Bean; 044import org.springframework.context.annotation.Configuration; 045import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; 046import org.springframework.transaction.PlatformTransactionManager; 047 048/** 049 * {@link EnableAutoConfiguration Auto-configuration} for JOOQ. 050 * 051 * @author Andreas Ahlenstorf 052 * @since 1.3.0 053 */ 054@Configuration 055@ConditionalOnClass(DSLContext.class) 056@ConditionalOnBean(DataSource.class) 057@AutoConfigureAfter({ DataSourceAutoConfiguration.class, 058 TransactionAutoConfiguration.class }) 059public class JooqAutoConfiguration { 060 061 @Bean 062 @ConditionalOnMissingBean(DataSourceConnectionProvider.class) 063 public DataSourceConnectionProvider dataSourceConnectionProvider( 064 DataSource dataSource) { 065 return new DataSourceConnectionProvider( 066 new TransactionAwareDataSourceProxy(dataSource)); 067 } 068 069 @Bean 070 @ConditionalOnBean(PlatformTransactionManager.class) 071 public SpringTransactionProvider transactionProvider( 072 PlatformTransactionManager txManager) { 073 return new SpringTransactionProvider(txManager); 074 } 075 076 @Bean 077 public DefaultExecuteListenerProvider jooqExceptionTranslatorExecuteListenerProvider() { 078 return new DefaultExecuteListenerProvider(new JooqExceptionTranslator()); 079 } 080 081 @Configuration 082 @ConditionalOnMissingBean(DSLContext.class) 083 @EnableConfigurationProperties(JooqProperties.class) 084 public static class DslContextConfiguration { 085 086 private final JooqProperties properties; 087 088 private final ConnectionProvider connection; 089 090 private final TransactionProvider transactionProvider; 091 092 private final RecordMapperProvider recordMapperProvider; 093 094 private final Settings settings; 095 096 private final RecordListenerProvider[] recordListenerProviders; 097 098 private final ExecuteListenerProvider[] executeListenerProviders; 099 100 private final VisitListenerProvider[] visitListenerProviders; 101 102 public DslContextConfiguration(JooqProperties properties, 103 ConnectionProvider connectionProvider, 104 ObjectProvider<TransactionProvider> transactionProvider, 105 ObjectProvider<RecordMapperProvider> recordMapperProvider, 106 ObjectProvider<Settings> settings, 107 ObjectProvider<RecordListenerProvider[]> recordListenerProviders, 108 ExecuteListenerProvider[] executeListenerProviders, 109 ObjectProvider<VisitListenerProvider[]> visitListenerProviders) { 110 this.properties = properties; 111 this.connection = connectionProvider; 112 this.transactionProvider = transactionProvider.getIfAvailable(); 113 this.recordMapperProvider = recordMapperProvider.getIfAvailable(); 114 this.settings = settings.getIfAvailable(); 115 this.recordListenerProviders = recordListenerProviders.getIfAvailable(); 116 this.executeListenerProviders = executeListenerProviders; 117 this.visitListenerProviders = visitListenerProviders.getIfAvailable(); 118 } 119 120 @Bean 121 public DefaultDSLContext dslContext(org.jooq.Configuration configuration) { 122 return new DefaultDSLContext(configuration); 123 } 124 125 @Bean 126 @ConditionalOnMissingBean(org.jooq.Configuration.class) 127 public DefaultConfiguration jooqConfiguration() { 128 DefaultConfiguration configuration = new DefaultConfiguration(); 129 if (this.properties.getSqlDialect() != null) { 130 configuration.set(this.properties.getSqlDialect()); 131 } 132 configuration.set(this.connection); 133 if (this.transactionProvider != null) { 134 configuration.set(this.transactionProvider); 135 } 136 if (this.recordMapperProvider != null) { 137 configuration.set(this.recordMapperProvider); 138 } 139 if (this.settings != null) { 140 configuration.set(this.settings); 141 } 142 configuration.set(this.recordListenerProviders); 143 configuration.set(this.executeListenerProviders); 144 configuration.set(this.visitListenerProviders); 145 return configuration; 146 } 147 148 } 149 150}