Jboss Envers [DUVIDAS] [RESOLVIDO]

Pessoal estou dando uma estudada no envers da Jboss e tentei fazer uma aplicacao basica aqui (tentando copiar os exemplos do site da Jboss)

obs: nao baixei o demo do console pq aqui no trabalho tem um limite de download e tem que fazer uma solicitacao, as vezes demora um pouco, por isso eu copiei as classes do svn e tentei fazer uma aplicacao bem parecida

a aplicacao esta funcionando normalmente, seguem os fontes

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="enversPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>envers.Address</class> <class>envers.Person</class> <properties> <property name="hibernate.connection.username" value="admin"/> <property name="hibernate.connection.password" value="admin"/> <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver"/> <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/envers"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <!-- Envers listeners --> <property name="hibernate.ejb.event.post-insert" value="org.jboss.envers.event.VersionsEventListener"/> <property name="hibernate.ejb.event.post-update" value="org.jboss.envers.event.VersionsEventListener"/> <property name="hibernate.ejb.event.post-delete" value="org.jboss.envers.event.VersionsEventListener"/> <!-- Envers properties - changing the name of the generated fields --> <property name="org.jboss.envers.revisionTypeFieldName" value="VER_REV_TYPE"/> <property name="org.jboss.envers.revisionFieldName" value="VER_REV"/> </properties> </persistence-unit> </persistence>

[code]package envers;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.jboss.envers.RevisionEntity;
import org.jboss.envers.RevisionNumber;
import org.jboss.envers.RevisionTimestamp;

/**
*

  • @author bernardo
    */
    @Entity
    @RevisionEntity(RevListener.class)
    @Table
    public class RevEntity implements Serializable {
    private static final long serialVersionUID = 6931265833296051260L;

    @Id
    @GeneratedValue
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private long time_stamp;

    private String user_name;

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public long getTime_stamp() {
    return time_stamp;
    }

    public void setTime_stamp(long time_stamp) {
    this.time_stamp = time_stamp;
    }

    public String getUser_name() {
    return user_name;
    }

    public void setUser_name(String user_name) {
    this.user_name = user_name;
    }

    @Override
    public boolean equals(Object obj) {
    if (obj == null) {
    return false;
    }
    if (getClass() != obj.getClass()) {
    return false;
    }
    final RevEntity other = (RevEntity) obj;
    if (this.id != other.id) {
    return false;
    }
    if (this.time_stamp != other.time_stamp) {
    return false;
    }
    if ( !(this.user_name.equals(other.user_name)) && (this.user_name == null || !this.user_name.equals(other.user_name))) {
    return false;
    }
    return true;
    }

    @Override
    public int hashCode() {
    int hash = 3;
    hash = 19 * hash + this.id;
    hash = 19 * hash + (int) (this.time_stamp ^ (this.time_stamp >>> 32));
    hash = 19 * hash + (this.user_name != null ? this.user_name.hashCode() : 0);
    return hash;
    }
    }[/code]

[code]package envers;

import org.jboss.envers.RevisionListener;

/**
*

  • @author bernardo
    */
    public class RevListener implements RevisionListener {

    public void newRevision(Object revisionEntity) {
    RevEntity revEntity = (RevEntity) revisionEntity;
    revEntity.setUser_name(“Bernardo”);
    }
    }
    [/code]

[code]package envers;

import java.io.Serializable;
import org.jboss.envers.Versioned;

import javax.persistence.*;

/**

  • @author Adam Warski (adam at warski dot org)
    */
    @Entity
    public class Person implements Serializable {
    private static final long serialVersionUID = -4041229582648176872L;

    @Id
    @GeneratedValue
    private int id;

    @Versioned
    private String name;

    @Versioned
    private String surname;

    @Versioned
    @ManyToOne
    private Address address;

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getSurname() {
    return surname;
    }

    public void setSurname(String surname) {
    this.surname = surname;
    }

    public Address getAddress() {
    return address;
    }

    public void setAddress(Address address) {
    this.address = address;
    }

    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Person)) return false;

     Person person = (Person) o;
    
     if (id != person.id) return false;
     if (name != null ? !name.equals(person.name) : person.name != null) return false;
     if (surname != null ? !surname.equals(person.surname) : person.surname != null) return false;
    
     return true;
    

    }

    @Override
    public int hashCode() {
    int result;
    result = id;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    result = 31 * result + (surname != null ? surname.hashCode() : 0);
    return result;
    }
    }[/code]

soh que eu estou com uma duvida … como eu vou fazer o link para saber qual usuario efetuou a alteracao na entidade.

na revisao da entidade nao existe nenhuma referencia para o usuario

aqui uma linha da tabela reventity
65536 1223304533484 Bernardo

aqui uma linha da tabela person_versions
32768 65536 0 James Bond 1
32769 65536 0 John McClane 2
32770 65536 0 Holly Gennaro 2

a tabela de versao mantem todo o historico, mas como eu faco o link para saber quem fez a alteracao?

EDIT
Esquecam a pergunta … nao tinha reparado que pelo REV_VER da para ver quem fez a alteracao.

rollei,

na seguinte linha da classe RevListener:

revEntity.setUser_name("Bernardo");  

como faço para setar o nome do usuário dinamicamente através de um filtro ou algo assim?

Quando o usuário faz o login coloca ele na sessão.Assim você sempre saberá quem está fazendo a alteração.

Valeu Rafael!

Criei um Managed Bean com escopo de sessão que mantem as informações do usuário no momento em que ele faz o login.

Como faço para que através de outro bean eu consiga pegar essas informações do usuário?

Eu consegui pegar as informações e colocar ela num input hidden através de expression language na view, mas queria que o handler fizesse isso sem passar pela view.

Grato,

Tudo certo!

Criei um handler com a variavel de login e defini ele no faces-config com escopo de sessão.

Na classe handler:

public class AutenticadorHandler {

	private String login;
	private boolean logado = false;

No faces-config:

	<managed-bean>
		<managed-bean-name>autenticadorHandler</managed-bean-name>
		<managed-bean-class>br.gov.ac.tce.sigma.user.controller.AutenticadorHandler</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

Na classe que implementa o RevisionListener fiz um lookup para o handler que está na sessão:

public void newRevision(Object revisionEntity) {
		try {
			FacesContext facesContext = FacesContext.getCurrentInstance();
			ELContext elContext = facesContext.getELContext();
			ELResolver resolver = facesContext.getApplication().getELResolver();
			AutenticadorHandler handler = (AutenticadorHandler) resolver
					.getValue(elContext, null, "autenticadorHandler");

			if (handler.getLogin() != null) {
				this.login = handler.getLogin();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		Revision revision = (Revision) revisionEntity;
		revision.setData(System.currentTimeMillis());
		revision.setUsuario(login);		
	}

E pronto!
Poderia ter utilizado o servidor para fazer a injeção de dependencia de AutenticadorHandler, mas preferi assim.

Até mais!