Comment modifier le contenu de bpm_package ?

cancel
Showing results for 
Search instead for 
Did you mean: 
riogrande
Member II

Comment modifier le contenu de bpm_package ?

Bonjour à tous,

Après pas mal de galère j'arrive à quelque chose mais j'ai encore des problèmes et des questions.
Mon workflow ressemble à ça :

[img]http://img194.imageshack.us/img194/9379/workflow.png[/img]

En gros le fichier arrive, si sont statu est "Pending" il entre dans le processus de validation, sinon il en sort directement. Chose qui marche très bien.
En suite un validateur à la possibilité de modifier est d'approuver le document ou de le rejeter pour que l'initiateur corrige le document.
Je voudrais donner la possibilité au Validateur de valider directement même si le status est encore "Pending", le workflow doit le "seter" à "In" avant de terminer le flux.
Autre possibilité, si l'initiateur met le status à "In", il ne doit pas passer par le validateur.

Voilà le code :

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="afwf:workflowTest">

   <swimlane name="initiator" />

   <swimlane name="validator">
      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
         <pooledactors>#{people.getGroup('GROUP_Administrator')}</pooledactors>
      </assignment>
   </swimlane>
   
   
   <start-state name="start">
      <task name="bpm:startTask" swimlane="initiator" />
      <transition to="IsPending">
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="bpm_package" access="read" />
               <variable name="statusValue" access="read,write"/>
               <expression>
                  statusValue = bpm_package.children[0].properties["af:status"];
               </expression>
            </script>
         </action>
      </transition>
   </start-state>


   <decision name="IsPending">      
      <transition to="end" name="NoValidationNeeded">
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="statusValue" access="read" />
               <expression>
                  logger.log("No validation needed, because status is set to '" + statusValue + "' need 'Pending'");
               </expression>
            </script>
         </action>         
      </transition>
      <transition to="Validation" name="ValidationNeeded">
         <condition>#{statusValue == "Pending"}</condition>   
      </transition>
   </decision>


   <task-node name="Validation">
      <task name="afwf:validation" swimlane="validator" />
      <transition to="IsValid" name="approved"></transition>
      <transition to="Correction" name="reject"></transition>
   </task-node>


   <task-node name="Correction">
      <task name="afwf:correction" swimlane="initiator" />
      <transition to="IsPending" name="done">   
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="bpm_package" access="read" />
               <variable name="statusValue" access="read,write"/>
               <expression>
                  statusValue = bpm_package.children[0].properties["af:status"];
               </expression>
            </script>
         </action>      
      </transition>
   </task-node>


   <node name="IsValid">
      <transition to="end">
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <runas>admin</runas>
               <variable name="bpm_package" access="read" />
               <expression>
               logger.log("Is in IsValid");
                  if(bpm_package.children[0].properties["af:status"] == "Pending"){
                     bpm_package.children[0].properties["af:status"] = "In";
                     logger.log("Status set to 'In'");
                  }
               </expression>
            </script>
         </action>   
      </transition>
   </node>


   <end-state name="end">
      <event type="node-enter">
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <expression>
                  logger.log("End of the Physical Archive Validation !");
               </expression>
            </script>
         </action>
      </event>      
   </end-state>

</process-definition>


Je précis que le workflow est lancé avec un .js et cela marche très bien.

Maintenant j'ai en fait 3 problèmes (je pouvais pas tout mettre dans le titre Smiley Happy ).

