summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session
diff options
context:
space:
mode:
Diffstat (limited to 'Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session')
-rw-r--r--Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CartBean.java320
-rw-r--r--Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CatalogBean.java41
-rw-r--r--Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/PricerBean.java138
-rw-r--r--Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/UserManagerBean.java86
4 files changed, 585 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CartBean.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CartBean.java
new file mode 100644
index 0000000..d5e2b1b
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CartBean.java
@@ -0,0 +1,320 @@
+package examples.shop.impl.session;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.ejb.Remote;
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import examples.shop.impl.entity.Customer;
+import examples.shop.impl.entity.LineItem;
+import examples.shop.impl.entity.Order;
+import examples.shop.impl.entity.Product;
+import examples.shop.logic.Cart;
+
+/**
+ * This stateful session bean represents a cart which a customer is
+ * working on. A cart is a set of products that the customer is
+ * interested in, but has not committed to buying yet.
+ *
+ * A cart consists of a series of line items. Each line item
+ * represents one particular product the customer wants, as well as a
+ * quantity and discount for that product.
+ *
+ * The distinction between a cart and an order is that a quote is only
+ * temporary and in-memory (hence a stateful session bean), whereas an
+ * order is a persistent record (hence an entity). The cart bean
+ * knows how to transform itself into an order (via the purchase()
+ * method).
+ */
+
+@Stateful
+@Remote(Cart.class)
+public class CartBean implements Cart {
+
+ /**
+ * The shopping cart owner
+ */
+ private String owner;
+
+ /**
+ * The shopping cart contents - a vector of LineItems
+ */
+ private List<LineItem> contents = new ArrayList();
+
+ /**
+ * The subtotal (price before taxes) of the goods
+ */
+ private double subTotal;
+
+ /**
+ * The taxes on the goods
+ */
+ private double taxes;
+
+ @PersistenceContext
+ private EntityManager manager;
+
+ public CartBean() {
+ }
+
+ /**
+ * Get method for the shopping cart owner's name
+ *
+ * @return shopping cart owner
+ */
+ public String getOwner() {
+ return owner;
+ }
+
+ /**
+ * Set method for the shopping cart owner's name
+ *
+ * @param shopping
+ * cart owner
+ */
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ /**
+ * Adds an item to the shopping cart
+ *
+ * @param shopping
+ * cart lineitem
+ */
+ public void add(LineItem lineItem) {
+ /*
+ * Search for an exiting line item in the cart that match
+ * the productID passed in.
+ */
+ for (Iterator<LineItem> iter = contents.iterator(); iter.hasNext();) {
+ LineItem item = iter.next();
+ Product product = item.getProduct();
+
+ if (product != null
+ && product.getProductID().equals(
+ lineItem.getProduct().getProductID())) {
+ // found one, modify that line item's quantity and return
+ item.setQuantity(item.getQuantity() + lineItem.getQuantity());
+ return;
+ }
+ }
+
+ /*
+ * Did not find a match, so add the line item as new.
+ */
+ contents.add(lineItem);
+ }
+
+ /**
+ * Changes the quantities of contents in the shopping cart
+ *
+ * @param product
+ * Id
+ * @param number
+ * of items.
+ */
+ public void modify(String productID, int quantity) throws Exception {
+ System.out.println("CartBean.modify()");
+
+ /*
+ * Search for a lineitem in the cart that match the productID passed in.
+ * If found, modify that lineitem.
+ */
+ for (Iterator<LineItem> iter = contents.iterator(); iter.hasNext();) {
+ LineItem item = iter.next();
+ Product product = item.getProduct();
+ if (product != null && product.getProductID().equals(productID)) {
+ item.setQuantity(quantity);
+ if (quantity == 0) {
+ iter.remove();
+ }
+ return;
+ }
+ }
+ throw new Exception("CartBean.modify() error: Could not find product "
+ + productID);
+ }
+
+ /**
+ * Returns all the shopping cart line items
+ *
+ * @return A collection of Cart LineItems
+ */
+ public List<LineItem> getAll() {
+ return contents;
+ }
+
+ /**
+ * @return the subtotal price which has been previously set by
+ * setSubtotal().
+ */
+ public double getSubtotal() {
+ return subTotal;
+ }
+
+ /**
+ * Sets the subtotal price.
+ * @param subTotal the subtotal price
+ */
+ public void setSubtotal(double subTotal) {
+ this.subTotal = subTotal;
+ }
+
+ /**
+ * @return the taxes computed for this Cart.
+ */
+ public double getTaxes() {
+ return taxes;
+ }
+
+ /**
+ * Sets the taxes for this Cart.
+ */
+ public void setTaxes(double taxes) {
+ System.out.println("CartBean.setTaxes(): " + taxes);
+ this.taxes = taxes;
+ }
+
+ /**
+ * Get the total price. The total Price is computed from:
+ * <ol>
+ * <li>Subtotal price
+ * <li>Tax
+ * </ol>
+ * @return the total price.
+ */
+ public double getTotalPrice() {
+ return subTotal + taxes;
+ }
+
+ /**
+ * Empties the shopping cart
+ */
+ public void clear() {
+ contents.clear();
+ }
+
+ /**
+ * Purchases this cart. The cart will create an order in the database
+ * and return the order ID as a confirmation number.
+ *
+ * @return The Order confirmation number
+ */
+ public String purchase() {
+ System.out.println("CartBean.purchase()");
+ Customer customer = manager.find(Customer.class, owner);
+
+ /*
+ * Create the order entity
+ */
+ Order order = new Order();
+ String orderID = makeUniqueID();
+ order.init(orderID, customer, Order.Status.Unverified, subTotal, taxes);
+ order.setLineItems(prepareContents());
+ manager.persist(order);
+
+ /*
+ * Sends the JMS message to the topic
+ */
+ try {
+ sendMessage(orderID);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ /*
+ * Return the order ID
+ */
+ return orderID;
+ }
+
+ /**
+ * Sends a JMS message to a destination (Queue or Topic)
+ *
+ * @param a
+ * message string, in this case orderId
+ */
+ private void sendMessage(String text) throws Exception {
+ Connection connection = null;
+ MessageProducer producer = null;
+ Session session = null;
+
+ try {
+ Context jndiContext = new InitialContext();
+ ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext
+ .lookup("jms/QueueConnectionFactory");
+ Destination destination = (Destination) jndiContext
+ .lookup("jms/OrderQueue");
+ connection = connectionFactory.createConnection();
+ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ producer = session.createProducer(destination);
+
+ connection.start();
+ TextMessage msg = session.createTextMessage();
+ msg.setText(text);
+ producer.send(msg);
+ } catch (Exception ex) {
+ throw ex;
+ } finally {
+ if (connection != null) {
+ try {
+ producer.close();
+ connection.close();
+ session.close();
+ } catch (JMSException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ /**
+ * Generates primary keys for line items and loads the products
+ * into the persistence context.
+ */
+
+ private List<LineItem> prepareContents() {
+ for (Iterator<LineItem> iter = contents.iterator(); iter.hasNext();) {
+ LineItem lineItem = iter.next();
+ Product p = manager.find(Product.class, lineItem.getProduct()
+ .getProductID());
+ lineItem.setProduct(p);
+ lineItem.setId(makeUniqueID());
+ }
+ return contents;
+ }
+
+ /**
+ * Returns a unique Id based on current time. Can be removed
+ * when AUTO key generation works in Glassfish *
+ */
+ private String makeUniqueID() {
+ String id = new Long(System.nanoTime()).toString();
+ System.out.println("makeUniqueID: " + id);
+ return id;
+ }
+
+ /**
+ * Removes this quote, and hence all client-
+ * specific state.
+ */
+ @Remove
+ public void remove() {
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CatalogBean.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CatalogBean.java
new file mode 100644
index 0000000..658b675
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CatalogBean.java
@@ -0,0 +1,41 @@
+package examples.shop.impl.session;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import examples.shop.impl.entity.Product;
+import examples.shop.logic.Catalog;
+
+/**
+ * This catalog Stateless Session Bean retrieves a list of productitems.
+ * ProductItem has product Id, name of the product and description
+ */
+@Stateless
+@Remote(Catalog.class)
+public class CatalogBean implements Catalog {
+
+ @PersistenceContext
+ private EntityManager manager;
+
+ public CatalogBean() {
+ }
+
+ public Product getProduct(String productId) {
+ return manager.find(Product.class, productId);
+ }
+
+ public List<Product> getProductList() {
+ /* find all products */
+ return manager.createQuery("SELECT p FROM Product p")
+ .getResultList();
+ }
+
+ public void addProduct(Product product) {
+ manager.persist(product);
+ }
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/PricerBean.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/PricerBean.java
new file mode 100644
index 0000000..cbcb73f
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/PricerBean.java
@@ -0,0 +1,138 @@
+package examples.shop.impl.session;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+import javax.jws.WebService;
+
+import examples.shop.impl.entity.Customer;
+import examples.shop.impl.entity.LineItem;
+import examples.shop.logic.Pricer;
+import examples.shop.logic.UserManager;
+
+/**
+ * Stateless Session Bean which computes prices based
+ * upon a set of pricing rules. The pricing rules are
+ * deployed with the bean as environment properties.
+ */
+@Stateless
+@Remote(Pricer.class)
+@WebService(serviceName="PricerService", portName="PricerPort")
+public class PricerBean implements Pricer {
+
+ @Resource(name="taxRate")
+ public int taxRate = 0;
+
+ @Resource(name="bulkDiscountRate")
+ public int bulkDiscountRate = 0;
+
+ @EJB
+ UserManager userManager;
+
+ public PricerBean() {
+ }
+
+ /**
+ * bulk discounts apply to quantities of BULK or more items
+ */
+ private static final int BULK = 5;
+
+ /**
+ * This method computes the applicable discount in absolute
+ * figure, based on bulk and personal discounts that may apply.
+ *
+ * @param quantity the number of items that a user intends to buy
+ * @param basePrice the overall, non-discounted volume of the
+ * purchase (individual price times quantity)
+ * @param the user name
+ * @return the subTotal for the line item after applying any
+ * applicable discounts, excluding taxes
+ */
+ public double getDiscount(int quantity, double basePrice, String user) {
+ double discountRate = getPersonalDiscountRate(user);
+ if (quantity >= BULK) {
+ discountRate += getBulkDiscountRate();
+ System.out.println("Using getBulkDiscountRate " + getBulkDiscountRate());
+ }
+
+ /*
+ * Calculate the discount in absolute figures
+ */
+ return basePrice * (discountRate / 100);
+ }
+
+ /**
+ * A bulk discount applies to quantities of more than 5 pieces.
+ * @return the bulk discount rate int percent
+ */
+ public double getBulkDiscountRate() {
+ return this.bulkDiscountRate;
+ }
+
+ /**
+ * Customers with certain names get discounts. The discount rules
+ * are stored in the environment properties that the bean is
+ * deployed with.
+ */
+ public double getPersonalDiscountRate(String userName) {
+ /*
+ * Get the name of this customer.
+ */
+ Customer user = userManager.getUser(userName);
+ if( user != null)
+ return user.getDiscount();
+ else
+ return 0;
+ }
+
+ /**
+ * Computes the subtotal price for a set of products the customer
+ * is interested in. The subtotal takes into account the price of
+ * each product the customer wants, the quantity of each product,
+ * and any personal discounts the customer gets. However, the
+ * subtotal ignores taxes.
+ *
+ * @param quote All the data needed to compute the
+ * subtotal is in this parameter.
+ */
+ public double priceSubtotal(String user, List<LineItem> items) {
+ System.out.println("PricerBean.priceSubtotal() called");
+
+ /*
+ * Compute the subtotal
+ */
+ double subTotal = 0;
+
+ for(Iterator<LineItem> iter = items.iterator(); iter.hasNext(); ) {
+ LineItem item = iter.next();
+ item.setDiscount(
+ getDiscount(item.getQuantity(), item.basePrice(),user));
+
+ /*
+ * Add the price to the subtotal.
+ */
+ subTotal += (item.basePrice() - item.getDiscount());
+ }
+
+ return subTotal;
+ }
+
+ /**
+ * Computes the taxes on a quote.
+ */
+ public double priceTaxes(double subtotal) {
+ System.out.println("PricerBean.priceTaxes() called, taxes: " + getTaxRate());
+ return (getTaxRate() / 100) * subtotal;
+ }
+
+ /**
+ * @return the applicable tax rate
+ */
+ public double getTaxRate() {
+ return taxRate;
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/UserManagerBean.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/UserManagerBean.java
new file mode 100644
index 0000000..babb67e
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/UserManagerBean.java
@@ -0,0 +1,86 @@
+package examples.shop.impl.session;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import examples.shop.impl.entity.Customer;
+import examples.shop.logic.InvalidPasswordException;
+import examples.shop.logic.UserManager;
+
+/**
+ * UserManager is Stateless session bean resposible for creating and
+ * retrieving a customer record. It also authenticates the user.
+ */
+
+@Stateless
+@Remote(UserManager.class)
+public class UserManagerBean implements UserManager {
+
+ @PersistenceContext
+ EntityManager manager;
+
+ public UserManagerBean() {
+ }
+
+ /**
+ * Returns an customer object for the given customer id.
+ */
+ public Customer getUser(String customerId) {
+ return manager.find(Customer.class, customerId);
+ }
+
+ /**
+ * It uses the customer entity bean to create a record in the databse
+ * @param customerId
+ * @param name
+ * @param password
+ * @param address
+ */
+
+ public Customer createUser(String customerId, String name, String password, String address) {
+ Customer customer = new Customer();
+ customer.init(customerId, name, password, address);
+ manager.persist(customer);
+ return customer;
+ }
+
+ /**
+ * This method authenticates the user
+ *
+ * @return true, if the password is correct
+ * @throws an InvalidPasswordException if password is incorrect.
+ */
+
+ public boolean validateUser(String customerID, String password)
+ throws InvalidPasswordException {
+ if(customerID== null || password == null)
+ throw new IllegalArgumentException("id " + customerID + " pw " + password);
+ Customer user = getUser(customerID);
+ if (user != null && password.equals(user.getPassword())) {
+ return true;
+ } else {
+ System.out.println("Failure to validate user ID " + customerID
+ + " with password " + password + " against password "
+ + user.getPassword());
+
+ throw new InvalidPasswordException("Invalid Password:"
+ + password);
+ }
+ }
+
+ public List<Customer> findAllCustomers() {
+ return manager.createQuery("SELECT c FROM Customer c").getResultList();
+ }
+
+ public void removeAllCustomers() {
+ List l = manager.createQuery("SELECT c FROM Customer c ").getResultList();
+ for(Iterator iter = l.iterator(); iter.hasNext();) {
+ manager.remove(iter.next());
+ }
+ }
+}