1 package ejava.examples.asyncmarket.ejb;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.annotation.PostConstruct;
7 import javax.ejb.Stateless;
8 import javax.ejb.TransactionAttribute;
9 import javax.ejb.TransactionAttributeType;
10 import javax.persistence.EntityManager;
11 import javax.persistence.PersistenceContext;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15
16 import ejava.examples.asyncmarket.MarketException;
17 import ejava.examples.asyncmarket.bo.AuctionItem;
18 import ejava.examples.asyncmarket.bo.Bid;
19 import ejava.examples.asyncmarket.bo.Order;
20 import ejava.examples.asyncmarket.bo.Person;
21 import ejava.examples.asyncmarket.dao.AuctionItemDAO;
22 import ejava.examples.asyncmarket.dao.OrderDAO;
23 import ejava.examples.asyncmarket.dao.PersonDAO;
24 import ejava.examples.asyncmarket.jpa.JPAAuctionItemDAO;
25 import ejava.examples.asyncmarket.jpa.JPAOrderDAO;
26 import ejava.examples.asyncmarket.jpa.JPAPersonDAO;
27
28 @Stateless
29 @TransactionAttribute(TransactionAttributeType.REQUIRED)
30 public class BuyerEJB implements BuyerRemote, BuyerLocal {
31 private static final Log log = LogFactory.getLog(BuyerEJB.class);
32
33 @PersistenceContext(unitName="asyncMarket")
34 private EntityManager em;
35
36 private AuctionItemDAO auctionItemDAO;
37 private PersonDAO userDAO;
38 private OrderDAO orderDAO;
39
40 @PostConstruct
41 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
42 void init() {
43 log.info("*** BuyerEJB init() ***");
44 log.debug("em=" + em);
45
46 auctionItemDAO = new JPAAuctionItemDAO();
47 ((JPAAuctionItemDAO)auctionItemDAO).setEntityManager(em);
48
49 userDAO = new JPAPersonDAO();
50 ((JPAPersonDAO)userDAO).setEntityManager(em);
51
52 orderDAO = new JPAOrderDAO();
53 ((JPAOrderDAO)orderDAO).setEntityManager(em);
54 }
55
56 public long bidProduct(long itemId, String userId, double amount)
57 throws MarketException {
58 try {
59 log.debug("bidProduct(itemId=" + itemId +
60 ", userId=" + userId +
61 ", amount=" + amount);
62 Bid bid = new Bid();
63 bid.setAmount(amount);
64
65 AuctionItem item = auctionItemDAO.getItem(itemId);
66 log.debug("found item for bid:" + item);
67 item.addBid(bid);
68 bid.setItem(item);
69
70 Person bidder = userDAO.getPersonByUserId(userId);
71 bidder.getBids().add(bid);
72 bid.setBidder(bidder);
73 log.debug("found bidder for bid:" + bidder);
74
75 em.persist(bid);
76 log.debug("added bid:" + bid);
77 return bid.getId();
78 }
79 catch (Exception ex) {
80 log.error("error bidding product", ex);
81 throw new MarketException("error bidding product:" + ex);
82 }
83 }
84
85 public List<AuctionItem> getAvailableItems(int index, int count)
86 throws MarketException {
87 try {
88 return makeDTO(
89 auctionItemDAO.getAvailableItems(index, count));
90 }
91 catch (Exception ex) {
92 log.error("error getting available items", ex);
93 throw new MarketException("error getting available items:" + ex);
94 }
95 }
96
97 public AuctionItem getItem(long itemId) throws MarketException {
98 try {
99 return makeDTO(auctionItemDAO.getItem(itemId));
100 }
101 catch (Exception ex) {
102 log.error("error getting item", ex);
103 throw new MarketException("error getting item:" + ex);
104 }
105 }
106
107 public Order getOrder(long orderId) throws MarketException {
108 try {
109 log.debug("getOrder(id=" + orderId + ")");
110 Order daoOrder = orderDAO.getOrder(orderId);
111 Order dtoOrder = makeDTO(daoOrder);
112 log.debug("daoOrder=" + daoOrder);
113 log.debug("dtoOrder=" + dtoOrder);
114 return dtoOrder;
115 }
116 catch (Exception ex) {
117 log.error("error getting item", ex);
118 throw new MarketException("error getting item:" + ex);
119 }
120 }
121
122 public long placeOrder(long productId, String userId, double maxAmount)
123 throws MarketException {
124 try {
125 Order order = new Order();
126 AuctionItem item = auctionItemDAO.getItem(productId);
127 order.setItem(item);
128 Person buyer = userDAO.getPersonByUserId(userId);
129 order.setBuyer(buyer);
130 order.setMaxBid(maxAmount);
131 orderDAO.createOrder(order);
132 return order.getId();
133 }
134 catch (Exception ex) {
135 log.error("error placing order", ex);
136 throw new MarketException("error placing order:" + ex);
137 }
138 }
139
140 private List<AuctionItem> makeDTO(List<AuctionItem> items) {
141 List<AuctionItem> dto = new ArrayList<AuctionItem>();
142 for (AuctionItem item : items) {
143 dto.add(makeDTO(item));
144 }
145 return dto;
146 }
147
148 private AuctionItem makeDTO(AuctionItem item) {
149 AuctionItem dto = new AuctionItem(item.getId());
150 dto.setVersion(item.getVersion());
151 dto.setName(item.getName());
152 dto.setStartDate(item.getStartDate());
153 dto.setEndDate(item.getEndDate());
154 dto.setMinBid(item.getMinBid());
155 dto.setBids(makeDTO(item.getBids(), dto));
156 dto.setWinningBid(null);
157 dto.setClosed(item.isClosed());
158 return dto;
159 }
160
161 private List<Bid> makeDTO(List<Bid> bids, AuctionItem item) {
162 List<Bid> dtos = new ArrayList<Bid>();
163 for (Bid bid : bids) {
164 Bid dto = new Bid(bid.getId());
165 dto.setAmount(bid.getAmount());
166 dto.setItem(item);
167 item.getBids().add(dto);
168 dto.setBidder(makeDTO(bid.getBidder(),dto));
169 dtos.add(dto);
170 }
171 return dtos;
172 }
173
174 private Person makeDTO(Person bidder, Bid bid) {
175 Person dto = new Person(bidder.getId());
176 dto.setVersion(bidder.getVersion());
177 dto.setUserId(bidder.getUserId());
178 return dto;
179 }
180
181 private Order makeDTO(Order order) {
182 Order dto = new Order(order.getId());
183 dto.setVersion(order.getVersion());
184 dto.setMaxBid(order.getMaxBid());
185 dto.setBuyer(makeDTO(order.getBuyer(), dto));
186 dto.setItem(makeDTO(order.getItem(), dto));
187 return dto;
188 }
189
190 private Person makeDTO(Person buyer, Order order) {
191 Person dto = new Person(buyer.getId());
192 dto.setVersion(buyer.getVersion());
193 dto.setUserId(buyer.getUserId());
194 order.setBuyer(dto);
195 return dto;
196 }
197
198 private AuctionItem makeDTO(AuctionItem item, Order order) {
199 AuctionItem dto = new AuctionItem(item.getId());
200 dto.setVersion(item.getVersion());
201 dto.setMinBid(item.getMinBid());
202 dto.setStartDate(item.getStartDate());
203 dto.setEndDate(item.getEndDate());
204 dto.setName(item.getName());
205 dto.setOwner(makeDTO(item.getOwner(), dto));
206 dto.setBids(makeDTO(item.getBids(), dto));
207 dto.setClosed(item.isClosed());
208 return dto;
209 }
210
211 private Person makeDTO(Person owner, AuctionItem item) {
212 Person dto = new Person(owner.getId());
213 dto.setVersion(owner.getVersion());
214 dto.setUserId(owner.getUserId());
215 dto.getItems().add(item);
216 item.setOwner(dto);
217 return dto;
218 }
219 }