package cyrille.hibernate.temporal.sinistre;
import java.sql.Timestamp;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
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>
* Dommage 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 = "dommage")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type_dommage")
public abstract class Dommage implements Comparable<Dommage> {
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "last_dommage_version_id", nullable = false)
protected DommageVersion lastDommageVersion;
@Id
@GeneratedValue
protected Long id;
@Basic
@Column(name = "code_type_dommage")
protected String codeTypeDommage;
@ManyToOne
@JoinColumn(name = "sinistre_id", nullable = false)
protected Sinistre sinistre;
@Transient
protected DommageVersion dommageWorkingCopy;
public Dommage() {
super();
}
public Dommage(String codeTypeDommage) {
super();
this.codeTypeDommage = codeTypeDommage;
}
/**
* Comparaison sur {@link #getId()}.
*/
public int compareTo(Dommage other) {
return new CompareToBuilder().append(this.id, other.id).toComparison();
}
@Override
public boolean equals(Object obj) {
if (false == (obj instanceof Dommage)) {
return false;
}
final Dommage other = (Dommage) obj;
return new EqualsBuilder().append(this.id, other.id).isEquals();
}
public String getCodeTypeDommage() {
return codeTypeDommage;
}
protected DommageVersion getCurrentDommageVersion() {
return this.lastDommageVersion;
}
public Timestamp getDateSituation() {
return getCurrentDommageVersion().getDateSituation();
}
public String getDescription() {
return getCurrentDommageVersion().getDescription();
}
public synchronized DommageVersion getDommageWorkingCopy() {
if (this.dommageWorkingCopy == null) {
DommageVersion currentDommageVersion = getCurrentDommageVersion();
DommageVersion newDommageWorkingCopy;
if (currentDommageVersion == null) {
newDommageWorkingCopy = new DommageVersion();
} else {
newDommageWorkingCopy = currentDommageVersion.copy();
}
newDommageWorkingCopy.setDateSituation(new Timestamp(System.currentTimeMillis()));
// add forward linking here
// no exception during working copy initialization, associate
this.lastDommageVersion = newDommageWorkingCopy;
this.dommageWorkingCopy = newDommageWorkingCopy;
}
return dommageWorkingCopy;
}
public Long getId() {
return id;
}
public String getLabelDommage() {
return getDommageWorkingCopy().getLabelDommage();
}
public Sinistre getSinistre() {
return sinistre;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(this.id).toHashCode();
}
public void setCodeTypeDommage(String numeroDeclaration) {
this.codeTypeDommage = numeroDeclaration;
}
public void setDescription(String description) {
getDommageWorkingCopy().setDescription(description);
}
public void setId(Long id) {
this.id = id;
}
public void setLabelDommage(String labelDommage) {
getDommageWorkingCopy().setLabelDommage(labelDommage);
}
public void setSinistre(Sinistre sinistre) {
this.sinistre = sinistre;
}
@Override
public String toString() {
return new ToStringBuilder(this).append("id", this.id).append("codeTypeDommage", this.codeTypeDommage).append(
"lastDommageVersion", this.lastDommageVersion).append("sinistre", this.sinistre).toString();
}
}