Création de votre propre service de portlet

Ecrivez un service de portlet en définissant l'interface, en écrivant l'implémentation de service, en rendant le service accessible, puis en enregistrant ce dernier.

L'écriture d'un service de portlet comporte quatre étapes:

Les interfaces des fournisseurs de services peuvent être utilisées dans le cadre de l'écriture de services de portlet pour les portlets standard. L'API de portlet HCL n'est plus prise en charge à partir d'HCL Portal version 8.5.0. Vous devez convertir les portlets basés sur l'API de portlet HCL vers l'API de portlet standard. Cette rubrique décrit comment convertir des portlets créés avec l'API de portlet HCL en portlets compatibles avec l'API standard.

Définition de l'interface

Cette étape est facultative si vous voulez implémenter votre service avec interface existante. La définition d'une interface de service de portlet s'avère aussi délicate que celle d'une interface API publique. Une interface de service de portlet doit étendre l'interface PortletService définie dans le package com.ibm.portal.portlet.service. L'exemple suivant illustre une interface pour HelloWorldService :
Figure 1. Extension de l'interface PortletService

package sample.portletservice;

import java.io.IOException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import com.ibm.portal.portlet.service.PortletService;

public interface HelloService extends PortletService
{
    /** print a nice greeting */
    public void sayHello(RenderRequest request, RenderResponse response) 
           throws IOException;
}

Ecriture de l'implémentation du service

L'implémentation du service doit mettre en œuvre l'interface PortletServiceProvider du module com.ibm.portal.portlet.service.spi pour pouvoir utiliser les méthodes liées au cycle de vie du service de portlet en plus de votre interface de service. Le paramètre PortletServiceConfig de la méthode init() vous permet, par exemple, d'accéder à la configuration du service (pour plus d'informations, voir Enregistrement du service).
Figure 2. Implémentation de l'interface PortletServiceProvider


package sample.portletservice;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.prefs.Preferences;

import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import com.ibm.portal.portlet.service.spi.PortletServiceProvider;
 
public class HelloServiceImpl 
    implements HelloService, PortletServiceProvider {
    
    private String message;
        
    // called by the portal when the service is initialized        
    public void init(Preferences servicePreferences) {
        
        // read the message from the configuration, default is "Hello"
        message = servicePreferences.get("message", "Hello");
    }
        
    public void sayHello(RenderRequest request, RenderResponse response) 
                throws IOException {
        String user = request.getRemoteUser();
        if (user == null)
            // no user logged in
            user = "Stranger";
        
        PrintWriter out = response.getWriter();
        out.print(message);
        out.print(", ");
        out.print(user);            
    }

}

Adaptation du service pour le rendre accessible aux portlets HCL Digital Experience

Cette étape est facultative. Si vous voulez que votre service de portlet soit disponible pour les portlets HCL, vous devez créer une interface de service supplémentaire qui étende org.apache.jetspeed.portlet.service.PortletService et offre la même fonction.
Figure 3. Extension de l'interface PortletService pour les portlets HCL


package sample.portletservice;

import java.io.IOException;
import org.apache.jetspeed.portlet.PortletRequest;
import org.apache.jetspeed.portlet.PortletResponse;
import org.apache.jetspeed.portlet.service.PortletService;

public interface HelloServiceIBM extends PortletService {

    /** print a nice greeting */
    public void sayHello(PortletRequest request, PortletResponse response) throws IOException;

}

Vous pouvez disposer d'une seule implémentation enregistrée pour les deux interfaces et servant à les implémenter toutes les deux. Si les méthodes de service utilisent des arguments qui sont des classes ou des interfaces de l'API de portlet, les signatures de méthodes sont différentes pour les deux interfaces de services. Vous pouvez toujours utiliser une implémentation commune pour les deux interfaces à l'aide de la classe APIConverterFactory du module com.ibm.portal.portlet.apiconvert. Cette classe comprend des méthodes qui encapsulent des objets de l'API de portlet HCL, tels que PortletRequest et PortletSession, et mettent en œuvre les objets de l'API de portlet standard correspondants côté serveur, de sorte que vous puissiez réutiliser votre implémentation de service pour les portlets standard.

Figure 4. Utilisation de la classe APIConverterFactory


package sample.portletservice;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.prefs.Preferences;

import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.jetspeed.portlet.PortletRequest;
import org.apache.jetspeed.portlet.PortletResponse;

import com.ibm.portal.portlet.apiconvert.APIConverterFactory;
import com.ibm.portal.portlet.service.spi.PortletServiceProvider;
 
public class HelloServiceImpl2 
    implements HelloService, HelloServiceIBM, PortletServiceProvider {
    
    private String message;
        
    // called by the portal when the service is initialized        
    public void init(Preferences servicePreferences) {
        
        // read the message from the configuration, default is "Hello"
        message = servicePreferences.get("message", "Hello");
    }
        
    public void sayHello(RenderRequest request, RenderResponse response) 
                throws IOException {
        String user = request.getRemoteUser();
        if (user == null)
            // no user logged in
            user = "Stranger";
        
        PrintWriter out = response.getWriter();
        out.print(message);
        out.print(", ");
        out.print(user);            
    }
    
    public void sayHello(PortletRequest request, PortletResponse response) 
                throws IOException {
        sayHello (APIConverterFactory.getInstance().getRenderRequest(request),
            APIConverterFactory.getInstance().getRenderResponse(response));
    }

}

Enregistrement du service

  1. Placez toutes les classes d'implémentation et d'interface de service dans un fichier JAR.
  2. Placez le fichier JAR dans le répertoire wp_profile_root/PortalServer/config.
  3. Enregistrez le nouveau service de portlet auprès du fournisseur d'environnement de ressources WP PortletServiceRegistryService dans la console WebSphere® Integrated Solutions Console.
    • Créez une entrée pour enregistrer l'implémentation dans le répertoire JNDI. Le nom de cette entrée est jndi.service_interface et sa valeur est service_implementation. Le nom de l'interface de service entièrement qualifié peut alors être utilisé pour consulter le service.
    • Facultatif : fournissez des paramètres de configuration pour l'implémentation. Le nom de cette entrée est service_implementation.parameter et sa valeur est la valeur de paramètre requise.
  4. Redémarrez HCL pour activer les nouveaux paramètres.
Dans l'exemple suivant, HelloService est le nom du service de portlet, HelloServiceIBM est le nom de l'interface pour les portlets HCL, et le paramètre de configuration message est défini avec la valeur Greetings.
Remarque : Les deux points (:) utilisés dans les versions antérieures d'HCL pour désigner les entrées JNDI par jndi: ne sont pas pris en charge pour les fournisseurs d'environnement de ressource. Utilisez plutôt jndi..
Pour enregistrer ce service de portlet, ajoutez les noms et valeurs de propriété suivants au PortletServiceRegistryService :
Nom de la propriété Valeur
jndi.sample.portletservice.HelloService sample.portletservice.HelloServiceImpl2
sample.portletservice.HelloServiceIBM sample.portletservice.HelloServiceImpl2
sample.portletservice.HelloServiceImpl2.message Greetings
Conseil : Pour contrôler si votre service a bien été enregistré, utilisez l'outil dumpNamespace du serveur d'applications. La commande suivante, exécutée depuis le répertoire AppServer_root/bin, permet de répertorier toutes les entrées de service de portlet dans JNDI :

	dumpNamespace -port bootstrap_port -root server -startAt portletservice

A l'aide de la console WebSphere® Integrated Solutions Console, vous pouvez trouver le port bootstrap de votre serveur de portail dans la section "End Points" des paramètres pour le serveur "WebSphere_Portal".