com.emc.plants.web.servlets.ShoppingServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.emc.plants.web.servlets.ShoppingServlet.java

Source

//"This sample program is provided AS IS and may be used, executed, copied and modified without royalty payment by customer (a) for its own
//instruction and study, (b) in order to develop applications designed to run with an IBM WebSphere product, either for customer's own internal use
//or for redistribution by customer, as part of such an application, in customer's own products. "

//Product 5630-A36,  (C) COPYRIGHT International Business Machines Corp., 2001,2004
//All Rights Reserved * Licensed Materials - Property of IBM

package com.emc.plants.web.servlets;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;

import com.emc.plants.persistence.Inventory;
import com.emc.plants.pojo.beans.CustomerInfo;
import com.emc.plants.pojo.beans.OrderInfo;
import com.emc.plants.pojo.beans.ShoppingCartContents;
import com.emc.plants.pojo.beans.ShoppingCartItem;
import com.emc.plants.service.exceptions.MailerAppException;
import com.emc.plants.service.interfaces.Catalog;
import com.emc.plants.service.interfaces.Mailer;
import com.emc.plants.service.interfaces.ShoppingCart;
import com.emc.plants.utils.Util;
import com.emc.plants.web.util.WebUtil;

/**
 * Servlet to handle shopping needs.
 */
//@EJB(name="ejb/ShoppingCart", beanName="ShoppingCart", beanInterface=ShoppingCart.class)
public class ShoppingServlet extends HttpServlet {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    //   Servlet action codes.
    public static final String ACTION_ADDTOCART = "addtocart";
    public static final String ACTION_COMPLETECHECKOUT = "completecheckout";
    public static final String ACTION_GOTOCART = "gotocart";
    public static final String ACTION_INITCHECKOUT = "initcheckout";
    public static final String ACTION_ORDERINFODONE = "orderinfodone";
    public static final String ACTION_PRODUCTDETAIL = "productdetail";
    public static final String ACTION_SHOPPING = "shopping";
    public static final String ACTION_UPDATEQUANTITY = "updatequantity";

    //   @EJB(beanName="Catalog")
    @Autowired
    Catalog catalog;

    //   @EJB(name="Mailer")
    @Autowired
    private Mailer mailer;

    //@EJB(beanName="ShoppingCart")
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.catalog = (Catalog) WebUtil.getSpringBean(this.getServletContext(), "catalog");
        this.mailer = (Mailer) WebUtil.getSpringBean(this.getServletContext(), "mailer");