1.- Après la tâche "Correction", j'ai fais une réassignation pour "statusValue", mais ça ne marche pas car ce retourne toujours vers "Validation" (et donc on ne sort pas de la boucle).
2.- "bpm_package.children[0].properties["af:status"] = "In";" n'a aucun effet et laisse la valeur à "Pending". Normal me direz-vous, car je n'ai pas mit "write" en plus de "read", le problème quand je fais ça j'obtiens une erreur :
19:46:30,375 ERROR [org.alfresco.web.ui.common.Utils] A system error happened during the operation: org.mozilla.javascript.Undefined cannot be cast to org.alfresco.repo.workflow.jbpm.JBPMNode
java.lang.ClassCastException: org.mozilla.javascript.Undefined cannot be cast to org.alfresco.repo.workflow.jbpm.JBPMNode
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.createWorkflowInstance(JBPMEngine.java:2775)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.createWorkflowPath(JBPMEngine.java:2673)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.createWorkflowTask(JBPMEngine.java:2830)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine$26.doInJbpm(JBPMEngine.java:1711)
   at org.springmodules.workflow.jbpm31.JbpmTemplate$1.doInHibernate(JbpmTemplate.java:87)
   at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
   at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:338)
   at org.springmodules.workflow.jbpm31.JbpmTemplate.execute(JbpmTemplate.java:80)
   at org.alfresco.repo.workflow.jbpm.JBPMEngine.endTask(JBPMEngine.java:1670)
   at org.alfresco.repo.workflow.WorkflowServiceImpl.endTask(WorkflowServiceImpl.java:544)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
   at org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor.invoke(AlwaysProceedMethodInterceptor.java:40)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:49)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.alfresco.repo.audit.AuditComponentImpl.auditImpl(AuditComponentImpl.java:301)
   at org.alfresco.repo.audit.AuditComponentImpl.audit(AuditComponentImpl.java:229)
   at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:69)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
   at $Proxy51.endTask(Unknown Source)
   at org.alfresco.web.bean.workflow.ManageTaskDialog.transition(ManageTaskDialog.java:390)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132)
   at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)
   at javax.faces.component.UICommand.broadcast(UICommand.java:109)
   at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
   at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171)
   at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
   at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
   at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
   at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.alfresco.web.app.servlet.AuthenticationFilter.doFilter(AuthenticationFilter.java:81)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
   at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
   at java.lang.Thread.run(Thread.java:619)

3.- Je voudrais lancer le workflow une fois que le fichier est ajouter, le problème c'est qu'il se lance juste après le fichier ait été ajouté et donc il manque les méta-données supplémentaires. Ce qui veut dire qu'un document peut-être défini comme "In" dès le début, mais passera quand même pas le Validateur. Situation qui n'est bien évidement pas souhaitable.

Si vous avez une solution même pour un seul de ces trois points, je vous en serais très reconnaissant.
13 Replies
landry_2530
Member II

Re: Comment modifier le contenu de bpm_package ?

Bonjour

Pour repondre à tes questions

1.- Après la tâche "Correction", j'ai fais une réassignation pour "statusValue",
mais ça ne marche pas car ce retourne toujours vers "Validation" (et donc on ne sort pas de la boucle).

C'est normal que vous ne sortiez jamais de la boucle. Après la tâche "Correction", vous allez
automatique à la tâche decisionnelle "IsPending" qui est faite de deux transitions dont une est
default et l'autre conditionnelle. Si vous passez toujours par la transition "Validation" ça voudrait dire
d'après la condition que la variable statusValue == "Pending". Ceci veut dire qu'à la sortie de la tâche
"Correction", l'expression
bpm_package.children[0].properties["af:status"]
vaut toujours "Pending".

Maintenant, puisque vous executez votre workflow à partir de JavaScript Workflow, alors je vous propose
de bien vérifier la gestion de la propriété af:status (Pourquoi ne pas creer une variable à vous et jouer plutot dessus) du process, car je crois le problème viens de ce que
vous faites avant de lever la main sur le Token d'execution.

Autre chose, pourquoi ne pas utiliser un decisionHandler au niveau du noeud decisionnel "IsPending" au lieu
d'utiliser  le conditionnel sur une transition. Cela vous permettrait de mieux gerer la modifiction de la variable
status qui decidement est la cause de la boucle.

2.- "bpm_package.children[0].properties["af:status"] = "In";" n'a aucun effet et laisse la valeur
à "Pending". Normal me direz-vous, car je n'ai pas mit "write" en plus de "read", le problème quand je
fais ça j'obtiens une erreur :

La mise de "write" ne garantie pas toujours que votre script s'executera avec les droits en modification. Il faudrait
déjà que l'utilisateur ait de prime à bord ce droit. Je vous propose, de creer une variable globale tempon à vous
qui jouera le role du status de votre fichier.

la vue de ceci :
org.mozilla.javascript.Undefined cannot be cast to org.alfresco.repo.workflow.jbpm.JBPMNode
me permet de te conseiller d'utiliser plutot la variable de processus équivalente pour le status du process
par exemple bpm_workflowStatus à la place de bpm_package.children[0].properties["af:status"]

