package org.jboss.seam.example.seambay;
import static org.jboss.seam.ScopeType.CONVERSATION;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import javax.persistence.EntityManager;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Conversational;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
/**
* This component is used to create new auctions, and is invoked via both the
* web interface and the AuctionService web service.
*
* @author Shane Bryzak
*/
@Conversational
@Scope(CONVERSATION)
@Name("auctionAction")
@Restrict("#{identity.loggedIn}")
public class AuctionAction implements Serializable
{
private static final long serialVersionUID = -6738397725125671313L;
private static final int DEFAULT_AUCTION_DURATION = 7;
@In EntityManager entityManager;
@In Account authenticatedAccount;
@In(create = true) AuctionEndAction auctionEnd;
private Auction auction;
private int durationDays;
private List<AuctionImage> images = new ArrayList<AuctionImage>();
private byte[] imageData;
private String imageContentType;
private boolean primaryImage;
@Begin(join = true)
@SuppressWarnings("unchecked")
public void createAuction()
{
if (auction == null)
{
auction = new Auction();
auction.setAccount(authenticatedAccount);
auction.setStatus(Auction.STATUS_UNLISTED);
auction.setStartingPrice(0.01);
durationDays = DEFAULT_AUCTION_DURATION;
}
}
public void setDetails(String title, String description, int categoryId)
{
auction.setTitle(title);
auction.setDescription(description);
auction.setCategory(entityManager.find(Category.class, categoryId));
}
/**
* Allows the auction duration to be overidden from the default
*
* @param days Number of days to set the auction duration to.
*/
public void setDuration(int days)
{
this.durationDays = days;
}
public int getDuration()
{
return durationDays;
}
public void uploadImage()
{
if (imageData == null || imageData.length == 0)
{
FacesMessages.instance().add("No image selected");
}
else
{
AuctionImage img = new AuctionImage();
img.setAuction(auction);
img.setData(imageData);
img.setContentType(imageContentType);
if (auction.getImage() == null || primaryImage)
auction.setImage(img);
images.add(img);
imageData = null;
imageContentType = null;
}
}
@End
public void confirm()
{
AuctionImage temp = auction.getImage();
auction.setImage(null);
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, durationDays);
auction.setEndDate(cal.getTime());
auction.setStatus(Auction.STATUS_LIVE);
entityManager.persist(auction);
for (AuctionImage img : images)
{
entityManager.persist(img);
}
auction.setImage(temp);
entityManager.merge(auction);
// End the auction at the correct time
auctionEnd.endAuction(auction.getAuctionId(), auction.getEndDate());
}
public Auction getAuction()
{
return auction;
}
public void setAuction(Auction auction)
{
this.auction = auction;
}
public Integer getCategoryId()
{
return auction.getCategory() != null ? auction.getCategory().getCategoryId() : null;
}
public void setCategoryId(Integer categoryId)
{
auction.setCategory(entityManager.find(Category.class, categoryId));
}
public void setImageData(byte[] imageData)
{
this.imageData = imageData;
}
public void setImageContentType(String contentType)
{
this.imageContentType = contentType;
}
public void setPrimaryImage(boolean primary)
{
this.primaryImage = primary;
}
public List<AuctionImage> getImages()
{
return images;
}
}