Mise en place de Nuxeo

La GED : Gestion Electronique de Documents

De nos jours, toute organisation se doit de met en oeuvre des moyens pour améliorer l’efficacité de ses collaborateurs et, ainsi, de maximiser l’efficience de son organisation. La gestion des connaissances, la  » veille » sont des concepts clés qu’elle doit maitriser.

A quoi sert la GED?

La GED, comme son nom l’indique, permet de gérer le cycle de vie du document, de sa création à sa suppression. La GED doit aussi fournir des outils simples et efficaces afin de retrouver un document, retrouver un maximum d’informations concernant le document (mots clefs, métadonnées, etc). Elle doit permettre de maitriser et contrôler totalement sa base documentaire afin de mettre en place une base de connaissance globale et pérenne pour l’organisation. Maitriser l’information, c’est apporter plus de réactivité à l’entreprise!

Fonctionnalités attendues

  • Créer, stocker, partager
  • Gestion des droits
  • Travailler à plusieurs
  • Indexer le contenu
  • Etablir des relations entre les documents
  • Gestion du cycle de vieGestion des workflows
  • Processus de validation
  • Archivage des versions
  • Recherche avancée

Outils : Alfresco, Nuxeo et Exo platform

En cherchant sur le Web, j’ai trouvé plusieurs produits dont 2 qui sont, selon moi, incontournable et qui répondent totalement au besoin : Alfresco et Nuxeo. Des outils opensource que j’ai donc pu tester et installer. J’en profite aussi pour parler d’Exo platform (outil français) qui se distingue des autres et qui, selon moi, va vraiment émerger dans les prochaines années, il est très complet et va vraiment au delà de la GED, il permet de gérer une bonne partie de l’infrastructure d’une organisation (plateforme virtuel, portail, GED, ordinateur virtuel avec des applications, etc).

J’ai installé et testé Alfresco sur un serveur virtuel. Ce que je peux en dire c’est qu’on peut le mettre en place rapidement (des packages existents pour ubuntu et d’autres serveurs) et qu’il est assez simple à configurer. La configuration de base permet de répondre aux besoins et plus encore, c’est un progiciel très complet et vraiment intéressant. En plus de  la Gestion Electronique de Documents (et donc de la prise en charge des fonctionnalités énumérées précédemment), il permet : l’émulation de sharepoint, la prise en charge native de Webdav, il abrite un portail orienté utilisateur (appelé share) et un autre de GED orienté administrateur (appelée alfresco), la conversion des documents à la volée vers n’importe quel format ou presque, calendrier personnel, etc. En bref, Alfresco est une solution éprouvée, fiable et efficace qui fait plus que répondre aux besoins essentiels de la GED, c’est, à mon avis, à la fois sa force et sa faiblesse car un utilisateur, pour ne pas être trop déstabilisé, veut un outil simple qui réponde le mieux à ses besoins sans en faire trop.

Avec un peu de « personnalisation », Alfresco peut vraiment être une bonne solution. Alfresco est un produit américain (Etats-Unis). Nuxeo, quant à lui, est français. C’est déjà un atout car il est soutenu par un tas d’organisations françaises qui l’utilisent quotidiennement. Lorsqu’on connait les spécificités culturelles, cela peut être non négligeable de savoir que le support peut se faire dans la langue de Molière et que l’on peut imaginer modifier le produit pour répondre à des besoins très spécifiques, il existe par exemple, un module pour les nomenclatures de la « charte marianne » pour la fonction pubique. C’est, comme Alfresco, un produit éprouvé et efficace spécialisé dans la GED et le fait bien. Il répond à 100% aux fonctionnalités énoncées précédemment. Il dispose, récemment, d’un portail personnalisable utilisant des gadgets (ou widgets) opensocial.

Nuxeo

Pourquoi Nuxeo ?

Je l’ai expliqué, en partie précédemment, synthétiquement, voici ces atouts :

Installation de Nuxeo

Un paquet pour ubuntu existe : http://doc.ubuntu-fr.org/nuxeo.

