Un portlet CMS permet d'effectuer en plus des fonctionnalités classiques d'un portlet des opérations CMS, telles la consultation, la recherche ou la modification de documents Nuxeo.

Le développement d'un portlet CMS requiert :

  • des dépendances vers les API du portail et de Toutatice ;
  • du paramétrage ;
  • une implémentation.

Dépendances requises

Comme tout portlet, le projet du portlet CMS doit dépendre de l'API du portail OSIVIA, ainsi que des librairies portlet et servlet. Un projet de dépendance a été créé pour permettre de dépendre directement de toutes ces API :

<dependency>
  <groupId>org.osivia.portal</groupId>
  <artifactId>osivia-portal-dependencies</artifactId>
  <version>${osivia-portal.version}</version>
  <scope>provided</scope>
</dependency>

A noter que ce projet fourni également les dépendances vers diverses librairies utilitaires déjà présentes sur le portail, telles les librairies "commons" d'Apache.

Le projet doit dépendre de l'API CMS de Toutatice :

<dependency>
  <groupId>toutatice-portail.cms</groupId>
  <artifactId>toutatice-portail-cms-nuxeo-api</artifactId>
  <version>${toutatice-cms.version}</version>
  <scope>provided</scope>
</dependency>

Enfin, pour pouvoir communiquer avec le client "automation" de Nuxeo, le projet doit également dépendre de sa librairie :

<dependency>
  <groupId>org.nuxeo.ecm.automation</groupId>
  <artifactId>nuxeo-automation-client</artifactId>
  <version>${nuxeo-automation-client.version}</version>
  <scope>provided</scope>
</dependency>

Cette liste de dépendances peut être complétée par l'ajout de projets transverses, en fonction des besoins du développeur.

Intégration des fonctionnalités CMS

Contrairement à un portlet classique, la classe d'implémentation d'un portlet CMS doit étendre la classe fr.toutatice.portail.cms.nuxeo.api.CMSPortlet.

La gestion des erreurs Nuxeo peut être automatisée en catchant les NuxeoException et en les traitant via ErrorHandler.handleGenericErrors() . Les libellés adéquats seront alors affichés (accès interdit, document non défini ...)

Ce contrôleur est le point d'entrée à de nombreuses opérations concernant Nuxeo, comme par exemple le chargement d'un documenent ou l'exécution de commandes.

Lors du développement, il est souvent nécessaire d'accéder au contrôleur Nuxeo (classe NuxeoController) ; ce contrôleur peut alors être récupéré à partir de la requête, de la réponse et du contexte du portlet :

Au final, un portlet CMS minimaliste a le squelette suivant :

public class MyCMSPortlet extends CMSPortlet {
  
   protected void doView(RenderRequest request, RenderResponse response) throws PortletException {

      try {
         NuxeoController ctx = new NuxeoController(request, response, getPortletContext());
...

      } catch (NuxeoException e) {
         PortletErrorHandler.handleGenericErrors(response, e);
      }
}
Les méthodes init() et serveResource(), si elles sont redéfinies dans le portlet, doivent absolument appeler les mêmes méthodes de la classe CMSPortlet