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}