segunda-feira, 27 de fevereiro de 2012

Criando um Workflow customizado no Alfresco ECM (usando jBPM)

Esse artigo tem o objetivo de explicar a criação de um workflow customizado no Alfresco ECM versão Community versão 3.4.
O Alfresco utiliza o jBPM como engine de workflow até a versão 3.4d. A partir da release 3.4e utilizará oficialmente o ActiveBPM. Porém a compatibilidade será mantida.
De forma padrão, o Alfresco disponibiliza os seguintes Workflow que pode ser utilizado:
  • Adhoc
  • Group Review & Approve
  • Parallel Review & Approve
  • Pooled Review & Approve
  • Review & Approve
  • Review & Publish
  • Review & Publish Section Structure
Caso haja necessidade de outros fluxos, podemos criar utilizando a ferramenta jBPM para modelar o JPDL que irá descrever o fluxo a ser executado no Alfresco.
Nas versões futuras do Alfresco, será suportado o padrão Active BPM que utilzia fluxos modelados com a notação BPMN. Nesse artigo será abordado o modelo jBPM.
Para criarmos um workflow personalisado, precisamos construir os seguintes artefatos:
  • Process Definition: Define o fluxo do workflow a ser montado. É criado pelo jBPM ou pode ser criado por qualquer editor de textos. O formato desse arquivo é XML e segue a notação JPDL.
  • Task Model: Um arquivo Model que define a estrutura de dados do workflow. Segue o formato apresentado nos capítulos anteriores.
  • Resource Bundle: Arquivo que define as mensagens que serão mostradas em cada idioma. É um arquivo properties como os usados na tradução do Alfresco.
  • Web Client Configuration: Define uma customização para as telas do Workflow.

Além de criarmos os arquivos acima, precisamos alterar o seguinte arquivo, para a implantação do workflow:
  • <tomcat>/shared/classes/alfresco/extension/xxxxxx-context.xml: arquivo que carrega o workflow criado.
Os passos para criar um workflow personalizado no alfresco estão descritos abaixo. Primeiro criaremos os arquivos necessários, depois faremos a implantação no Server.
O primeiro passo é criar um arquivo XML chamado Process Definition. Esse arquivo descreve o fluxo de atividades como uma máquina de estados. Nele definimos os seguintes elementos:
  • Fluxo: Descreve a máquina de estados do workflow.
  • Tarefas: Descreve as tarefas que irão compor o workflow.
  • Ações: As ações que podem ser tomadas na execução de cada tarefa.
  • Lane: o Ator (usuário ou grupo) que executará a tarefa.
A linguagem usada para criar esse arquivo é o JPDL e pode ser criada de forma gráfica usando o JBPM ou manualmente. Abaixo segue um exemplo de um arquivo:

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

<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="wfAdds:AddsWorkflow">
<swimlane name="ator1">
         <assignment actor-id="#{bpm_assignee.properties['cm:Administrators']}"/>
</swimlane>
<swimlane name="ator2">
         <assignment actor-id="#{bpm_assignee.properties['cm:Administrators']}"/>
</swimlane>

         <start-state name="start">
                 <task name="wfAdds:inicio" swimlane="ator1"/>
                 <transition to="tarefa1" name="tarefa01task"></transition>
         </start-state>


         <task-node name="tarefa1">
                 <task name="wfAdds:tarefa1" swimlane="ator1"></task>
                 <transition to="tarefa2" name="tarefa02task"></transition>
         </task-node>

         <task-node name="tarefa2">
                 <task name="wfAdds:tarefa2" swimlane="ator1"></task>
                 <transition to="tarefa3" name="tarefa03task"></transition>
         </task-node>

         <task-node name="tarefa3">
                 <task name="wfAdds:tarefa3" swimlane="ator1"></task>
                 <transition to="tarefa4" name="tarefa04task"></transition>
         </task-node>

         <task-node name="tarefa4">
                 <task name="wfAdds:tarefa4" swimlane="ator1"></task>
                 <transition to="fim" name="fim"></transition>
         </task-node>
        
         <end-state name="fim"></end-state>


</process-definition>  


Primeiro definimos o nome do Workflow. Nas linhas seguintes, definimos quais as lanes (papéis) e associamos a grupos do Alfresco. Os nodes start-state e end-state são obrigatórios, pois definem o início e fim do fluxo. Os nodes task-node irão definir as etapas do workflow e as opções de transição entre elas. Graficamente esse workflow é representado da seguinte forma no Alfresco:


Depois do fluxo criado, podemos incluir “comportamentos” no workflow. São ações que podem ser executadas automaticamente a cada etapa do fluxo, como por exemplo, enviar um email. A lista completa de possibilidades está na documentação do Alfresco. Abaixo um exemplo de código de como enviar email sempre que o fluxo chegue numa determinada etapa (lembrando que o Alfresco precisa estar configurado corretamente para poder enviar emails):
      <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
        <script>
            var mail = actions.create("mail");
            mail.parameters.to = initiator.properties["cm:email"];
            mail.parameters.subject = "Adhoc Task " + bpm_workflowDescription;
            mail.parameters.from = bpm_assignee.properties["cm:email"];
            mail.parameters.text = "It's done";
            mail.execute(bpm_package);
        </script>
      </action>

