Java tutorial
/** * Copyright 2008 Autentia Real Business Solutions S.L. * * This file is part of Autentia WUIJA. * * Autentia WUIJA is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * Autentia WUIJA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Autentia WUIJA. If not, see <http://www.gnu.org/licenses/>. */ package com.autentia.wuija.trace; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; import org.springframework.security.userdetails.UserDetails; import com.autentia.wuija.security.SecurityUtils; /** * Esta clase representa una accin de usuario. No se trata de un mensaje que se vuelva en un log, sino de una accin de * usuario que luego se puede utilizar para auditar como usan los usuarios el sistema. * <p> * Guarda la informacin bsica de una traza: el quin ({@link Trace#who}) y el cundo ({@link Trace#whenDate}). El qu * viene determinado por el propio tipo de la clase. Por esto esta clase es abstracta, as el sistema obliga ha hacer * clases hijas de esta para determinar el tipo concreto de la traza. * <p> * Tambin hay que indicar (es obligatorio) la aplicacin que est dejando la traza ({@link Trace#application}). Esto es * necesario porque el sistema de trazas es genrico, es decir, una vez instalado en el Servidor de Aplicaciones, muchas * aplicaciones pueden usarlo. De esta forma, a la hora de consultar las trazas, se puede filtrar por aplicacin. Ser * el {@link Tracer} el encargado de inicializar este valor. * <p> * La jerarqua de clases entre las trazas permite hacer bsquedas jerrquicas, es decir, se pueden buscar todas las * trazas dando la clase padre de la jerarqua de clases; por ejemplo: se pueden buscar todas las trazas de persistencia * (insert, update, ...) * <p> * Es recomendable que todos los tipos de traza reimplementen el mtodo <code>toString()</code> para facilitar el * volcado en los logs. * <p> * Para mejorar el rendimiento a la hora de guardar o recuperar las trazas en la base de datos, se utiliza una nica * tabla as que se debe garantizar que esta tabla tiene campos suficientes para albergar toda la informacin de todas * las trazas. Como contrapartida, toda la informacin de las trazas hijas tendr que permitir nulos en la base de * datos. * <p> * Para facilitar la creacin del modelo de datos, en esta clase ya se crean varios campos de tipo cadena genricos * (string1, string2) que las clases hijas podrn usar para guardar su informacin adicional. * <p> * Recuerde que debe dar de alta esta y todas las clases de traza que utilice en su fichero de mapeo de Hibernate. * * @author Autentia Real Business Solutions */ @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class Trace { /** Nombre de la aplicacin donde se origin la traza. */ @NotEmpty private String application; /** Id de la entidad. Usado por Hibernate */ @Id @GeneratedValue private Integer id; private String string1; private String string2; /** Fecha en la que se gener la traza. Se guarda un timestap, es decir, el da y la hora. */ @NotNull @Temporal(TemporalType.TIMESTAMP) private Date whenDate = new Date(); // NOPMD - cannot be final, used by hibernate /** Quien ha provocado la traza. */ @NotEmpty private String who; // NOPMD - cannot be final, used by hibernate /** * Slo las clases hijas pueden crear instancias de esta clase. */ protected Trace() { final UserDetails userDetails = SecurityUtils.getAuthenticatedUser(); who = userDetails == null ? "unknown" : userDetails.getUsername(); } @Override public boolean equals(Object obj) { try { final Trace other = (Trace) obj; final EqualsBuilder eqb = new EqualsBuilder(); eqb.append(getWho(), other.getWho()); eqb.append(getWhenDate(), other.getWhenDate()); eqb.append(getApplication(), other.getApplication()); eqb.append(getString1(), other.getString1()); eqb.append(getString2(), other.getString2()); return eqb.isEquals(); } catch (Exception e) { return false; // Si hay algn error es que no son iguales. } } public String getApplication() { return application; } protected String getString1() { return string1; } protected String getString2() { return string2; } public Date getWhenDate() { return whenDate; } public String getWho() { return who; } @Override public int hashCode() { final HashCodeBuilder hcb = new HashCodeBuilder(); hcb.append(getWho()); hcb.append(getWhenDate()); hcb.append(getApplication()); hcb.append(getString1()); hcb.append(getString2()); return hcb.toHashCode(); } void setApplication(String application) { this.application = application; } protected void setString1(String string1) { this.string1 = string1; } protected void setString2(String string2) { this.string2 = string2; } @Override public String toString() { return getClass().getSimpleName() + ": id=" + id + ", app=" + application + ", when=" + whenDate + ", who=" + who; } }