AnsweredAssumed Answered

Modifica date documenti

Question asked by barcoffin on Jul 17, 2013
Latest reply on Aug 28, 2013 by barcoffin
Ciao a tutti,

             ho la necessità di caricare su una repository di Alfresco un documento impostandone però le date (di creazione e di modifica) a mio piacimento.
Basandomi su un lavoro di David Ciamberlano (e sfruttando i suoi suggerimenti) sono riuscito ad arrivare a un buon punto… ora mi serve un ultimo aiuto.
Per prima cosa ho creato una custom action (action-change-date.jar posizionata in tomcat\webapps\alfresco\WEB-INF\lib):


package org.alfresco.repo.action.executer;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;

public class ChangeDateActionExecuter extends ActionExecuterAbstractBase
{
   private NodeService nodeService;
   private BehaviourFilter policyBehaviourFilter;;
      
   public void setNodeService(NodeService nodeService)
      {
                 this.nodeService = nodeService;
      }
   public void setBehaviourFilter(BehaviourFilter policyBehaviourFilter)
   {
      this.policyBehaviourFilter = policyBehaviourFilter;
   }

   @Override
      public void executeImpl(Action action, NodeRef actionedUponNodeRef)
        {
         if (nodeService.exists(actionedUponNodeRef))
           {
         try
         {               
            // recupera le proprietà del nodo corrente
            Map<QName, Serializable> props = nodeService.getProperties(actionedUponNodeRef);
            Date modified = new SimpleDateFormat("yyyy-MM-dd").parse("2013-01-01");
            Date created = new SimpleDateFormat("yyyy-MM-dd").parse("2013-01-02");

            props.put(ContentModel.PROP_MODIFIED, modified);        
            props.put(ContentModel.PROP_CREATED, created);

            // >>>>>>>>>>>>>>> NOTA BENE
            // disabilita il behaviour dell'aspetto Autitable in modo da permettere la modifica
            policyBehaviourFilter.disableBehaviour(actionedUponNodeRef, ContentModel.ASPECT_AUDITABLE);
            nodeService.setProperties(actionedUponNodeRef, props);       
         }
         catch (InvalidNodeRefException EX_in)
         {              
            // […]
         }
         catch (ParseException EX_pe)
         {                   
            // […]
         }            
         finally
         {
            policyBehaviourFilter.enableBehaviour(actionedUponNodeRef, ContentModel.ASPECT_AUDITABLE);
         }
         }
      }

        @Override
   protected void addParameterDefinitions(List<ParameterDefinition> arg0)
   {
      // TODO Auto-generated method stub
   }
}


Ho quindi inserito il file di configurazione (action-change-date-context.xml posizionata in tomcat\shared\classes\alfresco\extension):

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
   <bean id="ChangeDateActionExecuter" class="org.alfresco.repo.action.executer.ChangeDateActionExecuter" parent="action-executer" init-method="init">
      <property name="NodeService">
              <ref bean="nodeService" />
            </property>   
           <property name="BehaviourFilter">
               <ref bean="policyBehaviourFilter" />
           </property>
   </bean>
</beans>


In questa fase ho scoperto che bisogna stare particolarmente attenti alla dichiarazione dei bean; per errore avevo scritto

   public void setPolicyBehaviourFilter(BehaviourFilter policyBehaviourFilter)

invece di

   public void setBehaviourFilter(BehaviourFilter policyBehaviourFilter)

e il risultato era che… Alfresco non mi faceva neanche accedere al sistema.
Comunque, dopo aver risolto (grazie David :) ), volendo testare il funzionamento della action, ho eseguito (nella Javascript console) il seguente script su un documento di prova:

<javascript>
var nodeRef = "workspace://SpacesStore/fd556b01-8131-45dd-8ecb-1b159f1e1f20";
var docNode = search.findNode(nodeRef);

var ac = actions.create("ChangeDateActionExecuter");

ac.execute(docNode);
</javascript>

ed effettivamente, date di creazione e modifica del documento sono cambiate.
Fino a questo momento, però, le date sono "inglobate" nel codice java mentre io vorrei riuscire a passarle come parametri; nonostante le indicazioni fornitemi da David non sono ancora riuscito a implementare la cosa e a farla funzionare sempre tramite Javascript console…
Sto cercando di arrivare alla soluzione ma… beh non disdegnerei un aiutino…

…. grazie… :)

Outcomes