/* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * * You may not modify, use, reproduce, or distribute this software * except in compliance with the terms of the license at: * http://developer.sun.com/berkeley_license.html */ package cart; import entity.Product; import java.util.*; /** * * @author tgiunipero */ public class ShoppingCart { List<ShoppingCartItem> items; int numberOfItems; double total; public ShoppingCart() { items = new ArrayList<ShoppingCartItem>(); numberOfItems = 0; total = 0; } /** * Adds a <code>ShoppingCartItem</code> to the <code>ShoppingCart</code>'s * <code>items</code> list. If item of the specified <code>product</code> * already exists in shopping cart list, the quantity of that item is * incremented. * * @param product the <code>Product</code> that defines the type of shopping cart item * @see ShoppingCartItem */ public synchronized void addItem(Product product) { boolean newItem = true; for (ShoppingCartItem scItem : items) { if (scItem.getProduct().getId() == product.getId()) { newItem = false; scItem.incrementQuantity(); } } if (newItem) { ShoppingCartItem scItem = new ShoppingCartItem(product); items.add(scItem); } } /** * Updates the <code>ShoppingCartItem</code> of the specified * <code>product</code> to the specified quantity. If '<code>0</code>' * is the given quantity, the <code>ShoppingCartItem</code> is removed * from the <code>ShoppingCart</code>'s <code>items</code> list. * * @param product the <code>Product</code> that defines the type of shopping cart item * @param quantity the number which the <code>ShoppingCartItem</code> is updated to * @see ShoppingCartItem */ public synchronized void update(Product product, String quantity) { // cast quantity as short short qty = Short.parseShort(quantity); if (qty >= 0) { ShoppingCartItem item = null; for (ShoppingCartItem scItem : items) { if (scItem.getProduct().getId() == product.getId()) { if (qty != 0) { // set item quantity to new value scItem.setQuantity(qty); } else { // if quantity equals 0, save item and break item = scItem; break; } } } if (item != null) { // remove from cart items.remove(item); } } } /** * Returns the list of <code>ShoppingCartItems</code>. * * @return the <code>items</code> list * @see ShoppingCartItem */ public synchronized List<ShoppingCartItem> getItems() { return items; } /** * Returns the sum of quantities for all items maintained in shopping cart * <code>items</code> list. * * @return the number of items in shopping cart * @see ShoppingCartItem */ public synchronized int getNumberOfItems() { numberOfItems = 0; for (ShoppingCartItem scItem : items) { numberOfItems += scItem.getQuantity(); } return numberOfItems; } /** * Returns the sum of the product price multiplied by the quantity for all * items in shopping cart list. This is the total cost excluding the surcharge. * * @return the cost of all items times their quantities * @see ShoppingCartItem */ public synchronized double getSubtotal() { double amount = 0; for (ShoppingCartItem scItem : items) { Product product = (Product) scItem.getProduct(); amount += (scItem.getQuantity() * product.getPrice().doubleValue()); } return amount; } /** * Calculates the total cost of the order. This method adds the subtotal to * the designated surcharge and sets the <code>total</code> instance variable * with the result. * * @param surcharge the designated surcharge for all orders * @see ShoppingCartItem */ public synchronized void calculateTotal(String surcharge) { double amount = 0; // cast surcharge as double double s = Double.parseDouble(surcharge); amount = this.getSubtotal(); amount += s; total = amount; } /** * Returns the total cost of the order for the given * <code>ShoppingCart</code> instance. * * @return the cost of all items times their quantities plus surcharge */ public synchronized double getTotal() { return total; } /** * Empties the shopping cart. All items are removed from the shopping cart * <code>items</code> list, <code>numberOfItems</code> and * <code>total</code> are reset to '<code>0</code>'. * * @see ShoppingCartItem */ public synchronized void clear() { items.clear(); numberOfItems = 0; total = 0; } }