Showcase


i-Parapheur : compilation

Notes personnelles lors de ma compilation / installation d'i-Parapheur. Cette documentation va vous permettre de générer les war pour pouvoir installer correctement i-Parapheur.

iParapheur est un outil permettant de gérer la transmission de documents administratif ou devant respecter un "workflow" bien défini. Il est surtout utilisé dans les collectivités territoriales (mairies par exemple) et principalement au sein de l'administration publique territoriale. Cet outil, open-source, est plutôt simple à utiliser mais si vous souhaitez l'installer à moindre frais sans passer par la société éditrice, c'est assez complexe à mettre en oeuvre. Ce projet recense les notes que j'ai accumulé pour pouvoir compiler et installer iParapheur. iParapheur est basé sur alfresco, un outil bien connu de gestion de document et de workflows.


Présentation de l'application
(tel que paramétrée pour répondre aux besoins "spécifiques" du Vice-Rectorat de la Nouvelle-Calédonie)

Présentation de l'application

Interface admin : http://votreserveur:8080/alfresco

Interface utilisateur : http://votreserveur:8080/iparapheur

iParapheur est basé sur 2 modules :
- 1 noyau tournant sous une version modifiée d'Alfresco : paraphelec
- 1 application Web en HTML5 : iparapheur
Pour information, ce projet dérive d'un projet officiel datant de 2006 du ministère des finances : parapheur
Basé sur Alfresco et nécessite donc une installation vierge et fonctionnelle d'alfresco (outil de gestion documentaire).

Compilation

Le module paraphelec a été compilé sous maven

Sous maven

  • Télécharger maven depuis le site apache http://maven.apache.org/download.cgi puis décompressez le.
  • Ajouter le dossier bin de maven dans votre PATH
  • Récupérer les sources du projet paraphelec
  • Lancez une invite de commande et positionnez vous dans le répertoire des sources de paraphelec et faites :
mvn compile 
mvn eclipse:eclipse

Cette dernière commande va vous permettre de récupérer les sources pour eclipse.

Création BDD alfresco_it

Une BDD spécifique alfresco_it est nécessaire pour paraphelec.

/opt/alfresco/mysql/bin/mysql -u root -p create database alfresco_it; 
grant all on alfresco_it.* to 'alfresco'@'localhost' with grant option; 
flush privileges;

Gestion des dépendances

