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
            

sexta-feira, 18 de março de 2011

Funcionalidades do Alfresco

Ferramenta de Gestão de Conteúdo

         Possibilitar funcionamento multi-plataforma (Windows, Mac OS, Linux, Solarium).

         Permitir sincronização de pastas via CIFS.

         Ser compatível com o padrão JSR 168 (Java Portlet Integration) para acesso à portal.

         Ter suporte à AJAX.

         Suportar os protocolos WebDav (Web-based Distributed Authoring and Versioning) e FTP (File Transfer Protocol).

         Permitir extração de meta-informação e classificação automática a partir de qualquer interface.

         Suportar o reposicionamento de portlets através da ação de arrastar e largar.

         Suportar a personalização de interfaces e layout sem necessidade de implementação de código.

         Possuir mecanismo para criação de templates para a camada de apresentação.

         Permitir a importação de imagens, vídeos ou documentos.

         Permitir a associação de meta dados personalizados ao documento.

         Possuir recurso de busca em diferentes repositórios utilizando o browser Firefox ou Internet Explorer.

         Possuir mecanismo de pesquisa simples e avançada tendo por base meta-informação customizável.

         Permitir conversão de Office para ODF/PDF, de PowerPoint para Flash.

         Permitir a visualização de documentos através da Web.

         Permitir a importação de documentos através da Web.

         Permitir aos usuários o envio de links direcionados a documentos ou pastas através de e-mail.

         Possuir funcionalidade que permita ao usuário personalizar seus sites, portlets, sem necessidade de programação.

         Permitir o controle de versões.

         Possuir bloqueio dos documentos para evitar conflitos de edição, travando um arquivo para não permitir que outro usuário efetue qualquer modificação (check in-out).

         Possuir funcionalidade que permita identificar quem criou, atualizou o documento, quando foi criado, quando foi atualizado o documento.

         Possuir controle de permissões de acesso a sites, arquivos e pastas por usuário e grupos.

         Possuir a funcionalidade de gerar, controlar, armazenar, compartilhar e recuperar informações existentes em documentos.

         Possuir a funcionalidade de visualizar, procurar, criar e editar documentos de acordo com as permissões do usuário.

         Possuir a funcionalidade de busca que procure arquivos eletrônicos em múltiplos espaços colaborativos em uma única busca.

         Possuir funcionalidade de criação de hierarquias de pastas e permitir a organização dos documentos nesta hierarquia.

         Possuir funcionalidade de permissão de acesso a uma pasta e arquivos eletrônicos por usuário, grupo e perfil.

         Possuir a funcionalidade de upload de múltiplos arquivos através da interface web.

         Permitir acesso aos documentos utilizando WebDav.

         Permitir aprovação, rejeição e retorno de documentos ao criador para correção.

         Permitir a criação de relações (linking) entre documentos através de diferentes espaços.

         Suportar assistente para criação de espaços.

         Possuir funcionalidade de notificação de alterações via email ou RSS.

         Possuir funcionalidade de painel de gestão de tarefas.

         Suportar o protocolo de autenticação LDAP.

         Permitir integração com MS-Office.

         Ter suporte a Single SignOn com autenticação dos usuários via protocolo LDAP.

         Permitir integração com e-mail para arquivamento dos mesmos e controlar discussões sobre documentos, associar e-mails e documentos.

         Permitir regras de negócio para classificação automática.

         Suportar repositório integrado para documentos digitalizados e documentos eletrônicos.

         Permitir extração automática de meta dados.

         Possuir recurso para visualização prévia do documento.

         Possuir fluxo de aprovação para controle de documentos.

         Possuir recurso de segurança para gestão de usuários, grupos e perfis.

         Possuir recurso de segurança em nível do documento e/ou espaço.

         Permitir replicação de conteúdo distribuído.

         Ter suporte ao conector de conteúdo XAM (eXtensible Access Method) - Uso de armazenamento endereçável ao conteúdo que suporta XAM.

         Permitir backup e restore.

         Permitir a formação de cluster.

         Possuir mecanismo para propagar e sincronizar alterações entre os servidores de aplicação clusterizados.

         Apresentar interface para os usuários da plataforma em português (Brasil).

         Apresentar interface para os usuários de administração da plataforma em português (Brasil).

         Permitir o gerenciamento de usuários, grupos e perfis.

         Possuir console de administração com interface gráfica.

         Permitir a gestão de aparência da tela inicial do usuário.

         Permitir configurar a expiração de sessão do usuário.

Ferramenta de Workflow

         Permitir via interface gráfica modelar Workflow.

         Permitir recurso de gerenciamento do processo de criação, aprovação, divulgação do documento, bem como da rejeição do mesmo ou o seu retorno ao criador para melhoria e posterior divulgação.

         Possuir recurso de envio de e-mails aos participantes nos fluxos documentais, com link para realizarem a gestão da tarefa respectiva.

         Permitir visualização do histórico de tarefas e do fluxo de cada documento, associado aos detalhes do documento.

         Permitir configuração de regras de negócio relacionado ao conteúdo e/ou espaço.

         Possuir recurso de links para navegação a partir do detalhe do documento para os conteúdos
associados.

         Permitir integração com jBPM.