cancel
Showing results for 
Search instead for 
Did you mean: 

Comment Alfresco peut il m'aider pour ça ?

mobman02
Champ in-the-making
Champ in-the-making
Bonjour à tous,
je suis étudiant,
j'ai installé avec succès (heu, d'ailleurs j'ai plein de trucs à dire la dessus, ça s'est pas bien passé) la version Community sur un Xubuntu.

Maintenant je suis un peu perdu, et un peu d'aide serait la bienvenue  Smiley Happy

J'essaye de mettre en place, avec Alfresco, une réponse a un besoin.
Il s'agit de faire la démonstration des possibilités offertes par Alfresco (et peut être de le vendre ^^), dans le cadre d'un projet sur la GED.

Bref voici le besoin (que nous avons imaginé pour l'occasion) :

- Des éléves on un écrit à rendre à un prof, il se connecte sur Alfresco et écrivent l'article dans leur espace perso. Il peuvent l'éditer plusieurs fois, et quand il sont prêt à le rendre, ils le mettent dans un genre d'espace d'échange avec le prof (un répertoire spécifique, ou mieux ?).
- Le prof est prévenue qu'un nouveau document à été rendu (via RSS, mail… que propose Alfresco ?).
- Le prof corrige le document, et le rend à l'éléve.
- L'éléve corrige les erreurs signalé par le prof et renvoi le document dans un nouveau dossier, genre "Prêt pour publication", ou alors, peut être qu'on peut créer des statut personnalisé sur les documents ?
- Le prof valide et publie le document (ou ? Je sais pas trop, en facade d'Alfresco, accessible à tous le monde ça doit être possible ?).

Voilà c'est plutôt simple il me semble (surtout si on utilise l'éditeur WYSIWYG interne), seulement je ne sais pas comment m'y prendre (Il s'agit d'un workflow c'est ça ?).
Pour les éléves, il va falloir créer un compte par éléve, ainsi que pour les profs.
Leur donner des statuts perso (par exemple, une fois dans le dossier "rendu" seul le prof peux modifier le document, l'éléve n'a plus aucun droit dessus).

Merci d'avance pour votre aide !
6 REPLIES 6

michaelh
Champ on-the-rise
Champ on-the-rise
Bonjour,

j'ai installé avec succès (heu, d'ailleurs j'ai plein de trucs à dire la dessus, ça s'est pas bien passé) la version Community sur un Xubuntu.
Il faut les dire alors Smiley Happy
    - Des éléves on un écrit à rendre à un prof, il se connecte sur Alfresco et écrivent l'article dans leur espace perso. Il peuvent l'éditer plusieurs fois, et quand il sont prêt à le rendre, ils le mettent dans un genre d'espace d'échange avec le prof (un répertoire spécifique, ou mieux ?).
    - Le prof est prévenue qu'un nouveau document à été rendu (via RSS, mail… que propose Alfresco ?).
    - Le prof corrige le document, et le rend à l'éléve.
    - L'éléve corrige les erreurs signalé par le prof et renvoi le document dans un nouveau dossier, genre "Prêt pour publication", ou alors, peut être qu'on peut créer des statut personnalisé sur les documents ?
    - Le prof valide et publie le document (ou ? Je sais pas trop, en facade d'Alfresco, accessible à tous le monde ça doit être possible ?).
Voilà c'est plutôt simple il me semble (surtout si on utilise l'éditeur WYSIWYG interne), seulement je ne sais pas comment m'y prendre (Il s'agit d'un workflow c'est ça ?).
Pour la circulation de base des documents, un "workflow simple" aurait pu suffire, mais là en effet il faut passer par la notion de workflows avancés / jBPM pour gérer l'ensemble des cas. En même temps ce n'est pas excessivement complexe et avec un ou deux workflows bien définis on doit pouvoir aller très loin.

Le seul truc, c'est qu'il va falloir les définir Smiley Happy

Je conseille un parcours de la partie dédié à jBPM, avec un peu de lecture pour comprendre les concepts, et ensuite on se retrouve là bas Smiley Happy

