View Javadoc
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); //can fail if too low
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 }