Slide 1

Slide 1 text

CDI mis en pratique avec Seam Social et Weld OSGI par Mathieu Ancelin @TrevorReznik et Antoine Sabot-Durand @antoine_sd 1 1 jeudi 19 avril 12

Slide 2

Slide 2 text

Antoine Sabot-Durand Expert Java EE 16 ans d’expérience Java & OSS : Leader sur Seam Social Commiter Apache Deltaspike Membre de l’EG CDI 1.1(JSR 346) @antoine_sd 2 2 jeudi 19 avril 12

Slide 3

Slide 3 text

Ippon technologies SSII parisienne spécialisée en Java Domaines de compétence Java EE Portail SOA RIA e-commerce Mobilité Partenaire Devoxx. Venez sur notre Stand ! 3 3 jeudi 19 avril 12

Slide 4

Slide 4 text

Mathieu ANCELIN Développeur @SERLI Java & OSS JOnAS, GlassFish, Weld, etc ... Membre de l’équipe du Poitou-Charentes JUG Membre de l’expert group CDI 1.1 (JSR-346) @TrevorReznik 4 4 jeudi 19 avril 12

Slide 5

Slide 5 text

SERLI Société de conseil et d’ingénierie du système d’information 65 employés 80% de business Java Contribution à des projets open-source 10% de la force de travail Membre de l’EG JSR-346 www.serli.com @SerliFr 5 5 jeudi 19 avril 12

Slide 6

Slide 6 text

SERLI Société de conseil et d’ingénierie du système d’information 65 employés 80% de business Java Contribution à des projets open-source 10% de la force de travail Membre de l’EG JSR-346 www.serli.com @SerliFr 5 5 jeudi 19 avril 12

Slide 7

Slide 7 text

Avant de commencer #DevoxxFR #CDIPratique 6 6 jeudi 19 avril 12

Slide 8

Slide 8 text

Abstract La plupart des présentations CDI restent théoriques Nous allons vous montrer comment CDI a été mis en pratique à travers le fonctionnement du module Seam Social Vous verrez également comment CDI peut être modularisé grâce à Weld OSGI Nous profiterons également de ces 3 heures pour monter une petite application sociale en CDI et JSF / Primefaces et la même utilisant Twitter Bootstrap 7 7 jeudi 19 avril 12

Slide 9

Slide 9 text

Concepts généraux 8 8 jeudi 19 avril 12

Slide 10

Slide 10 text

Historique CDI 9 Spring Seam Guice CDI @Inject 9 jeudi 19 avril 12

Slide 11

Slide 11 text

10 Serveur Java EE 6 Web Tier Service Tier CDI EJB Container Managed Bean (POJO) Servlet 3.0 JSF 2.0 Client Tier Application Client Container Web Browser JTA JPA JMS JAX-WS JAX-RS Messaging SOA JCA JAXB JAAS CDI est une technologie d’intégration qui enrichi aussi bien des POJO que des EJB Il a vocation à servir de «glue» entre les différentes parties de la stack Java EE C’est la première technologie qui permet d’étendre Java EE de manière portable et naturelle CDI dans Java EE 10 jeudi 19 avril 12

Slide 12

Slide 12 text

Seam Social Seam Social est un module CDI pour faciliter l’utilisation des réseaux sociaux Inspiré par Spring Social, il propose un noyau très différent tirant parti des spécificités CDI Les binding des API des réseaux sociaux, en revanche sont pour l’instant des forks de ceux de Spring Social Connecteurs out of the box 11 11 jeudi 19 avril 12

Slide 13

Slide 13 text

Inside Seam Social Seam Social repose sur des bibliothèques tierces comme : Scribe-java pour le client Rest et OAuth Jackson pour le mapping JSON JBoss Solder, helpers CDI 12 12 jeudi 19 avril 12

Slide 14

Slide 14 text

Jackson L’un des frameworks les plus performants pour parser du JSON Jackson permet également de mapper du JSON sur des classes java Pour ça il peut utiliser des annotations JAXB ou ses propres annotations En plus Jackson propose la notion de Mixin qui permet de déporter les annotations sur une classe dédiée et de laisser la classe d’origine propre. 13 @JsonIgnoreProperties(ignoreUnknown = true) @SuppressWarnings("unused") abstract class TwitterProfileMixin { @JsonCreator TwitterProfileMixin(@JsonProperty("id") String id, @JsonProperty("screen_name") String screenName, @JsonProperty("name") String name, @JsonProperty("url") String url, @JsonProperty("profile_image_url") String profileImageUrl, @JsonProperty("description") String description, @JsonProperty("location") String location, @JsonProperty("created_at") @JsonDeserialize(using = TimelineDateDeserializer.class) Date createdDate) { } @JsonProperty("notifications") private boolean notificationsEnabled; @JsonProperty("lang") private String language; @JsonProperty("statuses_count") private int statusesCount; ... 13 jeudi 19 avril 12

Slide 15

Slide 15 text

Jackson : Utilisation d’un Mixin Pour le Pojo que l’ont veut binder, il faut créer une classe abstraite : un Mixin Ce mixin comporte les annotations Jackson qui seront utilisées pour associé le JSON au pojo Un module Jackson est nécessaire pour créer l’association 14 Texte Pojo PojoMixin Module Jackson 14 jeudi 19 avril 12

Slide 16

Slide 16 text

Concepts et technos utilisés par les réseaux sociaux 15 15 jeudi 19 avril 12

Slide 17

Slide 17 text

La big picture 16 Tous les réseaux sociaux reposent sur REST comme protocole d’échange Les données transmises sont au format JSON et certains proposent XML en option Enfin, la sécurisation (encryption et authentification) passe par le protocole OAuth. 16 jeudi 19 avril 12

Slide 18

Slide 18 text

OAuth OAuth est un protocole pour déléguer une autorisation à l’utilisation d’un service donné (autoriser sans partager ses données d’accès avec l’entité à qui on délègue l’accès au service) Développé par Twitter, Magnolia puis Google, il est normalisé par l’IETF en avril 2010 via la RFC 5849 La version 2.0 plus simple d’utilisation est en cours de standardisation mais déjà utilisée par certains acteurs (Facebook, Google, Microsoft) Tous les Réseaux Sociaux s’appuient sur Oauth 1.0a ou 2.0 Pour utiliser OAuth on doit commencer par déclarer une application sur le service concerné. Celui-ci vous délivrera une Consumer_Key (clé asymétrique) 17 17 jeudi 19 avril 12

Slide 19

Slide 19 text

Le cycle OAuth 1.0a 18 Serveur de l’application Service tiers (OAuth) Client 18 jeudi 19 avril 12

Slide 20

Slide 20 text

Le cycle OAuth 1.0a 18 1 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) Client 18 jeudi 19 avril 12

Slide 21

Slide 21 text

