Histórico da Página
...
São disponibilizadas algumas propriedades referentes ao documento que esta sendo criado ou editado, porem somente para consulta através do método getValue.
Propriedade | Descrição | Tipo |
WKDocument | Objeto do Documento | DocumentDto |
WKSubject | Descrição do Assunto do documento | String |
WKListApprover | Lista dos Aprovadores do documento | List<ApproverDto> |
WKListSecurity | Lista com a segurança do documento | List <DocumentSecurityConfigDto> |
WKListRelatedDocument | Lista com os documentos relacionados ao documento | List< RelatedDocumentDto> |
WKState | Estado da ação: PUBLISH ou MODIFY | String |
WKUser | Usuário logado | String |
WKCompany | Código da Empresa | int |
...
Bloco de código | ||||
---|---|---|---|---|
| ||||
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;
}
}
|