SlideShare a Scribd company logo
1 of 215
CDI mis en pratique avec Seam
    Social et Weld OSGI
        par Mathieu Ancelin @TrevorReznik
       et Antoine Sabot-Durand @antoine_sd




                                             1
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
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
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
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
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
Avant de commencer

#DevoxxFR


    #CDIPratique


                         6
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
Concepts généraux



                    8
Historique CDI

Spring       Seam            CDI




                Guice     @Inject



                                    9
Messaging                     Application
                                Client
                              Container
                                                     CDI dans Java EE
                                                      Web Browser
            SOA

                                              Client Tier




                                       JSF 2.0                              CDI est une technologie d’intégration qui enrichi
                                                                            aussi bien des POJO que des EJB
            JAX-WS


                     JAX-RS
  JMS




                                               Servlet 3.0

                                                Web Tier
                                                                            Il a vocation à servir de «glue» entre les
                                                                            différentes parties de la stack Java EE


            EJB Container                   Managed Bean (POJO)             C’est la première technologie qui permet
                                                                            d’étendre Java EE de manière portable et
                                                                            naturelle
                               Service Tier                           CDI


    JTA               JPA          JAAS             JAXB        JCA

                              Serveur Java EE 6
                                                                                                                                10
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
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
Jackson
@JsonIgnoreProperties(ignoreUnknown = true)
@SuppressWarnings("unused")
abstract class TwitterProfileMixin {
    @JsonCreator                                                                      L’un des frameworks les plus performants pour
    TwitterProfileMixin(@JsonProperty("id") String id, @JsonProperty("screen_name")
String screenName,                                                                    parser du JSON
            @JsonProperty("name") String name, @JsonProperty("url") String url,
            @JsonProperty("profile_image_url") String profileImageUrl,
@JsonProperty("description") String description,
                                                                                      Jackson permet également de mapper du JSON
            @JsonProperty("location") String location,
            @JsonProperty("created_at") @JsonDeserialize(using =
                                                                                      sur des classes java
TimelineDateDeserializer.class) Date createdDate) {
    }                                                                                 Pour ça il peut utiliser des annotations JAXB ou
      @JsonProperty("notifications")                                                  ses propres annotations
      private boolean notificationsEnabled;

      @JsonProperty("lang")                                                            En plus Jackson propose la notion de Mixin qui
      private String language;
                                                                                      permet de déporter les annotations sur une
      @JsonProperty("statuses_count")
      private int statusesCount;                                                      classe dédiée et de laisser la classe d’origine
...
                                                                                      propre.



                                                                                                                                         13
Jackson : Utilisation d’un Mixin

Pojo        PojoMixin
              Texte     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


       Module           Un module Jackson est nécessaire pour créer
                        l’association
       Jackson


                                                                            14
Concepts et technos utilisés par les
        réseaux sociaux


                                       15
La big picture

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
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
Le cycle OAuth 1.0a
                    Service tiers (OAuth)




Client




                  Serveur de l’application
                                             18
Le cycle OAuth 1.0a
                                  Service tiers (OAuth)




          Client

                         1




 Le client demande
une ressource sur le
    service tiers

                                Serveur de l’application
                                                           18
Le cycle OAuth 1.0a
                                  Service tiers (OAuth)




          Client
                                                            L’application demande un
                         1
                                                               request Token (relatif à
                                         2                   l’application déclarée) au
                                                           service et envoie une url de
                                                           callback à associer au token
 Le client demande
une ressource sur le
    service tiers

                                Serveur de l’application
                                                                                          18
Le cycle OAuth 1.0a
                                  Service tiers (OAuth)




                                                           Le service retourne le token
          Client                             3
                                                                   L’application demande un
                         1
                                                                      request Token (relatif à
                                         2                          l’application déclarée) au
                                                                  service et envoie une url de
                                                                  callback à associer au token
 Le client demande
une ressource sur le
    service tiers

                                Serveur de l’application
                                                                                                 18
Le cycle OAuth 1.0a
                                             Service tiers (OAuth)


L’application
                              4
  redirige le
 client sur la
page de login                                                         Le service retourne le token
  du service
                 Client                                 3
                                                                              L’application demande un
                                    1
                                                                                 request Token (relatif à
                                                    2                          l’application déclarée) au
                                                                             service et envoie une url de
                                                                             callback à associer au token
        Le client demande
       une ressource sur le
           service tiers

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

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

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

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



                                                                                                19
Composants principaux de Seam
           Social


                                20
Objectifs de Seam Social

             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
«interface»
                           Les classes principales
       OAuthSession                                    «interface»
                                                   OAuthService
+getRequestToken()
+setRequestToken(OAuthToken)     +getAccessToken()
+getAccessToken()                +getAuthorizationUrl()
                                 +getVerifier()                                                   «interface»
+setAccessToken(OAuthToken)
+getVerifier()                    +initAccessToken()                                     SocialNetworkServicesHub
+setVerifier(String)              +sendSignedRequest(RestVerb, String)
+setUserProfile(UserProfile)       +sendSignedRequest(RestVerb, String, Map)
+getUserProfile()                 +sendSignedRequest(RestVerb, String, String, Object)
+getServiceQualifier()            +setVerifier(String)
+isConnected()                   +setAccessToken(String, String)
                                                                                              AbstractSocialNetworkService
+getName()                       +setAccessToken(OAuthToken)
                                 +sendSignedXmlRequest(RestVerb, String, String)
                                 +getSession()                                               +buildUri(String, String, String)
                                 +requireAuthorization()                                     +buildUri(String, Map)
                                 +sendSignedRequest(OAuthRequest)                            +getApiRootUrl()
                                                                                             +buildUri(String)
                                                                                             +buildUri(String, Object)

           «interface»
                                                       «interface»
SocialNetworkServicesHub
                                                  OAuthProvider

+getMyProfile()
+getSession()                         +getRequestToken()
+resetConnection()                    +getAccessToken(OAuthToken, String)
+isConnected()                        +signRequest(OAuthToken, OAuthRequest)
+configureService(OAuthService)        +getVersion()
+getVerifierParamName()                +getAuthorizationUrl(OAuthToken)
                                      +requestFactory(RestVerb, String)
                                      +tokenFactory(String, String)
                                                                                                                                 22
Bootstraping Social
      @Twitter
      @ApplicationScoped
                                                                                                Grace à une extension CDI incluse
                                                                                                dans Solder, on créé 4 beans portant
      @OAuthApplication(apiKey = "FQzlQC49UhvbMZoxUIvHTQ",
                         apiSecret = "VQ5CZHG4qUoAkUUmckPn4iN4yyjBKcORTW0wnok4r1k",
                         callback = "http://localhost:8080/social-web-client/callback.jsf")
      @Produces
      public TwitterServicesHub twitterProducer(TwitterServicesHub service) {                   le même qualifier et le scope de son
          return service;
      }                                                                                         choix lié à celui du producer

@Twitter @ApplicationScoped
                      «interface»                        @Twitter @SessionScoped
                  OAuthService                                       «interface»
                                                                 OAuthSession                 @Twitter @ApplicationScoped
+getAccessToken()
                                                                                                                «interface»
+getAuthorizationUrl()
                                                           +getRequestToken()                               OAuthProvider
+getVerifier()
                                                           +setRequestToken(OAuthToken)
+initAccessToken()
                                                           +getAccessToken()
+sendSignedRequest(RestVerb, String)                                                             +getRequestToken()
                                                           +setAccessToken(OAuthToken)
+sendSignedRequest(RestVerb, String, Map)                                                        +getAccessToken(OAuthToken, String)
                                                           +getVerifier()
+sendSignedRequest(RestVerb, String, String, Object)                                             +signRequest(OAuthToken, OAuthRequest)
                                                           +setVerifier(String)
+setVerifier(String)                                                                              +getVersion()
                                                           +setUserProfile(UserProfile)
+setAccessToken(String, String)                                                                  +getAuthorizationUrl(OAuthToken)
                                                           +getUserProfile()
+setAccessToken(OAuthToken)                                                                      +requestFactory(RestVerb, String)
                                                           +getServiceQualifier()
+sendSignedXmlRequest(RestVerb, String, String)                                                  +tokenFactory(String, String)
                                                           +isConnected()
+getSession()
                                                           +getName()
+requireAuthorization()
+sendSignedRequest(OAuthRequest)




                                                                                                                                          23
Etendre Seam Social
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
DEMO Socializer Primefaces



                             25
CDI



      26
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
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
Le Bean
En Java EE 6 tout est Managed Bean




                                     29
Le Bean
     Pensez au fichier


          beans.xml



                        30
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
Injection de dépendance


@Inject

                          32
Injection de dépendance

public class HelloService {
    public String hello() {
        return "Hello World!";
    }
}


                                 33
Injection de dépendance
public class MyBean extends Application {

    private HelloService service;

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

    private HelloService service;

    @Inject
    public void setService(HelloService service) {
        this.service = service;
    }
    public void displayHello() {
        display( service.hello();
    }
}
                                                     35
Injection de dépendance

public class MyBean extends Application {

    @Inject HelloService service;

    public void displayHello() {
        display( service.hello();
    }
}


                                            36
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
Les qualifiers
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
Les qualifiers
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface French {}

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface English {}

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

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface English {}