Le cycle OAuth 1.0a 18 1 2 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) L’application demande un request Token (relatif à l’application déclarée) au service et envoie une url de callback à associer au token Client 18 jeudi 19 avril 12

Slide 22

Slide 22 text

Le cycle OAuth 1.0a 18 1 2 3 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) Le service retourne le token L’application demande un request Token (relatif à l’application déclarée) au service et envoie une url de callback à associer au token Client 18 jeudi 19 avril 12

Slide 23

Slide 23 text

Le cycle OAuth 1.0a 18 1 2 3 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) L’application redirige le client sur la page de login du service Le service retourne le token 4 L’application demande un request Token (relatif à l’application déclarée) au service et envoie une url de callback à associer au token Client 18 jeudi 19 avril 12

Slide 24

Slide 24 text

Le cycle OAuth 1.0a 18 1 2 3 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) L’application redirige le client sur la page de login du service Le service retourne le token 4 5 L’application demande un request Token (relatif à l’application déclarée) au service et envoie une url de callback à associer au token Une fois connecté le service redirige le client vers l’URL de callback avec un code de vérification Client 18 jeudi 19 avril 12

Slide 25

Slide 25 text

Le cycle OAuth 1.0a 18 1 2 3 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) L’application redirige le client sur la page de login du service Le service retourne le token 4 5 L’application demande un request Token (relatif à l’application déclarée) au service et envoie une url de callback à associer au token Une fois connecté le service redirige le client vers l’URL de callback avec un code de vérification 6 A l’aide du code et du Token, le service demande un Access Token Client 18 jeudi 19 avril 12

Slide 26

Slide 26 text

Le cycle OAuth 1.0a 18 1 2 3 Le client demande une ressource sur le service tiers Serveur de l’application Service tiers (OAuth) L’application redirige le client sur la page de login du service Le service retourne le token 4 5 L’application demande un request Token (relatif à l’application déclarée) au service et envoie une url de callback à associer au token Une fois connecté le service redirige le client vers l’URL de callback avec un code de vérification 6 A l’aide du code et du Token, le service demande un Access Token 7 Le service retourne l’access token Client 18 jeudi 19 avril 12

Slide 27

Slide 27 text

JSON Javascript Object Notation : format de structuration de données provenant de Javascript et adopté comme standard d’échange dans la quasi totalités des services en ligne Comparable à XML mais sans XSD Tous les langages disposent de bibliothèques pour exploiter / générer du JSon 19 1: { 2: "firstName": "John", 3: "lastName" : "Smith", 4: "age" : 25, 5: "address" : 6: { 7: "streetAddress": "21 2nd Street", 8: "city" : "New York", 9: "state" : "NY", 10: "postalCode" : "10021" 11: }, 12: "phoneNumber": 13: [ 14: { 15: "type" : "home", 16: "number": "212 555-1234" 17: }, 18: { 19: "type" : "fax", 20: "number": "646 555-4567" 21: } 22: ] 23: } 19 jeudi 19 avril 12

Slide 28

Slide 28 text

Composants principaux de Seam Social 20 20 jeudi 19 avril 12

Slide 29

Slide 29 text

Objectifs de Seam Social 21 Fournir un socle générique pour construire des API d’accès aux réseaux sociaux La connexion et l’identification sont génériques pour fournir un moyen standard de s’authentifier Découverte dynamique de nouveaux modules (le socle reconnait automatiquement un nouveau connecteur) Fourniture de services haut niveau (bindings et appels) vers les services en ligne 21 jeudi 19 avril 12

Slide 30

Slide 30 text

Les classes principales 22 +buildUri(String, String, String) +buildUri(String, Map) +getApiRootUrl() +buildUri(String) +buildUri(String, Object) AbstractSocialNetworkService +getAccessToken() +getAuthorizationUrl() +getVerifier() +initAccessToken() +sendSignedRequest(RestVerb, String) +sendSignedRequest(RestVerb, String, Map) +sendSignedRequest(RestVerb, String, String, Object) +setVerifier(String) +setAccessToken(String, String) +setAccessToken(OAuthToken) +sendSignedXmlRequest(RestVerb, String, String) +getSession() +requireAuthorization() +sendSignedRequest(OAuthRequest) «interface» OAuthService +getRequestToken() +getAccessToken(OAuthToken, String) +signRequest(OAuthToken, OAuthRequest) +getVersion() +getAuthorizationUrl(OAuthToken) +requestFactory(RestVerb, String) +tokenFactory(String, String) «interface» OAuthProvider +getRequestToken() +setRequestToken(OAuthToken) +getAccessToken() +setAccessToken(OAuthToken) +getVerifier() +setVerifier(String) +setUserProfile(UserProfile) +getUserProfile() +getServiceQualifier() +isConnected() +getName() «interface» OAuthSession +getMyProfile() +getSession() +resetConnection() +isConnected() +configureService(OAuthService) +getVerifierParamName() «interface» SocialNetworkServicesHub «interface» SocialNetworkServicesHub 22 jeudi 19 avril 12

Slide 31

Slide 31 text

Bootstraping Social 23 @Twitter @ApplicationScoped @OAuthApplication(apiKey = "FQzlQC49UhvbMZoxUIvHTQ", apiSecret = "VQ5CZHG4qUoAkUUmckPn4iN4yyjBKcORTW0wnok4r1k", callback = "http://localhost:8080/social-web-client/callback.jsf") @Produces public TwitterServicesHub twitterProducer(TwitterServicesHub service) { return service; } +getAccessToken() +getAuthorizationUrl() +getVerifier() +initAccessToken() +sendSignedRequest(RestVerb, String) +sendSignedRequest(RestVerb, String, Map) +sendSignedRequest(RestVerb, String, String, Object) +setVerifier(String) +setAccessToken(String, String) +setAccessToken(OAuthToken) +sendSignedXmlRequest(RestVerb, String, String) +getSession() +requireAuthorization() +sendSignedRequest(OAuthRequest) «interface» OAuthService +getRequestToken() +setRequestToken(OAuthToken) +getAccessToken() +setAccessToken(OAuthToken) +getVerifier() +setVerifier(String) +setUserProfile(UserProfile) +getUserProfile() +getServiceQualifier() +isConnected() +getName() «interface» OAuthSession +getRequestToken() +getAccessToken(OAuthToken, String) +signRequest(OAuthToken, OAuthRequest) +getVersion() +getAuthorizationUrl(OAuthToken) +requestFactory(RestVerb, String) +tokenFactory(String, String) «interface» OAuthProvider @Twitter @ApplicationScoped @Twitter @ApplicationScoped @Twitter @SessionScoped Grace à une extension CDI incluse dans Solder, on créé 4 beans portant le même qualifier et le scope de son choix lié à celui du producer 23 jeudi 19 avril 12

Slide 32

Slide 32 text

