From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001
From: Sven Eisenhauer
Date: Fri, 10 Nov 2023 15:11:48 +0100
Subject: add new repo
---
.../src/examples/shop/META-INF/application.xml | 21 ++
.../src/examples/shop/META-INF/ejb-jar.xml | 22 ++
.../src/examples/shop/META-INF/persistence.xml | 13 +
.../src/examples/shop/META-INF/sun-ejb-jar.xml | 13 +
.../src/examples/shop/WEB-INF/sun-web.xml | 5 +
.../src/examples/shop/WEB-INF/web.xml | 38 +++
.../Gerald Examples/src/examples/shop/build.xml | 87 ++++++
.../src/examples/shop/client/PricerClient.java | 52 ++++
.../src/examples/shop/client/SetupClient.java | 58 ++++
.../src/examples/shop/impl/entity/Customer.java | 104 +++++++
.../src/examples/shop/impl/entity/LineItem.java | 132 +++++++++
.../src/examples/shop/impl/entity/Order.java | 183 ++++++++++++
.../src/examples/shop/impl/entity/Product.java | 93 ++++++
.../examples/shop/impl/mdb/OrderProcessorBean.java | 68 +++++
.../src/examples/shop/impl/session/CartBean.java | 320 +++++++++++++++++++++
.../examples/shop/impl/session/CatalogBean.java | 41 +++
.../src/examples/shop/impl/session/PricerBean.java | 138 +++++++++
.../shop/impl/session/UserManagerBean.java | 86 ++++++
.../src/examples/shop/logic/Cart.java | 81 ++++++
.../src/examples/shop/logic/Catalog.java | 31 ++
.../shop/logic/InvalidLoginNameException.java | 19 ++
.../shop/logic/InvalidPasswordException.java | 19 ++
.../src/examples/shop/logic/OrderException.java | 19 ++
.../src/examples/shop/logic/Pricer.java | 50 ++++
.../src/examples/shop/logic/PricerException.java | 19 ++
.../src/examples/shop/logic/UserManager.java | 38 +++
.../src/examples/shop/web/jsp/catalog.jsp | 44 +++
.../src/examples/shop/web/jsp/clearQuote.jsp | 15 +
.../src/examples/shop/web/jsp/emptyQuote.jsp | 15 +
.../src/examples/shop/web/jsp/error.jsp | 11 +
.../src/examples/shop/web/jsp/footer.jsp | 5 +
.../src/examples/shop/web/jsp/login.jsp | 70 +++++
.../src/examples/shop/web/jsp/productInfo.jsp | 32 +++
.../src/examples/shop/web/jsp/receipt.jsp | 19 ++
.../src/examples/shop/web/jsp/showQuote.jsp | 87 ++++++
.../src/examples/shop/web/jsp/title.jsp | 8 +
.../src/examples/shop/web/jsp/wsf.jsp | 22 ++
.../examples/shop/web/servlet/CatalogServlet.java | 167 +++++++++++
.../examples/shop/web/servlet/LoginServlet.java | 166 +++++++++++
.../shop/web/servlet/ShowQuoteServlet.java | 200 +++++++++++++
40 files changed, 2611 insertions(+)
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/application.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/ejb-jar.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/persistence.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/sun-ejb-jar.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/sun-web.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/web.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/build.xml
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/PricerClient.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/SetupClient.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Customer.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/LineItem.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Order.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Product.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/mdb/OrderProcessorBean.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CartBean.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/CatalogBean.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/PricerBean.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/session/UserManagerBean.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Cart.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Catalog.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidLoginNameException.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidPasswordException.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/OrderException.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Pricer.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/PricerException.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/UserManager.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/catalog.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/clearQuote.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/emptyQuote.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/error.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/footer.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/login.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/productInfo.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/receipt.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/showQuote.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/title.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/wsf.jsp
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/CatalogServlet.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/LoginServlet.java
create mode 100644 Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/ShowQuoteServlet.java
(limited to 'Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop')
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/application.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/application.xml
new file mode 100644
index 0000000..fe5919f
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/application.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ Application description
+ Jasmine
+
+
+ shop.war
+ jasmine
+
+
+
+ shopEjb.jar
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/ejb-jar.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..9ca92e0
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/ejb-jar.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ PricerBean
+ examples.shop.impl.session.PricerBean
+ Stateless
+ Container
+
+ taxRate
+ java.lang.Integer
+ 6
+
+
+ bulkDiscountRate
+ java.lang.Integer
+ 10
+
+
+
+
+
\ No newline at end of file
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/persistence.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/persistence.xml
new file mode 100644
index 0000000..893e1c7
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/persistence.xml
@@ -0,0 +1,13 @@
+
+
+
+ jdbc/__default
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/sun-ejb-jar.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/sun-ejb-jar.xml
new file mode 100644
index 0000000..71fa2ad
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/META-INF/sun-ejb-jar.xml
@@ -0,0 +1,13 @@
+
+
+
+ OrderProcessorBean
+
+ OrderProcessorBean
+ jms/OrderQueue
+
+ jms/QueueConnectionFactory
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/sun-web.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/sun-web.xml
new file mode 100644
index 0000000..cca518c
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/sun-web.xml
@@ -0,0 +1,5 @@
+
+
+ jasmine
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/web.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/web.xml
new file mode 100644
index 0000000..7bf9dbb
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/WEB-INF/web.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+ LoginServlet
+ examples.shop.web.servlet.LoginServlet
+
+
+
+ LoginServlet
+ /login/*
+
+
+
+ ShowQuoteServlet
+ examples.shop.web.servlet.ShowQuoteServlet
+
+
+
+ ShowQuoteServlet
+ /showQuote/*
+
+
+
+ CatalogServlet
+ examples.shop.web.servlet.CatalogServlet
+
+
+
+ CatalogServlet
+ /catalog/*
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/build.xml b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/build.xml
new file mode 100644
index 0000000..a403dda
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/build.xml
@@ -0,0 +1,87 @@
+
+ ]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ &include;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/PricerClient.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/PricerClient.java
new file mode 100644
index 0000000..0bd285b
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/PricerClient.java
@@ -0,0 +1,52 @@
+package examples.shop.client;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+
+import examples.shop.impl.session.PricerBean;
+
+/**
+ * This class is an example of a standalone JAX-RPC client code which uses both
+ * the static stub and the dynamic proxy approach to get a reference to the
+ * remote Web Service
+ */
+public class PricerClient {
+ static String host = "localhost";
+
+ static String portType = "PricerBean";
+
+ static String serviceName = "PricerService";
+
+ static String serviceEndpointAddress = "http://" + host + ":8080/"
+ + serviceName;
+
+ static String nameSpace = "urn:session.impl.shop.examples";
+
+ public static void main(String[] args) throws Exception {
+
+ URL wsdlLocation = new URL(serviceEndpointAddress + "/" + portType
+ + "?WSDL");
+ QName serviceNameQ = new QName(nameSpace, serviceName);
+
+ // dynamic service usage
+ Service service = Service.create(wsdlLocation, serviceNameQ);
+ PricerBean pricerPort = service.getPort(PricerBean.class);
+
+ String user = "Gerald";
+
+ System.out.println("Tax rate: " + pricerPort.getTaxRate());
+ System.out.println("Discount for : " + user + " is "
+ + pricerPort.getPersonalDiscountRate(user));
+
+ System.out
+ .println("Discount for 1 item (at $1000,- per piece) for " + user + " is "
+ + pricerPort.getDiscount(1, 1000, user));
+
+ System.out
+ .println("Discount for 5 items (at $1000,- per piece) for " + user + " is "
+ + pricerPort.getDiscount(5, 5000, user));
+
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/SetupClient.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/SetupClient.java
new file mode 100644
index 0000000..c1fbc27
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/client/SetupClient.java
@@ -0,0 +1,58 @@
+package examples.shop.client;
+
+import java.util.Iterator;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import examples.shop.impl.entity.Product;
+import examples.shop.logic.Catalog;
+import examples.shop.logic.UserManager;
+
+/**
+ * Client test application on a CMP Entity Bean, Product.
+ */
+public class SetupClient {
+
+ public static void main(String[] args) throws Exception {
+
+ try {
+
+ Context ctx = new InitialContext(System.getProperties());
+ Catalog catalog = (Catalog) ctx.lookup(Catalog.class.getName());
+
+ /*
+ * Use the catalog to create Products
+ */
+ catalog.addProduct(new Product().init("123-456-7890", "P4-1.8",
+ "1.8 GHz Pentium 4", 200));
+ catalog.addProduct(new Product().init("123-456-7891", "P4-3",
+ "3 GHz Pentium 4", 300));
+ catalog.addProduct(new Product().init("123-456-7892", "P4-4",
+ "4 GHz Pentium", 400));
+ catalog.addProduct(new Product().init("123-456-7893", "SD-256",
+ "256 MB SDRAM", 50));
+ catalog.addProduct(new Product().init("123-456-7894", "SD-512",
+ "512 MB SDRAM", 100));
+ catalog.addProduct(new Product().init("123-456-7895", "DD-1000",
+ "1GB MB DDRAM", 200));
+ catalog.addProduct(new Product().init("123-456-7896", "MP3-x",
+ "MP3 Player", 200));
+
+ /*
+ * Find a Product, and print out it's description
+ */
+ for (Iterator i = catalog.getProductList().iterator(); i
+ .hasNext();) {
+ System.out.println(i.next().getDescription());
+ }
+
+ UserManager userManager =
+ (UserManager) ctx.lookup(UserManager.class.getName());
+ userManager.createUser("Gerald", "Gerald Brose", "password",
+ "D-13509 Berlin, Germany");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Customer.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Customer.java
new file mode 100644
index 0000000..c986436
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Customer.java
@@ -0,0 +1,104 @@
+package examples.shop.impl.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * This entity represents customer details.
+ */
+@Entity
+public class Customer implements java.io.Serializable {
+
+ private String customerID;
+
+ private String name;
+
+ private String password;
+
+ private String address;
+
+ private double discount;
+
+ /**
+ * Returns the Id of the customer
+ */
+ @Id
+ public String getCustomerID() {
+ return customerID;
+ }
+
+ /**
+ * Sets the id of the customer
+ */
+ public void setCustomerID(String customerId) {
+ this.customerID = customerId;
+ }
+ /**
+ * Returns the name of the customer
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Sets the name of the customer
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Returns the password of the customer
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Sets the password of the customer
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ /**
+ * Returns the address of the customer
+ */
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * Sets the address of the customer
+ */
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public double getDiscount() {
+ return discount;
+ }
+
+ public void setDiscount(double discount) {
+ this.discount = discount;
+ }
+
+ public Customer() {
+ }
+
+ /**
+ * Called when new data is created.
+ *
+ * We need to initialize our Bean's state with the parameters
+ * passed from the client by calling our own abstract set
+ * methods. The Container can then inspect our Bean and
+ * INSERT the corresponding database entries.
+ */
+ public void init(String id, String name, String password, String address) {
+ setCustomerID(id);
+ setName(name);
+ setAddress(address);
+ setPassword(password);
+ }
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/LineItem.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/LineItem.java
new file mode 100644
index 0000000..447cc75
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/LineItem.java
@@ -0,0 +1,132 @@
+package examples.shop.impl.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+
+/**
+ * A line item entity is a quantity of a single product.
+ *
+ * Instances of this class are used for both in-memory represenation
+ * of carts and the persistent representation of orders in
+ * the database
+ */
+@Entity
+public class LineItem implements java.io.Serializable {
+
+ private String id;
+
+ /** the product */
+ private Product product;
+
+ /** Number of items */
+ private int quantity;
+
+ /** Amount of the discount for each item */
+ private double discount;
+
+ /**
+ * Constructor
+ * @param productitem
+ * @param number of items
+ * @Param discount for each item
+ */
+ public LineItem(Product productItem, int quantity, double discount) {
+ System.out.println("LineItem(...) called");
+ this.product = productItem;
+ this.quantity = quantity;
+ this.discount = discount;
+ }
+
+ public LineItem() {
+ System.out.println("New LineItem created.");
+ }
+
+ /**
+ * The id number of this line item. This is our primary key as well.
+ *
+ * @return the id
+ */
+ @Id
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Sets the id
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+
+
+ /**
+ * @return the productitem.
+ * productitem has product id, name of the product and description
+ */
+ @OneToOne
+ public Product getProduct() {
+ System.out.println("LineItem.getProduct() called.");
+ return product;
+ }
+
+ /**
+ * @param productItem.
+ */
+ public void setProduct(Product product) {
+ System.out.println("LineItem.setProduct() called.");
+ this.product = product;
+ }
+
+ /**
+ * @return the number of items.
+ */
+ public int getQuantity() {
+ System.out.println("LineItem.getQuantity() called.");
+ return quantity;
+ }
+
+ /**
+ * @param the number of items.
+ */
+ public void setQuantity(int quantity) {
+ System.out.println("LineItem.setQuantity() called.");
+ this.quantity = quantity;
+ }
+
+ /**
+ * @return the base price. The base price is the
+ * product's price times the quantity ordered. This
+ * figure does not take discounts into consideration.
+ */
+ public double basePrice() {
+ System.out.println("LineItem.getBasePrice() called.");
+ return quantity * product.getBasePrice();
+ }
+
+ /**
+ * @return the discount that the customer gets on
+ * this order.
+ *
+ * Note: The discount is a whole number, not
+ * a percentage discount.
+ */
+ public double getDiscount() {
+ System.out.println("LineItem.getDiscount() called.");
+ return discount;
+ }
+
+ /**
+ * @param the discount that the customer gets on
+ * this order.
+ *
+ * Note: The discount is a whole number, not
+ * a percentage discount.
+ */
+ public void setDiscount(double discount) {
+ System.out.println("LineItem.setDiscount(" + discount + ") called.");
+ this.discount = discount;
+ }
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Order.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Order.java
new file mode 100644
index 0000000..8986495
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Order.java
@@ -0,0 +1,183 @@
+package examples.shop.impl.entity;
+
+import java.sql.Timestamp;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * This entity represents an order placed for goods.
+ *
+ * Note: This entity could easily be extended to include other things, such as:
+ *
+ * - Shipping charges
+ *
- Shipping address vs. Billing address
+ *
- A date which this order is scheduled to be completed/shipped.
+ *
+ */
+
+@Entity
+@Table(name = "ORDERS")
+public class Order {
+
+ public enum Status {
+ Submitted, Unverified, Approved, Shipping, Delivered, Returned
+ };
+
+ private String orderId;
+
+ private List lineItems;
+
+ private Customer customer;
+
+ private Timestamp orderDate;
+
+ private Status status;
+
+ private double taxes;
+
+ private double subTotal;
+
+ /**
+ * This order's identification number. It's also our Primary Key.
+ *
+ * @return order id
+ */
+ @Id
+ public String getOrderID() {
+ return orderId;
+ }
+
+ /**
+ * Sets the order id of an order
+ */
+ public void setOrderID(String id) {
+ orderId = id;
+ }
+
+ /**
+ * This represents a one-to-many relationship to the
+ * line items in the order. Persisting the order cascades
+ * to the line items.
+ *
+ * @return the set of order line items
+ */
+ @OneToMany(cascade = CascadeType.PERSIST)
+ public List getLineItems() {
+ return lineItems;
+ }
+
+ /**
+ * Sets set of the order line items
+ */
+ public void setLineItems(List lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ /**
+ * @returns the Customer who placed this Order.
+ */
+ public Customer getCustomer() {
+ return customer;
+ }
+
+ /**
+ * set customer who placed this order.
+ */
+ public void setCustomer(Customer customer) {
+ this.customer = customer;
+ }
+
+ /**
+ * Returns the date this order was placed.
+ */
+ public Timestamp getOrderDate() {
+ return orderDate;
+ }
+
+ /**
+ * Sets the date this order
+ */
+ public void setOrderDate(Timestamp orderDate) {
+ this.orderDate = orderDate;
+ }
+
+ /**
+ * @return status information about the order.
+ */
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Sets status information about the order.
+ */
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+ /**
+ * Sets the subtotal of this order
+ */
+
+ public double getSubTotal() {
+ return subTotal;
+ }
+
+ /**
+ * Returns the subtotal of this order
+ */
+ public void setSubTotal(double subTotal) {
+ this.subTotal = subTotal;
+ }
+
+ /**
+ * Returns taxes of this order
+ */
+ public double getTaxes() {
+ return taxes;
+ }
+
+ /**
+ * Sets the taxes of this order
+ */
+ public void setTaxes(double taxes) {
+ this.taxes = taxes;
+ }
+
+ /**
+ * Returns the subtotal rice of the entire order, ie. the sum of
+ * the base prices of all line items in this order.
+ */
+ public double totalPrice() {
+ double totalPrice = 0;
+ for (Iterator iter = getLineItems().iterator(); iter
+ .hasNext();) {
+ LineItem item = iter.next();
+ totalPrice += item.getProduct().basePrice;
+ }
+ return totalPrice;
+ }
+
+ /**
+ * Called to initialize a new order entity
+ *
+ * We need to initialize our entity's state with the parameters passed from
+ * the client.
+ */
+ public void init(String orderID, Customer customer, Status status,
+ double subTotal, double taxes) {
+ System.out.println("Order.init(" + orderID + ") called");
+ setOrderID(orderID);
+ setOrderDate(new java.sql.Timestamp(System.currentTimeMillis()));
+ setStatus(status);
+ setSubTotal(subTotal);
+ setTaxes(taxes);
+ }
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Product.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Product.java
new file mode 100644
index 0000000..99fb29a
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/entity/Product.java
@@ -0,0 +1,93 @@
+package examples.shop.impl.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * Entity
+ *
+ * This is a product that's persistent. It has an ID #, a name,
+ * a description, and a base price.
+ */
+@Entity
+public class Product implements java.io.Serializable {
+
+ public String name;
+ public String description;
+ public double basePrice;
+ public String productID;
+
+ public Product() {
+ }
+
+ /**
+ * @return the product id.
+ */
+ @Id
+ public String getProductID() {
+ return productID;
+ }
+
+ /**
+ * Sets the product id.
+ */
+ public void setProductID(String productID) {
+ this.productID = productID;
+ }
+
+ /**
+ * @return the name of the product.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Sets the name of the product.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the description of the product.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Sets the description of the product.
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * @return the base price of the product.
+ */
+ public double getBasePrice() {
+ return basePrice;
+ }
+
+ /**
+ * Sets the base price of the product.
+ */
+ public void setBasePrice(double price) {
+ this.basePrice = price;
+ }
+
+
+ /**
+ * This is the initialization method
+ */
+ public Product init(String productID, String name, String description,
+ double basePrice) {
+ this.productID = productID;
+ this.name = name;
+ this.description = description;
+ this.basePrice = basePrice;
+ return this;
+ }
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/mdb/OrderProcessorBean.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/mdb/OrderProcessorBean.java
new file mode 100644
index 0000000..a1056d1
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/impl/mdb/OrderProcessorBean.java
@@ -0,0 +1,68 @@
+package examples.shop.impl.mdb;
+
+import javax.ejb.ActivationConfigProperty;
+import javax.ejb.EJBException;
+import javax.ejb.MessageDriven;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.TextMessage;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import examples.shop.impl.entity.Order;
+
+
+/**
+ * This message-driven bean receives JMS messages
+ * to process orders. It then performs the order
+ * processing.
+ */
+@MessageDriven(activationConfig = {
+ @ActivationConfigProperty(
+ propertyName = "destinationType",
+ propertyValue = "javax.jms.Queue")
+ })
+public class OrderProcessorBean implements MessageListener {
+
+ @PersistenceContext
+ EntityManager manager;
+
+ public OrderProcessorBean() {
+ }
+
+ /**
+ * The one business method that message-driven beans have
+ * Here we perform the actual order processing
+ */
+ public void onMessage(Message msg) {
+ TextMessage tm = (TextMessage) msg;
+ try {
+ String orderID = tm.getText();
+ System.out.println("Processing order " + orderID);
+
+ Order order = manager.find(Order.class, orderID);
+
+ /*
+ * At this point, we could perform lots of tasks:
+ *
+ * - A call-out to a credit card company (perhaps through
+ * web services) to check the user's credit
+ * card rating and perform a debit.
+ *
+ * - Check the product inventory to ensure availability
+ *
+ * - Check the current backlog for shipping orders
+ *
+ * - Send an email confirmation
+ *
+ * In this example, we'll merely set the order status to
+ * "approved".
+ */
+ order.setStatus(Order.Status.Approved);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new EJBException(e);
+ }
+ }
+
+}
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 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 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 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 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:
+ *
+ * - Subtotal price
+ *
- Tax
+ *
+ * @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 prepareContents() {
+ for (Iterator 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 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 items) {
+ System.out.println("PricerBean.priceSubtotal() called");
+
+ /*
+ * Compute the subtotal
+ */
+ double subTotal = 0;
+
+ for(Iterator 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 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());
+ }
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Cart.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Cart.java
new file mode 100644
index 0000000..b636de2
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Cart.java
@@ -0,0 +1,81 @@
+package examples.shop.logic;
+
+import java.util.List;
+
+import examples.shop.impl.entity.LineItem;
+
+/**
+ * The Cart interface.
+ */
+public interface Cart {
+
+ /**
+ * Adds an item to the shopping cart
+ */
+ public void add(LineItem lineItem);
+
+ /**
+ * Changes the quantities of contents in the shopping cart
+ */
+ public void modify(String productID, int quantity)
+ throws Exception;
+
+ /**
+ * Returns all the shopping cart line items
+ *
+ * @return A collection of Cart LineItems
+ */
+ public List getAll();
+
+ /**
+ * Empties the shopping cart
+ */
+ public void clear();
+
+ /**
+ * Get/set methods for the shopping cart owner's name
+ */
+ public String getOwner();
+
+ public void setOwner(String owner);
+
+ /**
+ * Purchases this cart. The cart will create an order in the database.
+ *
+ * @return The Order confirmation number
+ */
+ public String purchase();
+
+ /**
+ * Returns the subtotal price which has been previously set by
+ * setSubtotal().
+ *
+ * @return the subtotal of this cart items.
+ */
+ public double getSubtotal();
+
+ /**
+ * Sets the subtotal price. Our external pricer bean is responsible for
+ * calculating the subtotal. It calculates it based upon customer discounts
+ * (and can be extended to include other rules as well).
+ */
+ public void setSubtotal(double subTotal);
+
+ /**
+ * Returns the taxes for this Quote.
+ */
+ public double getTaxes();
+
+ /**
+ * Sets the taxes for this Quote.
+ */
+ public void setTaxes(double taxes);
+
+ /**
+ * Returns the total price. Total Price is computed from: 1) Subtotal price
+ * 2) Tax
+ */
+ public double getTotalPrice();
+
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Catalog.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Catalog.java
new file mode 100644
index 0000000..32310fd
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Catalog.java
@@ -0,0 +1,31 @@
+package examples.shop.logic;
+
+import java.util.*;
+
+import examples.shop.impl.entity.Product;
+
+/**
+ * This is the Catalog business interface.
+ */
+
+public interface Catalog {
+
+ /**
+ * @return a vector of Products
+ */
+ public List getProductList();
+
+ /**
+ * @return a Product for the given product id.
+ */
+ public Product getProduct(String productId);
+
+ /**
+ * Add a new product to the catalog
+ * @param product
+ */
+ public void addProduct(Product product);
+
+}
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidLoginNameException.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidLoginNameException.java
new file mode 100644
index 0000000..4583f48
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidLoginNameException.java
@@ -0,0 +1,19 @@
+package examples.shop.logic;
+
+/**
+ * Exceptions thrown by usermanager
+ */
+public class InvalidLoginNameException extends Exception {
+
+ public InvalidLoginNameException() {
+ super();
+ }
+
+ public InvalidLoginNameException(Exception e) {
+ super(e.toString());
+ }
+
+ public InvalidLoginNameException(String s) {
+ super(s);
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidPasswordException.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidPasswordException.java
new file mode 100644
index 0000000..5d0db3c
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/InvalidPasswordException.java
@@ -0,0 +1,19 @@
+package examples.shop.logic;
+
+/**
+ * Exceptions thrown by usermanager
+ */
+public class InvalidPasswordException extends Exception {
+
+ public InvalidPasswordException() {
+ super();
+ }
+
+ public InvalidPasswordException(Exception e) {
+ super(e.toString());
+ }
+
+ public InvalidPasswordException(String s) {
+ super(s);
+ }
+}
\ No newline at end of file
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/OrderException.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/OrderException.java
new file mode 100644
index 0000000..bd08de0
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/OrderException.java
@@ -0,0 +1,19 @@
+package examples.shop.logic;
+
+/**
+ * Exceptions thrown by Order
+ */
+public class OrderException extends Exception {
+
+ public OrderException() {
+ super();
+ }
+
+ public OrderException(Exception e) {
+ super(e.toString());
+ }
+
+ public OrderException(String s) {
+ super(s);
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Pricer.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Pricer.java
new file mode 100644
index 0000000..5c10b41
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/Pricer.java
@@ -0,0 +1,50 @@
+package examples.shop.logic;
+
+import java.util.List;
+
+import examples.shop.impl.entity.LineItem;
+
+/**
+ * These are the business logic methods exposed publicly by the
+ * Pricer component, a function that computes a price for a
+ * given user and base price.
+ */
+
+public interface Pricer {
+ /**
+ * Computes the price of a set of goods
+ */
+
+ public double priceSubtotal(String user, List items);
+
+ public double priceTaxes(double subtotal);
+
+ /**
+ * @return the applicable tax rate
+ */
+ double getTaxRate();
+
+ /**
+ * @return the current discount rate for buying lots of items
+ */
+ double getBulkDiscountRate();
+
+ /**
+ * @return the discount rate for a given user in percent
+ */
+ double getPersonalDiscountRate(String userName);
+
+ /**
+ * 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
+ */
+ double getDiscount(int quantity, double basePrice, String user);
+
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/PricerException.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/PricerException.java
new file mode 100644
index 0000000..e198a6a
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/PricerException.java
@@ -0,0 +1,19 @@
+package examples.shop.logic;
+
+/**
+ * Exceptions thrown by Pricer
+ */
+public class PricerException extends Exception {
+
+ public PricerException() {
+ super();
+ }
+
+ public PricerException(Exception e) {
+ super(e.toString());
+ }
+
+ public PricerException(String s) {
+ super(s);
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/UserManager.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/UserManager.java
new file mode 100644
index 0000000..f34575d
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/logic/UserManager.java
@@ -0,0 +1,38 @@
+package examples.shop.logic;
+
+import java.util.List;
+
+import examples.shop.impl.entity.Customer;
+
+/**
+ * This is the UserManager interface.
+ */
+public interface UserManager {
+
+ /**
+ * It uses the customer entity bean to crate a record in the databse
+ */
+ public Customer createUser(String customerId, String name, String password,
+ String address);
+
+ /**
+ * Returns an user object for the given customer id. It uses customer entity
+ * bean to retrieve the user record.
+ */
+ public Customer getUser(String customerId);
+
+ /**
+ * Authenticate the user.
+ */
+ public boolean validateUser(String login, String password)
+ throws InvalidPasswordException;
+
+ /**
+ * Demo lookup
+ *
+ * @return
+ */
+ public List findAllCustomers();
+
+ public void removeAllCustomers();
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/catalog.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/catalog.jsp
new file mode 100644
index 0000000..92ccf8d
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/catalog.jsp
@@ -0,0 +1,44 @@
+<%-- This JSP Retrieves products vector from HttpSession and displays in table format.
+ The product details includes name the product and its base price. User can view the
+ product details by clicking on name of the product. User can also add a product to
+ the shopping cart by clicking on add to cart link. When user clicks on add to cart
+ link, item is added to the cart and displays same at the bottom of the screen.
+
+--%>
+<%@ page import="examples.shop.impl.entity.Product" %>
+
+ Jasmine's Catalog page
+
+
+
+ Please choose from our selections
+
+ <%
+ //Retrieves catalog vector from HTTPSession and displays product item details in a table format
+ session = request.getSession(false);
+ java.util.Vector products=(java.util.Vector)session.getAttribute("products");
+ int size=products.size();
+ Product item=null;
+ for(int i=0; i
+
+ | <%=item.getName()%> |
+ <%=item.getBasePrice()%> |
+ Add to Cart |
+
+ <%}%>
+
+
+ <%
+ // Displays the name of the product item added to the cart, at the bottom of the page.
+ String productName = (String) request.getAttribute("ProductPurchased");
+ if (productName != null) {
+ %>
+ <%=productName%> has been added to your shopping cart.
+ <% } %>
+
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/clearQuote.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/clearQuote.jsp
new file mode 100644
index 0000000..0c13d29
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/clearQuote.jsp
@@ -0,0 +1,15 @@
+<%-- When user clicks on clear cart button, servlet forwards request to this jsp --%>
+
+
Jasmine's Clear Cart page
+
+
+
+ You just cleared your Cart!
+
+
+
+ Back to the main page
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/emptyQuote.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/emptyQuote.jsp
new file mode 100644
index 0000000..f0779bd
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/emptyQuote.jsp
@@ -0,0 +1,15 @@
+<%-- If shopping cart is empty and user clicks on shopping cart link, servlet forwards request to this jsp --%>
+
+ Jasmine's Empty Cart page
+
+
+ Your Cart is empty.
+
+
+
+ Back to the web storefront.
+
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/error.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/error.jsp
new file mode 100644
index 0000000..47aaca8
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/error.jsp
@@ -0,0 +1,11 @@
+<%-- JSP container forwards request to this jsp, if any exceptions in processing --%>
+
+ Jasmine's Error page
+
+
+ Error in processing your request.
+
Please contact System Administrator
+
Click here to return to the main page.
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/footer.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/footer.jsp
new file mode 100644
index 0000000..2df4e29
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/footer.jsp
@@ -0,0 +1,5 @@
+<%-- Diplays Footer --%>
+
+© 2004-2006, Jasmine's Computer Parts, Inc., All rights reserved.
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/login.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/login.jsp
new file mode 100644
index 0000000..8d773b3
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/login.jsp
@@ -0,0 +1,70 @@
+<%--
+ This JSP displays a login screen. When the user fills out the login
+ screen, it will submit it to the Login Servlet, which will verify the
+ user's credentials by calling EJB components.
+
+ If the verification is unsuccessful, the login servlet will return
+ the user to this page to re-enter his credentials.
+
+ If the verification is successful, Jasmine's main page will be displayed.
+--%>
+
+
+
+ Jasmine's Login page
+
+
+
+
+<%-- Include the title, which is "Jasmine's Computer Parts"--%>
+
+
+<%-- Indicate the error page to use if an error occurs --%>
+
+
+<%-- Display the login form --%>
+Please enter login information
+
+
+
+<%
+ // get whether the person logged in successfully
+ Boolean failed = (Boolean) request.getAttribute("loginFailed");
+ if (failed != null) {
+ if (failed.booleanValue() == true) {
+%>
+
+ Could not log in! Please try again.
+
+<%
+ }
+ }
+%>
+
+<%-- Include the page footer --%>
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/productInfo.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/productInfo.jsp
new file mode 100644
index 0000000..e18ea8a
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/productInfo.jsp
@@ -0,0 +1,32 @@
+<%--This JSP displays details of the selected product.
+ Customer can add this item to the shopping cart by clicking on add to cart link.
+ Customer has provision to navigate to the catalog as well as to the shopping cart pages.
+ --%>
+<%@ page import="examples.shop.impl.entity.Product" %>
+
+
+
Jasmine's Product Info page
+
+
+
+
+ <%
+ //Retrieves the productItem from request object and displays.
+ Product item=(Product)request.getAttribute("productItem");
+ %>
+
+ <%=item.getName()%>
+ Description:
+ <%=item.getDescription()%>
+ Base price (before discounts):<%=item.getBasePrice()%>
+
+
+ Add this item to Cart
+ See the Catalog
+ View Current Shopping Cart
+
+
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/receipt.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/receipt.jsp
new file mode 100644
index 0000000..448a26b
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/receipt.jsp
@@ -0,0 +1,19 @@
+<%--This JSP displays order confirmation. When user clicks on order button,
+ Order will be created in the database and order confirmation number will be
+ displayed to the customer.
+ --%>
+
+ Jasmine's Order Confirmation page
+
+
+
+ <%-- Retrieves Order Id from request object and displays.--%>
+ Thank you for shopping with us.
+
Your order number is <%=request.getAttribute("orderID")%>
+
Please shop with us again soon!
+
+
Click here to return to the main page.
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/showQuote.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/showQuote.jsp
new file mode 100644
index 0000000..d01abbb
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/showQuote.jsp
@@ -0,0 +1,87 @@
+<%--
+ This JSP displays details of the products added to the cart.
+ The details includes the name of the product, quantity, base price,
+ discount and total price of each line item. It also displays subtotal,
+ taxes and grand total of the entire cart. Customer has provision to
+ modify the quantities, order the contents and clear the cart.
+
+--%>
+
+
Jasmine's Shopping Cart page
+
+
+
+ <%@ page import="examples.shop.impl.entity.Product" %>
+ <%@ page import="examples.shop.impl.entity.LineItem" %>
+ <%@ page import="java.util.List" %>
+ <%@ page import="java.util.Iterator" %>
+ <%@ page import="java.text.NumberFormat" %>
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/title.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/title.jsp
new file mode 100644
index 0000000..afaaea1
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/title.jsp
@@ -0,0 +1,8 @@
+<%-- Diplays title --%>
+
+
+
+ Jasmine's Computer Parts
+
+
+
\ No newline at end of file
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/wsf.jsp b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/wsf.jsp
new file mode 100644
index 0000000..de589f1
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/jsp/wsf.jsp
@@ -0,0 +1,22 @@
+<%--
+ This JSP page displays Jasmine's main screen.
+ Customers can navigate to the catalog as well as
+ to the shopping cart page.
+--%>
+
+
+
+ Jasmine's Main page
+
+
+
+
+
+
+ Choose from our excellent selection of computer parts.
+
+ Look at your shopping cart to see the equipment you've chosen.
+
+
+
+
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/CatalogServlet.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/CatalogServlet.java
new file mode 100644
index 0000000..1a0049a
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/CatalogServlet.java
@@ -0,0 +1,167 @@
+package examples.shop.web.servlet;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletConfig;
+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 examples.shop.impl.entity.LineItem;
+import examples.shop.impl.entity.Product;
+import examples.shop.logic.Cart;
+import examples.shop.logic.Catalog;
+
+/**
+ * This servlet displays a catalog of products to
+ * the end-user.
+ *
+ * By the time this servlet is called, the user has
+ * logged in (via the Login servlet), and has a shopping
+ * cart started (i.e. Cart bean). Since this servlet is
+ * pooled and re-used for different user requests, the
+ * servlet code does not store any information specific to
+ * any user. Rather, we store a reference to the user's
+ * Cart in the user's HttpSession object, which is
+ * globally accessible to all servlets.
+ */
+public class CatalogServlet extends HttpServlet {
+
+ public Catalog catalog;
+
+ /**
+ * The servlet engine calls this method once to
+ * initialize a servlet instance.
+ */
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ try {
+ Context ctx = new InitialContext();
+ catalog = (Catalog)ctx.lookup(Catalog.class.getName());
+ } catch (NamingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * The servlet engine calls this method when the user's
+ * desktop browser sends an HTTP request.
+ */
+ public void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ List products = null;
+ try {
+ /*
+ * Get the user's HttpSession, and from that get
+ * the user's current cart.
+ */
+ HttpSession session = request.getSession(false);
+ if (session == null) {
+ /*
+ * Redirect user to login page if he
+ * doesn't have a session.
+ */
+ response.sendRedirect(response
+ .encodeRedirectURL("/jasmine/login"));
+ return;
+ }
+
+ Object obj = session.getAttribute("cart");
+ if (obj == null) {
+ /*
+ * Redirect user to login page if he
+ * doesn't have a session.
+ */
+ response.sendRedirect(response
+ .encodeRedirectURL("/jasmine/login"));
+ return;
+ }
+ Cart cart = (Cart) obj;
+ String productIDToAdd = request.getParameter("Buy");
+ products = (Vector) session.getAttribute("products");
+ String productId = (String) request.getParameter("productId");
+
+ /*
+ * If user wants to purchase something (via
+ * the URL parameter 'Buy'), add the desired
+ * product item to the cart.
+ */
+
+ if (productIDToAdd != null) {
+ /*
+ * Creates LineItem, and add to the cart.
+ */
+ try {
+ Product item = getProductItem(products, productIDToAdd);
+ cart.add(new LineItem(item, 1, 0));
+ // Set a flag so that JSP knows which product we purchased
+ request.setAttribute("ProductPurchased", item.getName());
+ // Forwards the request to the catalog JSP
+ this.getServletContext().getRequestDispatcher(
+ "/catalog.jsp").forward(request, response);
+ return;
+ } catch (Exception e) {
+ throw new ServletException(e.toString());
+ }
+ }
+ /*
+ * If user wants to view the product details (via
+ * the URL parameter 'productId')
+ */
+ else if (productId != null) {
+ //Retrieves the product item from the prducts vector and pass it in request object.
+ request.setAttribute("productItem", getProductItem(products,
+ productId));
+ // Forwards the request to the productInfo JSP
+ this.getServletContext().getRequestDispatcher(
+ "/productInfo.jsp").forward(request, response);
+ return;
+ }
+ /*
+ * If products vector = null,Retrieves productItems vector
+ * from Catalog stateless session bean and put it in the
+ * HttpSession. we may need to put this vector in
+ * application level instead of session.
+ */
+ else {
+ if (products == null) {
+ products = catalog.getProductList();
+ session.setAttribute("products", products);
+ }
+ // Forwards the request to the catalog JSP
+ this.getServletContext().getRequestDispatcher("/catalog.jsp")
+ .forward(request, response);
+ return;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Returns the product for the given product id, if it is in the vector
+ */
+
+ private Product getProductItem(List products, String productIDToAdd) {
+ for (Iterator iter = products.iterator(); iter.hasNext();) {
+ Product item = iter.next();
+ if (item.getProductID().equals(productIDToAdd)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ public String getServletInfo() {
+ return "The Catalog servlet adds products to the user's "
+ + "cart and prints the catalog.";
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/LoginServlet.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/LoginServlet.java
new file mode 100644
index 0000000..0340fd9
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/LoginServlet.java
@@ -0,0 +1,166 @@
+package examples.shop.web.servlet;
+
+import java.io.IOException;
+
+import javax.ejb.EJB;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletConfig;
+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 examples.shop.logic.Cart;
+import examples.shop.logic.UserManager;
+
+/**
+ * This is the very first servlet the client deals with. It's a Login
+ * authentication servlet and asks the user for his name and password,
+ * and pass it to the UserManager stateless session bean for verificatiion.
+ *
+ * If the user authenticates properly, a reference to a new Cart is saved
+ * in his HttpSession object, and the user can begin to add items to his
+ * cart and shop around.
+ */
+public class LoginServlet extends HttpServlet {
+
+ /** the user manager used to authenticate the user */
+ @EJB
+ UserManager userManager;
+
+ /** the user's cart object */
+ @EJB
+ Cart cart;
+
+ /**
+ * The servlet engine calls this method once to initialize a servlet
+ * instance.
+ */
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ try {
+ /*
+ * Get the initial context using the above startup params.
+ */
+
+ Context ctx = new InitialContext();
+ userManager = (UserManager) ctx.lookup(UserManager.class
+ .getName());
+ cart = (Cart) ctx.lookup(Cart.class.getName());
+
+ } catch (Exception e) {
+ log(e);
+ throw new ServletException(e.toString());
+ }
+ }
+
+ /**
+ * The servlet engine calls this method when the user's desktop browser
+ * sends an HTTP request.
+ */
+ public void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ /*
+ * Set up the user's HttpSession
+ */
+ HttpSession session = request.getSession(true);
+
+ System.out.println(request.getAttributeNames().toString());
+ /*
+ * Retrieve the login name / password from the URL string.
+ */
+ String loginName = request.getParameter("Login");
+ String password = request.getParameter("Password");
+ boolean isLogin = false;
+
+ /*
+ * If user has not tried to log in yet, present him with the login
+ * screen.
+ */
+ if ((loginName == null) || (password == null)) {
+ writeForm(request, response, false);
+ return;
+ } else {
+ /*
+ * Otherwise, the user has been to this screen already, and has
+ * entered some information. Verify that information.
+ */
+ try {
+ isLogin = userManager.validateUser(loginName, password);
+ } catch (Exception e) {
+ writeForm(request, response, true);
+ e.printStackTrace();
+ return;
+ }
+ /*
+ * If the passwords match, make a new Cart Session Bean, and add it
+ * to the user's HttpSession object. When the user navigates to
+ * other servlets, the other servlets can access the HttpSession to
+ * get the user's Cart.
+ */
+ if (isLogin) {
+ try {
+ cart.setOwner(loginName);
+ cart.clear();
+ session.setAttribute("cart", cart);
+
+ /*
+ * Call the main page
+ */
+ RequestDispatcher disp = this.getServletContext()
+ .getRequestDispatcher("/wsf.jsp");
+ disp.forward(request, response);
+
+ return;
+ } catch (Exception e) {
+ log(e);
+ throw new ServletException(e.toString());
+ }
+ } else
+ writeForm(request, response, true);
+ }
+
+ /*
+ * If there was no match, the user is not authenticated. Present another
+ * login screen to him, with an error message indicating that he is not
+ * authenticated.
+ */
+ writeForm(request, response, true);
+ }
+
+ /**
+ * Writes the Login Screen (private use only)
+ *
+ * @param showError
+ * true means show an error b/c client was not authenticated last
+ * time.
+ */
+ private void writeForm(HttpServletRequest request,
+ HttpServletResponse response, boolean showError)
+ throws ServletException, IOException {
+
+ /*
+ * Set a variable indicating whether or not we failed to log-in. The JSP
+ * will read this variable.
+ */
+ request.setAttribute("loginFailed", new Boolean(showError));
+
+ /*
+ * Forward the request to the login JSP
+ */
+ RequestDispatcher disp = this.getServletContext().getRequestDispatcher(
+ "/login.jsp");
+ disp.forward(request, response);
+ }
+
+ private void log(Exception e) {
+ e.printStackTrace();
+ }
+
+ public String getServletInfo() {
+ return "The Login servlet verifies a user.";
+ }
+}
diff --git a/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/ShowQuoteServlet.java b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/ShowQuoteServlet.java
new file mode 100644
index 0000000..d4449d4
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/EJB 3.0 Code/Gerald Examples/src/examples/shop/web/servlet/ShowQuoteServlet.java
@@ -0,0 +1,200 @@
+package examples.shop.web.servlet;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.List;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletConfig;
+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 examples.shop.impl.entity.LineItem;
+import examples.shop.logic.Cart;
+import examples.shop.logic.Pricer;
+
+/**
+ * This servlet allows the user to view and modify his current selections.
+ *
+ * By the time this servlet is called, the user has logged in (via the Login
+ * servlet), and has a shopping cart started (i.e. cart bean). Since this
+ * servlet is pooled and re-used for different user requests, the servlet code
+ * does not store any information specific to any user. Rather, we store a
+ * reference to the user's cart in the user's HttpSession object, which is
+ * globally accessible to all servlets.
+ */
+public class ShowQuoteServlet extends HttpServlet {
+
+ // Pricer for pricing the cart
+ private Pricer pricer;
+
+ /**
+ * The servlet engine calls this method once to initialize a servlet
+ * instance.
+ *
+ * In the body of this method, we need to acquire a Pricer EJB Object for
+ * pricing the carts.
+ */
+ public void init(ServletConfig config) throws ServletException {
+ /*
+ * Call parent to store the config object, so that getServletConfig()
+ * can return it.
+ */
+ super.init(config);
+ try {
+ Context ctx = new InitialContext();
+ pricer = (Pricer)ctx.lookup(Pricer.class.getName());
+ } catch (NamingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * The servlet engine calls this method when the user's desktop browser
+ * sends an HTTP GET request.
+ */
+ public void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ /*
+ * Get the user's HttpSession, and from that get the user's current
+ * cart.
+ */
+ HttpSession session = request.getSession(false);
+ if (session == null) {
+ /*
+ * Redirect user to login page if no session
+ */
+ response.sendRedirect(response.encodeRedirectURL("/jasmine/login"));
+ return;
+ }
+
+ Object obj = session.getAttribute("cart");
+ if (obj == null) {
+ /*
+ * Redirect user to login page if no session
+ */
+ response.sendRedirect(response.encodeRedirectURL("/jasmine/login"));
+ return;
+ }
+
+ Cart cart = (Cart) obj;
+
+ /*
+ * If the user clicked the 'Order' button, he wants to purchase his
+ * selections. We forward the user to the servlet that handles
+ * purchasing.
+ */
+ if (request.getParameter("Order") != null) {
+ /*
+ * First, turn the cart into an order
+ */
+ String orderId = cart.purchase();
+ /*
+ * Stick the orderID in the request so the JSP gets it
+ */
+ request.setAttribute("orderID", orderId);
+ cart.clear();
+ this.getServletContext().getRequestDispatcher("/receipt.jsp")
+ .forward(request, response);
+ return;
+ }
+
+ /*
+ * Next, we need to figure out what button the user clicked, if any.
+ * These come to us as form parameters. We need to loop through each
+ * parameter and interpret it.
+ */
+ Enumeration paramNames = request.getParameterNames();
+ while (paramNames.hasMoreElements()) {
+ String paramName = (String) paramNames.nextElement();
+ String paramValue = request.getParameter(paramName);
+
+ /*
+ * If user clicked 'Update' button, then the user wants to change
+ * the quantities of each product he is ordering. We'll process
+ * those quantities below.
+ */
+ if (paramName.equals("Update")) {
+ } else if (paramName.equals("Clear")) {
+ /*
+ * The user wants to clear the form
+ */
+ cart.clear();
+ this.getServletContext()
+ .getRequestDispatcher("/clearQuote.jsp").forward(
+ request, response);
+ return;
+ } else {
+ /*
+ * If the parameter represents a quantity of a particular
+ * product the user is interested in, then we should update that
+ * product's quantity to reflect this new value.
+ */
+ try {
+ /*
+ * Convert the quantity to int format, and set the new
+ * quantity
+ */
+ int quantity = Integer.parseInt(paramValue);
+ cart.modify(paramName, quantity);
+ } catch (NumberFormatException e) {
+ throw new ServletException("Bad parameter to servlet: "
+ + paramName + ", " + paramValue);
+ } catch (Exception e) {
+ throw new ServletException(e.toString());
+ }
+ }
+ }
+
+ /*
+ * Recalculate all totals based upon new quantities
+ */
+ try {
+ cart.setSubtotal(pricer.priceSubtotal(cart.getOwner(), cart.getAll()));
+ cart.setTaxes(pricer.priceTaxes(cart.getSubtotal()));
+ } catch (Exception e) {
+ log(e);
+ throw new ServletException(e.toString());
+ }
+
+ /*
+ * Otherwise, show the current cart again
+ */
+ List lineItems = cart.getAll();
+ if (lineItems.size() > 0) {
+ /*
+ * Stick lineitems, subtotal, taxes and total in request
+ */
+ request.setAttribute("lineItems", lineItems);
+ request.setAttribute("subTotal", new Double(cart.getSubtotal()));
+ request.setAttribute("taxes", new Double(cart.getTaxes()));
+ request.setAttribute("taxRate", new Double(pricer.getTaxRate()));
+ request.setAttribute("total", new Double(cart.getTotalPrice()));
+ // Forwards the request to the showQuote JSP.
+ this.getServletContext().getRequestDispatcher("/showQuote.jsp")
+ .forward(request, response);
+ return;
+ } else {
+ /*
+ * If there are no products, print out that the cart is empty.
+ */
+ this.getServletContext().getRequestDispatcher("/emptyQuote.jsp")
+ .forward(request, response);
+ return;
+ }
+ }
+
+ private void log(Exception e) {
+ e.printStackTrace();
+ }
+
+ public String getServletInfo() {
+ return "The ShowQuote servlet returns information about"
+ + "the products that the user is in the process of ordering.";
+ }
+}
--
cgit v1.2.3