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();
    }
}