Le développement d'un portlet s'effectue sous la forme d'un projet Java de type « application web », contenant un ou plusieurs portlets.

Initialisation

Afin de faciliter l'initialisation du projet, un archétype Maven a été déployé.

La récupération de cet archétype peut être effectuée à partir de la commande :

mvn archetype:generate \
    -DarchetypeGroupId=org.osivia.portal \
    -DarchetypeArtifactId=archetype-portlet \
    -DarchetypeVersion=1.2

Vous pouvez alors modifier ou conserver les valeurs par défaut des propriétés suivantes :

  • groupId
  • artifactId
  • version
  • package
  • portalVersion

Les sources du nouveau projet sont alors créées dans le répertoire portant le nom du groupId choisi.

La configuration Maven doit impérativement être modifiée afin que l'archétype puisse être téléchargé (voir la page de configuration Maven).

Compilation et déploiement

Compilation

La compilation du projet s'effectue en se plaçant à sa racine, à l'aide de la commande suivante :

mvn clean package

Le résultat se présente sous la forme d'une archive WAR, déposée dans le répertoire target du projet.

Déploiement

Le déploiement d'une archive WAR au sein du portail s'effectue par copie de cette archive dans le répertoire /opt/portal/custom/deploy. Les opérations de déploiement, redéploiement et suppression des archives WAR sont effectives immédiatement, sans avoir à redémarrer le portail.

Vous pouvez consulter les journaux du portail à l'emplacement /var/log/portal/server.log (par défaut), afin de vérifier que le déploiement se soit bien déroulé.

Extrait du server.log

2016-06-03 12:16:00,430 INFO  [org.jboss.web.tomcat.service.TomcatDeployer] deploy, ctxPath=/hello-portlet, warUrl=.../tmp/deploy/tmp2387222316071345332hello-portlet-1.0-SNAPSHOT-exp.war/
2016-06-03 12:16:00,463 INFO  [org.osivia.portal.core.deploiement.PortletApplicationDeployment] Parsing /hello-portlet/jboss-portlet.xml

Ajout du portlet

Une fois déployé, un portlet peut être ajouté à des pages ou templates du portail.

Pour effectuer cette opération, il suffit de suivre la procédure suivante :

1/ se connecter au portail avec un profil administrateur (root / osivia)

2/ se placer sur la page d'accueil (par exemple)

3/ activer les fonctions d'édition à l'aide de l'option « Afficher les commandes d'édition » du menu d'édition

