AnsweredAssumed Answered

Action Alfresco qui crée deux versions

Question asked by gael.d on Sep 1, 2009
Bonjour,

J'ai réaliser une action Alfresco, qui récupert le numéro de version du document pour l'insérer dans le document. L'action est installé sur l'action de mise à jour, et est exécuté en tâche de fond. Lorsque je passe par le client web, tout se passe bien, j'upload mon document,  l'action est effectuée comme il faut.
Mais lorsque je passe par le webdav, à la sauvegarde du document le système créé deux versions. Par exemple :

1. J'ouvre mon document depuis le webdav, il est à la version 1.1
2. Je fais des modifications
3. j'enregistre mon document, il me créé une version 1.2 et une version 1.3, à la même date et qui ont le même contenu.

Voici le code de mon action :

// Package
package com.firm.repo.action.executer;

// Import
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

//import java.util.Date;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.content.MimetypeMap;

import org.alfresco.service.cmr.version.*;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.util.TempFileProvider;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.MarkUnsupportedException;
import org.apache.poi.hpsf.NoPropertySetStreamException;
import org.apache.poi.hpsf.PropertySet;
import org.apache.poi.hpsf.PropertySetFactory;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hpsf.UnexpectedPropertySetTypeException;
import org.apache.poi.hpsf.WritingNotSupportedException;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

//import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.Default;

/**
* PDFWatermarkActionExecuter
*/
public class PDFWatermarkActionExecuter extends ActionExecuterAbstractBase implements InitializingBean {
   
   public static final String NAME = "watermark";
    public static final String PARAM_TEXT = "watermark-text";

   public static final int PDF      = 0;
   public static final int WORD   = 1;
   
   public static String[] mimeTypes = { MimetypeMap.MIMETYPE_PDF, MimetypeMap.MIMETYPE_WORD };
   
    private ContentService contentService;
    protected NodeService nodeService;
    protected VersionService versionService;
    private ContentReader reader;
   

    /**
     *
     * @param contentService
     */
    public void setContentService(ContentService contentService)
    {
       this.contentService = contentService;
    }
   
    /**
     * Sets the node service
     *
     * @param nodeService   the node service
     */
    public void setNodeService(NodeService nodeService)
    {
        this.nodeService = nodeService;
    } 
   
    /**
     * Sets the node service
     *
     * @param nodeService   the node service
     */
    public void setVersionService(VersionService versionService)
    {
        this.versionService = versionService;
    }     

    /**
     *
     */
    public void afterPropertiesSet() throws Exception
    {
       Assert.notNull(contentService);
    }
   
    public void setContentReader(NodeRef node) {
       this.reader = contentService.getReader(node,ContentModel.PROP_CONTENT);
    }

