package cyrille.hibernate.temporal.sinistre; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; 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.OneToMany; 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> * Sinistre 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 = "sinistre") public class Sinistre implements Comparable<Sinistre> { @Id @GeneratedValue protected Long id; @Basic @Column(name = "numero_declaration") protected String numeroDeclaration; @Basic @Column(name = "numero_sinistre") protected String numeroSinistre; @ManyToOne(cascade = CascadeType.ALL, optional = false) @JoinColumn(name = "last_sinistre_version_id", nullable = false) protected SinistreVersion lastSinistreVersion; @OneToMany(mappedBy = "sinistre", cascade = CascadeType.ALL) protected List<Evenement> evenements = new ArrayList<Evenement>(); @OneToMany(mappedBy = "sinistre", cascade = CascadeType.ALL) protected List<Dommage> dommages = new ArrayList<Dommage>(); @Transient protected SinistreVersion workingCopy; public Sinistre() { super(); } public Sinistre(String numeroSinistre, String numeroDeclaration) { super(); this.numeroDeclaration = numeroDeclaration; this.numeroSinistre = numeroSinistre; } /** * Comparaison sur {@link #getNumeroSinistre()}. */ public int compareTo(Sinistre other) { return new CompareToBuilder().append(this.numeroSinistre, other.numeroSinistre).toComparison(); } @Override public boolean equals(Object obj) { if (false == (obj instanceof Sinistre)) { return false; } final Sinistre other = (Sinistre) obj; return new EqualsBuilder().append(this.id, other.id).isEquals(); } public String getCodeAssureur() { return getCurrentSinistreVersion().getCodeAssureur(); } protected SinistreVersion getCurrentSinistreVersion() { return this.lastSinistreVersion; } public Timestamp getDateSituation() { return getCurrentSinistreVersion().getDateSituation(); } public String getDescription() { return getCurrentSinistreVersion().getDescription(); } public List<Dommage> getDommages() { return dommages; } public List<Evenement> getEvenements() { return evenements; } public Long getId() { return id; } public String getNumeroDeclaration() { return numeroDeclaration; } public String getNumeroSinistre() { return numeroSinistre; } public synchronized SinistreVersion getWorkingCopy() { if (this.workingCopy == null) { SinistreVersion currentSinistreVersion = getCurrentSinistreVersion(); SinistreVersion newWorkingCopy; if (currentSinistreVersion == null) { newWorkingCopy = new SinistreVersion(); } else { newWorkingCopy = currentSinistreVersion.copy(); } newWorkingCopy.setDateSituation(new Timestamp(System.currentTimeMillis())); // add forward linking here // no exception during working copy initialization, associate this.lastSinistreVersion = newWorkingCopy; this.workingCopy = newWorkingCopy; } return workingCopy; } @Override public int hashCode() { return new HashCodeBuilder().append(this.id).toHashCode(); } public void setCodeAssureur(String codeAssureur) { getWorkingCopy().setCodeAssureur(codeAssureur); } public void setDescription(String description) { getWorkingCopy().setDescription(description); } public void setDommages(List<Dommage> dommages) { this.dommages = dommages; } public void setEvenements(List<Evenement> evenements) { this.evenements = evenements; } public void setId(Long id) { this.id = id; } public void setNumeroDeclaration(String numeroDeclaration) { this.numeroDeclaration = numeroDeclaration; } public void setNumeroSinistre(String numeroSinistre) { this.numeroSinistre = numeroSinistre; } @Override public String toString() { return new ToStringBuilder(this).append("id", this.id).append("numeroSinistre", this.numeroSinistre).append( "numeroDeclaration", this.numeroDeclaration).append("lastSinistreVersion", this.lastSinistreVersion) .toString(); } }