TurnInTransaction.java

package com.tradecloud.domain.demurrage;

import com.tradecloud.domain.base.utils.DateUtils;
import com.tradecloud.domain.base.utils.ObjectUtil;
import com.tradecloud.domain.comment.AddedComment;
import com.tradecloud.domain.comment.AddedCommentI;
import com.tradecloud.domain.comment.CommentType;
import com.tradecloud.domain.comment.Commentable;
import com.tradecloud.domain.event.Event;
import com.tradecloud.domain.event.TurnInTransactionEvent;
import com.tradecloud.domain.state.Stateful;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.ForeignKey;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 *
 */
@Entity
@Table(name = "turnintransaction")
public class TurnInTransaction extends DemurrageTransaction implements Commentable<AddedComment>,
        Stateful<DemurrageTransactionState, TurnInTransactionEvent> {

    @XmlAttribute
    @Temporal(TemporalType.DATE)
    private Date detentionFromDate;

    @XmlAttribute
    @Temporal(TemporalType.DATE)
    private Date detentionToDate;

    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "turnintransaction_freetextcomments", joinColumns = {@JoinColumn(name = "turnintransaction_id", unique = false)})
    @Column(name = "reason", unique = true)
    @ForeignKey(name = "fk_turnintransaction")
    @Fetch(value = FetchMode.SUBSELECT)
    @XmlElementWrapper(name = "FreeTextComments")
    @XmlElement(name = "FreeTextComment")
    private List<AddedComment> comments = new ArrayList<AddedComment>();

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @Fetch(value = FetchMode.SUBSELECT)
    @ForeignKey(name = "fk_turnintransaction", inverseName = "fk_turnintxevent")
    @JoinTable(name = "turnintx_turninevent",
            joinColumns = @JoinColumn(name = "turnin_id"),
            inverseJoinColumns = @JoinColumn(name = "turnintxevent_id"))
    @XmlElementWrapper(name = "TurnInTransactionEvents")
    @XmlElement(name = "TurnInTransactionEvent")
    @OrderBy("created DESC")
    private List<TurnInTransactionEvent> events = new LinkedList<TurnInTransactionEvent>();

    public Date getDetentionFromDate() {
        return detentionFromDate;
    }

    public void setDetentionFromDate(Date detentionFromDate) {
        this.detentionFromDate = detentionFromDate;
    }

    public Date getDetentionToDate() {
        return detentionToDate;
    }

    public void setDetentionToDate(Date detentionToDate) {
        this.detentionToDate = detentionToDate;
    }

    public int getDaysInDetention() {
        return ObjectUtil.allNotNull(detentionFromDate, detentionToDate)
                ? (DateUtils.getDaysBetween(detentionFromDate, detentionToDate) + 1) : 0;
    }

    /**
     * @return the comments
     */
    @Override
    public List<AddedComment> getComments() {
        return comments;
    }

    /**
     * @param comments the comments to set
     */
    @Override
    public void setComments(List<AddedComment> comments) {
        this.comments = comments;
    }

    private void appendIfNotNull(String stringToAdd, StringBuilder builder) {
        if (stringToAdd != null) {
            if (builder.length() > 0) {
                builder.append(", ");
            }
            builder.append(stringToAdd);
        }
    }

    public String prettyPrintComments() {
        StringBuilder builder = new StringBuilder();
        if (getComments() != null) {
            for (AddedComment co : comments) {
                appendIfNotNull(co.getReason(), builder);
            }
        }
        return builder.toString();
    }

    public void setEvents(List<TurnInTransactionEvent> events) {
        this.events = events;
    }

    @Override
    public TurnInTransactionEvent getLastEvent() {
        return Event.getLastEvent(events);
    }

    @Override
    public boolean inNonEditableState() {
        return true;
    }

    @Override
    public List<TurnInTransactionEvent> getEvents() {
        return events;
    }

    @Override
    public String getCommentsAsString() {
        return AddedCommentI.commentsAsString(getComments());
    }

    @Override
    public CommentType getCommentType() {
        return CommentType.TURNINTRANSACTION;
    }
}