multi client development with spring -...

95
© 2012 SpringOne 2GX 2012. All rights reserved. Do not distribute without permission. Multi Client Development with Spring Josh Long Spring Developer Advocate, SpringSource, a Division of VMWare http://www.joshlong.com || @starbuxman || [email protected] Sunday, December 9, 12

Upload: dohuong

Post on 04-May-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

© 2012 SpringOne 2GX 2012. All rights reserved. Do not distribute without permission.

Multi Client Development with SpringJosh Long Spring Developer Advocate, SpringSource, a Division of VMWarehttp://www.joshlong.com || @starbuxman || [email protected]

Sunday, December 9, 12

Page 2: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring Developer Advocatetwitter: @starbuxmanweibo: @springsource [email protected]

2

About Josh Long (龙之春)

Sunday, December 9, 12

Page 3: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

About Josh LongSpring Developer Advocatetwitter: @[email protected]

Contributor To:

•Spring Integration•Spring Batch •Spring Hadoop•Activiti Workflow Engine•Akka Actor engine

3Sunday, December 9, 12

Page 4: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

4

Why Are We Here?

Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.

-Bob Martin

”“

Sunday, December 9, 12

Page 5: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

5

do NOT reinvent the Wheel!

Why Are We Here?

Sunday, December 9, 12

Page 6: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

6

Spring’s aim:

bring simplicity to java development

web tier &

RIAservice tier batch

processingintegration & messaging

data access

/ NoSQL / Big Data

mobile

tc ServerTomcat

Jetty

lightweight

CloudFoundryGoogle App EngineAmazon BeanStalk

Others

the cloud:

WebSphereJBoss ASWebLogic

(on legacy versions, too!)

traditional

The Spring framework

Sunday, December 9, 12

Page 7: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

7

Not All Sides Are Equal

Sunday, December 9, 12

Page 8: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

8

Spring Web Support

Sunday, December 9, 12

Page 9: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

New in 3.1: XML-free web applications

§ In a servlet 3 container, you can also use Java configuration, negating the need for web.xml:

9

public class SampleWebApplicationInitializer implements WebApplicationInitializer {

public void onStartup(ServletContext sc) throws ServletException {

AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();

ac.setServletContext(sc);ac.scan( “a.package.full.of.services”, “a.package.full.of.controllers” );

sc.addServlet("spring", new DispatcherServlet(webContext)); }}

Sunday, December 9, 12

Page 10: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Thin, Thick, Web, Mobile and Rich Clients: Web Core

§Spring Dispatcher Servlet• Objects don’t have to be web-specific.

• Spring web supports lower-level web machinery: ‘• HttpRequestHandler (supports remoting: Caucho, Resin, JAX RPC)• DelegatingFilterProxy. • HandlerInterceptor wraps requests to HttpRequestHandlers• ServletWrappingController lets you force requests to a servlet through the Spring Handler chain • OncePerRequestFilter ensures that an action only occurs once, no matter how many filters are applied. Provides a nice way to avoid duplicate

filters

• Spring provides access to the Spring application context using WebApplicationContextUtils, which has a static method to look up the context, even in environments where Spring isn’t managing the web components

Sunday, December 9, 12

Page 11: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Thin, Thick, Web, Mobile and Rich Clients: Web Core

§Spring provides the easiest way to integrate with your web framework of choice• Spring Faces for JSF 1 and 2

• Struts support for Struts 1

• Tapestry, Struts 2, Stripes, Wicket, Vaadin, Play framework, etc.

• GWT, Flex

Sunday, December 9, 12

Page 12: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Thin, Thick, Web, Mobile and Rich Clients: Spring MVC

12

Sunday, December 9, 12

Page 13: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController {

}

13

The Anatomy of a Spring MVC @Controller

Sunday, December 9, 12

Page 14: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”) public String processTheRequest() { // ... return “home”; }

}

14

The Anatomy of a Spring MVC @Controller

GET http://127.0.0.1:8080/url/of/my/resource

Sunday, December 9, 12

Page 15: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest() { // ... return “home”; }

}

15

The Anatomy of a Spring MVC @Controller

GET http://127.0.0.1:8080/url/of/my/resource

Sunday, December 9, 12

Page 16: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( HttpServletRequest request) { String contextPath = request.getContextPath(); // ... return “home”; }

}

16

The Anatomy of a Spring MVC @Controller

GET http://127.0.0.1:8080/url/of/my/resource

Sunday, December 9, 12

Page 17: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( @RequestParam(“search”) String searchQuery ) { // ... return “home”; }

}

17