Moi je travail sur le vesrion 2.9 (bon faut voir si ça s'applique à la version 3.0)

J'espère avoir été utile

Landry KOUAM KAMGA
Team Leader GED/ECM/BPM
Koossery Technology
http://www.koossery-tech.fr
riogrande
Member II

Re: Comment modifier le contenu de bpm_package ?

merci pour ces informations très fournies.

Cependant j'ai retesté mon workflow et le point 1 marche en fin de compte (je ne m'explique pas pourquoi hier ce n'était pas le cas… peut-être la fatigue).

Cela dit, votre idée du "decisionHandler" m'intéresse, c'est aussi évoqué dans le livre Alfresco Developper guide, mais il n'y a pas d'exemple. J'ai cherché un peu sur internet, mais je n'ai rien trouvé de propant. Avez-vous un exemple ?

L'idée d'utiliser "une variable globale tempon" ne semble pas mauvaise (même si je n'ai aucune idée comme mettre ceci en place) le seul problème c'est que le statut de ce fichier sera utilisé pour d'autres processus de workflow et il est important de trouver un moment de modifier le contenu du fichier comme indiqué (càd avec le workflow). Peut-être y a-t-il un moyen détourné d'y arriver ?

Sinon y a-t-il un moyen de débuter le workflow une fois toutes les informations fournies ? (par exemple en cliquant sur le bouton OK de la page des propriétés).
landry_2530
Member II

Re: Comment modifier le contenu de bpm_package ?

Bonjour

Oui j'ai un bon tutoriel (code source) que j'ai moi meme réalisé (JBPM-Alfresco) mais je ne sais par quel moyen vous l'envoyer.
sinon, l'utilisation d'un HandlerDecision est assez classique: Par exemple, dans le fichier de config jbpm de votre projet,
votre noeud de decision peut plutot resembler à ceci :

   <decision name="CheckAvailability">
      <handler class="com.koossery.tuto.decision.VerifyOrderDecisionHandler"></handler>
      <transition to="Deliver" name="trDeliver"></transition>
      <transition to="GetFromStock" name="trGetFromStock"></transition>
   </decision>

puis tu implementes ton handler. C'est dans ce handler que tu implementes le bout de code qui permettre de tirer une décision.

package com.koossery.tuto.decision;

import org.apache.log4j.Logger;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.node.DecisionHandler;

import com.koossery.tuto.util.CommonConstants;

/**
* Implementation of a decision handler whose path will be follow by our process.
* Here we use a very simple decision handler which compares two process variables
* in order to decide if there are enough good in the stock..
*
* @author Landry
*/
public class VerifyOrderDecisionHandler implements DecisionHandler {

   private Logger logger = Logger.getLogger(VerifyOrderDecisionHandler.class);

   private static final long serialVersionUID = -3976908331266033330L;

   public String decide(ExecutionContext executionContext) throws Exception {
      
      String result = null;
      try {
         String nodeName = executionContext.getContextInstance().getProcessInstance().getRootToken().getNode().getName(); 
         logger.info("You are now in node: "+nodeName);
         
         //Get the process variable name goodsOrdered representing the number of goods ordered
         Integer goodsOrdered = (Integer)executionContext. 
                         getContextInstance().getVariable(CommonConstants.PROCESS_VARIABLE_GOODSORDERED); 
         
         logger.info("Goods ordered "+goodsOrdered.intValue()); 
          
         //Get the process variable name goodInStock representing the number of goods in Stock
         Integer goodsInStock = (Integer)executionContext. 
                         getContextInstance().getVariable(CommonConstants.PROCESS_VARIABLE_GOODSINSTOCK); 
         
         logger.info("Goods in stock "+goodsInStock.intValue()); 
         
         /**
          * Here is where decision is taken.
          * If the number of goods ordered is superior to the amount in stock then return
          * GetFromStock transition name. Otherwise, return Deviser transition name.
          */
         if (goodsOrdered.intValue() > goodsInStock.intValue()) { 
            result = CommonConstants.TRANSITION_TO_GETFROMSTOCK; 
         } 
         else { 
            result = CommonConstants.TRANSITION_TO_DELIVER; 
          }
         
      } catch (Exception e) {
         String message= "Erreur DETAIL TECHNIQUE="+e.getMessage();              
         logger.error(message);
         throw e;
      }
      return result;
            
    }
   
   }

Voila!! ça peut déjà vous aider.


L'idée d'utiliser "une variable globale tempon" ne semble pas mauvaise (même si je n'ai aucune idée comme mettre ceci en place) le seul problème c'est que le statut de ce fichier sera utilisé pour d'autres processus de workflow et il est important de trouver un moment de modifier le contenu du fichier comme indiqué (càd avec le workflow). Peut-être y a-t-il un moyen détourné d'y arriver ? —————–>>>

L'intégration de Mule ESB me semble une excellente solution dans votre cas. puisque vous voulez orchestrer plusieurs processus. Une publication sera faite dans ce sens très bientot par le centre de compétence Alfresco-JBPM de mon entreprise dont je suis le Team Leader.

Déjà, je peux vous proposer d'ajouter cette propriété comme propriété de votre document (métadonnées). Ainsi, tous les processus défini sur ce document pourront l'utiliser.

Sinon y a-t-il un moyen de débuter le workflow une fois toutes les informations fournies ? (par exemple en cliquant sur le bouton OK de la page des propriétés). ———–>>> 

Oui dans une certaine mesure, vous pouvez creer une règle de gestion Alfresco pour ça.

J'espère avoir été utile
riogrande
Member II

Re: Comment modifier le contenu de bpm_package ?

Merci pour votre réponse.

En fait, pour le point 3 c'était plus simple que je pensais… au lieu de déclencher le workflow sur un nouveau document, il me suffisait de le faire sur la mise à jour d'un document ("update" à la place de "inbound"). Le fichier est crée (il se passe rien) et en suite on remplit les informations supplémentaires et là le workflow se lance car il s'agit d'une mise à jour du fichier.

Pour votre code je suis en train de regarder ça de plus près, mais je dois avouer que je ne suis pas très à mon aise avec le Java (si vous voulez m'envoyer votre exemple, je vous donne mon email par MP).

enfin pour "Mule ESB" c'est probablement une très bonne solution, mais j'ai un peu l'impression que c'est un tank pour écraser une mouche :mrgreen:
je comprends pas pourquoi faire "bpm_package.children[0].properties["af:status"] = "In";" est si compliqué et pourquoi ça ne marche pas ^^
landry_2530
Member II

Re: Comment modifier le contenu de bpm_package ?

Bonjour

Vous l'aurez.
Je pense que le forum devrait trouver un moyen de faire partager ce genre de chose à tout le monde.
riogrande
Member II

Re: Comment modifier le contenu de bpm_package ?

Je suis arrivé à un cas bizarre :?

J'ai trouvé un élément de réponse ici
http://forums.alfresco.com/en/viewtopic.php?t=10069

j'ai donc rajouté à mon code la fonction save() ce qui me donne


   <script>
      <variable name="bpm_package" access="read" />
      <expression>
         if(bpm_package.children[0].properties["af:status"] == "Pending"){
            bpm_package.children[0].properties["af:status"] = "In";
             bpm_package.children[0].save();
         }
      </expression>
   </script>

Ce qui est marrent c'est que ça marche, mais que j'ai une erreur :

14:57:53,515 ERROR [org.alfresco.repo.action.AsynchronousActionExecutionQueueImpl] Failed to execute asynchronous action: Action[ id=9a7858e3-0dc4-4752-8b3b-8e436b43cd0f, node=workspace://SpacesStore/9a7858e3-0dc4-4752-8b3b-8e436b43cd0f ]
org.alfresco.scripts.ScriptException: Failed to execute script 'workspace://SpacesStore/6eec7f56-58c6-4d2e-b68e-c34c32574c03': Access Denied.  You do not have the appropriate permissions to perform this operation.
   at org.alfresco.repo.processor.ScriptServiceImpl.executeScript(ScriptServiceImpl.java:184)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
   at org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor.invoke(AlwaysProceedMethodInterceptor.java:40)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:49)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.alfresco.repo.audit.AuditComponentImpl.auditImpl(AuditComponentImpl.java:301)
   at org.alfresco.repo.audit.AuditComponentImpl.audit(AuditComponentImpl.java:229)
   at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:69)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
   at $Proxy180.executeScript(Unknown Source)
   at org.alfresco.repo.action.executer.ScriptActionExecuter.executeImpl(ScriptActionExecuter.java:157)
   at org.alfresco.repo.action.executer.ActionExecuterAbstractBase.execute(ActionExecuterAbstractBase.java:127)
   at org.alfresco.repo.action.ActionServiceImpl.directActionExecution(ActionServiceImpl.java:592)
   at org.alfresco.repo.action.executer.CompositeActionExecuter.executeImpl(CompositeActionExecuter.java:72)
   at org.alfresco.repo.action.executer.ActionExecuterAbstractBase.execute(ActionExecuterAbstractBase.java:127)
   at org.alfresco.repo.action.ActionServiceImpl.directActionExecution(ActionServiceImpl.java:592)
   at org.alfresco.repo.action.ActionServiceImpl.executeActionImpl(ActionServiceImpl.java:529)
   at org.alfresco.repo.action.AsynchronousActionExecutionQueueImpl$ActionExecutionWrapper$1$1.execute(AsynchronousActionExecutionQueueImpl.java:369)
   at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:320)
   at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:227)
   at org.alfresco.repo.action.AsynchronousActionExecutionQueueImpl$ActionExecutionWrapper$1.doWork(AsynchronousActionExecutionQueueImpl.java:378)
   at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:437)
   at org.alfresco.repo.action.AsynchronousActionExecutionQueueImpl$ActionExecutionWrapper.run(AsynchronousActionExecutionQueueImpl.java:381)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
   at java.lang.Thread.run(Thread.java:619)
