You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ho...@apache.org on 2006/12/01 17:05:52 UTC

svn commit: r481268 - in /geronimo/daytrader/trunk/modules: ejb/src/main/java/org/apache/geronimo/samples/daytrader/ ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/ ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/ ejb/sr...

Author: hogstrom
Date: Fri Dec  1 08:05:50 2006
New Revision: 481268

URL: http://svn.apache.org/viewvc?view=rev&rev=481268
Log:
DAYTRADER-15 Add support for Stateless to JDBC Operations

Added:
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java   (with props)
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java   (with props)
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java   (with props)
    geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java   (with props)
    geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java   (with props)
Modified:
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/KeySequenceDirect.java
    geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java
    geronimo/daytrader/trunk/modules/ejb/src/main/resources/META-INF/ejb-jar.xml
    geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml
    geronimo/daytrader/trunk/modules/web/src/main/webapp/web_prmtv.html

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeAction.java Fri Dec  1 08:05:50 2006
@@ -25,9 +25,9 @@
 
 import org.apache.geronimo.samples.daytrader.direct.TradeDirect;
 import org.apache.geronimo.samples.daytrader.ejb.TradeHome;
+import org.apache.geronimo.samples.daytrader.session.TradeJDBCHome;
 import org.apache.geronimo.samples.daytrader.util.FinancialUtils;
 import org.apache.geronimo.samples.daytrader.util.Log;
-// import com.ibm.websphere.cache.*;
 
 /**
  * The TradeAction class provides the generic client side access to each of the
@@ -40,6 +40,7 @@
 public class TradeAction implements TradeServices {
     private TradeServices trade = null;
     private static TradeHome tradeHome = null;
+    private static TradeJDBCHome tradeJDBCHome = null;
     private static TradeHome tradeHomeJPA = null;
 
 
@@ -99,6 +100,24 @@
             catch (Exception e) {
                 Log.error("TradeAction:TradeAction() Creation of Trade Direct failed\n" + e);
             }
+        } else if (TradeConfig.runTimeMode == TradeConfig.SESSION) {
+            try {
+                if (tradeHome == null) {
+                    InitialContext ic = new InitialContext();
+                    try {
+                        tradeJDBCHome = (TradeJDBCHome) (javax.rmi.PortableRemoteObject.narrow(ic.lookup("java:comp/env/ejb/TradeJDBC"), TradeJDBCHome.class));
+                    }
+                    catch (Exception e) {
+                        Log.log("TradeAction:createTrade lookup of java:comp/env/ejb/TradeJDBC failed. Reverting to JNDI lookup of Trade");
+                        tradeJDBCHome = (TradeJDBCHome) (javax.rmi.PortableRemoteObject.narrow(ic.lookup("TradeJDBC"), TradeJDBCHome.class));
+                    }
+                }
+                trade = tradeJDBCHome.create();
+            }
+            catch (Exception e) {
+                Log.error("TradeAction:TradeAction() Creation of Trade JDBC failed\n" + e);
+                e.printStackTrace();
+            }
         }
     }
 
@@ -466,4 +485,4 @@
         runStatsData = trade.resetTrade(deleteAll);
 		return runStatsData;
 	}
-}
\ No newline at end of file
+}

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java Fri Dec  1 08:05:50 2006
@@ -35,10 +35,11 @@
 	/* Trade Runtime Configuration Parameters */
 
 	/* Trade Runtime Mode parameters */
-	public static String[] runTimeModeNames = { "EJB", "Direct", "JPA" };
+	public static String[] runTimeModeNames = { "EJB", "Direct", "SessionDirect", "JPA" };
 	public static final int EJB = 0;
 	public static final int DIRECT = 1;
