www.pudn.com > 33_online_store.rar > ShoppingCartServlet.java


package shopcart.servlets;

import javax.ejb.*;
import javax.naming.*;
import java.io.*;
import java.util.*;
import java.rmi.*;
import javax.rmi.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;

import shopcart.ejbs.*;
import DebugLog;

/**
 * This servlet supports four input parameters:
 * action: either add, adjust, delete, or view
 * item: a text description of the item
 * quantity: the number to affect
 *
 * When accessed the servlet displays the current contents of the cart.
 * 
 */
public class ShoppingCartServlet extends HttpServlet
implements SingleThreadModel
{
    protected Context ctx;
    protected ShoppingCartHome home;
	protected DebugLog logger;
	protected NumberFormat formatter;
        
	public void init(ServletConfig config) throws ServletException
	{
		super.init(config);
		
		String logServer;
		
		logServer = getInitParameter("logserver");
		
		logger = new DebugLog();
		logger.logTo(logServer);
		
		formatter = NumberFormat.getCurrencyInstance();
		
		findHome();
	}
	
	protected void findHome()
	{		
		try
        {
            if(home == null)
            {
                String homeName;
                
                homeName = getInitParameter("ShoppingCartHome");
                
                if(ctx == null) ctx = new InitialContext();
                
                if(ctx != null)
                {
                    Object ref = ctx.lookup(homeName);
                    home = (ShoppingCartHome) PortableRemoteObject.narrow(ref, 
                                                ShoppingCartHome.class);
                }
            }
    	}
    	catch(Exception exp)
    	{
    	    ctx = null;
    	    home = null;
            logger.log(exp);
    	}
	}

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        HttpSession session; //The current session
        String cartName; //The name to use for the cart
    	ShoppingCart cart=null; //The EJB
        Hashtable items; //The current list of items
        ShoppingCartItem item; //Used to iterate the list of items
	    PrintWriter out; //The responses PrintWriter
        String action; //Which action was requested
        double price=0.0; //Temp variable
        int quantity=0; //Temp variable
        String desc=null; //Temp variable
        String errorMessage = null; //Temp variable
        String requestURL; // The URL used to request the servlet
        String referer; // URL for the page that made the request
        boolean outputCart = true; //Temp variable

    
        session = request.getSession(true);
        requestURL = request.getRequestURL().toString();
    
        //See if we are reloading first
        referer = request.getParameter("referer");
        
        //Then look for the refering page
        if(referer == null)
            referer = request.getHeader("Referer");
        
        response.setContentType("text/html");
        out = response.getWriter();
	    
	    items = (Hashtable) session.getAttribute("shoppingcart.items");
	    
	    if(items==null)
	    {
	        session.setAttribute("shoppingcart.items",new Hashtable());
	    
	        items = (Hashtable) session.getAttribute("shoppingcart.items");
	    }
	    
	    action = request.getParameter("action");
	        
        try
        {
            desc = request.getParameter("item");
            price = (new Double(request.getParameter("price"))).doubleValue();
            quantity = Integer.parseInt(request.getParameter("quantity"));
        }
        catch(Exception exp)
        {
            //reset
            desc = null;
	        errorMessage = "No item specified.";
        }
	    
	    if("view".equalsIgnoreCase(action)
	        ||"purchase".equalsIgnoreCase(action))
	    {
	        errorMessage = null;
	    }
	    
	    if(errorMessage != null)
	    {
	        //do nothing, but go to end
	    }
	    else if("add".equalsIgnoreCase(action))
	    {
	        item = new ShoppingCartItem(desc,price,quantity);
	        
            try
            {
                logger.log("Adding item: "+item);
        
                item = (ShoppingCartItem) items.get(desc);
	        
	            if(item == null)
	            {
	                item = new ShoppingCartItem(desc,price,quantity);
	                items.put(desc,item);
	            }
	            else
	            {
	                item.price = price;
	                item.quantity += quantity;
	            }
            }
            catch(Exception exp)
            {
                logger.log(exp);
                errorMessage = "Unable to add item(s).";
            }
	    }
	    else if("adjust".equalsIgnoreCase(action))
	    {
	        item = new ShoppingCartItem(desc,price,quantity);
	            
            try
            {
                item = (ShoppingCartItem) items.get(desc);
	        
	            if(item != null)
	            {
	                item.quantity = quantity;
	            }
	            else
	            {
	                errorMessage = "Item(s) was not contained in the cart.";
	            }
            }
            catch(Exception exp)
            {
                logger.log(exp);
                errorMessage = "Unable to adjust item(s).";
            }
	    }
	    else if("delete".equalsIgnoreCase(action))
	    {
	        item = new ShoppingCartItem(desc,price,quantity);
	        
	        try
	        {item = (ShoppingCartItem) items.get(desc);
	        
	            if(item != null)
	            {
	                if(item.quantity > quantity)
	                {
	                    item.quantity -= quantity;
	                }
	                else
	                {
	                    items.remove(desc);
	                }
	            }
	            else
	            {
	                errorMessage = "Item(s) was not contained in the cart.";
	            }
            }
            catch(Exception exp)
            {
                logger.log(exp);
                errorMessage = "Unable to remove item(s).";
            }
	    }
	    else if("purchase".equalsIgnoreCase(action))
	    {
	        Hashtable confirmedItems;
	        
	        confirmedItems = 
                (Hashtable) session.getAttribute("shoppingcart.itemsToConfirm");
                
	        //Try to use the remote user login
            cartName = request.getRemoteUser();
        
            if(cartName == null)
            {
            	session = request.getSession(true);
        	
            	if(session != null) cartName = session.getId();
            }
        
            if(home == null) findHome();
        
            //Get the EJB shopping cart
            if((home != null)&&(cartName != null))
            {        	
            	try
                {
                    cart = home.create(cartName);
                }
                catch(Exception ex)
                {
                    //perhaps home is gone, reset
                    home = null;
                    ctx = null;
                
                    logger.log(ex);
                }
            }
        
            if(cart == null)
            {
            	errorMessage = "Unable to load cart.";
            }
            else
            {
                logger.log("Cart: "+cart);
            }
            
            if(request.getParameter("confirmed")!=null)
            {
                if(confirmedItems == null)
                {
                    errorMessage = "No items confirmed for purchase.";
                }
                else
                {
                    String user = request.getParameter("confirmed");
                    doPurchase(confirmedItems,cart,items
                                    ,user,out,requestURL,referer);
                    outputCart = false;
                }
            }
            else if(errorMessage == null)
            {
                outputConfirm(items,cart,session,out,requestURL,referer);
            
                outputCart = false;
            }
	    }
	    else
	    {
	        //do nothing, just view
	    }
	    
        if(outputCart && (errorMessage==null))
        {
            outputCart(items,out,requestURL,referer);
        }
        else if(errorMessage!=null)
        {
            outputErrorMessage(out,errorMessage,referer);
        }
    }
    
    protected void outputErrorMessage(PrintWriter out
                                        ,String errorMessage
                                        ,String referer)
    {
        out.println("");
	    out.println("");
	    out.println("");
	    out.println("Shopping Cart");
	    out.println("");
	    out.println("");
	    out.println("");
	    out.println("
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println("
"); out.println(errorMessage); if((referer!=null)&&(referer.length()>0)) { out.print("

Back

"); } out.println("
"); out.println("
"); out.println(""); out.println(""); out.close(); } protected void outputCart(Hashtable cart ,PrintWriter out ,String requestURL ,String referer) { ShoppingCartItem item; Enumeration items; float total=0; items = cart.elements(); out.println(""); out.println(""); out.println(""); out.println("Shopping Cart"); out.println(""); out.println(""); out.println(""); out.println("
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println("
"); out.println("

Shopping Cart

"); out.println("Your shopping cart contains the following items:
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); while((items!=null)&&(items.hasMoreElements())) { item = (ShoppingCartItem) items.nextElement(); outputItem(item,out,requestURL,referer); total += item.getTotal(); } out.println(""); out.println(""); out.println(""); out.println(""); out.print(""); out.println(""); out.println(""); out.println("
DescriptionQuantityPriceTotal
Total"); out.print(formatter.format(total)); out.println("
"); out.println("

"); out.print("

"); out.println(""); out.println("
"); out.println("

"); if((referer!=null)&&(referer.length()>0)) { out.print("

Back

"); } out.println("
"); out.println("
"); out.println(""); out.println(""); out.close(); } protected void outputItem(ShoppingCartItem item ,PrintWriter out ,String act ,String referer) { out.print("
"); out.println(""); out.print(""); out.print(item.desc); out.println(""); out.print(""); out.print(""); out.print(formatter.format(item.price)); out.println(""); out.print(""); out.print(formatter.format(item.getTotal())); out.println(""); //Output the change form buttons and hidden fields out.println(""); out.print(""); out.print(""); out.print(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println("
"); } protected void outputConfirm(Hashtable items ,ShoppingCart cart ,HttpSession session ,PrintWriter out ,String requestURL ,String referer) { ShoppingCartItem item; ShoppingCartItem curItem; Enumeration curItems; Hashtable itemsToConfirm; float total=0; curItems = items.elements(); itemsToConfirm = new Hashtable(); session.setAttribute("shoppingcart.itemsToConfirm",itemsToConfirm); out.println(""); out.println(""); out.println(""); out.println("Confirm Purchase"); out.println(""); out.println(""); out.println(""); out.println("
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println("
"); out.println("

Confirmation Required

"); out.print("Please confirm your purchase of"); out.println(" the following items:
"); out.print("Items that have changed are printed"); out.println(" in blue."); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); while((curItems!=null)&&(curItems.hasMoreElements())) { curItem = (ShoppingCartItem) curItems.nextElement(); try { item = cart.addItem(curItem); curItem.price = item.price; curItem.quantity = item.quantity; itemsToConfirm.put(item.desc,item); } catch(Exception exp) { logger.log(exp); item = new ShoppingCartItem("err",0,0); } out.println(""); out.print(""); out.print(""); out.print(""); out.print(""); out.println(""); total += item.getTotal(); } out.println(""); out.println(""); out.println(""); out.println(""); out.print(""); out.println(""); out.println("
DescriptionQuantityPriceTotal
"); out.print(item.desc); out.println(""); if(item.quantity != curItem.quantity) out.print(""); out.print(item.quantity); if(item.quantity != curItem.quantity) out.print(""); out.println(""); if(item.price != curItem.price) out.print(""); out.print(formatter.format(item.price)); if(item.price != curItem.price) out.print(""); out.println(""); out.print(formatter.format(item.getTotal())); out.println("
Total"); out.print(formatter.format(total)); out.println("
"); out.println("
"); out.print("
"); out.println("Enter your pass phrase to confirm."); out.println(""); out.println(""); out.println(""); out.println("
"); if((referer!=null)&&(referer.length()>0)) { out.print("

Back

"); } out.println("
"); out.println("
"); out.println(""); out.println(""); out.close(); } protected void doPurchase(Hashtable items ,ShoppingCart cart ,Hashtable oldCartItems ,String user ,PrintWriter out ,String requestURL ,String referer) { ShoppingCartItem item; ShoppingCartItem curItem; ShoppingCartItem cartItems[]=null; int i,max=0; Enumeration curItems; float total=0; boolean failed=false; boolean badCredit=false; curItems = items.elements(); try { while((curItems!=null)&&(curItems.hasMoreElements())) { curItem = (ShoppingCartItem) curItems.nextElement(); cart.addItem(curItem); } } catch(Exception exp) { failed = true; } if(!failed) { try { if(!cart.purchaseCart(user)) failed = true; } catch(BadCreditException exp) { failed = true; badCredit = true; } catch(Exception exp) { failed = true; } } if(failed) { if(badCredit) { outputErrorMessage(out ,"You do not have enough credit to make this purchase." ,referer); } else { outputErrorMessage(out ,"Server failure, unable to purchase items." ,referer); } return; } out.println(""); out.println(""); out.println(""); out.println("Purchase Confirmed"); out.println(""); out.println(""); out.println(""); out.println("
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println("
"); out.println("

Purchase Confirmed

"); out.print("Thank you for your purchase of the "); out.println("following items:
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); try { cartItems = cart.getItems(); } catch(Exception exp) { } if(cartItems != null) max = cartItems.length; for(i=0;i 0) { out.println(""); out.print(""); out.print(""); out.print(""); out.print(""); out.println(""); total += curItem.getTotal(); } } out.println(""); out.println(""); out.println(""); out.println(""); out.print(""); out.println(""); out.println("
DescriptionQuantityPriceTotal
"); out.print(curItem.desc); out.println(""); out.print(curItem.quantity); out.println(""); out.print(formatter.format(curItem.price)); out.println(""); out.print(formatter.format(curItem.getTotal())); out.println("
Total"); out.print(formatter.format(total)); out.println("
"); if((referer!=null)&&(referer.length()>0)) { out.print("

Back To Store Front

"); } out.println("
"); out.println("
"); out.println(""); out.println(""); out.close(); //reset the cart oldCartItems.clear(); } }