dimanche 8 octobre 2017

Développement de Portlet Liferay avec Spring MVC



Portlet Liferay en Spring MVC


Si vous avez déjà développez des portlets avec Liferay, vous saurez probablement qu'un large choix de Frameworks est supporté par Liferay et que vous pouvez les associés avec d'autres outils pour réaliser vos portlets en toute liberté.

Parmis les Frameworks utilisé lors du développement de portlets, je cite : Struts, JSF, Vaadin, Spring.

L'article suivant va vous permettre d'utiliser l'approche Spring MVC dans la création des portlets Liferay.



Créer sous eclipse un projet Plugin Liferay :




Renseigner les informations sur votre projet surtout :

  • Build Type => Maven 

  • Active Profiles => Créer un profil maven pour votre version de Liferay 



  • Choisir le framework à utiliser pour le développement de la portlet => Spring MVC 


Voici à quoi ressemble la structure de votre projet de Portlet Spring MVC :





La version de Spring utilisé par défaut est 3.0.7, nous allons la changer pour une version plus récente 4.3.11 pour éviter des problèmes d'incompatibilité.

--------------------------------
pom.xml :
--------------------------------
<?xml version="1.0"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>HelloWorld</artifactId>
<packaging>war</packaging>
<name>HelloWorld Portlet</name>
<version>1.0.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>com.liferay.maven.plugins</groupId>
<artifactId>liferay-maven-plugin</artifactId>
<version>${liferay.maven.plugin.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>build-css</goal>
</goals>
</execution>
</executions>
<configuration>
<autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
<appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir>
<appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir>
<appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
<liferayVersion>${liferay.version}</liferayVersion>
<pluginType>portlet</pluginType>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>portal-service</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-bridges</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-taglib</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>util-java</artifactId>
<version>${liferay.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.portlet</groupId>
<artifactId>portlet-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>Liferay-v6.2-(Tomcat-7)</id>
<properties>
<liferay.version>6.2.5</liferay.version>
<liferay.maven.plugin.version>6.2.5</liferay.maven.plugin.version>
<liferay.auto.deploy.dir>D:\Liferay_Labs\Liferay6\6.2-ce-ga6\liferay-portal-tomcat-6.2-ce-ga6-20160112152609836\liferay-portal-6.2-ce-ga6\deploy</liferay.auto.deploy.dir>
<liferay.app.server.deploy.dir>D:\Liferay_Labs\Liferay6\6.2-ce-ga6\liferay-portal-tomcat-6.2-ce-ga6-20160112152609836\liferay-portal-6.2-ce-ga6\tomcat-7.0.62\webapps</liferay.app.server.deploy.dir>
<liferay.app.server.lib.global.dir>D:\Liferay_Labs\Liferay6\6.2-ce-ga6\liferay-portal-tomcat-6.2-ce-ga6-20160112152609836\liferay-portal-6.2-ce-ga6\tomcat-7.0.62\lib\ext</liferay.app.server.lib.global.dir>
<liferay.app.server.portal.dir>D:\Liferay_Labs\Liferay6\6.2-ce-ga6\liferay-portal-tomcat-6.2-ce-ga6-20160112152609836\liferay-portal-6.2-ce-ga6\tomcat-7.0.62\webapps\ROOT</liferay.app.server.portal.dir>
</properties>
</profile>
</profiles>
</project>
--------------------------------

Et voici notre Controller qui va afficher le mode VIEW de notre Portlet :
--------------------------------
PortletViewController.java
--------------------------------
package com.test;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.bind.annotation.RenderMapping;

@Controller
@RequestMapping("VIEW")
public class PortletViewController {

@RenderMapping
public String view(Model model) {
model.addAttribute("message", "Hello World Imil !");
return "HelloWorld/view";
  }

}
--------------------------------
view.jsp :
--------------------------------
<%@ page contentType="text/html" pageEncoding="UTF-8" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

This is the <b>HelloWorld</b> portlet.<br />

<h3><c:out escapeXml="true" value="${message}" /></h3>
--------------------------------

Nous allons maintenant compiler la Portlet et la déployer dans tomcat :


-----------------
log of deploy :
-----------------
[PortletHotDeployListener:492] 1 portlet for HelloWorld-1.0.0-SNAPSHOT is available for use
-----------------

Et sur l'interface de notre portail, nous allons ajouter la nouvelle portlet "HelloWorld" :



Et comme ça nous venons de créer notre première Portlet Liferay en Spring MVC.

Vous pouvez enrichir votre portlet comme vous faites souvent sur vos projets Spring MVC, et pour la couche métier il faut passer par le Service Builder de Liferay.

Et c'est ce qu'on va voir dans le prochain article : Créer une portlet Spring MVC avec Service Builder comme couche métier.


Mise en place d'un portail intranet avec Liferay 6.2


Installation et Configuration de Liferay



  • Préparation de l'environnement de développement : 
    • Assurer de l'installation de JAVA et MAVEN sur votre PC 
    • Télécharger et déziper eclipse pour Liferay (eclipse avec IDE Liferay) 
    • Télécharger et dézipper Liferay portal (Liferay Community Edition en version 6.2.5) 
  • Installation et Configuration :
Lancer votre eclipse et choisir la perspective Liferay Plugins et suivre les instruction en images pour créer votre votre server tomcat :




Choisir Liferay v6.2 Server (Tomcat 7)




Parcourir le répertoire dans lequel vous avez dézippé votre liferay ce 6.2 et choisir le dossier tomcat :



Lancer tomcat :




Attendre la fin du lancement de tomcat avec la fameuse phrase "Server StartUp" :




Le portail Liferay sera lancé automatiquement sur votre navigation sur l'adresse : http://localhost:8080

L'interface affiche la configuration basique de Liferay :



Pour configurer votre base de données, il faut cliquer sur "Change" sinon vous autorisez la configuration par défaut avec une base de données fourni par Liferay en Hypersonic.

Pour configurer votre propre base de données, vous devez remplir les champs suivants avec les informations d'authentification à votre base de données.

Ici un exemple avec une base de données PostgreSQL :




Cliquer sur "Finish Configuration" pour la création de la base de données et la mise à jour des informations du portail :




Une fois la configuration terminée, un message de succès est affiché avec le chemin du fichier portal-setup-wizard.properties qui contient les informations saisies lors de la configuration (nom du portail, admin, base de données etc) :



Pour accéder au portail, il faut valider les termes d'utilisation et choisir une question pour renforcer la sécurité de votre mot de passe :












Voilà ! Vous avez bien lancer votre portail :)






Rendez-vous dans l'article suivant pour créer votre première Portlet (Spring MVC) en Liferay ..


lundi 8 décembre 2014

Liferesco : Intégration de Liferay avec Alfresco



L’intégration des deux briques Liferay et Alfresco produit une solution de travail collaboratif qui allie la gestion électronique de documents aux portails intranet, extranet ou internet !

AVANTAGES

  • Une solution complémentaire : Liferay sert d’interface pour le portail alors qu’Alfresco va être le moteur de l’application. Les données du site sont stockées sous forme documentaire dans Alfresco, ce qui augmente fortement l’espace de stockage. 
  •  Une gestion des utilisateurs, des formulaires et un moteur de recherche uniques : la combinaison d’Alfresco et Liferay permet de profiter d’une authentification unique, d’une gestion centralisée des utilisateurs et d’un moteur de recherche qui combine sa recherche sur les éléments du portail, d’Alfresco et des applications métiers. 
  •  La gestion électronique de documents combinée à Liferay : grâce à l’intégration d’Alfresco, il est possible de classer et de définir les droits d’accès aux différents documents électroniques : l’utilisateur voit uniquement les documents qui le concernent grâce au moteur de recherche intégré.
  • Une gestion associée du contenu : Alfresco va servir de support pour tout le contenu web du portail (CMS) en créant pour chaque rubrique la structure générale et en lui associant un modèle de présentation défini. Liferay récupère les données de ce contenu Web directement dans Alfresco afin de l’afficher sur le portail.


FONCTIONNALITÉS





INTEGRATION

Liferay propose en standard deux modes d’intégration :

A.    L'intégration d'Alfresco en tant que portlets dans Liferay

Procédure :

We will be seeing here the proper way of intregrating Alfresco 4.x with Liferay 6.1 version. So, here I have given details process, How you can achive the integration.
Let’s do some few steps for integrating Alfresco 4.x with Liferay 6.1.

As we can have assumption that you might have installed the Alfresco and Liferay Tomcat bundles into separate directories. Let’s say as <ALFRESCO_HOME> and<LIFERAY_HOME>.

NOTE: If you are not using any SSO for both servers, Make sure you create a same user admin/admin in Liferay. Doing this you will have common user in both environment.

1.       You need to have different ports number for Alfresco and Liferay running on to resolve port conflicts, Say Alfresco is running on 8080 and Liferay on 5050. So, you can configure the Liferay port in Tomcat server by editing <LIFERAY_HOME>/<tomcat>/conf/server.xml

...
<Server port="5005" shutdown="SHUTDOWN">
...
<Connector port="5050" protocol="HTTP/1.1"
        connectionTimeout="20000"
         redirectPort="5443" URIEncoding="UTF-8" />
...
<Connector port="5009" protocol="AJP/1.3" redirectPort="5443" URIEncoding="UTF-8" />
...

2.       Now, You need to change the Share Loader by editing   <LIFERAY_HOME>/<tomcat>/conf/catalina.properties and locate the "shared.loader" entry and replace it with this:

shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar

These will load the alfresco custom and extension configuration with respect to the XML and other properties files. And also if you have the custom jar files.

3.       You have to enable the external authenticate services of alfresco, we can do that by editing <ALFRESCO_HOME>/tomcat/shared/classes/alfresco-global.properties and add to file.

Add the following line at the end of the file

authentication.chain=alfrescoNtlm1:alfrescoNtlm,external1:external
external.authentication.proxyUserName=

Note: Leave the value of proxyUserName blank

4.       You can deploy the share.war file in Liferay deploy folder.
Copy <ALFRESCO_HOME>/tomcat/webapps/share.war to <LIFERAY_HOME>/deploy

5.       As you set the share loader in catalina.properties inside Liferay tomcat. You need to copy the Share Loader from Alfresco to Liferay. Let copy the entire folder
<ALFRESCO_HOME>/tomcat/shared  directory to  <LIFERAY_HOME>/<tomcat>/

Note: Alfresco requirement is to copy the shared/classes/alfresco/web-extension/ directory where all the custom xml configuration files are placed, to have a common bridge between Liferay and Alfresco. So, it’s convenient task to copy entire folder.

6.        Finally you need to configure SSO, what we called as Bridge.
Create a file <LIFERAY_HOME>/<tomcat>hared/classes/alfresco/web-extension/share-config-custom.xml, and copy the below code to enable remote authenticator. shared/classes/alfresco/web-extension/share-config-custom.xml

<alfresco-config>
<!-- Overriding endpoints to reference a remote Alfresco server -->
  <config evaluator="string-compare" condition="Remote">
        <remote>
           <endpoint>                   
                              <id>alfresco-noauth</id>
               <name>Alfresco - unauthenticated access</name>
               <description>Access to Alfresco Repository WebScripts that do not require authentication</description>
               <connector-id>alfresco</connector-id>
               <endpoint-url>http://localhost:8080/alfresco/s</endpoint-url>
               <identity>none</identity>
          </endpoint>
          <endpoint>
               <id>alfresco-feed</id>
               <name>Alfresco Feed</name>
               <description>Alfresco Feed - supports basic HTTP authentication</description>
               <connector-id>http</connector-id>
               <endpoint-url>http://localhost:8080/alfresco/s</endpoint-url>
               <basic-auth>true</basic-auth>
               <identity>user</identity>
          </endpoint>
          <connector>
               <id>alfrescoCookie</id>
               <name>Alfresco Connector</name>
               <description>Connects to an Alfresco instance using cookie-based authentication</description>
               <class>org.springframework.extensions.webscripts.connector.AlfrescoConnector</class>
          </connector>
          <endpoint>
               <id>alfresco</id>
               <name>Alfresco - user access</name>
               <description>Access to Alfresco Repository WebScripts that require user authentication</description>
               <connector-id>alfrescoCookie</connector-id>
               <endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url>
               <identity>user</identity>
               <external-auth>true</external-auth>
          </endpoint>
      </remote>
  </config>
</alfresco-config>

NOTE: If you're running Alfresco's Tomcat server on a different host or port, please change the corresponding endpoint.

7.    Last but not the least, you can startup both the servers Liferay and Alfresco
8.       Now you can able to see the 3 portlets under Alfresco category in Dock bar menu | Add portlet in Liferay. Try to add the Share Document library portlet in Liferay Page.

Limitations :

1.       SSO
Pour assurer l’intégration d’Alfresco dans Liferay par le mode portlet, la mise en place d’un outil de SSO est nécessaire.

2.       Installation
Le déploiement requiert beaucoup de configuration pour assurer le fonctionnement du Share Alfresco au sein de Liferay puisque le fonctionnement repose sur ce dernier. Il est donc nécessaire de reporter toute la configuration du share dans le contexte Liferay.

3.       Réutilisabilité
Les documents gérés dans Alfresco et affichés via la portlet Share ne peuvent pas être réutilisés dans les fonctionnalités Liferay (Contenus web,…). La portlet permet uniquement la gestion du référentiel de document Alfresco.

B.     L’intégration d'Alfresco Repository à travars le Portlet "Document and Media" via CMIS 

Procédure :


Liferay propose en standard un module d’intégration de référentiel CMIS.
CMIS permet de connecter des applications comme Sharepoint, Documentum ou Alfresco en utilisant ce protocole.
 

Création du repository Alfresco dans Liferay :
Name: Alfresco Repository
Description: Alfresco Repository
Repository Type: CMIS Repository (AtomPub)





Une fois connecté le repository affiche alors les dossiers et documents présent dans Alfresco :



Les documents publiés dans Alfresco sont alors directement accessible dans Liferay. Il est également possible (en fonction des permissions) de créer ou de mettre à jour des documents à partir de Liferay.
L’utilisation d’un « repository » permet d’utiliser la fonctionnalité standard de Liferay vis-à-vis des documents : lien dans un contenu web, liste de documents.


Limitations :

1.       Gestion d’identité
Une des problématiques de l’interconnexion de deux outils est le transfert de l’identité de l’utilisateur consultant/modifiant les documents.
En standard Liferay propose d’utiliser l’identifiant et le mot de passe lors de la connexion à Alfresco via CMIS. Cela présente 3 points négatifs :
-          Il faut activer l’authentification par screenname
-          Il faut stocker le mot de passe utilisateur dans la session utilisateur (risque de sécurité).
-          Il faut disposer des mêmes informations d’authentification (identifiant/mot de passe dans les deux systèmes).
Il sera donc préférable de mettre en place un tiers de confiance (Active Directory, NTML, SSO).

2.       Métadonnées
Une des fonctionnalités majeurs d’Alfresco est la possibilité de définir un méta modèle spécifiques et ainsi de caractériser les documents publiés par l’ajout de méta données (exemple : client lié à un contrat).
Actuellement l’implémentation standard CMIS ne permet pas d’extraire les métadonnées du document. Celles-ci ne pourront pas être véhiculées et réutilisées dans Liferay.
Alfresco propose une extension à CMIS afin de permettre l’extraction des métadonnées. Il conviendra d’étendre le fonctionnement du repository Liferay pour y ajouter la gestion de l’extension Alfresco. Ces métadonnées pourraient alors être utilisées dans l’affichage des documents.

3.       AssetPublisher
Les documents accessibles via un repository CMIS ne sont pas accessibles via la portlet standard Asset Publisher.
Cette portlet permet l’affichage dynamique de contenus Liferay (Documents, Dossiers, Contenus Web) en fonction de critères de filtre.
Il conviendrait d’étendre le fonctionnement du repository CMIS pour ajouter les documents en tant qu’Asset dans Liferay.


C.     Conclusion


Il n’existe pas aujourd’hui de solution technique permettant de fournir une intégration complète entre ces 2 outils.
Le mode le plus aboutit passe par l’utilisation du protocole CMIS qu’il est possible d’étendre et compléter avec des fonctionnalités complémentaires (Asset, Tags, Catégorie) mais cela nécessitera un développement complémentaire au module existant (cf module Sharepoint pour Liferay).