        Util.setDebug(true);
        //      shoppingCartHome = (ShoppingCartHome) Util.getEJBHome("java:comp/env/ejb/ShoppingCart", com.ibm.websphere.samples.pbwejb.ShoppingCartHome.class);
        //      catalogHome = (CatalogHome) Util.getEJBHome("java:comp/env/ejb/Catalog", com.ibm.websphere.samples.pbwejb.CatalogHome.class);
    }

    /**
     * Process incoming HTTP GET requests
     *
     * @param request Object that encapsulates the request to the servlet
     * @param response Object that encapsulates the response from the servlet
     */
    public void doGet(javax.servlet.http.HttpServletRequest request,
            javax.servlet.http.HttpServletResponse response) throws ServletException, IOException {
        performTask(request, response);
    }

    /**
     * Process incoming HTTP POST requests
     *
     * @param request Object that encapsulates the request to the servlet
     * @param response Object that encapsulates the response from the servlet
     */
    public void doPost(javax.servlet.http.HttpServletRequest request,
            javax.servlet.http.HttpServletResponse response) throws ServletException, IOException {
        //sanitize the request parameters to prevent XSS security vulnerability
        Enumeration names = request.getParameterNames();
        while (names.hasMoreElements()) {
            String val = (String) request.getParameter((String) names.nextElement());
            if (!Util.validateString(val)) {
                throw new ServletException(
                        "Invalid input parameter in ShoppingServlet:" + URLEncoder.encode(val, "UTF8"));
            }
        }
        performTask(request, response);
    }

    /**
     * Main service method for ShoppingServlet
     *
     * @param req Object that encapsulates the request to the servlet
     * @param resp Object that encapsulates the response from the servlet
     */
    public void performTask(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = null;
        action = req.getParameter(Util.ATTR_ACTION);
        Util.debug("action=" + action);
        if (action.equals(ACTION_SHOPPING)) {
            String category = (String) req.getParameter("category");
            HttpSession session = req.getSession(true);
            // Get session category if none on request, such as
            // 'Continue Shopping' from the Shopping Cart jsp.
            if ((category == null) || (category.equals("null"))) {
                category = (String) session.getAttribute(Util.ATTR_CATEGORY);
            }
            // If categoyr still null, default to first category.
            if ((category == null) || (category.equals("null"))) {
                category = "0";
            }
            session.setAttribute(Util.ATTR_CATEGORY, category);
            // Get the shopping items from the catalog.
            Collection c = catalog.getItemsByCategory(Integer.parseInt(category));
            ArrayList items = new ArrayList(c);
            for (int i = 0; i < items.size();) {
                if (((Inventory) items.get(i)).isPublic())
                    i++;
                else
                    items.remove(i);
            }
            req.setAttribute(Util.ATTR_INVITEMS, items);
            requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_SHOPPING);
        } else if (action.equals(ACTION_PRODUCTDETAIL)) {
            String invID = (String) req.getParameter("itemID");
            req.setAttribute(Util.ATTR_INVITEM, catalog.getItemInventory(invID));
            requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_PRODUCT);
        } else if (action.equals(ACTION_GOTOCART)) {
            HttpSession session = req.getSession(true);
            // Get shopping cart.
            ShoppingCart shoppingCart = (ShoppingCart) session.getAttribute(Util.ATTR_CART);
            if (shoppingCart != null) {
                // Make sure ShopingCart reference has not timed out.
                try {
                    shoppingCart.getItems();
                }
                // TODO: what exception would be thrown?
                catch (RuntimeException e) {
                    Util.debug("gotocart: shopping cart ref must have timed out");
                    ShoppingCartContents cartContents = (ShoppingCartContents) session
                            .getAttribute(Util.ATTR_CART_CONTENTS);
                    shoppingCart = (ShoppingCart) WebUtil.getSpringBean(this.getServletContext(), "shopping");
                    session.setAttribute(Util.ATTR_CART, shoppingCart);
                }
            }
            requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_CART);
        } else if (action.equals(ACTION_ADDTOCART)) {
            ShoppingCart shoppingCart = null;
            // Get shopping cart.
            HttpSession session = req.getSession(true);
            shoppingCart = (ShoppingCart) session.getAttribute(Util.ATTR_CART);
            if (shoppingCart == null) {
                Util.debug("shopping cart is NULL, must create it");
                shoppingCart = (ShoppingCart) WebUtil.getSpringBean(this.getServletContext(), "shopping");
                System.out.println(
                        "Items:: " + shoppingCart.getItems() + " Size :: " + shoppingCart.getItems().size());
                shoppingCart.setItems(new ArrayList<ShoppingCartItem>());
            } else {
                // Make sure ShopingCart reference has not timed out.
                try {
                    Util.debug("shopping cart is not null, check items, size=" + shoppingCart.getItems().size());
                    shoppingCart.getItems();
                }
                // TODO: what exception would be thrown?
                catch (RuntimeException e) {
                    // ShoppingCart timed out, so create a new one.
                    Util.debug("addtocart: shopping cart ref must have timed out, create a new one");
                    ShoppingCartContents cartContents = (ShoppingCartContents) session
                            .getAttribute(Util.ATTR_CART_CONTENTS);
                    shoppingCart = (ShoppingCart) WebUtil.getSpringBean(this.getServletContext(), "shopping");
                    if (cartContents != null) {
                        shoppingCart.setCartContents(cartContents);
                    }
                }
            }
            // Add item to cart.
            if (shoppingCart != null) {
                String invID = req.getParameter("itemID");

                // Gets detached instance
                Inventory inv = catalog.getItemInventory(invID);
                ShoppingCartItem si = new ShoppingCartItem(inv);
                si.setQuantity(Integer.parseInt(req.getParameter("qty").trim()));
                shoppingCart.addItem(si);
                session.setAttribute(Util.ATTR_CART, shoppingCart);
                session.setAttribute(Util.ATTR_CART_CONTENTS, shoppingCart.getCartContents());
            }
            requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_CART);
        } else if (action.equals(ACTION_UPDATEQUANTITY)) {
            // Get shopping cart.
            HttpSession session = req.getSession(true);
            ShoppingCart shoppingCart = (ShoppingCart) session.getAttribute(Util.ATTR_CART);
            // Make sure ShopingCart reference has not timed out.
            try {
                shoppingCart.getItems();
            }
            // TODO: what exception gets thrown?
            catch (RuntimeException e) {
                // ShoppingCart timed out, so create a new one.
                Util.debug("updatequantity: shopping cart ref must have timed out, create a new one");
                ShoppingCartContents cartContents = (ShoppingCartContents) session
                        .getAttribute(Util.ATTR_CART_CONTENTS);
                shoppingCart = (ShoppingCart) WebUtil.getSpringBean(this.getServletContext(), "shopping");

                if (cartContents != null) {
                    shoppingCart.setCartContents(cartContents);
                }
            }
            // Update item quantity in cart.
            if (shoppingCart != null) {
                try {
                    int cnt = 0;
                    Collection c = shoppingCart.getItems();
                    ArrayList items;

                    if (c instanceof ArrayList)
                        items = (ArrayList) c;
                    else
                        items = new ArrayList(c);
                    ShoppingCartItem si;
                    String parm, parmval;
                    // Check all quantity values from cart form.
                    for (int parmcnt = 0;; parmcnt++) {
                        parm = "itemqty" + String.valueOf(parmcnt);
                        parmval = req.getParameter(parm);
                        // No more quantity fields, so break out.
                        if ((parmval == null) || parmval.equals("null")) {
                            break;
                        } else // Check quantity value of cart item.
                        {
                            int quantity = Integer.parseInt(parmval);
                            // Quantity set to 0, so remove from cart.
                            if (quantity == 0) {
                                items.remove(cnt);
                            } else // Change quantity of cart item.
                            {
                                si = (ShoppingCartItem) items.get(cnt);
                                si.setQuantity(quantity);
                                items.set(cnt, si);
                                cnt++;
                            }
                        }
                    }
                    // Are items in cart? Yes, set the session attributes.
                    if (items.size() > 0) {
                        shoppingCart.setItems(items);
                        session.setAttribute(Util.ATTR_CART, shoppingCart);
                        session.setAttribute(Util.ATTR_CART_CONTENTS, shoppingCart.getCartContents());
                    } else // No items in cart, so remove attributes from session.
                    {
                        session.removeAttribute(Util.ATTR_CART);
                        session.removeAttribute(Util.ATTR_CART_CONTENTS);
                    }
                } catch (Exception e) {
                    //  Log the exception but try to continue.
                    Util.debug("ShoppingServlet.performAction() -> Exception caught: " + e);
                    // This should take us to the error page.
                    throw new ServletException(e.getMessage());
                }
            }
            requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_CART);
        } else if (action.equals(ACTION_INITCHECKOUT)) {
            String url;
            HttpSession session = req.getSession(true);
            CustomerInfo customerInfo = (CustomerInfo) session.getAttribute(Util.ATTR_CUSTOMER);
            if (customerInfo == null) {
                req.setAttribute(Util.ATTR_RESULTS, "You must login or register before checking out.");
                session.setAttribute(Util.ATTR_CHECKOUT, new Boolean(true));
                url = Util.PAGE_LOGIN;
            } else {
                url = Util.PAGE_ORDERINFO;
            }
            requestDispatch(getServletConfig().getServletContext(), req, resp, url);
        } else if (action.equals(ACTION_ORDERINFODONE)) {
            OrderInfo orderinfo = null;
            ShoppingCart shoppingCart = null;
            HttpSession session = req.getSession(true);
            CustomerInfo customerInfo = (CustomerInfo) session.getAttribute(Util.ATTR_CUSTOMER);
            String customerID = customerInfo.getCustomerID();
            shoppingCart = (ShoppingCart) session.getAttribute(Util.ATTR_CART);
            // Make sure ShopingCart reference has not timed out.
            try {
                Util.debug("orderinfodone: ShoppingCart timeout? check getItems() method");
                shoppingCart.getItems();
            }
            // TODO: what exception gets thrown?
            catch (RuntimeException e) {
                // ShoppingCart timed out, so create a new one.
                Util.debug("orderinfodone: ShoppingCart ref must have timed out");
                ShoppingCartContents cartContents = (ShoppingCartContents) session
                        .getAttribute(Util.ATTR_CART_CONTENTS);
                if (cartContents != null) {
                    shoppingCart = (ShoppingCart) WebUtil.getSpringBean(this.getServletContext(), "shopping");
                    shoppingCart.setCartContents(cartContents);
                } else {
                    Util.debug("NoSuchObject Exception!!!");
                    Util.debug("Major Problem!!!");
                    shoppingCart = null;
                }
            }
            Util.debug("orderinfodone: got cart?");
            if (shoppingCart != null) {
                Util.debug("orderinfodone: cart not NULL");
                String billName = req.getParameter("bname");
                String billAddr1 = req.getParameter("baddr1");
                String billAddr2 = req.getParameter("baddr2");
                String billCity = req.getParameter("bcity");
                String billState = req.getParameter("bstate");
                String billZip = req.getParameter("bzip");
                String billPhone = req.getParameter("bphone");
                String shipName = req.getParameter("sname");
                String shipAddr1 = req.getParameter("saddr1");
                String shipAddr2 = req.getParameter("saddr2");
                String shipCity = req.getParameter("scity");
                String shipState = req.getParameter("sstate");
                String shipZip = req.getParameter("szip");
                String shipPhone = req.getParameter("sphone");
                int shippingMethod = Integer.parseInt(req.getParameter("shippingMethod"));
                String creditCard = req.getParameter("ccardname");
                String ccNum = req.getParameter("ccardnum");
                String ccExpireMonth = req.getParameter("ccexpiresmonth");
                String ccExpireYear = req.getParameter("ccexpiresyear");
                String cardHolder = req.getParameter("ccholdername");
                orderinfo = shoppingCart.createOrder(customerID, billName, billAddr1, billAddr2, billCity,
                        billState, billZip, billPhone, shipName, shipAddr1, shipAddr2, shipCity, shipState, shipZip,
                        shipPhone, creditCard, ccNum, ccExpireMonth, ccExpireYear, cardHolder, shippingMethod,
                        shoppingCart.getItems());
                Util.debug("orderinfodone: order created");
            }
            if (orderinfo != null) {
                req.setAttribute(Util.ATTR_ORDERINFO, orderinfo);
                req.setAttribute(Util.ATTR_CARTITEMS, shoppingCart.getItems());
                session.setAttribute(Util.ATTR_ORDERKEY, orderinfo.getID());
                requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_CHECKOUTFINAL);
            }
        } else if (action.equals(ACTION_COMPLETECHECKOUT)) {
            ShoppingCart shoppingCart = null;
            HttpSession session = req.getSession(true);
            long key = (Long) session.getAttribute(Util.ATTR_ORDERKEY);
            req.setAttribute(Util.ATTR_ORDERID, key);
            long orderKey = key;
            Util.debug("completecheckout: order id =" + orderKey);
            CustomerInfo customerInfo = (CustomerInfo) session.getAttribute(Util.ATTR_CUSTOMER);
            // Check the available inventory and backorder if necessary.
            shoppingCart = (ShoppingCart) session.getAttribute(Util.ATTR_CART);
            // Make sure ShopingCart reference has not timed out.
            try {
                Util.debug("completecheckout: ShoppingCart timeout? check getItems() method");
                shoppingCart.getItems();
            }
            // TODO: what exception gets thrown?
            catch (RuntimeException e) {
                // ShoppingCart timed out, so create a new one.
                Util.debug("completecheckout: ShoppingCart ref must have timed out");
                ShoppingCartContents cartContents = (ShoppingCartContents) session
                        .getAttribute(Util.ATTR_CART_CONTENTS);
                if (cartContents != null) {
                    shoppingCart = (ShoppingCart) WebUtil.getSpringBean(this.getServletContext(), "shopping");
                    shoppingCart.setCartContents(cartContents);
                } else {
                    Util.debug("NoSuchObject Exception!!!");
                    Util.debug("Major Problem!!!");
                    shoppingCart = null;
                }
            }
            if (shoppingCart != null) {
                ShoppingCartItem si;
                Collection items = shoppingCart.getItems();
                for (Object o : items) {
                    si = (ShoppingCartItem) o;
                    shoppingCart.checkInventory(si);
                    Util.debug(
                            "ShoppingCart.checkInventory() - checking Inventory quantity of item: " + si.getID());
                }
            }

            try {
                mailer.createAndSendMail(customerInfo, orderKey);
            } catch (MailerAppException e) {
                System.out.println("MailerAppException:" + e);
                e.printStackTrace();
            } catch (Exception e) {
                System.out.println("Exception during create and send mail :" + e);
                e.printStackTrace();
            }
            // Remove items saved in HttpSession.
            session.removeAttribute(Util.ATTR_CART);
            session.removeAttribute(Util.ATTR_CART_CONTENTS);
            session.removeAttribute(Util.ATTR_CATEGORY);
            session.removeAttribute(Util.ATTR_ORDERKEY);
            session.removeAttribute(Util.ATTR_CHECKOUT);
            HttpSession httpSession = req.getSession(true);

            //httpSession.invalidate();
            requestDispatch(getServletConfig().getServletContext(), req, resp, Util.PAGE_ORDERDONE);
        }
    }

    /**
     * Send redirect
     */
    private void sendRedirect(HttpServletResponse resp, String page) throws ServletException, IOException {
        resp.sendRedirect(resp.encodeRedirectURL(page));
    }

    /**
     * Request dispatch
     */
    private void requestDispatch(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String page)
            throws ServletException, IOException {
        resp.setContentType("text/html");
        ctx.getRequestDispatcher("/" + page).forward(req, resp);
    }
}