package com.usemodj.jpetstore.struts.action;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import com.usemodj.jpetstore.domain.Cart;
import com.usemodj.jpetstore.domain.Order;
import com.usemodj.jpetstore.domain.Signon;
import com.usemodj.jpetstore.service.CartService;
import com.usemodj.jpetstore.service.InventoryService;
import com.usemodj.jpetstore.service.OrderService;
import com.usemodj.jpetstore.service.SequenceService;
import com.usemodj.struts.Constants;
import com.usemodj.struts.action.BaseAction;
public class OrderAction extends BaseAction {
private static Logger logger = Logger.getLogger( OrderAction.class);
SequenceService sequenceService = new SequenceService();
InventoryService inventoryService = new InventoryService();
OrderService orderService = new OrderService();
CartService cartService = new CartService();
Cart cart = null;
Order order = null;
List<Order> orderList = null;
String url = null;
@Override
public String execute() throws Exception {
Signon signon = (Signon) this.getSession(LOGIN);
this.cart = getCart();
this.order = getOrder();
if(null == signon) {
this.addActionMessage( getText("login.required"));
this.setUrl("/shop/order_input");
return LOGIN;
}
if( null == cart || cart.getNumberOfItems()<1){
this.addActionMessage( getText("cart.empty"));
return Constants.CART;
}
if( null == order){
this.addActionMessage( getText("order.empty"));
return Constants.CART;
}
order.initOrder( signon.getUsername(), cart);
//get Order Sequence
int orderId = getOrderId();
order.setOrderId(orderId);
SqlSession sqlSession = this.getSqlSessionFactory().openSession();
try {
inventoryService.updateQuantity( sqlSession, order);
orderService.insertOrder(sqlSession, order);
sqlSession.commit();
} catch (Exception e) {
logger.error(" OrderAction.execute(): " + e.getMessage());
sqlSession.rollback();
throw e;
} finally {
sqlSession.close();
}
removeCartAndOrder();
return SUCCESS;
}
@Override
public String input() throws Exception {
this.cart = getCart();
this.order = getOrder();
//TODO: if cart == null || order == null
return INPUT;
}
public String list() throws Exception {
Signon signon = (Signon) this.getSession(LOGIN);
if(null == signon) {
this.addActionMessage( getText("login.required"));
this.setUrl("/shop/order_list");
return LOGIN;
}
SqlSession sqlSession = null;
try {
RowBounds rowBounds = new RowBounds(0, 10);
sqlSession = this.getSqlSessionFactory().openSession();
//TODO: Mapped Statements with nested result mappings cannot be safely constrained by RowBounds
//orderList = orderService.selectOrderListByUserIdWithRowBounds( sqlSession, signon.getUsername(), rowBounds);
orderList = orderService.selectOrderListByUserId( sqlSession, signon.getUsername(), rowBounds);
logger.debug(" -- orderList size: "+ orderList.size());
// if( logger.isDebugEnabled()){
// for(Order order : orderList){
// logger.debug(" -- orderId: "+ order.getOrderId());
// logger.debug(" userId: " + order.getUsername());
// logger.debug(" lineItem size: " + order.getLineItems().size());
// logger.debug(" orderStatus size: " + order.getOrderStatuses().size());
// }
// }
} catch (Exception e) {
logger.error("--OrderAction.list() Exception:" + e.getMessage());
} finally {
if(sqlSession != null) sqlSession.close();
}
return Constants.LIST;
}
public Cart getCart(){
return (Cart)this.getSession( Constants.CART);
}
public Order getOrder(){
return (Order)this.getSession( Constants.ORDER);
}
public int getOrderId() throws Exception{
SqlSession sqlSession = this.getSqlSessionFactory().openSession();
int orderId = 0;
try {
orderId = sequenceService.getNextId( sqlSession, Constants.SEQUENCE_ORD);
sqlSession.commit();
} catch (Exception e) {
logger.error(" OrderAction.execute() Exception: " + e.getMessage());
sqlSession.rollback();
throw e;
} finally {
sqlSession.close();
}
return orderId;
}
public void removeCartAndOrder(){
Signon signon = (Signon) this.getSession(LOGIN);
SqlSession sqlSession = null;
try {
sqlSession = this.getSqlSessionFactory().openSession();
cartService.removeCartItem( sqlSession, signon.getUsername());
logger.info( "CartService.removeCartItem() called...userid="+ signon.getUsername());
sqlSession.commit();
} catch (Exception e) {
logger.error( "OrderAction cartService.removeCartItem() Exception: "+ e.getMessage());
sqlSession.rollback();
} finally {
sqlSession.close();
}
this.removeSession( Constants.CART);
this.removeSession( Constants.ORDER);
}
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}