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


package shopcart.ejbs;

import javax.ejb.*;
import java.io.Serializable;
import java.util.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import DebugLog;

public class ShoppingCartBean implements SessionBean
{
    transient protected DebugLog logger;
    transient protected SessionContext context;
    transient protected Context jndi;
    
    protected Hashtable items;
    protected String cartName;
    protected String logServer;
    
    public void ejbActivate()
    {
    }

    public void ejbRemove()
    {
        try
        {
            logger.closeLog();
            logger = null;
        }
        catch(Exception exp)
        {
        }
    }

    public void ejbPassivate()
    {
        try
        {
            logger.closeLog();
            logger = null;
        }
        catch(Exception exp)
        {
        }
    }

    public void setSessionContext(SessionContext ctx)
    {   
        try
        {
            jndi = new InitialContext();
        }
        catch(Exception exp)
        {
        }
        
        context = ctx;
        
        logger = new DebugLog();
        
        try
        {
            logServer = (String) jndi.lookup("java:comp/env/logserver");
        }
        catch(Exception exp)
        {
        }
        
        if(logServer != null)
        {
            logger.logTo(logServer);
        }
    }

    public void ejbCreate(String nm)
    {
        cartName = nm;
        
        if(items == null) items = new Hashtable();
        else items.clear();
        
        logToServer("Created bean: "+cartName);
    }
    
    public ShoppingCartItem addItem(ShoppingCartItem item)
    {
        ShoppingCartItem test=null;
        ResultSet rs=null;
        Statement statement=null;
        ShoppingCartItem retVal = null;
        Connection conn=null;
        double curPrice;
        int curQuantity;
    
        if(items == null) items = new Hashtable();
        
        logToServer("Adding item: "+item);
        
        if(item != null)
            test = (ShoppingCartItem) items.get(item.desc);
        
        if(test == null)
        {
            try
            {
                conn = connectToDB();
                
                statement = conn.createStatement();
                rs = statement.executeQuery("select * from inventory"
                                             +" where item_desc="
                                             +"\'"+item.desc+"\'");
                
                //Only take the first one
                if(rs.next())
                {
                    curPrice = item.price;
                    
                    //reset price from DB
                    item.price = rs.getDouble("PRICE");
                    
                    curQuantity = rs.getInt("QUANTITY");
                    
                    logToServer("Adding "+item.desc
                                  +" at price "+item.price);
                    
                    if(curQuantity < item.quantity)
                        item.quantity = curQuantity;
                        
                    items.put(item.desc,item);
                    
                    retVal = item;
                }
                else
                {
                    logToServer("Item "+item.desc
                                    +" not in database.");
                }
            }
            catch(Exception exp)
            {
                logToServer(exp.toString());
                retVal = null;
            }
            finally
            {
                try
                {
                    if(rs!=null) rs.close();
                    if(statement != null) statement.close();
                    if(conn!=null) conn.close();
                }
                catch(Exception exp)
                {
                    logToServer(exp.toString());
                }
            }
        }
        else
        {
            test.quantity+=item.quantity;
            
            retVal = test;
        }
        
        return retVal;
    }
    
    public ShoppingCartItem[] getItems()
    {
        Enumeration keys;
        ShoppingCartItem[] retVal=null;
        int i=0;
        
        if(items != null)
        {
            retVal = new ShoppingCartItem[items.size()];
        
            keys=items.keys();
        
            while(keys.hasMoreElements())
            {
                retVal[i] = (ShoppingCartItem) 
                            items.get(keys.nextElement());
                i++;
            }
        }
        return retVal;
    }
    
    public boolean deleteItem(ShoppingCartItem item)
    {
        ShoppingCartItem test=null;
        boolean retVal = false;
        
        if((items != null)&&(item != null))
            test = (ShoppingCartItem) items.get(item.desc);
        
        if(test != null)
        {
            test.quantity-=item.quantity;
            
            if(test.quantity <= 0) items.remove(test.desc);
            
            retVal = true;
        }
        
        return retVal;
    }
    