É o arquivo responsável por modelar a estrutura de dados que será usada no fluxo. É um Content Model e pode ser criado como demonstrado nos capítulos anteriores.
Segue um exemplo bem simples de Task Model para o fluxo criado:


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

<model name="wfAdds:AddsWorkflowModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">
  <imports>
     <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
     <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/>
  </imports>

  <namespaces>
     <namespace uri="http://www.addssolutions.com.br/model/workflow/1.0" prefix="wfAdds"/>
  </namespaces>
     
  <types>
     <type name="wfAdds:inicio">
        <parent>bpm:startTask</parent>
     </type>

     <type name="wfAdds:tarefa1">
        <parent>bpm:workflowTask</parent>
     </type>
     <type name="wfAdds:tarefa2">
        <parent>bpm:workflowTask</parent>
     </type>

         <type name="wfAdds:tarefa3">
                 <parent>bpm:workflowTask</parent>
              </type>
          
         <type name="wfAdds:tarefa4">
                 <parent>bpm:workflowTask</parent>
              </type>
  </types>
 
  
</model>



Nesse arquivo definimos a estrutura de dados para cada etapa. Usamos herança e podemos definir novos campos de acordo com a necessidade.

Criando um Resource Bundle
Arquivo responsável por definir os textos que serão exibidos de acordo com o idioma do usuário logado no Alfresco. Abaixo um exemplo:

  
# Dados do Workflow
wfAdds_AddsWorkflow.workflow.title=ADDs Solutions Workflow
wfAdds_AddsWorkflow.workflow.description=Workflow criado para o curso de desenvolvimento Alfresco inCompany

# Dados das Tasks
wfAdds_AddsWorkflow.task.wfAdds_inicio.title=Iniciar Workflow
wfAdds_AddsWorkflow.task.wfAdds_tarefa1.title=Tarefa 1
wfAdds_AddsWorkflow.task.wfAdds_tarefa2.title=Tarefa 2
wfAdds_AddsWorkflow.task.wfAdds_tarefa3.title=Tarefa 3
wfAdds_AddsWorkflow.task.wfAdds_tarefa4.title=Tarefa 4

# Dados dos botoes de transicao
wfAdds_AddsWorkflow.node.tarefa1.transition.tarefa02task.title=Fazer Tarefa 2
wfAdds_AddsWorkflow.node.tarefa2.transition.tarefa03task.title=Fazer Tarefa 3
wfAdds_AddsWorkflow.node.tarefa3.transition.tarefa04task.title=Fazer Tarefa 4
wfAdds_AddsWorkflow.node.tarefa4.transition.fim.title=Finalizar



A implantação do Workflow se dá nas seguintes etapas:
  1. Criar o arquivo context bean que irá cadastrar o Workflow no momento que o Alfresco é iniciado. Esse arquivo tem que ser criado na pasta <tomcat>/shared/classes/alfresco/extension.  A extensão de seu nome precisa ser –context.xml. Ex. primeiroWF-context.xml Segue um exemplo de conteúdo desse arquivo:

<?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="lifecycle.workflowBootstrap" parent="workflowDeployer">
                 <property name="workflowDefinitions">
                          <list>
                                   <props>
                                            <prop key="engineId">jbpm</prop>
                                            <prop key="location">alfresco/extension/addsWF/adds_WF1_processdefinition.xml</prop>
                                            <prop key="mimetype">text/xml</prop>
                                            <prop key="redeploy">true</prop>
                                   </props>
                          </list>
                 </property>
                 <property name="models">
                          <list>
                <value>alfresco/extension/addsWF/AddsWorkflowModel.xml</value>
                          </list>
                 </property>
                 <property name="labels">
                          <list>
                <value>alfresco/extension/addsWF/adds-WF-messages</value>
                          </list>
                 </property>
         </bean>
</beans>



Nesse arquivo definimos o caminho dos arquivos Process Definition, Task Model e Resource Bundle.
  1. Criar uma pasta nova no caminho abaixo (tem que estar de acordo com os caminhos especificados no arquivo acima: <tomcat>/shared/classes/alfresco/extension/addsWF
  2. Para a pasta criada acima, copiar os arquvios Process Definition, Task Model e Resource Bundle. Eles precisam ter o nome especificado no arquivo acima (adds_WF1_processdefinition.xml, AddsWorkflowModel.xml, adds-WF-messages)
  3. Reiniciar o Alfresco. Se tudo der certo, esse workflow estará disponível.
Caso alguém queira comentar, ou entrar em contato conosco para tirar dúvidas sobre o procedimento acima, envie um email para blog@addssolutions.com.br
            

Nenhum comentário:

Postar um comentário