Home

TOTVS | Plataformas e tecnologias

Árvore de páginas

Importante

Caro Cliente,

O TOTVS ECM 3.0 foi fundamentado na tecnologia de interface Flash, do qual a Adobe irá descontinuar seu suporte em 31/12/2020.

Recomendamos que nossos clientes avaliem a utilização do TOTVS Fluig Plataforma, que proporciona uma maior abrangência de recursos e importantes inovações tecnológicas. São inúmeras novidades não só em ECM e BPM que o Fluig entrega aos seus mais de 4 mil clientes, mas também conta com recursos de portais, social e identidade única.

Entre em contato com seu executivo de conta para saber mais detalhes desta oferta.

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 TOTVS | ECM são criados pelo administrador, na seção eventos, conforme a figura abaixo.


A manutenção dos eventos do TOTVS | ECM permite:

  • Adicionar evento: clique sobre o atalho e selecione o evento desejado. O código com a implementação padrão e os parâmetros do evento será apresentado na tela;
  • Validar evento: valida a sintaxe do evento;
  • Excluir evento: selecione o evento desejado clique sobre o atalho “Excluir”;


Uma nova funcionalidade adicionada ao TOTVS | ECM é o uso de 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:

  • error: apresentação de erros;
  • debug: depurar a execução;
  • warn: informar possível problema de execução;
  • info: apresentação de mensagens


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 TOTVS | ECM.



AdddocumentConvertionExt


Este evento permite customizar a conversão de documento realizada pelo ECM. Mais informações sobre ele podem ser encontradas no “Guia de Referência Customização de Conversores”.



