Histórico da Página
Índice
Í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 plugin Fluig Designer. 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 Designer.
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 Designer.
É 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:
- 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:
Bloco de código | ||
---|---|---|
| ||
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:
Bloco de código | ||
---|---|---|
| ||
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:
Bloco de código | ||
---|---|---|
| ||
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 |
Bloco de código | ||||
---|---|---|---|---|
| ||||
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.
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 diversos 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.
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.
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 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) |
Bloco de código | ||||
---|---|---|---|---|
| ||||
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.
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”, caso o campo não esteja disponível para este documento.
Bloco de código | ||||
---|---|---|---|---|
| ||||
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.
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, 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 |
WKDocumentTypeId | ID 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 |
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.
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 |
Informações | ||
---|---|---|
| ||
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.
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.
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.
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.
Propriedade | Descrição | Tipo |
WKDocument | Objeto do Documento | DocumentDto |
WKUser | Usuário logado. | String |
WKCompany | Código da Empresa | int |
Informações | ||
---|---|---|
| ||
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 usuário com matrícula "+ ds.getValue(0,"colleagueId"); } } |
BeforeStatyEntry ?
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 |
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çã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 |
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"; } } } |
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 |
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çã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 |
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 Fluig tem customização de eventos JMS, permitindo criar procedimentos de auditoria com base nas informações fornecidas pelo produto. O JMS (Java Message Service) é uma API Java™ que provê uma conexão assíncrona entre aplicações por meio de troca de mensagens.
O produto dispara dois tipos de mensagens JMS customizáveis, o wdkDocument e o wdkAbstract.
O wdkDocument será disparado quando houver manipulação nos documentos do Fluig, para a aplicação receber a mensagem com as informações do documento a classe tem que estender o MessageListener e ter a seguinte linha:
Bloco de código | ||
---|---|---|
| ||
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkDocument")}) |
O objeto de retorno será um MapMessage que conterá os seguintes parâmetros:
- event (String): Informa qual o tipo de evento que foi efetuado com o documento, conforme a tabela abaixo:
Evento | Descrição |
PUBLISH | Um novo documento publicado. |
MODIFY | Documento é modificado |
DELETE | Documento é excluído da base de dados. |
SENDRECYCLE | Documento é enviado para lixeira. |
DELETEFOLDER | Uma pasta é excluída da base de dados. |
EXTERNALCONVERTION | Documento com conversão customizada. |
CONVERTIONLONGTERM | Documento convertido para longo prazo. |
MOVE | Um ou mais documento ou pastas foram movidos de uma pasta para outra. |
RESTORERECYCLE | Restaura documentos e pastas da Lixeira. |
- companyId (Integer): Código da empresa em que o documento foi manipulado.
- colleagueId (String): Usuário que efetuou a ação.
- documentId (Integer): Código do documento que sofreu a ação.
- version (Integer): Número da versão do documento.
- lhasCreatedDocument (Boolean): Informa se criou o documento.
- IhasIncreasedVersion (Boolean): Informa se foi incrementada a versão.
- changedApproval (Boolean): Informa se o aprovador foi modificado.
- documento (byte[ ]): Array de bytes com o documento e suas propriedades.
Bloco de código | ||||
---|---|---|---|---|
| ||||
import java.util.Enumeration; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageListener; @MessageDriven(mappedName = "custom/DocumentListener", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkDocument") }) public class DocumentListenerMessageBean implements MessageListener { @Override public void onMessage(Message message) { try { System.out.println("========Document Listener========"); System.out.println("Message received: " + message.getJMSMessageID()); if (message instanceof MapMessage) { MapMessage mm = (MapMessage) message; @SuppressWarnings("unchecked") Enumeration<String> es = mm.getMapNames(); while (es.hasMoreElements()) { String prop = es.nextElement(); System.out.println(prop + ": " + mm.getObject(prop)); } } System.out.println("========Fim Document Listener========"); } catch (Exception e) { e.printStackTrace(); } } } |
O wdkAbstract será disparado quando houver manipulação em alguns objetos no Fluig, conforme tabela abaixo:
Objeto | Descrição | Tabela no BD |
Icon | Ícone | ICONE |
Topic | Assunto | ASSUNTO |
Shortcut | Segurança de Menu | MENU_ICONE |
LogAccess | Log de Acesso | LOG_ACCESS |
ColleagueReplacement | Substituto | COLAB_SUBSTTO |
Application | Aplicativo | APLICATIVO |
ProgressLib | Ambiente Progress | AMBIEN_PROGRESS |
GlobalCalendar | Feriado | CALEND_GLOBAL |
Term | Termo | TERMO |
Synonym | Sinônimo | SINONIMO |
DocumentType | Tipo do Documento | TIPO_DOCUMENTO |
Volume | Volume | VOL_FISIC |
AttributionMecanism | Mecanismo de Atribuição | MECAN_ATRIBUIC |
EmailTemplate | Template de Email | TEMPLATE_EMAIL |
CustomizedDatasetBuilder | Dataset | SERV_DATASET |
DataService | Serviços | SERV_DADOS |
CustomFields | Campos Customizados | CAMPO_CUSTOM |
UserGraphicSetings | DashBoard | CONFIGUR_GRAF_USUAR |
Watermark | Marca D’água | MARCA_DAGUA |
WebLayout | Layout | WEBLAYOUT |
Adapter | Adaptadores | ADAPTER |
Para a aplicação receber a mensagem com as informações destes objetos a classe tem que estender o MessageListener e ter a seguinte linha:
Bloco de código | ||
---|---|---|
| ||
@MessageDriven(mappedName = "custom/DocumentListener", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/wdkAbstract")}) |
O objeto de retorno será um MapMessage que conterá os seguintes parâmetros:
- event (String): Informa qual o tipo de evento que foi efetuado com o objeto, conforme a tabela abaixo:
Evento | Descrição |
CREATE | Um novo objeto foi criado. |
UPDATE | Um objeto foi modificado |
DELETE | Um objeto foi excluído da base de dados. |
- userId (String): Usuário que efetuou a ação.
- entity (String): Entidade do objeto que está sendo manipulado, conforme a tabela de objeto que já foi apresentada acima.
- mapNewVersion (byte[ ]): Array de bytes de um HashMap<String, Object> com as propriedade do objeto.
- mapPreviousVersion (byte[ ]): Array de bytes de um HashMap<String, Object> com as propriedade do objeto antes da alteração.
Informações | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
private Map<String, Object> decoderMap(byte[] array) { if(array.length>0){ ByteArrayInputStream bos = new ByteArrayInputStream(array); ObjectInputStream p = new ObjectInputStream(bos); Object docObject = p.readObject(); try{ Map<String, Object> map = (Map<String, Object>) docObject; return map; }catch(java.lang.ClassCastException e){ e.printStackTrace(); } } return null; } |
Bloco de código | ||||
---|---|---|---|---|
| ||||
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; } } |
Third Party Trademarks
Adobe, Flash, Flex, Flex Builder, PostScript and Reader are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries.
Apache is a trademark of The Apache Software Foundation.
Firefox and Mozilla are registered trademarks of the Mozilla Foundation.
JavaScript is a trademark of Oracle Corporation.
Microsoft, Active Directory, Excel, Internet Explorer, Outlook, PowerPoint, SQL Server, Windows and Windows Vista are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.
MySQL is a trademark of Oracle Corporation and/or its affiliates.
Oracle, Java and OpenOffice.org are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
Progress and OpenEdge are trademarks or registered trademarks of Progress Software Corporation or one of its subsidiaries or affiliates in the U.S. and other countries.
Red Hat and JBoss are registered trademarks of Red Hat, Inc. in the United States and other countries.
Any other third party trademarks are the property of their respective owners.