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