Skip to content

Commit dfcb6d1

Browse files
author
Max Bruchmann
committed
Merge remote-tracking branch 'upstream/master'
2 parents 1fba36e + c617507 commit dfcb6d1

File tree

32 files changed

+717
-108
lines changed

32 files changed

+717
-108
lines changed

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ public PluginLifeCycle shellBootstrap() {
155155
* Class to configure CRaSH to authenticate against Spring Security.
156156
*/
157157
@Configuration
158+
@ConditionalOnExpression("'${shell.auth:spring}' == 'spring'")
158159
@ConditionalOnBean({ AuthenticationManager.class })
159160
@AutoConfigureAfter(CrshAutoConfiguration.class)
160161
public static class AuthenticationManagerAdapterAutoConfiguration {
@@ -168,7 +169,6 @@ public CRaSHPlugin<?> shellAuthenticationManager() {
168169
}
169170

170171
@Bean
171-
@ConditionalOnExpression("'${shell.auth:spring}' == 'spring'")
172172
@ConditionalOnMissingBean({ CrshShellAuthenticationProperties.class })
173173
public CrshShellAuthenticationProperties springAuthenticationProperties() {
174174
// In case no shell.auth property is provided fall back to Spring Security

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ShellProperties.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,9 +427,8 @@ protected void applyToCrshShellConfig(Properties config) {
427427
}
428428

429429
public void setRoles(String[] roles) {
430-
// 'roles' can be empty. This means no special to access right to connect to
430+
// 'roles' can be null. This means no special to access right to connect to
431431
// shell is required.
432-
Assert.notNull(roles, "roles must not be null");
433432
this.roles = roles;
434433
}
435434

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2929
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3030
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
31+
import org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerPostProcessor.Registrar;
3132
import org.springframework.boot.context.properties.ConfigurationProperties;
3233
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3334
import org.springframework.context.annotation.Bean;
@@ -52,6 +53,7 @@
5253
@Configuration
5354
@ConditionalOnClass(EmbeddedDatabaseType.class)
5455
@EnableConfigurationProperties(DataSourceProperties.class)
56+
@Import(Registrar.class)
5557
public class DataSourceAutoConfiguration {
5658

5759
public static final String CONFIGURATION_PREFIX = "spring.datasource";

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializer.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import org.apache.commons.logging.Log;
2727
import org.apache.commons.logging.LogFactory;
2828
import org.springframework.beans.factory.annotation.Autowired;
29-
import org.springframework.context.ApplicationContext;
3029
import org.springframework.context.ApplicationListener;
30+
import org.springframework.context.ConfigurableApplicationContext;
3131
import org.springframework.core.io.Resource;
3232
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
3333
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
@@ -48,7 +48,7 @@ class DataSourceInitializer implements ApplicationListener<DataSourceInitialized
4848
private static Log logger = LogFactory.getLog(DataSourceInitializer.class);
4949

5050
@Autowired
51-
private ApplicationContext applicationContext;
51+
private ConfigurableApplicationContext applicationContext;
5252

5353
@Autowired(required = false)
5454
private DataSource dataSource;
@@ -75,15 +75,21 @@ private void runSchemaScripts() {
7575
List<Resource> scripts = getScripts(this.properties.getSchema(), "schema");
7676
if (!scripts.isEmpty()) {
7777
runScripts(scripts);
78-
this.applicationContext.publishEvent(new DataSourceInitializedEvent(
79-
this.dataSource));
78+
try {
79+
this.applicationContext.publishEvent(new DataSourceInitializedEvent(
80+
this.dataSource));
81+
}
82+
catch (IllegalStateException e) {
83+
logger.warn("Could not send event to complete DataSource initialization ("
84+
+ e.getMessage() + ")");
85+
}
8086
}
8187
}
8288

8389
@Override
8490
public void onApplicationEvent(DataSourceInitializedEvent event) {
85-
// NOTE the even can happen more than once and
86-
// the event datasource if not used here
91+
// NOTE the event can happen more than once and
92+
// the event datasource is not used here
8793
if (!this.initialized) {
8894
runDataScripts();
8995
this.initialized = true;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Copyright 2012-2014 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.jdbc;
18+
19+
import javax.sql.DataSource;
20+
21+
import org.springframework.beans.BeansException;
22+
import org.springframework.beans.factory.BeanFactory;
23+
import org.springframework.beans.factory.annotation.Autowired;
24+
import org.springframework.beans.factory.config.BeanDefinition;
25+
import org.springframework.beans.factory.config.BeanPostProcessor;
26+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
27+
import org.springframework.beans.factory.support.GenericBeanDefinition;
28+
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
29+
import org.springframework.core.Ordered;
30+
import org.springframework.core.type.AnnotationMetadata;
31+
32+
/**
33+
* {@link BeanPostProcessor} used to fire {@link DataSourceInitializedEvent}s. Should only
34+
* be registered via the inner {@link Registrar} class.
35+
*
36+
* @author Dave Syer
37+
* @since 1.1.2
38+
*/
39+
class DataSourceInitializerPostProcessor implements BeanPostProcessor, Ordered {
40+
41+
private int order = Ordered.HIGHEST_PRECEDENCE;
42+
43+
@Override
44+
public int getOrder() {
45+
return this.order;
46+
}
47+
48+
@Autowired
49+
private BeanFactory beanFactory;
50+
51+
@Override
52+
public Object postProcessBeforeInitialization(Object bean, String beanName)
53+
throws BeansException {
54+
return bean;
55+
}
56+
57+
@Override
58+
public Object postProcessAfterInitialization(Object bean, String beanName)
59+
throws BeansException {
60+
if (bean instanceof DataSource) {
61+
// force initialization of this bean as soon as we see a DataSource
62+
this.beanFactory.getBean(DataSourceInitializer.class);
63+
}
64+
return bean;
65+
}
66+
67+
/**
68+
* {@link ImportBeanDefinitionRegistrar} to register the
69+
* {@link DataSourceInitializerPostProcessor} without causing early bean instantiation
70+
* issues.
71+
*/
72+
static class Registrar implements ImportBeanDefinitionRegistrar {
73+
74+
private static final String BEAN_NAME = "dataSourceInitializerPostProcessor";
75+
76+
@Override
77+
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
78+
BeanDefinitionRegistry registry) {
79+
if (!registry.containsBeanDefinition(BEAN_NAME)) {
80+
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
81+
beanDefinition.setBeanClass(DataSourceInitializerPostProcessor.class);
82+
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
83+
// We don't need this one to be post processed otherwise it can cause a
84+
// cascade of bean instantiation that we would rather avoid.
85+
beanDefinition.setSynthetic(true);
86+
registry.registerBeanDefinition(BEAN_NAME, beanDefinition);
87+
}
88+
}
89+
90+
}
91+
92+
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.autoconfigure.social;
1818

1919
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
20+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2021
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2122
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -29,6 +30,7 @@
2930
import org.springframework.context.annotation.Scope;
3031
import org.springframework.context.annotation.ScopedProxyMode;
3132
import org.springframework.social.config.annotation.EnableSocial;
33+
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
3234
import org.springframework.social.connect.Connection;
3335
import org.springframework.social.connect.ConnectionFactory;
3436
import org.springframework.social.connect.ConnectionRepository;
@@ -46,7 +48,9 @@
4648
* @since 1.1.0
4749
*/
4850
@Configuration
49-
@ConditionalOnClass({ FacebookConnectionFactory.class })
51+
@ConditionalOnClass({ SocialConfigurerAdapter.class, FacebookConnectionFactory.class })
52+
@ConditionalOnProperty(prefix = "spring.social.facebook.", value = "app-id")
53+
@AutoConfigureBefore(SocialWebAutoConfiguration.class)
5054
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
5155
public class FacebookAutoConfiguration {
5256

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfiguration.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.autoconfigure.social;
1818

1919
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
20+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2021
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2122
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -29,6 +30,7 @@
2930
import org.springframework.context.annotation.Scope;
3031
import org.springframework.context.annotation.ScopedProxyMode;
3132
import org.springframework.social.config.annotation.EnableSocial;
33+
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
3234
import org.springframework.social.connect.Connection;
3335
import org.springframework.social.connect.ConnectionFactory;
3436
import org.springframework.social.connect.ConnectionRepository;
@@ -45,7 +47,9 @@
4547
* @since 1.1.0
4648
*/
4749
@Configuration
48-
@ConditionalOnClass({ LinkedInConnectionFactory.class })
50+
@ConditionalOnClass({ SocialConfigurerAdapter.class, LinkedInConnectionFactory.class })
51+
@ConditionalOnProperty(prefix = "spring.social.linkedin.", value = "app-id")
52+
@AutoConfigureBefore(SocialWebAutoConfiguration.class)
4953
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
5054
public class LinkedInAutoConfiguration {
5155

@@ -69,7 +73,7 @@ protected ConnectionFactory<?> createConnectionFactory(
6973
}
7074

7175
@Bean
72-
@ConditionalOnMissingBean(LinkedInConnectionFactory.class)
76+
@ConditionalOnMissingBean(LinkedIn.class)
7377
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
7478
public LinkedIn linkedin(ConnectionRepository repository) {
7579
Connection<LinkedIn> connection = repository

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialAutoConfigurerAdapter.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.boot.autoconfigure.social;
1818

19-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2019
import org.springframework.boot.bind.RelaxedPropertyResolver;
2120
import org.springframework.context.EnvironmentAware;
2221
import org.springframework.core.env.Environment;
@@ -31,7 +30,6 @@
3130
* @author Phillip Webb
3231
* @since 1.1.0
3332
*/
34-
@ConditionalOnClass(SocialConfigurerAdapter.class)
3533
abstract class SocialAutoConfigurerAdapter extends SocialConfigurerAdapter implements
3634
EnvironmentAware {
3735

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java

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

2121
import org.springframework.beans.factory.annotation.Autowired;
2222
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
23+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2324
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
2829
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2930
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
31+
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
3032
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
3133
import org.springframework.context.annotation.Bean;
3234
import org.springframework.context.annotation.Configuration;
@@ -45,10 +47,12 @@
4547
import org.springframework.social.connect.web.ProviderSignInController;
4648
import org.springframework.social.connect.web.ProviderSignInInterceptor;
4749
import org.springframework.social.connect.web.SignInAdapter;
50+
import org.springframework.social.connect.web.thymeleaf.SpringSocialDialect;
4851
import org.springframework.util.Assert;
4952
import org.springframework.util.CollectionUtils;
5053
import org.springframework.web.servlet.ViewResolver;
5154
import org.springframework.web.servlet.view.BeanNameViewResolver;
55+
import org.thymeleaf.spring4.SpringTemplateEngine;
5256

5357
/**
5458
* {@link EnableAutoConfiguration Auto-configuration} for Spring Social's web connection
@@ -59,6 +63,8 @@
5963
*/
6064
@Configuration
6165
@ConditionalOnClass({ ConnectController.class, SocialConfigurerAdapter.class })
66+
@ConditionalOnBean({ ConnectionFactoryLocator.class, UsersConnectionRepository.class })
67+
@AutoConfigureBefore(ThymeleafAutoConfiguration.class)
6268
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
6369
public class SocialWebAutoConfiguration {
6470

@@ -119,7 +125,7 @@ public ProviderSignInController signInController(
119125
@Configuration
120126
@EnableSocial
121127
@ConditionalOnWebApplication
122-
@ConditionalOnMissingClass(name="org.springframework.security.core.context.SecurityContextHolder")
128+
@ConditionalOnMissingClass(name = "org.springframework.security.core.context.SecurityContextHolder")
123129
protected static class AnonymousUserIdSourceConfig extends SocialConfigurerAdapter {
124130

125131
@Override
@@ -131,7 +137,6 @@ public String getUserId() {
131137
}
132138
};
133139
}
134-
135140
}
136141

137142
@Configuration
@@ -148,6 +153,18 @@ public UserIdSource getUserIdSource() {
148153

149154
}
150155

156+
@Configuration
157+
@ConditionalOnClass(SpringTemplateEngine.class)
158+
protected static class SpringSocialThymeleafConfig {
159+
160+
@Bean
161+
@ConditionalOnMissingBean
162+
public SpringSocialDialect springSocialDialect() {
163+
return new SpringSocialDialect();
164+
}
165+
166+
}
167+
151168
private static class SecurityContextUserIdSource implements UserIdSource {
152169

153170
@Override

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfiguration.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.autoconfigure.social;
1818

1919
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
20+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2021
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2122
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -29,6 +30,7 @@
2930
import org.springframework.context.annotation.Scope;
3031
import org.springframework.context.annotation.ScopedProxyMode;
3132
import org.springframework.social.config.annotation.EnableSocial;
33+
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
3234
import org.springframework.social.connect.Connection;
3335
import org.springframework.social.connect.ConnectionFactory;
3436
import org.springframework.social.connect.ConnectionRepository;
@@ -46,7 +48,9 @@
4648
* @since 1.1.0
4749
*/
4850
@Configuration
49-
@ConditionalOnClass({ TwitterConnectionFactory.class })
51+
@ConditionalOnClass({ SocialConfigurerAdapter.class, TwitterConnectionFactory.class })
52+
@ConditionalOnProperty(prefix = "spring.social.twitter.", value = "app-id")
53+
@AutoConfigureBefore(SocialWebAutoConfiguration.class)
5054
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
5155
public class TwitterAutoConfiguration {
5256

@@ -69,7 +73,7 @@ protected ConnectionFactory<?> createConnectionFactory(
6973
}
7074

7175
@Bean
72-
@ConditionalOnMissingBean(TwitterConnectionFactory.class)
76+
@ConditionalOnMissingBean
7377
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
7478
public Twitter twitter(ConnectionRepository repository) {
7579
Connection<Twitter> connection = repository

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/solr/SolrAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* @since 1.1.0
3838
*/
3939
@Configuration
40-
@ConditionalOnClass(SolrServer.class)
40+
@ConditionalOnClass({ HttpSolrServer.class, CloudSolrServer.class })
4141
@EnableConfigurationProperties(SolrProperties.class)
4242
public class SolrAutoConfiguration {
4343

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import javax.sql.DataSource;
2020

2121
import org.junit.Test;
22+
import org.springframework.beans.factory.BeanCreationException;
2223
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
2324
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
2425
import org.springframework.boot.test.EnvironmentTestUtils;
@@ -57,7 +58,9 @@ public void testDataScriptWithMissingDdl() throws Exception {
5758
"SELECT COUNT(*) from CITY", Integer.class));
5859
}
5960

60-
@Test
61+
// This can't succeed because the data SQL is executed immediately after the schema
62+
// and Hibernate hasn't initialized yet at that point
63+
@Test(expected = BeanCreationException.class)
6164
public void testDataScript() throws Exception {
6265
EnvironmentTestUtils.addEnvironment(this.context,
6366
"spring.datasource.data:classpath:/city.sql");

0 commit comments

Comments
 (0)