The Anatomy of a Spring MVC @Controller

GET http://127.0.0.1:8080/url/of/my/resource?search=Spring

Sunday, December 9, 12

Page 18: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}”, method = RequestMethod.GET) public String processTheRequest( @PathVariable(“id”) Long id) { // ... return “home”; }

}

18

The Anatomy of a Spring MVC @Controller

GET http://127.0.0.1:8080/url/of/my/2322

Sunday, December 9, 12

Page 19: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}” ) public String processTheRequest( @PathVariable(“id”) Long customerId, Model model ) {

model.addAttribute(“customer”, service.getCustomerById( customerId ) ); return “home”; }

@Autowired CustomerService service;

}

19

The Anatomy of a Spring MVC @Controller

GET http://127.0.0.1:8080/url/of/my/232

Sunday, December 9, 12

Page 20: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( HttpServletRequest request, Model model) { return “home”; }

}

20

The Anatomy of a Spring MVC @Controller

Sunday, December 9, 12

Page 21: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public View processTheRequest( HttpServletRequest request, Model model) { return new XsltView(...); }

}

21

The Anatomy of a Spring MVC @Controller

Sunday, December 9, 12

Page 22: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public InputStream processTheRequest( HttpServletRequest request, Model model) { return new FileInputStream( ...) ; }

}

22

The Anatomy of a Spring MVC @Controller

Sunday, December 9, 12

Page 23: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Not confidential. Tell everyone.

DEMO§Demos• Simple Spring MVC based Application

Sunday, December 9, 12

Page 24: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

24

the new hotness...

Sunday, December 9, 12

Page 25: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

25

dumb terminals ruled the earth....

Sunday, December 9, 12

Page 26: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

26

then something magical happened: the web

Sunday, December 9, 12

Page 27: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

27

but the web didn’t know how to do UI state... so we hacked...

Sunday, December 9, 12

Page 28: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

....then the web stopped sucking

28

Sunday, December 9, 12

Page 29: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

How Powerful is JavaScript? ...It Boots Linux!!

29

Sunday, December 9, 12

Page 30: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

30

REST

Sunday, December 9, 12

Page 31: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

CONFIDENTIALCONFIDENTIAL

Thin, Thick, Web, Mobile and Rich Clients: REST

§Origin• The term Representational State Transfer was introduced and defined in 2000 by Roy Fielding in his doctoral dissertation.

§His paper suggests these four design principles:• Use HTTP methods explicitly.

• POST, GET, PUT, DELETE• CRUD operations can be mapped to these existing methods

• Be stateless.• State dependencies limit or restrict scalability

• Expose directory structure-like URIs.• URI’s should be easily understood

• Transfer XML, JavaScript Object Notation (JSON), or both.• Use XML or JSON to represent data objects or attributes

31

Sunday, December 9, 12

Page 32: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

REST on the Server

§Spring MVC is basis for REST support• Spring’s server side REST support is based on the standard controller model

§ JavaScript and HTML5 can consume JSON-data payloads

Sunday, December 9, 12

Page 33: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

REST on the Client

§RestTemplate• provides dead simple, idiomatic RESTful services consumption

• can use Spring OXM, too.

• Spring Integration and Spring Social both build on the RestTemplate where possible.

§Spring supports numerous converters out of the box• JAXB

• JSON (Jackson)

Sunday, December 9, 12

Page 34: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

CONFIDENTIALCONFIDENTIAL

Building clients for your RESTful services: RestTemplate

34

§Google search example

§Multiple parameters

RestTemplate restTemplate = new RestTemplate();

String url = "http://example.com/hotels/{hotel}/bookings/{booking}";

String result = restTemplate.getForObject(url, String.class, "42", “21”);

RestTemplate restTemplate = new RestTemplate();

String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={query}";

String result = restTemplate.getForObject(url, String.class, "SpringSource");

Sunday, December 9, 12

Page 35: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

CONFIDENTIALCONFIDENTIAL

Thin, Thick, Web, Mobile and Rich Clients: RestTemplate

§RestTemplate class is the heart the client-side story• Entry points for the six main HTTP methods

• DELETE - delete(...)• GET - getForObject(...)• HEAD - headForHeaders(...)• OPTIONS - optionsForAllow(...)• POST - postForLocation(...)• PUT - put(...)• any HTTP operation - exchange(...) and execute(...)

35

Sunday, December 9, 12

Page 36: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public @ResponseBody Customer processTheRequest( ... ) { Customer c = service.getCustomerById( id) ; return c; }

@Autowired CustomerService service;

}

36

The Anatomy of a Spring MVC @Controller

