+++ /dev/null
-package fr.mbdx.parapheur;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.activiti.engine.delegate.DelegateExecution;
-import org.activiti.engine.delegate.Expression;
-import org.activiti.engine.delegate.JavaDelegate;
-import org.alfresco.cmis.client.AlfrescoDocument;
-import org.apache.chemistry.opencmis.client.api.Document;
-import org.apache.chemistry.opencmis.commons.data.ContentStream;
-import org.apache.log4j.Logger;
-
-import fr.mbdx.parapheur.client.Annexe;
-import fr.mbdx.parapheur.client.Client;
-import fr.mbdx.parapheur.client.Content;
-import fr.mbdx.parapheur.client.Dossier;
-import fr.mbdx.parapheur.client.impl.AnnexeCfxImpl;
-import fr.mbdx.parapheur.client.impl.ContentCfxImpl;
-import fr.mbdx.parapheur.client.impl.DossierCxfImpl;
-import fr.mbdx.service.ParapheurService;
-import fr.mbdx.service.ServiceCMIS;
-import fr.mbdx.service.ServicePDF;
-import fr.mbdx.util.Tools;
-
-/**
- * Tache de demande de signature au parapheur.
- *
- */
-// @Component("envoiParapheur")
-public class TaskEnvoiParapheur implements JavaDelegate {
-
- // Extensions supportées par le parapheur (sinon conversion PDF nécessaire)
- private static String[] EXTENSIONS_STANDARD = { "PDF", "TXT", "RTF", "DOC", "XLS", "PPT", "ODT", "ODS", "ODP", "JPG", "PNG", "GIF" };
-
- protected ServiceCMIS serviceCMIS = null;
-
- protected Client clientParapheur = null;
-
- protected ServicePDF servicePDF;
-
- protected ParapheurService parapheurService;
-
- static protected Logger log = Logger.getLogger(TaskEnvoiParapheur.class);
-
- private final Expression typeTechnique = null;
- private final Expression sousType = null;
- private final Expression visibilite = null;
-
- boolean isStandardExtension(String name) {
- String extension = getExtension(name);
- for (int i = 0; i < EXTENSIONS_STANDARD.length; ++i) {
- if (EXTENSIONS_STANDARD[i].equalsIgnoreCase(extension)) {
- return true;
- }
- }
- return false;
- }
-
- String getExtension(String name) {
- String ext = name;
- int dotIndex = ext.lastIndexOf('.');
- if (dotIndex >= 0) {
- ext = ext.substring(dotIndex + 1);
- }
- return ext;
- }
-
- @Override
- public void execute(DelegateExecution execution) {
-
- // Ajout instruction synchronized pour empêcher absolument que deux threads accédent
- // en même temps à ce bout de code pour éviter un deadlock du côté du parapheur
-
- synchronized (TaskEnvoiParapheur.class) {
-
- final byte[] contentValue;
- final String contentType;
-
- String nodeName = null;
- String xpathSignatureXML = null;
- byte[] visuelPdfContentValue = null;
- List<String> listeAnnexes = null;
- String parapheurPageURL = null;
- String nomSignataire = null;
- String fonctionSignataire = null;
- String codeRetour = null;
- String messageRetour = null;
- String pdfName = null;
- String pdfNodeRef = null;
-
- // 1. ExtractParams depuis l'exécution courante
- final String nodeRef = (String) execution.getVariable("nodeRef");
- final String dossierId = (String) execution.getVariable("dossierId");
- nodeName = (String) execution.getVariable("nodeName");
- contentType = (String) execution.getVariable("contentType");
-
- final AlfrescoDocument doc = serviceCMIS.getDocument(nodeRef);
- final ContentStream contentStream = doc.getContentStream();
- InputStream inputStream = contentStream.getStream();
-
- final String dossierTitre = (String) execution.getVariable("dossierTitre");
- pdfName = dossierTitre + "_impression dossier iParapheur.pdf";
- if (!isStandardExtension(nodeName)) {
- log.debug("Création du PDF de visualisation " + pdfName);
- pdfNodeRef = servicePDF.transformToPdf(nodeRef, pdfName);
- if (pdfNodeRef != null) {
- try {
- log.debug("Récupération du PDF de visualisation " + pdfNodeRef);
- AlfrescoDocument pdfDoc = serviceCMIS.getDocument(pdfNodeRef);
- inputStream = pdfDoc.getContentStream().getStream();
- visuelPdfContentValue = Tools.extract(inputStream);
- } catch (Exception e) {
- log.error(e.getMessage());
- }
- } else {
- log.warn("Le PDF de visualisation n'a pas pu être créé.");
- }
- }
-
- xpathSignatureXML = (String) execution.getVariable("xpathSignatureXML");
- listeAnnexes = (List<String>) execution.getVariable("listeAnnexes");
-
- // 2. Traitement d'envoi au parapheur
- log.info("Envoi d'une demande de signature au parapheur pour le document " + nodeRef);
- try {
- contentValue = Tools.extract(inputStream);
- if (contentValue == null) {
- throw new Exception("Aucun contenu à envoyer au parapheur pour signature !");
- }
-
- clientParapheur.setUp();
-
- Content content = new ContentCfxImpl();
- content.setType(contentType);
- content.setValue(contentValue);
-
- final Dossier dossier = new DossierCxfImpl();
- dossier.setDocumentPrincipalContent(content);
- dossier.setNomDocPrincipal(nodeName);
- dossier.setDossierID(dossierId);
- dossier.setDossierTitre(dossierTitre);
-
- String sousTypeString = (String) sousType.getValue(execution);
- String typeTechniqueString = (String) typeTechnique.getValue(execution);
- String visibiliteString = (String) visibilite.getValue(execution);
-
- log.debug("Type parapheur :" + typeTechniqueString);
- log.debug("Sous-type parapheur :" + sousTypeString);
-
- dossier.setSousType(sousTypeString);
- dossier.setTypeTechnique(typeTechniqueString);
- dossier.setVisibilite(visibiliteString);
-
- // TODO la gestion de la signature XML est à peaufiner
- // TODO cf. Doc. WSDL iParapheur, p. 12 : quid de la co-signature ???
- // TODO pourquoi renvoient-ils le fichier PES lors de la réception du dossier signé dans l'enveloppe SOAP ?
- if (nodeName.endsWith(".xml")) {
- if (xpathSignatureXML == null) {
- xpathSignatureXML = "/*[last()]";
- }
- dossier.setxPathPourSignatureXML(xpathSignatureXML);
- }
-
- log.debug("Traitement du visuel PDF si existant");
- if (visuelPdfContentValue != null) {
- log.debug("Récupération du contenu du visuel PDF");
- Content visuelPDFContent = new ContentCfxImpl();
- visuelPDFContent.setType("application/pdf");
- visuelPDFContent.setValue(visuelPdfContentValue);
- dossier.setVisuelPDFContent(visuelPDFContent);
- log.debug("Visuel PDF spécifié dans le dossier");
- }
-
- if (listeAnnexes != null && !listeAnnexes.isEmpty()) {
- log.debug("Chargement des annexes");
- dossier.setAnnexes(loadAnnexes(listeAnnexes));
- }
-
- log.debug("Création du dossier iparapheur");
- codeRetour = clientParapheur.creerDossier(dossier) ? "OK" : "KO";
- messageRetour = clientParapheur.getMessageRetour();
- log.debug("Création du dossier iparapheur -> Fin()");
-
- log.debug("Code retour de la création du dossier côté parapheur : " + codeRetour);
- log.debug("Message de retour du parapheur :" + messageRetour);
- if ("OK".equalsIgnoreCase(codeRetour)) {
- // Lecture des paramètres du dossier en passant par l'API Alfresco
- fr.mbdx.parapheur.Dossier dossierRest = parapheurService.getDossierFromName(dossierId);
- try {
- if (dossierRest == null) {
- log.error("Problème pour lire les propriétés du dossier en passant par l'API REST d'Alfresco");
- } else {
- Bureau bureau = dossierRest.getBureau();
- if (bureau == null) {
- log.error("Problème pour lire les propriétés du bureau en passant par l'API REST d'Alfresco");
- } else {
- if (bureau.getOwners().isEmpty()) {
- log.error("Aucun propriétaire n'est mentionné pour ce bureau en passant par l'API REST d'Alfresco");
- } else {
- nomSignataire = bureau.getOwners().get(0);
-
- // TODO pour le moment on écrit le nom du bureau à la place de la fonction signataire -> à extraire plutôt de
- // l'annuaire LDAP
- fonctionSignataire = bureau.getName();
- log.debug("fonction du signataire : " + fonctionSignataire);
- }
- }
- }
- } catch (Exception e) {
- log.error("Erreur au cours de la lecture des propriétés du dossier en passant par l'API REST d'Alfresco", e);
- }
-
- // Création de l'URL vers le dossier du iparapheur à signer
- log.debug("Récupération de l'url pour le dossier : " + dossierTitre + " et pour le signataire " + nomSignataire);
- if (dossierTitre != null && !dossierTitre.isEmpty() && nomSignataire != null) {
- parapheurPageURL = parapheurService.getSignaturePageURL(dossierRest);
- }
- }
-
- log.info("Demande de signature envoyée au parapheur pour le document " + nodeRef);
- } catch (Exception e) {
- log.error("Erreur au cours de la demande de signature envoyée au parapheur pour le document " + nodeRef);
- log.error(e.getMessage(), e);
- } finally {
- parapheurService.decrementEnvoisencours();
- }
- log.debug("Envoi d'une demande de signature au parapheur pour le document " + nodeRef + " -> FIN() ");
-
- // 3. setVariables
- execution.setVariable("dossierId", dossierId);
- execution.setVariable("codeRetour", codeRetour);
- execution.setVariable("messageRetour", messageRetour);
- execution.setVariable("parapheurPageURL", parapheurPageURL);
- execution.setVariable("nomSignataire", nomSignataire);
- execution.setVariable("fonctionSignataire", fonctionSignataire);
- // execution.setVariable("visuelPdfContentValue", visuelPdfContentValue);
- execution.setVariable("pdfNodeRef", pdfNodeRef);
- execution.setVariable("pdfName", pdfName);
- }
- }
-
- /**
- * Chargement des annexes du document à signer
- *
- * @return
- * @throws IOException
- */
- List<Annexe> loadAnnexes(List<String> listeAnnexes) throws IOException {
- List<Annexe> lst = new ArrayList<Annexe>();
- serviceCMIS.createSession();
- for (String id : listeAnnexes) {
- Document doc = serviceCMIS.getDocument(id);
- ContentStream contentStream = doc.getContentStream();
- InputStream inputStream = contentStream.getStream();
- byte[] value = Tools.extract(inputStream);
- String type = contentStream.getMimeType();
- Annexe annexe = new AnnexeCfxImpl();
- if (type.matches("(.*);charset=(.*)")) {
- int dotIndex = type.lastIndexOf(';');
- String encoding = type.substring(dotIndex + 9).toUpperCase();
- annexe.setEncoding(encoding);
- type = type.substring(0, dotIndex);
- }
- String name = doc.getName();
- annexe.setMimetype(type);
- annexe.setNom(name);
- Content content = new ContentCfxImpl();
- content.setType(type);
- content.setValue(value);
- annexe.setFichier(content);
- lst.add(annexe);
- }
- return lst;
- }
-
- /**
- * @param clientParapheur
- * the clientParapheur to set
- */
- public void setClientParapheur(Client clientParapheur) {
- this.clientParapheur = clientParapheur;
- }
-
- /**
- * @return the clientParapheur
- */
- public Client getClientParapheur() {
- return clientParapheur;
- }
-
- /**
- * @param serviceCMIS
- * the serviceCMIS to set
- */
- public void setServiceCMIS(ServiceCMIS serviceCMIS) {
- this.serviceCMIS = serviceCMIS;
- }
-
- /**
- * @param parapheurService
- * the parapheurService to set
- */
- public void setParapheurService(ParapheurService parapheurService) {
- this.parapheurService = parapheurService;
- }
-
- /**
- * @param servicePDF
- * the servicePDF to set
- */
- public void setServicePDF(ServicePDF servicePDF) {
- this.servicePDF = servicePDF;
- }
-}