AuctionItem.java

package ejava.examples.asyncmarket.bo;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;

import javax.persistence.*;

@NamedQueries({
    @NamedQuery(name="AsyncMarket_getAuctionItems",
            query="select ai from AuctionItem ai"),
    @NamedQuery(name="AsyncMarket_getAvailableAuctionItems",
            query="select ai from AuctionItem ai " +
                    "where ai.closed = false")
})
@Entity @Table(name="ASYNCMARKET_AUCTIONITEM")
public class AuctionItem implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    
    @Version
    private long version;
    
    @Column(length=32)
    private String name;
    @Column(length=32)
    private String productId;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date startDate;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date endDate;
    
    private double minBid;
    
    @ManyToOne(optional=false, fetch=FetchType.LAZY)
    private Person owner;
    
    @OneToMany(mappedBy="item",
               fetch=FetchType.LAZY,
               cascade= {CascadeType.PERSIST,
                         CascadeType.REMOVE})
    private List<Bid> bids = new ArrayList<Bid>();
    private boolean closed=false;
    
    @OneToOne(fetch=FetchType.EAGER)
    private Bid winningBid;
    
    public AuctionItem() {}
    public AuctionItem(long id) { setId(id); }
    
    public long getId() {
        return id;
    }
    private void setId(long id) {
        this.id = id;
    }
    
    public long getVersion() {
        return version;
    }
    public void setVersion(long version) {
        this.version = version;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public String getProductId() {
        return productId;
    }
    public void setProductId(String productId) {
        this.productId = productId;
    }

    public double getMinBid() {
        return minBid;
    }
    public void setMinBid(double minBid) {
        this.minBid = minBid;
    }
    
    public Date getEndDate() {
        return endDate;
    }
    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
    
    public Date getStartDate() {
        return startDate;
    }
    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Person getOwner() {
        return owner;
    }
    public void setOwner(Person owner) {
        this.owner = owner;
    }
    
    public void closeBids() {
        closed=true;
        setWinningBid(getHighestBid());        
    }
    
    public void setClosed(boolean closed) {
        this.closed = closed;
    }
    public boolean isClosed() {
        return closed;
    }
    
    public List<Bid> getBids() {
        return bids;
    }
    public void setBids(List<Bid> bids) {        
        this.bids = bids;
    }
    
    public void addBid(Bid bid) throws IllegalArgumentException {
        Bid highest = getHighestBid();
        if (highest == null || bid.getAmount() > highest.getAmount()) {
            bids.add(bid);
        }
    }
    
    @Transient
    public Bid getHighestBid() {
        Bid highest = null;
        for (Bid b : bids) {
            if (highest == null || b.getAmount() > highest.getAmount()) {
                highest = b;
            }
        }
        return highest;
    }
    
    public Bid getWinningBid() {
        return winningBid;
    }
    public void setWinningBid(Bid winningBid) {
        this.winningBid = winningBid;
    }
    
    public String toString() {
        StringBuilder text = new StringBuilder();
        text.append("id=" + id);
        text.append(", name=" + name);
        text.append(", version=" + version);
        text.append(", startDate=" + startDate);
        text.append(", endDate=" + endDate);
        text.append(", midBid=$" + minBid);
        text.append(", bids(" + bids.size() + ")={");
        for(Bid b : bids) {
            text.append(b.getBidder() + " $" + b.getAmount() + ",");
        }
        text.append("}");
        text.append(", closed=" + closed);
        text.append(", winning bid=" + (winningBid==null ? null :
            winningBid.getAmount() + " $" + winningBid.getAmount()));
        return text.toString();
    }
}