Sunday, December 9, 12

Page 37: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/someurl”, method = RequestMethod.POST) public String processTheRequest( @RequestBody Customer postedCustomerObject) { // ... return “home”; }

}

37

The Anatomy of a Spring MVC @Controller

POST http://127.0.0.1:8080/url/of/my/someurl

Sunday, December 9, 12

Page 38: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring MVC configuration - config

@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}”, method = RequestMethod.POST) public String processTheRequest( @PathVariable(“id”) Long customerId, @RequestBody Customer postedCustomerObject) { // ... return “home”; }

}

38

The Anatomy of a Spring MVC @Controller

POST http://127.0.0.1:8080/url/of/my/someurl

Sunday, December 9, 12

Page 39: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

What About the Browsers, Man?

• Problem: modern browsers only speak GET and POST

• Solution: use Spring’s HiddenHttpMethodFilter only then send _method request parameter in the request

<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/</url-pattern> <servlet-name>appServlet</servlet-name> </filter-mapping>

Sunday, December 9, 12

Page 40: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Not confidential. Tell everyone.

DEMO§Demos:• Spring REST service

• Spring REST client

Sunday, December 9, 12

Page 41: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

41

Spring Mobile

Sunday, December 9, 12

Page 42: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

§Best strategy? Develop Native• Fallback to client-optimized web applications

§Spring MVC 3.1 mobile client-specific content negotiation and rendering • for other devices • (there are other devices besides Android??)

Thin, Thick, Web, Mobile and Rich Clients: Mobile

42

Sunday, December 9, 12

Page 43: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Not confidential. Tell everyone.

DEMO§Demos:• Mobile clients using client specific rendering

Sunday, December 9, 12

Page 44: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

44

Spring Android

Sunday, December 9, 12

Page 45: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Thin, Thick, Web, Mobile and Rich Clients: Mobile

45

§Spring REST is ideal for mobile devices§Spring MVC 3.1 mobile client-specific content negotiation and rendering • for other devices

§Spring Android • RestTemplate

Sunday, December 9, 12

Page 46: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

OK, so.....

46

Sunday, December 9, 12

Page 47: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Thin, Thick, Web, Mobile and Rich Clients: Mobile

47

CustomerServiceClient - client

! private <T> T extractResponse( ResponseEntity<T> response) {! ! if (response != null && response().value() == 200) {! ! ! return response.getBody();! ! }! ! throw new RuntimeException("couldn't extract response.");! }

! @Override! public Customer updateCustomer(long id, String fn, String ln) { ! ! String urlForPath = urlForPath("customer/{customerId}");! !! ! return extractResponse(this.restTemplate.postForEntity( urlForPath, new Customer(id, fn, ln), Customer.class, id));! }

Sunday, December 9, 12

Page 48: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Thin, Thick, Web, Mobile and Rich Clients: Mobile

§Demos:• consuming the Spring REST service from Android

Sunday, December 9, 12

Page 49: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

NOT CONFIDENTIAL -- TELL EVERYONE

Social Communication

49

Sunday, December 9, 12

Page 50: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

§Extension to Spring Framework to enable connectivity with Software-as-a-Service providers§Features...• An extensible connection framework

• A connect controller

• Java API bindings

• A sign-in controller

§http://www.springsource.org/spring-social

50

Spring Social

Sunday, December 9, 12

Page 51: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring Social Projects

§Spring Social Core§Spring Social Facebook§Spring Social Twitter§Spring Social LinkedIn§Spring Social TripIt§Spring Social GitHub§Spring Social Gowalla§Spring Social Weibo https://github.com/liuce/spring-social-weibo§Spring Social Samples• Includes Showcase, Quickstart, Movies, Canvas, Twitter4J, Popup

51

Sunday, December 9, 12

Page 52: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Spring Social’s Key Components

§Connection Factories• Creates connections; Handles back-end of authorization flow

§Connect Controller• Orchestrates the web-based connection flow

§Connection Repository• Persists connections for long-term use

§Connection Factory Locator• Used by connect controller and connection repository to find connection factories

§API Bindings• Perform requests to APIs, binding to domain objects, error-handling

§Provider Sign-In Controller• Signs a user into an application based on an existing connection

52

Sunday, December 9, 12

Page 53: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Key Steps to Socializing an Application

§Configure Spring Social beans• Connection Factory Locator and Connection Factories

• Connection Repository

• Connect Controller

• API Bindings

§Create connection status views§ Inject/use API bindings

53

Sunday, December 9, 12

Page 54: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectionFactoryLocator

54

