diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml index b95bfb217c3..b5ba8a6ea32 100644 --- a/spring-boot-autoconfigure/pom.xml +++ b/spring-boot-autoconfigure/pom.xml @@ -221,6 +221,36 @@ spring-mobile-device true + + org.springframework.social + spring-social-config + true + + + org.springframework.social + spring-social-core + true + + + org.springframework.social + spring-social-web + true + + + org.springframework.social + spring-social-facebook + true + + + org.springframework.social + spring-social-twitter + true + + + org.springframework.social + spring-social-linkedin + true + org.thymeleaf thymeleaf diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java new file mode 100644 index 00000000000..f5acf41a5ac --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java @@ -0,0 +1,91 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; +import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.core.env.Environment; +import org.springframework.social.config.annotation.ConnectionFactoryConfigurer; +import org.springframework.social.config.annotation.EnableSocial; +import org.springframework.social.config.annotation.SocialConfigurerAdapter; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.web.GenericConnectionStatusView; +import org.springframework.social.facebook.api.Facebook; +import org.springframework.social.facebook.api.impl.FacebookTemplate; +import org.springframework.social.facebook.connect.FacebookConnectionFactory; +import org.springframework.web.servlet.View; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Social connectivity + * with Facebook. + * + * @author Craig Walls + */ +@Configuration +@ConditionalOnClass({ FacebookConnectionFactory.class }) +@AutoConfigureAfter(WebMvcAutoConfiguration.class) +public class FacebookAutoConfiguration { + + @Configuration + @EnableSocial + @ConditionalOnWebApplication + protected static class FacebookAutoConfigurationAdapter extends SocialConfigurerAdapter implements EnvironmentAware { + + private String appId; + private String appSecret; + + @Override + public void setEnvironment(Environment env) { + RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "spring.social."); + this.appId = propertyResolver.getRequiredProperty("facebook.appId"); + this.appSecret = propertyResolver.getRequiredProperty("facebook.appSecret"); + } + + @Override + public void addConnectionFactories(ConnectionFactoryConfigurer config, Environment env) { + config.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret)); + } + + @Bean + @ConditionalOnMissingBean(Facebook.class) + @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) + public Facebook facebook(ConnectionRepository repository) { + Connection connection = repository.findPrimaryConnection(Facebook.class); + return connection != null ? connection.getApi() : new FacebookTemplate(); + } + + @Bean(name={"connect/facebookConnect", "connect/facebookConnected"}) + @ConditionalOnExpression("${spring.social.auto_connection_views:false}") + public View facebookConnectView() { + return new GenericConnectionStatusView("facebook", "Facebook"); + } + + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfiguration.java new file mode 100644 index 00000000000..d5533c8f37a --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfiguration.java @@ -0,0 +1,90 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; +import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.core.env.Environment; +import org.springframework.social.config.annotation.ConnectionFactoryConfigurer; +import org.springframework.social.config.annotation.EnableSocial; +import org.springframework.social.config.annotation.SocialConfigurerAdapter; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.web.GenericConnectionStatusView; +import org.springframework.social.linkedin.api.LinkedIn; +import org.springframework.social.linkedin.connect.LinkedInConnectionFactory; +import org.springframework.web.servlet.View; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Social connectivity + * with LinkedIn. + * + * @author Craig Walls + */ +@Configuration +@ConditionalOnClass({ LinkedInConnectionFactory.class }) +@AutoConfigureAfter(WebMvcAutoConfiguration.class) +public class LinkedInAutoConfiguration { + + @Configuration + @EnableSocial + @ConditionalOnWebApplication + protected static class LinkedInAutoConfigurationAdapter extends SocialConfigurerAdapter implements EnvironmentAware { + + private String appId; + private String appSecret; + + @Override + public void setEnvironment(Environment env) { + RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "spring.social."); + this.appId = propertyResolver.getRequiredProperty("linkedin.appId"); + this.appSecret = propertyResolver.getRequiredProperty("linkedin.appSecret"); + } + + @Override + public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) { + cfConfig.addConnectionFactory(new LinkedInConnectionFactory(appId, appSecret)); + } + + @Bean + @ConditionalOnMissingBean(LinkedInConnectionFactory.class) + @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) + public LinkedIn linkedin(ConnectionRepository repository) { + Connection connection = repository.findPrimaryConnection(LinkedIn.class); + return connection != null ? connection.getApi() : null; + } + + @Bean(name={"connect/linkedinConnect", "connect/linkedinConnected"}) + @ConditionalOnExpression("${spring.social.auto_connection_views:false}") + public View linkedInConnectView() { + return new GenericConnectionStatusView("linkedin", "LinkedIn"); + } + + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java new file mode 100644 index 00000000000..01ee6803190 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java @@ -0,0 +1,78 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.social.UserIdSource; +import org.springframework.social.config.annotation.EnableSocial; +import org.springframework.social.config.annotation.SocialConfigurerAdapter; +import org.springframework.social.connect.ConnectionFactoryLocator; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.web.ConnectController; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.view.BeanNameViewResolver; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Social's web connection support. + * + * @author Craig Walls + */ +@Configuration +@ConditionalOnClass({ ConnectController.class }) +@AutoConfigureAfter(WebMvcAutoConfiguration.class) +public class SocialWebAutoConfiguration { + + @Configuration + @EnableSocial + @ConditionalOnWebApplication + protected static class SocialAutoConfigurationAdapter extends SocialConfigurerAdapter { + @Bean + @ConditionalOnMissingBean(ConnectController.class) + public ConnectController connectController( + ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) { + return new ConnectController(connectionFactoryLocator, connectionRepository); + } + + @Bean + @ConditionalOnMissingBean(BeanNameViewResolver.class) + @ConditionalOnExpression("${spring.social.auto_connection_views:false}") + public ViewResolver beanNameViewResolver() { + BeanNameViewResolver bnvr = new BeanNameViewResolver(); + bnvr.setOrder(Integer.MIN_VALUE); + return bnvr; + } + + @Override + public UserIdSource getUserIdSource() { + return new UserIdSource() { + @Override + public String getUserId() { + return "anonymous"; + } + }; + } + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfiguration.java new file mode 100644 index 00000000000..6741b7dabc2 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfiguration.java @@ -0,0 +1,91 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; +import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.core.env.Environment; +import org.springframework.social.config.annotation.ConnectionFactoryConfigurer; +import org.springframework.social.config.annotation.EnableSocial; +import org.springframework.social.config.annotation.SocialConfigurerAdapter; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.web.GenericConnectionStatusView; +import org.springframework.social.twitter.api.Twitter; +import org.springframework.social.twitter.api.impl.TwitterTemplate; +import org.springframework.social.twitter.connect.TwitterConnectionFactory; +import org.springframework.web.servlet.View; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Social connectivity + * with Twitter. + * + * @author Craig Walls + */ +@Configuration +@ConditionalOnClass({ TwitterConnectionFactory.class }) +@AutoConfigureAfter(WebMvcAutoConfiguration.class) +public class TwitterAutoConfiguration { + + @Configuration + @EnableSocial + @ConditionalOnWebApplication + protected static class TwitterAutoConfigurationAdapter extends SocialConfigurerAdapter implements EnvironmentAware { + + private String appId; + private String appSecret; + + @Override + public void setEnvironment(Environment env) { + RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "spring.social."); + this.appId = propertyResolver.getRequiredProperty("twitter.appId"); + this.appSecret = propertyResolver.getRequiredProperty("twitter.appSecret"); + } + + @Override + public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) { + cfConfig.addConnectionFactory(new TwitterConnectionFactory(appId, appSecret)); + } + + @Bean + @ConditionalOnMissingBean(TwitterConnectionFactory.class) + @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) + public Twitter twitter(ConnectionRepository repository) { + Connection connection = repository.findPrimaryConnection(Twitter.class); + return connection != null ? connection.getApi() : new TwitterTemplate(appId, appSecret); + } + + @Bean(name={"connect/twitterConnect", "connect/twitterConnected"}) + @ConditionalOnExpression("${spring.social.auto_connection_views:false}") + public View twitterConnectView() { + return new GenericConnectionStatusView("twitter", "Twitter"); + } + + } + +} diff --git a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index 6077195426f..c4670700267 100644 --- a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -33,6 +33,10 @@ org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\ +org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\ +org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\ +org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\ +org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfigurationTests.java new file mode 100644 index 00000000000..bd41ec58074 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfigurationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Test; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.social.UserIdSource; +import org.springframework.social.connect.ConnectionFactoryLocator; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.UsersConnectionRepository; +import org.springframework.social.facebook.api.Facebook; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +/** + * Tests for {@link FacebookAutoConfiguration}. + * + * @author Craig Walls + */ +public class FacebookAutoConfigurationTests { + + private AnnotationConfigWebApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void expectedSocialBeansCreated() throws Exception { + this.context = new AnnotationConfigWebApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.social.facebook.appId:12345"); + EnvironmentTestUtils.addEnvironment(this.context, "spring.social.facebook.appSecret:secret"); + this.context.register(SocialWebAutoConfiguration.class); + this.context.register(FacebookAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(UsersConnectionRepository.class)); + assertNotNull(this.context.getBean(ConnectionRepository.class)); + assertNotNull(this.context.getBean(ConnectionFactoryLocator.class)); + assertNotNull(this.context.getBean(UserIdSource.class)); + assertNotNull(this.context.getBean(Facebook.class)); + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfigurationTests.java new file mode 100644 index 00000000000..3e831a8622b --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfigurationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Test; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.social.UserIdSource; +import org.springframework.social.connect.ConnectionFactoryLocator; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.UsersConnectionRepository; +import org.springframework.social.linkedin.api.LinkedIn; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +/** + * Tests for {@link LinkedInAutoConfiguration}. + * + * @author Craig Walls + */ +public class LinkedInAutoConfigurationTests { + + private AnnotationConfigWebApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void expectedSocialBeansCreated() throws Exception { + this.context = new AnnotationConfigWebApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.social.linkedin.appId:12345"); + EnvironmentTestUtils.addEnvironment(this.context, "spring.social.linkedin.appSecret:secret"); + this.context.register(SocialWebAutoConfiguration.class); + this.context.register(LinkedInAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(UsersConnectionRepository.class)); + assertNotNull(this.context.getBean(ConnectionRepository.class)); + assertNotNull(this.context.getBean(ConnectionFactoryLocator.class)); + assertNotNull(this.context.getBean(UserIdSource.class)); + assertNotNull(this.context.getBean(LinkedIn.class)); + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfigurationTests.java new file mode 100644 index 00000000000..a06868fe822 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfigurationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.social; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Test; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.social.UserIdSource; +import org.springframework.social.connect.ConnectionFactoryLocator; +import org.springframework.social.connect.ConnectionRepository; +import org.springframework.social.connect.UsersConnectionRepository; +import org.springframework.social.twitter.api.Twitter; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +/** + * Tests for {@link TwitterAutoConfiguration}. + * + * @author Craig Walls + */ +public class TwitterAutoConfigurationTests { + + private AnnotationConfigWebApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void expectedSocialBeansCreated() throws Exception { + this.context = new AnnotationConfigWebApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, "spring.social.twitter.appId:12345"); + EnvironmentTestUtils.addEnvironment(this.context, "spring.social.twitter.appSecret:secret"); + this.context.register(SocialWebAutoConfiguration.class); + this.context.register(TwitterAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(UsersConnectionRepository.class)); + assertNotNull(this.context.getBean(ConnectionRepository.class)); + assertNotNull(this.context.getBean(ConnectionFactoryLocator.class)); + assertNotNull(this.context.getBean(UserIdSource.class)); + assertNotNull(this.context.getBean(Twitter.class)); + } + +} diff --git a/spring-boot-autoconfigure/src/test/resources/application.properties b/spring-boot-autoconfigure/src/test/resources/application.properties index 3fa3f5bae02..c15c79e4719 100644 --- a/spring-boot-autoconfigure/src/test/resources/application.properties +++ b/spring-boot-autoconfigure/src/test/resources/application.properties @@ -1 +1,7 @@ -foo: bucket \ No newline at end of file +foo: bucket +spring.social.facebook.appId=fbid +spring.social.facebook.appSecret=fbsecret +spring.social.twitter.appId=twid +spring.social.twitter.appSecret=twsecret +spring.social.linkedin.appId=liid +spring.social.linkedin.appSecret=lisecret \ No newline at end of file diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialFacebookCompilerAutoConfiguration.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialFacebookCompilerAutoConfiguration.java new file mode 100644 index 00000000000..6f6f1435011 --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialFacebookCompilerAutoConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.cli.compiler.autoconfigure; + +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.control.CompilationFailedException; +import org.codehaus.groovy.control.customizers.ImportCustomizer; +import org.springframework.boot.cli.compiler.AstUtils; +import org.springframework.boot.cli.compiler.CompilerAutoConfiguration; +import org.springframework.boot.cli.compiler.DependencyCustomizer; + +/** + * {@link CompilerAutoConfiguration} for Spring Social Facebook. + * + * @author Craig Walls + */ +public class SpringSocialFacebookCompilerAutoConfiguration extends CompilerAutoConfiguration { + + @Override + public boolean matches(ClassNode classNode) { + return AstUtils.hasAtLeastOneFieldOrMethod(classNode, "Facebook"); + } + + @Override + public void applyDependencies(DependencyCustomizer dependencies) + throws CompilationFailedException { + dependencies + .ifAnyMissingClasses("org.springframework.social.facebook.api.Facebook") + .add("spring-boot-starter-social-facebook"); + } + + @Override + public void applyImports(ImportCustomizer imports) throws CompilationFailedException { + imports.addStarImports("org.springframework.social.facebook.api"); + imports.addStarImports("org.springframework.social.config.annotation"); + } + +} diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialLinkedInCompilerAutoConfiguration.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialLinkedInCompilerAutoConfiguration.java new file mode 100644 index 00000000000..2eac3d604ff --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialLinkedInCompilerAutoConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.cli.compiler.autoconfigure; + +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.control.CompilationFailedException; +import org.codehaus.groovy.control.customizers.ImportCustomizer; +import org.springframework.boot.cli.compiler.AstUtils; +import org.springframework.boot.cli.compiler.CompilerAutoConfiguration; +import org.springframework.boot.cli.compiler.DependencyCustomizer; + +/** + * {@link CompilerAutoConfiguration} for Spring Social LinkedIn. + * + * @author Craig Walls + */ +public class SpringSocialLinkedInCompilerAutoConfiguration extends CompilerAutoConfiguration { + + @Override + public boolean matches(ClassNode classNode) { + return AstUtils.hasAtLeastOneFieldOrMethod(classNode, "LinkedIn"); + } + + @Override + public void applyDependencies(DependencyCustomizer dependencies) + throws CompilationFailedException { + dependencies + .ifAnyMissingClasses("org.springframework.social.linkedin.api.LinkedIn") + .add("spring-boot-starter-social-linkedin"); + } + + @Override + public void applyImports(ImportCustomizer imports) throws CompilationFailedException { + imports.addStarImports("org.springframework.social.linkedin.api"); + imports.addImports("org.springframework.social.config.annotation.EnableSocial"); + } + +} diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialTwitterCompilerAutoConfiguration.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialTwitterCompilerAutoConfiguration.java new file mode 100644 index 00000000000..476db095f71 --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialTwitterCompilerAutoConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.cli.compiler.autoconfigure; + +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.control.CompilationFailedException; +import org.codehaus.groovy.control.customizers.ImportCustomizer; +import org.springframework.boot.cli.compiler.AstUtils; +import org.springframework.boot.cli.compiler.CompilerAutoConfiguration; +import org.springframework.boot.cli.compiler.DependencyCustomizer; + +/** + * {@link CompilerAutoConfiguration} for Spring Social Twitter. + * + * @author Craig Walls + */ +public class SpringSocialTwitterCompilerAutoConfiguration extends CompilerAutoConfiguration { + + @Override + public boolean matches(ClassNode classNode) { + return AstUtils.hasAtLeastOneFieldOrMethod(classNode, "Twitter"); + } + + @Override + public void applyDependencies(DependencyCustomizer dependencies) + throws CompilationFailedException { + dependencies + .ifAnyMissingClasses("org.springframework.social.twitter.api.Twitter") + .add("spring-boot-starter-social-twitter"); + } + + @Override + public void applyImports(ImportCustomizer imports) throws CompilationFailedException { + imports.addStarImports("org.springframework.social.twitter.api"); + imports.addImports("org.springframework.social.config.annotation.EnableSocial"); + } + +} diff --git a/spring-boot-cli/src/main/resources/META-INF/services/org.springframework.boot.cli.compiler.CompilerAutoConfiguration b/spring-boot-cli/src/main/resources/META-INF/services/org.springframework.boot.cli.compiler.CompilerAutoConfiguration index 314bb1657a8..30748a2c992 100644 --- a/spring-boot-cli/src/main/resources/META-INF/services/org.springframework.boot.cli.compiler.CompilerAutoConfiguration +++ b/spring-boot-cli/src/main/resources/META-INF/services/org.springframework.boot.cli.compiler.CompilerAutoConfiguration @@ -11,5 +11,8 @@ org.springframework.boot.cli.compiler.autoconfigure.TransactionManagementCompile org.springframework.boot.cli.compiler.autoconfigure.SpringIntegrationCompilerAutoConfiguration org.springframework.boot.cli.compiler.autoconfigure.SpringSecurityCompilerAutoConfiguration org.springframework.boot.cli.compiler.autoconfigure.SpringMobileCompilerAutoConfiguration +org.springframework.boot.cli.compiler.autoconfigure.SpringSocialFacebookCompilerAutoConfiguration +org.springframework.boot.cli.compiler.autoconfigure.SpringSocialLinkedInCompilerAutoConfiguration +org.springframework.boot.cli.compiler.autoconfigure.SpringSocialTwitterCompilerAutoConfiguration org.springframework.boot.cli.compiler.autoconfigure.SpringTestCompilerAutoConfiguration org.springframework.boot.cli.compiler.autoconfigure.SpringWebsocketCompilerAutoConfiguration \ No newline at end of file diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 1f0e64db53e..2d3ade097a3 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -97,6 +97,10 @@ 4.0.1.RELEASE 1.2.0.RELEASE 1.1.1.RELEASE + 1.1.0.RELEASE + 1.1.0.RELEASE + 1.1.0.RELEASE + 1.0.0.RELEASE 3.2.4.RELEASE 1.0.2.RELEASE 2.1.3.RELEASE @@ -982,6 +986,36 @@ spring-security-jwt ${spring-security-jwt.version} + + org.springframework.social + spring-social-config + ${spring-social.version} + + + org.springframework.social + spring-social-core + ${spring-social.version} + + + org.springframework.social + spring-social-web + ${spring-social.version} + + + org.springframework.social + spring-social-facebook + ${spring-social-facebook.version} + + + org.springframework.social + spring-social-twitter + ${spring-social-twitter.version} + + + org.springframework.social + spring-social-linkedin + ${spring-social-linkedin.version} + org.thymeleaf thymeleaf diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 8f147379146..56d176131e7 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -40,6 +40,9 @@ spring-boot-starter-parent spring-boot-starter-redis spring-boot-starter-security + spring-boot-starter-social-facebook + spring-boot-starter-social-twitter + spring-boot-starter-social-linkedin spring-boot-starter-remote-shell spring-boot-starter-test spring-boot-starter-thymeleaf diff --git a/spring-boot-starters/spring-boot-starter-social-facebook/pom.xml b/spring-boot-starters/spring-boot-starter-social-facebook/pom.xml new file mode 100644 index 00000000000..ccd0e9dda05 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-social-facebook/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starters + 1.1.0.BUILD-SNAPSHOT + + spring-boot-starter-social-facebook + Spring Boot Social Facebook Starter + Spring Boot Social Facebook Starter + http://projects.spring.io/spring-boot/ + + Pivotal Software, Inc. + http://www.spring.io + + + ${basedir}/../.. + + + + ${project.groupId} + spring-boot-starter + ${project.version} + + + ${project.groupId} + spring-boot-starter-web + ${project.version} + + + org.springframework.social + spring-social-config + + + org.springframework.social + spring-social-core + + + org.springframework.social + spring-social-web + + + org.springframework.social + spring-social-facebook + + + diff --git a/spring-boot-starters/spring-boot-starter-social-facebook/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-social-facebook/src/main/resources/META-INF/spring.provides new file mode 100644 index 00000000000..0dfc2d109dd --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-social-facebook/src/main/resources/META-INF/spring.provides @@ -0,0 +1 @@ +provides: spring-social-facebook \ No newline at end of file diff --git a/spring-boot-starters/spring-boot-starter-social-linkedin/pom.xml b/spring-boot-starters/spring-boot-starter-social-linkedin/pom.xml new file mode 100644 index 00000000000..f8100221623 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-social-linkedin/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starters + 1.1.0.BUILD-SNAPSHOT + + spring-boot-starter-social-linkedin + Spring Boot Social LinkedIn Starter + Spring Boot Social LinkedIn Starter + http://projects.spring.io/spring-boot/ + + Pivotal Software, Inc. + http://www.spring.io + + + ${basedir}/../.. + + + + ${project.groupId} + spring-boot-starter + ${project.version} + + + ${project.groupId} + spring-boot-starter-web + ${project.version} + + + org.springframework.social + spring-social-config + + + org.springframework.social + spring-social-core + + + org.springframework.social + spring-social-web + + + org.springframework.social + spring-social-linkedin + + + diff --git a/spring-boot-starters/spring-boot-starter-social-linkedin/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-social-linkedin/src/main/resources/META-INF/spring.provides new file mode 100644 index 00000000000..183a3a5a63c --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-social-linkedin/src/main/resources/META-INF/spring.provides @@ -0,0 +1 @@ +provides: spring-social-linkedin \ No newline at end of file diff --git a/spring-boot-starters/spring-boot-starter-social-twitter/pom.xml b/spring-boot-starters/spring-boot-starter-social-twitter/pom.xml new file mode 100644 index 00000000000..917f7d372f5 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-social-twitter/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starters + 1.1.0.BUILD-SNAPSHOT + + spring-boot-starter-social-twitter + Spring Boot Social Twitter Starter + Spring Boot Social Twitter Starter + http://projects.spring.io/spring-boot/ + + Pivotal Software, Inc. + http://www.spring.io + + + ${basedir}/../.. + + + + ${project.groupId} + spring-boot-starter + ${project.version} + + + ${project.groupId} + spring-boot-starter-web + ${project.version} + + + org.springframework.social + spring-social-config + + + org.springframework.social + spring-social-core + + + org.springframework.social + spring-social-web + + + org.springframework.social + spring-social-twitter + + + diff --git a/spring-boot-starters/spring-boot-starter-social-twitter/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-social-twitter/src/main/resources/META-INF/spring.provides new file mode 100644 index 00000000000..0b627cbfbd5 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-social-twitter/src/main/resources/META-INF/spring.provides @@ -0,0 +1 @@ +provides: spring-social-twitter \ No newline at end of file