AbstractSABSSlidingScale.java
package com.tradecloud.domain.sabs;
import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.event.Event;
import com.tradecloud.domain.event.SABSSlidingScaleEvent;
import com.tradecloud.domain.state.Stateful;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.ForeignKey;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.util.*;
@MappedSuperclass
public abstract class AbstractSABSSlidingScale extends PersistenceBase implements Stateful<SABSSlidingScaleState,
SABSSlidingScaleEvent> {
private final static Collection<SABSSlidingScaleState> NON_EDITABLE_STATES = Arrays.asList(SABSSlidingScaleState.LIQUIDATED,
SABSSlidingScaleState.SUSPENDED);
private static transient Logger log = Logger.getLogger(AbstractSABSSlidingScale.class);
private static final long serialVersionUID = 1L;
@ManyToOne
// @NotNull(message = "Currency is required")
@XmlElement(name = "Currency", required = true)
@ForeignKey(name = "fk_currency")
private Currency currency;
@XmlElement(name = "EffectiveDate")
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = true)
private Date effectiveDate = new Date();
@ManyToOne
@XmlElement(name = "Description", required = true)
@JoinColumn(name = "sabsslidingscaledescription_code", referencedColumnName = "code")
@ForeignKey(name = "fk_sabsslidingscaledescription")
private SABSSlidingScaleDescription sabsSlidingScaleDescription;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
@XmlElementWrapper(name = "SABSSlidingScaleUnitValues")
@XmlElement(name = "SABSSlidingScaleUnitValue")
private Set<SABSSlidingScaleUnitValue> sabsSlidingScaleUnitValue = new HashSet<SABSSlidingScaleUnitValue>();
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
@XmlElementWrapper(name = "SABSSlidingScaleIncrements")
@XmlElement(name = "SABSSlidingScaleIncrement")
private Set<SABSSlidingScaleIncrement> sabsSlidingScaleIncrement = new HashSet<SABSSlidingScaleIncrement>();
public AbstractSABSSlidingScale() {
super();
}
public AbstractSABSSlidingScale(SABSSlidingScaleDescription description, Date effectiveDate) {
super();
setSabsSlidingScaleDescription(description);
setEffectiveDate(effectiveDate);
}
public AbstractSABSSlidingScale(SABSSlidingScaleDescription description) {
super();
setSabsSlidingScaleDescription(description);
}
public AbstractSABSSlidingScale(SABSSlidingScaleDescription description, Date effectiveDate, Currency currency) {
super();
setSabsSlidingScaleDescription(description);
setEffectiveDate(effectiveDate);
setCurrency(currency);
}
/**
* SABSSlidingScaleState INITIALISED after object initialisation. (This is an internal
* state only)
*/
@NotNull
@XmlAttribute
@Enumerated(EnumType.STRING)
private SABSSlidingScaleState state = SABSSlidingScaleState.COMPLETE;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
@XmlElementWrapper(name = "SABSSlidingScaleEvents")
@XmlElement(name = "SABSSlidingScaleEvent")
@OrderBy("createDateTime")
private List<SABSSlidingScaleEvent> events = new LinkedList<SABSSlidingScaleEvent>();
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
public SABSSlidingScaleDescription getSabsSlidingScaleDescription() {
return sabsSlidingScaleDescription;
}
public void setSabsSlidingScaleDescription(SABSSlidingScaleDescription sabsSlidingScaleDescription) {
this.sabsSlidingScaleDescription = sabsSlidingScaleDescription;
}
public Date getEffectiveDate() {
return effectiveDate;
}
public void setEffectiveDate(Date effectiveDate) {
this.effectiveDate = effectiveDate;
}
public List<SABSSlidingScaleUnitValue> getSABSSlidingScaleUnitValue() {
return new ArrayList<SABSSlidingScaleUnitValue>(sabsSlidingScaleUnitValue);
}
public void setSABSSlidingScaleUnitValue(List<SABSSlidingScaleUnitValue> sabsSlidingScaleUnitValues) {
this.sabsSlidingScaleUnitValue = new HashSet<SABSSlidingScaleUnitValue>(sabsSlidingScaleUnitValues);
}
public List<SABSSlidingScaleIncrement> getSABSSlidingScaleIncrement() {
return new ArrayList<SABSSlidingScaleIncrement>(sabsSlidingScaleIncrement);
}
public void setSABSSlidingScaleIncrement(List<SABSSlidingScaleIncrement> sabsSlidingScaleIncrements) {
this.sabsSlidingScaleIncrement = new HashSet<SABSSlidingScaleIncrement>(sabsSlidingScaleIncrements);
}
@Override
public SABSSlidingScaleState getState() {
return state;
}
@Override
public void setState(SABSSlidingScaleState state) {
this.state = state;
}
@Override
public List<SABSSlidingScaleEvent> getEvents() {
return events;
}
public void setEvents(List<SABSSlidingScaleEvent> events) {
this.events = events;
}
@Override
public int hashCode() {
return new HashCodeBuilder().appendSuper(super.hashCode()).append(effectiveDate).append(sabsSlidingScaleDescription)
.append(currency).toHashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof AbstractSABSSlidingScale)) {
return false;
}
AbstractSABSSlidingScale other = (AbstractSABSSlidingScale) obj;
return new EqualsBuilder().appendSuper(super.equals(obj))
.append(sabsSlidingScaleDescription, other.getSabsSlidingScaleDescription())
.append(currency, other.getCurrency())
.append(effectiveDate, other.getEffectiveDate()).isEquals();
}
@Override
public SABSSlidingScaleEvent getLastEvent() {
return Event.getLastEvent(events);
}
@Override
public boolean inNonEditableState() {
return NON_EDITABLE_STATES.contains(state);
}
@Override
public String toString() {
return new ToStringBuilder(super.toString()).append("SABSSlidingScaleDescription", sabsSlidingScaleDescription)
.append("SABSSlidingScaleEffectiveDate", effectiveDate).toString();
}
}