package ua.sergiishapoval.carrental.command.car; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ua.sergiishapoval.carrental.command.CommandTemplate; import ua.sergiishapoval.carrental.dao.DaoCar; import ua.sergiishapoval.carrental.dao.DaoFactory; import ua.sergiishapoval.carrental.model.Car; import ua.sergiishapoval.carrental.model.User; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.SQLException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; /** * Created by Сергей on 27.12.2014. */ public class ReserveCommand extends CommandTemplate { private static final Logger logger = LoggerFactory.getLogger(ReserveCommand.class); @Override public void execute(HttpServletRequest request, HttpServletResponse response) { if (request.getMethod().toLowerCase().equals("get")){ /*car can be requested only through post*/ redirectToReservePageWithCarSetted(request, response); return; } Car car = (Car) request.getSession().getAttribute("car"); User user = (User) request.getSession().getAttribute("user"); String beginDateStr = request.getParameter("beginDate"); String endDateStr = request.getParameter("endDate"); int dayDifference = getDiffInDays(beginDateStr, endDateStr); if (dayDifference < 1){ request.getSession().setAttribute("error", "INCORRECT_DATES"); dispatcherForward(request, response, request.getRequestDispatcher("/reserve" +".tiles")); return; } try { DaoCar daoCar = DaoFactory.getDaoCar(); if (!daoCar.isAvailable(car.getId(), beginDateStr, endDateStr)) { request.getSession().setAttribute("error", "CAR_NOT_AVAILABLE"); dispatcherForward(request, response, request.getRequestDispatcher("/reserve" +".tiles")); } else { daoCar.reserve(user.getUserId(), car, beginDateStr, endDateStr, dayDifference); infoRedirect(request, response, "RESERVE_SUCCESS" ); } } catch (SQLException e) { request.getSession().setAttribute("error", "CAR_RESERVATION_FAIL_SQL"); dispatcherForward(request, response, request.getRequestDispatcher("/reserve" +".tiles")); logger.error("DBError", e); } } private void redirectToReservePageWithCarSetted(HttpServletRequest request, HttpServletResponse response) { request.getSession().removeAttribute("error"); int carId = Integer.parseInt(request.getParameter("id")); Car carChosen = findChosenCar(request, carId); request.getSession().setAttribute("car", carChosen); dispatcherForward(request, response, request.getRequestDispatcher("/reserve" +".tiles")); } private Car findChosenCar(HttpServletRequest request, int carId) { List<Car> cars = (List<Car>) request.getSession().getAttribute("cars"); Car carChosen = null; for (Car car: cars){ if (car.getId() == carId) { carChosen = car; break; } } return carChosen; } private int getDiffInDays(String beginDateStr, String endDateStr) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date beginDate = null; Date endDate = null; try { beginDate = dateFormat.parse(beginDateStr); endDate = dateFormat.parse(endDateStr); } catch (ParseException e) { logger.error("DatesRecognition", e); } long timeDifference = endDate.getTime() - beginDate.getTime(); return (int) (((timeDifference /1000) / 3600) / 24); } }