Etendre Seam Social 24 Pour créer un nouveau module (supporter un nouveau réseau social) il faut : S’assurer que Scribe-Java propose un connecteur vers ce service ou créer ce connecteur (une classe) Etendre AbstractSocialNetworkService pour fournir le socle aux API du service Créer un Qualifier (annotation) portant la meta annotation @ServiceRelated Implementer SocialNetworkService Hub pour les services génériques. Il ne reste plus qu’à coder les bindings JSON et API. 24 jeudi 19 avril 12

Slide 33

Slide 33 text

DEMO Socializer Primefaces 25 25 jeudi 19 avril 12

Slide 34

Slide 34 text

CDI 26 26 jeudi 19 avril 12

Slide 35

Slide 35 text

CDI La meilleur spec. de Java EE 6 (la plus cool) #annotationsEverywhere #noXml Typesafe Aucune limite à ce que vous pouvez faire avec CDI Si vous pouvez l’imaginer, vous pouvez le faire Extensions portables standard :-) JBoss Weld en est l’implémentation de référence plutôt mature, très bonne communauté Deux autres implémentations : Apache Open WebBeans Caucho Candi Limité à Java EE 6 ? et bien, pas forcément ... 27 27 jeudi 19 avril 12

Slide 36

Slide 36 text

Environnements for CDI/Weld Il est possible de bootstraper Weld très simplement en dehors de Java EE 6 à priori, vous pouvez le bootstraper n’importe où :-) Weld-Servlet Jetty Tomcat 6/7 Weld-SE Bonne vieilles applications desktop 28 28 jeudi 19 avril 12

Slide 37

Slide 37 text

Le Bean En Java EE 6 tout est Managed Bean 29 29 jeudi 19 avril 12

Slide 38

Slide 38 text

Le Bean 30 Pensez au fichier beans.xml 30 jeudi 19 avril 12

Slide 39

Slide 39 text

Le Bean En Java EE 6 tout est Managed Bean le managed bean est le composant de base il a un cycle de vie il est interceptable il est injectable accessible via JNDI 31 31 jeudi 19 avril 12

Slide 40

Slide 40 text

Injection de dépendance 32 @Inject 32 jeudi 19 avril 12

Slide 41

Slide 41 text

33 Injection de dépendance public class HelloService { public String hello() { return "Hello World!"; } } 33 jeudi 19 avril 12

Slide 42

Slide 42 text

