+++ /dev/null
-package fr.mbdx.parapheur;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.activiti.engine.delegate.DelegateExecution;
-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.client.api.FileableCmisObject;
-import org.apache.chemistry.opencmis.client.api.Folder;
-import org.apache.chemistry.opencmis.client.api.Tree;
-import org.apache.chemistry.opencmis.commons.data.ContentStream;
-import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
-import org.apache.log4j.Logger;
-
-import fr.mbdx.service.ParapheurService;
-import fr.mbdx.service.ServiceCMIS;
-
-/**
- * Tache d'initialisation du processus de signature parapheur.
- */
-public class TaskInitParapheur implements JavaDelegate {
-
- protected ServiceCMIS serviceCMIS;
-
- protected ParapheurService parapheurService;
-
- static protected Logger log = Logger.getLogger(TaskInitParapheur.class);
-
- @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 (TaskInitParapheur.class) {
-
- String contentType = null;
- String dossierTitre = null;
- String dossierId = null;
- String nodeName;
- List<String> listeAnnexes = null;
- String libelleArrete = null;
- String numeroDossier = null;
-
- final String emetteur;
- final String folderRef;
- final String typeGed;
- final String xpathSignatureXML;
- final String nodeRef;
- final Boolean signatureFin = Boolean.FALSE;
-
- // 1. ExtractParams depuis l'exécution courante
- nodeRef = (String) execution.getVariable("nodeRef");
- folderRef = (String) execution.getVariable("folderRef");
- nodeName = (String) execution.getVariable("nodeName");
- typeGed = (String) execution.getVariable("typeGed");
- emetteur = (String) execution.getVariable("emetteur");
- xpathSignatureXML = (String) execution.getVariable("xpathSignatureXML");
-
- // 2. Traitement d'initialisation
- log.debug("Initialisation du processus de signature parapheur pour le document " + nodeRef);
- final AlfrescoDocument doc;
- try {
- // Récupération du contenu du noeud Alfresco
- if (nodeRef != null) {
- serviceCMIS.createSession();
-
- doc = serviceCMIS.getDocument(nodeRef);
-
- ContentStream contentStream = doc.getContentStream();
- // InputStream inputStream = contentStream.getStream();
- // contentValue = Tools.extract(inputStream);
- contentType = contentStream.getMimeType();
-
- if (nodeName == null) {
- nodeName = doc.getName();
- }
-
- // Si nécessaire on positionne l'aspect signatureParapheur + les
- // métadonnées emetteurParapheur, statutParapheur et
- // dateSignature
- if (!doc.hasAspect("P:mbdx:signatureParapheur")) {
- Map<String, Object> prop = new HashMap<String, Object>();
- prop.put("mbdx:emetteurParapheur", emetteur);
- prop.put("mbdx:statutParapheur", "EnCours");
- prop.put("mbdx:dateSignature", new java.util.GregorianCalendar());
- doc.addAspect("P:mbdx:signatureParapheur", prop);
- }
-
- // On prend le nom du fichier après avoir enlevé l'extension
- int dotIndex = nodeName.lastIndexOf('.');
- if (dotIndex >= 0) {
- dossierTitre = nodeName.substring(0, dotIndex);
- } else {
- dossierTitre = nodeName;
- }
-
- // Pour éviter une erreur parapheur du type :
- // "Requete incomplete, le type MIME 'application/pdf;charset=utf-8' de 'DocumentPrincipal' n'est pas accepte."
- // On supprime la mention éventuelle de charset dans le type
- // MIME Alfresco
- if (contentType.matches("(.*);charset=(.*)")) {
- dotIndex = contentType.lastIndexOf(';');
- contentType = contentType.substring(0, dotIndex);
- }
-
- // On prend l'ID du noeud Alfresco d'origine
- dossierId = getDossierId(doc);
-
- // On charge la liste des annexes à inclure dans l'envoi au
- // parapheur
- if (folderRef != null) {
- Folder folder = serviceCMIS.getFolder(folderRef);
- for (Tree<FileableCmisObject> t : folder.getDescendants(-1)) {
- listeAnnexes = t == null ? new ArrayList<String>() : loadAnnexes(t, doc);
- }
- }
-
- // Propriétés utilisées plus loin pour l'envoi de mail au
- // signataire d'un arrêté d'urbanisme
- if (typeGed.equals("arrete")) {
- libelleArrete = doc.getPropertyValue("cm:title");
-
- // La réf. du document est de la forme : PC033 063 13 Z0001
- // – PCMI01 - 01
- // Seule la 1e partie nous intéresse (numéro dossier
- // urbanisme)
- numeroDossier = doc.getPropertyValue("mbdx:referenceDocument");
- String[] parts = numeroDossier.split("[\u002D\u2013\u2014]");
- if (parts.length > 0) {
- numeroDossier = parts[0];
- }
- }
- }
- } catch (Exception e) {
- log.error("Erreur au cours de l'initialisation du processus de signature parapheur pour le document " + nodeRef);
- log.error(e.getMessage(), e);
- } finally {
- parapheurService.incrementEnvoisencours();
- }
-
- log.debug("Initialisation du processus de signature parapheur pour le document " + nodeRef + " -> FIN() ");
-
- // 3. setVariables après traitement
- execution.setVariable("dossierTitre", dossierTitre);
- execution.setVariable("dossierId", dossierId);
- execution.setVariable("contentType", contentType);
- execution.setVariable("contentValue", nodeRef);
- execution.setVariable("typeGed", typeGed);
- execution.setVariable("nodeName", nodeName);
- execution.setVariable("emetteur", emetteur);
- execution.setVariable("xpathSignatureXML", xpathSignatureXML);
- execution.setVariable("signatureFin", signatureFin);
- execution.setVariable("listeAnnexes", listeAnnexes);
- execution.setVariable("libelleArrete", libelleArrete);
- execution.setVariable("numeroDossier", numeroDossier);
- }
- }
-
- String getDossierId(AlfrescoDocument doc) {
- String nodeRef = doc.getId();
- int beginIndex = nodeRef.lastIndexOf("/");
- String id = beginIndex > 0 ? nodeRef.substring(beginIndex + 1) : nodeRef;
- return id + "-" + doc.getVersionLabel();
- }
-
- /**
- * Charge la liste des annexes enregistrées dans un dossier
- *
- * @param folder
- * @param documentPrincipal
- * Document principal du dossier
- * @return
- */
- private List<String> loadAnnexes(Tree<FileableCmisObject> folderTree, Document documentPrincipal) {
- final List<String> listeAnnexes = new ArrayList<String>(folderTree.getChildren().size());
- for (Tree<FileableCmisObject> t : folderTree.getChildren()) {
- FileableCmisObject item = t.getItem();
- if (item.getBaseTypeId().equals(BaseTypeId.CMIS_DOCUMENT) && !item.getId().equals(documentPrincipal.getId())) {
- listeAnnexes.add(item.getId());
- }
- }
- return listeAnnexes;
- }
-
- /**
- * @param serviceCMIS
- * the serviceCMIS to set
- */
- public void setServiceCMIS(ServiceCMIS serviceCMIS) {
- this.serviceCMIS = serviceCMIS;
- }
-
- public void setParapheurService(ParapheurService parapheurService) {
- this.parapheurService = parapheurService;
- }
-
-}