Bloquear/desbloquear documento en Workflow

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

Bloquear/desbloquear documento en Workflow

Hola,

tengo un workflow de aprobación que se dispara cuando un usuario "editor" crea un documento. Además, existe un usuario "revisor" que hace una primera revisión y un usuario "aprobador" que da el ok definitivo, de modo que el documento debe pasar por dos aprobaciones antes de finalizar el workflow.

Lógicamente, si ha superado la primera revisión, el "editor" no debería poder modificar el documento, mientras que si después el "aprobador" lo rechaza, el "editor" sí debería entonces poder cambiarlo para que se vuelva a revisar. Por tanto, lo que necesitamos es que se pueda bloquear/desbloquear el documento mediante las transiciones del workflow, ¿cuál es el modo más sencillo de conseguirlo?

Gracias!
1 Reply
eljuaner
Member II

Re: Bloquear/desbloquear documento en Workflow

Me respondo a mí mismo con una solución por si puede servirle a alguien.

Lo que he hecho es crear dos clases que extienden de org.alfresco.repo.action.executer.ActionExecuterAbstractBase: LockActionExecuter y UnlockActionExecuter, basadas en la clase de alfresco org.alfresco.repo.action.executer.CheckOutActionExecuter. Estas clases utilizan el lockService en su método executeImpl, del siguiente modo:

         lockService.lock(actionedUponNodeRef, LockType.READ_ONLY_LOCK); // En LockActionExecuter 
y
         lockService.unlock(actionedUponNodeRef); // En UnlockActionExecuter

Después he dado de alta estas clases extendiendo action-services-context.xml, es decir, me he creado un fichero tomcat/shared/classes/alfresco/extension/XXX-context.xml y le he metido los beans:

    <!– Declaraciones para el bloqueo/desbloqueo de documentos durante el workflow –>
      <bean id="lock" class="es.mypackage.repo.lock.LockActionExecuter" parent="action-executer" >
         <property name="nodeService">
         <ref bean="nodeService" />
         </property>
         <property name="lockService">
         <ref bean="lockService" />
         </property>
      </bean>
      <bean id="unlock" class="es.mypackage.repo.lock.UnlockActionExecuter" parent="action-executer" >
         <property name="nodeService">
         <ref bean="nodeService" />
         </property>
         <property name="lockService">
         <ref bean="lockService" />
         </property>
      </bean>

Por último, en el XML del workflow utilizo estas acciones que acabo de crear, por ejemplo, así:


         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
               <variable name="bpm_package" access="read" />
               <expression>
                  var unlockAction = actions.create("unlock");
                  var lockAction = actions.create("lock");
                  for (var i = 0; i &lt; bpm_package.children.length;i++)   {
                     unlockAction.execute(bpm_package.children[i]);                  
                     bpm_package.children[i].properties["cgsi:estado"] = "En Revisión";
                     bpm_package.children[i].save();
                     lockAction.execute(bpm_package.children[i]);                  
                  }
               </expression>
            </script>
         </action>

Eso es todo. No sé si existe una forma más sencilla pero, sabiendo donde tocar, esta lleva unos 10 minutos.

Un saludo