Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

São disponibilizadas algumas propriedades referentes ao documento que esta sendo criado ou editado, porem somente para consulta através do método getValue.

 

Propriedade

Descrição

Tipo

WKDocument

Objeto do Documento

DocumentDto

WKSubject

Descrição do Assunto do documento

String

WKListApprover

Lista dos Aprovadores do documento

List<ApproverDto>

WKListSecurity

Lista com a segurança do documento

List <DocumentSecurityConfigDto>

WKListRelatedDocument

Lista com os documentos relacionados ao documento

List< RelatedDocumentDto>

WKState

Estado da ação: PUBLISH ou MODIFY

String

WKUser

Usuário logado

String

WKCompany

Código da Empresa

int

...

Bloco de código
languagejava
titleExemplo
var listRelated = getValue("WKListRelatedDocument");
	if( listRelated != null){
   	 log.info("Os seguintes documentos estão relacionados a este documentos: ");
     for(j = 0; j < listRelated.size(); j++) {          
        log.info("Nr. documento: "+ listRelated.get(j).getRelatedDocumentId());
     }
}


 

 

 

 

 

 

 

 

Customização de Eventos JMS

O Fluig tem customização de eventos JMS, permitindo criar procedimentos de auditoria com base nas informações fornecidas pelo produto. O JMS (Java Message Service) é uma API Java™ que provê uma conexão assíncrona entre aplicações por meio de troca de mensagens.

O produto dispara dois tipos de mensagens JMS customizáveis, o wdkDocument e o wdkAbstract.

O wdkDocument será disparado quando houver manipulação nos documentos do Fluig, para a aplicação receber a mensagem com as informações do documento a classe tem que estender o MessageListener e ter a seguinte linha:

Bloco de código
languagejava
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkDocument")})

 

O objeto de retorno será um MapMessage que conterá os seguintes parâmetros:

  • event (String): Informa qual o tipo de evento que foi efetuado com o documento, conforme a tabela abaixo:

Evento

Descrição

PUBLISH

Um novo documento publicado.

MODIFY

Documento é modificado

DELETE

Documento é excluído da base de dados.

SENDRECYCLE

Documento é enviado para lixeira.

DELETEFOLDER

Uma pasta é excluída da base de dados.

EXTERNALCONVERTION

Documento com conversão customizada.

CONVERTIONLONGTERM

Documento convertido para longo prazo.

MOVE

Um ou mais documento ou pastas foram movidos de uma pasta para outra.

RESTORERECYCLE

Restaura documentos e pastas da Lixeira.

 

  • companyId (Integer): Código da empresa em que o documento foi manipulado.
  • colleagueId (String): Usuário que efetuou a ação.
  • documentId (Integer): Código do documento que sofreu a ação.
  • version (Integer): Número da versão do documento.
  • lhasCreatedDocument (Boolean): Informa se criou o documento.
  • IhasIncreasedVersion (Boolean): Informa se foi incrementada a versão.
  • changedApproval (Boolean): Informa se o aprovador foi modificado.
  • documento (byte[ ]): Array de bytes com o documento e suas propriedades.

 

Bloco de código
languagejava
titleExemplo
import java.util.Enumeration;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;


@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkDocument")
})