                                            40
Les qualifiers
@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
Les qualifiers
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface Language {

    Languages value();

    @Nonbinding String description() default "";

    public enum Languages {
        FRENCH, ENGLISH
    }
}                                                  42
Les qualifiers
@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
Les qualifiers
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
Les qualifiers
public class MyBean extends Application {
    @Inject @French
    HelloService service;
}

@French @Console @Secured
public class FrenchHelloService implements
                            HelloService {

}

                                             45
Les qualifiers
public class MyBean extends Application {
    @Inject @French @Console
    HelloService service;
}

@French @Console @Secured
public class FrenchHelloService implements
                            HelloService {

}

                                             46
Les qualifiers
public class MyBean extends Application {
    @Inject @French @Console @Secured
    HelloService service;
}

@French @Console @Secured
public class FrenchHelloService implements
                            HelloService {

}

                                             47
Les qualifiers
public class MyBean extends Application {
    @Inject @French @Console @Secured
    HelloService service;
}

@French @Secured
public class FrenchHelloService implements
                            HelloService {

}

                                             48
Les qualifiers
public class MyBean extends Application {
    @Inject @French @Console @Secured
    HelloService service;
}

@French @Secured
public class FrenchHelloService implements
                            HelloService {

}

                                             48
Injection programmatique

public class MyBean extends Application {

    @Inject Instance<HelloService> service;

    public void displayHello() {
        display( service.get().hello() );
    }
}


                                              49
Injection programmatique
public class MyBean extends Application {

    @Inject Instance<HelloService> service;

    public void displayHello() {
        if (!service.isUnsatisfied()) {
            display( service.get().hello() );
        }
    }
}

                                                50
Injection programmatique
public class MyBean extends Application {

    @Any @Inject Instance<HelloService> services;

    public void displayHello() {
        display(
            service.select(
                 new AnnotationLiteral()<French> {})
                .get() );
    }
}
                                                       51
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
Les contextes

@SessionScoped
public class CartBean {

    public void addItem(Item item) {
        ...
    }
}




                                       53
Les contextes

@ApplicationScoped
public class CartBean {

    public void addItem(Item item) {
        ...
    }
}




                                       54
Les contextes

@ApplicationScoped

                  ! !!
public class CartBean {


      IL
    A
    public void addItem(Item item) {


   F
        ...
    }
}




                                       54
Les contextes

@ConversationScoped
public class CartBean {

    public void addItem(Item item) {
        ...
    }
}




                                       55
Les contextes

@ThreadScoped
public class CartBean {

    public void addItem(Item item) {
        ...
    }
}




                                       56
Les contextes

@HourScoped
public class CartBean {

    public void addItem(Item item) {
        ...
    }
}




                                       57
Les contextes

@RandomScoped
public class CartBean {

    public void addItem(Item item) {
        ...
    }
}




                                       58
Les décorateurs
@Decorator
public class HelloDecorator implements HelloService {

    @Inject @Delegate HelloService service;

    public String hello() {
        return service.hello() + "-decorated";
    }
}


    @Inject HelloService service;

                                                        59
Les décorateurs
@Decorator
public abstract class HelloDecorator implements HelloService
{

    @Inject @Delegate HelloService service;

    public String hello() {
        return service.hello() + "-decorated";
    }
}

       @Inject HelloService service;

                                                               60
Les décorateurs
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
  <decorators>
    <class>foo.bar.HelloDecorator</class>
  </decorators>
</beans>

                                                           61
Les évènements
@Inject Event<String> evt;
...
evt.fire("Bonjour");

@Inject Event<Post> evt;
...
evt.fire(
    new Post(
        "Mathieu ANCELIN ", "Bonjour", ));


                                             62
Les évènements
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
Les évènements

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface English {}




                                            64
Les évènements
          @Inject @English Event<String> evt;
          ...
          evt.fire("Hello");



public void receiveEvt(@Observes @English String evt) {
    System.out.println("Received : " + evt);
}


                                                          65
CDI en pratique dans Seam Social
         Visite guidée


                                   66
Les extensions CDI



                     67
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
Pour comprendre les extensions
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
Cycle de vie CDI
 Deploy          Process         Process       Before       Undeploy
Application       Beans         Producers     Shutdown     Application




                                Process
Before Bean       Process                    Application
                                Observer
 Discovery    Injection Taget                 Running
                                Methods



                                                After
   Scan          Process        After Bean
                                             Deployment
  Archive     Anotated Types    Discovery
                                              Validation

                                                                         70
Pour Faire une Extension CDI

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
Exemple simple : @Veto

