Olá pessoal!
Estou com um problema com a minha aplicação… Estou fazendo auditoria de algumas tabelas usando o Envers.
Criei a RevisionEntity:
[code]public class LogRevisaoListener implements RevisionListener {
@Override
public void newRevision(Object revisionEntity) {
LogRevisaoEntidade logRevisaoEntidade = (LogRevisaoEntidade) revisionEntity;
UsuarioPrincipal usuarioPrincipal = (UsuarioPrincipal) SecurityContextAssociation.getPrincipal();
if(usuarioPrincipal != null){
logRevisaoEntidade.setIpMaquina(usuarioPrincipal.getIp());
logRevisaoEntidade.setNomeMaquina(usuarioPrincipal.getNomeMaquina());
if(usuarioPrincipal.getUsuario() != null){
logRevisaoEntidade.setCodigoUsuario(usuarioPrincipal.getUsuario().getId());
logRevisaoEntidade.setNomeUsuario(usuarioPrincipal.getUsuario().getNome());
}
}
}
}[/code]
A LogRevisaoEntidade, para salvar informações adicionais sobre as tabelas auditadas (nesse caso o usuário, hora, IP e nome da máquina):
[code]
@Entity
@Table(name = “cad_LogRevisaoEntidade”)
@RevisionEntity(LogRevisaoListener.class)
public class LogRevisaoEntidade {
@Id
@GeneratedValue
@RevisionNumber
private long id;
@RevisionTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date dataRevisao;
private long codigoUsuario;
private String nomeUsuario;
private String ipMaquina;
private String nomeMaquina;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Date getDataRevisao() {
return dataRevisao;
}
public void setDataRevisao(Date dataRevisao) {
this.dataRevisao = dataRevisao;
}
public long getCodigoUsuario() {
return codigoUsuario;
}
public void setCodigoUsuario(long codigoUsuario) {
this.codigoUsuario = codigoUsuario;
}
public String getNomeUsuario() {
return nomeUsuario;
}
public void setNomeUsuario(String nomeUsuario) {
this.nomeUsuario = nomeUsuario;
}
public String getIpMaquina() {
return ipMaquina;
}
public void setIpMaquina(String ipMaquina) {
this.ipMaquina = ipMaquina;
}
public String getNomeMaquina() {
return nomeMaquina;
}
public void setNomeMaquina(String nomeMaquina) {
this.nomeMaquina = nomeMaquina;
}
}[/code]
E agora estou buscando as informações do banco:
public void pesquisarCadastros() throws ClassNotFoundException {
List<Object> listObject;
AuditQuery query;
// Cria o auditReader com o EntityManager da aplicação
auditReader = this.getAuditReader();
// Query principal, que vai chamar as revisões da classe selecionada
query = auditReader.createQuery().forRevisionsOfEntity(
Class.forName(classe), false, true);
// Se o usuário estiver selecionado, filtra por código do Usuário
if (usuario != null && usuario.getId() > 0) {
query.add(AuditEntity.revisionProperty("codigoUsuario").eq(
usuario.getId()));
}
// Se dataInicio e dataFim estiverem preenchidas, pesquisa registro
// entre as datas
// .ge - greater equal >=
// .le - lower equal <=
if (dataInicio != null && dataFim != null) {
query.add(AuditEntity.revisionProperty("dataRevisao").between(
dataInicio, dataFim));
} else if (dataInicio != null) {
query.add(AuditEntity.revisionProperty("dataRevisao")
.ge(dataInicio));
} else if (dataFim != null) {
query.add(AuditEntity.revisionProperty("dataRevisao").le(dataFim));
}
// Adicionando ordenação por id
query.addOrder(AuditEntity.property("id").desc());
listObject = query.getResultList();
}
Pois bem… Consigo obter informações do banco com o query.getResultList(). O meu problema maior é que o listObject recebe um ArrayList<E>, e cada posição desse list é um Array com 3 Objetos! Os 3 objetos são o retorno da query do Envers: na posição [0] há um objeto da tabela audited que eu referenciei através do atributo “classe”, na posição [1] um objeto LogRevisaoEntidade e na posição [2] um objeto RevisionType (que indica ADD, ALT ou REM, se o registro foi de adição, alteração ou exclusão).
Preciso colocar tudo isso em um p:dataTable com colunas dinâmicas, e tentei estudar o exemplo do site http://www.primefaces.org/showcase/ui/datatableDynamicColumns.jsf, mas até agora nada feito.
Alguém pode me ajudar? Já estou a dias tentando resolver isso…
Obrigada!