@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();

registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));

registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));

return registry;}

Sunday, December 9, 12

Page 55: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectionFactoryLocator

54

@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();

registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));

registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));

return registry;}

Sunday, December 9, 12

Page 56: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectionFactoryLocator

54

@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();

registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));

registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));

return registry;}

Sunday, December 9, 12

Page 57: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectionFactoryLocator

54

@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();

registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));

registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));

return registry;}

Sunday, December 9, 12

Page 58: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: Connection Repository

55

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public ConnectionRepository connectionRepository() { Authentication authentication = SecurityContextHolder.getContext(). getAuthentication(); if (authentication == null) { throw new IllegalStateException( "Unable to get a ConnectionRepository: no user signed in"); } return usersConnectionRepository().createConnectionRepository( authentication.getName());}

Sunday, December 9, 12

Page 59: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: Connection Repository

55

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public ConnectionRepository connectionRepository() { Authentication authentication = SecurityContextHolder.getContext(). getAuthentication(); if (authentication == null) { throw new IllegalStateException( "Unable to get a ConnectionRepository: no user signed in"); } return usersConnectionRepository().createConnectionRepository( authentication.getName());}

@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public UsersConnectionRepository usersConnectionRepository() { return new JdbcUsersConnectionRepository( dataSource, connectionFactoryLocator(), Encryptors.noOpText());}

Sunday, December 9, 12

Page 60: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectController

56

@Beanpublic ConnectController connectController() { return new ConnectController(connectionFactoryLocator(), connectionRepository());}

Sunday, December 9, 12

Page 61: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectController

56

@Beanpublic ConnectController connectController() { return new ConnectController(connectionFactoryLocator(), connectionRepository());}

Sunday, December 9, 12

Page 62: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ConnectController

56

@Beanpublic ConnectController connectController() { return new ConnectController(connectionFactoryLocator(), connectionRepository());}

Sunday, December 9, 12

Page 63: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: API Bindings

57

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}

Sunday, December 9, 12

Page 64: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: API Bindings

57

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}

Sunday, December 9, 12

Page 65: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: API Bindings

57

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}

Sunday, December 9, 12

Page 66: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: API Bindings

57

@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}

Sunday, December 9, 12

Page 67: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Injecting and Using the API Bindings

58

@Controllerpublic class TwitterTimelineController {

private final Twitter twitter; @Inject public TwitterTimelineController(Twitter twitter) { this.twitter = twitter; }

@RequestMapping(value="/twitter/tweet", method=RequestMethod.POST) public String postTweet(String message) { twitter.timelineOperations().updateStatus(message); return "redirect:/twitter"; }}

Sunday, December 9, 12

Page 68: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Injecting and Using the API Bindings

58

@Controllerpublic class TwitterTimelineController {

private final Twitter twitter; @Inject public TwitterTimelineController(Twitter twitter) { this.twitter = twitter; }

@RequestMapping(value="/twitter/tweet", method=RequestMethod.POST) public String postTweet(String message) { twitter.timelineOperations().updateStatus(message); return "redirect:/twitter"; }}

Sunday, December 9, 12

Page 69: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Injecting and Using the API Bindings

58

@Controllerpublic class TwitterTimelineController {

private final Twitter twitter; @Inject public TwitterTimelineController(Twitter twitter) { this.twitter = twitter; }

@RequestMapping(value="/twitter/tweet", method=RequestMethod.POST) public String postTweet(String message) { twitter.timelineOperations().updateStatus(message); return "redirect:/twitter"; }}

Sunday, December 9, 12

Page 70: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Endpoints§GET /connect• Displays connection status for all providers

§GET /connect/{provider}• Displays connection status for a given provider

§POST /connect/{provider}• Initiates the authorization flow, redirecting to the provider

§GET /connect/{provider}?oauth_token={token}• Handles an OAuth 1 callback

§GET /connect/{provider}?code={authorization code}• Handles an OAuth 2 callback

§DELETE /connect/{provider}• Removes all connections for a user to the given provider

§DELETE /connect/{provider}/{provider user ID}• Removes a specific connection for the user to the given provider

59

Sunday, December 9, 12

Page 71: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Sunday, December 9, 12

Page 72: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectControllerGET /connect/{provider ID}

Display connection status page

Sunday, December 9, 12

Page 73: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectControllerPOST /connect/{provider ID}

Initiate connection flow

Sunday, December 9, 12

Page 74: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Fetch request token (OAuth 1.0/1.0a only)

Sunday, December 9, 12

Page 75: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Redirect browser to provider’s authorization page