34 public class MyBean extends Application { private HelloService service; @Inject public MyBean(HelloService service) { this.service = service; } public void displayHello() { display( service.hello(); } } Injection de dépendance 34 jeudi 19 avril 12

Slide 43

Slide 43 text

35 public class MyBean extends Application { private HelloService service; @Inject public void setService(HelloService service) { this.service = service; } public void displayHello() { display( service.hello(); } } Injection de dépendance 35 jeudi 19 avril 12

Slide 44

Slide 44 text

36 public class MyBean extends Application { @Inject HelloService service; public void displayHello() { display( service.hello(); } } Injection de dépendance 36 jeudi 19 avril 12

Slide 45

Slide 45 text

37 Injection de dépendance public interface HelloService { public String hello(); } public class FrenchHelloService implements HelloService { public String hello() { return "Bonjour tout le monde!"; } } public class EnglishHelloService implements HelloService { public String hello() { return "Hello World!"; } } 37 jeudi 19 avril 12

Slide 46

Slide 46 text

Les qualifiers 38 public class MyBean extends Application { @Inject @French HelloService service; public void displayHello() { display( service.hello(); } } public class MyBean extends Application { @Inject @English HelloService service; public void displayHello() { display( service.hello(); } } 38 jeudi 19 avril 12

Slide 47

Slide 47 text

Les qualifiers 39 @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface French {} @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface English {} 39 jeudi 19 avril 12

Slide 48

Slide 48 text

Les qualifiers 40 @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface French {} @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface English {} 40 jeudi 19 avril 12

Slide 49

Slide 49 text

Les qualifiers 41 @French public class FrenchHelloService implements HelloService { public String hello() { return "Bonjour tout le monde!"; } } @English public class EnglishHelloService implements HelloService{ public String hello() { return "Hello World!"; } } 41 jeudi 19 avril 12

Slide 50

Slide 50 text

Les qualifiers 42 @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface Language { Languages value(); @Nonbinding String description() default ""; public enum Languages { FRENCH, ENGLISH } } 42 jeudi 19 avril 12

Slide 51

Slide 51 text

Les qualifiers 43 @Language(FRENCH) public class FrenchHelloService implements HelloService { public String hello() { return "Bonjour tout le monde!"; } } @Language(ENGLISH) public class EnglishHelloService implements HelloService { public String hello() { return "Hello World!"; } } 43 jeudi 19 avril 12

Slide 52

Slide 52 text

Les qualifiers 44 public class MyBean extends Application { @Inject @Language(ENGLISH) HelloService service; public void displayHello() { display( service.hello(); } } public class MyBean extends Application { @Inject @Language(FRENCH) HelloService service; public void displayHello() { display( service.hello(); } } 44 jeudi 19 avril 12

Slide 53

Slide 53 text

Les qualifiers 45 public class MyBean extends Application { @Inject @French HelloService service; } @French @Console @Secured public class FrenchHelloService implements HelloService { } 45 jeudi 19 avril 12

Slide 54

Slide 54 text

Les qualifiers 46 public class MyBean extends Application { @Inject @French @Console HelloService service; } @French @Console @Secured public class FrenchHelloService implements HelloService { } 46 jeudi 19 avril 12

Slide 55

Slide 55 text

Les qualifiers 47 public class MyBean extends Application { @Inject @French @Console @Secured HelloService service; } @French @Console @Secured public class FrenchHelloService implements HelloService { } 47 jeudi 19 avril 12

Slide 56

Slide 56 text

Les qualifiers 48 public class MyBean extends Application { @Inject @French @Console @Secured HelloService service; } @French @Secured public class FrenchHelloService implements HelloService { } 48 jeudi 19 avril 12

Slide 57

Slide 57 text

Les qualifiers 48 public class MyBean extends Application { @Inject @French @Console @Secured HelloService service; } @French @Secured public class FrenchHelloService implements HelloService { } 48 jeudi 19 avril 12

Slide 58

Slide 58 text

Injection programmatique 49 public class MyBean extends Application { @Inject Instance service; public void displayHello() { display( service.get().hello() ); } } 49 jeudi 19 avril 12

Slide 59

Slide 59 text

Injection programmatique 50 public class MyBean extends Application { @Inject Instance service; public void displayHello() { if (!service.isUnsatisfied()) { display( service.get().hello() ); } } } 50 jeudi 19 avril 12

Slide 60

Slide 60 text

Injection programmatique 51 public class MyBean extends Application { @Any @Inject Instance services; public void displayHello() { display( service.select( new AnnotationLiteral() {}) .get() ); } } 51 jeudi 19 avril 12

Slide 61

Slide 61 text

Les contextes Gestion du cycle de vie des beans choix du moment de la création et de la destruction des beans ‘un singleton pour un contexte donné’ Contexte requête, session, conversation, application, singleton Possibilité de créer des scopes personnalisés via les extensions 52 52 jeudi 19 avril 12

Slide 62

Slide 62 text

Les contextes 53 @SessionScoped public class CartBean { public void addItem(Item item) { ... } } 53 jeudi 19 avril 12

Slide 63

Slide 63 text

Les contextes 54 @ApplicationScoped public class CartBean { public void addItem(Item item) { ... } } 54 jeudi 19 avril 12

Slide 64

Slide 64 text

Les contextes 54 @ApplicationScoped public class CartBean { public void addItem(Item item) { ... } } FAIL !!! 54 jeudi 19 avril 12

Slide 65

Slide 65 text

Les contextes 55 @ConversationScoped public class CartBean { public void addItem(Item item) { ... } } 55 jeudi 19 avril 12

Slide 66

Slide 66 text

Les contextes 56 @ThreadScoped public class CartBean { public void addItem(Item item) { ... } } 56 jeudi 19 avril 12

Slide 67

Slide 67 text

Les contextes 57 @HourScoped public class CartBean { public void addItem(Item item) { ... } } 57 jeudi 19 avril 12

Slide 68

Slide 68 text

Les contextes 58 @RandomScoped public class CartBean { public void addItem(Item item) { ... } } 58 jeudi 19 avril 12

Slide 69

Slide 69 text

Les décorateurs 59 @Decorator public class HelloDecorator implements HelloService { @Inject @Delegate HelloService service; public String hello() { return service.hello() + "-decorated"; } } @Inject HelloService service; 59 jeudi 19 avril 12

Slide 70

Slide 70 text

Les décorateurs 60 @Decorator public abstract class HelloDecorator implements HelloService { @Inject @Delegate HelloService service; public String hello() { return service.hello() + "-decorated"; } } @Inject HelloService service; 60 jeudi 19 avril 12

Slide 71

Slide 71 text

Les décorateurs 61 foo.bar.HelloDecorator 61 jeudi 19 avril 12

Slide 72

Slide 72 text

Les évènements 62 @Inject Event evt; ... evt.fire("Bonjour"); @Inject Event evt; ... evt.fire( new Post( "Mathieu ANCELIN ", "Bonjour", )); 62 jeudi 19 avril 12

Slide 73

Slide 73 text

Les évènements 63 public void receiveEvt(@Observes String evt) { System.out.println("Reçut : " + evt); } public void receiveEvt(@Observes Post evt) { System.out.println("Reçut : " + evt.message()); } 63 jeudi 19 avril 12

Slide 74

Slide 74 text

Les évènements 64 @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface English {} 64 jeudi 19 avril 12

Slide 75

Slide 75 text

Les évènements 65 @Inject @English Event evt; ... evt.fire("Hello"); public void receiveEvt(@Observes @English String evt) { System.out.println("Received : " + evt); } 65 jeudi 19 avril 12

Slide 76

Slide 76 text

CDI en pratique dans Seam Social Visite guidée 66 66 jeudi 19 avril 12

Slide 77

Slide 77 text

Les extensions CDI 67 67 jeudi 19 avril 12

Slide 78

Slide 78 text

Extensions CDI pourquoi faire ? Une extension CDI permet : De créer des Beans (fichier de configuration) ou des points d’injection modifier des beans ou des points d’injection Annuler la création de beans D’une manière générale inventorier l’ensembles de l'écosystème CDI de l’application, le modifier ou l’enrichir. 68 68 jeudi 19 avril 12

Slide 79

Slide 79 text

Pour comprendre les extensions 69 Une fois l’application lancée le BeanManager est en lecture seule (pas de création de Bean au runtime) Ne pas confondre Bean (définition) avec Instance de Bean Nos extensions seront donc exécutées au démarrage de l’application et devront influer sur le contenu du BeanManager et des futurs beans Les extensions peuvent aussi devenir des Beans (avec quelques restrictions) 69 jeudi 19 avril 12

Slide 80

Slide 80 text

Cycle de vie CDI 70 Deploy Application Before Bean Discovery Process Producers Process Anotated Types Scan Archive Application Running After Deployment Validation Before Shutdown Undeploy Application Process Beans After Bean Discovery Process Injection Taget Process Observer Methods 70 jeudi 19 avril 12

Slide 81

Slide 81 text

Pour Faire une Extension CDI 71 Créer une classe qui implémente Extension avec un constructeur sans paramètres Y placer une ou plusieurs méthodes avec un observer sur les événements du cycle de vie CDI pour intervenir sur le contenu du bean manager Ajouter dans le classpath le fichier META-INF/services/javax.enterprise.inject.spi.Extension dans lequel on ajoutera le nom qualifié de la classe d’extension 71 jeudi 19 avril 12

Slide 82

Slide 82 text

Exemple simple : @Veto 72 void processAnnotatedType(@Observes final ProcessAnnotatedType pat, BeanManager beanManager) { final AnnotatedType annotatedType = pat.getAnnotatedType(); final Class javaClass = annotatedType.getJavaClass(); final Package pkg = javaClass.getPackage(); // Support for @Veto if (annotatedType.isAnnotationPresent(Veto.class) || (pkg != null && pkg.isAnnotationPresent(Veto.class))) { pat.veto(); log.info("Preventing " + javaClass + " from being installed as bean due to @Veto annotation"); return; } } 72 jeudi 19 avril 12

Slide 83

Slide 83 text

Exemple simple : @Veto 72 void processAnnotatedType(@Observes final ProcessAnnotatedType pat, BeanManager beanManager) { final AnnotatedType annotatedType = pat.getAnnotatedType(); final Class javaClass = annotatedType.getJavaClass(); final Package pkg = javaClass.getPackage(); // Support for @Veto if (annotatedType.isAnnotationPresent(Veto.class) || (pkg != null && pkg.isAnnotationPresent(Veto.class))) { pat.veto(); log.info("Preventing " + javaClass + " from being installed as bean due to @Veto annotation"); return; } } 72 jeudi 19 avril 12

Slide 84

Slide 84 text

Demo Extension 73 73 jeudi 19 avril 12

Slide 85

Slide 85 text

Et OSGi ? 74 Seam Social est un projet open source Et nous comptons sur vous pour créer des modules Seulement ajouter un module nécessite de redéployer l’application Comment faire pour charger un module à chaud ? OSGi arrive à la rescousse pour résoudre ce problème 74 jeudi 19 avril 12

Slide 86

Slide 86 text

Concepts liés à OSGi 75 75 jeudi 19 avril 12

Slide 87

Slide 87 text

OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Plateforme Java 76 76 jeudi 19 avril 12

Slide 88

Slide 88 text

OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Module Plateforme Java 76 76 jeudi 19 avril 12

Slide 89

Slide 89 text

OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Module Lifecycle Plateforme Java 76 76 jeudi 19 avril 12

Slide 90

Slide 90 text

OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Module Lifecycle Service Plateforme Java 76 76 jeudi 19 avril 12

Slide 91

Slide 91 text

OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Module Lifecycle Service Plateforme Java Bundles 76 76 jeudi 19 avril 12

Slide 92

Slide 92 text

Modules / Bundles 77 77 jeudi 19 avril 12

Slide 93

Slide 93 text

Modules / Bundles manifest manifest 77 77 jeudi 19 avril 12

Slide 94

Slide 94 text

Modules / Bundles manifest manifest Bundle-SymbolicName: com.foo.bar Bundle-SymbolicName: com.sample.app 77 77 jeudi 19 avril 12

Slide 95

Slide 95 text

Modules / Bundles manifest manifest Bundle-SymbolicName: com.foo.bar Bundle-SymbolicName: com.sample.app Export-Package: com.sample.app.api; version=1.2.0 77 77 jeudi 19 avril 12

Slide 96

Slide 96 text

Modules / Bundles manifest manifest Bundle-SymbolicName: com.foo.bar Bundle-SymbolicName: com.sample.app Export-Package: com.sample.app.api; version=1.2.0 Import-Package: com.sample.app.api; version=[1.2.0-2.0.0) 77 77 jeudi 19 avril 12

Slide 97

Slide 97 text

Modules / Bundles manifest manifest Bundle-SymbolicName: com.foo.bar Bundle-SymbolicName: com.sample.app Export-Package: com.sample.app.api; version=1.2.0 Import-Package: com.sample.app.api; version=[1.2.0-2.0.0) 77 77 jeudi 19 avril 12

Slide 98

Slide 98 text

Cycle de vie 78 78 jeudi 19 avril 12

Slide 99

Slide 99 text

Cycle de vie install 78 78 jeudi 19 avril 12

Slide 100

Slide 100 text

Cycle de vie Installed install 78 78 jeudi 19 avril 12

Slide 101

Slide 101 text

Cycle de vie Installed install resolve 78 78 jeudi 19 avril 12

Slide 102

Slide 102 text

Cycle de vie Installed Resolved install resolve 78 78 jeudi 19 avril 12

Slide 103

Slide 103 text

Cycle de vie Installed Resolved install update refresh update refresh resolve 78 78 jeudi 19 avril 12

Slide 104

Slide 104 text

Cycle de vie Installed Resolved install update refresh start update refresh resolve 78 78 jeudi 19 avril 12

Slide 105

Slide 105 text

Cycle de vie Installed Resolved Starting Active install update refresh start update refresh resolve 78 78 jeudi 19 avril 12

Slide 106

Slide 106 text

Cycle de vie Installed Resolved Starting Active install update refresh stop start update refresh resolve 78 78 jeudi 19 avril 12

Slide 107

Slide 107 text

Cycle de vie Installed Resolved Starting Active Stopping install update refresh stop start update refresh resolve 78 78 jeudi 19 avril 12

Slide 108

Slide 108 text

Cycle de vie Installed Resolved Starting Active Stopping install update refresh stop start update refresh resolve uninstall 78 78 jeudi 19 avril 12

Slide 109

Slide 109 text

Cycle de vie Installed Resolved Uninstalled Starting Active Stopping install update refresh stop start update refresh resolve uninstall 78 78 jeudi 19 avril 12

Slide 110

Slide 110 text

Cycle de vie Installed Resolved Uninstalled Starting Active Stopping install update refresh stop start update refresh resolve uninstall uninstall 78 78 jeudi 19 avril 12

Slide 111

Slide 111 text

Services OSGI service registry Bundle A Bundle B listener 79 79 jeudi 19 avril 12

Slide 112

Slide 112 text

Services OSGI service registry Bundle A Bundle B listener register 79 79 jeudi 19 avril 12

Slide 113

Slide 113 text

Services OSGI service registry Bundle A Bundle B listener register lookup 79 79 jeudi 19 avril 12

Slide 114

Slide 114 text

Services OSGI service registry Bundle A Bundle B listener register 79 79 jeudi 19 avril 12

Slide 115

Slide 115 text

Services OSGI service registry Bundle A Bundle B listener register notify 79 79 jeudi 19 avril 12

Slide 116

Slide 116 text

Services OSGI service registry Bundle A Bundle B listener register notify 79 lookup 79 jeudi 19 avril 12

Slide 117

Slide 117 text

Weld-OSGi 80 80 jeudi 19 avril 12

Slide 118

Slide 118 text

Weld-OSGi (Essaye d’être) le meilleur des deux mondes dynamique, typesafe, utilisation d’annotations, etc ... Extension CDI permettant d’utiliser le modèle de programmation CDI dans OSGi Pas besoin de connaître OSGi faire disparaitre le modèle de programmation OSGi en faveur de celui de CDI modèle de programmation standard ... mais reste compatible 81 81 jeudi 19 avril 12

Slide 119

Slide 119 text

Weld-OSGi Un projet JBoss Weld besoin de démarrer Weld dans un environnement OSGi expérimentations à faire sur la compatibilité des modèles de programmation Développé par l’équipe R&D SERLI Mathieu ANCELIN & Matthieu CLOCHARD 82 82 jeudi 19 avril 12

Slide 120

Slide 120 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi 83 jeudi 19 avril 12

Slide 121

Slide 121 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi 83 jeudi 19 avril 12

Slide 122

Slide 122 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi bundle 1 bundle2 bundle3 83 jeudi 19 avril 12

Slide 123

Slide 123 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi bundle 1 bundle2 bundle3 beans .xml 83 jeudi 19 avril 12

Slide 124

Slide 124 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi bundle 1 bundle2 bundle3 beans .xml beans .xml 83 jeudi 19 avril 12

Slide 125

Slide 125 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi bundle 1 bundle2 bundle3 beans .xml beans .xml 83 jeudi 19 avril 12

Slide 126

Slide 126 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi bundle 1 bundle2 bundle3 beans .xml beans .xml 83 jeudi 19 avril 12

Slide 127

Slide 127 text

Mais, comment ça marche ? 83 Plateforme Java Plateforme OSGi Weld- OSGi bundle 1 bundle2 bundle3 beans .xml beans .xml 83 jeudi 19 avril 12

Slide 128

Slide 128 text

Modulariser ‘Socializer’ 84 Jackson, Scribe, Solder seam-social- twitter seam-social-core seam-social-api seam-social- facebook seam-social- linkedin Socializer.war 84 jeudi 19 avril 12

Slide 129

Slide 129 text

Modulariser ‘Socializer’ 85 Socializer.war Jackson, Scribe, Solder seam-social- twitter seam-social-core seam-social-api seam-social- facebook seam-social- linkedin 85 jeudi 19 avril 12

Slide 130

Slide 130 text

Modulariser ‘Socializer’ 86 Socializer.war module-twitter module-facebook module-linkedin social-api 86 jeudi 19 avril 12

Slide 131

Slide 131 text

Modulariser ‘Socializer’ 87 Socializer.war social-api Registre OSGi 87 jeudi 19 avril 12

Slide 132

Slide 132 text

Modulariser ‘Socializer’ 87 Socializer.war social-api Registre OSGi 87 jeudi 19 avril 12

Slide 133

Slide 133 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter social-api Registre OSGi 87 jeudi 19 avril 12

Slide 134

Slide 134 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-linkedin social-api Registre OSGi 87 jeudi 19 avril 12

Slide 135

Slide 135 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi 87 jeudi 19 avril 12

Slide 136

Slide 136 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Service OSGi 87 jeudi 19 avril 12

Slide 137

Slide 137 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Service OSGi 87 jeudi 19 avril 12

Slide 138

Slide 138 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Service OSGi 87 jeudi 19 avril 12

Slide 139

Slide 139 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Service OSGi 87 jeudi 19 avril 12

Slide 140

Slide 140 text

Modulariser ‘Socializer’ 87 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Service OSGi 87 jeudi 19 avril 12

Slide 141

Slide 141 text

Modulariser ‘Socializer’ 88 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi 88 jeudi 19 avril 12

Slide 142

Slide 142 text

Modulariser ‘Socializer’ 88 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Bundle OSGi 88 jeudi 19 avril 12

Slide 143

Slide 143 text

Modulariser ‘Socializer’ 88 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Bundle OSGi Bundle OSGi 88 jeudi 19 avril 12

Slide 144

Slide 144 text

Modulariser ‘Socializer’ 88 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Bundle OSGi Bundle OSGi Bundle OSGi 88 jeudi 19 avril 12

Slide 145

Slide 145 text

Modulariser ‘Socializer’ 88 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Bundle OSGi Bundle OSGi Bundle OSGi Bundle OSGi 88 jeudi 19 avril 12

Slide 146

Slide 146 text

Modulariser ‘Socializer’ 88 Socializer.war module-twitter module-facebook module-linkedin social-api Registre OSGi Bundle OSGi Bundle OSGi Bundle OSGi Bundle OSGi Appli. WEB 88 jeudi 19 avril 12

Slide 147

Slide 147 text

API commune 89 public interface SocialProvider { String getName(); UserProfile getUserProfile(); OAuthService getOAuthService(); List getTimeline(); void post(Post post); } 89 jeudi 19 avril 12

Slide 148

Slide 148 text

API commune 90 Export-Package fr.devoxx.social.api;version=1.0.0 90 jeudi 19 avril 12

Slide 149

Slide 149 text

Construire les modules sociaux Module OSGi pour wrapper la librairie cible (twitter, facebook, etc ...) ajout de quelques classes pour permettre l’intégration via Weld-OSGi aucun export de package nécessaire nous allons exposer un service via un type de l’API commune import des packages des librairies utilisées ainsi que de l’API commune 91 91 jeudi 19 avril 12

Slide 150

Slide 150 text

Exposer les modules Chaque module ‘Social’ va se charger d’exposer un Service type ‘SocialProvider’ à travers le registre de services OSGi à disposition des autres bundles Weld-OSGi à disposition des autres bundles OSGi utilisable par d’autres applications 92 92 jeudi 19 avril 12

Slide 151

Slide 151 text

• Publication par déclaration @Publish @ApplicationScoped public class TwitterSocialProvider implements SocialProvider { ... } 93 Publication des SocialProviders 93 jeudi 19 avril 12

Slide 152

Slide 152 text

• Publication dynamique • Publication par déclaration @Inject Instance instance; @Inject ServiceRegistry registry; SocialProvider service = instance.get(); Registration< SocialProvider > reg = registry.register(service); ... reg.unregister(); 94 @Publish @ApplicationScoped public class TwitterSocialProvider implements SocialProvider { ... } Publication des SocialProviders 94 jeudi 19 avril 12

Slide 153

Slide 153 text

Récupération des Posts depuis ‘Socializer’ Chaque module ‘Social’ expose un service OSGi permettant d’accéder au Posts qu’il manipule ‘Socializer’ doit consommer ces Posts pour les afficher dans son interface différentes méthodes possibles privilégions une approche générique 95 95 jeudi 19 avril 12

Slide 154

Slide 154 text

Injection de services Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 96 96 jeudi 19 avril 12

Slide 155

Slide 155 text

Le rôle de l’extension Vraisemblablement, le bean correspondant à ‘@OSGiService SocialProvider provider’ n’existe pas dans l’application cliente Au démarrage de l’extension CDI, Weld-OSGi va scanner tous les points d’injection recherche tous les PI utilisant @OSGiService et créé des beans correspondant cependant n’écrase pas les beans existant pour que l’application continue à fonctionner comme doit, tout n’est pas censé être OSGi-ifié 97 97 jeudi 19 avril 12

Slide 156

Slide 156 text

Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 98 @Inject @OSGiService MyService service; Le rôle de l’extension 98 jeudi 19 avril 12

Slide 157

Slide 157 text

Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 98 @Inject @OSGiService MyService service; InjectionPoint Le rôle de l’extension 98 jeudi 19 avril 12

Slide 158

Slide 158 text

Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 98 @Inject @OSGiService MyService service; Provider InjectionPoint create() Le rôle de l’extension 98 jeudi 19 avril 12

Slide 159

Slide 159 text

Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 98 @Inject @OSGiService MyService service; P R O X Y Provider InjectionPoint create() get() Le rôle de l’extension 98 jeudi 19 avril 12

Slide 160

Slide 160 text

Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 98 @Inject @OSGiService MyService service; P R O X Y Provider InjectionPoint create() get() Le rôle de l’extension Extension CDI 98 jeudi 19 avril 12

Slide 161

Slide 161 text

provider.getTimeline() P R O X Y registre de services OSGI 99 Le rôle de l’extension 99 jeudi 19 avril 12

Slide 162

Slide 162 text

provider.getTimeline() P R O X Y registre de services OSGI 99 Le rôle de l’extension 99 jeudi 19 avril 12

Slide 163

Slide 163 text

provider.getTimeline() P R O X Y get() registre de services OSGI 99 Le rôle de l’extension 99 jeudi 19 avril 12

Slide 164

Slide 164 text

provider.getTimeline() P R O X Y get() registre de services OSGI service réel 99 Le rôle de l’extension 99 jeudi 19 avril 12

Slide 165

Slide 165 text

provider.getTimeline() P R O X Y get() registre de services OSGI service réel getTimeline() 99 Le rôle de l’extension 99 jeudi 19 avril 12

Slide 166

Slide 166 text

provider.getTimeline() P R O X Y get() registre de services OSGI unget() service réel getTimeline() 99 Le rôle de l’extension 99 jeudi 19 avril 12

Slide 167

Slide 167 text

Injection programmatique - whiteboard pattern (comme Instance) @Inject Service providers; for (SocialProvider provider : providers.first()) { provider.getTimeline(); // appel sur 0-1 service } for (SocialProvider provider : providers) { provider.getTimeline(); // appel sur 0-n service(s) } providers.get().getTimeline(); // peut échoué car non dynamique providers.size(); providers.isUnsatisfied(); providers.isAmbiguous(); 100 Injection de services 100 jeudi 19 avril 12

Slide 168

Slide 168 text

101 Injection de services @Inject Service providers; public List getTimeline() { List timeline = new ArrayList(); for (SocialProvider provider : providers) { timeline.addAll(provider.getTimeline()); } Collections.sort(timeline, new Comparator() { public int compare(Post post1, Post post2) { return post1.timestamp().compare(post2.timestamp()); } }); return timeline; } 101 jeudi 19 avril 12

Slide 169

Slide 169 text

Et si on souhaite un service en particuliers ? @Publish @Twitter public class TwitterSocialProvider implements SocialProvider { ... } 102 102 jeudi 19 avril 12

Slide 170

Slide 170 text

@Publish @Twitter public class TwitterSocialProvider implements SocialProvider { ... } @Inject @OSGiService @Filter("(twitter=true)") SocialProvider service; 103 Et si on souhaite un service en particuliers ? 103 jeudi 19 avril 12

Slide 171

Slide 171 text

@Publish @Twitter public class TwitterSocialProvider implements SocialProvider { ... } @Inject @Filter("(twitter=true)") Service service; 104 Et si on souhaite un service en particuliers ? 104 jeudi 19 avril 12

Slide 172

Slide 172 text

@Publish @Twitter public class TwitterSocialProvider implements SocialProvider { ... } @Inject @Filter("(twitter=true)") Service service; @Inject @OSGiService @Twitter SocialProvider service; 105 Et si on souhaite un service en particuliers ? 105 jeudi 19 avril 12

Slide 173

Slide 173 text

@Publish @Twitter public class TwitterSocialProvider implements SocialProvider { ... } @Inject @Filter("(twitter=true)") Service service; @Inject @Twitter Service service; 106 Et si on souhaite un service en particuliers ? 106 jeudi 19 avril 12

Slide 174

Slide 174 text

Des services requis ... Avoir une application dynamique est intéressant, mais parfois il est absolument nécessaire d’avoir un certain service pour que tout fonctionne Weld-OSGi vous prévient lorsque des services requis sont disponibles peut fonctionner de manière globale pour tous les services requis du bundle peut cibler des services requis en particulier 107 107 jeudi 19 avril 12

Slide 175

Slide 175 text

service validation de dépendances Weld-OSGi registre de services OSGi Bean B Bean A 108 Des services requis ... 108 jeudi 19 avril 12

Slide 176

Slide 176 text

service validation de dépendances Weld-OSGi registre de services OSGi enregistrement d’un service requis Bean B Bean A 108 Des services requis ... 108 jeudi 19 avril 12

Slide 177

Slide 177 text

service validation de dépendances Weld-OSGi registre de services OSGi enregistrement d’un service requis Bean B Bean A 108 Des services requis ... Extension CDI 108 jeudi 19 avril 12

Slide 178

Slide 178 text

service validation de dépendances Weld-OSGi registre de services OSGi enregistrements/ désenregistrements de services enregistrement d’un service requis Bean B Bean A 108 Des services requis ... Extension CDI 108 jeudi 19 avril 12

Slide 179

Slide 179 text

service validation de dépendances Weld-OSGi registre de services OSGi enregistrements/ désenregistrements de services enregistrement d’un service requis Bean B Bean A 108 Des services requis ... notifications Extension CDI 108 jeudi 19 avril 12

Slide 180

Slide 180 text

service validation de dépendances Weld-OSGi registre de services OSGi enregistrements/ désenregistrements de services enregistrement d’un service requis évènements de validation des dépendances Bean B Bean A 108 Des services requis ... notifications Extension CDI 108 jeudi 19 avril 12

Slide 181

Slide 181 text

service validation de dépendances Weld-OSGi registre de services OSGi enregistrements/ désenregistrements de services enregistrement d’un service requis évènements de validation des dépendances Bean B Bean A 108 Des services requis ... notifications Extension CDI 108 jeudi 19 avril 12

Slide 182

Slide 182 text

@Inject @OSGiService @Required @Twitter SocialProvider twitter; @Inject @OSGiService @Required @Facebook SocialProvider facebook; public void start(@Observes Valid evt) { System.out.println("Les SocialProviders sont disponibles"); twitter.getOAuthService().connect(); facebook.getOAuthService().connect(); } public void stop(@Observes Invalid evt) { twitter.getOAuthService().disconnect(); facebook.getOAuthService().disconnect(); System.out.println("Les SocialProviders sont indisponibles"); } 109 Des services requis ... 109 jeudi 19 avril 12

Slide 183

Slide 183 text

110 @Inject @Required @Twitter Service twitter; @Inject @Required @Facebook Service facebook; public void start(@Observes Valid evt) { System.out.println("Les SocialProviders sont disponibles"); twitter.get().getOAuthService().connect(); facebook.get().getOAuthService().connect(); } public void stop(@Observes Invalid evt) { twitter.get().getOAuthService().disconnect(); facebook.get().getOAuthService().disconnect(); System.out.println("Les SocialProviders sont indisponibles"); } Des services requis ... 110 jeudi 19 avril 12

Slide 184

Slide 184 text

bundle complet 111 @Inject @Required @Twitter Service twitter; @Inject @Required @Facebook Service facebook; public void start(@Observes Valid evt) { System.out.println("Les SocialProviders sont disponibles"); twitter.get().getOAuthService().connect(); facebook.get().getOAuthService().connect(); } public void stop(@Observes Invalid evt) { twitter.get().getOAuthService().disconnect(); facebook.get().getOAuthService().disconnect(); System.out.println("Les SocialProviders sont indisponibles"); } Des services requis ... 111 jeudi 19 avril 12

Slide 185

Slide 185 text

@Inject @OSGiService @Required SocialProvider provider; public void start(@Observes @Specification(SocialProvider.class) ServiceAvailable evt) { System.out.println("Au moins un SocialProvider est disponible"); provider.getOAuthService().connect(); } public void stop(@Observes @Specification(SocialProvider.class) ServiceUnavailable evt) { System.out.println("Aucun SocialProvider disponible"); } 112 Des services requis ... 112 jeudi 19 avril 12

Slide 186

Slide 186 text

113 @Inject @OSGiService @Required Service provider; public void start(@Observes @Specification(SocialProvider.class) ServiceAvailable evt) { System.out.println("Au moins un SocialProvider est disponible"); provider.get().getOAuthService().connect(); } public void stop(@Observes @Specification(SocialProvider.class) ServiceUnavailable evt) { System.out.println("Aucun SocialProvider disponible"); } Des services requis ... 113 jeudi 19 avril 12

Slide 187

Slide 187 text

Les notifications OSGi OSGi génère de nombreuse évènements pour pouvoir interagir avec les couches bundle et services meilleur moyen de gérer le côté dynamique du framework Evènements disponibles : bundle events service events 114 114 jeudi 19 avril 12

Slide 188

Slide 188 text

Les notifications OSGi Va permettre à notre application de savoir lorsqu’un nouveau service est disponible géré de manière asynchrone, pas besoin de vérifier ‘à la main’ permet d’afficher une notification à l’utilisateur lui demandant de se connecter utilisation des servlets asynchrones ? 115 115 jeudi 19 avril 12

Slide 189

Slide 189 text

Evènements possibles BundleInstalled BundleResolved BundleStarting BundleStarted BundleStopping BundleStopped BundleUninstalled BundleUpdated BundleUnresolved Installed Resolved Uninstalled Starting Active Stopping install update refresh stop start update refresh resolve uninstall uninstall 116 Evènements liés aux bundles OSGi 116 jeudi 19 avril 12

Slide 190

Slide 190 text

public void bindBundle(@Observes BundleInstalled evt) {} 117 Evènements liés aux bundles OSGi 117 jeudi 19 avril 12

Slide 191

Slide 191 text

public void bindBundle(@Observes @BundleVersion("1.2.3") BundleInstalled evt) {} 118 Evènements liés aux bundles OSGi 118 jeudi 19 avril 12

Slide 192

Slide 192 text

public void bindBundle(@Observes @BundleName("org.jboss.seam.social.twitter") BundleInstalled evt) {} 119 Evènements liés aux bundles OSGi 119 jeudi 19 avril 12

Slide 193

Slide 193 text

public void bindBundle(@Observes @BundleName("org.jboss.seam.social.twitter") @BundleVersion("1.2.3") BundleInstalled evt) {} 120 Evènements liés aux bundles OSGi 120 jeudi 19 avril 12

Slide 194

Slide 194 text

121 • Available events • ServiceArrival • ServiceDeparture • ServiceChanged Evènements liés aux services OSGi 121 jeudi 19 avril 12

Slide 195

Slide 195 text

Available events ServiceArrival ServiceDeparture ServiceChanged void bindService(@Observes ServiceArrival evt) {} 122 Evènements liés aux services OSGi 122 jeudi 19 avril 12

Slide 196

Slide 196 text

void bindService(@Observes @Filter("(twitter=true)") ServiceArrival evt) {} 123 • Available events • ServiceArrival • ServiceDeparture • ServiceChanged Evènements liés aux services OSGi 123 jeudi 19 avril 12

Slide 197

Slide 197 text

void bindService(@Observes @Specification(SocialProvider.class) ServiceArrival evt) {} 124 • Available events • ServiceArrival • ServiceDeparture • ServiceChanged Evènements liés aux services OSGi 124 jeudi 19 avril 12

Slide 198

Slide 198 text

void bindService(@Observes @Specification(SocialProvider.class) @Filter("(twitter=true)") ServiceArrival evt) {} 125 • Available events • ServiceArrival • ServiceDeparture • ServiceChanged Evènements liés aux services OSGi 125 jeudi 19 avril 12

Slide 199

Slide 199 text

Inter-bundles events Communication entre les bundles OSGi gérés par Weld-OSGi Bundle A Bundle C Bundle B Weld-OSGi 126 126 jeudi 19 avril 12

Slide 200

Slide 200 text

Inter-bundles events Communication entre les bundles OSGi gérés par Weld-OSGi Bundle A Bundle C Bundle B Weld-OSGi fire() 126 126 jeudi 19 avril 12

Slide 201

Slide 201 text

Inter-bundles events Communication entre les bundles OSGi gérés par Weld-OSGi Bundle A Bundle C Bundle B Weld-OSGi fire() broadcast() 126 broadcast() 126 jeudi 19 avril 12

Slide 202

Slide 202 text

Inter-bundles events 127 Synchronisation des timelines de manière planifiée Appelé depuis un EJB avec @Schedule Récupération des timelines de manière asynchrone Mise en cache pour des raisons de performances Envoi des nouveaux ‘Post’ vers l’application cliente pour une mise à jour en temps réel 127 jeudi 19 avril 12

Slide 203

Slide 203 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); 128 128 jeudi 19 avril 12

Slide 204

Slide 204 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); 128 depuis un EJB @Schedule 128 jeudi 19 avril 12

Slide 205

Slide 205 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); 129 depuis un EJB @Schedule 129 jeudi 19 avril 12

Slide 206

Slide 206 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes InterBundleEvent event) {} 130 depuis un EJB @Schedule 130 jeudi 19 avril 12

Slide 207

Slide 207 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes @Sent InterBundleEvent event) {} 131 depuis un EJB @Schedule 131 jeudi 19 avril 12

Slide 208

Slide 208 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes @Specification(SynchronizeTimeline.class) InterBundleEvent event) {} 132 depuis un EJB @Schedule 132 jeudi 19 avril 12

Slide 209

Slide 209 text

Inter-bundles events @Inject Event event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes @Specification(SynchronizeTimeline.class) @Sent InterBundleEvent event) {} 133 depuis un EJB @Schedule 133 jeudi 19 avril 12

Slide 210

Slide 210 text

Démo : ‘Modular Socializer’ 134 134 jeudi 19 avril 12

Slide 211

Slide 211 text

Le futur de Weld-OSGi Intégration dans Weld core (en cours) Plugin Forge CDI Extension pour les serveurs Java EE hybrides utiliser Weld-OSGi dans une application Java EE en cours ;-) Intégration avec les spécifications entreprise une future spécification OSGi entreprise ? 135 135 jeudi 19 avril 12

Slide 212

Slide 212 text

136 Code du projet https://github.com/mathieuancelin/core/tree/weld-osgi/environments/osgi Documentation du projet http://mathieuancelin.github.com/weld-osgi/ Informations sur le projet 136 jeudi 19 avril 12

Slide 213

Slide 213 text

Seam Social et son futur Seam Social est forkable sur github : http://github.com/seam/social Si vous êtes intéressés par Socializer (branche Twitter Bootstrap incluse) : https://github.com/antoinesd/Socializer Seam Social dépasse le simple cadre d’un module CDI Une tentative de JSR a été conduite mais rejetée Un projet « Java Social » est en cours de constitution Une communauté s’est constituée. Pour ceux que ça intéresse suivez @antoine_sd ou @Java_social 137 137 jeudi 19 avril 12

Slide 214

Slide 214 text

Le mot de la fin CDI c’est bien mangez-en OSGi est beaucoup plus sympathique que vous ne le pensez Surtout avec Weld-OSGi Seam Social c’est cool mais le sera encore plus avec vous comme contributeur. 138 138 jeudi 19 avril 12

Slide 215

Slide 215 text

Questions 139 139 jeudi 19 avril 12