Índice

 

Customização de Eventos

A customização de eventos é realizada pela criação de scripts na linguagem “JavaScript”. O código de implementação de cada script é armazenado em banco de dados e dispensa o uso de quaisquer outros arquivos, como por exemplo, “custom.p”.

Os eventos de customização para o Fluig são criados pelo administrador, a partir do Fluig Studio. No projeto Fluig, clique com o botão direito sobre a pasta events e em seguida Novo -> Evento Global Fluig conforme a figura abaixo.

Figura 1 - Criação de evento - Fluig Studio.


Em seguida basta informar o Servidor e o Nome do Evento que será adicionado. Uma tela para edição do evento será aberta, conforme imagem a seguir:

Figura 2 - Criação de evento - Fluig Studio.


É possível observar também que o arquivo .js foi adicionado a pasta events do projeto.

 

O Fluig permite utilizar o  log de execução nos eventos de customização. Através da variável global “log” é possível obter o feedback da execução de cada evento. Existem quatro níveis de log, são eles:

 

A apresentação de cada um dos tipos de log está condicionada a configuração do servidor de aplicação. Por exemplo, no JBoss®, por padrão, as mensagens do tipo info e warn são apresentadas no console do servidor e as do tipo debug, error são apresentadas no arquivo de log. Abaixo um exemplo de uso do log em script:

            log.info(“Testando o log info”);

Teríamos no console do servidor a mensagem “Testando o log info”.

A seguir serão detalhados os eventos disponíveis no Fluig.

 

AddDocumentConvertionExt

Este evento permite customizar a conversão de documento realizada pelo Fluig. Mais informações sobre ele podem ser encontradas no guia Conversores de Documentos.

 

DisplayCentralTasks

Este evento é disparado sempre antes de ser exibida a central de tarefas. Através dele é possível inserir, alterar ou remover os links da central de tarefas. O evento recebe como parâmetro um LinkedHashMap com os links disponíveis na central de tarefas.

Exemplo adicionando um link customizado ao final dos itens da central de tarefas:

function displayCentralTasks (links){
links.put("Fluig","http://www.fluig.com");
}

 

Exemplos alterando a ordem de exibição dos links padrões e adicionando três novos, um no início e dois ao final:

function displayCentralTasks (links){
	var _links = new java.util.LinkedHashMap();
	_links.put("Fluig","http://www.fluig.com");                                     
    var it = links.keySet().iterator();
    while (it.hasNext()) {           
       var key = it.next();
       _links.put(key, links.get(key));
	}             
	_links.put("Fluig - DEV" ,"http://dev.fluig.com");
	_links.put("Google","http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=" + getValue("WKUser"));

	links.clear();
	links.putAll(_links);
}

 

Disponibilizamos algumas informações sobre o usuário e a empresa, porém somente para consulta através do método getValue.

WKUser

Código do usuário

WKCompany

Número da empresa

