diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml index b95bfb217c..b5ba8a6ea3 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 0000000000..c9e9719971 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java @@ -0,0 +1,97 @@ +/* + * 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 + * @since 1.1.0 + */ +@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(this.appId, + this.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 0000000000..da95ee8cbc --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfiguration.java @@ -0,0 +1,96 @@ +/* + * 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 + * @since 1.1.0 + */ +@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(this.appId, + this.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 0000000000..c98998e0ca --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java @@ -0,0 +1,81 @@ +/* + * 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 + * @since 1.1.0 + */ +@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 0000000000..a1dbadff2e --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfiguration.java @@ -0,0 +1,98 @@ +/* + * 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 + * @since 1.1.0 + */ +@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(this.appId, + this.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( + this.appId, this.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 6077195426..c467070026 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 0000000000..6a20b61d46 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfigurationTests.java @@ -0,0 +1,64 @@ +/* + * 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.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; + +import static org.junit.Assert.assertNotNull; + +/** + * 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 0000000000..d1f57909a0 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/LinkedInAutoConfigurationTests.java @@ -0,0 +1,64 @@ +/* + * 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.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; + +import static org.junit.Assert.assertNotNull; + +/** + * 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 0000000000..09988cea4c --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/social/TwitterAutoConfigurationTests.java @@ -0,0 +1,64 @@ +/* + * 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.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; + +import static org.junit.Assert.assertNotNull; + +/** + * 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 3fa3f5bae0..c15c79e471 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 0000000000..37fe98393c --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialFacebookCompilerAutoConfiguration.java @@ -0,0 +1,54 @@ +/* + * 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 + * @since 1.1.0 + */ +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 0000000000..1f2763bd6b --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialLinkedInCompilerAutoConfiguration.java @@ -0,0 +1,54 @@ +/* + * 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 + * @since 1.1.0 + */ +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 0000000000..84a73538a6 --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/autoconfigure/SpringSocialTwitterCompilerAutoConfiguration.java @@ -0,0 +1,54 @@ +/* + * 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 + * @since 1.1.0 + */ +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 314bb1657a..30748a2c99 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 1f0e64db53..3a1b6000f1 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.1.RELEASE + 1.1.0.RELEASE + 1.0.1.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-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index c154ec25fd..b81b633f59 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -258,6 +258,21 @@ content into your application; rather pick only the properties that you need. # FILE ENCODING ({sc-spring-boot}/context/FileEncodingApplicationListener.{sc-ext}[FileEncodingApplicationListener]) spring.mandatory-file-encoding=false + # SPRING SOCIAL ({sc-spring-boot-autoconfigure}/social/SocialWebAutoConfiguration.{sc-ext}[SocialWebAutoConfiguration]) + spring.social.auto_connection_views=true # Set to true for default connection views or false if you provide your own + + # SPRING SOCIAL FACEBOOK ({sc-spring-boot-autoconfigure}/social/FacebookAutoConfiguration.{sc-ext}[FacebookAutoConfiguration]) + spring.social.facebook.appId= # your application's Facebook App ID + spring.social.facebook.appSecret= # your application's Facebook App Secret + + # SPRING SOCIAL LINKEDIN ({sc-spring-boot-autoconfigure}/social/LinkedInAutoConfiguration.{sc-ext}[LinkedInAutoConfiguration]) + spring.social.linkedin.appId= # your application's LinkedIn App ID + spring.social.linkedin.appSecret= # your application's LinkedIn App Secret + + # SPRING SOCIAL TWITTER ({sc-spring-boot-autoconfigure}/social/TwitterAutoConfiguration.{sc-ext}[TwitterAutoConfiguration]) + spring.social.twitter.appId= # your application's Twitter App ID + spring.social.twitter.appSecret= # your application's Twitter App Secret + # ---------------------------------------- # ACTUATOR PROPERTIES # ---------------------------------------- diff --git a/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc b/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc index a65e529a04..6a85e9dec6 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc @@ -38,6 +38,9 @@ The following auto-configuration classes are from the `spring-boot-autoconfigure |{sc-spring-boot-autoconfigure}/web/EmbeddedServletContainerAutoConfiguration.{sc-ext}[EmbeddedServletContainerAutoConfiguration] |{dc-spring-boot-autoconfigure}/web/EmbeddedServletContainerAutoConfiguration.{dc-ext}[javadoc] +|{sc-spring-boot-autoconfigure}/social/FacebookAutoConfiguration.{sc-ext}[FacebookAutoConfiguration] +|{dc-spring-boot-autoconfigure}/social/FacebookAutoConfiguration.{dc-ext}[javadoc] + |{sc-spring-boot-autoconfigure}/freemarker/FreeMarkerAutoConfiguration.{sc-ext}[FreeMarkerAutoConfiguration] |{dc-spring-boot-autoconfigure}/freemarker/FreeMarkerAutoConfiguration.{dc-ext}[javadoc] @@ -59,6 +62,9 @@ The following auto-configuration classes are from the `spring-boot-autoconfigure |{sc-spring-boot-autoconfigure}/data/JpaRepositoriesAutoConfiguration.{sc-ext}[JpaRepositoriesAutoConfiguration] |{dc-spring-boot-autoconfigure}/data/JpaRepositoriesAutoConfiguration.{dc-ext}[javadoc] +|{sc-spring-boot-autoconfigure}/social/LinkedInAutoConfiguration.{sc-ext}[LinkedInAutoConfiguration] +|{dc-spring-boot-autoconfigure}/social/LinkedInAutoConfiguration.{dc-ext}[javadoc] + |{sc-spring-boot-autoconfigure}/liquibase/LiquibaseAutoConfiguration.{sc-ext}[LiquibaseAutoConfiguration] |{dc-spring-boot-autoconfigure}/liquibase/LiquibaseAutoConfiguration.{dc-ext}[javadoc] @@ -95,6 +101,9 @@ The following auto-configuration classes are from the `spring-boot-autoconfigure |{sc-spring-boot-autoconfigure}/web/ServerPropertiesAutoConfiguration.{sc-ext}[ServerPropertiesAutoConfiguration] |{dc-spring-boot-autoconfigure}/web/ServerPropertiesAutoConfiguration.{dc-ext}[javadoc] +|{sc-spring-boot-autoconfigure}/social/SocialWebAutoConfiguration.{sc-ext}[SocialWebAutoConfiguration] +|{dc-spring-boot-autoconfigure}/social/SocialWebAutoConfiguration.{dc-ext}[javadoc] + |{sc-spring-boot-autoconfigure}/solr/SolrAutoConfiguration.{sc-ext}[SolrAutoConfiguration] |{dc-spring-boot-autoconfigure}/solr/SolrAutoConfiguration.{dc-ext}[javadoc] @@ -104,6 +113,9 @@ The following auto-configuration classes are from the `spring-boot-autoconfigure |{sc-spring-boot-autoconfigure}/thymeleaf/ThymeleafAutoConfiguration.{sc-ext}[ThymeleafAutoConfiguration] |{dc-spring-boot-autoconfigure}/thymeleaf/ThymeleafAutoConfiguration.{dc-ext}[javadoc] +|{sc-spring-boot-autoconfigure}/social/TwitterAutoConfiguration.{sc-ext}[TwitterAutoConfiguration] +|{dc-spring-boot-autoconfigure}/social/TwitterAutoConfiguration.{dc-ext}[javadoc] + |{sc-spring-boot-autoconfigure}/velocity/VelocityAutoConfiguration.{sc-ext}[VelocityAutoConfiguration] |{dc-spring-boot-autoconfigure}/velocity/VelocityAutoConfiguration.{dc-ext}[javadoc] diff --git a/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc b/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc index 3257719bc4..6db86b637a 100644 --- a/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc +++ b/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc @@ -257,6 +257,15 @@ and Hibernate. |`spring-boot-starter-security` |Support for `spring-security`. +|`spring-boot-starter-social-facebook` +|Support for `spring-social-facebook`. + +|`spring-boot-starter-social-linkedin` +|Support for `spring-social-linkedin`. + +|`spring-boot-starter-social-twitter` +|Support for `spring-social-twitter`. + |`spring-boot-starter-test` |Support for common test dependencies, including JUnit, Hamcrest and Mockito along with the `spring-test` module. diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 8f14737914..56d176131e 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 0000000000..ccd0e9dda0 --- /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 0000000000..0dfc2d109d --- /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 0000000000..f810022162 --- /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 0000000000..183a3a5a63 --- /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 0000000000..917f7d372f --- /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 0000000000..0b627cbfbd --- /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