-	public static final int JPA = 2;
+	public static final int SESSION = 2;
+	public static final int JPA = 3;
 	public static int runTimeMode = JPA;
 
 	public static String[] orderProcessingModeNames =

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/KeySequenceDirect.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/KeySequenceDirect.java?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/KeySequenceDirect.java (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/KeySequenceDirect.java Fri Dec  1 08:05:50 2006
@@ -33,7 +33,7 @@
 
 	private static HashMap keyMap = new HashMap();
 
-    public static synchronized Integer getNextID(Connection conn, String keyName, boolean inGlobalTxn)
+    public static synchronized Integer getNextID(Connection conn, String keyName, boolean inSession, boolean inGlobalTxn)
 	throws Exception
     {
 		Integer nextID = null;
@@ -42,25 +42,25 @@
 		// Then verify the allocated block has not been depleted
 		// allocate a new block if necessary
 		if ( keyMap.containsKey(keyName) == false)
-			allocNewBlock(conn, keyName, inGlobalTxn);
+			allocNewBlock(conn, keyName, inSession, inGlobalTxn);
 		Collection block = 	(Collection) keyMap.get(keyName);
 		
 		Iterator ids = block.iterator();
 		if ( ids.hasNext() == false )
-			ids = allocNewBlock(conn, keyName, inGlobalTxn).iterator();
+			ids = allocNewBlock(conn, keyName, inSession, inGlobalTxn).iterator();
 		//get and return a new unique key
 		nextID = (Integer) ids.next();
 
-		if (Log.doTrace()) Log.trace("KeySequenceDirect:getNextID - return new PK ID for Entity type: " + keyName + " ID=" + nextID);
+		if (Log.doTrace()) Log.trace("KeySequenceDirect:getNextID inSession(" + inSession + ") - return new PK ID for Entity type: " + keyName + " ID=" + nextID);
 		return nextID;
 	}
 
-	private static Collection allocNewBlock(Connection conn, String keyName, boolean inGlobalTxn)  
+	private static Collection allocNewBlock(Connection conn, String keyName, boolean inSession, boolean inGlobalTxn)  
 	throws Exception
 	{
 		try 
 		{
-			if (inGlobalTxn == false) conn.commit();  // commit any pending txns
+			if (inGlobalTxn == false && !inSession) conn.commit();  // commit any pending txns
 			PreparedStatement stmt = conn.prepareStatement(getKeyForUpdateSQL);
 			stmt.setString(1, keyName);
 			ResultSet rs = stmt.executeQuery();
@@ -92,7 +92,7 @@
 
 			Collection block = new KeyBlock(keyVal, keyVal+TradeConfig.KEYBLOCKSIZE-1);
 			keyMap.put(keyName, block);
-			if (inGlobalTxn == false) conn.commit();
+			if (inGlobalTxn == false && !inSession) conn.commit();
 			return block;			
 		}
 		catch (Exception e)

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/TradeDirect.java Fri Dec  1 08:05:50 2006
@@ -61,6 +61,8 @@
 	private static DataSource datasource = null;
 	private static BigDecimal ZERO = new BigDecimal(0.0);
 	private boolean inGlobalTxn = false;
+	private boolean inSession = false;
+
 
 	/**
 	 * Zero arg constructor for TradeDirect
@@ -69,6 +71,13 @@
 	    if (initialized==false) init();
 	}
 
+	public TradeDirect(boolean inSession) {
+		if (initialized == false)
+			init();
+
+		this.inSession = inSession;
+	}
+
 	/**
 	 * @see TradeServices#getMarketSummary()
 	 */
@@ -78,7 +87,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getMarketSummary");
+			if (Log.doTrace()) Log.trace("TradeDirect:getMarketSummary - inSession(" + this.inSession + ")");
 			
 			conn = getConn();
             PreparedStatement stmt = getStatement(conn, getTSIAQuotesOrderByChangeSQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
@@ -191,9 +200,9 @@
 		try
 		{
 			if (Log.doTrace()) 
-				Log.trace("TradeDirect:buy", userID, symbol, new Double(quantity));
+				Log.trace("TradeDirect:buy - inSession(" + this.inSession + ")", userID, symbol, new Double(quantity));
 			
-			if ( orderProcessingMode == TradeConfig.ASYNCH_2PHASE )
+			if ( !inSession && orderProcessingMode == TradeConfig.ASYNCH_2PHASE )
 			{
 				if ( Log.doTrace() )
 					Log.trace("TradeDirect:buy create/begin global transaction");		
@@ -278,9 +287,9 @@
 		try
 		{
 			if (Log.doTrace()) 
-				Log.trace("TradeDirect:sell", userID, holdingID);
+				Log.trace("TradeDirect:sell - inSession(" + this.inSession + ")", userID, holdingID);
 
-			if ( orderProcessingMode == TradeConfig.ASYNCH_2PHASE )
+			if ( !inSession && orderProcessingMode == TradeConfig.ASYNCH_2PHASE )
 			{
 				if ( Log.doTrace() )
 					Log.trace("TradeDirect:sell create/begin global transaction");		
@@ -370,7 +379,7 @@
 	 */
 	public void queueOrder(Integer orderID, boolean twoPhase) throws Exception 
 	{
-		if (Log.doTrace() ) Log.trace("TradeDirect:queueOrder", orderID);
+		if (Log.doTrace() ) Log.trace("TradeDirect:queueOrder - inSession(" + this.inSession + ")", orderID);
 
 		javax.jms.Connection conn = null;	
 		Session sess = null;
@@ -427,8 +436,8 @@
 		try  //twoPhase
 		{
 
-			if (Log.doTrace()) Log.trace("TradeDirect:completeOrder", orderID);
-			setInGlobalTxn(twoPhase);
+			if (Log.doTrace()) Log.trace("TradeDirect:completeOrder - inSession(" + this.inSession + ")", orderID);
+			setInGlobalTxn(!inSession && twoPhase);
 			conn = getConn();
 			orderData = completeOrder(conn, orderID);
 			commit(conn);
@@ -454,7 +463,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:completeOrderOnePhase", orderID);
+			if (Log.doTrace()) Log.trace("TradeDirect:completeOrderOnePhase - inSession(" + this.inSession + ")", orderID);
 			setInGlobalTxn(false);
 			conn = getConn();
 			orderData = completeOrder(conn, orderID);
@@ -482,7 +491,7 @@
 	{
 			
 		OrderDataBean orderData = null;
-		if (Log.doTrace()) Log.trace("TradeDirect:completeOrderInternal", orderID);
+		if (Log.doTrace()) Log.trace("TradeDirect:completeOrderInternal - inSession(" + this.inSession + ")", orderID);
 
 		PreparedStatement stmt = getStatement(conn, getOrderSQL);
         stmt.setInt(1, orderID.intValue());
@@ -589,8 +598,8 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:cancelOrder", orderID);
-			setInGlobalTxn(twoPhase);
+			if (Log.doTrace()) Log.trace("TradeDirect:cancelOrder - inSession(" + this.inSession + ")", orderID);
+			setInGlobalTxn(!inSession && twoPhase);
 			conn = getConn();
 			cancelOrder(conn, orderID);
 			commit(conn);
@@ -613,7 +622,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:cancelOrderOnePhase", orderID);
+			if (Log.doTrace()) Log.trace("TradeDirect:cancelOrderOnePhase - inSession(" + this.inSession + ")", orderID);
 			setInGlobalTxn(false);
 			conn = getConn();
 			cancelOrder(conn, orderID);
@@ -652,7 +661,7 @@
 		Timestamp purchaseDate = new Timestamp(System.currentTimeMillis());
 		PreparedStatement stmt = getStatement(conn, createHoldingSQL);
 	
-		Integer holdingID = KeySequenceDirect.getNextID(conn, "holding", getInGlobalTxn());
+		Integer holdingID = KeySequenceDirect.getNextID(conn, "holding", inSession, getInGlobalTxn());
 		stmt.setInt(1, holdingID.intValue());
 		stmt.setTimestamp(2, purchaseDate);
 		stmt.setBigDecimal(3, purchasePrice);
@@ -694,7 +703,7 @@
 		PreparedStatement stmt = getStatement(conn, createOrderSQL);
 	
 
-		Integer orderID = KeySequenceDirect.getNextID(conn, "order", getInGlobalTxn());
+		Integer orderID = KeySequenceDirect.getNextID(conn, "order", inSession, getInGlobalTxn());
 		stmt.setInt(1, orderID.intValue());
 		stmt.setString(2, orderType);
 		stmt.setString(3, "open");
@@ -722,7 +731,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getOrders", userID);
+			if (Log.doTrace()) Log.trace("TradeDirect:getOrders - inSession(" + this.inSession + ")", userID);
 			
 			conn = getConn();
             PreparedStatement stmt = getStatement(conn, getOrdersByUserSQL);
@@ -763,7 +772,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getClosedOrders", userID);
+			if (Log.doTrace()) Log.trace("TradeDirect:getClosedOrders - inSession(" + this.inSession + ")", userID);
 			
 			conn = getConn();
             PreparedStatement stmt = getStatement(conn, getClosedOrdersSQL);
@@ -808,7 +817,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.traceEnter("TradeDirect:createQuote");
+			if (Log.doTrace()) Log.traceEnter("TradeDirect:createQuote - inSession(" + this.inSession + ")");
 			
 			price = price.setScale(FinancialUtils.SCALE, FinancialUtils.ROUND);
 			double volume=0.0, change=0.0;
@@ -852,7 +861,7 @@
 		UserTransaction txn = null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getQuote", symbol);
+			if (Log.doTrace()) Log.trace("TradeDirect:getQuote - inSession(" + this.inSession + ")", symbol);
 
 			conn = getConn();
 			quoteData = getQuote(conn, symbol);			
@@ -951,7 +960,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getHoldings", userID);
+			if (Log.doTrace()) Log.trace("TradeDirect:getHoldings - inSession(" + this.inSession + ")", userID);
 			
 			conn = getConn();
             PreparedStatement stmt = getStatement(conn, getHoldingsForUserSQL);
@@ -989,7 +998,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getHolding", holdingID);
+			if (Log.doTrace()) Log.trace("TradeDirect:getHolding - inSession(" + this.inSession + ")", holdingID);
 			
 			conn = getConn();
 			holdingData = getHoldingData(holdingID.intValue());
@@ -1020,7 +1029,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getAccountData", userID);
+			if (Log.doTrace()) Log.trace("TradeDirect:getAccountData - inSession(" + this.inSession + ")", userID);
 			
 			conn = getConn();
 			accountData = getAccountData(conn, userID);
@@ -1072,7 +1081,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getAccountData", new Integer(accountID));
+			if (Log.doTrace()) Log.trace("TradeDirect:getAccountData - inSession(" + this.inSession + ")", new Integer(accountID));
 			
 			conn = getConn();
 			accountData = getAccountData(accountID, conn);
@@ -1236,7 +1245,7 @@
 	
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:getAccountProfileData", userID);
+			if (Log.doTrace()) Log.trace("TradeDirect:getAccountProfileData - inSession(" + this.inSession + ")", userID);
 			
 			conn = getConn();
 			accountProfileData = getAccountProfileData(conn, userID);
@@ -1316,7 +1325,7 @@
 	
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:updateAccountProfileData", profileData.getUserID());
+			if (Log.doTrace()) Log.trace("TradeDirect:updateAccountProfileData - inSession(" + this.inSession + ")", profileData.getUserID());
 			
 			conn = getConn();
 			updateAccountProfile(conn, profileData);	
@@ -1439,7 +1448,7 @@
 		UserTransaction txn = null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:updateQuotePriceVolume", symbol, changeFactor, new Double(sharesTraded));		
+			if (Log.doTrace()) Log.trace("TradeDirect:updateQuotePriceVolume - inSession(" + this.inSession + ")", symbol, changeFactor, new Double(sharesTraded));		
 
 			conn = getConn();
 
@@ -1551,7 +1560,7 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.trace("TradeDirect:login", userID, password);
+			if (Log.doTrace()) Log.trace("TradeDirect:login - inSession(" + this.inSession + ")", userID, password);
 			
 			conn = getConn();
             PreparedStatement stmt = getStatement(conn, getAccountProfileSQL);
@@ -1613,7 +1622,7 @@
 	 * @see TradeServices#logout(String)
 	 */
 	public void logout(String userID) throws Exception {
-		if (Log.doTrace()) Log.trace("TradeDirect:logout", userID);
+		if (Log.doTrace()) Log.trace("TradeDirect:logout - inSession(" + this.inSession + ")", userID);
 		Connection conn=null;
 		try
 		{		
@@ -1654,12 +1663,12 @@
 		Connection conn=null;
 		try
 		{
-			if (Log.doTrace()) Log.traceEnter("TradeDirect:register");
+			if (Log.doTrace()) Log.traceEnter("TradeDirect:register - inSession(" + this.inSession + ")");
 			
 			conn = getConn();
             PreparedStatement stmt = getStatement(conn, createAccountSQL);
 
-			Integer accountID = KeySequenceDirect.getNextID(conn, "account", getInGlobalTxn());
+			Integer accountID = KeySequenceDirect.getNextID(conn, "account", inSession, getInGlobalTxn());
 			BigDecimal balance = openBalance;
 			Timestamp creationDate = new Timestamp(System.currentTimeMillis());
 			Timestamp lastLogin  = creationDate;
@@ -2071,8 +2080,10 @@
 	private void commit(Connection conn)
 	throws Exception
 	{
-		if ( (getInGlobalTxn()==false) && (conn != null) )
-			conn.commit();
+		if (!inSession) {
+			if ( (getInGlobalTxn()==false) && (conn != null) )
+				conn.commit();
+		}
 	}
 	
 
@@ -2083,12 +2094,14 @@
    private void rollBack(Connection conn, Exception e) 
    throws Exception 
    {
-   		Log.log("TradeDirect:rollBack -- rolling back conn due to previously caught exception -- inGlobalTxn=" + getInGlobalTxn());
-		if ( (getInGlobalTxn()==false) && (conn != null) )
-	        conn.rollback();
-	    else
-	    	throw e;  // Throw the exception 
-	    			  // so the Global txn manager will rollBack
+		if (!inSession) {
+   			Log.log("TradeDirect:rollBack -- rolling back conn due to previously caught exception -- inGlobalTxn=" + getInGlobalTxn());
+			if ( (getInGlobalTxn()==false) && (conn != null) )
+	        	conn.rollback();
+	    	else
+	    		throw e;  // Throw the exception 
+	    				  // so the Global txn manager will rollBack
+   		} 	
    } 	
 	
    /*

Added: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java?view=auto&rev=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java (added)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java Fri Dec  1 08:05:50 2006
@@ -0,0 +1,120 @@
+package org.apache.geronimo.samples.daytrader.session;
+
+import javax.ejb.EJBObject;
+import java.rmi.Remote;
+import org.apache.geronimo.samples.daytrader.*;
+
+public interface TradeJDBC extends EJBObject, TradeServices, Remote {
+
+	   /**
+		 * Queue the Order identified by orderID to be processed in a One Phase commit
+		 * 
+		 * In short, this method is deployed as TXN REQUIRES NEW to avoid a 
+		 * 2-phase commit transaction across Entity and MDB access
+		 * 
+		 * Orders are submitted through JMS to a Trading Broker
+		 * and completed asynchronously. This method queues the order for processing
+		 *
+		 * @param orderID the Order being queued for processing
+		 * @return OrderDataBean providing the status of the completed order
+		 */
+		//public void queueOrderOnePhase(Integer orderID) throws Exception;
+	   /**
+		 * Complete the Order identified by orderID in a One Phase commit
+		 * 
+		 * In short, this method is deployed as TXN REQUIRES NEW to avoid a 
+		 * 2-phase commit transaction across Entity and MDB access
+		 * 
+		 * Orders are submitted through JMS to a Trading agent
+		 * and completed asynchronously. This method completes the order
+		 * For a buy, the stock is purchased creating a holding and the users account is debited
+		 * For a sell, the stock holding is removed and the users account is credited with the proceeds
+		 *
+		 * @param orderID the Order to complete
+		 * @return OrderDataBean providing the status of the completed order
+		 */
+		public OrderDataBean completeOrderOnePhase(Integer orderID) throws Exception;
+		
+	   /**
+		 * Complete the Order identified by orderID in a One Phase commit
+		 * using TradeDirect to complete the Order
+		 * 
+		 * In short, this method is deployed as TXN REQUIRES NEW to avoid a 
+		 * 2-phase commit transaction across DB and MDB access
+		 * The EJB method is used only to start a new transaction so the direct runtime mode
+		 * for the completeOrder will run in a 1-phase commit
+		 * 
+		 * Orders are submitted through JMS to a Trading agent
+		 * and completed asynchronously. This method completes the order using TradeDirect
+		 * For a buy, the stock is purchased creating a holding and the users account is debited
+		 * For a sell, the stock holding is removed and the users account is credited with the proceeds
+		 *
+		 * @param orderID the Order to complete
+		 * @return OrderDataBean providing the status of the completed order
+		 */	
+	    //public OrderDataBean completeOrderOnePhaseDirect(Integer orderID) throws Exception;
+
+	   /**
+		 * Cancel the Order identefied by orderID
+		 * 
+		 * In short, this method is deployed as TXN REQUIRES NEW to avoid a 
+		 * 2-phase commit transaction across Entity and MDB access
+		 * 
+		 * The boolean twoPhase specifies to the server implementation whether or not the
+		 * method is to participate in a global transaction
+		 *
+		 * @param orderID the Order to complete
+		 * @return OrderDataBean providing the status of the completed order
+		 */
+		public void cancelOrderOnePhase(Integer orderID) throws Exception;
+
+	   /**
+		 * Cancel the Order identefied by orderID
+		 * using TradeDirect to complete the Order
+		 * 
+		 * In short, this method is deployed as TXN REQUIRES NEW to avoid a 
+		 * 2-phase commit transaction across DB and MDB access
+		 * The EJB method is used only to start a new transaction so the direct runtime mode
+		 * for the cancleOrder will run in a 1-phase commit
+		 * 
+		 * The boolean twoPhase specifies to the server implementation whether or not the
+		 * method is to participate in a global transaction
+		 *
+		 * @param orderID the Order to complete
+		 * @return OrderDataBean providing the status of the completed order
+		 */
+		//public void cancelOrderOnePhaseDirect(Integer orderID) throws Exception;
+		
+	   /**
+		 * Publish to the QuoteChange Message topic when a stock
+		 * price and volume are updated
+		 * 
+		 * This method is deployed as TXN REQUIRES NEW to avoid a 
+		 * 2-phase commit transaction across the DB update and MDB access
+		 * (i.e. a failure to publish will not cause the stock update to fail
+		 *
+		 * @param quoteData - the updated Quote
+		 * @param oldPrice - the price of the Quote before the update
+		 * @param sharesTraded - the quantity of sharesTraded
+		 */
+		public void publishQuotePriceChange(QuoteDataBean quoteData, java.math.BigDecimal oldPrice, java.math.BigDecimal changeFactor,  double sharesTraded) throws Exception;
+		
+		/**
+		 * provides a simple session method with no database access to test performance of a simple
+		 * path through a stateless session 
+		 * @param investment amount
+		 * @param NetValue current value
+		 * @return return on investment as a percentage
+		 */
+		public double investmentReturn(double investment, double NetValue) throws Exception;	
+
+		/**
+		 * This method provides a ping test for a 2-phase commit operation
+		 * 
+		 * @param symbol to lookup
+		 * @return quoteData after sending JMS message
+		 */	
+		//public QuoteDataBean pingTwoPhase(String symbol) throws Exception;
+
+	}
+

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBC.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java?view=auto&rev=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java (added)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java Fri Dec  1 08:05:50 2006
@@ -0,0 +1,133 @@
+package org.apache.geronimo.samples.daytrader.session;
+
+import java.math.BigDecimal;
+import java.rmi.RemoteException;
+import java.util.Collection;
+
+import org.apache.geronimo.samples.daytrader.*;
+import org.apache.geronimo.samples.daytrader.direct.TradeDirect;
+import org.apache.geronimo.samples.daytrader.util.*;
+
+import javax.ejb.*;
+
+
+public class TradeJDBCBean implements SessionBean {
+	private SessionContext context = null;
+	private TradeDirect tradeDirect = null;
+
+	public TradeJDBCBean() {
+	}
+
+	public void ejbCreate() throws CreateException {
+		if (Log.doTrace())
+			Log.trace("TradeJDBCBean:ejbCreate");
+	}
+
+	public void ejbRemove() {
+		try {
+			if (Log.doTrace())
+				Log.trace("TradeJDBCBean:ejbRemove");
+		} catch (Exception e) {
+			Log.error(e, "Unable to close Queue or Topic connection on Session EJB remove");
+		}
+	}
+
+	public void ejbActivate() {
+	}
+
+	public void ejbPassivate() {
+	}
+
+	public void setSessionContext(SessionContext sc) {
+		this.context = sc;
+	}
+
+	public MarketSummaryDataBean getMarketSummary() throws Exception, RemoteException {
+		return (new TradeDirect(true)).getMarketSummary();
+	}
+
+
+	public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception, RemoteException {
+		return (new TradeDirect(true)).buy(userID, symbol, quantity, orderProcessingMode);
+	}
+
+	public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception, RemoteException {
+		return (new TradeDirect(true)).sell(userID, holdingID, orderProcessingMode);
+	}
+
+	public void queueOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException {
+		(new TradeDirect(true)).queueOrder(orderID, twoPhase);
+	}
+
+	public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException {
+		return (new TradeDirect(true)).completeOrder(orderID, twoPhase);
+	}
+
+	public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException {
+		(new TradeDirect(true)).cancelOrder(orderID, twoPhase);
+	}
+
+	public void orderCompleted(String userID, Integer orderID) throws Exception, RemoteException {
+		(new TradeDirect(true)).orderCompleted(userID, orderID);
+	}
+
+	public Collection getOrders(String userID) throws Exception, RemoteException {
+		return (new TradeDirect(true)).getOrders(userID);
+	}
+
+	public Collection getClosedOrders(String userID) throws Exception, RemoteException {
+		return (new TradeDirect(true)).getClosedOrders(userID);
+	}
+
+	public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception, RemoteException {
+		return (new TradeDirect(true)).createQuote(symbol, companyName, price);
+	}
+
+	public QuoteDataBean getQuote(String symbol) throws Exception, RemoteException {
+		return (new TradeDirect(true)).getQuote(symbol);
+	}
+
+	public Collection getAllQuotes() throws Exception, RemoteException {
+		return (new TradeDirect(true)).getAllQuotes();
+	}
+
+	public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) throws Exception, RemoteException {
+		return (new TradeDirect(true)).updateQuotePriceVolume(symbol, newPrice, sharesTraded);
+	}
+
+	public Collection getHoldings(String userID) throws Exception, RemoteException {
+		return (new TradeDirect(true)).getHoldings(userID);
+	}
+
+	public HoldingDataBean getHolding(Integer holdingID) throws Exception, RemoteException {
+		return (new TradeDirect(true)).getHolding(holdingID);
+	}
+
+	public AccountDataBean getAccountData(String userID) throws javax.ejb.FinderException, Exception {
+		return (new TradeDirect(true)).getAccountData(userID);
+	}
+
+	public AccountProfileDataBean getAccountProfileData(String userID) throws Exception, RemoteException {
+		return (new TradeDirect(true)).getAccountProfileData(userID);
+	}
+
+	public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception, RemoteException {
+		return (new TradeDirect(true)).updateAccountProfile(profileData);
+	}
+
+	public AccountDataBean login(String userID, String password) throws Exception, RemoteException {
+		return (new TradeDirect(true)).login(userID, password);
+	}
+
+	public void logout(String userID) throws Exception, RemoteException {
+		(new TradeDirect(true)).logout(userID);
+	}
+
+	public AccountDataBean register(String userID, String password, String fullname, String address, String email, String creditcard, BigDecimal openBalance) throws Exception, RemoteException {
+		return (new TradeDirect(true)).register(userID, password, fullname, address, email, creditcard, openBalance);
+	}
+
+	public RunStatsDataBean resetTrade(boolean deleteAll) throws Exception, RemoteException {
+		return (new TradeDirect(true)).resetTrade(deleteAll);
+	}
+}

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCBean.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java?view=auto&rev=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java (added)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java Fri Dec  1 08:05:50 2006
@@ -0,0 +1,12 @@
+package org.apache.geronimo.samples.daytrader.session;
+
+import java.rmi.RemoteException;
+import javax.ejb.CreateException;
+import javax.ejb.EJBHome;
+
+public interface TradeJDBCHome extends EJBHome {
+ 
+    TradeJDBC create() throws RemoteException, CreateException;
+
+}
+

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/daytrader/trunk/modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/session/TradeJDBCHome.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/daytrader/trunk/modules/ejb/src/main/resources/META-INF/ejb-jar.xml
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/ejb/src/main/resources/META-INF/ejb-jar.xml?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/ejb/src/main/resources/META-INF/ejb-jar.xml (original)
+++ geronimo/daytrader/trunk/modules/ejb/src/main/resources/META-INF/ejb-jar.xml Fri Dec  1 08:05:50 2006
@@ -165,6 +165,20 @@
                 <use-caller-identity/>
             </security-identity>
         </session>
+        <session>
+            <description>Trade JDBC Session EJB manages all Trading services</description>
+            <display-name>TradeJDBC</display-name>
+            <ejb-name>TradeJDBC</ejb-name>
+            <home>org.apache.geronimo.samples.daytrader.session.TradeJDBCHome</home>
+            <remote>org.apache.geronimo.samples.daytrader.session.TradeJDBC</remote>
+            <ejb-class>org.apache.geronimo.samples.daytrader.session.TradeJDBCBean</ejb-class>
+            <session-type>Stateless</session-type>
+            <transaction-type>Container</transaction-type>
+            <security-identity>
+                <description/>
+                <use-caller-identity/>
+            </security-identity>
+        </session>
         <entity>
             <display-name>HoldingEJB</display-name>
             <ejb-name>HoldingEJB</ejb-name>
@@ -871,6 +885,10 @@
                 <ejb-name>TradeEJB</ejb-name>
                 <method-name>*</method-name>
             </method>
+            <method>
+                <ejb-name>TradeJDBC</ejb-name>
+                <method-name>*</method-name>
+            </method>
         </method-permission>
         <container-transaction>
             <method>
@@ -943,6 +961,41 @@
                     <method-param>java.lang.Integer</method-param>
                 </method-params>
             </method>
+            <method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>cancelOrderOnePhase</method-name>
+        		<method-params>
+        			<method-param>java.lang.Integer</method-param>
+        		</method-params>
+        	</method>
+        	<method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>completeOrderOnePhaseDirect</method-name>
+        		<method-params>
+        			<method-param>java.lang.Integer</method-param>
+        		</method-params>
+        	</method>
+        	<method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>publishQuotePriceChange</method-name>
+        		<method-params>
+        			<method-param>com.ibm.websphere.samples.trade.QuoteDataBean</method-param>
+        			<method-param>java.math.BigDecimal</method-param>
+        			<method-param>java.math.BigDecimal</method-param>
+        			<method-param>double</method-param>
+        		</method-params>
+        	</method>
+        	<method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>queueOrderOnePhase</method-name>
+        		<method-params>
+        			<method-param>java.lang.Integer</method-param>
+        		</method-params>
+        	</method>
             <trans-attribute>RequiresNew</trans-attribute>
         </container-transaction>
         <container-transaction>
@@ -994,6 +1047,30 @@
                     <method-param>boolean</method-param>
                 </method-params>
             </method>
+            <method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>cancelOrderOnePhaseDirect</method-name>
+        		<method-params>
+        			<method-param>java.lang.Integer</method-param>
+        		</method-params>
+        	</method>
+        	<method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>completeOrderOnePhaseDirect</method-name>
+        		<method-params>
+        			<method-param>java.lang.Integer</method-param>
+        		</method-params>
+        	</method>
+        	<method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-intf>Remote</method-intf>
+        		<method-name>resetTrade</method-name>
+        		<method-params>
+        			<method-param>boolean</method-param>
+        		</method-params>
+        	</method>
             <trans-attribute>NotSupported</trans-attribute>
         </container-transaction>
         <container-transaction>
@@ -1041,6 +1118,10 @@
                 <ejb-name>TradeStreamerMDB</ejb-name>
                 <method-name>*</method-name>
             </method>
+            <method>
+        		<ejb-name>TradeJDBC</ejb-name>
+        		<method-name>*</method-name>
+        	</method>
             <trans-attribute>Required</trans-attribute>
         </container-transaction>
         <message-destination>

Added: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java?view=auto&rev=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java (added)
+++ geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java Fri Dec  1 08:05:50 2006
@@ -0,0 +1,177 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable 
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.samples.daytrader.web.prims;
+
+import java.io.*;
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.naming.*;
+import javax.rmi.PortableRemoteObject;
+
+import org.apache.geronimo.samples.daytrader.ejb.*;
+import org.apache.geronimo.samples.daytrader.session.TradeJDBC;
+import org.apache.geronimo.samples.daytrader.session.TradeJDBCHome;
+import org.apache.geronimo.samples.daytrader.util.*;
+
+import org.apache.geronimo.samples.daytrader.*;
+
+// TODO: fix comments
+/**
+ *
+ * PingServlet2Session2JDBC tests key functionality of a servlet call to a 
+ * stateless SessionEJB, and then to a Entity EJB representing data in a database.
+ * This servlet makes use of the Stateless Session EJB {@link Trade}, and then
+ * uses {@link TradeConfig} to generate a random stock symbol.  The stocks
+ * price is looked up using the Quote Entity EJB.  
+ *
+ */
+public class PingServlet2Session2JDBC extends HttpServlet
+{
+
+	private static String initTime;
+	private static int hitCount;
+	private static TradeJDBCHome tradeJDBCHome;
+
+	/**
+	 * forwards post requests to the doGet method
+	 * Creation date: (11/6/2000 10:52:39 AM)
+	 * @param res javax.servlet.http.HttpServletRequest
+	 * @param res2 javax.servlet.http.HttpServletResponse
+	 */
+	public void doPost(HttpServletRequest req, HttpServletResponse res)
+		throws ServletException, IOException
+	{
+		doGet(req, res);
+	}
+
+	/**
+	* this is the main method of the servlet that will service all get requests.
+	* @param request HttpServletRequest
+	* @param responce HttpServletResponce
+	**/
+	public void doGet(HttpServletRequest req, HttpServletResponse res)
+		throws IOException, ServletException
+	{
+
+		res.setContentType("text/html");
+		java.io.PrintWriter out = res.getWriter();
+		String symbol = null;
+		QuoteDataBean quoteData = null;
+		TradeJDBC trade = null;
+		StringBuffer output = new StringBuffer(100);
+
+		output.append(
+			"<html><head><title>PingServlet2Session2JDBC</title></head>"
+				+ "<body><HR><FONT size=\"+2\" color=\"#000066\">PingServlet2Session2JDBC<BR></FONT>"
+				+ "<FONT size=\"-1\" color=\"#000066\">"
+				+ "PingServlet2Session2JDBC tests the common path of a Servlet calling a Session EJB "
+				+ "which in turn calls JDBC.<BR>");
+
+		try
+			{
+
+			//only want to do this once.
+			if (tradeJDBCHome == null)
+				{
+				//only want one thread to create the EjbHome
+				synchronized (lock)
+				{
+
+					if (tradeJDBCHome == null)
+						{
+
+						//out.println("doing JNDI lookup and creating new reference to trade.TradeHome");
+						output.append("<HR><B>Performing JNDI lookup to create new tradeHome</B>");
+
+						try
+							{
+							//I am going to use the System env. that is set through TradeConfig
+							InitialContext ic = new InitialContext();
+
+							tradeJDBCHome =
+								(TradeJDBCHome) PortableRemoteObject.narrow(
+									ic.lookup("java:comp/env/ejb/TradeJDBC"),
+									TradeJDBCHome.class);
+						}
+						catch (Exception ne)
+							
+						{
+							Log.error(ne, "PingServlet2Session2JDBC.goGet(...): exception caught looking up and narrowing 'TradeJDBCHome'");
+							throw ne;
+						}
+					}
+				}
+			}
+
+			try
+				{
+				int iter = TradeConfig.getPrimIterations();
+				for (int ii = 0; ii < iter; ii++) {
+					//I have the TradeBean Home, now I want to get an instance every time
+					symbol = TradeConfig.rndSymbol();
+					trade = tradeJDBCHome.create();
+					//getQuote will call findQuote which will instaniate the Quote Entity Bean
+					//and then will return a QuoteObject
+					quoteData = trade.getQuote(symbol);
+					trade.remove();
+				}
+			}
+			catch (Exception ne)
+				{
+				Log.error(ne, "PingServlet2Session2JDBC.goGet(...): exception getting QuoteData through Trade");
+				throw ne;
+			}
+
+			output.append("<HR>initTime: " + initTime).append(
+				"<BR>Hit Count: " + hitCount++);
+			output.append("<HR>Quote Information<BR><BR>" + quoteData.toHTML());
+			out.println(output.toString());
+
+		}
+		catch (Exception e)
+			{
+			Log.error(e, "PingServlet2Session2JDBC.doGet(...): General Exception caught");
+			res.sendError(500, "General Exception caught, " + e.toString());
+		}
+	}
+
+	/** 
+	 * returns a string of information about the servlet
+	 * @return info String: contains info about the servlet
+	 **/
+
+	public String getServletInfo()
+	{
+		return "web primitive, tests Servlet to Session to Entity EJB path";
+
+	}
+	/**
+	* called when the class is loaded to initialize the servlet
+	* @param config ServletConfig:
+	**/
+	public void init(ServletConfig config) throws ServletException
+	{
+		super.init(config);
+		hitCount = 0;
+		tradeJDBCHome = null;
+		initTime = new java.util.Date().toString();
+		//this is for synchronization
+		lock = new Integer(99);
+	}
+	private java.lang.Integer lock;
+}

Propchange: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBC.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java?view=auto&rev=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java (added)
+++ geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java Fri Dec  1 08:05:50 2006
@@ -0,0 +1,184 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable 
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.samples.daytrader.web.prims;
+
+import java.io.*;
+import javax.servlet.*;
+import javax.servlet.http.*;
+import java.util.Collection;
+import java.util.Iterator;
+import javax.naming.*;
+import javax.rmi.PortableRemoteObject;
+
+import org.apache.geronimo.samples.daytrader.ejb.*;
+import org.apache.geronimo.samples.daytrader.session.TradeJDBC;
+import org.apache.geronimo.samples.daytrader.session.TradeJDBCHome;
+import org.apache.geronimo.samples.daytrader.util.*;
+
+import org.apache.geronimo.samples.daytrader.*;
+
+// TODO: Fix comments
+/**
+ *
+ * PingServlet2Session2Entity tests key functionality of a servlet call to a 
+ * stateless SessionEJB, and then to a Entity EJB representing data in a database.
+ * This servlet makes use of the Stateless Session EJB {@link Trade}, and then
+ * uses {@link TradeConfig} to generate a random user.  The users
+ * portfolio is looked up using the Holding Entity EJB returnin a collection of Holdings
+ *
+ */
+public class PingServlet2Session2JDBCCollection extends HttpServlet
+{
+
+	private static String initTime;
+	private static int hitCount;
+	private static TradeJDBCHome tradeJDBCHome;
+
+	/**
+	 * forwards post requests to the doGet method
+	 * Creation date: (11/6/2000 10:52:39 AM)
+	 * @param res javax.servlet.http.HttpServletRequest
+	 * @param res2 javax.servlet.http.HttpServletResponse
+	 */
+	public void doPost(HttpServletRequest req, HttpServletResponse res)
+		throws ServletException, IOException
+	{
+		doGet(req, res);
+	}
+
+	/**
+	* this is the main method of the servlet that will service all get requests.
+	* @param request HttpServletRequest
+	* @param responce HttpServletResponce
+	**/
+	public void doGet(HttpServletRequest req, HttpServletResponse res)
+		throws IOException, ServletException
+	{
+
+		res.setContentType("text/html");
+		java.io.PrintWriter out = res.getWriter();
+		String userID = null;
+		Collection holdingDataBeans = null;
+		TradeJDBC trade = null;
+		StringBuffer output = new StringBuffer(100);
+
+		output.append(
+			"<html><head><title>PingServlet2Session2JDBCCollection</title></head>"
+				+ "<body><HR><FONT size=\"+2\" color=\"#000066\">PingServlet2Session2JDBCCollection<BR></FONT>"
+				+ "<FONT size=\"-1\" color=\"#000066\">"
+				+ "PingServlet2Session2JDBCCollection tests the common path of a Servlet calling a Session EJB "
+				+ "which perform a multi-row JDBC query.<BR>");
+
+		try
+			{
+
+			//only want to do this once.
+			if (tradeJDBCHome == null)
+				{
+				//only want one thread to create the EjbHome
+				synchronized (lock)
+				{
+
+					if (tradeJDBCHome == null)
+						{
+
+						//out.println("doing JNDI lookup and creating new reference to trade.TradeHome");
+						output.append("<HR><B>Performing JNDI lookup to create new tradeHome</B>");
+
+						try
+							{
+							//I am going to use the System env. that is set through TradeConfig
+							InitialContext ic = new InitialContext();
+
+							tradeJDBCHome =
+								(TradeJDBCHome) PortableRemoteObject.narrow(
+									ic.lookup("java:comp/env/ejb/TradeJDBC"),
+									TradeJDBCHome.class);
+						}
+						catch (Exception ne)
+							
+						{
+							Log.error(ne, "PingServlet2Session2JDBCCollection.goGet(...): exception caught looking up and narrowing 'TradeHome'");
+							throw ne;
+						}
+					}
+				}
+			}
+
+			try
+				{
+				int iter = TradeConfig.getPrimIterations();
+				for (int ii = 0; ii < iter; ii++) {
+					//I have the TradeBean Home, now I want to get an instance every time
+					userID = TradeConfig.rndUserID();
+					trade = tradeJDBCHome.create();
+					//getQuote will call findQuote which will instaniate the Quote Entity Bean
+					//and then will return a QuoteObject
+					holdingDataBeans = trade.getHoldings(userID);
+					trade.remove();
+				}
+			}
+			catch (Exception ne)
+				{
+				Log.error(ne, "PingServlet2Session2JDBCCollection.goGet(...): exception getting HoldingData collection through Trade for user "+ userID);
+				throw ne;
+			}
+
+			output.append("<HR>initTime: " + initTime).append(
+				"<BR>Hit Count: " + hitCount++);
+			output.append("<HR>User: " + userID + " is currently holding " + holdingDataBeans.size() + " stock holdings:");
+			Iterator it = holdingDataBeans.iterator();
+			while ( it.hasNext() )
+			{
+				HoldingDataBean holdingData = (HoldingDataBean) it.next();
+				output.append("<BR>" + holdingData.toHTML());
+			}
+			out.println(output.toString());
+
+		}
+		catch (Exception e)
+			{
+			Log.error(e, "PingServlet2Session2JDBCCollection.doGet(...): General Exception caught");
+			res.sendError(500, "General Exception caught, " + e.toString());
+		}
+	}
+
+	/** 
+	 * returns a string of information about the servlet
+	 * @return info String: contains info about the servlet
+	 **/
+
+	public String getServletInfo()
+	{
+		return "web primitive, tests Servlet to Session to Entity returning a collection of Entity EJBs";
+	}
+	/**
+	* called when the class is loaded to initialize the servlet
+	* @param config ServletConfig:
+	**/
+	public void init(ServletConfig config) throws ServletException
+	{
+		super.init(config);
+		hitCount = 0;
+		tradeJDBCHome = null;
+		initTime = new java.util.Date().toString();
+		//this is for synchronization
+		lock = new Integer(99);
+	}
+	private java.lang.Integer lock;
+}

Propchange: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/prims/PingServlet2Session2JDBCCollection.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml (original)
+++ geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml Fri Dec  1 08:05:50 2006
@@ -199,6 +199,16 @@
          <servlet-class>org.apache.geronimo.samples.daytrader.web.prims.PingServlet2Session2EntityCollection</servlet-class>
       </servlet>
       <servlet>
+         <display-name>PingServlet2Session2JDBC</display-name>
+         <servlet-name>PingServlet2Session2JDBC</servlet-name>
+         <servlet-class>org.apache.geronimo.samples.daytrader.web.prims.PingServlet2Session2JDBC</servlet-class>
+      </servlet>
+      <servlet>
+         <display-name>PingServlet2Session2JDBCCollection</display-name>
+         <servlet-name>PingServlet2Session2JDBCCollection</servlet-name>
+         <servlet-class>org.apache.geronimo.samples.daytrader.web.prims.PingServlet2Session2JDBCCollection</servlet-class>
+      </servlet>
+      <servlet>
          <display-name>PingServlet2Session2CMROne2One</display-name>
          <servlet-name>PingServlet2Session2CMROne2One</servlet-name>
          <servlet-class>org.apache.geronimo.samples.daytrader.web.prims.PingServlet2Session2CMROne2One</servlet-class>
@@ -331,6 +341,14 @@
          <url-pattern>/servlet/PingServlet2Session2EntityCollection</url-pattern>
       </servlet-mapping>
       <servlet-mapping>
+         <servlet-name>PingServlet2Session2JDBC</servlet-name>
+         <url-pattern>/servlet/PingServlet2Session2JDBC</url-pattern>
+      </servlet-mapping>
+      <servlet-mapping>
+         <servlet-name>PingServlet2Session2JDBCCollection</servlet-name>
+         <url-pattern>/servlet/PingServlet2Session2JDBCCollection</url-pattern>
+      </servlet-mapping>
+      <servlet-mapping>
          <servlet-name>PingServlet2Session2CMROne2One</servlet-name>
          <url-pattern>/servlet/PingServlet2Session2CMROne2One</url-pattern>
       </servlet-mapping>
@@ -403,6 +421,13 @@
          <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
          <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
          <ejb-link>TradeJPA</ejb-link>
+      </ejb-ref>
+      <ejb-ref>
+         <ejb-ref-name>ejb/TradeJDBC</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>org.apache.geronimo.samples.daytrader.session.TradeJDBCHome</home>
+         <remote>org.apache.geronimo.samples.daytrader.session.TradeJDBC</remote>
+         <ejb-link>TradeJDBC</ejb-link>
       </ejb-ref>
       <ejb-ref>
          <ejb-ref-name>ejb/Quote</ejb-ref-name>

Modified: geronimo/daytrader/trunk/modules/web/src/main/webapp/web_prmtv.html
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/modules/web/src/main/webapp/web_prmtv.html?view=diff&rev=481268&r1=481267&r2=481268
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/webapp/web_prmtv.html (original)
+++ geronimo/daytrader/trunk/modules/web/src/main/webapp/web_prmtv.html Fri Dec  1 08:05:50 2006
@@ -215,6 +215,20 @@
 			Entity EJB's data through an EJB 2.0 CMR One to Many relationship </FONT></TD>
 		</TR>
 		<TR>
+			<TD align="center"><A href="servlet/PingServlet2Session2JDBC"><FONT
+				size="-1">PingServlet2Session2JDBC</FONT></A><FONT COLOR="#FF0000">*</FONT></TD>
+			<TD><FONT size="-1">This tests the full servlet to Session EJB to
+			JDBC path to retrieve a single row from the database.</FONT></TD>
+		</TR>
+		<TR>
+			<TD align="center"><A
+				href="servlet/PingServlet2Session2JDBCCollection"><FONT size="-1">PingServlet2Session2<BR>
+			JDBCCollection</FONT></A><FONT COLOR="#FF0000">*</FONT></TD>
+			<TD><FONT size="-1">This test extends the previous JDBC test by
+			calling a Session EJB to JDBC path which returns multiple rows
+			from the database.</FONT></TD>
+		</TR>
+		<TR>
 			<TD align="center"><A href="servlet/PingServlet2MDBQueue"><FONT
 				size="-1">PingServlet2MDBQueue</FONT></A><FONT COLOR="#FF0000">*</FONT></TD>
 			<TD><FONT size="-1">PingServlet2MDBQueue drives messages to a Queue