package pizza.service; import pizza.dao.DbDAO; import pizza.dao.AdminDAO; import pizza.dao.PizzaOrderDAO; import pizza.domain.PizzaOrder; import pizza.domain.PizzaSize; import pizza.domain.Topping; import java.util.Set; import java.util.HashSet; import java.util.List; import java.lang.Exception; // This class implements the service API related to student actions // See more discussion in AdminService.java public class StudentService { private PizzaOrderDAO pizzaOrderDAO; private AdminDAO adminDAO; private DbDAO dbDAO; public StudentService(DbDAO dbDAO, PizzaOrderDAO pizzaDAO, AdminDAO admDAO) { this.dbDAO = dbDAO; pizzaOrderDAO = pizzaDAO; adminDAO = admDAO; } public List getPizzaSizes()throws ServiceException { List sizes = null; try { dbDAO.startTransaction(); sizes = pizzaOrderDAO.findPizzaSizes(); dbDAO.commitTransaction(); } catch(Exception e) { dbDAO.rollbackAfterException(); throw new ServiceException("Can't access pizza sizes in db: ", e); } return sizes; } public List getToppings()throws ServiceException { List toppings = null; try { dbDAO.startTransaction(); toppings = pizzaOrderDAO.findToppings(); dbDAO.commitTransaction(); } catch(Exception e) { dbDAO.rollbackAfterException(); throw new ServiceException("Can't access toppings in db: ", e); } return toppings; } public Topping getToppingByName(String toppingName) throws ServiceException { Topping topping = null; try { dbDAO.startTransaction(); topping = pizzaOrderDAO.findToppingByName(toppingName); dbDAO.commitTransaction(); } catch(Exception e) { dbDAO.rollbackAfterException(); throw new ServiceException("Can't access topping in db: ", e); } return topping; } public PizzaSize getPizzaSizeByName(String sizeName) throws ServiceException { PizzaSize size = null; try { dbDAO.startTransaction(); size = pizzaOrderDAO.findPizzaSizeByName(sizeName); dbDAO.commitTransaction(); } catch(Exception e) { dbDAO.rollbackAfterException(); throw new ServiceException("Can't access pizza size in db: ", e); } return size; } public int makeOrder(int roomNum, int sizeId, Set toppingIds) throws ServiceException { int id = -1; try { dbDAO.startTransaction(); PizzaSize size = pizzaOrderDAO.findPizzaSizeById(sizeId); Set toppings = new HashSet(); for (int topId: toppingIds) { Topping top = pizzaOrderDAO.findToppingById(topId); toppings.add(top); } // here with all good toppings, good size PizzaOrder order = new PizzaOrder(-1, size, roomNum, adminDAO.findCurrentDay(), PizzaOrder.PREPARING, toppings); id = pizzaOrderDAO.insertOrder(order); dbDAO.commitTransaction(); } catch (Exception e) { dbDAO.rollbackAfterException(); throw new ServiceException("Order can not be inserted ", e); } return id; } public List getOrderStatus(int roomNumber) throws ServiceException { List pizzaOrders = null; try { dbDAO.startTransaction(); pizzaOrders = pizzaOrderDAO.findOrdersByRoom(roomNumber, adminDAO .findCurrentDay()); for (PizzaOrder order : pizzaOrders) { if (order.getStatus() == PizzaOrder.BAKED) // a student has seen it ready, so mark this pizza // "finished" pizzaOrderDAO.updateOrderStatus(order.getId(), PizzaOrder.FINISHED); // fetch pizza size and topping names for use after commit // this can be done automatically by additional Hibernate configuration order.getPizzaSize().getSizeName(); // order.getPizzaSize is not enough here for (Topping t: order.getToppings()) t.getToppingName(); } dbDAO.commitTransaction(); } catch (Exception e) { dbDAO.rollbackAfterException(); throw new ServiceException("Error in getting status ", e); } return pizzaOrders; } }