Caused by: org.alfresco.repo.security.permissions.AccessDeniedException: Access Denied.  You do not have the appropriate permissions to perform this operation.
   at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:53)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.alfresco.repo.audit.AuditComponentImpl.auditImpl(AuditComponentImpl.java:301)
   at org.alfresco.repo.audit.AuditComponentImpl.audit(AuditComponentImpl.java:229)
   at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:69)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
   at $Proxy7.getProperty(Unknown Source)
   at org.alfresco.repo.processor.ScriptServiceImpl.getScriptProcessor(ScriptServiceImpl.java:339)
   at org.alfresco.repo.processor.ScriptServiceImpl.executeScript(ScriptServiceImpl.java:175)
   … 35 more
Caused by: net.sf.acegisecurity.AccessDeniedException: Access is denied.
   at net.sf.acegisecurity.vote.AffirmativeBased.decide(AffirmativeBased.java:86)
   at net.sf.acegisecurity.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:394)
   at net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:77)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
   at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:49)
   … 46 more

Le fichier est pourtant bien modifié à "In", je comprends qu'il y a cette erreur d'une certaine manière, étant donné qu'il n'y a pas les accès en écriture sur la variable, mais à ce moment la modification ne devrait pas marcher.
riogrande
Member II

Re: Comment modifier le contenu de bpm_package ?

