Jboss Envers [DUVIDAS] [RESOLVIDO]

4 respostas
rollei

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

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.

4 Respostas

J

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?

R

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

J

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,

J

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!

Criado 6 de outubro de 2008
Ultima resposta 2 de jun. de 2010
Respostas 4
Participantes 3