From e472b34fd62728f80d3bb91b8d0d51c231455892 Mon Sep 17 00:00:00 2001 From: shravanmahankali Date: Mon, 25 Apr 2011 16:32:05 +0530 Subject: [PATCH 1/2] Added linkedin connect and replaced following no more available classes causing compilation failures: "org.springframework.social.connect.signin.web.ProviderUserSignInController" class with "org.springframework.social.connect.signin.web.ProviderSignInController", "org.springframework.social.connect.signin.web.ProviderUserSignInUtils" class with "org.springframework.social.connect.signin.web.ProviderSignInUtils" --- spring-social-showcase/README | 1 + spring-social-showcase/pom.xml | 6 ++++++ .../social/showcase/ConnectedToHandlerInterceptor.java | 2 ++ .../social/showcase/config/ServiceApisConfig.java | 8 ++++++++ .../social/showcase/signup/SignupController.java | 4 ++-- .../src/main/webapp/WEB-INF/layouts/menu.jsp | 8 ++++++++ .../main/webapp/WEB-INF/spring/appServlet/controllers.xml | 2 +- .../src/main/webapp/WEB-INF/spring/connect.xml | 4 ++++ .../src/main/webapp/WEB-INF/spring/properties.xml | 2 ++ .../src/main/webapp/WEB-INF/views/connect/tiles.xml | 8 ++++++++ spring-social-showcase/src/main/webapp/resources/page.css | 8 +++++++- 11 files changed, 49 insertions(+), 4 deletions(-) diff --git a/spring-social-showcase/README b/spring-social-showcase/README index b9a873e9..048dd02b 100644 --- a/spring-social-showcase/README +++ b/spring-social-showcase/README @@ -1,6 +1,7 @@ This sample app demonstrates many of the capabilities of the Spring Social project, including: - Connect to Facebook - Connect to Twitter +- Connect to LinkedIn - Sign in using Facebook - Sign in using Twitter diff --git a/spring-social-showcase/pom.xml b/spring-social-showcase/pom.xml index 64112a64..2dae18d3 100644 --- a/spring-social-showcase/pom.xml +++ b/spring-social-showcase/pom.xml @@ -58,6 +58,11 @@ org.springframework.social spring-social-twitter ${org.springframework.social-version} + + + org.springframework.social + spring-social-linkedin + ${org.springframework.social-version} org.springframework.social @@ -265,5 +270,6 @@ 1.0-beta-1 + spring-social-showcase diff --git a/spring-social-showcase/src/main/java/org/springframework/social/showcase/ConnectedToHandlerInterceptor.java b/spring-social-showcase/src/main/java/org/springframework/social/showcase/ConnectedToHandlerInterceptor.java index d29d44b5..eb9a4446 100644 --- a/spring-social-showcase/src/main/java/org/springframework/social/showcase/ConnectedToHandlerInterceptor.java +++ b/spring-social-showcase/src/main/java/org/springframework/social/showcase/ConnectedToHandlerInterceptor.java @@ -6,6 +6,7 @@ import org.springframework.social.connect.ServiceProviderConnectionRepository; import org.springframework.social.facebook.api.FacebookApi; +import org.springframework.social.linkedin.api.LinkedInApi; import org.springframework.social.twitter.api.TwitterApi; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; @@ -19,6 +20,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons if (request.getUserPrincipal() != null) { request.setAttribute("connectedToTwitter", connectionRepository.findPrimaryConnectionToServiceApi(TwitterApi.class) != null); request.setAttribute("connectedToFacebook", connectionRepository.findPrimaryConnectionToServiceApi(FacebookApi.class) != null); + request.setAttribute("connectedToLinkedIn", connectionRepository.findPrimaryConnectionToServiceApi(LinkedInApi.class) != null); } return true; } diff --git a/spring-social-showcase/src/main/java/org/springframework/social/showcase/config/ServiceApisConfig.java b/spring-social-showcase/src/main/java/org/springframework/social/showcase/config/ServiceApisConfig.java index 8a4540bd..8d509ebc 100644 --- a/spring-social-showcase/src/main/java/org/springframework/social/showcase/config/ServiceApisConfig.java +++ b/spring-social-showcase/src/main/java/org/springframework/social/showcase/config/ServiceApisConfig.java @@ -9,6 +9,7 @@ import org.springframework.social.connect.ServiceProviderConnection; import org.springframework.social.connect.ServiceProviderConnectionRepository; import org.springframework.social.facebook.api.FacebookApi; +import org.springframework.social.linkedin.api.LinkedInApi; import org.springframework.social.tripit.api.TripItApi; import org.springframework.social.twitter.api.TwitterApi; @@ -38,5 +39,12 @@ public TwitterApi twitterApi() { ServiceProviderConnection connection = connectionRepository.findPrimaryConnectionToServiceApi(TwitterApi.class); return connection != null ? connection.getServiceApi() : null; } + + @Bean + @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) + public LinkedInApi linkedInApi() { + ServiceProviderConnection connection = connectionRepository.findPrimaryConnectionToServiceApi(LinkedInApi.class); + return connection != null ? connection.getServiceApi() : null; + } } diff --git a/spring-social-showcase/src/main/java/org/springframework/social/showcase/signup/SignupController.java b/spring-social-showcase/src/main/java/org/springframework/social/showcase/signup/SignupController.java index d2098724..14298152 100644 --- a/spring-social-showcase/src/main/java/org/springframework/social/showcase/signup/SignupController.java +++ b/spring-social-showcase/src/main/java/org/springframework/social/showcase/signup/SignupController.java @@ -18,7 +18,7 @@ import javax.inject.Inject; import javax.validation.Valid; -import org.springframework.social.connect.signin.web.ProviderUserSignInUtils; +import org.springframework.social.connect.signin.web.ProviderSignInUtils; import org.springframework.social.showcase.account.Account; import org.springframework.social.showcase.account.AccountRepository; import org.springframework.social.showcase.account.UsernameAlreadyInUseException; @@ -54,7 +54,7 @@ public String signup(@Valid SignupForm form, BindingResult formBinding, WebReque } boolean accountCreated = createAccount(form, formBinding); if (accountCreated) { - ProviderUserSignInUtils.handlePostSignUp(request); + ProviderSignInUtils.handlePostSignUp(request); return "redirect:/"; } return null; diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/layouts/menu.jsp b/spring-social-showcase/src/main/webapp/WEB-INF/layouts/menu.jsp index b7768472..fac8f548 100644 --- a/spring-social-showcase/src/main/webapp/WEB-INF/layouts/menu.jsp +++ b/spring-social-showcase/src/main/webapp/WEB-INF/layouts/menu.jsp @@ -24,3 +24,11 @@

