Home

TOTVS | Plataformas e tecnologias

Árvore de páginas

Versões comparadas

Chave

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

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.

Índice
maxLevel4
outlinetrue
exclude.*ndice
stylenone

...

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: 


Bloco de código
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:

 


Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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.

...

Bloco de código
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.

...

Bloco de código
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
Nota
titleAtençã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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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

...

 



Informações
titleObservação

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

...

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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:

Bloco de código
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

Bloco de código
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:

...

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

Bloco de código
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:

Bloco de código
@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.

 

...



Informações

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