Sunday, December 9, 12

Page 76: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Redirect browser to provider’s authorization page

Sunday, December 9, 12

Page 77: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Redirect browser to provider’s authorization page

Sunday, December 9, 12

Page 78: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

GET /connect/{provider ID}?oauth_token={token}GET /connect/{provider ID}?code={code}

Provider redirects to callback URL

Sunday, December 9, 12

Page 79: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Exchange request token and/or code for access token

Sunday, December 9, 12

Page 80: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

ConnectController stores connection details in connection repository

Sunday, December 9, 12

Page 81: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ConnectController Flow

60

Service Provider(Twitter, Facebook, etc)

Your Application

ConnectController

Application can make API calls via API binding

Sunday, December 9, 12

Page 82: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Connection Status Page View

61

<form action="<c:url value="/connect/twitter" />" method="POST"> <div class="formInfo"> <p> You haven't created any connections with Twitter yet. Click the button to connect with your Twitter account. </p> </div> <p> <button type="submit"> <img src="<c:url value="/resources/social/twitter/connect-with-twitter.png" />"/> </button> </p></form>

Sunday, December 9, 12

Page 83: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Provider Sign In

§A convenience for users§Enables authentication to an app using their connection as credentials§ Implemented with ProviderSignInController§Works consistently with any provider

62

Sunday, December 9, 12

Page 84: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ProviderSignInController

§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup

63

@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}

Sunday, December 9, 12

Page 85: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ProviderSignInController

§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup

63

@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}

Sunday, December 9, 12

Page 86: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ProviderSignInController

§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup

63

@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}

Sunday, December 9, 12

Page 87: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Configuration: ProviderSignInController

§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup

63

@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}

Sunday, December 9, 12

Page 88: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

ProviderSignInController Endpoints

§POST /signin/{provider}• Initiates the authorization flow, redirecting to the provider

§GET /signin/{provider}?oauth_token={token}• Handles an OAuth 1 callback

§GET /signin/{provider}?code={authorization code}• Handles an OAuth 2 callback

§GET /signin• Handles a callback when no oauth token or code is sent

• Likely indicates that the user declined authorization

64

Sunday, December 9, 12

Page 89: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

NOT CONFIDENTIAL -- TELL EVERYONE

Spring Security OAuth

65

Sunday, December 9, 12

Page 90: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

§Extension to Spring Security• originally a community contribution (now officially part of the project)

§Features...• endpoint management for OAuth service types

• (along with corresponding client management)

• token management (persistence, authentication)

• integrations for the web, as well as through standard Spring Security

§ springsource.org/spring-security/oauth

66

Spring Security OAuth

Sunday, December 9, 12

Page 91: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Setup Spring Security with Spring MVC...

67

<http access-denied-page="/login.jsp" xmlns="http://www.springframework.org/schema/security">

<form-login authentication-failure-url="/login.jsp" default-target-url="/index.jsp" login-page="/login.jsp" login-processing-url="/login.do" />

<logout logout-success-url="/index.jsp" logout-url="/logout.do" />

<anonymous />

<intercept-url pattern="/sparklr/**" access="ROLE_USER" />

<custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" />

</http>

Sunday, December 9, 12

Page 92: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Then Tell Spring Security About Our OAuth Endpoints

68

<authentication-manager xmlns="http://www.springframework.org/schema/security">

<authentication-provider> <user-service>

<user name="marissa" password="wombat" authorities="ROLE_USER" />

<user name="sam" password="kangaroo" authorities="ROLE_USER" />

</user-service> </authentication-provider></authentication-manager>

<oauth:client id="oauth2ClientFilter" redirect-on-error="${redirectOnError:false}" />

<oauth:resource id="sparklr" type="authorization_code" client-id="tonr" client-secret="secret" access-token-uri="${accessTokenUri}" user-authorization-uri="${userAuthorizationUri}" scope="read" />

Sunday, December 9, 12

Page 93: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

Then get an Instance of a RestTemplate for the client...

69

<bean class="org.springframework.security.oauth2.client.OAuth2RestTemplate"> <constructor-arg ref = “sparklr”/></bean>

Sunday, December 9, 12

Page 94: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

And The REST of it

• Spring Data REST - exposes (JPA, MongoDB, GemFire, Neo4J, Redis) repositories built on Spring Data repositories • Spring HATEOAS - take your REST-fu to the next level with support for HTTP as the engine of application state

Sunday, December 9, 12

Page 95: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,

@starbuxman | [email protected]

Questions?

http://slideshare.net/joshlong

Sunday, December 9, 12