Skip to content

Commit 7635528

Browse files
committed
Supports for Multiple Data Sources
Closes gh-858
1 parent 441a133 commit 7635528

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

grace-plugin-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourcePluginConfiguration.java

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@
2020

2121
import javax.sql.DataSource;
2222

23+
import org.springframework.beans.BeansException;
24+
import org.springframework.beans.factory.BeanFactory;
25+
import org.springframework.beans.factory.BeanFactoryAware;
2326
import org.springframework.beans.factory.ObjectProvider;
27+
import org.springframework.beans.factory.config.BeanDefinition;
28+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
29+
import org.springframework.beans.factory.support.AbstractBeanDefinition;
30+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
31+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2432
import org.springframework.boot.autoconfigure.AutoConfiguration;
2533
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
2634
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -31,10 +39,18 @@
3139
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration;
3240
import org.springframework.context.annotation.Bean;
3341
import org.springframework.context.annotation.Conditional;
42+
import org.springframework.context.annotation.Import;
43+
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
44+
import org.springframework.context.annotation.Primary;
45+
import org.springframework.core.io.ClassPathResource;
46+
import org.springframework.core.type.AnnotationMetadata;
47+
import org.springframework.util.ClassUtils;
3448

3549
import grails.config.Config;
3650
import grails.core.GrailsApplication;
3751
import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings;
52+
import org.grails.datastore.mapping.config.Settings;
53+
import org.grails.datastore.mapping.core.connections.ConnectionSource;
3854
import org.grails.datastore.mapping.core.connections.ConnectionSources;
3955
import org.grails.plugins.datasource.DataSourcePluginConfiguration.GrailsDataSourceCondition;
4056

@@ -48,6 +64,7 @@
4864
DataSourceAutoConfiguration.class, SqlInitializationAutoConfiguration.class
4965
})
5066
@AutoConfigureOrder(100)
67+
@Import(DataSourcePluginConfiguration.BeanPostProcessorsRegistrar.class)
5168
@Conditional(GrailsDataSourceCondition.class)
5269
public class DataSourcePluginConfiguration {
5370

@@ -69,7 +86,9 @@ public ConnectionSources<DataSource, DataSourceSettings> dataSourceConnectionSou
6986
}
7087

7188
@Bean
89+
@Primary
7290
@ConditionalOnMissingBean
91+
@ConditionalOnProperty(prefix = "dataSource", name = "url")
7392
public DataSource dataSource(ConnectionSources<DataSource, DataSourceSettings> dataSourceConnectionSources) {
7493
return dataSourceConnectionSources.getDefaultConnectionSource().getSource();
7594
}
@@ -86,16 +105,44 @@ static final class GrailsDataSourceCondition extends AnyNestedCondition {
86105
super(ConfigurationPhase.REGISTER_BEAN);
87106
}
88107

89-
@ConditionalOnProperty(prefix = "dataSource", name = "url")
108+
@ConditionalOnProperty(name = "dataSource")
90109
private static final class DataSourceUrlCondition {
91110

92111
}
93112

94-
@ConditionalOnProperty(prefix = "dataSources", name = "default")
113+
@ConditionalOnProperty(name = "dataSources")
95114
private static final class DataSourcesCondition {
96115

97116
}
98117

99118
}
100119

120+
public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
121+
122+
private ConfigurableListableBeanFactory beanFactory;
123+
124+
@Override
125+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
126+
if (beanFactory instanceof ConfigurableListableBeanFactory listableBeanFactory) {
127+
this.beanFactory = listableBeanFactory;
128+
}
129+
}
130+
131+
@Override
132+
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
133+
ConnectionSources<DataSource, DataSourceSettings> dataSourceConnectionSources = this.beanFactory.getBean("dataSourceConnectionSources", ConnectionSources.class);
134+
dataSourceConnectionSources.getAllConnectionSources().forEach(dataSource -> {
135+
if (!dataSource.getName().equals(ConnectionSource.DEFAULT)) {
136+
BeanDefinitionBuilder beanDefinitionBuilder =
137+
BeanDefinitionBuilder.genericBeanDefinition(DataSource.class, dataSource::getSource)
138+
.setRole(BeanDefinition.ROLE_APPLICATION);
139+
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
140+
String resourcePath = ClassUtils.convertClassNameToResourcePath(DataSourcePluginConfiguration.class.getName()) + ClassUtils.CLASS_FILE_SUFFIX;
141+
beanDefinition.setResource(new ClassPathResource(resourcePath));
142+
registry.registerBeanDefinition(Settings.SETTING_DATASOURCE + "_" + dataSource.getName(), beanDefinition);
143+
}
144+
});
145+
}
146+
}
147+
101148
}

0 commit comments

Comments
 (0)