 <X> void processAnnotatedType(@Observes final ProcessAnnotatedType<X> pat, BeanManager beanManager) {
        final AnnotatedType<X> annotatedType = pat.getAnnotatedType();
        final Class<X> 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
Exemple simple : @Veto

 <X> void processAnnotatedType(@Observes final ProcessAnnotatedType<X> pat, BeanManager beanManager) {
        final AnnotatedType<X> annotatedType = pat.getAnnotatedType();
        final Class<X> 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
Demo Extension



                 73
Et OSGi ?

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
Concepts liés à OSGi



                       75
OSGi
Plateforme modulaire et dynamique pour Java
Très stable et puissante mais APIs vieillottes ...




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




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




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



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

                                        Bundles
                                        Service
                                       Lifecycle
                                        Module
                             Plateforme Java
                                                     76
Modules / Bundles




                    77
Modules / Bundles

   manifest   manifest




                         77
Modules / Bundles
                                   Bundle-SymbolicName: com.sample.app
Bundle-SymbolicName: com.foo.bar




                     manifest                 manifest




                                                                         77
Modules / Bundles
                                   Bundle-SymbolicName: com.sample.app
Bundle-SymbolicName: com.foo.bar




                     manifest                 manifest




                                             Export-Package: com.sample.app.api;
                                                       version=1.2.0




                                                                                   77
Modules / Bundles
                                                     Bundle-SymbolicName: com.sample.app
Bundle-SymbolicName: com.foo.bar




                     manifest                                   manifest




                                                               Export-Package: com.sample.app.api;
                                                                         version=1.2.0
               Import-Package: com.sample.app.api;
                      version=[1.2.0-2.0.0)




                                                                                                     77
Modules / Bundles
                                                     Bundle-SymbolicName: com.sample.app
Bundle-SymbolicName: com.foo.bar




                     manifest                                   manifest




                                                               Export-Package: com.sample.app.api;
                                                                         version=1.2.0
               Import-Package: com.sample.app.api;
                      version=[1.2.0-2.0.0)




                                                                                                     77
Cycle de vie




               78
Cycle de vie
install




                   78
Cycle de vie
install




Installed




                   78
Cycle de vie
          install




          Installed
resolve




                             78
Cycle de vie
          install




          Installed
resolve


          Resolved




                             78
Cycle de vie
                                update
                                refresh
          install




          Installed
                      update
resolve               refresh


          Resolved




                                          78
Cycle de vie
                                update
                                refresh
          install




          Installed
                      update              start
resolve               refresh


          Resolved




                                                  78
Cycle de vie
                                update
                                refresh
          install




          Installed                               Starting
                      update              start
resolve               refresh

                                                  Active
          Resolved




                                                             78
Cycle de vie
                                update
                                refresh
          install




          Installed                               Starting
                      update              start
resolve               refresh

                                                  Active
          Resolved
                                                           stop




                                                                  78
Cycle de vie
                                update
                                refresh
          install




          Installed                               Starting
                      update              start
resolve               refresh

                                                   Active
          Resolved
                                                            stop


                                                  Stopping


                                                                   78
Cycle de vie
                                update
                                refresh
          install




          Installed                               Starting
                      update              start
resolve               refresh

                                                   Active
          Resolved
                                                            stop
      uninstall

                                                  Stopping


                                                                   78
Cycle de vie
                                  update
                                  refresh
           install




           Installed                                Starting
                        update              start
resolve                 refresh

                                                     Active
           Resolved
                                                              stop
      uninstall

                                                    Stopping
          Uninstalled
                                                                     78
Cycle de vie
                                              update
                                              refresh
                       install




                       Installed                                Starting
                                    update              start
            resolve                 refresh
uninstall




                                                                 Active
                       Resolved
                                                                          stop
                  uninstall

                                                                Stopping
                      Uninstalled
                                                                                 78
Services

                         listener
              OSGI
Bundle A     service    Bundle B
             registry




                                    79
Services

                                  listener

           register    OSGI
Bundle A              service    Bundle B
                      registry




                                             79
Services

                                           listener

           register    OSGI      lookup
Bundle A              service             Bundle B
                      registry




                                                      79
Services

                                  listener

           register    OSGI
Bundle A              service    Bundle B
                      registry




                                             79
Services
                                 notify



                                           listener

           register    OSGI
Bundle A              service             Bundle B
                      registry




                                                      79
Services
                                   notify



                                             listener

           register    OSGI      lookup
Bundle A              service               Bundle B
                      registry




                                                        79
Weld-OSGi



            80
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
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
Mais, comment ça marche ?




      Plateforme OSGi

       Plateforme Java
                            83
Mais, comment ça marche ?


   Weld-
   OSGi

           Plateforme OSGi

           Plateforme Java
                             83
Mais, comment ça marche ?


   Weld-
               bundle 1   bundle2   bundle3
   OSGi

           Plateforme OSGi

           Plateforme Java
                                              83
Mais, comment ça marche ?


   Weld-
               bundle 1     bundle2   bundle3
   OSGi             beans
                     .xml

           Plateforme OSGi

           Plateforme Java
                                                83
Mais, comment ça marche ?


   Weld-
               bundle 1     bundle2     bundle3
   OSGi             beans       beans
                     .xml        .xml

           Plateforme OSGi

           Plateforme Java
                                                  83
Mais, comment ça marche ?


   Weld-
               bundle 1     bundle2     bundle3
   OSGi             beans       beans
                     .xml        .xml

           Plateforme OSGi

           Plateforme Java
                                                  83
Mais, comment ça marche ?


   Weld-
               bundle 1     bundle2     bundle3
   OSGi             beans       beans
                     .xml        .xml

           Plateforme OSGi

           Plateforme Java
                                                  83
Mais, comment ça marche ?


   Weld-
               bundle 1     bundle2     bundle3
   OSGi             beans       beans
                     .xml        .xml

           Plateforme OSGi

           Plateforme Java
                                                  83
Modulariser ‘Socializer’
   Socializer.war    seam-social-api

                     seam-social-core
  Jackson, Scribe,
      Solder           seam-social-
                         twitter
   seam-social-        seam-social-
     linkedin            facebook


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



                                                   85
Modulariser ‘Socializer’

 module-twitter      social-api


 module-linkedin
                   Socializer.war
module-facebook



                                    86
Modulariser ‘Socializer’


                            Registre
social-api                             Socializer.war
                             OSGi




                                                        87
Modulariser ‘Socializer’


                            Registre
social-api                             Socializer.war
                             OSGi




                                                        87
Modulariser ‘Socializer’

               module-twitter

                                Registre
social-api                                 Socializer.war
                                 OSGi




                                                            87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi




                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook



                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook

                 Service OSGi
                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook

                 Service OSGi
                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook

                 Service OSGi
                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook

                 Service OSGi
                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook

                 Service OSGi
                                                             87
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

              module-facebook



                                                             88
Modulariser ‘Socializer’

               module-twitter

                                 Registre
social-api     module-linkedin              Socializer.war
                                  OSGi

                     le O SGi
              module-facebook
               B und



                                                             88
Modulariser ‘Socializer’

               module-twitter

                     le O SGi    Registre
social-api     module-linkedin
                B und                       Socializer.war
                                  OSGi

                     le O SGi
              module-facebook
               B und



                                                             88
Modulariser ‘Socializer’

                     le O SGi
               module-twitter
                B und

                     le O SGi    Registre
social-api     module-linkedin
                B und                       Socializer.war
                                  OSGi

                     le O SGi
              module-facebook
               B und



                                                             88
Modulariser ‘Socializer’

                           le O SGi
             SGi     module-twitter
                      B und
  und   le O
B
                           le O SGi    Registre
 social-api          module-linkedin
                      B und                       Socializer.war
                                        OSGi

                           le O SGi
                    module-facebook
                     B und



                                                                   88
Modulariser ‘Socializer’

                           le O SGi
             SGi     module-twitter
                      B und                                   EB
  und   le O                                          p pli. W
B                                                 A
                           le O SGi    Registre
 social-api          module-linkedin
                      B und                       Socializer.war
                                        OSGi

                           le O SGi
                    module-facebook
                     B und



                                                                   88
API commune
public interface SocialProvider {

    String getName();

    UserProfile getUserProfile();

    OAuthService getOAuthService();

    List<Post> getTimeline();

    void post(Post post);
}
                                      89
API commune


Export-Package fr.devoxx.social.api;version=1.0.0




                                                    90
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
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
Publication des SocialProviders
• Publication par déclaration
 @Publish
 @ApplicationScoped
 public class TwitterSocialProvider implements SocialProvider {
     ...
 }




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

• Publication dynamique
 @Inject Instance<SocialProvider> instance;
 @Inject ServiceRegistry registry;
 SocialProvider service = instance.get();
 Registration< SocialProvider > reg = registry.register(service);
 ...
 reg.unregister();

                                                                    94
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
Injection de services
Injection de service dynamique
@Inject @OSGiService SocialProvider provider;
provider.getTimeline(); // échoue si aucun service disponible




                                                                96
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
Le rôle de l’extension
Injection de service dynamique
@Inject @OSGiService SocialProvider provider;
provider.getTimeline(); // échoue si aucun service disponible




@Inject @OSGiService
MyService service;




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




@Inject @OSGiService
                                                 InjectionPoint
MyService service;




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



                                            create()

@Inject @OSGiService
MyService service;               Provider              InjectionPoint




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


                         P
                             get()              create()
                         R
@Inject @OSGiService
MyService service;       O           Provider              InjectionPoint

                         X
                         Y


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

                         X
                         Y


                                                                                    98
Le rôle de l’extension

provider.getTimeline()
                         P
                         R
                         O        registre de
                         X         services
                         Y          OSGI




                                                99
Le rôle de l’extension

provider.getTimeline()
                         P
                         R
                         O        registre de
                         X         services
                         Y          OSGI




                                                99
Le rôle de l’extension

provider.getTimeline()       get()
                         P
                         R
                         O           registre de
                         X            services
                         Y             OSGI




                                                   99
Le rôle de l’extension

provider.getTimeline()       get()
                         P
                         R
                         O                     registre de
                                     service
                         X            réel      services
                         Y                       OSGI




                                                             99
Le rôle de l’extension

provider.getTimeline()                   get()
                         P
                         R
                         O   getTimeline()                 registre de
                                                 service
                         X                        réel      services
                         Y                                   OSGI




                                                                         99
Le rôle de l’extension

provider.getTimeline()                   get()
                         P
                         R
                         O   getTimeline()                 registre de
                                                 service
                         X                        réel      services
                         Y                                   OSGI
                                        unget()




                                                                         99
Injection de services
Injection programmatique - whiteboard pattern (comme Instance<T>)
@Inject Service<SocialProvider> 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
@Inject Service<SocialProvider> providers;

public List<Post> getTimeline() {
    List<Post> timeline = new ArrayList<Post>();
    for (SocialProvider provider : providers) {
        timeline.addAll(provider.getTimeline());
    }
    Collections.sort(timeline, new Comparator<Post>() {
        public int compare(Post post1, Post post2) {
            return post1.timestamp().compare(post2.timestamp());
        }
    });
    return timeline;
}


                                                                   101
Et si on souhaite un service en
             particuliers ?
@Publish
@Twitter
public class TwitterSocialProvider implements SocialProvider {
    ...
}




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


@Inject @OSGiService 
           @Filter("(twitter=true)") SocialProvider service;




                                                                 103
Et si on souhaite un service en
             particuliers ?
@Publish
@Twitter
public class TwitterSocialProvider implements SocialProvider {
    ...
}


@Inject @Filter("(twitter=true)") 
                   Service<SocialProvider> service;




                                                                 104
Et si on souhaite un service en
             particuliers ?
@Publish
@Twitter
public class TwitterSocialProvider implements SocialProvider {
    ...
}


@Inject @Filter("(twitter=true)") 
                   Service<SocialProvider> service;


@Inject @OSGiService @Twitter SocialProvider service;




                                                                 105
Et si on souhaite un service en
             particuliers ?
@Publish
@Twitter
public class TwitterSocialProvider implements SocialProvider {
    ...
}


@Inject @Filter("(twitter=true)") 
                   Service<SocialProvider> service;


@Inject @Twitter Service<SocialProvider> service;




                                                                 106
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
Des services requis ...
      Bean A
                         Bean B



service validation
 de dépendances
   Weld-OSGi
                       registre de
                     services OSGi

                                     108
Des services requis ...
             Bean A
                               Bean B
enregistrement d’un
   service requis

      service validation
       de dépendances
         Weld-OSGi
                             registre de
                           services OSGi

                                           108
Des services requis ...
                    Bean A
                                      Bean B
       enregistrement d’un
          service requis

             service validation
Extension
   CDI
              de dépendances
                Weld-OSGi
                                    registre de
                                  services OSGi

                                                  108
Des services requis ...
                    Bean A
                                      Bean B
       enregistrement d’un
          service requis

             service validation
Extension
   CDI
              de dépendances                       enregistrements/
                Weld-OSGi                         désenregistrements
                                    registre de       de services
                                  services OSGi

                                                                   108
Des services requis ...
                    Bean A
                                       Bean B
       enregistrement d’un
          service requis

             service validation
Extension
   CDI
              de dépendances      notifications     enregistrements/
                Weld-OSGi                         désenregistrements
                                    registre de       de services
                                  services OSGi

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

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

                                                                              108
Des services requis ...
@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 ...
@Inject @Required @Twitter Service<SocialProvider> twitter;
@Inject @Required @Facebook Service<SocialProvider> 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");
}



                                                                    110
Des services requis ...

                                         let
@Inject @Required @Twitter Service<SocialProvider> twitter;


                                        p
@Inject @Required @Facebook Service<SocialProvider> facebook;




                               o      m
public void start(@Observes Valid evt) {
    System.out.println("Les SocialProviders sont disponibles");


                              c
    twitter.get().getOAuthService().connect();



              e
    facebook.get().getOAuthService().connect();


             l
}




          nd
public void stop(@Observes Invalid evt) {



        u
    twitter.get().getOAuthService().disconnect();



    b
    facebook.get().getOAuthService().disconnect();
    System.out.println("Les SocialProviders sont indisponibles");
}



                                                                    111
Des services requis ...
@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 ...
@Inject @OSGiService @Required Service<SocialProvider> 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");
}




                                                                       113
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
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
Evènements liés aux bundles OSGi
Evènements possibles                                             update
                                                                 refresh
  BundleInstalled                       install

  BundleResolved                              Installed                            Starting
  BundleStarting                                           update          start
                                   resolve                 refresh
  BundleStarted




