<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le Touilleur Express &#187; portlet</title>
	<atom:link href="http://www.touilleur-express.fr/tag/portlet/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touilleur-express.fr</link>
	<description>Blog sur Java, le métier de développeur et la vie de freelance par Nicolas Martignole</description>
	<lastBuildDate>Wed, 08 Feb 2012 11:54:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>GateIn: gestion des Préférences et communication entre Portlets (article 3)</title>
		<link>http://www.touilleur-express.fr/2009/11/27/gatein-gestion-des-preferences-et-communication-entre-portlets-article-3/</link>
		<comments>http://www.touilleur-express.fr/2009/11/27/gatein-gestion-des-preferences-et-communication-entre-portlets-article-3/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 23:58:33 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[gatein]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=2427</guid>
		<description><![CDATA[Suite de notre série consacrée à GateIn et aux Portails. Aujourd&#8217;hui au menu, dernier article de la partie purement Portlet. Nous allons voir comment gérer les préférences d&#8217;une Portlet, puis comment envoyer un message pour que d&#8217;autres Portlets soient notifiées.
Installation
Comme dans l&#8217;article précédent, je vous ai préparé un projet maven avec le code et l&#8217;ensemble compilé si vous voulez tester rapidement. Télécharger le fichier portlet_article03.zip et décompressez-le dans un répertoire différent. Vous pouvez ensuite soit lancer le projet IDEA IntelliJ, soit le project Eclipse (mvn eclipse:eclipse).
Le fichier war doit être ...]]></description>
			<content:encoded><![CDATA[<p>Suite de notre série consacrée à GateIn et aux Portails. Aujourd&#8217;hui au menu, dernier article de la partie purement Portlet. Nous allons voir comment gérer les préférences d&#8217;une Portlet, puis comment envoyer un message pour que d&#8217;autres Portlets soient notifiées.</p>
<p><strong>Installation</strong><br />
Comme dans l&#8217;article précédent, je vous ai préparé un projet maven avec le code et l&#8217;ensemble compilé si vous voulez tester rapidement. Télécharger le fichier <a href="http://www.touilleur-express.fr/code/portlet/portlet_article03.zip">portlet_article03.zip</a> et décompressez-le dans un répertoire différent. Vous pouvez ensuite soit lancer le projet IDEA IntelliJ, soit le project Eclipse (mvn eclipse:eclipse).</p>
<p>Le fichier war doit être recopié dans le répertoire webapps de votre installation de GateIn. Vous devez avoir lu <a href="http://www.touilleur-express.fr/2009/11/15/gatein-premiers-pas/">le premier article</a> pour savoir comment ajouter une Portlet à GateIn la première fois. Pour le reste, c&#8217;est assez simple.</p>
<p><strong>Les Préférences des Portlets</strong><br />
Voici ce que nous allons faire:  nous allons déclarer une propriété de configuration afin que le nom du compte Twitter soit configurable. Lorsque la Portlet sera en mode EDIT, vous pourrez configurer le nom du compte Twitter à afficher. Enfin le mode configuration de GateIn vous montrera aussi votre propriété.</p>
<p>La spécification des Portlets vous donne un objet <a href="http://www.bluesunrise.com/portlet-api/javax/portlet/PortletPreferences.html">PortletPreferences</a> afin de stocker les paramètres de configuration de la Portlet. Par exemple l&#8217;adresse d&#8217;un serveur REST distant pour récupérer une liste de médicament (au hasard).  Les propriétés d&#8217;une Portlet sont spécifiques à chaque utilisateur. Par ailleurs, elles sont sauvegardées lorsque vous arrêtez le serveur. Nous verrons cela tout à l&#8217;heure.</p>
<p><strong>Comment utiliser une propriété d&#8217;une Portlet</strong><br />
Nous allons tout d&#8217;abord regarder ce que j&#8217;ai déclaré dans le fichier portlet.xml. La balise portlet-preferences permet de déclarer des couples clés/valeurs, comme un fichier de propriétés. J&#8217;ajoute ici une nouvelle propriété &laquo;&nbsp;defaultScreenName&nbsp;&raquo;</p>
<pre name="code" class="xml">
&lt;portlet&gt;
       &lt;description&gt;Twitter Portlet sample 02, this portlet demonstrates how to set and display
           a public portlet render parameter.
       &lt;/description&gt;
       &lt;portlet-name&gt;TwitterPortlet02&lt;/portlet-name&gt;
       &lt;portlet-class&gt;org.letouilleur.portlet.TwitterPortlet02&lt;/portlet-class&gt;
       &lt;supports&gt;
           &lt;mime-type&gt;text/html&lt;/mime-type&gt;
           &lt;portlet-mode&gt;view&lt;/portlet-mode&gt;
           &lt;portlet-mode&gt;edit&lt;/portlet-mode&gt;
       &lt;/supports&gt;
       &lt;portlet-info&gt;
           &lt;title&gt;Twitter Portlet 02&lt;/title&gt;
           &lt;keywords&gt;demo&lt;/keywords&gt;
       &lt;/portlet-info&gt;
       &lt;portlet-preferences&gt;
           &lt;preference&gt;
               &lt;name&gt;defaultScreenName&lt;/name&gt;
               &lt;value&gt;Letouilleur&lt;/value&gt;
           &lt;/preference&gt;
       &lt;/portlet-preferences&gt;

   &lt;/portlet&gt;
</pre>
<p>Cette propriété sera configurée à &laquo;&nbsp;Letouilleur&nbsp;&raquo; pour les utilisateurs n&#8217;ayant pas encore personnalisé la valeur.</p>
<p>Regardez maintenant le fichier viewPortlet02.jsp. Cette page est la page du mode VIEW de la portlet TwitterPortlet02. Elle affichera le nom du compte. Voici comment je récupère les préférences afin d&#8217;afficher le nom du compte Twitter:</p>
<pre name="code" class="java">
&lt;%
       String tweeterAccount=renderRequest.getPreferences().getValue("defaultScreenName", "Anonymous");
%&gt;

   &lt;h4&gt;Latest Twitter statuses from &lt;font color="blue"&gt;&lt;%=tweeterAccount%&gt;&lt;/font&gt;&lt;/h4&gt;
</pre>
<p><strong>Comment modifier la propriété ?</strong><br />
La portlet TwitterPortlet02 est déclarée avec 2 états dans le fichier portlet.xml : EDIT et VIEW. Lorsqu&#8217;elle bascule en mode EDIT, il est possible de changer le nom du compte Twitter.</p>
<p>Voici la vue de la Portlet en mode VIEW :<br />
<img src="http://www.touilleur-express.fr/wp-content/article03_view.jpg" alt="article03_view" title="article03_view" width="487" height="322" class="alignnone size-full wp-image-2428" /></p>
<p>Voici la Portlet en mode EDIT :<br />
<img src="http://www.touilleur-express.fr/wp-content/article03_edit.jpg" alt="article03_edit" title="article03_edit" width="517" height="280" class="alignnone size-full wp-image-2431" /></p>
<p>Que se passe-t-il lorsque l&#8217;on clique sur le bouton &laquo;&nbsp;Soumettre&nbsp;&raquo; ? Comme vu dans l&#8217;article précédent, cela déclenche la phase Action de la Portlet. Dans la class TwitterPortlet02, regardez le code de la méthode processAction:</p>
<pre name="code" class="java">
@Override
public void processAction(ActionRequest request, ActionResponse response)
						throws PortletException, IOException {

   if (request.getPortletMode().equals(PortletMode.EDIT)) {
            sendActionEvent(request, response);
   }

   // ....

}

//....

private void sendActionEvent(ActionRequest request, ActionResponse response)
							throws PortletModeException, ReadOnlyException,
								   IOException, ValidatorException {
	// Recupere le parametre envoye par le formulaire HTML
	String screenName = request.getParameter("screenName");

	// Change la valeur de la preference
	PortletPreferences prefs=request.getPreferences();
	prefs.setValue("defaultScreenName",screenName);
	prefs.store();

    // ...

	// back to view mode
	response.setPortletMode(PortletMode.VIEW);
 }
</pre>
<p>Il est important de bien penser à appeler la méthode store() afin que la nouvelle valeur de la propriété soit stockée par le Portail. Est-ce que vous vous rendez compte que c&#8217;est le Portail qui va stocker cette nouvelle valeur ? Si vous n&#8217;êtes pas convaincu, arrêter et relancez GateIn, reconnectez-vous avec le même utilisateur, vous verrez que la valeur a été persisté par GateIn.</p>
<p>Il y a quelques détails à connaître : tout d&#8217;abord le contenu du PortletPreferences ne peut être modifié que dans la méthode processAction(). Il y a aussi une méthode reset() que vous pouvez appeler pour remettre les préférences à un état stable avant vos changements. Pratique lorsqu&#8217;une exception survient.</p>
<p>Il est temps maintenant d&#8217;informer les autres Portlets que vous venez de changer le nom du compte Twitter.</p>
<p><strong>Envoyer un événement JSR-286 avec une Portlet</strong><br />
Voici ce que je veux faire : lorsque l&#8217;utilisateur change le nom du compte Twitter, j&#8217;aimerai que ma Portlet envoie aux autres Portlets la valeur de ce compte. Imaginons une autre Portlet qui par exemple recherche sur des flux RSS en se basant sur le nom d&#8217;un compte Twitter, ou d&#8217;un tag (comme #devoxx).</p>
<p>Pour envoyer un événement, il faut tout d&#8217;abord le déclarer dans le fichier portlet.xml</p>
<pre name="code" class="xml">
(fichier portlet.xml)

&lt;event-definition&gt;
    &lt;name&gt;myEvent&lt;/name&gt;
    &lt;value-type&gt;java.lang.String&lt;/value-type&gt;
&lt;/event-definition&gt;
</pre>
<p>Pour que le Portail surveille notre Portlet TwitterPortlet02, il convient maintenant de dire que cette Portlet peut émettre cet événement. Dans la balise portlet, j&#8217;ajoute à la fin un tag &laquo;&nbsp;supported-publishing-event&nbsp;&raquo;</p>
<pre name="code" class="xml">

&lt;portlet&gt;
    &lt;description&gt;Twitter Portlet sample 02, this portlet demonstrates how to set and display
        a public portlet render parameter.
    &lt;/description&gt;
    &lt;portlet-name&gt;TwitterPortlet02&lt;/portlet-name&gt;
    &lt;portlet-class&gt;org.letouilleur.portlet.TwitterPortlet02&lt;/portlet-class&gt;
    &lt;supports&gt;
        &lt;mime-type&gt;text/html&lt;/mime-type&gt;
        &lt;portlet-mode&gt;view&lt;/portlet-mode&gt;
        &lt;portlet-mode&gt;edit&lt;/portlet-mode&gt;
    &lt;/supports&gt;
    &lt;portlet-info&gt;
        &lt;title&gt;Twitter Portlet 02&lt;/title&gt;
        &lt;keywords&gt;demo&lt;/keywords&gt;
    &lt;/portlet-info&gt;
    &lt;portlet-preferences&gt;
        &lt;preference&gt;
            &lt;name&gt;defaultScreenName&lt;/name&gt;
            &lt;value&gt;Letouilleur&lt;/value&gt;
        &lt;/preference&gt;
    &lt;/portlet-preferences&gt;

    &lt;supported-publishing-event&gt;
        &lt;name&gt;myEvent&lt;/name&gt;
    &lt;/supported-publishing-event&gt;

&lt;/portlet&gt;
</pre>
<p>Enfin, nous voulons que la portlet TwitterPortlet01 écoute cet événement. Pour cela, voici la définition de la portlet TwitterPortlet01. Nous ajoutons un tag &laquo;&nbsp;supported-processing-event&nbsp;&raquo; avec le nom du tag.</p>
<pre name="code" class="xml">

&lt;portlet&gt;
    &lt;description&gt;Twitter Portlet sample 01, this portlet demonstrates the processAction method.&lt;/description&gt;
    &lt;portlet-name&gt;TwitterPortlet01&lt;/portlet-name&gt;
    &lt;portlet-class&gt;org.letouilleur.portlet.TwitterPortlet01&lt;/portlet-class&gt;
    &lt;expiration-cache&gt;0&lt;/expiration-cache&gt;
    &lt;supports&gt;
        &lt;mime-type&gt;text/html&lt;/mime-type&gt;
        &lt;portlet-mode&gt;view&lt;/portlet-mode&gt;
    &lt;/supports&gt;
    &lt;supported-locale&gt;fr&lt;/supported-locale&gt;
    &lt;supported-locale&gt;en&lt;/supported-locale&gt;

    &lt;portlet-info&gt;
        &lt;title&gt;Twitter Portlet 01&lt;/title&gt;
        &lt;keywords&gt;demo&lt;/keywords&gt;
    &lt;/portlet-info&gt;

    &lt;supported-processing-event&gt;
        &lt;name&gt;myEvent&lt;/name&gt;
    &lt;/supported-processing-event&gt;

&lt;/portlet&gt;
</pre>
<p>A savoir : si les 2 portlets sont distribuées dans 2 WAR différents, il faut déclarer un element QName afin de qualifier le domaine de l&#8217;élément. Par ailleurs l&#8217;ordre des tags dans le fichier portlet.xml est déterminant pour GateIn. Si vous souhaitez déclarer qu&#8217;une portlet est capable d&#8217;émettre comme de recevoir un événement, attention à l&#8217;ordre de déclaration dans le fichier portal.xml.</p>
<pre name="code" class="xml">
     &lt;supported-publishing-event&gt;
         &lt;name&gt;myEvent&lt;/name&gt;
     &lt;/supported-publishing-event&gt;

     &lt;supported-processing-event&gt;
         &lt;name&gt;anotherEvent&lt;/name&gt;
     &lt;/supported-processing-event&gt;

     &lt;supported-processing-event&gt;
         &lt;name&gt;andYetAnotherEvent&lt;/name&gt;
     &lt;/supported-processing-event&gt;
</pre>
<p><strong>Envoyer un événement</strong><br />
L&#8217;envoi est très simple. Dans la phase d&#8217;Action d&#8217;une Portlet, il suffit d&#8217;appeler la méthode setEvent sur l&#8217;object ActionResponse. Regardez le code de la méthode sendActionEvent de TwitterPortlet02, voici comment la valeur du nouveau compte Twitter est envoyé au Portail</p>
<pre name="code" class="java">

        // Send an event
        response.setEvent("myEvent", screenName);
</pre>
<p><strong>Recevoir un événement</strong><br />
La réception de l&#8217;événement par la Portlet TwitterPortlet01 est effectué dans la méthode processEvent, héritée de GenericPortlet. La nouvelle valeur du compte Twitter est lue puis stockée comme nouvelle valeur de <em>myPublicScreenName</em>.</p>
<pre name="code" class="java">
 /**
     * This callback method is triggered when a "myEvent" JSR-286 event
     * is sent to the Portal.
     */
    @Override
    public void processEvent(EventRequest request, EventResponse response) {
        Event event = request.getEvent();
        if (event.getName().equals("myEvent")) {
            String payload = (String) event.getValue();
            //process payload here
            System.out.println("------------------------------------------------------");
            System.out.println(getClass().getName() + " received an event: " + payload);
            System.out.println("------------------------------------------------------");

            // Update the property, the Portal will then call the doView
            // to redisplay the page
            myPublicScreenName=payload;

        }
    }
</pre>
<p> Après l&#8217;appel de la phase Action de cette Portlet, le portail appelle ensuite automatiquement une phase Render, ce qui pour a effet d&#8217;appeler la méthode doView de TwitterPortlet01. Je stocke alors la nouvelle valeur dans la session de la Portlet, c&#8217;est tout.</p>
<pre name="code" class="java">
    public void doView(RenderRequest request, RenderResponse response)
            throws PortletException, IOException {

        if (WindowState.MINIMIZED.equals(request.getWindowState())) {
            return;
        }

        // Set the last value of myPublicScreenName
        request.getPortletSession().setAttribute("myPublicScreenName",myPublicScreenName);

        if (WindowState.NORMAL.equals(request.getWindowState())) {
            normalView.include(request, response);
        } else {
            maximizedView.include(request, response);
        }

    }
</pre>
<p>Enfin pour terminer, l&#8217;affichage de la nouvelle valeur s&#8217;effectue dans la page &laquo;&nbsp;normal.jsp&nbsp;&raquo; à la fin de la page:</p>
<pre>

    &lt;% String publicParam =(String)portletSession.getAttribute("myPublicScreenName");%&gt;
  &lt;% if (publicParam != null &#038;&#038; !publicParam.equals("")) { %&gt;
      The other Portlet is configured to display &lt;strong&gt;&lt;%=publicParam%&gt;&lt;/strong&gt;
  &lt;% } %&gt;
</pre>
<p><strong>Le résultat final</strong><br />
Voici une suite de captures d&#8217;écran, afin de vous montrer le résultat :</p>
<p>Etape 1:<br />
<img src="http://www.touilleur-express.fr/wp-content/article03_portlet_step01.jpg" alt="article03_portlet_step01" title="article03_portlet_step01" width="550" height="279" class="alignnone size-full wp-image-2436" /></p>
<p>Etape 2:<br />
<img src="http://www.touilleur-express.fr/wp-content/article03_portlet_step02.jpg" alt="article03_portlet_step02" title="article03_portlet_step02" width="500" height="213" class="alignnone size-full wp-image-2437" /></p>
<p>Etape 3:<br />
<img src="http://www.touilleur-express.fr/wp-content/article03_portlet_step03.jpg" alt="article03_portlet_step03" title="article03_portlet_step03" width="550" height="226" class="alignnone size-full wp-image-2438" /></p>
<p><strong>Conclusion</strong><br />
Dans ce troisième article nous avons vu comment lire et éditer les préférences d&#8217;une Portlet. Nous avons ensuite vu comment créer un message, l&#8217;envoyer et enfin le consommer dans une autre Portlet. Les prochains articles seront moins bas niveaux que celui-ci mais j&#8217;ai pensé qu&#8217;il serait intéressant de vous montrer les bases des Portlets 2.0</p>
<p>Voir aussi les 2 anciens articles:<br />
- <a href="http://www.touilleur-express.fr/2009/11/15/gatein-premiers-pas/">Premiers pas avec GateIn</a>, comment installer une Portlet<br />
- <a href="http://www.touilleur-express.fr/2009/11/21/gatein-decouverte-dune-portlet-simple-article-2/">GateIn, découverte d&#8217;une Portlet simple</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/11/27/gatein-gestion-des-preferences-et-communication-entre-portlets-article-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GateIn : découverte d&#039;une Portlet simple (article 2)</title>
		<link>http://www.touilleur-express.fr/2009/11/21/gatein-decouverte-dune-portlet-simple-article-2/</link>
		<comments>http://www.touilleur-express.fr/2009/11/21/gatein-decouverte-dune-portlet-simple-article-2/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 22:53:09 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[gatein]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=2309</guid>
		<description><![CDATA[Suite de la série d&#8217;articles consacrée à GateIn et aux Portlets (voir article 1). Au menu aujourd&#8217;hui, une portlet simple capable d&#8217;afficher une liste de messages. L&#8217;objectif de cet article est de parler un peu plus du côté Java des Portlets 2.0, avant de revenir à GateIn plus tard.
Une Portlet comme vous allez vous en rendre compte, n&#8217;a rien de très visuel. Lorsque l&#8217;on pense Portlet au départ, on imagine une petite fenêtre dans une page web, avec des boutons maximiser/réduire/configurer. Or c&#8217;est le portail qui donne cet habillage, pas ...]]></description>
			<content:encoded><![CDATA[<p>Suite de la série d&#8217;articles consacrée à GateIn et aux Portlets (<a href="http://www.touilleur-express.fr/2009/11/15/gatein-premiers-pas/">voir article 1</a>). Au menu aujourd&#8217;hui, une portlet simple capable d&#8217;afficher une liste de messages. L&#8217;objectif de cet article est de parler un peu plus du côté Java des Portlets 2.0, avant de revenir à GateIn plus tard.</p>
<p>Une Portlet comme vous allez vous en rendre compte, n&#8217;a rien de très visuel. Lorsque l&#8217;on pense Portlet au départ, on imagine une petite fenêtre dans une page web, avec des boutons maximiser/réduire/configurer. Or c&#8217;est le portail qui donne cet habillage, pas la spécification des Portlets en elle-même.</p>
<p>Nous allons utiliser encore ici ce qu&#8217;il y a de plus simple, à savoir des pages JSP sans outils supplémentaires. Nous verrons dans quelques articles comment écrire une Portlet avec JSF 1.2 et comment utiliser <a href="http://www.jsfcentral.com/listings/A22175">le bridge JSF 2.0</a> de GateIn.</p>
<p>Une portlet c&#8217;est avant tout une application web java avec un fichier web.xml. Liferay 5.2 part d&#8217;un fichier web.xml, et le décore lors du déploiement dans le conteneur d&#8217;application. Cela peut sembler séduisant au premier abord : un fichier web.xml vide complètement anonyme par rapport au portail. Mais il n&#8217;y a pas de magie, Liferay se contente de réécrire sa version du fichier web.xml dans le répertoire webapps du conteneur Tomcat.</p>
<p>Concernant GateIn, notre fichier web.xml déclare un PortletApplicationListener et un ServletWrapper. Le fichier web.xml d&#8217;une portlet sera différent pour chaque portail : Apache Pluto, Jahia, Liferay et donc GateIn. C&#8217;est une des limites de la portabilité des portlets. Peut-être que la solution du fichier web.xml vide pour Liferay est la voie à suivre, je ne sais pas.</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                         "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;
&lt;web-app&gt;
	&lt;display-name&gt;texpress-portlet&lt;/display-name&gt;

	&lt;listener&gt;
		&lt;listener-class&gt;org.exoplatform.services.portletcontainer.impl.servlet.PortletApplicationListener&lt;/listener-class&gt;
	&lt;/listener&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;PortletWrapper&lt;/servlet-name&gt;
		&lt;servlet-class&gt;org.exoplatform.services.portletcontainer.impl.servlet.ServletWrapper&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;PortletWrapper&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/PortletWrapper&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;PortletWrapper&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/PortletWrapper/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<p>Voyons maintenant ce qui est vraiment du domaine des Portlets, le fichier portlet.xml. Placé dans le répertoire WEB-INF, ce fichier permet de déclarer la liste des Portlets contenues dans l&#8217;archive. Pour notre exemple nous allons pour l&#8217;instant déclarer qu&#8217;une seule portlet Java :</p>
<pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="1.0"&gt;

	&lt;portlet&gt;
		&lt;description xml:lang="EN"&gt;Twitter Portlet sample 01, this portlet demonstrates the processAction method&lt;/description&gt;
		&lt;portlet-name&gt;TwitterPortlet01&lt;/portlet-name&gt;
		&lt;portlet-class&gt;org.letouilleur.portlet.TwitterPortlet01&lt;/portlet-class&gt;
		&lt;supports&gt;
			&lt;mime-type&gt;text/html&lt;/mime-type&gt;
			&lt;portlet-mode&gt;view&lt;/portlet-mode&gt;
		&lt;/supports&gt;
		&lt;portlet-info&gt;
			&lt;title&gt;Twitter Portlet 01&lt;/title&gt;
			&lt;keywords&gt;demo&lt;/keywords&gt;
		&lt;/portlet-info&gt;
	&lt;/portlet&gt;

&lt;/portlet-app&gt;
</pre>
<p><strong>La portlet TwitterPortlet01</strong><br />
J&#8217;aimerai écrire une Portlet capable d&#8217;afficher les 10 derniers tweets de mon compte Twitter. A terme je veux pouvoir configurer le nom de la personne que je regarde, et je veux aussi pouvoir informer d&#8217;autres Portlets lorsque je change le nom du compte Twitter. Dans un premier temps nous allons simplement compiler et déployer notre Portlet sur GateIn. Si vous ne l&#8217;avez pas encore lu, <a href="http://www.touilleur-express.fr/2009/11/15/gatein-premiers-pas/">lisez mon article précédent</a> sur GateIn afin d&#8217;apprendre à déployer une Portlet sur GateIn.</p>
<p>Je vous ai préparé un petit projet maven avec une portlet toute simple pour cet article. Téléchargez le fichier zip <a href="http://www.touilleur-express.fr/code/portlet/portlet_article01_gatein.zip">ici</a> et décompressez-le dans un répertoire.</p>
<p>Compilez le projet avec Maven 2.2.1, et Java 6. Et enfin recopiez le fichier WAR vers le répertoire webapps de GateIn. Après avoir ajouté la Portlet dans une nouvelle page, voici ce que vous devez obtenir à l&#8217;écran :<br />
<img src="http://www.touilleur-express.fr/wp-content/gatein_portlet01.jpg" alt="gatein_portlet01" title="gatein_portlet01" width="600" height="183" class="alignnone size-full wp-image-2311" /></p>
<p>Pour ajouter la portlet, relisez <a href="http://www.touilleur-express.fr/2009/11/15/gatein-premiers-pas/">l&#8217;article de la semaine dernière</a></p>
<p>Notre portlet a un bouton Submit qui va récupérer mes derniers messages sur Twitter. Pour l&#8217;instant, nous allons simuler cette étape, et simplement afficher une liste envoyée par la Portlet. Ouvrez le code Java de la class TwitterPortlet01 et regardons ensemble la fin du fichier.</p>
<pre name="code" class="java">
  @Override
    public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException {
        java.util.List&lt;String&gt; tweets = new ArrayList&lt;String&gt;();
        tweets.add("Premier Tweet");
        tweets.add("Deuxième Tweet");
        tweets.add("Troisième Tweet");

        request.getPortletSession().setAttribute("tweets", tweets);

    }
</pre>
<p>Là où une Servlet dispose d&#8217;une méthode doGet ou doPost, une Portlet s&#8217;abstrait du protocole et déclare 2 phases. Une phase de rendu et une phase d&#8217;action. La phase de rendu correspond simplement à un affichage de la portlet. La phase d&#8217;action est activée lorsque vous envoyez un formulaire par exemple à partir de la partie Web de l&#8217;application. Enfine une phase de rendu est toujours lancé après une phase d&#8217;action. Dans notre cas, la méthode doView est appelé lors de la phase &laquo;&nbsp;Render&nbsp;&raquo;. Ensuite lorsque vous cliquez sur &laquo;&nbsp;Get tweets&nbsp;&raquo;, la phase &laquo;&nbsp;Action&nbsp;&raquo; est déclenchée et nous passerons dans la méthode processAction. Celle-ci place dans la session de la portlet une liste de String, et la phase de &laquo;&nbsp;Render&nbsp;&raquo; est appelée, ce qui provoque l&#8217;affichage de la liste dans le fichier normal.jsp. Nous verrons plus loin comment déclarer des attributs de rendus publics, et comment aussi envoyer des événements entre Portlet. Pour l&#8217;instant, tout ce que nous faisons est relativement simple.</p>
<p>Il est possible d&#8217;utiliser aussi des annotations avec les Portlets 2.0. Il est donc possible d&#8217;ajouter une annotation @ProcessAction(name=&#8217;theActionName&#8217;) afin de dispatcher automatiquement un appel entrant vers une méthode. Dans le cas où une méthode est annotée avec ProcessAction, il faut par contre retirer la méthode générique processAction de GenericPortlet, faute de quoi aucun appel ne sera effectué vers votre méthode annotée.</p>
<p><strong>Du côté de la JSP</strong><br />
Ouvrez maintenant la page &laquo;&nbsp;normal.jsp&nbsp;&raquo; situé dans le répertoire web-apps. Tout d&#8217;abord on notera la présence d&#8217;une nouvelle taglib pour les Portlets 2.0, qui permet de déclarer automatiquement un certain nombre d&#8217;objets pratiques.</p>
<pre name="code"  class="xml">
&lt;%@ page import="java.util.List" %&gt;
&lt;%@ page pageEncoding="UTF-8" %&gt;
&lt;%@taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %&gt;

&lt;portlet:defineObjects/&gt;
&lt;div id="content"&gt;
 &lt;img src="&lt;%=renderResponse.encodeURL(renderRequest.getContextPath())%&gt;/logo.jpg" alt="Logo" align="top"/&gt;
    &lt;h2&gt;GateIn Twitter Portlet&lt;/h2&gt;
    &lt;h4&gt;Latest Twitter statuses from Letouilleur&lt;/h4&gt;
    &lt;%
        List&lt;String&gt; tweets = (List&lt;String&gt;) portletSession.getAttribute("tweets");
        if (tweets != null) {
            out.println("&lt;ul&gt;");
            for (String tweet : tweets) {
                out.print("&lt;li&gt;");
                out.print(tweet);
                out.println("&lt;/li&gt;");
            }

            out.println("&lt;/ul&gt;");
        }
    %&gt;

    &lt;portlet:actionURL var="myAction" portletMode="view"/&gt;

    &lt;form action="&lt;%=myAction%&gt;" method="post"&gt;
        &lt;input type="submit" value="Get Tweets from Letouilleur"/&gt;
    &lt;/form&gt;
&lt;/div&gt;
</pre>
<p>Le tag &lt;portlet:defineObject&gt; permet de déclarer automatiquement <a href="http://blogs.sun.com/deepakg/entry/jsr286_defineobjects_tag">un certain nombre d&#8217;objets</a> pour notre page JSP. Dans notre exemple cela permet de construire l&#8217;URL de l&#8217;image du logo du blog le Touilleur Express :</p>
<pre>
&lt;img src="&lt;%=renderResponse.encodeURL(renderRequest.getContextPath())%&gt;/logo.jpg"
            alt="Logo"
            align="top"/&gt;
 </pre>
<p>Nous pouvons aussi récupérer la session de la portlet afin de retrouver notre liste de messages</p>
<pre>
List&lt;String&gt; tweets = (List&lt;String&gt;) portletSession.getAttribute("tweets");
...
</pre>
<p>Pour construire l&#8217;URL de la FORM il suffit d&#8217;utiliser le tag actionURL comme dans cet exemple:</p>
<pre>
   &lt;portlet:actionURL var="myAction" portletMode="view"/&gt;

   &lt;form action="&lt;%=myAction%&gt;" method="post"&gt;
</pre>
<p>Enfin voici le résultat lorsque l&#8217;on clique sur le bouton Submit :</p>
<p><img src="http://www.touilleur-express.fr/wp-content/gatein_portlet_action.jpg" alt="gatein_portlet_action" title="gatein_portlet_action" width="290" height="325" class="alignnone size-full wp-image-2313" /></p>
<p><strong>Conclusion</strong><br />
J&#8217;ai présenté un exemple simple dans cet article en vous expliquant le principe des 2 phases des Portlets, ainsi que l&#8217;utilisation de la taglib des Portlets. Nous verrons dans un prochain article comment gérer encore plus de fonctionnalités des Portlets avec GateIn. Le prochain article sera disponible la semaine prochaine, voici une capture d&#8217;écran pour vous faire patienter:</p>
<p>]<img src="http://www.touilleur-express.fr/wp-content/portlet_article03.jpg" alt="portlet_article03" title="portlet_article03" width="500" height="265" class="alignnone size-full wp-image-2423" /><br />
Le prochain article sera publié le 27 novembre.</p>
<p>A bientôt</p>
<p>Le code source de l&#8217;article est disponible <a href="http://www.touilleur-express.fr/code/portlet/portlet_article01_gatein.zip">à cette adresse</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/11/21/gatein-decouverte-dune-portlet-simple-article-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Portails et Portlets 2.0 pour votre architecture web.</title>
		<link>http://www.touilleur-express.fr/2009/09/12/portails-et-portlets/</link>
		<comments>http://www.touilleur-express.fr/2009/09/12/portails-et-portlets/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 12:47:58 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[portail]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1940</guid>
		<description><![CDATA[Les Portails d’intégration et plus particulièrement les Portlets sont des briques d’architecture qui offrent des services techniques, mais qui permettent aussi à plusieurs projets de se rejoindre et de travailler ensemble. Plutôt que de parler de SOA, nous verrons que le concept de WOPA (Web Oriented Portal Architecture) est une solution d’architecture pour les applications Webs.

Un portail offre un grand nombre de services à une application web
Si vous avez déjà développé des applications webs en Java, vous serez d’accord sur le fait que les besoins fonctionnels et techniques des applications ...]]></description>
			<content:encoded><![CDATA[<p><strong>Les Portails d’intégration et plus particulièrement les Portlets sont des briques d’architecture qui offrent des services techniques, mais qui permettent aussi à plusieurs projets de se rejoindre et de travailler ensemble. Plutôt que de parler de SOA, nous verrons que le concept de WOPA (Web Oriented Portal Architecture) est une solution d’architecture pour les applications Webs.<br />
</strong></p>
<p><strong>Un portail offre un grand nombre de services à une application web</strong><br />
Si vous avez déjà développé des applications webs en Java, vous serez d’accord sur le fait que les besoins fonctionnels et techniques des applications webs sont récurrents. Justement, les Portails d’intégration offrent un ensemble de fonctions standards. Voyons d’abord ce qu’il est possible de faire.</p>
<p>Les services offerts par un Portail sont :<br />
 &#8211; la gestion de l’authentification des utilisateurs<br />
 &#8211; l’autorisation afin de déterminer les droits d’accès aux différentes parties de l’application<br />
 &#8211; la personnalisation afin que l’application web s’adapte au profil du visiteur (P13N)<br />
 &#8211; la possibilité de personnaliser son interface web facilement<br />
 &#8211; la gestion de la navigation et sa définition (catégories, pages, sections)<br />
 &#8211; création des pages de contenu (pages statiques, intégration de pages d’un autre serveur)<br />
 &#8211; gestion de l’internationalisation (I18N)<br />
 &#8211; la possibilité d’intégrer du contenu web d’une application distante<br />
 &#8211; le support sans restriction des frameworks Web<br />
 &#8211; la possibilité de mettre en ligne des services dans des Portlets rapidement<br />
 &#8211; la capacité à offrir une version adaptée aux téléphones portables<br />
 &#8211; l‘offre de composants standards Web 2.0 comme Wiki, Blog, Aggregateur, Mash-ups, etc<br />
 &#8211; le support des Gadgets à la Google<br />
 &#8211; la possibilité d’offrir des services de recherche, de gestion de contenu, de gestion électronique de document</p>
<p>Un moteur de Portail open-source du monde Java comme <a href="http://www.jboss.org/gatein/">GateIn</a> (JBoss Portal + eXoPortal) ou <a href="http://www.liferay.com">Liferay</a> est donc un moyen de gagner du temps en évitant de développer ou de devoir gérer des fonctions standards d’une application Web. L&#8217;installation est simple : un WAR déployé sur un serveur J2EE léger, et c’est tout.</p>
<p>Si vous disposez d’une application Web Java, le déploiement s’effectue en quelques clics dans le portail. Pour aller plus loin, la création de quelques portlets permet en fait d’exposer les fonctions clés de son application web, afin que le Portail puisse gérer le cycle de vie et l’affichage de votre portlet.<br />
Une chose intéressante à noter : vous êtes libre d’utiliser n’importe quel framework Web : <a href="http://code.google.com/webtoolkit">GWT</a>, <a href="wicket.apache.org/ ">Wicket</a>, <a href="http://fr.wikipedia.org/wiki/JavaServer_Faces">JSF</a> ou autre. De ce fait, la migration d’une application J2EE est donc relativement simple.</p>
<p><strong>Qu’est-ce qu’une Portlet ?</strong><br />
Les <a href="http://jcp.org/en/jsr/detail?id=286">Portlets 2.0</a> ont été normalisées en juin 2008. C’est une spécification assez bas niveau, proche des Servlets. Une Portlet est une enveloppe pour votre application web. Elle dispose de différents états : minimisée, normal, maximisée. Il est aussi possible de basculer d’un mode vue à un mode édition pour la configuration. Du côté du code, en attendant que je vous propose d’autres articles, il y a une distinction entre la phase de rendu et la phase d’action. Le rendu est simplement l’action d’afficher la Portlet. La phase d’action permet de gérer les interactions entre l’utilisateur et l’application web. Enfin il est possible d’émettre des événements afin que d’autres Portlets soient notifiées et puissent interagir avec votre Portlet. C’est relativement simple, l’API Portlet 2.0 propose des annotations qui permettent de marquer vos méthodes. Il y a une petite gymnastique à apprendre afin d’adapter vos pages de rendus par rapport à la navigation. Du côté de la gestion des ressources (js,css,images) il est nécessaire que la Portlet gère le chargement de ces ressources, en raison de la gestion de la sécurité et du cache.<br />
Le contenu d’une Portlet enfin peut être caché par le Portail afin d’éviter le rechargement systématique du contenu.</p>
<p>Les portlets offrent en fait un moyen standard et normaliser de déployer son application et d’interagir avec d’autres Portlets. Et il est tout à fait envisageable d’écrire des Portlets standards, sans tomber dans le piège d’utiliser une API propriétaire.</p>
<p><strong>Le modèle de programmation des Portlets </strong> <em>(avec l’aide de Julien Viet d’eXo Platform)</em><br />
Le modèle de programmation natif d&#8217;une Portlet est similaire à celui des Servlets. Il se fait via le package javax.portlet. Le modèle de programmation est légèrement différent, comme expliqué au paragraphe précédent. La plupart des équipes de développement n’utiliseront pas directement l’API, pour la même raison que l’API Servlet en général n’est pas utilisée directement mais via un framework.</p>
<p>En effet, la plupart des frameworks modernes proposent un adaptateur pour Portlet (Portlet Bridge). Avec un modèle de programmation bien pensé, l’exécution en mode Portlet ou directement dans une application web ne présente pas de différences pour le framework. Si vous débutez un projet basé sur des Portlets, il sera important de s’assurer de ce support dans votre framework Web avec un adaptateur pour Portlets. Les plus connus possèdent tous un bridge comme Java Server Faces (<a href="http://jcp.org/en/jsr/detail?id=301">via la JSR 301 Portlet Bridge Specification</a>), Wicket, Struts2 et Tapestry.</p>
<p>D&#8217;autres framework web tel que Spring MVC ne proposent pas une telle portabilité mais néanmoins fournissent un support pour les Portlets en adaptant le framework à l&#8217;API Portlet. J’ai codé une Portlet avec Spring MVC sans soucis, grâce à SpringFuse l’outil de Celerio.</p>
<p>Finalement pour de vieilles technologies telles que Struts 1, il existe des bridges mais qui sont gérés à un niveau en dessous avec une émulation de la couche Servlet via une Portlet. En général ce type de bridge a des limitations.</p>
<p><strong>Les Portlets permettent de travailler à plusieurs équipes sur une même application web </strong><br />
Je prends le temps de vous parler de déploiement car le principe des Portlets permet de travailler par modules. Imaginez plusieurs équipes de développement qui travaillent sur un portail web d’entreprise. En se donnant rendez-vous techniquement sur un Portail, vous pouvez donc offrir un moyen pour chaque équipe de travailler de son côté, avec une installation locale de Liferay ou de GateIn, puis de livrer simplement leurs Portlets vers le serveur de production. Un administrateur se chargera alors d’ajouter et de mettre en place les Portlets du premier projet. J’y vois donc un moyen de faciliter le travail de plusieurs équipes. En effet, c’est bien plus souple que d’imaginer livrer un gros WAR constitué de plusieurs projets développés par plusieurs équipes. Imaginez la difficulté pour l’intégration et la mise en production. Un Portail d’intégration est donc un serveur mutualisé sur lequel plusieurs équipes déposent des Portlets, qui constituent au final une application Web complète.<br />
Le portail permet de découpler le cycle de vie du portail et des applications qui le composent. En effet vous pourrez facilement intégrer de nouvelles applications dans le portail à tout moment. Un autre intérêt de ce type d&#8217;architecture est l&#8217;intégration d&#8217;applications basées des technologies hétérogènes. Vous pourriez vouloir intégrer dans votre portail une application développée 2 ans auparavant par une filliale de l&#8217;entreprise par exemple.</p>
<p>Chez le client chez lequel je travaille en ce moment, ce sera le moyen pour trois équipes à Paris, une à Londres et une à New-York de construire une plateforme de Prime Brokerage avec la même charte graphique, une seule authentification, la gestion de plusieurs langues, et surtout vous l’aurez compris, la possibilité pour chacune de ces équipes de travailler sur leurs Portlets et de les tester en local avec un Portail open-source avant le passage en production.<br />
Les Portlets ne sont pas révolutionnaires. Par contre, c’est l’utilisation dans votre architecture qui le sera. En effet, si vous avez aujourd’hui plusieurs équipes ayant réalisées chacune une application web, il est possible de repenser le système non pas avec une architecture SOA, mais une architecture Web Portal. Au lieu d’agréger des services différents dans un seul endroit pour construire une seule application web, vous offrez la possibilité à chaque équipe de livrer une tranche verticale qui va de la donnée à la couche web en passant par la couche service. Et quelque part, est-ce qu’une application Web dont l’architecture serait définie par l’interface graphique n’a pas plus de sens qu’une application web construite comme un puzzle de services ?</p>
<p><strong>L’exemple d’Amazon.com</strong><br />
La page d’Amazon.com est construite par 34 équipes différentes. Chacune des parties de la page est une Portlet. C’est assez génial car la mise en production d’une nouvelle version n’est plus un problème : il n’y en a plus !<br />
Terminé la mise en ligne d’une application Web complète.</p>
<p>Alors comment font-ils ?<br />
Lorsqu’une équipe est confiante sur une nouvelle fonction, une nouvelle version de sa Portlet est activée sur le Portail. En cas de problèmes, l’administrateur peut aussi rapidement désactiver une Portlet, voire même recharger une version antérieur. Quand on pense à Scrum, à de l’incrémental, il paraît évident que ce Portail va vraiment devenir votre ami non ?</p>
<p><strong>Une porte ouverte vers une architecture WoPA (Web Oriented Portal Architecture)</strong><br />
Je pense que les applications d’entreprises sont amenées à s’ouvrir de plus en plus. Nous avons pensé un moment qu’une architecture orientée service serait la solution. Ces 5 dernières années en effet, nous sommes passés d’architectures client-serveur (J2EE 1.4 avec les EJB2.1, Corba, RPC) à des architectures où la Donnée a reprit de l’importance avec les architectures REST. Personne ne semble vraiment savoir ce que représente l’architecture orientée service, à part les éditeurs de logiciels très friand d’acronyme dans leurs plaquettes publicitaires.<br />
Une architecture WoPA (copyright N.Martignole) avec un Portail d’intégration, est une application capable de combiner le travail de plusieurs équipes, de plusieurs projets, dans un seul endroit : le Portail Web. Cela remet en avant l’importance des données plutôt que de leur logiciel. Je pense surtout au monde de la Banque, où l’IT est important. Vous n’imaginez pas le nombre d’équipes et de projets chez le client où je travaille en ce moment.</p>
<p>L’idée novatrice est aussi que l’interface Web n’est peut-être pas la partie la plus importante de votre application. A l’extrême, il est dommage de proposer un GUI Web et de ne rien proposer à vos clients afin qu’ils viennent chercher les Données directement. Bref ne pas faire de REST devrait être refusé par la DSI dans un schéma d’architecture.</p>
<p>Pour expliquer cela, pensez à Twitter.com. Il s’avère que l’API de Twitter est utilisée 10 fois plus que le site web de Twitter. Pourquoi finalement votre application ne serait-elle pas utilisée non pas avec votre GUI Web que vous avez développé, mais via un Portail capable de venir chercher de la Donnée ? Est-ce que votre valeur ajoutée est de faire une application Web ou d’exposer de la Donnée de manière intelligente ?</p>
<p><strong>Conclusion</strong><br />
C’est donc via une solution standard comme un Portail d’intégration et les Portlets qu’il semble plus logique de s’orienter, dès lors que plusieurs équipes exposent des données et des services aux utilisateurs.<br />
Je crois à une solution où l’intégration du travail de plusieurs équipes est fait dans un Portail dès lors qu’auparavant, chacune d’elles proposaient une interface Web différente.</p>
<p><em>Merci à <a href="http://blog.julienviet.com/">Julien Viet</a> de la société <a href="http://www.exoplatform.com">eXo Platform</a> pour sa relecture et ses corrections.</em></p>
<p><strong>Ressources</strong><br />
<a href="http://www.liferay.com/">Liferay</a> est un portail open-source lancé en 2000 qui est compatible avec les standards Javas comme la JSR-168 (Portlet 1),  JSR-286 (Portlet 2), JSR-170 (JCR)</p>
<p><a href="http://www.jboss.org/gatein">GateIn</a> est un portail open-source constitué par la fusion de JBoss Portal et d’eXo Portal. Avec une interface très puissante, le support des standards (JSR-168,286,170), la possibilité d’ajouter des Gadgets facilement, c’est l’un des portails les plus en vogue en ce moment.<br />
<a href="http://www.jboss.org/gatein">http://www.jboss.org/gatein</a> et <a href="http://www.exoplatform.com">http://www.exoplatform.com</a></p>
<p><a href="http://www.oracle.com/technology/products/weblogic/portal/index.html">Oracle Weblogic Portal 10g </a>est la version actuelle du portail d’Oracle. La version 11 devrait sortir à la fin de cette année avec le support de la JSR-286.</p>
<p><a href="http://www.infoq.com/presentations/Web-Oriented-Architecture-Dion-Hinchcliffe">Présentation de Dion HINCHCLIFFE</a> sur Web Oriented Architecture</p>
<p><a href="http://www.programmableweb.com">ProgrammableWeb</a> est un annuaire d’API et de Mashup</p>
<p><a href="http://wlp.oracle.com:80/dvt/appmanager/demo/dvt?_nfpb=true&#038;_nfxr=false&#038;_pageLabel=P1400147111221587375187">Démonstration</a> de la fonction Mashup d’Oracle Weblogic Portal</p>
<p>La <a href="http://jcp.org/en/jsr/detail?id=301">JSR-301</a> est la Portlet Bridge Specifications for JSF, en cours de finalisation.</p>
<p>La <a href="http://jcp.org/en/jsr/detail?id=286">JSR-286</a> est la spécification des Portlets 2.0 à laquelle eXo Platform, Liferay et Oracle ont participé</p>
<p>La <a href="http://jcp.org/en/jsr/detail?id=170">JSR-170</a> est la spécification Java Content Repository, implémentée par le moteur d&#8217;eXo Portal et de Liferay.</p>
<p>(Liens ci-dessous ajoutés suite à la remarque d&#8217;Alexis)</p>
<p>IBM propose IBM Web Portal <a href="http://www-01.ibm.com/software/fr/info1/websphere/">http://www-01.ibm.com/software/fr/info1/websphere/</a></p>
<p>SUN Microsystems propose GlassFish Web Space Server basé sur Liferay <a href="http://www.sun.com/software/products/webspace/index.xml">http://www.sun.com/software/products/webspace/index.xml</a>. Il y a une bonne présentation de 20 minutes très intéressante <a href="http://webcast-west.sun.com/interactive/10A02171/index.html">ici</a></p>
<p>Vignette propose Vignette Portal 8 http://www.vignette.com</p>
<p>J&#8217;ai oublié de citer l&#8217;implémentation de référence de la JSR-168 et de la JSR-286 : <a href="http://portals.apache.org/pluto/">Apache Pluto</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/09/12/portails-et-portlets/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Jazoon Day 3 : Portlet 2.0 by Thomas Heute</title>
		<link>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-portlet-20-by-thomas-heute/</link>
		<comments>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-portlet-20-by-thomas-heute/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:31:31 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jazoon]]></category>
		<category><![CDATA[portail]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=1609</guid>
		<description><![CDATA[Première présentation ce matin : &#171;&#160;Portlet 2.0&#8243; par Thomas Heute de JBoss/Red Hat.
La spécification des Portlets 2.0 est sortie en juin 2008. Thomas nous donne un retour un an après de la conférence. Lui-même contributeur depuis 2004 sur JBoss Portal, une année sur JBoss Seam, il est aujourd&#8217;hui le responsable du projet JBoss Portal chez RedHat.
L&#8217;agenda de sa présentation sera :
- Quelles sont les nouvelles fonctionnalités de la version Portlet 2.0
- Adoption par les vendeurs
- La portabilité
- Portlets versus Gadgets
Dans un premier temps, retour sur la JSR-286 Portlet 2.0 sortie ...]]></description>
			<content:encoded><![CDATA[<p>Première présentation ce matin : &laquo;&nbsp;Portlet 2.0&#8243; par Thomas Heute de JBoss/Red Hat.</p>
<p>La spécification des Portlets 2.0 est sortie en juin 2008. Thomas nous donne un retour un an après de la conférence. Lui-même contributeur depuis 2004 sur JBoss Portal, une année sur JBoss Seam, il est aujourd&#8217;hui le responsable du projet JBoss Portal chez RedHat.</p>
<p>L&#8217;agenda de sa présentation sera :<br />
- Quelles sont les nouvelles fonctionnalités de la version Portlet 2.0<br />
- Adoption par les vendeurs<br />
- La portabilité<br />
- Portlets versus Gadgets</p>
<p>Dans un premier temps, retour sur la JSR-286 Portlet 2.0 sortie l&#8217;an passé. Tout d&#8217;abord l&#8217;une des innovations les plus importantes est ce qu&#8217;il appelle &laquo;&nbsp;Resource Serving&nbsp;&raquo;. L&#8217;objectif est de permettre l&#8217;envoi de données vers le navigateur qui ne font pas partie du portail, comme un fichier PDF ou Excel par exemple, tout en conservant les fonctionnalités d&#8217;une portlet. Cette spécification vise donc à offrir un accès au contexte afin d&#8217;assurer le support de la sécurité et de l&#8217;accès aux données par exemple.</p>
<p>Il montre ensuite l&#8217;interaction entre les portlets avec une RemoteCommandPortlet sur une démonstration fonctionnant avec JBoss Portal. Une fenêtre HTML détachée permet d&#8217;envoyer des commandes à une autre portlet, la gestion de l&#8217;asynchrone est très simple.<br />
A ce propos, il explique que les améliorations du support d&#8217;Ajax dans la spécification Portlet 2.0 permettent à des frameworks comme ICEFaces ou RichFaces de fonctionner correctement dans des portlets.</p>
<p>Les Portlets 2.0 peuvent maintenant partager leurs paramètres avec d&#8217;autres produits ce qui permet de faire communiquer les portlets entre elles. Thomas Heute montre l&#8217;exemple d&#8217;une portlet Google Map et d&#8217;une portlet Weather qui recoivent toutes les deux en paramètre le code postal d&#8217;une ville américaine.</p>
<p>Une portlet peut aussi déclencher une événement, les autres portlets peuvent être notifiées et se mettre à jour. Il conseille de ne s&#8217;en servir que pour de la mise à jour de l&#8217;interface.</p>
<p>Sur le slide suivant il dresse un état de l&#8217;implémentation de la spécification par les différents acteurs du marché :</p>
<p>La <a href="http://jcp.org/en/jsr/detail?id=286">JSR-286</a> Portlet 2.0 est en version finale depuis le 12 juin 2008.<br />
- JBoss Portlet Container 2.0 est sorti le 13 juin 2008 puis inclus dans JBoss Portal 2.7.0 en octobre<br />
- eXo Portlet Container 2.0 est sorti le 18 juin 2008, mis dans eXo Portal le 1er juillet 2008<br />
- Liferay portal a sorti sa version le 17 juillet 2008<br />
- Apache Jetspeed assez tardivement le 27 mai 2009 dernier<br />
- IBM Websphere portal 6.1 a été disponible sept 2008<br />
- Oracle Portal (BEA () + Oracle (2) + Sun(1)) ?</p>
<p>Concernant le support des frameworks WEB il existe 2 spécifications<br />
JSF Support:<br />
 &#8211; JSR-301 specification addresses JSR-166<br />
 &#8211; JSR-329 addressing JSR-286 (JBoss Portlet bridge on the way)</p>
<p>De ce qu&#8217;il a pu voir sur les forums, les pages :<br />
Wicket support -> mostly there with support for events<br />
Sruts 2 plugin for JSR-286<br />
Spring MVC also support JSR-286<br />
WebWork</p>
<p>A propos de la portabilité : attention la spec ne dit pas comment on fait un portail mais une portlet.<br />
La notion de page n&#8217;est pas définie.<br />
La communication entre portlet:<br />
 &#8211; UI Level<br />
 &#8211; Le mécanisme événementiel n&#8217;est pas un remplacement par JMS, ne pas abuser de ce mécanisme.<br />
 &#8211; Doit-on se coordonner à travers les pages ?<br />
 &#8211; Portlets aren&#8217;t a template mechanism per se</p>
<p>Rester à une gestion des événements entre portlet qui sont sur la même page si vous ne voulez pas avoir de soucis.</p>
<p>Slide suivant qui m&#8217;a fait sourire : <strong>Portlet vs Widget vs Gadget (vs Toilet ?)</strong><br />
Thomas Heute explique tout d&#8217;abord en quoi consiste un Gadget, tel que l&#8217;on peut le voir sur Facebook. C&#8217;est un affichage déporté dans un autre site web d&#8217;une fonctionnalité hébergée sur un serveur primaire. Une portlet est plutôt la représentation locale d&#8217;un service distant, c&#8217;est une composition gérée par un portail, afin d&#8217;assurer des services communs (authentification, autorisation, communication, etc) dans un seul endroit.</p>
<p>Il cite différentes initiatives autour des Gadgets :<br />
Google OpenSocial, OpenAjax Alliance (OBM, Google, Sun, Red Hat, Oracle, Microsoft) -> Widget proposal</p>
<p>L&#8217;avantage des Portlets par rapport à un Gadget/Widget:<br />
-> Fait pour des applications plutôt complexes.<br />
-> Vous pouvez utiliser votre framework en général,<br />
-> L&#8217;état des portlets est gardé lorsque la page se rafraichie.<br />
-> propagation de l&#8217;identité, de la sécurité, interaction avec un portail, visuel.</p>
<p>Les gadgets ont l&#8217;avantage d&#8217;être développable rapidement, comme pour consommer par exemple un flux RSS. Facile pour l&#8217;intégration du côté client, facile pour partager de l&#8217;information. On pense au Gadget Twitter que j&#8217;ai sur mon blog par exemple.</p>
<p>Il termine par un slide sur ses idées pour l&#8217;avenir<br />
> We could use more annotations a la Servlet 3.0 or JSF 2.0 @Portlet (no portlet,xml)<br />
> We could all benefit from a PORTAL specification<br />
 &#8211; more aware of the environment, communication with the portal itself<br />
 &#8211; Portal object management<br />
 &#8211; Federated search/index</p>
<p>Enfin il revient sur l&#8217;annonce du parternariat entre JBoss Portal et eXo Portal. Il résume cela par<br />
&laquo;&nbsp;<strong>JBoss builds the platform, eXo Platform builds the solution, We are hiring !</strong>&nbsp;&raquo;</p>
<p><strong>Réflexions et conclusion</strong><br />
Présentation intéressante, je crois que les Portlets 1.0 ne doivent plus être utilisées. Je travaillerai cet été à l&#8217;étude de différents portails pour le client avec lequel je travaille, le sujet est donc d&#8217;actualité. Mon souci du moment : comment proposer l&#8217;étude d&#8217;alternative à la politique d&#8217;achat qui voudrait que l&#8217;on prenne Oracle Portal, sans savoir si celui-ci correspond à nos besoins ? Mais c&#8217;est une autre histoire&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/06/25/jazoon-day-3-portlet-20-by-thomas-heute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eXo Platform : rencontre avec Benjamin Mestrallet</title>
		<link>http://www.touilleur-express.fr/2009/01/23/exo-platform-rencontre-avec-benjamin-mestrallet/</link>
		<comments>http://www.touilleur-express.fr/2009/01/23/exo-platform-rencontre-avec-benjamin-mestrallet/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 22:40:04 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[exo]]></category>
		<category><![CDATA[interview]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=705</guid>
		<description><![CDATA[
J&#8217;ai eu l’occasion d&#8217;interviewer Benjamin Mestrallet, PDG de la société eXo Platform grâce à Dimitri Baeli. Editeur de logiciel français, eXo Platform est le leader des solutions de portails basées sur la JSR 168 et JSR 286. Les solutions disponibles en open-source, sont aussi livrées sous la forme de produits avec licences. eXo est un acteur très actif de la communauté Java. Au delà du socle technique dont nous allons parler, il est intéressant de comprendre la démarche et la vision d&#8217;eXo.
Nous avons discuté pendant deux heures. J&#8217;ai vraiment apprécié ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://wiki.exoplatform.org/xwiki/bin/download/Main/Team/My1.jpg" alt="Benjamin Mestrallet"/><br />
<i>J&#8217;ai eu l’occasion d&#8217;interviewer Benjamin Mestrallet, PDG de la société <a href="http://www.exoplatform.com" target="new">eXo Platform</a> grâce à Dimitri Baeli. Editeur de logiciel français, eXo Platform est le leader des solutions de portails basées sur la JSR 168 et JSR 286. Les solutions disponibles en open-source, sont aussi livrées sous la forme de produits avec licences. eXo est un acteur très actif de la communauté Java. Au delà du socle technique dont nous allons parler, il est intéressant de comprendre la démarche et la vision d&#8217;eXo.<br />
Nous avons discuté pendant deux heures. J&#8217;ai vraiment apprécié notre rencontre,  Benjamin ayant une vision très solide du futur, et surtout très réaliste. C&#8217;est ce que nous allons voir dans cet entretien. </i></p>
<p><strong>Pour commencer, l&nbsp;&raquo;actualité d&#8217;eXo Platform a été riche en cette fin d&#8217;années. Beaucoup d&#8217;actualités, de voyages comme lu sur ton feed twitter (<a href="http://twitter.com/benjmestrallet">@benjmestrallet</a>). En quelques mots peux-tu me parler de l&#8217;entreprise et de tes équipes ?</strong><br />
En effet, 2008 a été une année riche. L&#8217;année 2009 sera l&#8217;année de la stabilisation. 2008 a été l&#8217;année du lancement de beaucoup de produits et nous n&#8217;annonçons pas pour l&#8217;instant de nouveaux produits pour 2009.<br />
Concernant l&#8217;entreprise, en effet nous avons aussi recruté beaucoup de personnes. La société se compose de plusieurs centres de développement : le Viet-nam, l&#8217;Ukraine, la Tunisie et la France. eXo Platform représente environ 95 personnes aujourd&#8217;hui.<br />
Si tout va bien nous devrions démarrer aussi aux USA avec un bureau là-bas.</p>
<p><strong>A propos du nom &laquo;&nbsp;eXo Platform&nbsp;&raquo;, j&#8217;ai entendu plusieurs histoires, mais donc il semble que cela vienne du nom de ton projet de fin d&#8217;étude, tout simplement appelé &laquo;&nbsp;exo&nbsp;&raquo; comme exercice, et que finalement tu aurais gardé. Vrai ou pas vrai ? Légende urbaine ou pas ?</strong><br />
C&#8217;est vrai.</p>
<p><strong>Comment l&#8217;aventure a commencé ?</strong><br />
Nous avons publié un article sur The Server Side à propos des portails. Cet article a été repéré par un membre du Department of Defense en 2003, l&#8217;équivalent de la DGA en France, au moment de la guerre en Irak. De fil en aiguille, en effet notre premier client a été le DoD. J&#8217;avoue que la première fois qu&#8217;un email avec &laquo;&nbsp;@jfcom.mil&nbsp;&raquo; arrive dans ta boîte aux lettres, tu n&#8217;y crois pas&#8230;<br />
Le code source a été placé sur SourceForge, c&#8217;était l&#8217;implémentation de la JSR 168, basée sur Pico Container, un des premiers frameworks d&#8217;inversion de contrôle. Nous avons été contacté afin d&#8217;écrire plusieurs articles sur les portails collaboratifs, et c&#8217;est de cette façon que notre premier client a démarré l&#8217;aventure eXo Platform, courant 2004.</p>
<p><strong>La société a été créé à Vannes ?</strong><br />
En fait j&#8217;ai commencé à Paris, en banlieue parisienne.</p>
<p><strong>&#8230; dans un garage ? Important le garage !</strong><br />
*rires*, oui le garage en effet.<br />
Nous avons commencé ensuite à Vannes, cela nous a donné la possibilité de démarrer rapidement, entre autre grâce à François Moron, qui est le directeur des opérations aujourd&#8217;hui chez eXo.</p>
<p><strong>Comment se passe la répartition des équipes entre les différents centres de R&#038;D ?</strong><br />
Nous sommes répartis par couche technique. L&#8217;implémentation de spécification se fait plutôt en Ukraine, le Viet-Nâm se concentrant sur l&#8217;intégration et la réalisation des produits. La Tunisie démarre afin d&#8217;offrir un support francophone et surtout, le support des écritures right-to-left comme l&#8217;arabe, l&#8217;hébreu et le persan. Nous souhaitons démarrer très rapidement de nouveaux projets en Afrique du Nord et au Moyen-Orient. Le support des utilisateurs francophones en Tunisie nous permet aussi de renforcer nos équipes et d&#8217;offrir un service de qualité à nos clients en Europe.<br />
A propos nous recrutons en Tunisie, et nous cherchons des personnes motivées afin de renforcer nos équipes à Tunis (voir le site http://www.exoplatform.com). Si des personnes sont intéressées, elles peuvent postuler via le site Web d’eXo.</p>
<p><strong>eXo Platform fait partie du JCP (Java Community Process) et vous intervenez sur la JSR 286, Portlet 2.0. Qui est en charge chez eXo de la JSR ?</strong><br />
Au départ c&#8217;était moi. A cette occasion j&#8217;ai fait la connaissance de Julien Viet. Il était à l&#8217;époque chef de projet chez RedHat de JBoss Portal. De fil en aiguille, Julien nous a rejoint et il est en charge aujourd&#8217;hui du produit <a href="http://www.exoplatform.com/portal/public/en/product/portal/overview">eXo Portal 2.5</a>.</p>
<p><strong>Par exemple, où travaillait <a href=”http://tugdualgrall.blogspot.com/”>Tugdual Grall</a> avant de rejoindre eXo  ?</strong><br />
Chez Oracle à San Francisco, pendant une dizaine d&#8217;années. Il est aujourd’hui VP of Business and Product Strategy chez nous.</p>
<p><strong>Il y a pas mal de personnes connues de la communauté Java dans les membres d&#8217;eXo Platform non ?</strong><br />
Dimitri Baeli, OSSGTP, anciennement chez Prima Solutions nous a rejoint récemment. Il a mis en place Scrum et il travaille sur l&#8217;industrialisation de nos produits. Ensuite Brice Revenant dirige eXo Platform SEA (South East Asia). Il est basé au Viet-Nam, il travaillait anciennement chez Bull.<br />
Patrice Lamarque est Product Manager, il est en charge <a href="http://www.exoplatform.com/portal/public/en/product/cs/overview">d&#8217;eXo Collaboration Suite,</a> notre suite collaborative avec email, agenda, carnet d&#8217;adresse.<br />
Il y aura d&#8217;autres personnes prochainement&#8230;</p>
<p><strong>eXo Platform fait partie du consortium OW2, peux-tu expliquer ce que cela représente et comment vous avez rejoins ce groupe ?</strong><br />
<a href="http://www.ow2.org">OW2</a> est au départ une initiative de France Telecom, de Bull et de l&#8217;INRIA, visant à promouvoir les projets open-sources. Cependant aujourd&#8217;hui c&#8217;est un consortium bien plus important, l&#8217;Asie et le reste de l&#8217;Europe sont fortement représentés. Au départ, l&#8217;objectif est de fédérer des projets autour du middleware, plutôt en licence LGPL. Lorsque nous avons commencé à travailler avec OW2, nous avons proposé eXo qui est en double licence : GPL et commerciale. D&#8217;autre part nous sommes un socle applicatif. Aujourd&#8217;hui les projets regroupés autour d&#8217;OW2 sont plus vastes. On retrouve par exemple d&#8217;autres projets comme <a href="http://www.xwiki.com/xwiki/bin/view/About/">xWiki</a>, initié par Ludovic Dubost ou <a href="http://www.elastic-grid.com">elastic Grid</a> initié par Jérôme Bernard.</p>
<p><strong>A propos des évolutions à venir d&#8217;eXo Platform, j&#8217;ai lu que tu parles d&#8217;un mode hébergé (Saas) et d&#8217;un mode déconnecté. Qu&#8217;en est-il aujourd&#8217;hui ?</strong><br />
Oui à propos du mode hébergé, nous sommes utilisateurs d&#8217;Amazon S3 et EC2. Pour l&#8217;instant nous n&#8217;avons pas encore finalisé de produits. Notre idée est de proposer ce que l&#8217;on appelle &laquo;&nbsp;Paas&nbsp;&raquo; : Platform as a Service. Nous travaillons aujourd&#8217;hui avec des intégrateurs qui réalisent des projets chez des grands comptes. Notre souhait est d&#8217;offrir directement aux PME une solution locative et donc d&#8217;héberger leurs applications sur notre plate-forme. Ainsi, chacun se concentre sur son coeur de métier et ne prend pas en charge la gestion d&#8217;un data center par exemple.</p>
<p>Sur ce modèle, SalesForce.com propose ce service, nous souhaitons aussi travailler dans ce sens. C&#8217;est un mouvement fort pour les années à venir.</p>
<p>A la base notre offre vise à simplifier chez les grands comptes l&#8217;usage des familles de produits sur lesquels nous nous sommes positionnés. Là où il y a un IBM Websphere Portal, notre offre est plus compétitive. Nous avons fait un gros travail pour supprimer la segmentation du marché (Websphere Portal, FileNet, Lotus&#8230;) et d&#8217;offrir un socle commun plus puissant.</p>
<p>Amazon SimpleDB, S3, EC2, le Cloud computing sont des sujets sur lesquels nous travaillons. Faire fonctionne une application J2EE en cluster demande un travail très intéressant. Il n&#8217;y a pas de multi-cast dans le cloud computing. Ce sont vraiment des sujets intéressants.</p>
<p><strong>Je me souviens que lors de la précédente crise dans les années 2000, Linux a littéralement explosé. Face aux réductions de budgets, les DSI ont propulsé Linux. Surtout sur les marchés publics. Que penses-tu par rapport à cette crise ?</strong><br />
On sent un mouvement global, la crise va-t-elle privilégier l&#8217;open-source ? et d&#8217;autre part, est-ce que les choix techniques que nous avons fait sont les meilleurs ?<br />
Sur la première question, ce qui est intéressant c&#8217;est que les gens se posent plus rapidement la question de &laquo;&nbsp;est-ce que c&#8217;est moins cher ?&nbsp;&raquo;. C&#8217;est la première question. Ce n&#8217;est pas gratuit car c&#8217;est open-source, ce que les décideurs ont intégré. Alors quel est le prix ?<br />
On a vu que les couches basses ont percé dans le monde de l&#8217;open-source ces dernières années. Tout le monde est d&#8217;accord pour s&#8217;en servir. Je pense que l’on va remonter de ces couches basses vers les plate-formes d&#8217;hébergement comme la nôtre, qui proposent des services à valeur ajoutée, comme  Alfresco ou Liferay. Le pipe en ce moment est plus important, nous voyons que la crise provoque en ce moment un mouvement.<br />
Finalement en situation de danger, les décisions sont plus radicales, et nous sommes mieux positionné.</p>
<p><strong>Entre la France et l&#8217;export, comment est réparti l&#8217;activité ? le chiffre d&#8217;affaire ? as-tu des repères à nous donner ?</strong><br />
35% du CA génère en 2008 s&#8217;est fait à l&#8217;export.  En 2007 c&#8217;était 50/50. Notre chiffre d&#8217;affaire en 2008 a presque quadruplé en un an.</p>
<p><strong>Quelles sont vos sources de revenu ?</strong><br />
C&#8217;est de la souscription, et un pourcentage sur le support. Nous avons aussi des experts et des prestations de service. Finalement surtout de la formation, et des développements noyaux. Nos clients sont sponsors.</p>
<p><strong>Quel est votre concurrent numéro 1 ? si nous étions dans la rue, est-ce que ce serait une petite épicerie ? un supermarché ? quel est sa taille par rapport à eXo ?</strong><br />
Cela dépend du marché, de la partie dans le monde dont nous parlons. Sur les appels pour marché public nous voyons souvent en concurrence des solutions proposées autour de <a href="http://www.liferay.com/web/guest/home">Liferay</a>, <a href="http://www.alfresco.com/fr/">Alfresco</a>, parfois du <a href="http://www.jahia.com/jahia/Jahia">Jahia</a>. Sinon aussi IBM Websphere Portal et Oracle Portal.<br />
Nous voyons beaucoup de projets proposés sur Microsoft Office Sharepoint Server, surtout en Afrique du Nord.</p>
<p><strong>J&#8217;ai vu dans la Finance aux USA que les solutions basées sur Microsoft avaient le vent en poupe, car ce sont des solutions qui partent d&#8217;une interface agréable, là où les solutions Java remontent des serveurs d&#8217;application vers l&#8217;interface utilisateur. JavaFX vient juste de sortir&#8230; On parlait RIA, GWT, Flex l&#8217;an passé comme d&#8217;une révolution&#8230; Pour revenir à eXo Platform. WebOS montre peut-être une piste pour le futur.<br />
Finalement, tu ne penses pas que Google sera ton plus gros compétiteur demain ? </strong><br />
Non nous ne sommes pas sur la même segmentation. Google est un partenaire avec lequel nous travaillons. Ils ont lancé le modèle &laquo;&nbsp;Gadget&nbsp;&raquo; et &laquo;&nbsp;OpenSocial&nbsp;&raquo; qui fédère beaucoup de sites (LinkedIn, MySpaces.com&#8230;). On a aussi un engouement justifié sur le développeur chez Google. Ils sont aussi fort en proposant des solutions qui ne sont pas uniquement basées sur Java mais sur Python, javascript, Groovy ou autre&#8230;<br />
Google Gadget est une solution agnostique de la partie serveur. Du côté du client, du html, du javascript. Et tu peux alors mettre ce que tu veux du côté du serveur, ce qui est vraiment intéressant car les perspectives sont plus larges.<br />
eXo Platform supporte l&#8217;intégration des Googles Gadgets, ce qui nous ouvre aujourd&#8217;hui plus de 1000 composants que chacun peut placer sur son portail.<br />
On retrouve un mode client-serveur, le client communique avec le serveur avec du JSON.</p>
<p>J&#8217;ai fait le tour de l&#8217;Asie avec Google en novembre dernier. Lors des conférences, une page pas très belle présentée par Google : résultat,, 500 personnes dans la salle. Tu passes derrière et tu proposes une présentation très sympa ? 100 personnes ! C&#8217;est l&#8217;effet Google ! Le traiteur le Nôtre pour eXo : 100 personnes. Des bières et des chips chez Google : 500 personnes&#8230; C&#8217;est Google *rires*</p>
<p><strong>Pourtant tout ne marche pas si bien. Google Chrome est utilisé autant que Safari d&#8217;après des chiffres vus sur le site du NewYork Times je crois </strong><br />
Les gens qui utilisent un Mac utilisent Safari, il marche bien. Les iPhones, cela fait aussi un grand nombre de navigateur &laquo;&nbsp;Safari&nbsp;&raquo;. Sur Google Android je crois que c&#8217;est Web Toolkit. Apple a vendu 17 millions d&#8217;iPhone&#8230; C&#8217;est énorme.</p>
<p><strong>A propos donc de téléphone mobile, avez-vous des projets ou des prototypes ?</strong><br />
Il y a 3 usages différents : deux qui sont classiques, naviguer sur internet pour le premier, et faire de la synchronisation pour le deuxième. On étudie SyncML pour voir comment nous pourrions proposer la synchro entre notre suite collaborative et ton PDA. Le 3ème usage auquel nous pensons, c&#8217;est de proposer un &laquo;&nbsp;Application Store&nbsp;&raquo; pour proposer des gadgets et des outils.<br />
Le WebOS de Palm est très puissant et pourrait afficher le contenu de notre plate-forme.<br />
Goojet (http://www.goojet.com/index.html) est une société Toulousaine qui propose par exemple un système de gadgets et d&#8217;application mais pour téléphone portable.</p>
<p>Présenter le portail ou le WebOS sur un petit écran, je ne sais pas. Par contre je pense que présenter une partie des gadgets de nos portails, cela serait possible&#8230;</p>
<p><strong>Sur un autre sujet, tu as annoncé l&#8217;ouverture d&#8217;une filiale en Tunisie. Où en sommes-nous ?</strong><br />
Le marché de l&#8217;Afrique du Nord se développe à vitesse grand V. Nous avons la chance de parler français, nous sommes proches géographiqmenent. J&#8217;ai contacté un ami rencontré pendant mes études, Oualid Chaker. Ensemble nous avons monté ce projet et débuté fin juillet une activité de commercialisation et de support basée à Tunis, en charge des contacts avec les pays d&#8217;Afrique et du Moyen-Orient.</p>
<p><strong>Peux-tu présenter les produits et le socle technique d&#8217;eXo Platform ?</strong><br />
Le plus simple pour présenter cette partie est de faire un petit schéma.<br />
<img src="http://www.exoplatform.com/eXoResourcesCompany/skin/DefaultSkin/webui/component/UIProductBrowser/products/portal/dfm766fk_29f53shwf8_b.png"/></p>
<p>Au niveau du socle technique :<br />
1) eXo Portlet Container est une implémentation des JSR 168 et JSR 286 (Portlet 2.0). Ce module gère le cycle de vie et les instances des composants de portlet. L&#8217;implémentation a été optimisée et fournit également des capacités de monitoring qui sont indispensables dans un environnement de production.<br />
2) les WebServices sont supportés avec une implémentation de la spécification JSR 311(JAX-RS) l&#8217;API pour les webservices de type REST. JSR 181 est une JSR pour les WebServices Metadata, qui te permet d&#8217;exposer via des annotations des web services type WSDL<br />
3) eXo Java Content Repository. Il s&#8217;agit d&#8217;une implémentation de la JSR 170  et JSR 283 qui vise à rendre abstrait et à normaliser le stockage des données. Les dépôts de données sont composés d&#8217;espaces de travail qui peuvent contenir du contenu dans une structure hiérarchique. Notre implémentation fournit des services pour gérer les versions, le verrouillage, la sécurité (LDAP), et les recherches. L&#8217;implémentation eXo permet également des connections optimisées avec toutes les bases de données telles que Oracle, DB2, MySQL&#8230;</p>
<p>On a donc 3 points à retenir. Exo Platform offre :<br />
- la portabilite des applications avec portlet<br />
- la portabilité des données avec le JCR<br />
- la portabilité de la logique métier avec JAX-RS et WS Metadata.</p>
<p><strong>Wow&#8230;.. </strong><br />
Le point essentiel est ensuite qu&#8217;on ajoute ensuite la notion de &laquo;&nbsp;Gadget serveur&nbsp;&raquo; à la Google. On peut soit les exposer pour nous, soit vers l&#8217;extérieur. On a là le socle portail d&#8217;eXo Platform. Nous stockons les préférences et les pages dans le JCR. Et on pense maintenant proposer un IDE pour que tu puisses développer en Groovy des applications hébergées dans la plate-forme&#8230;</p>
<p><strong>&#8230; wow&#8230; wow&#8230;.. et ensuite ?</strong><br />
On a ensuite travaillé sur la représentation et l&#8217;interface utilisateur. Tu as d&#8217;une part la vue classique, orienté Web avec le portail. Mais nous avons aussi la vue type &laquo;&nbsp;WebOS&nbsp;&raquo; qui t&#8217;offre un bureau avec ses applications, le tout déployé sur le même serveur.</p>
<p><strong>&#8230; ah&#8230; wow&#8230;</strong><br />
Nos produits phares sont donc développés avec notre socle.<br />
 &#8211; eXo ECM 2.2 (Enterprise Content Managment) est notre offre de gestion de document avancée. (<a href="http://www.exoplatform.com/portal/public/en/product/ecm/overview">voir sur le site pour plus de détails</a>)<br />
- eXo WCM 1.0 (Web Content Managment) est un produit très intéressant de gestion de sites Internet. Il permet aux collaborateurs d&#8217;une entreprise d&#8217;avoir une vue synthétique pour gérer le contenu et les mises en ligne de sites Internet.<br />
- eXo CS 1.0 (Collaboration Suite) est un portail d&#8217;entreprise : agenda, courrier électronique, carnet d&#8217;adresse&#8230; nous proposons de regrouper dans un navigateur les informations de l&#8217;entreprise afin d&#8217;offrir un socle de collaboration et de partage très puissant</p>
<p> Il manque enfin le module transverse : une implémentation d&#8217;open-social, qui nous permet d&#8217;offrir une intégration avec les applications Web 2.0. Il sera possible d&#8217;exposer par exemple ton réseau d&#8217;ami&#8230;</p>
<p>Selon les personnes avec lesquels on discute, nous présentons eXo Platform d&#8217;une manière ou d&#8217;une autre.<br />
En tant que technicien, tu as vu le socle technique, mais aussi notre chemin d&#8217;intégration, ce qui nous permet de travailler ensuite avec les clients et de réaliser des produits finis.</p>
<p><strong>En tant que développeur, comment puis-je ensuite travailler avec vous afin de développer une solution sur votre socle ?</strong><br />
La notion de plate-forme te permet de rajouter tes propres composants. Tu as aussi un éditeur de gadget en ligne, ce qui ouvre le système et permet à chacun de contribuer à la plate-forme.</p>
<p><strong>Mais est-ce suffisant pour développer une application ?</strong><br />
La partie serveur sera exposée avec REST, tu retrouves ton modèle classique, avec une application Java et celle-ci discutera via JSON par exemple, avec le gadget.</p>
<p><strong>Les visiteurs sont aujourd&#8217;hui souvent sur des sites comme Facebook, MySpaces.com. Comment les faire venir ?</strong><br />
Justement, tu utiliseras la plate-forme d&#8217;hébergement eXo, tu pourras aussi gérer finement le cycle de vie de ton gadget, nous offrirons un service qui n&#8217;existe pas encore&#8230; Tes visiteurs seront sur leur page iGoogle avec une application exposée via OpenSocial par eXo Platform. Tu pourras donc par exemple accéder au gadget hébergé sur la plate-forme eXo&#8230;.<br />
Nous offrons une version un peu plus entreprise pour gérer ce cycle de vie. C&#8217;est adapté aux entreprises qui cherchent à ouvrir leurs services.<br />
600 millions de personnes sur OpenSocial, 180 millions chez Facebook&#8230;</p>
<p><strong>Pour revenir à l&#8217;offre hébergée, je te présente du code normalisé pour qu&#8217;il fonctionne sur la plate-forme. Est-ce que je peux venir louer une partie de ta plate-forme ?</strong><br />
Pour tout ce qui est gadget, je pense que nous offrirons un point d&#8217;entrée et que tu pourras proposer tes gadgets. Les portlets par contre, sont du côté de ce que nos clients hébergent avec nos produits, et les utilisateurs de nos clients pourraient ajouter des gadgets afin d’ajouter de nouveaux services sur leur application.</p>
<p><strong>Qu’en est-il du Java content repository ?</strong><br />
Du côté du JCR nous avons aussi des chemins encore à explorer. Aujourd’hui nous stockons les données soit dans une base relationnelle, soit sur le disque lorsque celles-ci sont trop grandes. Nous travaillons afin de remplacer cette base relationnelle par la solution type <a href="http://aws.amazon.com/simpledb">Amazon SimpleDB</a>. Cependant faire travailler ce type d’application dans un Cloud demande un travail assez important. Passionnant mais cela demande du travail.<br />
La version 1.11 du JCR devrait proposer en beta ces fonctionnalités.</p>
<p>Donc à terme, Amazon EC2 pour la partie JVM, et Amazon DB à la place de clusters de MySQL. Nous serons alors prêt à segmenter pour que chaque société puisse alors utiliser une partie de nos produits.</p>
<p>Cela à l’objectif des deux années à venir.</p>
<p><strong>Il faut avoir aussi les investissements et les moyens. Par les temps qui courent, ne crains-tu pas que cela soit plus difficile ?</strong><br />
eXo Platform s’autofinance par son revenu, ce qui nous donne une liberté et donc une réactivité. Nos produits sont matures et sont sur les rails. Nos axes de dépense seront plutôt les efforts commerciaux, le travail que nous réalisons en ce moment pour aller à la rencontre de nos clients.<br />
Nous travaillons pour offrir une plate-forme de services et donc proposer à chaque client la même offre de support. Notre offre “Enterprise” répond à la gestion de versions, au cycle de vie de nos produits.</p>
<p><strong>Dimitri m’a parlé aussi des méthodes de développement et de vos outils. Sans trop en dévoiler, vous êtes vraiment bien outillé et industrialisé. J’ai eu le sentiment en effet que les projets sont sur les rails, que les équipes produisent et travaillent avec une synergie dont on rêve parfois. Il manque encore des produits ?</strong><br />
Nous sommes open-source. Dès le départ nous avons eu besoin d’outils comme des wikis, les outils d’Atlassian, la gestion des bugs. Nous travaillons sur les outils de tests d’intégration, comme Selenium  par exemple. Cependant, comme nous étions dès le départ open-source, les efforts sont logiques.</p>
<p>Cela me fait aussi penser qu’il y a vraiment un potentiel pour, par exemple, proposer une plate-forme d’hébergement à des développeurs. J’imagine en effet que nous pourrions proposer d’héberger des projets, de les compiler, de les versionner&#8230;</p>
<p><strong>Collabnet le fait déjà. Chez Reuters c’est la solution retenue pour les 3200 développeurs dans le monde. Il faudrait offrir un service SVN non ?</strong></p>
<p>En fait nous avons travaillé avec le repository maven2 “Archiva”. SVN fonctionne par dessus le protocole http, et notre JCR peut s’exposer avec des modules WebDAV. Il sera donc possible de le faire je pense.</p>
<p>J’imagine mettre dans le JCR le code source d’une part, et les artifacts compilés d’autre part. A la fois un repo SVN et un repo Maven2 par exemple. On peut alors utiliser qu’un seul serveur au lieu de deux !</p>
<p><strong>&#8230;et je vais abonder dans ton sens, car aujourd’hui il est difficile de demander à des équipes MiddleWare d’héberger et de maintenir le repository SVN et le proxy Maven2. Cela pose des soucis de budget !</strong></p>
<p>Ce n’est pas pour l’instant notre but, mais je pense que ce serait un produit que j’utiliserai.<br />
A réfléchir. Pour que cela soit intéressant il faut que l’automatisation soit poussée.</p>
<p><strong>Pour boucler avec les questions du début, quels sont les clients en France qui utilisent eXo Platform ?</strong><br />
Je ne vais pas les citer tous, mais par exemple nous travaillons avec M6. Le dernier résultat dont je suis très fier c’est le support du texte “right-to-left” pour l’arabe, l’hébreu et le persan. C’est l’un des travaux de Julien Viet depuis qu’il nous a rejoint.</p>
<p><strong>Pour terminer sur une note plus légère, quel usage de Twitter fais-tu ?</strong><br />
Deux choses : où je suis, car je voyage pas mal. Et ce que je bois <img src='http://www.touilleur-express.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Julien Viet est un spécialiste des sushis par exemple. Twitter c’est un moyen déconnecté de rester informé de ce que chacun fait.<br />
J’utilisais plus twitter lorsqu’il y avait la notification par SMS. Je dois passer par le web.<br />
Cependant en Asie je me souviens que lorsque nous twittions sur #devfest en Asie, nous<br />
avons eu des journées énormes avec beaucoup de messages échangés. Twitter est déroutant.</p>
<p><strong>Le mot de la fin ?</strong><br />
J’invite tout le monde à venir tester eXo, <a href="http://laurentbois.com/2008/11/23/deploy-a-remote-opensocial-google-gadget-made-with-gwt-in-exo">des articles</a> sur internet vous donne un guide complet pour commencer rapidement à créer vos applications. eXo Platform peut très bien faire fonctionner par exemple une application en Flex, hébergée sous la forme d’une Portlet 2.0. A part un premier souci de z-index, nous n’avons pas eu de soucis. Il est possible de faire fonctionner des technologies comme GWT ou Flex avec eXo.</p>
<p><strong>Merci Benjamin !</strong><br />
Merci Nicolas !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/01/23/exo-platform-rencontre-avec-benjamin-mestrallet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