function displayCentralTasks (links){
log.info("Usuário: “ + getValue("WKUser"));
}

 

DisplayCustomMetadata

Este evento é disparado sempre antes de ser exibidos os campos customizados de um documento, tanto na publicação como edição. Através dele é possível sugerir valores iniciais para campos customizados dos metadados de um documento. O evento recebe como parâmetro uma referência aos campos customizados.

function displayCustomMetadata(fields){
}

No contexto deste evento a variável fields pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos.

Para inserir novos campos em um documento existe diversos maneiras disponíveis.

 

Para consultar o valor de um campo customizado neste evento, utiliza-se o fields.getValue passando como parâmetro o código do campo desejado. Retornando “null”, casso o campo não esteja disponível para este documento.

function displayCustomMetadata(fields){
	log.info("Valor do Campo 1: “ + fields.getValue("campo1"));
}


Já pra a edição utiliza-se o fields.setValue, passando como parâmetro, primeiro o nome do campo, em seguida o valor.

function displayCustomMetadata(fields){
	fields.setValue("campo1","Valor para o Campo 1");
}

 

 

Alem dos valores dos campos customizados disponibilizamos algumas informações do documento que está sendo criado ou editado, porém somente para consulta através do método getValue.

WKUser

Código do usuário

WKCompany

Número da empresa

WKNumParentDocument

Número da pasta pai

WKDocumentType

Tipo do documento

WKPrivateDocument

Se o documento esta sendo publicado na pasta particular (true/false)

function displayCustomMetadata(fields){
	log.info("Usuário: “ + getValue("WKUser"));
}

 

ValidateCustomMetadata

Este evento é disparado sempre antes de salvar os valores dos campos customizados de um documento, tanto na publicação como edição. Através dele é possível alterar ou validar os valores dos campos customizados dos metadados de um documento. O evento recebe como parâmetro uma referência aos campos customizados.

function validateCustomMetadata(fields){
}


No contexto deste evento a variável fields pode ser usada para consultar ou modificar os valores dos campos customizados de um documento. Não permitindo adicionar novos campos.

Para inserir novos campos em um documento existe varias maneiras disponíveis.

 

Para consultar o valor de um campo customizado neste evento, utiliza-se o fields.getValue passando como parâmetro o código do campo desejado. Retornando “null”, caso o campo não esteja disponível para este documento.

function validateCustomMetadata (fields){
	log.info("Valor do Campo 1: “ + fields.getValue("campo1"));
}

 

Já para realizar a edição utiliza-se o fields.setValue, passando como parâmetro, primeiro o nome do campo, em seguida o valor.

function validateCustomMetadata (fields){
	fields.setValue("campo1","Valor para o Campo 1");
}

 

Alem dos valores dos campos customizados disponibilizamos algumas informações do documento que esta sendo criado ou editado, porém somente para consulta através do método getValue.

WKUser

Código do usuário

WKCompany

Número da empresa

WKNumParentDocument

Número da pasta pai

WKDocumentType

Tipo do documento

WKDocumentTypeIdID do tipo de documento

WKPrivateDocument

Se o documento esta sendo publicado na pasta particular (true/false)

WKNumAcess

Número de acessos

WKComments

Comentários do documento

WKAuthor

Código do autor do documento

WKCreateDate

Data de criação do documento

WKDescription

Descrição do documento

WKNumDocument

Número do documento

WKNumVersion

Número da versão do documento

WKExpirationDate

Data de expiração do documento

WKExpires

Documento expira? (true/false)

WKFileSize

Tamanho do documento em bytes

WKKeyWord

Palavras chaves do documento

WKVolume

Volume do documento

WKSubject

Assunto relacionado ao documento

function validateCustomMetadata (fields){
	log.info("Usuário: “ + getValue("WKUser "));
}

 

As exceções podem ser tratadas utilizando o comando throw.

Este comando retornará uma mensagem ao usuário ao tentar salvar o documento.

function validateCustomMetadata (fields){
	if( fields.getValue("campo1") == “Area 1”){
   		throw "TRATAMENTO DA EXCEÇÃO";
	}
}

 

 

BeforeDocumentPublisher

Utilizado quando é preciso fazer validação customizada nas propriedades da tela de publicação/edição de documentos antes de salva-lo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados, pois já existe um evento que trata esta situação.

function beforeDocumentPublisher(){
}

 

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

Os objetos Dto’s serão explicados no capítulo “Objetos utilizados nos eventos”


O produto retorna null quando for necessário pegar umas das propriedades do documento que não exista.

Por exemplo: Nem todos os documentos publicados tem aprovador, então a variável WKListApprover só terá informações quando realmente existirem aprovadores na publicação.

function beforeDocumentPublisher(){
               
                var doc = getValue("WKDocument");
                var subject = getValue("WKSubject");
                var listApprover = getValue("WKListApprover");
                var listSeg = getValue("WKListSecurity");
                var listRelated = getValue("WKListRelatedDocument");
                var state = getValue("WKState");
                var user = getValue("WKUser");
                var company = getValue("WKCompany");


                log.info("Usuário Logado: " + user);


                log.info("Empresa: " + company);
               
                log.info("Número do documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion());
               
                if(listApprover!=null){
                    for(j = 0; j < listApprover.size(); j++) {           
                        if (listApprover.get(j).getColleagueId().equals("adm")){
                            throw "O usuário adm não pode ser aprovador de documentos";
                        }
                    }
                }


                if(listSeg != null){
                    for(j = 0; j < listSeg.size(); j++) {     
                        if (listSeg.get(j).getAttributionValue().equals("cvd")){
                            throw "O usuário cvd não pode estar na segurança de documentos";
                        }
                    }
                }


                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());
                        }
                }
                log.info("Assunto: " + subject);
                log.info("Estado: " + state);
}

 

AfterDocumentPublisher

Utilizado quando é preciso fazer alguma manipulação customizada nas propriedades da tela de publicação/edição de documentos depois que ele foi salvo no banco de dados. Dentre todas as propriedades da tela de publicação/edição de documentos não serão tratados os campos customizados.

function afterDocumentPublisher(){
}

As propriedades recuperadas através do método getValue() são as mesmas do eventos beforeDocumentPublisher e a forma de manipulação das propriedades pode ser vista no exemplo do evento beforeDocumentPublisher.

 

BeforeDocumentViewer

Utilizado quando é preciso fazer validação customizada antes da visualização de algum documento.

function beforeDocumentViewer (){
}

 

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

Propriedade

Descrição

Tipo

WKDocument

Objeto do Documento

DocumentDto

WKUser

Usuário logado.

String

WKCompany

Código da Empresa

int

Os objetos Dto’s serão explicados no capítulo “Objetos utilizados nos eventos”.

function beforeDocumentViewer(){


                var doc = getValue("WKDocument");
                var company = getValue("WKCompany");
                var ds
               
                try {
                               var c1 = DatasetFactory.createConstraint(                                                                                                                                                                                                                                                    "allocatedDocumentPK.companyId", company, company, ConstraintType.MUST);
                               var c2 = DatasetFactory.createConstraint( "allocatedDocumentPK.sourceDocument", doc.getDocumentId(), doc.getDocumentId(), ConstraintType.MUST);
                               var c3 = DatasetFactory.createConstraint( "allocatedDocumentPK.sourceVersion", doc.getVersion(), doc.getVersion(), ConstraintType.MUST);
                               var c4 = DatasetFactory.createConstraint("active", "true","true", ConstraintType.MUST);
                                var constraints = new Array(c1, c2, c3, c4);
                               ds = DatasetFactory.getDataset("allocatedDocument", null, constraints, null);


                }catch (e) {
                               log.error("Erro ao tentar recuperar o documento em CheckOut: " + e.message);
                }


                if(ds!=null && ds.rowsCount>0){       
                               throw  "Este documento está em Check Out e não pode ser visualizado. Foi gerado o documento " + ds.getValue(0,"allocatedDocumentPK.destinationDocument") + " que está sob responsabilidade do usuário com matrícula "+ ds.getValue(0,"colleagueId");
                }
}

 

AfterSaveCard

Utilizado quando ao criar/salvar os dados de um registro de formulário pela Navegação de Documentos ou por movimentações Workflow se deseja salvar os dados do registro de formulário em uma forma externa. Por exemplo, ao criar o registro de formulário, enviar os dados do mesmo para um Webservice de outro produto.

 

function afterSaveCard(companyId, formId, cardId, versionId, cardData){
}

 

Sendo os parâmetros:

Propriedade

Descrição

Tipo

companyId

Código da Empresa

int

formId

Código do Formulário

int

cardId

Código do Registro de Formulário

int

versionIdVersão do Registro de Formulárioint
cardDataDados do Registro de FormulárioHashmap <String, String>
function afterSaveCard(companyId, formId, cardId, versionId, cardData){ 
	var custom = ServiceManager.getService("CustomCard"); 
	var serviceHelper = custom.getBean(); 
	var serviceLocator = serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CustomCardServiceLocator"); 
	var service = serviceLocator.getCustomCardPort();
 
	var ar = new Array(); 
	var it = cardData.keySet().iterator(); 
	while (it.hasNext()) { 
		var key = it.next(); 
		var field1 = serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CardKeyValue"); 
		
		field1.setKey(key); 
			field1.setValue( cardData.get(key)); 
		log.info('>' + key + ': ' + cardData.get(key)); 
 
		ar.push(field1); 
	} 
 
	var resultArr = serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CardKeyValueArray"); 
	resultArr.setItem(ar); 
	service.create(companyId, formId, cardId, versionId, resultArr); 
}

 

AfterDeleteCard

Utilizado como complemento do evento afterSaveCard. É chamado toda vez que um formulário ou um registro de formulário é eliminado da lixeira.

 

function afterSaveCard(companyId, formId, cardId, versionId, cardData){
}

 

Sendo os parâmetros:

Propriedade

Descrição

Tipo

companyId

Código da Empresa

int

cardId

Código do Registro de Formulário

int

 

 

function afterDeleteCard(companyId,cardId){ 
	var custom = ServiceManager.getService("CustomCard"); 
	var serviceHelper = custom.getBean();
 
	var serviceLocator = serviceHelper.instantiate("com.totvs.technology.webdesk.forms.service.custom.CustomCardServiceLocator"); 
 
	var service = serviceLocator.getCustomCardPort(); 
 
	log.info("########## carregou serviço CustomCard"); 
	service.deleteCard(companyId, cardId); 
}

 

 

Objetos utilizados nos eventos

Existem alguns objetos disponibilizados pelo produto que são utilizados nos eventos, nas próximas sessões eles serão explicados seus métodos e seus retornos.

 

DocumentDto

Este objeto que representa o documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:

 

Função

Descrição da Função

Tipo do Retorno

getDocumentId()

Retorna o número do documento.

int

getVersion()

Retorna o número da versão do documento.

int

getCompanyId()

Retorna o código da empresa em que o documento foi publicado.

Int

getUUID()

Retorna o UUID (identificador Único Global) do documento.

String

getDocumentTypeId()

Retorna o tipo do arquivo físico, se retornar branco ou nulo é porque esse tipo não é conhecido pelo Fluig.

String

getLanguageId()

Retorna o código do Idioma do documento.

String

getIconId()

Retorna o código do Ícone do documento.

int

getTopicId()

Retorna o código do assunto do documento.

int

getColleagueId()

Retorna a matricula do usuário que criou o documento.

String

getDocumentDescription()

Retorna a descrição do documento.

String

getAdditionalComments()

Retorna os comentários adicionais do documento.

String

getPhisicalFile()

Retorna o caminho físico onde o documento está armazenado.

String

getCreateDate()

Retorna a data de criação.

java.util.Date

getApprovedDate()

Retorna a data de Aprovação.

java.util.Date

getLastModifiedDate()

Retorna a Data da última modificação.

java.util.Date

getDocumentType()

Retorna o tipo do documento, onde:

0 à Pasta raiz

1 à Pasta

2 à Documento normal

3 à Documento externo

4 à Fichário

5 à Ficha

7 à Anexo Workflow

8 à Novo Conteúdo

9 à Aplicativo

10 à Relatório

portal à Site

portalPage à Página de Site

String

getExpirationDate()

Retorna a data de expiração.

java.util.Date

getParentDocumentId()

Retorna o número da Pasta/Fichário pai

int

getRelatedFiles()

String com o nome do arquivo físico principal e anexos.

String

getActiveVersion()

Retorna se a versão é ativa.

boolean

getVersionDescription()

Retorna a descrição da versão.

String

getDownloadEnabled()

Retorna se o documento permite Download

boolean

getApproved()

Retorna se o documento está em aprovação.

boolean

getValidationStartDate()

Retorna a partir de que data em que o documento poderá ser visualizado.

java.util.Date

getPublisherId()

Retorna a matricula do usuário que publicou o documento.

String

getCardDescription()

Retorna a descrição da ficha, para documento do tipo 5.

String

getDocumentPropertyNumber()

Retorna o fichário que foi usado como base para criação da ficha, por isso só tem um valor quando o documento é do tipo 5 (ficha).

int

getDocumentPropertyVersion()

Retorna a versão do fichário em que a ficha foi criada.

int

getPrivateDocument()

Retorna se o documento/pasta está abaixo da pasta particular.

boolean

getPrivateColleagueId()

Se é um documento particular retorna a matricula do usuário onde este documento está alocado.

String

getIndexed()

Retorna se o documento já foi indexado.

boolean

getPriority()

Retorna a prioridade do documento.

int

getUserNotify()

Retorna se notifica os usuários que tenham esse assunto de interesse.

boolean

getExpires()

Retorna se o documento está expirado.

boolean

getVolumeId()

Retorna o volume onde o documento foi publicado, se estiver em branco ele utiliza o volume do pai.

String

getInheritSecurity()

Retorna se herda segurança do pai.

boolean

getUpdateIsoProperties()

Retorna se atualiza as propriedades da cópia controlada.

boolean

getLastModifiedTime()

Retorna a hora da última modificação em milissegundos.

String

getDeleted()

Retorna se o documento está na lixeira.

boolean

getDatasetName()

Retorna o documento do dataset , se o documento é um fichário.

String

getKeyWord()

Retorna as palavras chaves do documento. Cada palavra é separada por vírgula.

String

getImutable()

Retorna se a versão/revisão é inalterável.

boolean

getDraft()

Retorna se o documento está em edição, para documento do tipo “Novo Conteúdo”.

boolean

getInternalVisualizer()

Retorna se utiliza visualizador interno.

boolean

getPhisicalFileSize()

Retorna o tamanho físico do documento principal e anexos.

float

var doc = getValue("WKDocument");
log.info("Número do documento: "+ doc.getDocumentId() + " - Versão: "+ doc.getVersion());

 

ApproverDto

Este objeto que representa os aprovadores e suas propriedades, na tabela abaixo consta mais informações sobre ele:

 

Função

Descrição da Função

Tipo do Retorno

getDocumentId()

Retorna o número do documento.

int

getVersion()

Retorna o número da versão do documento.

int

getCompanyId()

Retorna o código da empresa em que o documento foi publicado.

Int

getColleagueId()

Retorna a matricula de um usuário ou o código do grupo que está aprovando este documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo de aprovação.

String

getApproverType()

Retorna o tipo da aprovação, onde:

0 à Usuário

1 à Grupo

int

getLevelId()

Retorna o nível de aprovação, no caso de aprovação em níveis.

int

var listApprover = getValue("WKListApprover");
	if(listApprover!=null){
    	for(j = 0; j < listApprover.size(); j++) {           
       	 if (listApprover.get(j).getColleagueId().equals("adm")){
            throw "O usuário adm não pode ser aprovadores de documentos";
        }
    }
}

        

DocumentSecurityConfigDto

Este objeto que representa a segurança de um documento e suas propriedades, na tabela abaixo consta mais informações sobre ele:

  

Função

Descrição da Função

Tipo do Retorno

getDocumentId()

Retorna o número do documento.

int

getVersion()

Retorna o número da versão do documento.

int

getCompanyId()

Retorna o código da empresa em que o documento foi publicado.

Int

getAttributionValue()

Retorna a matricula de um usuário ou o código do grupo que está na segurança deste documento. É possível saber se vai retornar um usuário ou um grupo pelo tipo da segurança.

Obs.: Retorna em branco quando o tipo é todos os usuários.

String

getAttributionType()

Retorna o tipo da segurança, onde:

1 à Usuário;

2 à Grupo;

3 à Todos os Usuários.

int

getPermission()

Retorna se é uma permissão.

Obs.: Se não é uma permissão é uma restrição.

boolean

getShowContent()

Retorna se lista o conteúdo.

boolean

getSecurityLevel()

Retorna no nível de permissão/restrição, onde:

-1 à sem permissão/restrição (nega acesso);

0 à Leitura;

1 à Gravação;

2 à Modificação;

3 à Total.

int

getSequence()

Retorna a sequência da permissão/restrição.

int

getSecurityVersion()

Retorna se ele utiliza a segurança deste versão nas demais.

boolean

var listSeg = getValue("WKListSecurity");
if(listSeg != null){
    for(j = 0; j < listSeg.size(); j++) {     
        if (listSeg.get(j).getAttributionValue().equals("cvd")){
            throw "O usuário cvd não pode estar na segurança de documentos";
        }
    }
}

 

RelatedDocumentDto

 

Função

Descrição da Função

Tipo do Retorno

getDocumentId()

Retorna o número do documento.

int

getVersion()

Retorna o número da versão do documento.

int

getCompanyId()

Retorna o código da empresa em que o documento foi publicado.

int

getRelatedDocumentId()

Retorna o número do documento que está relacionado ao documento publicado.

int

 

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:

@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:

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.

 

 

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:

@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:

Evento

Descrição

CREATE

Um novo objeto foi criado.

UPDATE

Um objeto foi modificado

DELETE

Um objeto foi excluído da base de dados.

 

 

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:

 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;
    }
 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;
    }


}