                       uninstall
                                                                                    Active
                                              Resolved
  BundleStopping                                                                              stop
                                       uninstall
  BundleStopped                                                                    Stopping
                                             Uninstalled
  BundleUninstalled
  BundleUpdated
  BundleUnresolved

                                                                                                     116
Evènements liés aux bundles OSGi


public void bindBundle(@Observes BundleInstalled evt) {}




                                                           117
Evènements liés aux bundles OSGi


public void bindBundle(@Observes @BundleVersion("1.2.3")
                                        BundleInstalled evt) {}




                                                                  118
Evènements liés aux bundles OSGi


public void bindBundle(@Observes
                       @BundleName("org.jboss.seam.social.twitter")
                                               BundleInstalled evt) {}




                                                                         119
Evènements liés aux bundles OSGi


public void bindBundle(@Observes
                       @BundleName("org.jboss.seam.social.twitter")
                       @BundleVersion("1.2.3") BundleInstalled evt) {}




                                                                         120
Evènements liés aux services OSGi
• Available events
 • ServiceArrival
 • ServiceDeparture
 • ServiceChanged



                                    121
Evènements liés aux services OSGi
    Available events
      ServiceArrival
      ServiceDeparture
      ServiceChanged

void bindService(@Observes ServiceArrival evt) {}




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




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




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




                                                                           125
Inter-bundles events
Communication entre les bundles OSGi gérés par Weld-OSGi


                                   Bundle B



                      Weld-OSGi                 Bundle C


     Bundle A
                                                           126
Inter-bundles events
Communication entre les bundles OSGi gérés par Weld-OSGi


                                   Bundle B



                      Weld-OSGi                 Bundle C
            fire()


     Bundle A
                                                           126
Inter-bundles events
Communication entre les bundles OSGi gérés par Weld-OSGi


                                   Bundle B
                    broadcast()
                                    broadcast()
                       Weld-OSGi                  Bundle C
            fire()


     Bundle A
                                                             126
Inter-bundles events

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
Inter-bundles events
@Inject Event<InterBundleEvent> event;
event.fire(new InterBundleEvent(new SynchronizeTimeline()));




                                                               128
Inter-bundles events
                                                   depuis un EJB
@Inject Event<InterBundleEvent> event;              @Schedule
event.fire(new InterBundleEvent(new SynchronizeTimeline()));




                                                                   128
Inter-bundles events
                                                   depuis un EJB
@Inject Event<InterBundleEvent> event;              @Schedule
event.fire(new InterBundleEvent(new SynchronizeTimeline()));




                                                                   129
Inter-bundles events
                                                   depuis un EJB
@Inject Event<InterBundleEvent> event;              @Schedule
event.fire(new InterBundleEvent(new SynchronizeTimeline()));



public void synchronizeTimeline(@Observes InterBundleEvent event) {}




                                                                       130
Inter-bundles events
                                                   depuis un EJB
@Inject Event<InterBundleEvent> event;              @Schedule
event.fire(new InterBundleEvent(new SynchronizeTimeline()));



public void synchronizeTimeline(@Observes @Sent InterBundleEvent event) {}




                                                                             131
Inter-bundles events
                                                   depuis un EJB
@Inject Event<InterBundleEvent> event;              @Schedule
event.fire(new InterBundleEvent(new SynchronizeTimeline()));



public void synchronizeTimeline(@Observes
                                @Specification(SynchronizeTimeline.class)
                                InterBundleEvent event) {}




                                                                            132
Inter-bundles events
                                                   depuis un EJB
@Inject Event<InterBundleEvent> event;              @Schedule
event.fire(new InterBundleEvent(new SynchronizeTimeline()));



public void synchronizeTimeline(@Observes
                                @Specification(SynchronizeTimeline.class)
                                @Sent InterBundleEvent event) {}




                                                                            133
Démo : ‘Modular Socializer’



                              134
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
Informations sur le projet

Code du projet

 https://github.com/mathieuancelin/core/tree/weld-osgi/environments/osgi

Documentation du projet

 http://mathieuancelin.github.com/weld-osgi/


                                                                           136
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
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
Questions



            139

More Related Content

What's hot

JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!bleporini
 
Introduction jdbc
Introduction  jdbcIntroduction  jdbc
Introduction jdbcKarim Amane
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Presentation hibernate nfe103
Presentation hibernate nfe103Presentation hibernate nfe103
Presentation hibernate nfe103MRamo2s
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?PALO IT
 
Jpa Spring Hibernate
Jpa Spring HibernateJpa Spring Hibernate
Jpa Spring Hibernatezaheryamak
 
Objet Direct Formation JPA Hibernate
Objet Direct Formation JPA HibernateObjet Direct Formation JPA Hibernate
Objet Direct Formation JPA Hibernateformationobjetdirect
 
Formation JPA Java persistence API
Formation JPA Java persistence APIFormation JPA Java persistence API
Formation JPA Java persistence APIThibault Cuvillier
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework HibernateInes Ouaz
 
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EEDéveloppement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EESabri Bouchlema
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemeStéphane Traumat
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java IntroductionMouna Torjmen
 
Java 110605092007-phpapp02
Java 110605092007-phpapp02Java 110605092007-phpapp02
Java 110605092007-phpapp02Eric Bourdet
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Environnement java
Environnement javaEnvironnement java
Environnement javaInes Ouaz
 

What's hot (20)

JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!
 
Introduction jdbc
Introduction  jdbcIntroduction  jdbc
Introduction jdbc
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Presentation hibernate nfe103
Presentation hibernate nfe103Presentation hibernate nfe103
Presentation hibernate nfe103
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?
 
Jpa Spring Hibernate
Jpa Spring HibernateJpa Spring Hibernate
Jpa Spring Hibernate
 
Objet Direct Formation JPA Hibernate
Objet Direct Formation JPA HibernateObjet Direct Formation JPA Hibernate
Objet Direct Formation JPA Hibernate
 
J2EE vs .NET
J2EE vs .NETJ2EE vs .NET
J2EE vs .NET
 
Formation JPA Java persistence API
Formation JPA Java persistence APIFormation JPA Java persistence API
Formation JPA Java persistence API
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework Hibernate
 
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EEDéveloppement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EE
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
 
Spring
SpringSpring
Spring
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
 
Support cours j2_ee
Support cours j2_eeSupport cours j2_ee
Support cours j2_ee
 
Java 110605092007-phpapp02
Java 110605092007-phpapp02Java 110605092007-phpapp02
Java 110605092007-phpapp02
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Environnement java
Environnement javaEnvironnement java
Environnement java
 

Viewers also liked

Stateful is beautiful
Stateful is beautifulStateful is beautiful
Stateful is beautifulIppon
 
Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)Ippon
 
JPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesJPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesIppon
 
Présentation du retour d'expérience sur Git
Présentation du retour d'expérience sur GitPrésentation du retour d'expérience sur Git
Présentation du retour d'expérience sur GitIppon
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Ippon
 
Agilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeursAgilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeursIppon
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Hibernate vs le_cloud_computing
Hibernate vs le_cloud_computingHibernate vs le_cloud_computing
Hibernate vs le_cloud_computingIppon
 
Offre 2015 numeriq_ippon
Offre 2015 numeriq_ipponOffre 2015 numeriq_ippon
Offre 2015 numeriq_ipponIppon
 
Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011Ippon
 
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014Ippon
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Ippon
 
Seminaire Portail Open Source
Seminaire Portail Open SourceSeminaire Portail Open Source
Seminaire Portail Open SourceIppon
 
Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Ippon
 
Formation html5 CSS3 offerte par ippon 2014
Formation html5 CSS3 offerte par ippon 2014Formation html5 CSS3 offerte par ippon 2014
Formation html5 CSS3 offerte par ippon 2014Ippon
 
Mule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec IpponMule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec IpponIppon
 
Scrum et forfait
Scrum et forfaitScrum et forfait
Scrum et forfaitIppon
 
Presentation Rex Methodes Agiles
Presentation Rex Methodes AgilesPresentation Rex Methodes Agiles
Presentation Rex Methodes AgilesIppon
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Ippon
 

Viewers also liked (20)

Stateful is beautiful
Stateful is beautifulStateful is beautiful
Stateful is beautiful
 
Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)
 
JPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesJPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à Achilles
 
Présentation du retour d'expérience sur Git
Présentation du retour d'expérience sur GitPrésentation du retour d'expérience sur Git
Présentation du retour d'expérience sur Git
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
 
Agilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeursAgilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeurs
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Hibernate vs le_cloud_computing
Hibernate vs le_cloud_computingHibernate vs le_cloud_computing
Hibernate vs le_cloud_computing
 
Offre 2015 numeriq_ippon
Offre 2015 numeriq_ipponOffre 2015 numeriq_ippon
Offre 2015 numeriq_ippon
 
Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011
 
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0
 
Seminaire Portail Open Source
Seminaire Portail Open SourceSeminaire Portail Open Source
Seminaire Portail Open Source
 
Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014
 
Formation html5 CSS3 offerte par ippon 2014
Formation html5 CSS3 offerte par ippon 2014Formation html5 CSS3 offerte par ippon 2014
Formation html5 CSS3 offerte par ippon 2014
 
Mule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec IpponMule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec Ippon
 
Scrum et forfait
Scrum et forfaitScrum et forfait
Scrum et forfait
 
Presentation Rex Methodes Agiles
Presentation Rex Methodes AgilesPresentation Rex Methodes Agiles
Presentation Rex Methodes Agiles
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 

Similar to CDI par la pratique

Soutenance Stage Licence
Soutenance Stage LicenceSoutenance Stage Licence
Soutenance Stage LicenceMathias Kluba
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystémeAlgeria JUG
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?PALO IT
 
ASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages StandardASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages StandardPatrice Vialor
 
Eclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and AcceleoEclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and Acceleofmadiot
 
Sogeti telosys@md day2011
Sogeti telosys@md day2011Sogeti telosys@md day2011
Sogeti telosys@md day2011MDDAY11
 
Mdday 2011-telosys-v1.0
Mdday 2011-telosys-v1.0Mdday 2011-telosys-v1.0
Mdday 2011-telosys-v1.0telosys
 
Introduction à Hibernate p.1
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1ATHMAN HAJ-HAMOU
 
Annotations pour les Geeks
Annotations pour les GeeksAnnotations pour les Geeks
Annotations pour les Geeksjviet
 

Similar to CDI par la pratique (20)

Soutenance Stage Licence
Soutenance Stage LicenceSoutenance Stage Licence
Soutenance Stage Licence
 
575
575575
575
 
Springioc
SpringiocSpringioc
Springioc
 
Javavs net
Javavs netJavavs net
Javavs net
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Jboss Seam
Jboss SeamJboss Seam
Jboss Seam
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
ASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages StandardASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages Standard
 
Eclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and AcceleoEclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and Acceleo
 
Sogeti telosys@md day2011
Sogeti telosys@md day2011Sogeti telosys@md day2011
Sogeti telosys@md day2011
 
Mdday 2011-telosys-v1.0
Mdday 2011-telosys-v1.0Mdday 2011-telosys-v1.0
Mdday 2011-telosys-v1.0
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
Introduction à Hibernate p.1
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1
 
Annotations pour les Geeks
Annotations pour les GeeksAnnotations pour les Geeks
Annotations pour les Geeks
 
Gradle_ToursJUG
Gradle_ToursJUGGradle_ToursJUG
Gradle_ToursJUG
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
 

More from Ippon

Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016Ippon
 
Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...Ippon
 
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...Ippon
 
Multi criteria queries on a cassandra application
Multi criteria queries on a cassandra applicationMulti criteria queries on a cassandra application
Multi criteria queries on a cassandra applicationIppon
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Ippon
 
Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Ippon
 
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014Ippon
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàIppon
 

More from Ippon (8)

Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016
 
Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...
 
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
 
Multi criteria queries on a cassandra application
Multi criteria queries on a cassandra applicationMulti criteria queries on a cassandra application
Multi criteria queries on a cassandra application
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
 
Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014
 
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
 

CDI par la pratique