public class DocumentListenerMessageBean implements MessageListener {


    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("========Document Listener========");
            System.out.println("Message received: " + message.getJMSMessageID());
            if (message instanceof MapMessage) {
                MapMessage mm = (MapMessage) message;
                @SuppressWarnings("unchecked")
                Enumeration<String> es = mm.getMapNames();
                while (es.hasMoreElements()) {
                    String prop = es.nextElement();
                    System.out.println(prop + ": " + mm.getObject(prop));
                }
            }
            System.out.println("========Fim Document Listener========");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

O wdkAbstract será disparado quando houver manipulação em alguns objetos no Fluig, conforme tabela abaixo:

 

Objeto

Descrição

Tabela no BD

Icon

Ícone

ICONE

Topic

Assunto

ASSUNTO

Shortcut

Segurança de Menu

MENU_ICONE

LogAccess

Log de Acesso

LOG_ACCESS

ColleagueReplacement

Substituto

COLAB_SUBSTTO

Application

Aplicativo

APLICATIVO

ProgressLib

Ambiente Progress

AMBIEN_PROGRESS

GlobalCalendar

Feriado

CALEND_GLOBAL

Term

Termo

TERMO

Synonym

Sinônimo

SINONIMO

DocumentType

Tipo do Documento

TIPO_DOCUMENTO

Volume

Volume

VOL_FISIC

AttributionMecanism

Mecanismo de Atribuição

MECAN_ATRIBUIC

EmailTemplate

Template de Email

TEMPLATE_EMAIL

CustomizedDatasetBuilder

Dataset

SERV_DATASET

DataService

Serviços

SERV_DADOS

CustomFields

Campos Customizados

CAMPO_CUSTOM

UserGraphicSetings

DashBoard

CONFIGUR_GRAF_USUAR

Watermark

Marca D’água

MARCA_DAGUA

WebLayout

Layout

WEBLAYOUT

Adapter

Adaptadores

ADAPTER

 

Para a aplicação receber a mensagem com as informações destes objetos a classe tem que estender o MessageListener e ter a seguinte linha:

Bloco de código
languagejava
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract")})

 

O objeto de retorno será um MapMessage que conterá os seguintes parâmetros:

  • event (String): Informa qual o tipo de evento que foi efetuado com o objeto, conforme a tabela abaixo:

Evento

Descrição

CREATE

Um novo objeto foi criado.

UPDATE

Um objeto foi modificado

DELETE

Um objeto foi excluído da base de dados.

 

  • userId (String): Usuário que efetuou a ação.
  • entity (String): Entidade do objeto que está sendo manipulado, conforme a tabela de objeto que já foi apresentada acima.
  • mapNewVersion (byte[ ]): Array de bytes de um HashMap<String, Object> com as propriedade do objeto.
  • mapPreviousVersion (byte[ ]): Array de bytes de um HashMap<String, Object> com as propriedade do objeto antes da alteração.

 

Informações
titleNota

Este mapa não terá objetos quando o evento for CREATE e DELETE.

 

Para transformar o Array de bytes recebido na mensagem em um HashMap basta utilizar a função abaixo:

Bloco de código
languagejava
 private Map<String, Object> decoderMap(byte[] array) {
    
        if(array.length>0){
            ByteArrayInputStream bos = new ByteArrayInputStream(array);
            ObjectInputStream p = new ObjectInputStream(bos);
            Object docObject = p.readObject();
            try{
                Map<String, Object> map = (Map<String, Object>) docObject;
                return map;
            }catch(java.lang.ClassCastException e){
                e.printStackTrace();
            }
        }                   
        return null;
    }
Bloco de código
languagejava
titleExemplo
 package com.totvs.fluig.custom.dm;


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;


@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract")
})
public class AbstractListenerMessageBean implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("==============Abstract Listener====================");
            System.out.println("Message received: " + message.getJMSMessageID());
            if (message instanceof MapMessage) {
                MapMessage mm = (MapMessage) message;
                @SuppressWarnings("unchecked")
                Enumeration<String> es = mm.getMapNames();
                while (es.hasMoreElements()) {
                    String prop = es.nextElement();
                    System.out.println(prop + ": " + mm.getObject(prop));
                    if(prop.equalsIgnoreCase("mapNewVersion")
                            || prop.equalsIgnoreCase("mapOldVersion")){
                        Map<String, Object> m = decoderMap(mm.getBytes(prop));
                        Iterator it = m.entrySet().iterator();
                        while (it.hasNext()) {
                            Map.Entry e = (Map.Entry)it.next();
                            System.out.println(prop + " - " + e.getKey() + ": " + e.getValue());
                        }
                    }
                }
            }
            System.out.println("==========Fim Abstract Listener===============");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
      
    private Map<String, Object> decoderMap(byte[] array) throws IOException, ClassNotFoundException{
        if(array.length>0){
            ByteArrayInputStream bos = new ByteArrayInputStream(array);
            ObjectInputStream p = new ObjectInputStream(bos);
            Object docObject = p.readObject();
            try{
                Map<String, Object> map = (Map<String, Object>) docObject;
                return map;
            }catch(java.lang.ClassCastException e){
                e.printStackTrace();
            }
        }                   
        return null;
    }


}