mobman02
Champ in-the-making
Champ in-the-making
Merci pour la réponse,
oui alors j'ai fais le tour de jBPM, et je dois dire que c'est plutôt obscure pour moi, c'est là que je me dit, flute, c'est un métier (et c'est pas le mien  :lol: )…

J'ai regardé le workflow Review & Approve, si je me base sur lui je peux peut-être arriver à quelque chose.
Seulement je comprend pas tout, peut être pouvez vous m'éclairer :

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

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

    <swimlane name="initiator" /> (J'aimerais que le workflow soit lancé à la création du fichier par un membre du groupe éléve, automatiquement, ça devrait être la que ça se passe non ?)

    <start-state name="start">
        <task name="wf:submitReviewTask" swimlane="initiator" />
        <transition name="" to="review" />
    </start-state>

    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <actor>#{bpm_assignee}</actor> (Ici je pense qu'il s'agit de la partie ou on dit "qui doit revoir le document", dans mon cas il s'agit de n'importe qui dans le groupe Prof, ça devrait simplifier le truc)
        </assignment>
    </swimlane>

    <task-node name="review">
        <task name="wf:reviewTask" swimlane="reviewer">
            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
        </task>
        <transition name="approve" to="approved" />(Là c'est les deux actions possible, ok)
        <transition name="reject" to="rejected" />
    </task-node>

(Et la les deux actions font pareil… ok, moi il faut juste qu'en cas de "approved" je déplace le fichier vers un espace public, et qu'en cas de "rejected", on recommence à zéro le process de review, ça doit être possible ?)
    <task-node name="rejected">
        <task name="wf:rejectedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="approved">
        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

</process-definition>

J'en demande peut être un peu trop mais si vous pouviez m'aider, un tuto qui pourrait m'aider, ou un lien usefull. J'ai installé le plugin jBPM sur mon eclipse, mais ne connaissant pas du tout le fonctionnement d'un workflow… je suis un peu comme une poule devant un couteau ^^
Enfin je pense que le plus gros problème c'est le "langage", comment on dit à Alfresco de faire tel ou tel chose…

Voilà merci d'avance et joyeuse pâque !

PS : pour mes problèmes à l'installation, ou puis-je poser ma "TO-DO" list ? J'ai écris toutes les étapes de l'installation par lesquelle j'ai dû passer pour que ça fonctionne Smiley Tongue

mobman02
Champ in-the-making
Champ in-the-making
Personne n'est donc disposé à m'aider ?
J'ai un peu avancé mais la documentation est pas très friendly… ni très complète.
Pour un projet open source de cette envergure, avec la popularité qu'il a je m'attendais à une communauté plus active…

Bref…

Je cherche toujours comment modifier le noeud rewiever :
<swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <actor>#{bpm_assignee}</actor>
        </assignment>
    </swimlane>
pour le remplacer par quelque chose qui désigne un groupe complet.

Si j'avais au moins des exemples de workflow avancé, mais non à part les deux par défaut j'ai rien…

J'ai réussi à faire quelques modifs pour coller à mes besoin, et à déployer via jBoss jBPM, je suis content  Smiley Very Happy

michaelh
Champ on-the-rise
Champ on-the-rise
Personne n'est donc disposé à m'aider ?
Si si, mais il y a du monde à servir, et peu de ressources. Surtout pour ma part j'ai complètement zappé la demande  Smiley Happy
J'ai déplacé le sujet dans le forum adapté, ça devrait aider.
J'ai un peu avancé mais la documentation est pas très friendly… ni très complète.
Vrai en partie. Avez-vous pu jeter un oeil au tutoriel de Jeff Potts ? C'est la meilleure "mise en jambe" que je connaisse.
Pour le reste de la doc un effort en cours, mais ça prend du temps, et les workflows ne sont qu'un aspect parmi des centaines d'autres.
Pour un projet open source de cette envergure, avec la popularité qu'il a je m'attendais à une communauté plus active…
Le coté "actif" d'une communauté, c'est aussi vous (dans le sens tout le monde) qui le faite. C'est à dire que si après avoir eu des réponses vous continuez à fréquenter le forum et répondre à d'autres, alors oui, ce sera actif. Sinon ça ne dépendra que du temps libre de quelques personnes. Un exemple de ce que tout le peut faire à son niveau : vous avez parlé de problèmes d'installations sans les préciser. De fait ça ne profite à personne. Vous voyez, ça tient à peu de choses et si la communauté est active, elle est encore jeune, donc à nouveau … patience, on fait au maximum, mais les journées ne font que 24 heures et parfois on se rate un peu … Smiley Happy

Sinon :
Je cherche toujours comment modifier le noeud rewiever pour le remplacer par quelque chose qui désigne un groupe complet.
Avez-vous vous jeté un oeil à "bpm:groupAssignee" et "bpm:groupAssignees" au lieu de "bpm:assignee" ?
Si j'avais au moins des exemples de workflow avancé, mais non à part les deux par défaut j'ai rien…
Il existe 5 exemples fournis avec Alfresco. Voir les fichiers "lifecycle-workflow-context.xml.sample" et "workflow-context.xml.sample" qui devraient vous donner des pistes en ce qui concerne les groupes.

mobman02
Champ in-the-making
Champ in-the-making
J'ai déplacé le sujet dans le forum adapté, ça devrait aider.
Merci Smiley Happy
Vrai en partie. Avez-vous pu jeter un oeil au tutoriel de Jeff Potts ? C'est la meilleure "mise en jambe" que je connaisse.
Je viens de le lire, il est en effet très intéressant et on comprend beaucoup de choses ! (le lien pour les intéressés)
Vous avez parlé de problèmes d'installations sans les préciser. De fait ça ne profite à personne. Vous voyez, ça tient à peu de choses et si la communauté est active, elle est encore jeune, donc à nouveau … patience, on fait au maximum, mais les journées ne font que 24 heures et parfois on se rate un peu … Smiley Happy
Je met au propre et je publie ces problèmes dès que j'en aurais fini avec ce workflow Smiley Tongue (par contre, où publier ce genre d'infos ? Dans la section "installation" ?)

Avez-vous vous jeté un oeil à "bpm:groupAssignee" et "bpm:groupAssignees" au lieu de "bpm:assignee" ?
Non, et je ne trouve pas de référence technique / exemple au sujet de ces éléments, a part sur le wiki où ils sont cité  :?: Je vois pas vraiment comment les utiliser.
Il existe 5 exemples fournis avec Alfresco. Voir les fichiers "lifecycle-workflow-context.xml.sample" et "workflow-context.xml.sample" qui devraient vous donner des pistes en ce qui concerne les groupes.
Merci.


Bon suite à la lecture de l'article de Jeff Potts, j'ai pû faire ça : (dans jBoss jBPM)
<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.2"  name="submit-review-pub">

    <swimlane name="initiator" />

    <start-state name="start">
        <transition name="" to="review" />
    </start-state>

    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
          <pooledactors>#{people.getGroup("GROUP_professeurs")}</pooledactors>
       </assignment>
    </swimlane>

    <task-node name="review">
       <task name="wf:reviewTask" swimlane="reviewer" />
        <transition name="approve" to="approved" />
        <transition name="reject" to="rejected" />
    </task-node>

    <task-node name="rejected">
        <task name="wf:rejectedTask" swimlane="initiator" />
         <transition name="" to="review" />
    </task-node>

    <task-node name="approved">
        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

</process-definition>
A moi ça me parait bon ^^ Les tâches ont leurs assignment, les tâches s'enchaîne… ça marchait avant que je casse tout ^^

L'erreur est la suivante, quand je veux démarrer le workflow avancé sur un fichier,
je suis la procédure habituelle, je n'ai rien à entrer, juste à faire suivant / suivant & terminer.
Seulement quand je fais "Terminer", une erreur survient :
Veuillez corriger les erreurs ci-dessous puis cliquez sur Terminer.

    * Une erreur système s'est produite pendant l'opération : null
Rien dans les logs alfresco,
je ne sais pas d'où peut provenir l'erreur…

Je précise que je souhaite assigner la tâche review au groupe Professeurs, ai-je bien codé cette partie ?

Merci d'avance ! A bientôt Smiley Wink

EDIT : Le workflow schématisé

huberd
Champ in-the-making
Champ in-the-making
J'arrive peut être un peu après la bataille mais bon, si cela peut t'aider, ainsi que d'autres, voici mon Workflow que je vous donne pour exemple. Moi aussi j'ai beaucoup galéré pour en arriver là où je suis en ce moment, alors maintenant j'essaye de faire partager au maximum mon expérience pour le bien le la communauté et des néophytes  :wink: .

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

<!– LPR Validation 12.1 –>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="lwf:validation">
 
   <!– Workflow Initiator –>
   <swimlane name="initiator"/>
  
   <!– Workflow Reviewer –>
   <swimlane name="reviewer">
      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
         <actor>#{reviewer}</actor>
      </assignment>
   </swimlane>
        
    <!– Workflow Approbators –>
   <swimlane name="approbators">
      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
         <pooledactors>#{group}</pooledactors>
      </assignment>
   </swimlane>
  
   <!– Workflow Quality Approbators –>
   <swimlane name="qualityassignees">
      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
         <pooledactors>GROUP_A_QUALITY_APPROBATORS</pooledactors>
      </assignment>
   </swimlane>
   
   
   <!–**************************–>
   <!–**    <Start State>     **–>
   <!–**        start         **–>
   <!–**************************–> 
   <start-state name="start">
      <task name="lwf:submitReviewAndApprovalTask" swimlane="initiator" />
      <event type="node-leave">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Start State</type>
            <name>start</name>
            <disable>false</disable>
         </action>
        
         <!– Remove all currents Permissions –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <permission>remove</permission>
         </action>
      </event>
      <transition name="" to="checkreview"/>
   </start-state>
  
  
   <!–**************************–>
   <!–**      <Decision>      **–>
   <!–**     checkreview      **–>
   <!–**************************–>
   <decision name="checkreview">
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Decision</type>
            <name>checkreview</name>
            <disable>false</disable>
         </action>

       <!– Check is the variable lwf_reviewAssignees exist –>        
         <action class="lpr.alfresco.repo.workflow.jbpm.CheckTypeExist">
            <var>#{lwf_reviewAssignees}</var>
            <type>reviewtype</type>
         </action>
        
          <!– Set read permission for the initiator –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
         <actor>#{initiator}</actor>
            <permission>set</permission>
         </action>
        
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               logger.log("Review Type is seting up to: " + reviewtype);
            </script>
         </action>
      </event>
      <transition name="approval" to="startapproval"/>
      <transition name="review" to="startreview">
         <condition>#{reviewtype == "true"}</condition>
      </transition>     
   </decision>
  
  
   <!–**************************–>
   <!–**        <Node>        **–>
   <!–**     startreview      **–>
   <!–**************************–>  
   <node name="startreview">
      <action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
         <foreach>#{lwf_reviewAssignees}</foreach>
         <var>reviewer</var>
      </action>
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Node</type>
            <name>startreview</name>
            <disable>false</disable>
         </action>
        
         <!– Set document status to Review –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetDocumentStatus">
            <status>Review</status>
         </action>  
        
         <!– Move Document to Review and Approval folder –>
         <action class="lpr.alfresco.repo.workflow.jbpm.MoveDocument">
            <folderdst>Review and Approval</folderdst>
         </action> 
       
         <script>
            <variable name="lwf_reviewCount" access="write" />
            <expression>
               lwf_reviewCount = 0;
            </expression>
         </script>
      </event>
      <transition name="review" to="review"/>
   </node>
  
  
   <!–**************************–>
   <!–**     <Task Node>      **–>
   <!–**        review        **–>
   <!–**************************–>  
   <task-node name="review">
      <task name="lwf_reviewTask" swimlane="reviewer">
         <!– assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <actor>#{reviewer}</actor>
         </assignment–>
      </task>
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Task Node</type>
            <name>review</name>
            <disable>false</disable>
         </action>     
        
         <!– Set read permission for tne current reviewer –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <actor>#{reviewer}</actor>
            <permission>set</permission>
         </action> 
      </event>
      <transition name="reject" to="endReview"/>
      <transition name="approve" to="endReview">
         <script>
            <variable name="lwf_reviewCount" access="read,write" />
            <expression>
               lwf_reviewCount = lwf_reviewCount + 1;
            </expression>
         </script>
      </transition>
   </task-node>
  
  
   <!–**************************–>
   <!–**       <<Join>>       **–>
   <!–**************************–>  
   <join name="endReview">
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Join</type>
            <disable>false</disable>
         </action>     
        
         <!– Unset read permission for tne current reviewer –>        
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <actor>#{reviewer}</actor>
            <permission>unset</permission>
         </action>        
      </event>
      <transition to="isreviewed" />
   </join>


   <!–**************************–>
   <!–**      <Decision>      **–>
   <!–**      isreviewed      **–>
   <!–**************************–>  
   <decision name="isreviewed">
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Decision</type>
            <name>isreviewed</name>
            <disable>false</disable>
         </action>           
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="lwf_requiredReviewerPercent" access="write"/>
               <expression>lwf_requiredReviewerPercent = lwf_requiredReviewPercent;</expression>
            </script>
         </action>
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script> 
               <variable name="lwf_reviewerCount" access="write"/>
               <expression>lwf_reviewerCount = lwf_reviewAssignees.size();</expression>
            </script>
         </action>
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="lwf_actualReviewerPercent" access="write"/>
               <expression>lwf_actualReviewerPercent = ((lwf_reviewCount * 100) / lwf_reviewerCount);</expression>
            </script>
         </action>
      </event>
      <transition name="reject" to="rejected"/>
      <transition name="approve" to="startapproval">
         <condition>#{lwf_actualReviewerPercent >= lwf_requiredReviewerPercent}</condition>
      </transition>  
   </decision>
  
   
   <!–**************************–>
   <!–**        <Node>        **–>
   <!–**    startapproval     **–>
   <!–**************************–>  
   <node name="startapproval">
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Node</type>
            <name>startapproval</name>
            <disable>false</disable>
         </action>         
        
         <!– Set document status to In Approval –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetDocumentStatus">
            <status>Approval</status>
         </action>  
        
         <!– Move Document to Review and Approval folder –>
         <action class="lpr.alfresco.repo.workflow.jbpm.MoveDocument">
            <folderdst>Review and Approval</folderdst>
         </action>    
        
         <!– Get Approbators Group –>
        <action class="lpr.alfresco.repo.workflow.jbpm.getApprobators">
            <var>group</var>
         </action>

       <!–  Set read permission for approbators group –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>#{group}</pooledactors>
            <permission>set</permission>
         </action>  
      </event>
      <transition name="lwf_approve" to="approval"/>
   </node>
  
  
   <!–**************************–>
   <!–**     <Task Node>      **–>
   <!–**       approval       **–>
   <!–**************************–>    
   <task-node name="approval">
      <task name="lwf_approvalTask" swimlane="approbators">
         <event type="task-end">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
               <script>
                  <expression>
                     if (taskInstance.actorId == null)
                        taskInstance.actorId = person.properties.userName;
                  </expression>
               </script>
            </action>
         </event>
      </task>  
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Task Node</type>
            <name>approval</name>
            <disable>false</disable>
         </action>        
     
         <!– Set read permission for tne current approbator –>     
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>#{group}</pooledactors>
            <permission>set</permission>
         </action> 
      </event>
      <event type="node-leave">
     
         <!– Unset read permission for tne group approbator –>     
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>#{group}</pooledactors>
            <permission>unset</permission>
         </action>
      </event>
      <transition name="reject" to="rejected" />
      <transition name="approve" to="checkpdf" />
   </task-node>  


   <!–**************************–>
   <!–**      <Decision>      **–>
   <!–**       checkpdf       **–>
   <!–**************************–>
   <decision name="checkpdf">
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Decision</type>
            <name>checkpdf</name>
            <disable>false</disable>
         </action> 
        
         <!– Check if PDF convertion is enabled –>
         <action class="lpr.alfresco.repo.workflow.jbpm.CheckPDFConvert">
            <var>pdf</var>
         </action>      
      </event>        
      <transition name="quality" to="startquality"/>
      <transition name="published" to="published">
         <condition>#{pdf == "true"}</condition>
      </transition>  
   </decision>  


   <!–**************************–>
   <!–**        <Node>        **–>
   <!–**     startquality     **–>
   <!–**************************–>  
   <node name="startquality">
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Node</type>
            <name>startquality</name>
            <disable>false</disable>
         </action>        
         <action class="lpr.alfresco.repo.workflow.jbpm.SetDocumentStatus">
            <status>Quality Approval</status>
         </action>  
         <!– Move Document to Drafts folder –>
         <action class="lpr.alfresco.repo.workflow.jbpm.MoveDocument">
            <qualitydst>Quality</qualitydst>
         </action>                   
         <!– Set Editor permission for the Quality Group –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>GROUP_A_QUALITY_APPROBATORS</pooledactors>
            <permission>setEditor</permission>
         </action>           
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="lwf_qualityReference" access="write"/>
               <expression>lwf_qualityReference="EU-DSI-IOP.0001";</expression>
            </script>
         </action>
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="lwf_qualityAgreement" access="write"/>
               <expression>lwf_qualityAgreement="v1.0.Published.2008-04-23";</expression>
            </script>
         </action>
      </event>
      <transition name="approval" to="quality"/>
   </node>
  
  
   <!–**************************–>
   <!–**     <Task Node>      **–>
   <!–**       quality        **–>
   <!–**************************–>    
   <task-node name="quality">
      <task name="lwf_qualityTask" swimlane="qualityassignees">
         <event type="task-end">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
               <script>
                  <expression>
                     if (taskInstance.actorId == null)
                        taskInstance.actorId = person.properties.userName;
                  </expression>
               </script>
            </action>
         </event>
      </task>
      <event type="node-enter">
         <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Task Node</type>
            <name>quality</name>
            <disable>false</disable>
         </action>         
      </event>
      <event type="node-leave">
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>GROUP_A_QUALITY_APPROBATORS</pooledactors>
            <permission>unsetEditor</permission>
         </action>
          <!– Move Document to Drafts folder –>
         <action class="lpr.alfresco.repo.workflow.jbpm.MoveDocument">
            <folderdst>Review and Approval</folderdst>
         </action>
      </event>
      <!– transition name="continue" to="qualityapproval" /–>
      <transition name="continue" to="published"/>
   </task-node>  
 
 
   <!–**************************–>
   <!–**     <Task Node>      **–>
   <!–**   qualityapproval    **–>
   <!–**************************–>    
   <!–task-node name="qualityapproval2">
      <task name="lwf_QualityTask" swimlane="qualityassignees" />
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Task Node</type>
            <name>qualityapproval</name>
            <disable>false</disable>
         </action>        
      </event>
      <event type="node-leave">
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>GROUP_A_QUALITY_APPROBATORS</pooledactors>
            <permission>unsetEditor</permission>
         </action>
      </event–>
      <!– transition name="rejection" to="rejected" /–>
      <!–transition name="approve" to="published"/>
   </task-node–>  
 

   <!–**************************–>
   <!–**     <Task Node>      **–>
   <!–**      rejected        **–>
   <!–**************************–> 
   <task-node name="rejected">
      <task name="lwf:rejectedTask" swimlane="initiator" />
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Task Node</type>
            <name>rejected</name>
            <disable>false</disable>
         </action>       
         <!– Set document status to Drafts –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetDocumentStatus">
            <status>Draft</status>
         </action>  
         <!– Move Document to Drafts folder –>
         <action class="lpr.alfresco.repo.workflow.jbpm.MoveDocument">
            <folderdst>Drafts</folderdst>
         </action>    
         <!– Unset read permission for the initiator –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
         <actor>#{initiator}</actor>
            <permission>unset</permission>
         </action> 
         <!– Set Editor Permissions for the initiator –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
         <actor>#{initiator}</actor>
            <permission>setEditor</permission>
         </action>    
      </event>   
      <event type="node-leave">
         <!– unset Editor Permissions for the initiator –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
         <actor>#{initiator}</actor>
            <permission>unsetEditor</permission>
         </action>  
      </event> 
      <transition to="checkreview" name="restart"/>
      <transition to="end" name="end">
         <!– Restore all currents Permissions –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <permission>restore</permission>
         </action> 
      </transition>
   </task-node>
  
  
   <!–**************************–>
   <!–**     <Task Node>      **–>
   <!–**      published       **–>
   <!–**************************–>    
   <task-node name="published">
      <task name="lwf:publishedTask" swimlane="initiator" />
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>Task Node</type>
            <name>published</name>
            <disable>false</disable>
         </action>         
         <action class="lpr.alfresco.repo.workflow.jbpm.ApprovedDocument">
            <folderdst>Approved</folderdst>
            <!– status>Approved</status–>
         </action>
         <action class="lpr.alfresco.repo.workflow.jbpm.PublishedDocument">
            <folderdst>Published</folderdst>
            <!– status>Approved</status–>
         </action>
     
         <!– Unset Editor permission for the Quality Group –>
         <action class="lpr.alfresco.repo.workflow.jbpm.SetPermissions">
            <pooledactors>GROUP_A_QUALITY_APPROBATORS</pooledactors>
            <permission>unsetEditor</permission>
         </action>     
      </event>    
      <transition to="end"/>
   </task-node>  


   <!–**************************–>
   <!–**     <End State>      **–>
   <!–**         end          **–>
   <!–**************************–>       
   <end-state name="end">
      <event type="node-enter">
        <action class="lpr.alfresco.repo.workflow.jbpm.WriteInfo">
            <type>End State</type>
            <name>end</name>
            <disable>false</disable>
         </action>          
        </event>
   </end-state>     
  
</process-definition>

[img]http://www.enregistrersous.com/images2/vignettes_images/147583270820080428132111.jpg[/img]

En prime, voici la classe WriteInfo, pour vous aider à vous y retrouver dans vos log.

package lpr.alfresco.repo.workflow.jbpm;

import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
import org.alfresco.service.cmr.workflow.WorkflowException;
import org.jbpm.graph.exe.ExecutionContext;
import org.springframework.beans.factory.BeanFactory;
import lpr.alfresco.util.MyLogger;

public class WriteInfo extends JBPMSpringActionHandler {

   private static final long serialVersionUID = 1L;

   private static final String STAR = "*";
   private static final Integer NBCHAR = 30;
   
   // Patameters
   private String type;
   private String name;
   private String message;
   private String disable;
    
   @Override
   protected void initialiseHandler(BeanFactory factory) {
      // Empty
   }
   
   public void execute(ExecutionContext executionContext) throws Exception {
      if (type == null && message != null) {
            throw new WorkflowException("WriteInfo variable name has not been provided");
        }
      if(disable == null) {
         disable = "false";
      }
      if (disable.equals("false"))
         if (message == null) {
            MyLogger.debugln("",1);
            
            MyLogger.debug("==> ",1);
            for( int i=0; i<NBCHAR; i++ ) { MyLogger.debug(STAR,1); }
            MyLogger.debugln("",1);
            
            MyLogger.debug("==> ",1);
            MyLogger.debug("*",1);
            type = "<" + type + ">";
            if(name == null) {
               type = "<" + type + ">";
            }
            Integer nbspace = (NBCHAR / 2) - (type.length() / 2);
            for( int i=1; i<nbspace; i++ ) { MyLogger.debug(" ",1); }
            MyLogger.debug(type,1);
            nbspace = NBCHAR - (nbspace + type.length());
            for( int i=1; i<nbspace; i++ ) { MyLogger.debug(" ",1); }
            MyLogger.debugln("*",1);
      
            if (name!= null) {
               MyLogger.debug("==> ",1);
               MyLogger.debug("*",1);
               nbspace = (NBCHAR / 2) - (name.length() / 2);
               for( int i=1; i<nbspace; i++ ) { MyLogger.debug(" ",1); }
               MyLogger.debug(name,1);
               nbspace = NBCHAR - (nbspace + name.length());
               for( int i=1; i<nbspace; i++ ) { MyLogger.debug(" ",1); }
               MyLogger.debugln("*",1);
            }
            
            MyLogger.debug("==> ",1);
            for( int i=0; i<NBCHAR; i++ ) { MyLogger.debug(STAR,1); }
            MyLogger.debugln("",1);
            
            MyLogger.debugln("",1);
         }
         else {
            MyLogger.debugln("",1);
            MyLogger.debugln("==> " + message,1);
            MyLogger.debugln("",1);
         }
   }
      
}

Cette classe donne le résultat suivant dans votre fichier de log et cela en fonction des paramètres que vous lui aurait passé.



==> ******************************
==> *           <Node>           *
==> *         startreview        *
==> ******************************


Pour info, vous pourrez trouver le code d'autres classes de mon Workflow dans différents sujets que j'ai créé où pour lesquelles j'ai répondu dans ce forum.