package cyrille.hibernate.temporal.sinistre; import java.sql.Timestamp; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang.builder.CompareToBuilder; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; /** * <p> * Evenement avec versionnage par pattern <a * href="http://martinfowler.com/ap2/temporalObject.html">Temporal Object</a> * </p> * * @author <a href="mailto:cleclerc@xebia.fr">Cyrille Le Clerc</a> */ @Entity @Table(name = "evenement") public class Evenement implements Comparable<Evenement> { @ManyToOne(cascade = CascadeType.ALL, optional = false) @JoinColumn(name = "last_evenement_version_id", nullable = false) protected EvenementVersion lastEvenementVersion; @Id @GeneratedValue protected Long id; @Basic @Column(name = "numero_fonctionnel") protected String numeroFonctionnel; @ManyToOne @JoinColumn(name = "sinistre_id", nullable = false) protected Sinistre sinistre; @Transient protected EvenementVersion workingCopy; public Evenement() { super(); } public Evenement(String numeroFonctionnel) { super(); this.numeroFonctionnel = numeroFonctionnel; } /** * Comparaison sur {@link #getId()}. */ public int compareTo(Evenement other) { return new CompareToBuilder().append(this.id, other.id).toComparison(); } @Override public boolean equals(Object obj) { if (false == (obj instanceof Evenement)) { return false; } final Evenement other = (Evenement) obj; return new EqualsBuilder().append(this.id, other.id).isEquals(); } protected EvenementVersion getCurrentEvenementVersion() { return this.lastEvenementVersion; } public Timestamp getDateSituation() { return getCurrentEvenementVersion().getDateSituation(); } public String getDescription() { return getCurrentEvenementVersion().getDescription(); } public Long getId() { return id; } public String getNumeroFonctionnel() { return numeroFonctionnel; } public synchronized EvenementVersion getWorkingCopy() { if (this.workingCopy == null) { EvenementVersion currentEvenementVersion = getCurrentEvenementVersion(); EvenementVersion newWorkingCopy; if (currentEvenementVersion == null) { newWorkingCopy = new EvenementVersion(); } else { newWorkingCopy = currentEvenementVersion.copy(); } newWorkingCopy.setDateSituation(new Timestamp(System.currentTimeMillis())); // add forward linking here // no exception during working copy initialization, associate this.lastEvenementVersion = newWorkingCopy; this.workingCopy = newWorkingCopy; } return workingCopy; } @Override public int hashCode() { return new HashCodeBuilder().append(this.id).toHashCode(); } public void setDescription(String description) { getWorkingCopy().setDescription(description); } public void setId(Long id) { this.id = id; } public void setLabelEvenement(String labelEvenement) { getWorkingCopy().setLabelEvenement(labelEvenement); } public void setNumeroFonctionnel(String numeroDeclaration) { this.numeroFonctionnel = numeroDeclaration; } @Override public String toString() { return new ToStringBuilder(this).append("id", this.id).append("numeroFonctionnel", this.numeroFonctionnel).append( "lastEvenementVersion", this.lastEvenementVersion).append("sinistre", this.sinistre).toString(); } public Sinistre getSinistre() { return sinistre; } public void setSinistre(Sinistre sinistre) { this.sinistre = sinistre; } }