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… 