Comme indiqué sur le site officiel (http://blogs.nuxeo.com/fermigier/2010/06/new-experimental-ubuntu-packages-for-nuxeo-dm-and-dam.html), voici ce qu’il faut faire pour Ubuntu Lucid (10.04) et versions supérieures.

– Modifiez votre sources.list (/etc/apt/sources.list) comme en ajoutant ces lignes :

deb http://archive.canonical.com/ lucid partner
deb http://apt.nuxeo.org/ lucid snapshots

– Puis lancez ces commandes :

$ apt-get update
$ apt-get install nuxeo-dm-jboss

OU (mais DM et DAM ne peuvent pas être sur le même serveur à moins que vous changiez, par la suite, les ports utilisés):

$ apt-get install nuxeo-dam-jboss

DM veut dire « Document Management » (ce qui nous intéresse ici) et DAM veut dire « Digital Asset Management », un outil orienté vidéo, images et qui s’adresse plus aux entreprises de médias ou aux département marketing.

Nuxeo s’installe dans /opt/nuxeo-dm.

Il ne vous reste plus qu’à le configurer.

Fichiers de configuration

Attention : après chaque modification des fichiers de configuration vous devrez redémarrer nuxeo :

/etc/init.d/nuxeo-dm stop
/etc/init.d/nuxeo-dm start

Un fichier de configuration général se trouve dans /etc/nuxeo-dm/nuxeo.conf :

# Configuration file for Nuxeo
# See https://doc.nuxeo.com/display/NXDOC/Configuring+Nuxeo+EP
 # and https://doc.nuxeo.com/display/NXDOC/Available+Parameters+for+nuxeo.conf
 # for detailed information about the settings below
# Java ---------------------------------------------------
 #JAVA_HOME=/usr/lib/jvm/java-6-sun
 #JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
 JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dfile.encoding=UTF-8
# Nuxeo layout -------------------------------------------
 # Relative paths will be anchored at NUXEO_HOME; here are not default but recommended values
 #nuxeo.log.dir=/var/log/nuxeo
 #nuxeo.pid.dir=/var/run
 #nuxeo.data.dir=/var/lib/nuxeo
# Will regenerate config from these parameters each time the server is restarted
 nuxeo.force.generation=true
# General parameters
 nuxeo.templates=default,postgresql
 #nuxeo.bind.address=0.0.0.0
 #nuxeo.url=http://localhost:8080/nuxeo
 #org.nuxeo.ecm.contextPath=/nuxeo
#org.nuxeo.ecm.product.name=
 #org.nuxeo.ecm.product.version=
 #org.nuxeo.ecm.webapp.dashboard.mode=
# Database configuration
 nuxeo.db.name=nuxeo
 nuxeo.db.user=nuxeo
 nuxeo.db.password=nuxeo
 nuxeo.db.host=localhost
 #nuxeo.db.port=
 #nuxeo.db.min-pool-size=
 #nuxeo.db.max-pool-size=
 #nuxeo.vcs.min-pool-size=
 #nuxeo.vcs.max-pool-size=
# Mail settings (for notifications)
 nuxeo.notification.eMailSubjectPrefix="[Nuxeo]"
 mail.smtp.host=messagerie
 mail.smtp.port=25
 mail.smtp.auth=false
 #mail.smtp.username=
 #mail.smtp.password=
 [email protected]
#mailservice.user=
 #mailservice.password=
 #mail.store.protocol=
 #mail.transport.protocol=
 #mail.user=
 #mail.pop3.host=
 #mail.debug=
# OOo server config
 #jod.connection.protocol=SOCKET
 #jod.max.tasks.per.process=
 #jod.task.execution.timeout=
 #jod.task.queue.timeout=
 jod.office.home=/usr/lib/openoffice
 jod.jpipe.lib.path=/usr/lib/ure/lib
 #jod.template.profile.dir=
# OpenSocial settings
 #opensocial.gadgets.host=
 #opensocial.gadgets.port=
 #opensocial.proxy.proxySet=
 #opensocial.proxy.proxyHost=
 #opensocial.proxy.proxyPort=
 #opensocial.proxy.user=
 #opensocial.proxy.password=
# LiveEdit autoversioning will minor version at each save if setted to minor
 #org.nuxeo.ecm.platform.liveedit.autoversioning=minor
# Clustering settings
 #repository.clustering.enabled=false
 #repository.clustering.delay=1000
 # If clustering is activated, set repository.binary.store=/path/to/some/shared/folder/for/binaries
## More JVM options ------------------------------------------
# DEBUGGING ----------------------------------------------
 # Sample JPDA settings for remote socket debugging
 #JAVA_OPTS=$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
# Sample JPDA settings for shared memory debugging
 #JAVA_OPTS=$JAVA_OPTS -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_shmem,server=y,suspend=n,address=jboss
# Enable jconsole
 #JAVA_OPTS=$JAVA_OPTS -Dcom.sun.management.jmxremote=true
# Log Garbage Collector informations into a file
 #JAVA_OPTS=$JAVA_OPTS -Xloggc:$DIRNAME/../log/gc.log  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
# Use BEA JROCKIT
 #JAVA_HOME=/usr/local/jrockit-R27.4.0-jdk1.5.0_12
 #JAVA_OPTS=-server -Xms$HEAP_SIZE -Xmx$HEAP_SIZE -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000
 # Enable Jrockit Mission control
 #JAVA_OPTS=$JAVA_OPTS -Xmanagement
nuxeo.log.dir=/var/log/nuxeo-dm
 nuxeo.pid.dir=/var/run/nuxeo-dm
 nuxeo.data.dir=/var/lib/nuxeo-dm

Les autres fichiers de configuration se trouve dans /opt/nuxeo-dm (répertoire d’installation par défaut).

Dans le dossier « Deploy« , on a un dossier « nuxeo.ear« .

« nxserver » (ainsi que « nuxeo.ear« ) contient un dossier « config » qui va vous permettre d’y configurer énormément de choses (LDAP, etc).

Une partie des paramètres sont récupérées du fichier /etc/nuxeo-dm/nuxeo.conf, le fichier nuxeo.conf est donc un fichier de configuration central qui va vous permettre de paramétrer pas mal de choses. Il est donc important de bien le remplir.

Les templates vous permettent notamment de paramétrer rapidement et facilement la base postgresql.

Interfaçage avec un serveur LDAP

Le fichier principal à rajouter dans /opt/nuxeo-dm/server/default/deploy/nuxeo.ear/config doit se nommer default-ldap-users-directory-bundle.xml :

<?xml version="1.0" encoding="utf-8"?>
<component name="org.nuxeo.ecm.directory.ldap.storage.users">
<implementation class="org.nuxeo.ecm.directory.ldap.LDAPDirectoryDescriptor" />
<implementation class="org.nuxeo.ecm.directory.ldap.LDAPServerDescriptor" />
<require>org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory</require>
<!-- the groups SQL directories are required to make this bundle work -->
<require>org.nuxeo.ecm.directory.sql.storage</require>
<extension target="org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory"
point="servers"> 
 
 <!-- Configuration of a server connection
A single server declaration can point to a cluster of replicated
servers (using OpenLDAP's slapd + sluprd for instance). To leverage
such a cluster and improve availibility, please provide one
<ldapUrl/> tag for each replica of the cluster.
--> 
 <server name="default"> 
 
 <ldapUrl>ldap://ldap:389</ldapUrl> 
 <!-- Optional servers from the same cluster for failover
and load balancing:
<ldapUrl>ldap://server2:389</ldapUrl>
<ldapUrl>ldaps://server3:389</ldapUrl>
"ldaps" means TLS/SSL connection.
--> 
 
 <!-- Credentials used by Nuxeo5 to browse the directory, create
and modify entries.
Only the authentication of users (bind) use the credentials entered
through the login form if any.
--> 
 <bindDn>uid=dn,ou=machin,ou=truc,o=test,c=fr</bindDn> 
 <bindPassword>password</bindPassword> 
 </server> 
 
 </extension> 
 
 <extension target="org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory"
point="directories"> 
 
 <directory name="userDirectory"> 
 <server>default</server> 
 <schema>user</schema> 
 <idField>username</idField> 
 <passwordField>password</passwordField> 
 
 <searchBaseDn>ou=personnels,ou=machin,ou=truc,o=test,c=fr</searchBaseDn> 
 <searchClass>person</searchClass> 
 <!-- To additionally restricte entries you can add an
arbitrary search filter such as the following:
<searchFilter>(&amp;(sn=toto*)(myCustomAttribute=somevalue))</searchFilter>
Beware that "&" writes "&amp;" in XML.
--> 
 
 <!-- use subtree if the people branch is nested --> 
 <searchScope>onelevel</searchScope> 
 
 <!-- using 'subany', search will match *toto*. use 'subfinal' to
match *toto and 'subinitial' to match toto*. subinitial is the
default  behaviour--> 
 <substringMatchType>subany</substringMatchType> 
 
 <readOnly>false</readOnly> 
 
 <!-- comment <cache* /> tags to disable the cache --> 
 <!-- cache timeout in seconds --> 
 <cacheTimeout>3600</cacheTimeout> 
 
 <!-- maximum number of cached entries before global invalidation --> 
 <cacheMaxSize>1000</cacheMaxSize> 
 
 <creationBaseDn>ou=autres,ou=machin,ou=truc,o=test,c=fr</creationBaseDn> 
 <creationClass>top</creationClass> 
 <creationClass>person</creationClass> 
 <creationClass>organizationalPerson</creationClass> 
 <creationClass>inetOrgPerson</creationClass> 
 
 <rdnAttribute>uid</rdnAttribute> 
 <fieldMapping name="username">uid</fieldMapping> 
 <fieldMapping name="password">userPassword</fieldMapping> 
 <fieldMapping name="firstName">givenName</fieldMapping> 
 <fieldMapping name="lastName">sn</fieldMapping> 
 <fieldMapping name="company">o</fieldMapping> 
 <fieldMapping name="email">mail</fieldMapping> 
 <references> 
 <inverseReference field="groups" directory="groupDirectory"
dualReferenceField="members" /> 
 </references> 
 </directory>
 </extension> 
 </component>

Vous devez y renseigner le nom dns de votre serveur ldap, le port utilisé (389 en général), un nom util/mot de passe si votre serveur LDAP n’autorise pas de connexion anonyme et le DN dans lequel se trouve les utilisateurs pouvant se connecter : <searchBaseDn>ou=personnels,ou=machin,ou=truc,o=test,c=fr</searchBaseDn> et, enfin, mapper vos champs :

<fieldMapping name="username">uid</fieldMapping> 
 <fieldMapping name="password">userPassword</fieldMapping> 
 <fieldMapping name="firstName">givenName</fieldMapping> 
 <fieldMapping name="lastName">sn</fieldMapping> 
 <fieldMapping name="company">o</fieldMapping> 
 <fieldMapping name="email">mail</fieldMapping>

Un autre fichier de configuration appelé default-ldap-groups-directory-bundle.xml va vous permettre de mapper les groupes du LDAP :

<?xml version="1.0"?>
<component name="org.nuxeo.ecm.directory.ldap.storage.groups">
 <implementation
 />
 <implementation
 />
 <require>org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory</require>
<!-- the groups LDAP directory for users is required to make this bundle work -->
 <require>org.nuxeo.ecm.directory.ldap.storage.users</require>
<extension target="org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory"
 point="directories">
<directory name="groupDirectory">
<!-- Reuse the default server configuration defined for userDirectory -->
 <server>default</server>
<schema>group</schema>
 <idField>groupname</idField>
<searchBaseDn>ou=groups,ou=machin,ou=truc,o=test,c=fr</searchBaseDn>
 <searchFilter>(|(objectClass=groupOfUniqueNames)(objectClass=groupOfURLs))</searchFilter>
 <searchScope>subtree</searchScope>
<readOnly>false</readOnly>
<!-- comment <cache* /> tags to disable the cache -->
 <!-- cache timeout in seconds -->
 <cacheTimeout>3600</cacheTimeout>
<!-- maximum number of cached entries before global invalidation -->
 <cacheMaxSize>1000</cacheMaxSize>
<creationBaseDn>ou=autres,ou=machin,ou=truc,o=test,c=fr</creationBaseDn>
 <creationClass>top</creationClass>
 <creationClass>groupOfUniqueNames</creationClass>
<rdnAttribute>cn</rdnAttribute>
 <fieldMapping name="groupname">cn</fieldMapping>
<references>
<!-- LDAP reference resolve DNs embedded in uniqueMember attributes
If the target directory has no specific filtering policy, it is most
 of the time not necessary to enable the 'forceDnConsistencyCheck' policy.
Enabling this option will fetch each reference entry to ensure its
 existence in the target directory.
 -->
<ldapReference field="members" directory="userDirectory"
 forceDnConsistencyCheck="false"
 staticAttributeId="uniqueMember"
 dynamicAttributeId="memberURL" />
<ldapReference field="subGroups" directory="groupDirectory"
 forceDnConsistencyCheck="false"
 staticAttributeId="uniqueMember"
 dynamicAttributeId="memberURL" />
<inverseReference field="parentGroups"
 directory="groupDirectory" dualReferenceField="subGroups" />
</references>
</directory>
</extension>
</component>

Paramétrer les comptes administrateurs

Un autre fichier de configuration appelé default-virtual-groups-bundle.xml va vous permettre de créer des groupes virtuels. L’utilité est de rendre un ou plusieurs utilisateurs du LDAP administrateurs de la plateforme plutôt que d’utiliser le login générique Administrator ayant le mot de passe « Administrator » par défaut. Voici comment rendre l’utilisateur pmietlicki administrateur de la plateforme :

<?xml version="1.0"?>
 <component name="org.nuxeo.ecm.platform.usermanager.VirtualGroups">
 <require>org.nuxeo.ecm.platform.usermanager.UserManagerImpl</require>
<!--
 Copy the following file in $JBOSS_DIR/nuxeo.ear/config/ in order to make
 the user with id 'pmietlicki' have administration rights.
 -->
 <extension target="org.nuxeo.ecm.platform.usermanager.UserService" point="userManager">
 <userManager>
 <defaultAdministratorId>pmietlicki</defaultAdministratorId>
 <!-- Pour mettre tous les utilisateurs dans un groupe par défaut :
 <defaultGroup>members</defaultGroup>
-->
</userManager>
 </extension>
</component>

Ce fichier permet de définir un utilisateur du LDAP en tant qu’administrateur dans Nuxeo (defaultAdministratorId). Ainsi que d’affecter un groupe par défaut (members) à tous les autres utilisateurs (defaultGroup).

Basculer la plateforme sous postgresql

Il faut tout d’abord installer postgresql puis créé les bases. Vous pouvez voir l’installation et les commandes de création de la base sur http://wikisys.in.ac-montpellier.fr/index.php/Configuration_PostgreSQL et sur http://wikisys.in.ac-montpellier.fr/index.php/Configuration_PostgreSQL. Créez seulement la base, ne suivez pas la partie « configuration » de Nuxeo sur ces liens si vous avez installé nuxeo 5.4.

Création de l’utilisateur nuxeo

bash-3.2$ psql
postgres=#create user nuxeo with password 'xxxxx';
postgres=#alter ROLE nuxeo PASSWORD 'xxxxxxxx' NOSUPERUSER CREATEDB NOCREATEROLE INHERIT LOGIN;

Patch utilisation PostgreSQL 8.3 avec Nuxeo 5.2

PostgreSQL 8.3 est beaucoup plus strict que PostgreSQL 8.2 sur certaines valeurs nécessaires à la librairie Jena qui gère les relations et commentaires dans Nuxeo. Pour intégrer ces modifications, exécutez les commandes suivantes dans la console PostgreSQL en étant connecté à la base de données template1. La création des bases de données suivantes intègreront les nouvelles valeurs:

su -postgres
psql template1
template1=# CREATE FUNCTION pg_catalog.text(integer) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int4out($1));';
template1=#CREATE CAST (integer AS text) WITH FUNCTION pg_catalog.text(integer) AS IMPLICIT;
template1=#COMMENT ON FUNCTION pg_catalog.text(integer) IS 'convert integer to text';
template1=#CREATE FUNCTION pg_catalog.text(bigint) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int8out($1));';
template1=#CREATE CAST (bigint AS text) WITH FUNCTION pg_catalog.text(bigint) AS IMPLICIT;
template1=#COMMENT ON FUNCTION pg_catalog.text(bigint) IS 'convert bigint to text';

Création de la base nuxeo

postgres=#CREATE DATABASE nuxeo OWNER nuxeo ENCODING 'UTF8' TEMPLATE template1;
postgres=#GRANT ALL ON DATABASE nuxeo TO nuxeo;

Ajout de plpgsql

CREATE LANGUAGE 'plpgsql';

Configuration de Nuxeo avec la base postgresql

Depuis la version 5.4, il suffit de modifier le fichier de configuration principal « nuxeo.conf« , vous n’avez pas besoin et n’essayez pas de modifier les fichiers xml de configuration. Il suffit de mettre dans « nuxeo.conf » :

 nuxeo.templates=default,postgreql
 nuxeo.db.name=nuxeo
 nuxeo.db.user=nuxeo
 nuxeo.db.password=nuxeo
 nuxeo.db.host=localhost

Sauvegarde automatique de la base postgresql

Il faut récupérer le fichier backupPG.sh pour Nuxeo.

Il faut modifier le fichier backupPG.sh avec ses propres paramètres (nom du serveur, nom de la base, nom de l’utilisateur et chemin d’accès à JBOSS).

Il faut mettre en place du fichier caché .pgpass (pour l’utilisateur qui lance la commande de backup) :
http://wikisys.in.ac-montpellier.fr/index.php/Sauvegardes/Restaurations_BD_PostgreSQL_et_BLOB

Mise en place du cron pour l’utilisateur qui lance la commande :

00 01 * * * /home/user/sauvegardes_nuxeo/backupPG.sh backup_db > /home/user/sauvegardes_nuxeo/cronSauvNuxeo$(/bin/date +\%F_\%H).log

Mise en place du cron pour root (arrêt de nuxeo à 00h00 et redémarrage à 04h00) :

# m h  dom mon dow   command
00 00 * * * /etc/init.d/nuxeo-dm stop
00 04 * * * /etc/init.d/nuxeo-dm start

Installation du plugin wss pour l’émulation sharepoint

Pour permettre à nuxeo d’émuler un serveur sharepoint, il existe un plugin appelé : nuxeo-platform-wss-backend-5.2.1-SNAPSHOT.jar que vous pouvez télécharger sur : https://updates.nuxeo.com/addons-snapshots/

Il suffit alors de déposer ce jar dans /opt/nuxeo-dm/server/default/deploy/nuxeo.ear/plugins et de redémarrer le serveur : /etc/init.d/nuxeo-dm restart

Accès aux dossiers partagés via le voisinage réseau

Suite à l’installation du plugin, vous allez pouvoir, pour les utilisateurs Windows, utiliser directement votre espace comme système de fichiers.
Pour ce faire, allez dans « Favoris Réseau » :

Puis « Ajouter un favori réseau » :

Puis 2 fois « Suivant » et pour l’adresse, mettre l’adresse de votre serveur nuxeo (par exemple : « http://adressedevotreserveur:8080/nuxeo »).
Mettre votre nom util/mot de passe LDAP en cochant « Enregistrer le mot de passe » (sinon il le redemande plusieurs fois) :

Le raccourci va apparaitre dans favoris réseau, vous pouvez ensuite le copier où vous le souhaitez :

Ajout de gadgets dans nuxeo

L’accès au portail montre différents gadgets opensocial prédéfinis :

J’ai voulu ajouter un gadget rss pour pouvoir rajouter des flux rss sur le portail de l’utilisateur. J’ai voulu le faire sans devoir recoder une partie de l’application ou configurer un IDE tel qu’Eclipse pour déployer les modifications sur le serveur.

Après quelques recherches, j’ai trouvé le jar où se trouve les définitions des gadgets : nuxeo-opensocial-dashboard-X.X.X-SNAPSHOT (où X.X.X représente le numéro de version tel que 5.4.1).

Pour ajouter mon gadget rss, j’ai du décompresser le jar, j’ai ajouté un dossier RSS dans le dossier gadget :

J’y ai mis le code rss.xml suivant :

<?xml version="1.0" encoding="UTF-8" ?> 
<Module> 
<ModulePrefs
title="Lecteur de flux RSS"
category="information"
description="Lecteur de flux RSS."
author="Pascal MIETLICKI"
scrolling="true"
height="145"
render_inline="required"> 
<Require feature="dynamic-height" /> 
<Require feature="opensocial-0.8" /> 
<Require feature="settitle"/> 
</ModulePrefs> 
<UserPref name="title" display_name="Title" required="false" default_value=""/> 
 
<UserPref name="feed" display_name="Flux RSS" default_value="http://www.ac-toulouse.fr/rss/rss.php?id=2"/> 
<UserPref name="contentnr" display_name="Nombre d'articles" datatype="enum" default_value="5"> 
 <EnumValue value="1" display_value="1"/> 
 <EnumValue value="2" display_value="2"/> 
 <EnumValue value="3" display_value="3"/>
 <EnumValue value="4" display_value="4"/>
 <EnumValue value="5" display_value="5"/>
 <EnumValue value="6" display_value="6"/>
 <EnumValue value="7" display_value="7"/>
 <EnumValue value="8" display_value="8"/>
 <EnumValue value="9" display_value="9"/>
 <EnumValue value="10" display_value="10"/>
 <EnumValue value="20" display_value="20"/>
 <EnumValue value="30" display_value="30"/>
 <EnumValue value="40" display_value="40"/>
 <EnumValue value="50" display_value="50"/>
 <EnumValue value="60" display_value="60"/>
 <EnumValue value="70" display_value="70"/>
 <EnumValue value="80" display_value="80"/>
 <EnumValue value="90" display_value="90"/>
 <EnumValue value="100" display_value="100"/>
</UserPref>
<UserPref name="fontsize" display_name="Taille police (pt)" datatype="enum" default_value="8">
 <EnumValue value="4" display_value="4"/>
 <EnumValue value="5" display_value="5"/>
 <EnumValue value="6" display_value="6"/>
 <EnumValue value="7" display_value="7"/>
 <EnumValue value="8" display_value="8"/>
 <EnumValue value="9" display_value="9"/>
 <EnumValue value="10" display_value="10"/>
</UserPref>
<UserPref name="titlelink" datatype="hidden" default_value="" />
 
<UserPref name="reload_fqcy" display_name="Fréquence de rafraichissement (minutes)" datatype="enum" default_value="1">
 <EnumValue value="0" display_value="0 Minutes"/>
 <EnumValue value="1" display_value="1 Minutes"/>
 <EnumValue value="2" display_value="2 Minutes"/>
 <EnumValue value="3" display_value="3 Minutes"/>
 <EnumValue value="4" display_value="4 Minutes"/>
 <EnumValue value="5" display_value="5 Minutes"/>
 <EnumValue value="6" display_value="6 Minutes"/>
 <EnumValue value="7" display_value="7 Minutes"/>
 <EnumValue value="8" display_value="8 Minutes"/>
 <EnumValue value="9" display_value="9 Minutes"/>
 <EnumValue value="10" display_value="10 Minutes"/>
</UserPref>
 
<Content type="html">
<![CDATA[
 <style type="text/css">
span {
font-size:9pt;
}
</style>
 <div id="feed_titles___MODULE_ID___" style="font-size: 9px"><center>Récupération des données...</center></div>
<script type="text/javascript">
// var DEBUG = true;
// var DEBUG = false;
// function debug() {
//     if (DEBUG && console) {
//    console.log.apply(this, arguments);
//     }
//     alert(arguments);
// }
var prefs = new _IG_Prefs(__MODULE_ID__);
feed = prefs.getString("feed");
content_nr = prefs.getInt("contentnr");
font_size = prefs.getInt("fontsize");
g_reload_fqcy = prefs.getInt("reload_fqcy");
// alert(feed + " " + content_nr + " " );
// debug(document.location.href);
function set_content(content)
{
// alert(content);
var html = "";
// alert(content.Entry[1].Summary);
// alert(content.Title);
if (prefs.getString("title") == "") {
try {
gadgets.window.setTitle("RSS : " + content.Title.substr(0,30));
} catch (err) {}
}
for(var i in content.Entry)
{
str="";
if (content.Entry[i].Summary) {
str='title="'+ content.Entry[i].Summary +'"';
}
style=' style="font-size:'+ font_size +'pt;"';
title=' title="'+_hesc(content.Entry[i].Title)+'" ';
bullet="&#187;&nbsp;";
html += '<TR><TD style="white-space:nowrap;"><span>'+bullet+'<a '+title+str+' '+style+' href="' + _hesc(content.Entry[i].Link) + '" target="_blank">'
html += _hesc(content.Entry[i].Title) + '</a></span></TD></TR>';
}
_gel("feed_titles___MODULE_ID___").innerHTML = '<TABLE border="0" cellspacing="1" cellpadding="0" width="100%">' + html + '</TABLE>';
_IG_AdjustIFrameHeight();
}
// Loading ...
str='<center>Récupération des informations du flux...</center>';
_gel("feed_titles___MODULE_ID___").innerHTML = str;
_IG_FetchFeedAsJSON(feed, set_content, content_nr, false);
_IG_AdjustIFrameHeight();
if (g_reload_fqcy != 0) {
// alert (g_reload_fqcy);
// g_reload_fqcy=1;
setTimeout('rss_reload___MODULE_ID___()', 1000*60*g_reload_fqcy);
}
function rss_reload___MODULE_ID___ () {
// alert ("reload " + g_reload_fqcy);
t = (new Date()).getTime();
_IG_FetchFeedAsJSON(feed, set_content, content_nr, false);
 setTimeout('rss_reload___MODULE_ID___()', 1000*60*g_reload_fqcy);
}
</script>
]]>
</Content>
</Module>

Puis j’ai modifié, dans le répertoire « OSGI-INF« , le fichier « gadget-contrib.xml » en ajoutant ces lignes :

<internalGadget name="rss">
 <mountPoint>/rss</mountPoint>
 <entryPoint>rss.xml</entryPoint>
 <category>gadget.category.information</category>
 <icon>rss.png</icon>
 </internalGadget>

Vous pouvez mettre dans le dossier « RSS« , une image rss.png qui apparaitra au dessus du bouton « Ajouter ».

Une fois ces modifications faites, j’ai recompressé le dossier en zip que j’ai renommé en jar. Les extensions jar n’étant ni plus ni moins que des packages zip.

Puis j’ai déposé le package jar ainsi modifié dans : /opt/nuxeo-dm/server/default/deploy/nuxeo.ear/bundles.

Enfin, j’ai redémarré le serveur pour prendre en compte les modifications : /etc/init.d/nuxeo-dm restart

Le gadget « RSS » est alors apparu dans la liste des gadgets dans l’onglet « Informations ».

Cela a permis de rajouter un gadget (ou d’en modifier) rapidement et facilement. Seulement cette modification n’est pas pérenne. En effet, à chaque mise à jour du serveur, les bundles sont écrasés par de nouveaux packages jar. Cependant, les différentes informations glanées par ci par là ne m’ont pas semblé aussi facile à mettre en oeuvre.

Il reste à voir comment faire en sorte de modifier le nom qui apparait « label.gadget.rss », il faudrait, je pense, modifier les fichiers de langues qui doivent se trouver dans nuxeo-platform-lang-X.X.X-SNAPSHOT et peut être dans d’autres jar. Si vous avez des informations à ce sujet, je suis preneur.

Quelques liens intéressants (en plus de ceux déjà cités)

http://www.esup-portail.org/display/PROJESUPECM/FAQ#FAQ-Commentr%C3%A9tablirl%27habillaged%27unworkspace%3F

http://wikisys.in.ac-montpellier.fr/index.php/Install_Liveedit