    /**
     * Execution de l'action
     */
   @Override
    protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
    {
       // récupération de la  ref au doc
       this.setContentReader(actionedUponNodeRef);
       
       if (this.nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_VERSIONABLE) == true) {        
       
          VersionHistory vh = this.versionService.getVersionHistory(actionedUponNodeRef);
          
          Collection<Version> documentVersions = vh.getAllVersions();
             String lastRevision = this.getLastRevision(documentVersions);

           System.out.println("=======================================================================");
           System.out.println("PDFWatermarkActionExecuter => nodeUUID => " + lastRevision);
           System.out.println("=======================================================================");      
          
          int mimeValue = getMimeValue(reader.getMimetype());
          
          switch(mimeValue) {
          
             case PDF :
                this.setContentPDF(action, actionedUponNodeRef, lastRevision);
                break;
   
             case WORD:
            try {
               this.setContentWORD(actionedUponNodeRef, lastRevision);
            } catch (WritingNotSupportedException e) {
               e.printStackTrace();
            } catch (NoPropertySetStreamException e) {
               e.printStackTrace();
            } catch (MarkUnsupportedException e) {
               e.printStackTrace();
            } catch (UnexpectedPropertySetTypeException e) {
               e.printStackTrace();
            } catch (IOException e) {
               e.printStackTrace();
            }
                break;
                
             default:
                break;       
          }
       
       } else {
           System.out.println("=======================================================================");
           System.out.println("PDFWatermarkActionExecuter => pas de versioning");
           System.out.println("======================================================================="); 
       }

    }
   
   /**
    *
    * @param reader
    * @param versionLabel
    */
   private void setContentWORD(NodeRef node, String versionLabel) throws IOException,
    NoPropertySetStreamException, MarkUnsupportedException,
    UnexpectedPropertySetTypeException, WritingNotSupportedException

   {
        System.out.println("=======================================================================");
        System.out.println("PDFWatermarkActionExecuter => SetContentWord => " + reader.getContentUrl());
        System.out.println("=======================================================================");      

      File newWord = TempFileProvider.createTempFile("tmp", "watermark");
      FileOutputStream fos = new FileOutputStream(newWord);
   
        POIFSFileSystem poifs = new POIFSFileSystem(this.reader.getContentInputStream());

        DirectoryEntry dir = poifs.getRoot();
        SummaryInformation si;
        try
        {
            DocumentEntry siEntry = (DocumentEntry)dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME);
            DocumentInputStream dis = new DocumentInputStream(siEntry);
            PropertySet ps = new PropertySet(dis);
            dis.close();
            si = new SummaryInformation(ps);
        }
        catch (FileNotFoundException ex)
        {
            si = PropertySetFactory.newSummaryInformation();
        }

        si.setComments(versionLabel);
        System.out.println("Version changed to " + si.getComments() + ".");

        DocumentSummaryInformation dsi;
        try
        {
            DocumentEntry dsiEntry = (DocumentEntry) dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);
            DocumentInputStream dis = new DocumentInputStream(dsiEntry);
            PropertySet ps = new PropertySet(dis);
            dis.close();
            dsi = new DocumentSummaryInformation(ps);
        }
        catch (FileNotFoundException ex)
        {
            dsi = PropertySetFactory.newDocumentSummaryInformation();
        }

        si.write(dir, SummaryInformation.DEFAULT_STREAM_NAME);
        dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
       
        poifs.writeFilesystem(fos);
        fos.close();
       
      ContentWriter writer = contentService.getWriter(node, ContentModel.PROP_CONTENT, true);
      writer.putContent(newWord);       
   }   
   
   /**
    *
    * @param reader
    * @param versionLabel
    */
   protected void setContentPDF(Action action, NodeRef node, String versionLabel)
   {
      PdfReader pdfReader = null;
      PdfStamper stamper = null;
      try {
            pdfReader = new PdfReader(this.reader.getContentInputStream());
            File newPdf = TempFileProvider.createTempFile("tmp","watermark");
            FileOutputStream fos = new FileOutputStream(newPdf);
            stamper = new PdfStamper(pdfReader, fos);
            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
            PdfContentByte under;
            int total = pdfReader.getNumberOfPages() + 1;
            for (int i = 1; i < total; i++) {
               under = stamper.getUnderContent(i);
               under.beginText();
               under.setFontAndSize(bf, 18);
               under.setTextMatrix(0, 0.5f, -0.5f, 0, 30, 30);
               under.showText(versionLabel);
               under.endText();
            }
            stamper.close();
            ContentWriter writer = contentService.getWriter(node, ContentModel.PROP_CONTENT, true);
            writer.putContent(newPdf);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }   
   
   private String getLastRevision(Collection<Version> documentVersions)
   {
      String revision = "";

          GregorianCalendar cal = new GregorianCalendar(1980, 1, 1);
      Date lastDate = cal.getTime();
          
       for (Version version : documentVersions) {          
          if (lastDate.before(version.getCreatedDate())) {
                lastDate = version.getCreatedDate();
                revision = version.getVersionLabel();
             }
       }      
      return revision;
   }

   /**
    *
    */
    protected void addParameterDefinitions(List<ParameterDefinition> paramList)
    {
       paramList.add(new ParameterDefinitionImpl(PARAM_TEXT,DataTypeDefinition.TEXT, true, getParamDisplayLabel(PARAM_TEXT)));
    }
   
    /**
     *
     * @param str
     * @return
     */
    private int getMimeValue(String str)
    {
       int result = -1;
       
       for (int i = 0 ; i < mimeTypes.length ; i++) {
          if (str.equals(mimeTypes[i])) {
             result = i;
          }
       }
       
       return result;
    }
}

Je me demande si ce n'est pas parce que je modifie mon document word, qu'il interprète cela comme une nouvelle modification, sauf que le champs est modifié que dans la  version 1.2 et non la 1.3.

Quelqu'un à une idée ?

Merci ,

Alfresco Labs Final 3.0

Outcomes