DizplayCentralTasks


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("Totvs","http://www.totvs.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("Totvs","http://www.totvs.com");
var it = links.keySet().iterator();
while (it.hasNext()) {
            var key = it.next();
_links.put(key, links.get(key));
}
_links.put("Totvs ECM" ,"http://www.totvs.com/tecnologia/ecm");
_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, porem somente para consulta através do método getValue.


WKUserCódigo do usuário
WKCompany

Número da empresa


Exemplo:

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



DisplayCustomMetadada


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.


Exemplo:

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 varias maneiras disponíveis.


  • Pela herança da pasta pai
  • No cadastro de Campos Customizados, marcando a opção “Mostrar em todos documentos” ou da forma padrão
  • Através do WebService CustomFieldsService
  • Na edição dos metadados do documento, pelo usuário.


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.


Exemplo:

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.


Exemplo:

function displayCustomMetadata(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, porem somente para consulta através do método getValue.


WKUserCódigo do usuário
WKCompanyNúmero da empresa
WKNumParentDocumentNúmero da pasta pai
WKDocumentTypeTipo do documento
WKPrivateDocument

Se o documento esta sendo publicado

na pasta particular (true/false)


Exemplo:

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



ValidateCustomMetadada


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.


Exemplo:

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:


  • Pela herança da pasta pai
  • No cadastro de Campos Customizados, marcando a opção “Mostrar em todos documentos” ou da forma padrão
  • Através do WebService CustomFieldsService
  • Na edição dos metadados do documento, pelo usuário.


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.


Exemplo:

function validateCustomMetadata (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.


Exemplo:

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, porem somente para consulta através do método getValue.


WKUserCódigo do usuário
WKCompanyNúmero da empresa
WKNumParentDocumentNúmero da pasta pai
WKDocumentTypeTipo do documento
WKPrivateDocument

Se o documento esta sendo publicado

na pasta particular (true/false)

WKNumAcess

Numero de acessos

WKCommentsComentários do documento
WKAuthorCódigo do autor do documento
WKCreateDateData de criação do documento
WKDescriptionDescrição do documento
WKNumDocumentNúmero do documento
WKNumVersionNúmero da versão do documento
WKExpirationDateData de expiração do documento
WKExpiresDocumento expira? (true/false)
WKFileSizeTamanho do documento em bytes
WKKeyWordPalavras chaves do documento
WKVolumeVolume do documento
WKSubjectAssunto relacionado ao documento


Exemplo:

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.

Exemplo:

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.

Exemplo:

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.


PropriedadeDescriçãoTipo
WKDocumentObjeto do DocumentoDocumentDto
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
WKUserUsuário logado.String
WKCompanyCódigo da Empresaint

Atenção

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.


Exemplo:

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.


Exemplo:

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.


Exemplo:

function beforeDocumentViewer (){ }


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


PropriedadeDescriçãoTipo
WKDocumentObjeto do DocumentoDocumentDto
WKUserUsuário logado.String
WKCompanyCódigo da Empresa

int



Observação

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

Exemplo:

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 colaborador com matrícula "+ ds.getValue(0,"colleagueId");
        }
   }



AfterSaveCard


Utilizado quando ao criar/salvar os dados de uma ficha pelo GED ou por movimentações workflow se deseja salvar os dados da ficha em uma forma externa. Por exemplo, ao criar a ficha, enviar os dados da ficha para um Webservice de outro produto.


Exemplo:

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


Sendo os parâmetros:


PropriedadeDescriçãoTipo
companyIdCódigo da Empresaint
formIdCódigo do Fichárioint
cardIdCódigo da Fichaint
versionIdVersão da Fichaint
cardDataDados da FichaHashMap<String,String>



Exemplo:

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 fichário ou uma ficha é eliminado da lixeira.


Exemplo:

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


Sendo os parâmetros:


PropriedadeDescriçãoTipo
companyIdCódigo da Empresaint
cardIdCódigo da Fichaint


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

FunçãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
getVersion()Retorna o número da versão do documentoint
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 ECM

String
getLanguageId()Retorna o código do Idioma do documentoString
getIconId()Retorna o código do Ícone do documentoint
getTopicId()Retorna o código do assunto do documentoint
getColleagueId()

Retorna a matricula do colaborador que

criou o documento

String
getDocumentDescription()Retorna a descrição do documentoString
getAdditionalComments()Retorna os comentários adicionais do documentoString
getPhisicalFile()

Retorna o nome do arquivo físico atrelado

ao documento

String
getCreateDate()Retorna a data de criaçãojava.util.Date
getApprovedDate()Retorna a data de Aprovaçãojava.util.Date
getLastModifiedDate()Retorna a Data da última modificaçãojava.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çãojava.util.Date
getParentDocumentId()Retorna o número da Pasta/Fichário paiint
getRelatedFiles()

String com o nome do arquivo físico principal

e anexos

String
getActiveVersion()Retorna se a versão é ativaboolean
getVersionDescription()Retorna a descrição da versãoString
getDownloadEnabled()Retorna se o documento permite Downloadboolean
getApproved()Retorna se o documento está em aprovaçãoboolean
getValidationStartDate()

Retorna a partir de que data em que o

documento poderá ser visualizado

java.util.Date
getPublisherId()

Retorna a matricula do colaborador

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 criadaint
getPrivateDocument()

Retorna se o documento/pasta está abaixo

da pasta particular

boolean
getPrivateColleagueId()

Se é um documento particular retorna a matricula

do colaborador onde este documento está alocado

String
getIndexed()Retorna se o documento já foi indexadoboolean
getPriority()Retorna a prioridade do documentoint
getUserNotify()

Retorna se notifica os usuários que tenham

esse assunto de interesse

boolean
getExpires()Retorna se o documento está expiradoboolean
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 paiboolean
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 lixeiraboolean
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ávelboolean
getDraft()

Retorna se o documento está em edição, para

documento do tipo “Novo Conteúdo”

boolean
getInternalVisualizer()Retorna se utiliza visualizador internoboolean
getPhisicalFileSize()

Retorna o tamanho físico do documento

principal e anexos

float
getIsEncrypted()

Retorna se o arquivo PDF publicado possui

algum tipo de segurança

boolean


Exemplo de utilização:

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çãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
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 colaborador ou o código do grupo

que está aprovando este documento. É possível saber se vai retornar

um colaborador ou um grupo pelo tipo de aprovação

String
getApproverType()

Retorna o tipo da aprovação, onde:
0 →Colaborador
1 →Grupo

int
getLevelId()Retorna o nível de aprovação, no caso de aprovação em níveisint


Exemplo de utilização:

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



DocumentSegurityConfigDto


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


FunçãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
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 colaborador ou o código do grupo que

está na segurança deste documento. É possível saber se vai

retornar um colaborador 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 →Colaborador;
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údoboolean
getSecurityLevel()

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

  • 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çãoint
getSecurityVersion()Retorna se ele utiliza a segurança deste versão nas demaisboolean


Exemplo de utilização:

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çãoDescrição da FunçãoTipo do Retorno
getDocumentId()Retorna o número do documentoint
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



Exemplo de utilização

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 ECM 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 ECM, 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:

  • event (String): Informa qual o tipo de evento que foi efetuado com o documento, conforme a tabela abaixo:
EventoDescrição
PUBLISHUm novo documento publicado.
MODIFYDocumento é modificado
DELETEDocumento é excluído da base de dados.
SENDRECYCLEDocumento é enviado para lixeira.
DELETEFOLDERUma pasta é excluída da base de dados.
EXTERNALCONVERTIONDocumento com conversão customizada.
CONVERTIONLONGTERMDocumento convertido para longo prazo.
MOVE

Um ou mais documento ou pastas foram

movidos de uma pasta para outra.

RESTORERECYCLERestaura 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.


Exemplo de utilização:

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 ECM , conforme tabela abaixo:

ObjetoDescriçãoTabela no BD
GroupGrupoGRUPO
ColleagueGroupGrupo do ColaboradorGRUPO_COLABORADOR
IconÍconeICONE
TopicAssuntoASSUNTO
ShortcutSegurança de MenuMENU_ICONE
ColleagueColaboradorCOLABORADOR
LogAccessLog de AcessoLOG_ACCESS
ColleagueReplacementSubstitutoCOLAB_SUBSTTO
ApplicationAplicativoAPLICATIVO
ProgressLibAmbiente ProgressAMBIEN_PROGRESS
GlobalCalendarFeriadoCALEND_GLOBAL
WorkflowRolePapel WorkflowPAPEL_WORKFLOW
GlobalParamParâmetros GeraisPARAM_GERAL
TermTermoTERMO
SynonymSinônimoSINONIMO
DocumentTypeTipo do DocumentoTIPO_DOCUMENTO
VolumeVolumeVOL_FISIC
AttributionMecanismMecanismo de AtribuiçãoMECAN_ATRIBUIC
EmailTemplateTemplate de EmailTEMPLATE_EMAIL
CustomizedDatasetBuilderDatasetSERV_DATASET
DataServiceServiçosSERV_DADOS
CustomFieldsCampos CustomizadosCAMPO_CUSTOM
UserGraphicSetingsDashBoardCONFIGUR_GRAF_USUAR
WatermarkMarca D’águaMARCA_DAGUA
WebLayoutLayoutWEBLAYOUT
AdapterAdaptadoresADAPTER


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")
})


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:
EventoDescrição
CREATEUm novo objeto foi criado.
UPDATEUm objeto foi modificado
DELETEUm 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.



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

Exemplo de utilização:

package com.totvs.ecm.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;
    }
  }