Un message d'erreur apparait fréquemment, il est malheureusement lié à un problème de licences (merci oracle) :

 [ERROR] Failed to execute goal on project iparapheur-core: Could not resolve dependencies for project org.adullact.iparapheur:iparapheur-core:jar:3.4.c-SNAPSHOT: The following artifacts could not be resolved: javax.jms:jms:jar:1.1, com.sun.jdmk:jmxtools:jar:1.2.1, com.sun.jmx:jmxri:jar:1.2.1: Could not transfer artifact javax.jms:jms:jar:1.1 from/to java.net (https://maven-repository.dev.java.net/nonav/repository): No connector available to access repository java.net

Il va vous falloir soit télécharger les paquets directement et les installer soit trouver un repository proposant encore ces paquets.

 mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=jmx/jmx-1_2_1-bin/lib/jmxtools.jar

Il faut soit intégrer les jar manquants avec mvn install soit les copier dans le bon chemin de l'arborescence :

.m2\repository (du home de l'utilisateur sur lequel on lance la compilation).

Quelques infos sur :
http://stackoverflow.com/questions/4908651/the-following-artifacts-could-not-be-resolved-javax-jmsjmsjar1-1

Génération des packages (war et amp)

 mvn package

Pour le faire sans les test (unit tests, integration, etc) :

 mvn package -DskipTests=true

Vous trouverez alors les paquets (war + amp) dans le sous-répertoire "target" de iparapheur-amp.

Déploiement du War

Gestion de cglib

Avant de voir comment construire et déployer le module 'alfresco.war', nous allons nous débarasser d'un bug extrêmement frustrant :

 Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V

Cela vient de cglib-X.X.jar qui annonce des dépendances asm et fait planter hibernate (module d'accès à la base de données). Pour gérer cela, allez dans iparapheur-amp/target/parapheur.war/WEB-INF/lib/ et supprimer tous les cglib-X-X.jar :

cd iparapheur-amp/target/parapheur.war/WEB-INF/lib/ 
rm -rf cglib-2-2.jar

Important : laissez bien cglib-nodep-2-2.jar, c'est celui qui permet d'éviter ces erreurs de dépendances.

Déploiement AMP

Suivre les instructions disponibles sur :
http://docs.alfresco.com/4.0/index.jsp?topic=%2Fcom.alfresco.enterprise.doc%2Ftasks%2Famp-install.html

N'oubliez pas, au préalable, de refaire le package en supprimant le cglib et les paquets asm (ne garder que le cglib-no-dep) :

cd lib 
rm -rf asm* 
rm -rf cglib-2-2.jar

Construction amp

Allez dans iparapheur-amp/target/iparapheur-amp-3.4.c-SNAPSHOT puis :

 zip -r iparapheur-amp-3.4.c-SNAPSHOT.amp *

Puis :

 java -jar /opt/alfresco/bin/alfresco-mmt.jar install iparapheur-amp-3.4.c-SNAPSHOT.amp alfresco.war

Cela va créer le fichier alfresco.war, copiez le dans tomcat :

 cp alfresco.war /opt/alfresco/tomcat/webapps

Et c'est tout, l'application sera alors accessible sur http://@ipserveur:8080/alfresco.

Solution trouvée sur : http://community.jaspersoft.com/wiki/javalangnosuchmethoderror-orgobjectwebasmclasswriter-glassfish-and-jasperserver

Sous eclipse

Pour tout problème, suivre la doc disponible sur developpez.com Le plus simple est :

  • Installer eclipse JEE avec le module maven
  • Importer le projet Maven sous Eclipse et le compiler
  • En cas d'erreur, forcez l'importation puis essayer de rafraichir le projet

A noter : le service archiva d'adullact semble indisponible de 00h à 3h du matin heure française

Alfresco

Déploiement AMP

Les détails sont disponibles sur :
http://docs.alfresco.com/4.0/index.jsp?topic=%2Fcom.alfresco.enterprise.doc%2Ftasks%2Famp-install.html

MySQL

Intégré à Alfresco

JAVA_HOME

cd /usr/lib/jvm 
ln -s java-7-oracle default-java

Modifier les paramètres JAVA_OPTS (dans /etc/environment par exemple) :

JAVA_OPTS="-XX:MaxPermSize=256m -XX:NewSize=256m -Xms2048m " 
JAVA_OPTS="$JAVA_OPTS -Xmx3072m -Xss512K "

2048m correspond à une RAM de 2Go, modifier la en conséquence/

Pour le bundle alfresco, de même, modifier les paramètres dans /opt/alfresco/tomcat/script/ctl.sh

Installation alfresco

mkdir /opt/alfresco 
apt-get install fontconfig libsm6 libice6 libxrender1 libxext6 libxinerama1 imagemagick swftools

Pour swftools, si ubuntu 12.04 :

sudo add-apt-repository ppa:guilhem-fr/swftools 
sudo apt-get update 
sudo apt-get install swftools

Récupération du package 64bits pour installation sous Linux :

cd /root 
wget http://www2.alfresco.com/l/1234/2013-10-22/3dntj7 
chmod +x 3dntj7 
./3dntj7

On peut lancer une installation simple par défaut en veillant à bien utiliser MySQL.

Paramétrage CIFS

apt-get install samba smbfs

Paramétrage des transformations

Pour pouvoir activer les conversions de document (pdf vers texte, texte vers pdf, html vers pdf, etc), il va vous falloir installer Apache OpenOffice.
Pour ce faire, il suffit de le récupérer : http://sourceforge.net/projects/openofficeorg.mirror/files/4.0.1/binaries/fr/Apache_OpenOffice_4.0.1_Linux_x86-64_install-deb_fr.tar.gz/download
Puis l'installer :

 tar zxvf Apache_OpenOffice_4.0.1_Linux_x86-64_install-deb_fr.tar.gz

Dans /opt/alfresco/tomcat/shared/classes/alfresco-global.properties, ajoutez :

### External executable locations ### 
ooo.exe=/opt/alfresco/openoffice/program/soffice.bin 
ooo.enabled=true 
img.root=/opt/alfresco/common 
img.dyn=${img.root}/lib 
img.exe=${img.root}/bin/convert 
swf.exe=/opt/alfresco/common/bin/pdf2swf 
jodconverter.enabled=true 
jodconverter.officeHome=/opt/alfresco/openoffice jodconverter.portNumbers=8101

Configuration du mail

Dans /opt/alfresco/tomcat/shared/classes/alfresco-global.properties, ajoutez les informations de votre serveur de courriel :

### MAIL CONFIG ### 
mail.host=mail.test.fr
mail.port=25 
mail.from.default=iparapheur@test.fr 
mail.smtp.auth=false 
mail.username=alfresco
#Bug v3.4.c le auth est obligatoire 
mail.password=alfreso 
#Bug v3.4.c le auth est obligatoire 
mail.encoding=UTF-8 
mail.debug=false

Puis dans /opt/alfresco/tomcat/shared/classes/alfresco/extension/subsystems/email/OutboundSMTP/outboundSMTP-context.xml :

 
 
 
 ${mail.host}  
 ${mail.port}  
 ${mail.protocol}  
 ${mail.username}  
 ${mail.password}  
 ${mail.encoding}  
 
 
${mail.smtp.auth} 
${mail.debug} 
${mail.smtps.auth} 
${mail.smtps.starttls.enable} 
 
 
 

Problème liens dans email

De base, les liens dans les emails renvoient vers la plateforme de démonstration du iParapheur. Pour modifier ce comportement, au démarrage de tomcat, ajoutez dans JAVA_OPTS :

-Dparapheur.mail.baseUrl=parapheur.test.fr:8080/alfresco

Ajoutez dans tomcat/shared/classes/iparapheur-global.properties:

 parapheur.mail.baseUrl=parapheur.test.fr:8080/alfresco

Interfaçage avec LDAP

Dans /opt/alfresco/tomcat/shared/classes/alfresco-global.properties, ajoutez :

### Config LDAP 
authentication.chain=alfrescoNtlm1:alfrescoNtlm,ldap1:ldap

Puis créez l'arborescence et le nouveau fichier /opt/alfresco/tomcat/shared/classes/alfresco/extension/subsystems/Authentication/ldap/ldap1/ldap-authentication.properties :

ldap.authentication.active=true 
# Base DN containing users
ldap.authentication.userNameFormat=
# The URL to connect to the LDAP server 
ldap.authentication.java.naming.provider.url=ldap://ldap.test.fr:389 
# The authentication mechanism to use 
ldap.authentication.java.naming.security.authentication=simple 
ldap.synchronization.active=true 
ldap.synchronization.java.naming.security.authentication=none 
# The attribute name on people objects found in LDAP to use as the uid in Alfresco 
ldap.synchronization.userIdAttributeName=uid 
# The attribute on person objects in LDAP to map to the first name property in Alfresco 
ldap.synchronization.userFirstNameAttributeName=givenName 
# The attribute on person objects in LDAP to map to the last name property in Alfresco 
ldap.synchronization.userLastNameAttributeName=sn 
# Filter person 
ldap.synchronization.personQuery=(&(objectclass\=inetOrgPerson)) 
ldap.synchronization.userSearchBase=ou=acad,ou=domain,o=subdomain,c=fr 
# The query to select all objects that represent the groups to import. 
ldap.synchronization.groupQuery=(&(objectclass\=groupOfUniqueNames)) 
ldap.synchronization.groupSearchBase=ou=Groups,ou=acad,ou=domain,o=subdomain,c=fr 
# The attribute on person objects in LDAP to map to the email property in Alfresco 
#ldap.synchronization.userEmailAttributeName=mail 
# The attribute on person objects in LDAP to map to the organizational id property in Alfresco 
#ldap.synchronization.userOrganizationalIdAttributeName=o 
# The default home folder provider to use for people created via LDAP import 
#ldap.synchronization.defaultHomeFolderProvider=userHomesHomeFolderProvider 
# The attribute on LDAP group objects to map to the gid property in Alfrecso 
ldap.synchronization.groupIdAttributeName=cn 
# The group type in LDAP 
ldap.synchronization.groupType=groupOfUniqueNames 
# The person type in LDAP 
ldap.synchronization.personType=inetOrgPerson 
# The attribute in LDAP on group objects that defines the DN for its members 
ldap.synchronization.groupMemberAttributeName=uniqueMember

Les événements de synchro (déclencheures,etc) se gère dans le fichier default-synchronization.properties
Enfin, redémarrez alfresco.

Infos trouvées sur :
http://wiki.alfresco.com/wiki/Alfresco_Authentication_Subsystems
http://forums.alfresco.com/forum/installation-upgrades-configuration-integration/configuration/alfresco-openldap-filtering

Client Web iParapheur

Récupérez les sources git :

git clone https://adullact.net/anonscm/git/iparapheur-web/iparapheur-web.git 
git tag -l 
git checkout tags/v4.1.01_20131226

Puis compilez le package :

cd iparapheur-web 
mvn package

Récupérez le fichier war dans iparapheur-surf-webapp/target, renommez le en iparapheur.war (ou ce que vous voulez) puis copiez le dans le répertoire webapps de tomcat.

Pour information, la version la plus fonctionnelle testée n'est pas la dernière mais la 4.0.2

Création du fichier properties

Après divers bugs et analyse, un fichier properties est nécessaire, il faut créer un fichier /opt/tomcat/shared/classes/iparapheur-global.properties contenant, par exemple :

parapheur.ihm.options.password.show=true 
parapheur.ihm.options.theme.show=false 
parapheur.ihm.contact.support.text=Support technique 
parapheur.ihm.creerdossier.visibilite.defaut=public 
parapheur.ihm.creerdossier.visibilite.valeurs=public,group,confidentiel 
#parapheur.ihm.themes.directory=/var/www/themes 
parapheur.ihm.themes.disponibles=default 
parapheur.signature.applet.url=http://localhost:8080/alfresco 
parapheur.ihm.contact.support.url=http://www.adullact-projet.coop 
parapheur.ihm.options.langue.show=true 
#parapheur.ihm.options.signature.show=true

Paramètres java

Ajoutez dans /opt/alfresco/tomcat/script/ctl.sh, l'option -Dparapheur.jobs.thread.pool dans JAVA_OPTS :

daemon_tomcat() { 
export JAVA_OPTS="-XX:MaxPermSize=512m -Xms2048m -Xmx3072m -Dalfresco.home=/opt/alfresco -Dparapheur.jobs.thread.pool=2 -Dcom.sun.management.jmxremote"

La valeur est à adapter en fonction de vos besoins : plateforme (capacité) et type (qualification ou production)

Ghostscript

Le client Web utilise ghostscript pour afficher les dossiers et pouvoir y mettre des annotations visuellement :

apt-get install ghostscript

Il va vous falloir créer un lien libgs.so vers la bonne librairie ghostscript de votre système, par exemple :

cd /usr/lib/ 
ln -s libgs.so.9 libgs.so

Normalement cela devrait permettre à l'applet de fonctionner correctement.

Ajout des fonts

Dans /opt/iParapheur, il faut ajouter les fonts (facilement trouvable sur Internet) :

 arial_black.ttf arial.ttf verdanab.ttf verdanai.ttf verdana.ttf

Modification des sources

Case "Signature papier" cochée par défaut. Dans /opt/alfresco/tomcat/webapps/iparapheur/javascript/nouveau-dossier.js modification de la fonction affichageSignaturePapier (à la ligne 77) :

77  function affichageSignaturePapier(masquer) {
 78     if (masquer === "true") {
 79         $("#signature-papier-ck").parents().eq(2).hide();
 80     } else {
 81         $("#signature-papier-ck").parents().eq(2).show();
 82     }   
 83     $("#signature-papier-ck").prop("checked", true);
 84 }

Possibilité ajout dossier sans document attaché Dans /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/lib/iparapheur-mobile-webscripts-3.4.c-SNAPSHOT.jar. Fichier addDocument.post.js :

var rules = {
    "dossier":{"typeOf":"string"},

Au lieu de :

var rules = {
    "dossier":{"typeOf":"string", "isValid":is_valid_nodeRef()},

Divers

Présentation générique :
http://adullact-projet.coop/index.php/libriciels/iparapheur
http://adullact-projet.coop/images/stories/pdf/fiche_version_iparapheur_4.1.pdf
Démonstration :
http://demos.adullact.org/index.php?2006/09/05/25-parapheur-atolcd
Version Alfresco installée :
http://wiki.alfresco.com/wiki/Community_file_list_3.4.c
Sources informations pour iParapheur :
http://faq.adullact.org/index.php?2010/09/29/40-prerequis-pour-une-installation-du-parapheur-electronique
http://share.pdfonline.com/3f8f56bcdbe44394a3e518df14ba7d0e/20130530-CR-install-iparapheur-v4-cg71.pdf
Sources informations pour alfresco :
http://www.jtouzi.net/installation-de-alfresco-4-mysql-ubuntu-server-1204/

Variables existantes

A mettre dans tomcat/shared/classes/iparapheur-global.properties (testé) et parapheur-config.properties (non testé, dans tomcat/shared/classes/alfresco/extension/module/parapheur/conf ?) :

parapheur.ihm.options.password.show=true
parapheur.ihm.options.theme.show=false
parapheur.ihm.contact.support.text=Support technique
parapheur.ihm.creerdossier.visibilite.defaut=public
parapheur.ihm.creerdossier.visibilite.valeurs=public,group,confidentiel
parapheur.ihm.themes.directory=/var/www/themes
parapheur.ihm.themes.disponibles=default
parapheur.signature.applet.url=http://parapheur.test.fr:8080/alfresco
parapheur.mail.baseUrl=parapheur.test.fr:8080/alfresco
parapheur.ihm.contact.support.url=http://www.adullact-projet.coop
parapheur.ihm.options.langue.show=true
parapheur.ihm.options.signature.show=true
parapheur.signature.applet.url=http://parapheur.test.fr:9090/parapheur
parapheur.mail.from=iparapheur@test.fr
parapheur.mail.objet.prefixe=""
parapheur.mail.targetVersion=3
parapheur.archive.ttfVerda.location=/opt/iParapheur/verdanai.ttf
parapheur.archive.iccprofile.location=/opt/iParapheur/srgb.profile

Nécessaire ?

Rendre les sources maven compatibles avec Eclipse

Les fichiers pom.xml doivent être légèrement modifiés pour être compatible avec le plugin maven pour eclipse.
Dans iparapheur-amp/pom.xml
Ajoutez la dépendance groovy-eclipse-compiler pour maven :

org.apache.maven.plugins
maven-compiler-plugin
2.3.2

groovy-eclipse-compiler

Puis modifiez le groupId org.codehaus.groovy.maven en changeant groovy-maven par groovy-eclipse-compiler ainsi que le numéro de version :

org.codehaus.groovy
groovy-eclipse-compiler
2.7.0-01

Faites de même pour iparapheur-rules/pom.xml.

Bordereau

Le bordereau sous iParapheur se trouve dans "Configuration avancée: TdT, templates, calques, métadonnées" dans "modèles (e-mails et bordereau archive)". Vous pouvez modifier les différents modèles en utilisant la syntaxe "Freemarker Java Template engine". Par exemple, j'ai modifié le bordereau "parapheur-signataires.ftl" comme ceci :

    
    
    <!--
        @page { size: 21cm 29.7cm }
    -->

N°${dossier.properties['cm:name'][0]}${dossier.properties['cm:name'][1]}${dossier.properties['cm:name'][2]}${dossier.properties['cm:name'][3]}${dossier.properties['cm:name'][4]}${dossier.properties['cm:name'][5]}${dossier.properties['cm:name'][6]}${dossier.properties['cm:name'][7]}

<#if etapes[0].signataire??>Initié par : ${etapes[0].signataire} (${dossier.properties.creator}) - Service ${etapes[0].parapheurName}
Le : ${dossier.properties["cm:created"]?date?string("dd/MM/yyyy HH:mm:ss")}
Reçu par la direction le : <#if etapes[1].dateValidation??>${etapes[1].dateValidation?string("dd/MM/yyyy HH:mm:ss")}<#else>Pas encore reçu
Traité par la direction le : <#if etapes[1].dateValidation??>${etapes[2].dateValidation?string("dd/MM/yyyy HH:mm:ss")}<#else>Traitement non finalisé



Bordereau Transmission Parapheur
Objet : ${dossier.properties['cm:title']}

<#if etapes[0].dateValidation??> <#else> <#if etapes[last].dateValidation??> <#else> <#if statut?has_content>

Signataire

Date

Annotation

<#if etapes[0].signataire??>${etapes[0].signataire}, <#if etapes[0].delegue?has_content> <#if etapes[0].delegueName??>${etapes[0].delegueName}, par délégation de <#if etapes[0].parapheurName??><#if etapes[0].parapheurName?contains("Direction")>Direction<#else>${etapes[0].parapheurName}

<#if etapes[0].dateValidation??>${etapes[0].dateValidation?string("dd/MM/yyyy HH:mm:ss")}

<#if 0==etape_rejet> <#if etapes[0].annotation?? && etapes[0].annotation?has_content> ${etapes[0].annotation?replace('\n','
')}

Adjoint au Secrétaire Général (ASG)
Secrétaire Général (SG)
Vice-Recteur (VR)
<#if dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}typeMetier"]?contains("Retour")> <#-- Circuit retour a 1 seul etape alors que celui normal en a plusieurs, pour le bordereau retour, on veut afficher avant dernier destinataire comme destinataire final (gestion retour specifique) --> <#assign last = (etapes?size-2)/> <#else> <#assign last = (etapes?size-1)/> <#if etapes[last].signataire??>${etapes[last].signataire}, <#if etapes[last].delegue?has_content> <#if etapes[last].delegueName??>${etapes[last].delegueName}, par délégation de <#if etapes[last].parapheurName??><#if etapes[last].parapheurName?contains("Direction")>Direction<#else>${etapes[last].parapheurName}

Retour le : <#if etapes[last].dateValidation??>${etapes[last].dateValidation?string("dd/MM/yyyy HH:mm:ss")}

<#if 3==etape_rejet> <#if etapes[last].annotation?? && etapes[last].annotation?has_content> ${etapes[last].annotation?replace('\n','
')}


Réponse de la plate-forme : ${statut} <#if ackMIAT??>(Date: ${ackMIAT})

<#if etapes[1].annotation?? && etapes[1].annotation?has_content> Annotations de la direction à la réception :
${etapes[1].annotation?replace('\n','
')} <#if etapes[2].annotation?? && etapes[2].annotation?has_content> Annotations de la direction au traitement :
${etapes[2].annotation?replace('\n','
')} Observations diverses :



<#if dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}typeMetier"]?? && dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}soustypeMetier"]??> Dossier de type : ${dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}typeMetier"]} // ${dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}soustypeMetier"]}
Numéro complet du dossier : ${dossier.properties['cm:name']} <#if metadonnees?? && metadonnees?has_content>
<#setting locale="fr_FR"><#assign mdkeys = metadonnees?keys> <#list mdkeys as key><#if key?starts_with("DATE_B_")> ${key?substring(7)} : ${metadonnees[key]?string("EEEEEEEE d MMMMM yyyy (yyyy-MM-dd)")} <#if key?starts_with("DOUBLE_")> ${key?substring(7)} : ${metadonnees[key]?string(",##0.00")} <#if key?starts_with("INTEGER_")> ${key?substring(8)} : ${metadonnees[key]?string(",##0")} <#if key?starts_with("STRING_")> ${key?substring(7)} : ${metadonnees[key]}



Completed in FR on Jan 30, 2014