J'ai trouvé la source du problème, mais pas la solution. En fait le code marche parfaitement maintenant, le seul problème c'est que pendant que le workflow est utilisé (ou juste au moment ou il édit le fichier) l'"action rule" essaye de se lancer, mais comme le fichier est vérouillé par le workflow ça crée une erreur.

Edit: en fait la question est : est-il possible de savoir si un workflow est déjà lancé sur un fichier. Comme ça au lancement du script je pourrais éviter le lancer du workflow.

Sinon landry j'ai uploadé ton tuto sur mon ftp, voilà le lien
http://www.digitalmindstudio.ch/~magicrio/alfresco/tuto_simple_alfresco_workflow.zip

Par contre, j'ai pas compris l'utilité de la tâche "completed" qui n'est reliée à rien en amont.
landry_2530
Member II

Re: Comment modifier le contenu de bpm_package ?

Bonjour Gio

Oui il est possible de savoir si un workflow avancé ou simple est lancé sur un document.

Regarde la rubrique "workflows" dans le détail du document.

Pour le tuto, c'est vrai que ça fait un bail que je l'ai réalisé. Il a été volontairement fait simple.
J'y jeterais encore un coup d'oeil dès que j'ai une minute.

Cordialement
riogrande
Member II

Re: Comment modifier le contenu de bpm_package ?

heu tu peux être un peu plus précis, car j'ai quand même pas mal parcouru le Wiki et j'ai rien trouvé dans ce sens. (je m'y suis peut-être mal pris Smiley Very Happy)

Edit: ah ok, le détail du document Smiley Very Happy, bon je vais voir si j'arrive à en tirer quelques choses.