|
18 | 18 | import java.beans.Introspector; |
19 | 19 | import java.util.Collections; |
20 | 20 | import java.util.HashSet; |
| 21 | +import java.util.Map; |
21 | 22 | import java.util.Set; |
22 | 23 |
|
23 | 24 | import javax.sql.DataSource; |
|
27 | 28 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
28 | 29 | import org.springframework.boot.autoconfigure.AutoConfigureOrder; |
29 | 30 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; |
| 31 | +import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; |
30 | 32 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
31 | 33 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
32 | 34 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|
37 | 39 | import org.springframework.context.ApplicationContext; |
38 | 40 | import org.springframework.context.ConfigurableApplicationContext; |
39 | 41 | import org.springframework.context.annotation.Bean; |
| 42 | +import org.springframework.context.annotation.Conditional; |
| 43 | +import org.springframework.context.annotation.Primary; |
40 | 44 | import org.springframework.core.annotation.Order; |
41 | 45 | import org.springframework.transaction.PlatformTransactionManager; |
42 | 46 |
|
|
48 | 52 | import org.grails.core.artefact.DomainClassArtefactHandler; |
49 | 53 | import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher; |
50 | 54 | import org.grails.datastore.gorm.proxy.ProxyHandlerAdapter; |
| 55 | +import org.grails.datastore.mapping.config.Settings; |
| 56 | +import org.grails.datastore.mapping.core.connections.AbstractConnectionSources; |
| 57 | +import org.grails.datastore.mapping.core.connections.ConnectionSource; |
51 | 58 | import org.grails.datastore.mapping.model.MappingContext; |
52 | 59 | import org.grails.datastore.mapping.services.Service; |
53 | 60 | import org.grails.orm.hibernate.HibernateDatastore; |
54 | 61 | import org.grails.orm.hibernate.proxy.HibernateProxyHandler; |
| 62 | +import org.grails.orm.hibernate.support.HibernateDatastoreConnectionSourcesRegistrar; |
55 | 63 | import org.grails.plugin.hibernate.support.AggregatePersistenceContextInterceptor; |
56 | 64 | import org.grails.plugin.hibernate.support.GrailsOpenSessionInViewInterceptor; |
57 | 65 | import org.grails.transaction.ChainedTransactionManagerPostProcessor; |
@@ -81,6 +89,7 @@ public HibernateGormAutoConfiguration(ApplicationContext applicationContext, |
81 | 89 | } |
82 | 90 |
|
83 | 91 | @Bean |
| 92 | + @Primary |
84 | 93 | @ConditionalOnMissingBean |
85 | 94 | public HibernateDatastore hibernateDatastore(ObjectProvider<DataSource> dataSource) { |
86 | 95 | GrailsClass[] grailsClasses = this.grailsApplication.getObject().getArtefacts(DomainClassArtefactHandler.TYPE); |
@@ -140,18 +149,21 @@ public HibernateDatastore hibernateDatastore(ObjectProvider<DataSource> dataSour |
140 | 149 | } |
141 | 150 |
|
142 | 151 | @Bean |
| 152 | + @Primary |
143 | 153 | @ConditionalOnMissingBean |
144 | 154 | public SessionFactory sessionFactory(HibernateDatastore hibernateDatastore) { |
145 | 155 | return hibernateDatastore.getSessionFactory(); |
146 | 156 | } |
147 | 157 |
|
148 | 158 | @Bean |
| 159 | + @Primary |
149 | 160 | @ConditionalOnMissingBean |
150 | 161 | public MappingContext grailsDomainClassMappingContext(HibernateDatastore hibernateDatastore) { |
151 | 162 | return hibernateDatastore.getMappingContext(); |
152 | 163 | } |
153 | 164 |
|
154 | 165 | @Bean |
| 166 | + @Primary |
155 | 167 | @ConditionalOnMissingBean |
156 | 168 | public PlatformTransactionManager transactionManager(HibernateDatastore hibernateDatastore) { |
157 | 169 | return hibernateDatastore.getTransactionManager(); |
@@ -194,4 +206,48 @@ public ChainedTransactionManagerPostProcessor chainedTransactionManagerPostProce |
194 | 206 | return new ChainedTransactionManagerPostProcessor(config, whitelistPattern, blacklistPattern); |
195 | 207 | } |
196 | 208 |
|
| 209 | + @Bean |
| 210 | + @Conditional(GrailsDataSourceCondition.class) |
| 211 | + public static HibernateDatastoreConnectionSourcesRegistrar hibernateDatastoreConnectionSourcesRegistrar(ObjectProvider<GrailsApplication> grailsApplication) { |
| 212 | + Iterable<String> dataSourceNames = getConfigureDataSources(grailsApplication.getObject().getConfig()); |
| 213 | + return new HibernateDatastoreConnectionSourcesRegistrar(dataSourceNames); |
| 214 | + } |
| 215 | + |
| 216 | + private static Set<String> getConfigureDataSources(Config config) { |
| 217 | + Set<String> dataSourceNames = new HashSet<>(); |
| 218 | + if (config == null) { |
| 219 | + dataSourceNames = Set.of(ConnectionSource.DEFAULT); |
| 220 | + } |
| 221 | + else { |
| 222 | + Map dataSources = config.getProperty(Settings.SETTING_DATASOURCES, Map.class, Collections.emptyMap()); |
| 223 | + |
| 224 | + if (dataSources != null && !dataSources.isEmpty()) { |
| 225 | + dataSourceNames.addAll(AbstractConnectionSources.toValidConnectionSourceNames(dataSources)); |
| 226 | + } |
| 227 | + Map dataSource = config.getProperty(Settings.SETTING_DATASOURCE, Map.class, Collections.emptyMap()); |
| 228 | + if (dataSource != null && !dataSource.isEmpty()) { |
| 229 | + dataSourceNames.add(ConnectionSource.DEFAULT); |
| 230 | + } |
| 231 | + } |
| 232 | + return dataSourceNames; |
| 233 | + } |
| 234 | + |
| 235 | + static final class GrailsDataSourceCondition extends AnyNestedCondition { |
| 236 | + |
| 237 | + GrailsDataSourceCondition() { |
| 238 | + super(ConfigurationPhase.REGISTER_BEAN); |
| 239 | + } |
| 240 | + |
| 241 | + @ConditionalOnProperty(name = "dataSource") |
| 242 | + private static final class DataSourceUrlCondition { |
| 243 | + |
| 244 | + } |
| 245 | + |
| 246 | + @ConditionalOnProperty(name = "dataSources") |
| 247 | + private static final class DataSourcesCondition { |
| 248 | + |
| 249 | + } |
| 250 | + |
| 251 | + } |
| 252 | + |
197 | 253 | } |
0 commit comments