  • 1. CDI mis en pratique avec Seam Social et Weld OSGI par Mathieu Ancelin @TrevorReznik et Antoine Sabot-Durand @antoine_sd 1
  • 2. 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
  • 3. 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
  • 4. 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
  • 5. 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
  • 6. 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
  • 8. 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
  • 10. Historique CDI Spring Seam CDI Guice @Inject 9
  • 11. Messaging Application Client Container CDI dans Java EE Web Browser SOA Client Tier JSF 2.0 CDI est une technologie d’intégration qui enrichi aussi bien des POJO que des EJB JAX-WS JAX-RS JMS Servlet 3.0 Web Tier Il a vocation à servir de «glue» entre les différentes parties de la stack Java EE EJB Container Managed Bean (POJO) C’est la première technologie qui permet d’étendre Java EE de manière portable et naturelle Service Tier CDI JTA JPA JAAS JAXB JCA Serveur Java EE 6 10
  • 12. 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
  • 13. 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
  • 14. Jackson @JsonIgnoreProperties(ignoreUnknown = true) @SuppressWarnings("unused") abstract class TwitterProfileMixin { @JsonCreator L’un des frameworks les plus performants pour TwitterProfileMixin(@JsonProperty("id") String id, @JsonProperty("screen_name") String screenName, parser du JSON @JsonProperty("name") String name, @JsonProperty("url") String url, @JsonProperty("profile_image_url") String profileImageUrl, @JsonProperty("description") String description, Jackson permet également de mapper du JSON @JsonProperty("location") String location, @JsonProperty("created_at") @JsonDeserialize(using = sur des classes java TimelineDateDeserializer.class) Date createdDate) { } Pour ça il peut utiliser des annotations JAXB ou @JsonProperty("notifications") ses propres annotations private boolean notificationsEnabled; @JsonProperty("lang") En plus Jackson propose la notion de Mixin qui private String language; permet de déporter les annotations sur une @JsonProperty("statuses_count") private int statusesCount; classe dédiée et de laisser la classe d’origine ... propre. 13
  • 15. Jackson : Utilisation d’un Mixin Pojo PojoMixin Texte 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 Module Un module Jackson est nécessaire pour créer l’association Jackson 14
  • 16. Concepts et technos utilisés par les réseaux sociaux 15
  • 17. La big picture 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
  • 18. 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
  • 19. Le cycle OAuth 1.0a Service tiers (OAuth) Client Serveur de l’application 18
  • 20. Le cycle OAuth 1.0a Service tiers (OAuth) Client 1 Le client demande une ressource sur le service tiers Serveur de l’application 18
  • 21. Le cycle OAuth 1.0a Service tiers (OAuth) Client L’application demande un 1 request Token (relatif à 2 l’application déclarée) au service et envoie une url de callback à associer au token Le client demande une ressource sur le service tiers Serveur de l’application 18
  • 22. Le cycle OAuth 1.0a Service tiers (OAuth) Le service retourne le token Client 3 L’application demande un 1 request Token (relatif à 2 l’application déclarée) au service et envoie une url de callback à associer au token Le client demande une ressource sur le service tiers Serveur de l’application 18
  • 23. Le cycle OAuth 1.0a Service tiers (OAuth) L’application 4 redirige le client sur la page de login Le service retourne le token du service Client 3 L’application demande un 1 request Token (relatif à 2 l’application déclarée) au service et envoie une url de callback à associer au token Le client demande une ressource sur le service tiers Serveur de l’application 18
  • 24. Le cycle OAuth 1.0a Une fois connecté le service Service tiers (OAuth) redirige le client vers l’URL de callback avec un code de vérification L’application 4 redirige le 5 client sur la page de login Le service retourne le token du service Client 3 L’application demande un 1 request Token (relatif à 2 l’application déclarée) au service et envoie une url de callback à associer au token Le client demande une ressource sur le service tiers Serveur de l’application 18
  • 25. Le cycle OAuth 1.0a Une fois connecté le service Service tiers (OAuth) redirige le client vers l’URL de callback avec un code de vérification L’application 4 redirige le 5 client sur la page de login Le service retourne le token du service Client 3 L’application demande un 1 request Token (relatif à 2 l’application déclarée) au 6 service et envoie une url de callback à associer au token Le client demande une ressource sur le A l’aide du code et du Token, le service tiers service demande un Access Token Serveur de l’application 18
  • 26. Le cycle OAuth 1.0a Une fois connecté le service Service tiers (OAuth) redirige le client vers l’URL de callback avec un code de vérification Le service retourne l’access token L’application 4 redirige le 5 client sur la page de login 7 Le service retourne le token du service Client 3 L’application demande un 1 request Token (relatif à 2 l’application déclarée) au 6 service et envoie une url de callback à associer au token Le client demande une ressource sur le A l’aide du code et du Token, le service tiers service demande un Access Token Serveur de l’application 18
  • 27. JSON 1: { 2: "firstName": "John", 3: "lastName" : "Smith", 4: "age" : 25, 5: "address" : 6: { 7: "streetAddress": "21 2nd Street", Javascript Object Notation : format de 8: 9: "city" "state" : "New York", : "NY", structuration de données provenant de 10: "postalCode" : "10021" Javascript et adopté comme standard d’échange 11: }, 12: "phoneNumber": dans la quasi totalités des services en ligne 13: [ 14: { Comparable à XML mais sans XSD 15: "type" : "home", 16: "number": "212 555-1234" Tous les langages disposent de bibliothèques 17: 18: }, { pour exploiter / générer du JSon 19: "type" : "fax", 20: "number": "646 555-4567" 21: } 22: ] 23: } 19
  • 28. Composants principaux de Seam Social 20
  • 29. Objectifs de Seam Social 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
  • 30. «interface» Les classes principales OAuthSession «interface» OAuthService +getRequestToken() +setRequestToken(OAuthToken) +getAccessToken() +getAccessToken() +getAuthorizationUrl() +getVerifier() «interface» +setAccessToken(OAuthToken) +getVerifier() +initAccessToken() SocialNetworkServicesHub +setVerifier(String) +sendSignedRequest(RestVerb, String) +setUserProfile(UserProfile) +sendSignedRequest(RestVerb, String, Map) +getUserProfile() +sendSignedRequest(RestVerb, String, String, Object) +getServiceQualifier() +setVerifier(String) +isConnected() +setAccessToken(String, String) AbstractSocialNetworkService +getName() +setAccessToken(OAuthToken) +sendSignedXmlRequest(RestVerb, String, String) +getSession() +buildUri(String, String, String) +requireAuthorization() +buildUri(String, Map) +sendSignedRequest(OAuthRequest) +getApiRootUrl() +buildUri(String) +buildUri(String, Object) «interface» «interface» SocialNetworkServicesHub OAuthProvider +getMyProfile() +getSession() +getRequestToken() +resetConnection() +getAccessToken(OAuthToken, String) +isConnected() +signRequest(OAuthToken, OAuthRequest) +configureService(OAuthService) +getVersion() +getVerifierParamName() +getAuthorizationUrl(OAuthToken) +requestFactory(RestVerb, String) +tokenFactory(String, String) 22
  • 31. Bootstraping Social @Twitter @ApplicationScoped Grace à une extension CDI incluse dans Solder, on créé 4 beans portant @OAuthApplication(apiKey = "FQzlQC49UhvbMZoxUIvHTQ", apiSecret = "VQ5CZHG4qUoAkUUmckPn4iN4yyjBKcORTW0wnok4r1k", callback = "http://localhost:8080/social-web-client/callback.jsf") @Produces public TwitterServicesHub twitterProducer(TwitterServicesHub service) { le même qualifier et le scope de son return service; } choix lié à celui du producer @Twitter @ApplicationScoped «interface» @Twitter @SessionScoped OAuthService «interface» OAuthSession @Twitter @ApplicationScoped +getAccessToken() «interface» +getAuthorizationUrl() +getRequestToken() OAuthProvider +getVerifier() +setRequestToken(OAuthToken) +initAccessToken() +getAccessToken() +sendSignedRequest(RestVerb, String) +getRequestToken() +setAccessToken(OAuthToken) +sendSignedRequest(RestVerb, String, Map) +getAccessToken(OAuthToken, String) +getVerifier() +sendSignedRequest(RestVerb, String, String, Object) +signRequest(OAuthToken, OAuthRequest) +setVerifier(String) +setVerifier(String) +getVersion() +setUserProfile(UserProfile) +setAccessToken(String, String) +getAuthorizationUrl(OAuthToken) +getUserProfile() +setAccessToken(OAuthToken) +requestFactory(RestVerb, String) +getServiceQualifier() +sendSignedXmlRequest(RestVerb, String, String) +tokenFactory(String, String) +isConnected() +getSession() +getName() +requireAuthorization() +sendSignedRequest(OAuthRequest) 23
  • 32. Etendre Seam Social 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
  • 34. CDI 26
  • 35. 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
  • 36. 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
  • 37. Le Bean En Java EE 6 tout est Managed Bean 29
  • 38. Le Bean Pensez au fichier beans.xml 30
  • 39. 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
  • 41. Injection de dépendance public class HelloService {     public String hello() {         return "Hello World!";     } } 33
  • 42. Injection de dépendance public class MyBean extends Application {     private HelloService service;     @Inject     public MyBean(HelloService service) {         this.service = service;     }     public void displayHello() {         display( service.hello();     } } 34
  • 43. Injection de dépendance public class MyBean extends Application {     private HelloService service;     @Inject     public void setService(HelloService service) {         this.service = service;     }     public void displayHello() {         display( service.hello();     } } 35
  • 44. Injection de dépendance public class MyBean extends Application {     @Inject HelloService service;     public void displayHello() {         display( service.hello();     } } 36
  • 45. 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
  • 46. Les qualifiers 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
  • 47. Les qualifiers @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface French {} @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface English {} 39
  • 48. Les qualifiers @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface French {} @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface English {} 40
  • 49. Les qualifiers @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
  • 50. Les qualifiers @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface Language {     Languages value(); @Nonbinding String description() default "";     public enum Languages {         FRENCH, ENGLISH     } } 42
  • 51. Les qualifiers @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
  • 52. Les qualifiers 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
  • 53. Les qualifiers public class MyBean extends Application {     @Inject @French HelloService service; } @French @Console @Secured public class FrenchHelloService implements HelloService { } 45
  • 54. Les qualifiers public class MyBean extends Application {     @Inject @French @Console HelloService service; } @French @Console @Secured public class FrenchHelloService implements HelloService { } 46
  • 55. Les qualifiers public class MyBean extends Application {     @Inject @French @Console @Secured HelloService service; } @French @Console @Secured public class FrenchHelloService implements HelloService { } 47
  • 56. Les qualifiers public class MyBean extends Application {     @Inject @French @Console @Secured HelloService service; } @French @Secured public class FrenchHelloService implements HelloService { } 48
  • 57. Les qualifiers public class MyBean extends Application {     @Inject @French @Console @Secured HelloService service; } @French @Secured public class FrenchHelloService implements HelloService { } 48
  • 58. Injection programmatique public class MyBean extends Application {     @Inject Instance<HelloService> service;     public void displayHello() {         display( service.get().hello() );     } } 49
  • 59. Injection programmatique public class MyBean extends Application {     @Inject Instance<HelloService> service;     public void displayHello() {         if (!service.isUnsatisfied()) {             display( service.get().hello() );         }     } } 50
  • 60. Injection programmatique public class MyBean extends Application {     @Any @Inject Instance<HelloService> services;     public void displayHello() {         display(             service.select( new AnnotationLiteral()<French> {})                 .get() );     } } 51
  • 61. 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
  • 62. Les contextes @SessionScoped public class CartBean {     public void addItem(Item item) { ...     } } 53
  • 63. Les contextes @ApplicationScoped public class CartBean {     public void addItem(Item item) { ...     } } 54
  • 64. Les contextes @ApplicationScoped ! !! public class CartBean { IL A     public void addItem(Item item) { F ...     } } 54
  • 65. Les contextes @ConversationScoped public class CartBean {     public void addItem(Item item) { ...     } } 55
  • 66. Les contextes @ThreadScoped public class CartBean {     public void addItem(Item item) { ...     } } 56
  • 67. Les contextes @HourScoped public class CartBean {     public void addItem(Item item) { ...     } } 57
  • 68. Les contextes @RandomScoped public class CartBean {     public void addItem(Item item) { ...     } } 58
  • 69. Les décorateurs @Decorator public class HelloDecorator implements HelloService {     @Inject @Delegate HelloService service;     public String hello() {         return service.hello() + "-decorated";     } } @Inject HelloService service; 59
  • 70. Les décorateurs @Decorator public abstract class HelloDecorator implements HelloService {     @Inject @Delegate HelloService service;     public String hello() {         return service.hello() + "-decorated";     } } @Inject HelloService service; 60
  • 71. Les décorateurs <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">   <decorators>     <class>foo.bar.HelloDecorator</class>   </decorators> </beans> 61
  • 72. Les évènements @Inject Event<String> evt; ... evt.fire("Bonjour"); @Inject Event<Post> evt; ... evt.fire( new Post( "Mathieu ANCELIN ", "Bonjour", )); 62
  • 73. Les évènements 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
  • 74. Les évènements @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER}) public @interface English {} 64
  • 75. Les évènements @Inject @English Event<String> evt; ... evt.fire("Hello"); public void receiveEvt(@Observes @English String evt) {     System.out.println("Received : " + evt); } 65
  • 76. CDI en pratique dans Seam Social Visite guidée 66
  • 78. 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
  • 79. Pour comprendre les extensions 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
  • 80. Cycle de vie CDI Deploy Process Process Before Undeploy Application Beans Producers Shutdown Application Process Before Bean Process Application Observer Discovery Injection Taget Running Methods After Scan Process After Bean Deployment Archive Anotated Types Discovery Validation 70
  • 81. Pour Faire une Extension CDI 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
  • 82. Exemple simple : @Veto  <X> void processAnnotatedType(@Observes final ProcessAnnotatedType<X> pat, BeanManager beanManager) {         final AnnotatedType<X> annotatedType = pat.getAnnotatedType();         final Class<X> 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
  • 83. Exemple simple : @Veto  <X> void processAnnotatedType(@Observes final ProcessAnnotatedType<X> pat, BeanManager beanManager) {         final AnnotatedType<X> annotatedType = pat.getAnnotatedType();         final Class<X> 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
  • 85. Et OSGi ? 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
  • 86. Concepts liés à OSGi 75
  • 87. OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Plateforme Java 76
  • 88. OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Module Plateforme Java 76
  • 89. OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Lifecycle Module Plateforme Java 76
  • 90. OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Service Lifecycle Module Plateforme Java 76
  • 91. OSGi Plateforme modulaire et dynamique pour Java Très stable et puissante mais APIs vieillottes ... Bundles Service Lifecycle Module Plateforme Java 76
  • 93. Modules / Bundles manifest manifest 77
  • 94. Modules / Bundles Bundle-SymbolicName: com.sample.app Bundle-SymbolicName: com.foo.bar manifest manifest 77
  • 95. Modules / Bundles Bundle-SymbolicName: com.sample.app Bundle-SymbolicName: com.foo.bar manifest manifest Export-Package: com.sample.app.api; version=1.2.0 77
  • 96. Modules / Bundles Bundle-SymbolicName: com.sample.app Bundle-SymbolicName: com.foo.bar manifest manifest Export-Package: com.sample.app.api; version=1.2.0 Import-Package: com.sample.app.api; version=[1.2.0-2.0.0) 77
  • 97. Modules / Bundles Bundle-SymbolicName: com.sample.app Bundle-SymbolicName: com.foo.bar manifest manifest Export-Package: com.sample.app.api; version=1.2.0 Import-Package: com.sample.app.api; version=[1.2.0-2.0.0) 77
  • 101. Cycle de vie install Installed resolve 78
  • 102. Cycle de vie install Installed resolve Resolved 78
  • 103. Cycle de vie update refresh install Installed update resolve refresh Resolved 78
  • 104. Cycle de vie update refresh install Installed update start resolve refresh Resolved 78
  • 105. Cycle de vie update refresh install Installed Starting update start resolve refresh Active Resolved 78
  • 106. Cycle de vie update refresh install Installed Starting update start resolve refresh Active Resolved stop 78
  • 107. Cycle de vie update refresh install Installed Starting update start resolve refresh Active Resolved stop Stopping 78
  • 108. Cycle de vie update refresh install Installed Starting update start resolve refresh Active Resolved stop uninstall Stopping 78
  • 109. Cycle de vie update refresh install Installed Starting update start resolve refresh Active Resolved stop uninstall Stopping Uninstalled 78
  • 110. Cycle de vie update refresh install Installed Starting update start resolve refresh uninstall Active Resolved stop uninstall Stopping Uninstalled 78
  • 111. Services listener OSGI Bundle A service Bundle B registry 79
  • 112. Services listener register OSGI Bundle A service Bundle B registry 79
  • 113. Services listener register OSGI lookup Bundle A service Bundle B registry 79
  • 114. Services listener register OSGI Bundle A service Bundle B registry 79
  • 115. Services notify listener register OSGI Bundle A service Bundle B registry 79
  • 116. Services notify listener register OSGI lookup Bundle A service Bundle B registry 79
  • 117. Weld-OSGi 80
  • 118. 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
  • 119. 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
  • 120. Mais, comment ça marche ? Plateforme OSGi Plateforme Java 83
  • 121. Mais, comment ça marche ? Weld- OSGi Plateforme OSGi Plateforme Java 83
  • 122. Mais, comment ça marche ? Weld- bundle 1 bundle2 bundle3 OSGi Plateforme OSGi Plateforme Java 83
  • 123. Mais, comment ça marche ? Weld- bundle 1 bundle2 bundle3 OSGi beans .xml Plateforme OSGi Plateforme Java 83
  • 124. Mais, comment ça marche ? Weld- bundle 1 bundle2 bundle3 OSGi beans beans .xml .xml Plateforme OSGi Plateforme Java 83
  • 125. Mais, comment ça marche ? Weld- bundle 1 bundle2 bundle3 OSGi beans beans .xml .xml Plateforme OSGi Plateforme Java 83
  • 126. Mais, comment ça marche ? Weld- bundle 1 bundle2 bundle3 OSGi beans beans .xml .xml Plateforme OSGi Plateforme Java 83
  • 127. Mais, comment ça marche ? Weld- bundle 1 bundle2 bundle3 OSGi beans beans .xml .xml Plateforme OSGi Plateforme Java 83
  • 128. Modulariser ‘Socializer’ Socializer.war seam-social-api seam-social-core Jackson, Scribe, Solder seam-social- twitter seam-social- seam-social- linkedin facebook 84
  • 129. Modulariser ‘Socializer’ seam-social-api seam-social- twitter seam-social-core seam-social- Socializer.war linkedin Jackson, Scribe, Solder seam-social- facebook 85
  • 130. Modulariser ‘Socializer’ module-twitter social-api module-linkedin Socializer.war module-facebook 86
  • 131. Modulariser ‘Socializer’ Registre social-api Socializer.war OSGi 87
  • 132. Modulariser ‘Socializer’ Registre social-api Socializer.war OSGi 87
  • 133. Modulariser ‘Socializer’ module-twitter Registre social-api Socializer.war OSGi 87
  • 134. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi 87
  • 135. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook 87
  • 136. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook Service OSGi 87
  • 137. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook Service OSGi 87
  • 138. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook Service OSGi 87
  • 139. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook Service OSGi 87
  • 140. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook Service OSGi 87
  • 141. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi module-facebook 88
  • 142. Modulariser ‘Socializer’ module-twitter Registre social-api module-linkedin Socializer.war OSGi le O SGi module-facebook B und 88
  • 143. Modulariser ‘Socializer’ module-twitter le O SGi Registre social-api module-linkedin B und Socializer.war OSGi le O SGi module-facebook B und 88
  • 144. Modulariser ‘Socializer’ le O SGi module-twitter B und le O SGi Registre social-api module-linkedin B und Socializer.war OSGi le O SGi module-facebook B und 88
  • 145. Modulariser ‘Socializer’ le O SGi SGi module-twitter B und und le O B le O SGi Registre social-api module-linkedin B und Socializer.war OSGi le O SGi module-facebook B und 88
  • 146. Modulariser ‘Socializer’ le O SGi SGi module-twitter B und EB und le O p pli. W B A le O SGi Registre social-api module-linkedin B und Socializer.war OSGi le O SGi module-facebook B und 88
  • 147. API commune public interface SocialProvider { String getName();     UserProfile getUserProfile();     OAuthService getOAuthService();     List<Post> getTimeline();     void post(Post post); } 89
  • 149. 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
  • 150. 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
  • 151. Publication des SocialProviders • Publication par déclaration @Publish @ApplicationScoped public class TwitterSocialProvider implements SocialProvider {     ... } 93
  • 152. Publication des SocialProviders • Publication par déclaration @Publish @ApplicationScoped public class TwitterSocialProvider implements SocialProvider {     ... } • Publication dynamique @Inject Instance<SocialProvider> instance; @Inject ServiceRegistry registry; SocialProvider service = instance.get(); Registration< SocialProvider > reg = registry.register(service); ... reg.unregister(); 94
  • 153. 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
  • 154. Injection de services Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible 96
  • 155. 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
  • 156. Le rôle de l’extension Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible @Inject @OSGiService MyService service; 98
  • 157. Le rôle de l’extension Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible @Inject @OSGiService InjectionPoint MyService service; 98
  • 158. Le rôle de l’extension Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible create() @Inject @OSGiService MyService service; Provider InjectionPoint 98
  • 159. Le rôle de l’extension Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible P get() create() R @Inject @OSGiService MyService service; O Provider InjectionPoint X Y 98
  • 160. Le rôle de l’extension Injection de service dynamique @Inject @OSGiService SocialProvider provider; provider.getTimeline(); // échoue si aucun service disponible Extension CDI P get() create() R @Inject @OSGiService MyService service; O Provider InjectionPoint X Y 98
  • 161. Le rôle de l’extension provider.getTimeline() P R O registre de X services Y OSGI 99
  • 162. Le rôle de l’extension provider.getTimeline() P R O registre de X services Y OSGI 99
  • 163. Le rôle de l’extension provider.getTimeline() get() P R O registre de X services Y OSGI 99
  • 164. Le rôle de l’extension provider.getTimeline() get() P R O registre de service X réel services Y OSGI 99
  • 165. Le rôle de l’extension provider.getTimeline() get() P R O getTimeline() registre de service X réel services Y OSGI 99
  • 166. Le rôle de l’extension provider.getTimeline() get() P R O getTimeline() registre de service X réel services Y OSGI unget() 99
  • 167. Injection de services Injection programmatique - whiteboard pattern (comme Instance<T>) @Inject Service<SocialProvider> 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
  • 168. Injection de services @Inject Service<SocialProvider> providers; public List<Post> getTimeline() {     List<Post> timeline = new ArrayList<Post>();     for (SocialProvider provider : providers) {     timeline.addAll(provider.getTimeline());     }     Collections.sort(timeline, new Comparator<Post>() {         public int compare(Post post1, Post post2) {             return post1.timestamp().compare(post2.timestamp());         }     });     return timeline; } 101
  • 169. Et si on souhaite un service en particuliers ? @Publish @Twitter public class TwitterSocialProvider implements SocialProvider {     ... } 102
  • 170. Et si on souhaite un service en particuliers ? @Publish @Twitter public class TwitterSocialProvider implements SocialProvider {     ... } @Inject @OSGiService  @Filter("(twitter=true)") SocialProvider service; 103
  • 171. Et si on souhaite un service en particuliers ? @Publish @Twitter public class TwitterSocialProvider implements SocialProvider {     ... } @Inject @Filter("(twitter=true)")  Service<SocialProvider> service; 104
  • 172. Et si on souhaite un service en particuliers ? @Publish @Twitter public class TwitterSocialProvider implements SocialProvider {     ... } @Inject @Filter("(twitter=true)")  Service<SocialProvider> service; @Inject @OSGiService @Twitter SocialProvider service; 105
  • 173. Et si on souhaite un service en particuliers ? @Publish @Twitter public class TwitterSocialProvider implements SocialProvider {     ... } @Inject @Filter("(twitter=true)")  Service<SocialProvider> service; @Inject @Twitter Service<SocialProvider> service; 106
  • 174. 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
  • 175. Des services requis ... Bean A Bean B service validation de dépendances Weld-OSGi registre de services OSGi 108
  • 176. Des services requis ... Bean A Bean B enregistrement d’un service requis service validation de dépendances Weld-OSGi registre de services OSGi 108
  • 177. Des services requis ... Bean A Bean B enregistrement d’un service requis service validation Extension CDI de dépendances Weld-OSGi registre de services OSGi 108
  • 178. Des services requis ... Bean A Bean B enregistrement d’un service requis service validation Extension CDI de dépendances enregistrements/ Weld-OSGi désenregistrements registre de de services services OSGi 108
  • 179. Des services requis ... Bean A Bean B enregistrement d’un service requis service validation Extension CDI de dépendances notifications enregistrements/ Weld-OSGi désenregistrements registre de de services services OSGi 108
  • 180. Des services requis ... Bean A Bean B enregistrement d’un service requis évènements de validation des dépendances service validation Extension CDI de dépendances notifications enregistrements/ Weld-OSGi désenregistrements registre de de services services OSGi 108
  • 181. Des services requis ... Bean A Bean B enregistrement d’un service requis évènements de validation des dépendances service validation Extension CDI de dépendances notifications enregistrements/ Weld-OSGi désenregistrements registre de de services services OSGi 108
  • 182. Des services requis ... @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
  • 183. Des services requis ... @Inject @Required @Twitter Service<SocialProvider> twitter; @Inject @Required @Facebook Service<SocialProvider> 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"); } 110
  • 184. Des services requis ... let @Inject @Required @Twitter Service<SocialProvider> twitter; p @Inject @Required @Facebook Service<SocialProvider> facebook; o m public void start(@Observes Valid evt) {     System.out.println("Les SocialProviders sont disponibles"); c     twitter.get().getOAuthService().connect(); e facebook.get().getOAuthService().connect(); l } nd public void stop(@Observes Invalid evt) { u twitter.get().getOAuthService().disconnect(); b facebook.get().getOAuthService().disconnect();     System.out.println("Les SocialProviders sont indisponibles"); } 111
  • 185. Des services requis ... @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
  • 186. Des services requis ... @Inject @OSGiService @Required Service<SocialProvider> 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"); } 113
  • 187. 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
  • 188. 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
  • 189. Evènements liés aux bundles OSGi Evènements possibles update refresh BundleInstalled install BundleResolved Installed Starting BundleStarting update start resolve refresh BundleStarted uninstall Active Resolved BundleStopping stop uninstall BundleStopped Stopping Uninstalled BundleUninstalled BundleUpdated BundleUnresolved 116
  • 190. Evènements liés aux bundles OSGi public void bindBundle(@Observes BundleInstalled evt) {} 117
  • 191. Evènements liés aux bundles OSGi public void bindBundle(@Observes @BundleVersion("1.2.3") BundleInstalled evt) {} 118
  • 192. Evènements liés aux bundles OSGi public void bindBundle(@Observes @BundleName("org.jboss.seam.social.twitter") BundleInstalled evt) {} 119
  • 193. Evènements liés aux bundles OSGi public void bindBundle(@Observes @BundleName("org.jboss.seam.social.twitter") @BundleVersion("1.2.3") BundleInstalled evt) {} 120
  • 194. Evènements liés aux services OSGi • Available events • ServiceArrival • ServiceDeparture • ServiceChanged 121
  • 195. Evènements liés aux services OSGi Available events ServiceArrival ServiceDeparture ServiceChanged void bindService(@Observes ServiceArrival evt) {} 122
  • 196. Evènements liés aux services OSGi • Available events • ServiceArrival • ServiceDeparture • ServiceChanged void bindService(@Observes @Filter("(twitter=true)") ServiceArrival evt) {} 123
  • 197. Evènements liés aux services OSGi • Available events • ServiceArrival • ServiceDeparture • ServiceChanged void bindService(@Observes @Specification(SocialProvider.class) ServiceArrival evt) {} 124
  • 198. Evènements liés aux services OSGi • Available events • ServiceArrival • ServiceDeparture • ServiceChanged void bindService(@Observes @Specification(SocialProvider.class) @Filter("(twitter=true)") ServiceArrival evt) {} 125
  • 199. Inter-bundles events Communication entre les bundles OSGi gérés par Weld-OSGi Bundle B Weld-OSGi Bundle C Bundle A 126
  • 200. Inter-bundles events Communication entre les bundles OSGi gérés par Weld-OSGi Bundle B Weld-OSGi Bundle C fire() Bundle A 126
  • 201. Inter-bundles events Communication entre les bundles OSGi gérés par Weld-OSGi Bundle B broadcast() broadcast() Weld-OSGi Bundle C fire() Bundle A 126
  • 202. Inter-bundles events 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
  • 203. Inter-bundles events @Inject Event<InterBundleEvent> event; event.fire(new InterBundleEvent(new SynchronizeTimeline())); 128
  • 204. Inter-bundles events depuis un EJB @Inject Event<InterBundleEvent> event; @Schedule event.fire(new InterBundleEvent(new SynchronizeTimeline())); 128
  • 205. Inter-bundles events depuis un EJB @Inject Event<InterBundleEvent> event; @Schedule event.fire(new InterBundleEvent(new SynchronizeTimeline())); 129
  • 206. Inter-bundles events depuis un EJB @Inject Event<InterBundleEvent> event; @Schedule event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes InterBundleEvent event) {} 130
  • 207. Inter-bundles events depuis un EJB @Inject Event<InterBundleEvent> event; @Schedule event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes @Sent InterBundleEvent event) {} 131
  • 208. Inter-bundles events depuis un EJB @Inject Event<InterBundleEvent> event; @Schedule event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes @Specification(SynchronizeTimeline.class) InterBundleEvent event) {} 132
  • 209. Inter-bundles events depuis un EJB @Inject Event<InterBundleEvent> event; @Schedule event.fire(new InterBundleEvent(new SynchronizeTimeline())); public void synchronizeTimeline(@Observes @Specification(SynchronizeTimeline.class) @Sent InterBundleEvent event) {} 133
  • 210. Démo : ‘Modular Socializer’ 134
  • 211. 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
  • 212. Informations sur le projet Code du projet https://github.com/mathieuancelin/core/tree/weld-osgi/environments/osgi Documentation du projet http://mathieuancelin.github.com/weld-osgi/ 136
  • 213. 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
  • 214. 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
  • 215. Questions 139

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  22. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  23. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  24. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  25. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  26. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  27. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  28. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  29. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  30. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  31. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  32. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  33. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  34. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  35. Rappeler que Seam 3 != Seam 2 et que c&amp;#x2019;&amp;#xE9;tait une erreur de garder le nom de Seam\n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  90. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  91. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  92. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  93. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  94. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  95. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  96. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  97. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  98. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  99. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  100. les encodages sont fait en UTF-8 et percent encoding\nL&amp;#x2019;algorithme de signature est HMAC-SHA1\n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. \n
  160. \n
  161. \n
  162. \n
  163. \n
  164. \n
  165. on doit &amp;#xEA;tre &amp;#xE0; 1h40 max\n
  166. \n
  167. \n
  168. \n
  169. \n
  170. \n
  171. \n
  172. \n
  173. Il doit nous rester une heure ici !!!\n
  174. \n
  175. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  176. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  177. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  178. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  179. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  180. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  181. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  182. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  183. Modulaire va arriver avec le JDK8, il va falloir s&amp;#x2019;y habituer\n
  184. \n
  185. \n
  186. \n
  187. \n
  188. \n
  189. \n
  190. \n
  191. \n
  192. \n
  193. \n
  194. \n
  195. \n
  196. \n
  197. \n
  198. \n
  199. \n
  200. \n
  201. \n
  202. \n
  203. \n
  204. \n
  205. \n
  206. \n
  207. \n
  208. \n
  209. \n
  210. \n
  211. \n
  212. \n
  213. \n
  214. \n
  215. \n
  216. \n
  217. \n
  218. \n
  219. \n
  220. \n
  221. \n
  222. \n
  223. \n
  224. \n
  225. \n
  226. \n
  227. \n
  228. \n
  229. \n
  230. \n
  231. \n
  232. \n
  233. \n
  234. \n
  235. \n
  236. \n
  237. \n
  238. \n
  239. \n
  240. \n
  241. \n
  242. \n
  243. \n
  244. \n
  245. \n
  246. \n
  247. \n
  248. \n
  249. \n
  250. \n
  251. \n
  252. \n
  253. \n
  254. \n
  255. \n
  256. \n
  257. \n
  258. \n
  259. \n
  260. \n
  261. \n
  262. \n
  263. \n
  264. \n
  265. \n
  266. \n
  267. \n
  268. \n
  269. \n
  270. \n
  271. \n
  272. \n
  273. \n
  274. \n
  275. \n
  276. \n
  277. \n
  278. \n
  279. \n
  280. \n
  281. \n
  282. \n
  283. \n
  284. \n
  285. \n
  286. \n
  287. \n
  288. \n
  289. \n
  290. \n
  291. \n
  292. \n
  293. \n
  294. \n
  295. \n
  296. \n
  297. \n
  298. \n
  299. \n
  300. \n
  301. \n
  302. \n
  303. \n
  304. \n
  305. \n
  306. \n
  307. \n
  308. \n
  309. \n
  310. \n
  311. \n
  312. \n
  313. \n
  314. \n
  315. \n
  316. \n
  317. \n
  318. \n
  319. \n
  320. \n
  321. \n
  322. \n
  323. \n
  324. \n
  325. \n
  326. \n
  327. \n
  328. \n
  329. \n
  330. \n
  331. \n
  332. \n
  333. \n
  334. \n
  335. \n
  336. \n
  337. \n
  338. \n
  339. \n
  340. \n
  341. \n
  342. \n
  343. \n
  344. \n
  345. \n
  346. \n
  347. \n
  348. \n
  349. \n
  350. \n
  351. \n
  352. \n
  353. \n
  354. \n
  355. \n
  356. \n
  357. \n
  358. \n
  359. \n
  360. \n
  361. \n
  362. \n
  363. \n
  364. \n
  365. \n
  366. \n
  367. \n
  368. \n
  369. \n
  370. \n
  371. \n
  372. \n
  373. \n
  374. \n
  375. \n
  376. \n
  377. \n
  378. \n
  379. \n
  380. \n
  381. \n
  382. \n
  383. \n
  384. \n
  385. \n
  386. \n