4/ ajouter un portlet à la région désirée à l'aide de son bouton d'ajout associé (par exemple dans la région col1

5/ choisir le portlet dans la liste.

Le portlet est ajouté à la suite des portlets déjà existants de la région. Il est alors possible de le configurer à l'aide des options génériques de sa fenêtre, ainsi qu'à partir de sa vue d'administration (items soulignés en rouge)

Modification #1 : lien vers un document

La modification présentée ici consiste à ajouter un lien vers un document, dont le chemin aura été défini par l'administrateur.

Modification des vues

Vue d'administration

Modifier le fichier src/main/webapp/WEB-INF/jsp/admin.jsp pour lui ajouter le champ du chemin vers le document :

<!-- Document path -->
<div class="form-group">
    <label for="${namespace}-documentPath" class="control-label col-sm-3"><op:translate key="DOCUMENT_PATH" /></label>
    <div class="col-sm-9">
        <input id="${namespace}-documentPath" name="documentPath" value="${configuration.documentPath}" class="form-control">
    </div>
</div>
Vue utilisateur

Modifier le fichier src/main/webapp/WEB-INF/jsp/view.jsp pour ajouter l'affichage d'un lien vers le document, à l'aide du tag <ttc:title /> :

<c:choose>
    <c:when test="${empty document}">
        <div class="alert alert-warning">
            <span><op:translate key="MESSAGE_DOCUMENT_NOT_FOUND" /></span>
        </div>
    </c:when>

    <c:otherwise>
        <p>
            <span><op:translate key="DOCUMENT_LABEL" /></span>
            <span><ttc:title document="${document}" icon="true" linkable="true" /></span>
        </p>
    </c:otherwise>
</c:choose>
Ressources d'internationalisation

La modification des vues précédentes a introduit de nouvelles clés d'internationalisation. Ces clés doivent être ajoutées aux fichiers src/main/resources/Resource_en.properties et src/main/resources/Resource_fr.properties pour gérer l'internationalisation en anglais et en français.

Exemple de modification du fichier Resource_fr.properties :

DOCUMENT_PATH=Chemin vers le document
MESSAGE_DOCUMENT_NOT_FOUND=Le document n''a pas \u00E9t\u00E9 trouv\u00E9.
DOCUMENT_LABEL=Document\u00A0:
Il est préférable d'utiliser les caractères Unicode à la place des caractères spéciaux, tels les caractères accentués ou les espaces insécables, afin d'éviter les incompatibilités d'affichage liés à la plateforme.

Modification du modèle

La classe Java HelloConfiguration doit évoluer pour correspondre au nouveau champ contenant le chemin du document.

Ajouter le nouveau champ :

/** Document path. */
private String documentPath;

ainsi que ses accesseurs :

/**
 * Getter for documentPath.
 * 
 * @return the documentPath
 */
public String getDocumentPath() {
    return documentPath;
}

/**
 * Setter for documentPath.
 * 
 * @param documentPath the documentPath to set
 */
public void setDocumentPath(String documentPath) {
    this.documentPath = documentPath;
}

Modification du service

Prise en compte du nouveau champ

La classe Java HelloServiceImpl, correspondant à l'implémentation du service, doit être mise à jour afin de prendre en compte le nouveau champ contenant le chemin du document.

Ajouter une nouvelle constante pour définir la propriété de fenêtre qui stockera le chemin du document :

/** Document path window property. */
private static final String DOCUMENT_PATH_WINDOW_PROPERTY = "hello.documentPath";

Modifier la méthode HelloConfiguration getConfiguration(PortalControllerContext) :

// Document path
String documentPath = window.getProperty(DOCUMENT_PATH_WINDOW_PROPERTY);
configuration.setDocumentPath(documentPath);

Modifier la méthode void saveConfiguration(PortalControllerContext, HelloConfiguration) :

// Document path
String documentPath = StringUtils.trimToNull(configuration.getDocumentPath());
window.setProperty(DOCUMENT_PATH_WINDOW_PROPERTY, documentPath);
Accès au document

Pour accéder au document à partir de son chemin, il faut créer une nouvelle méthode dans le service.

Ajouter la méthode suivante dans l'interface Java IHelloService :

/**
 * Get document.
 * 
 * @param portalControllerContext portal controller context
 * @param path document path
 * @return document
 * @throws PortletException
 */
DocumentDTO getDocument(PortalControllerContext portalControllerContext, String path) throws PortletException;

Ajouter l'implémentation de cette méthode dans la classe Java HelloServiceImpl :

/**
 * {@inheritDoc}
 */
@Override
public DocumentDTO getDocument(PortalControllerContext portalControllerContext, String path) throws PortletException {
    DocumentDTO document;

    // Nuxeo controller
    NuxeoController nuxeoController = new NuxeoController(portalControllerContext);

    if (StringUtils.isNotEmpty(path)) {
        try {
            // Nuxeo document context
            NuxeoDocumentContext documentContext = nuxeoController.getDocumentContext(path);
            // Nuxeo document
            Document nuxeoDocument = documentContext.getDoc();

            document = DocumentDAO.getInstance().toDTO(nuxeoDocument);
        } catch (NuxeoException e) {
            if (NuxeoException.ERROR_NOTFOUND == e.getErrorCode()) {
                document = null;
            } else {
                throw e;
            }
        }
    } else {
        document = null;
    }

    return document;
}

Modification du contrôleur

Le contrôleur doit être mis à jour afin de transmettre les nouveaux champs au service et de fournir le document à la vue.

Modifier la méthode de rendu void doView(RenderRequest, RenderResponse) afin d'ajouter le document à la requête :

// Document
try {
    DocumentDTO document = this.helloService.getDocument(portalControllerContext, configuration.getDocumentPath());
    request.setAttribute("document", document);
} catch (NuxeoException e) {
    PortletErrorHandler.handleGenericErrors(response, e);
}

Modifier la méthode de traitement des actions void processAction(ActionRequest, ActionResponse) afin d'enregistrer le nouveau champ d'administration :

// Document path
String documentPath = request.getParameter("documentPath");
configuration.setDocumentPath(documentPath);

Test de la modification

Relancer la procédure de compilation et de déploiement .

En retournant, dans les paramètres vous pourez saisir le chemin d'un document, par exemple /default-domain/workspaces/espace-collaboratif/actualites/6-conseils-pour-reussir-.

Vous devriez alors visualiser un lien vers le document en question