">TripIt

+ +

">LinkedIn

+ + + \ No newline at end of file diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/spring/appServlet/controllers.xml b/spring-social-showcase/src/main/webapp/WEB-INF/spring/appServlet/controllers.xml index 8eb69c49..75c7a129 100644 --- a/spring-social-showcase/src/main/webapp/WEB-INF/spring/appServlet/controllers.xml +++ b/spring-social-showcase/src/main/webapp/WEB-INF/spring/appServlet/controllers.xml @@ -20,7 +20,7 @@ - + diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/spring/connect.xml b/spring-social-showcase/src/main/webapp/WEB-INF/spring/connect.xml index b7d9c847..cf52e442 100644 --- a/spring-social-showcase/src/main/webapp/WEB-INF/spring/connect.xml +++ b/spring-social-showcase/src/main/webapp/WEB-INF/spring/connect.xml @@ -26,6 +26,10 @@ + + + + diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/spring/properties.xml b/spring-social-showcase/src/main/webapp/WEB-INF/spring/properties.xml index 612b4670..48cd4a3e 100644 --- a/spring-social-showcase/src/main/webapp/WEB-INF/spring/properties.xml +++ b/spring-social-showcase/src/main/webapp/WEB-INF/spring/properties.xml @@ -16,6 +16,8 @@ Kb8hS0luftwCJX3qVoyiLUMfZDtK1EozFoUkjNLUMx4 ee68437fbf8f42315a1b1ebe5a2a3009bd3f5cf9 6b3cf4d183cc02076d068eea91080ca0bf666336 + + diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/tiles.xml b/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/tiles.xml index 50298831..db455d76 100644 --- a/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/tiles.xml +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/tiles.xml @@ -26,5 +26,13 @@ + + + + + + + + diff --git a/spring-social-showcase/src/main/webapp/resources/page.css b/spring-social-showcase/src/main/webapp/resources/page.css index d493a9e4..b0f57987 100644 --- a/spring-social-showcase/src/main/webapp/resources/page.css +++ b/spring-social-showcase/src/main/webapp/resources/page.css @@ -99,4 +99,10 @@ ul.choices li { ul.choices li:first-child { padding-left: 0px; border-left: none; -} \ No newline at end of file +} + +.evenrow {background-color:white;} + +.oddrow {background-color:lightgrey;} + +img {color:red; font-size:small; font-style:italic;} \ No newline at end of file From ed8e913b9961b6cd3610f90591e888050a1e4492 Mon Sep 17 00:00:00 2001 From: shravanmahankali Date: Mon, 25 Apr 2011 16:35:09 +0530 Subject: [PATCH 2/2] Added linkedin connect --- .../LinkedInConnectionsController.java | 27 ++++++++++ .../linkedin/LinkedInProfileController.java | 51 ++++++++++++++++++ .../WEB-INF/views/connect/linkedinConnect.jsp | 17 ++++++ .../views/connect/linkedinConnected.jsp | 19 +++++++ .../WEB-INF/views/linkedin/connections.jsp | 17 ++++++ .../WEB-INF/views/linkedin/linkedin.jsp | 40 ++++++++++++++ .../webapp/WEB-INF/views/linkedin/profile.jsp | 24 +++++++++ .../webapp/WEB-INF/views/linkedin/tiles.xml | 14 +++++ .../connect_with_linkedin-logo-150x150.jpg | Bin 0 -> 5072 bytes 9 files changed, 209 insertions(+) create mode 100644 spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInConnectionsController.java create mode 100644 spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInProfileController.java create mode 100644 spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnect.jsp create mode 100644 spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnected.jsp create mode 100644 spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/connections.jsp create mode 100644 spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/linkedin.jsp create mode 100644 spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/profile.jsp create mode 100644 spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/tiles.xml create mode 100644 spring-social-showcase/src/main/webapp/resources/social/linkedin/connect_with_linkedin-logo-150x150.jpg diff --git a/spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInConnectionsController.java b/spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInConnectionsController.java new file mode 100644 index 00000000..91301be2 --- /dev/null +++ b/spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInConnectionsController.java @@ -0,0 +1,27 @@ +package org.springframework.social.showcase.linkedin; + +import javax.inject.Inject; + +import org.springframework.social.linkedin.api.LinkedInApi; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class LinkedInConnectionsController { + + private final LinkedInApi linkedInApi; + + @Inject + public LinkedInConnectionsController(LinkedInApi linkedInApi) { + this.linkedInApi = linkedInApi; + } + + @RequestMapping(value="/linkedin/connections", method=RequestMethod.GET) + public String showFeed(Model model) { + model.addAttribute("connections", linkedInApi.getConnections()); + return "linkedin/connections"; + } + +} diff --git a/spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInProfileController.java b/spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInProfileController.java new file mode 100644 index 00000000..6322e8d2 --- /dev/null +++ b/spring-social-showcase/src/main/java/org/springframework/social/showcase/linkedin/LinkedInProfileController.java @@ -0,0 +1,51 @@ +/* + * Copyright 2011 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.social.showcase.linkedin; + +import javax.inject.Inject; + +import org.springframework.social.connect.ServiceProviderConnection; +import org.springframework.social.connect.ServiceProviderConnectionRepository; +import org.springframework.social.linkedin.api.LinkedInApi; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class LinkedInProfileController { + + private final ServiceProviderConnectionRepository connectionRepository; + + private final LinkedInApi linkedInApi; + + @Inject + public LinkedInProfileController(ServiceProviderConnectionRepository connectionRepository, LinkedInApi linkedInApi) { + this.connectionRepository = connectionRepository; + this.linkedInApi = linkedInApi; + } + + @RequestMapping(value="/linkedin", method=RequestMethod.GET) + public String home(Model model) { + ServiceProviderConnection connection = connectionRepository.findPrimaryConnectionToServiceApi(LinkedInApi.class); + if (connection == null) { + return "redirect:/connect/linkedin"; + } + model.addAttribute("profile", linkedInApi.getUserProfile()); + return "linkedin/profile"; + } + +} diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnect.jsp b/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnect.jsp new file mode 100644 index 00000000..b924c542 --- /dev/null +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnect.jsp @@ -0,0 +1,17 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> +<%@ page session="false" %> + +

Connect to LinkedIn

+ +
" method="POST"> +
+

+ You haven't created any connections with LinkedIn yet. Click the button to connect Spring Social Showcase with your LinkedIn account. + (You'll be redirected to LinkedIn where you'll be asked to authorize the connection.) +

+
+

+
diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnected.jsp b/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnected.jsp new file mode 100644 index 00000000..bef88a4c --- /dev/null +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/connect/linkedinConnected.jsp @@ -0,0 +1,19 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> +<%@ page session="false" %> + +

Connected to LinkedIn

+ +
+
+

+ Spring Social Showcase is connected to your LinkedIn account. + Click the button if you wish to disconnect. +

+
+ + + +
+ +

">View your LinkedIn profile

\ No newline at end of file diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/connections.jsp b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/connections.jsp new file mode 100644 index 00000000..de44eaf2 --- /dev/null +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/connections.jsp @@ -0,0 +1,17 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> +<%@ page session="false" %> + +

Your LinkedIn Connections

+ +
    + + + + + +
  •   +   @ 
  • +
    +
diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/linkedin.jsp b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/linkedin.jsp new file mode 100644 index 00000000..9267e692 --- /dev/null +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/linkedin.jsp @@ -0,0 +1,40 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> +<%@ page session="false" %> + + + Spring Social Showcase: LinkedIn + + + +

Spring Social Showcase: LinkedIn

+

Hello,   ! (">Disconnect from Facebook)

+

Your LinkedIn profile:

+
+
LinkedIn ID:
+
+
Industry:
+
+
Headline:
+
+
Connections:
+
    + + + + + +
  1.   +   @ 
  2. +
    +
+
+ +

">Return to home page

+ + diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/profile.jsp b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/profile.jsp new file mode 100644 index 00000000..b88c17bd --- /dev/null +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/profile.jsp @@ -0,0 +1,24 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> +<%@ page session="false" %> + +

Your LinkedIn Profile

+

Hello, !

+" alt="Seems your profile image is not accessible" title=""/> +
+
LinkedIn ID:
+
+
Name:
+
 
+
Industry:
+
+
Headline:
+
+
+ + +
+ + +
diff --git a/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/tiles.xml b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/tiles.xml new file mode 100644 index 00000000..19f2b24d --- /dev/null +++ b/spring-social-showcase/src/main/webapp/WEB-INF/views/linkedin/tiles.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/spring-social-showcase/src/main/webapp/resources/social/linkedin/connect_with_linkedin-logo-150x150.jpg b/spring-social-showcase/src/main/webapp/resources/social/linkedin/connect_with_linkedin-logo-150x150.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e11a84e41c3b3d16cbfbd8def65498641acd700a GIT binary patch literal 5072 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 F@L%N|3(^1p literal 0 HcmV?d00001