    public boolean purchaseCart(String user) 
    throws Exception, BadCreditException
    {
        boolean retVal = false;
        ShoppingCartItem curItem;
        Enumeration cursor;
        ResultSet rs=null;
        Statement statement=null;
        Connection conn=null;
        double curPrice;
        int curQuantity, curSales;
        double total=0;
        double max, used;
    
        if(items == null) return false;
        
        logToServer("Purchasing items for: "+user);
        
        try
        {
            conn = connectToDB();
            
            statement = conn.createStatement();
            rs = statement.executeQuery("select * from customers"
                                         +" where CUST_NAME="
                                         +"\'"+user+"\'");
            
            if(rs.next())
            {
                used = rs.getDouble("CREDIT_USED");
                max = rs.getDouble("CREDIT_LIMIT")
                            - used;
            }
            else
            {
                throw new Exception("Trigger failure, no credit.");
            }
            
            cursor = items.elements();
            
            while(cursor.hasMoreElements())
            {
            
                curItem = (ShoppingCartItem) cursor.nextElement();
                statement = conn.createStatement();
                rs = statement.executeQuery("select * from inventory"
                                             +" where item_desc="
                                             +"\'"+curItem.desc+"\'");
            
                //Only take the first one
                if(rs.next())
                {
                    curPrice = curItem.price;
                
                    //reset price from DB
                    curItem.price = rs.getDouble("PRICE");
                
                    curQuantity = rs.getInt("QUANTITY");
                
                    if((curQuantity < curItem.quantity)
                            ||(curPrice != curItem.price))
                    {
                        throw new Exception("Trigger failure, bad q/p.");
                    }
                    
                    total += curItem.getTotal();
                }
                else
                {
                    throw new Exception("Trigger failure item not in DB.");
                }
            }
            
            //make sure there is enough credit
            if(total > max)
            {
                throw new BadCreditException(max);
            }
            
            //update the user's credit
            statement.executeUpdate("update customers set credit_used="
                                         + (total+used)
                                         +" where cust_name="
                                         +"\'"+user+"\'");
                
            //update the inventory
            cursor = items.elements();
            
            while(cursor.hasMoreElements())
            {
            
                curItem = (ShoppingCartItem) cursor.nextElement();
                
                rs = statement.executeQuery("select * from inventory"
                                             +" where item_desc="
                                             +"\'"+curItem.desc+"\'");
            
                //Only take the first one
                if(rs.next())
                {
                    curQuantity = rs.getInt("QUANTITY");
                    curSales = rs.getInt("SALES");
                    
                    statement.executeUpdate("update inventory "
                                         +"set quantity="
                                         + (curQuantity-curItem.quantity)
                                         +" , sales="
                                         + (curSales+curItem.quantity)
                                         +" where item_desc="
                                         +"\'"+curItem.desc+"\'");
                }
                else
                {
                    throw new Exception("Trigger failure item not in DB.");
                }
            }
            
            retVal = true;
        }
        catch(BadCreditException exp)
        {
            logToServer(exp.toString());
            throw exp;
        }
        catch(Exception exp)
        {
            logToServer(exp.toString());
            retVal = false;
        }
        finally
        {
            try
            {
                if(rs!=null) rs.close();
                if(statement != null) statement.close();
                if(conn!=null) conn.close();
            }
            catch(Exception exp)
            {
                logToServer(exp.toString());
            }
        }
        
        return retVal;
    }
    
    protected void logToServer(String str)
    {
        if(logger == null)
        {
            try
            {
                logger = new DebugLog();
                logger.logTo(logServer);
            }
            catch(Exception exp)
            {
            }
        }
        
        logger.log(str);
    }
    
    public Object[] getInventory()
    {
        Vector items;
        Object[] retVal=null;
        ShoppingCartItem curItem;
        double price;
        int quantity;
        int sales;
        String desc;
        ResultSet rs=null;
        Statement statement=null;
        Connection conn=null;
        
        items = new Vector();
        
        try
        {
            conn = connectToDB();
            
            statement = conn.createStatement();
            rs = statement.executeQuery("select * from inventory");
            
            //Only take the first one
            while(rs.next())
            {
                price = rs.getDouble("PRICE");
                quantity = rs.getInt("QUANTITY");
                sales = rs.getInt("SALES");
                desc = rs.getString("ITEM_DESC");
                
                curItem = new ShoppingCartItem(desc,price,quantity);
                curItem.sales = sales;
                
                items.addElement(curItem);
            }
            
            retVal = new Object[items.size()];
            items.copyInto(retVal);
        }
        catch(Exception exp)
        {
            logToServer(exp.toString());
            retVal = null;
        }
        finally
        {
            try
            {
                if(rs!=null) rs.close();
                if(statement != null) statement.close();
                if(conn!=null) conn.close();
            }
            catch(Exception exp)
            {
                logToServer(exp.toString());
            }
        }
        
        return retVal;
    }
    
    protected Connection connectToDB()
    {
        Connection retVal = null;
        
        try
        {
            DataSource ds = null;
            ds = (DataSource) jndi.lookup("java:comp/env/jdbc/ejava");
            retVal =  ds.getConnection();
        }
        catch(Exception exp)
        {
            retVal = null;
            logToServer(exp.toString());
        }
        
        return retVal;
    }
}