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/04/21 16:36:27 UTC
svn commit: r395900 [2/5] - in /geronimo/daytrader/trunk: ./ modules/derby/
modules/ear/ modules/ejb/
modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/
modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/direct/
modules/ejb/s...
Modified: geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/TradeServletAction.java
URL: http://svn.apache.org/viewcvs/geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/TradeServletAction.java?rev=395900&r1=395899&r2=395900&view=diff
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/TradeServletAction.java (original)
+++ geronimo/daytrader/trunk/modules/web/src/main/java/org/apache/geronimo/samples/daytrader/web/TradeServletAction.java Fri Apr 21 07:36:22 2006
@@ -31,706 +31,707 @@
import org.apache.geronimo.samples.daytrader.*;
/**
- * TradeServletAction provides servlet specific client side access to each of the Trade
- * brokerage user operations. These include login, logout, buy, sell, getQuote, etc.
- * TradeServletAction manages a web interface to Trade handling HttpRequests/HttpResponse objects
- * and forwarding results to the appropriate JSP page for the web interface.
- * TradeServletAction invokes {@link TradeAction} methods to actually perform
- * each trading operation.
- *
+ * TradeServletAction provides servlet specific client side access to each of
+ * the Trade brokerage user operations. These include login, logout, buy, sell,
+ * getQuote, etc. TradeServletAction manages a web interface to Trade handling
+ * HttpRequests/HttpResponse objects and forwarding results to the appropriate
+ * JSP page for the web interface. TradeServletAction invokes
+ * {@link TradeAction} methods to actually perform each trading operation.
+ *
*/
public class TradeServletAction {
- private TradeServices tAction = null;
+ private TradeServices tAction = null;
- TradeServletAction()
- {
- if(TradeConfig.getAccessMode() == TradeConfig.STANDARD)
- tAction = new TradeAction();
- else if(TradeConfig.getAccessMode() == TradeConfig.WEBSERVICES)
- tAction = new TradeWebSoapProxy();
- }
-
- /**
- * Display User Profile information such as address, email, etc. for the given Trader
- * Dispatch to the Trade Account JSP for display
- *
- * @param userID The User to display profile info
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @param results A short description of the results/success of this web request provided on the web page
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doAccount(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String results)
- throws javax.servlet.ServletException, java.io.IOException {
- try
- {
-
- AccountDataBean accountData = tAction.getAccountData(userID);
- AccountProfileDataBean accountProfileData = tAction.getAccountProfileData(userID);
- Collection orderDataBeans = tAction.getOrders(userID);
-
- req.setAttribute("accountData", accountData);
- req.setAttribute("accountProfileData", accountProfileData);
- req.setAttribute("orderDataBeans", orderDataBeans);
- req.setAttribute("results", results);
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.ACCOUNT_PAGE));
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute("results", results + "could not find account for userID = " + userID);
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE));
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- "TradeServletAction.doAccount(...)",
- "illegal argument, information should be in exception string",
- e);
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.doAccount(...)"
- + " exception user ="
- + userID,
- e);
- }
-
- }
- /**
- * Update User Profile information such as address, email, etc. for the given Trader
- * Dispatch to the Trade Account JSP for display
- * If any in put is incorrect revert back to the account page w/ an appropriate message
- *
- * @param userID The User to upddate profile info
- * @param password The new User password
- * @param cpassword Confirm password
- * @param fullname The new User fullname info
- * @param address The new User address info
- * @param cc The new User credit card info
- * @param email The new User email info
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doAccountUpdate(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String password,
- String cpassword,
- String fullName,
- String address,
- String creditcard,
- String email)
- throws javax.servlet.ServletException, java.io.IOException {
- String results = "";
-
- //First verify input data
- boolean doUpdate = true;
- if ( password.equals(cpassword) == false )
- {
- results = "Update profile error: passwords do not match";
- doUpdate = false;
- }
- else if ( password.length() <= 0 ||
- fullName.length() <= 0 ||
- address.length() <= 0 ||
- creditcard.length() <= 0 ||
- email.length() <= 0
- )
- {
- results = "Update profile error: please fill in all profile information fields";
- doUpdate = false;
- }
- AccountProfileDataBean accountProfileData = new AccountProfileDataBean(userID, password, fullName, address, email, creditcard);
- try
- {
- if (doUpdate)
- {
- accountProfileData = tAction.updateAccountProfile(accountProfileData);
- results = "Account profile update successful";
- }
-
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute("results", results + "invalid argument, check userID is correct, and the database is populated" + userID);
- Log.error(
- e,
- "TradeServletAction.doAccount(...)",
- "illegal argument, information should be in exception string",
- "treating this as a user error and forwarding on to a new page");
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.doAccountUpdate(...)"
- + " exception user ="
- + userID,
- e);
- }
- doAccount(ctx, req, resp, userID, results);
- }
-
-/**
- * Buy a new holding of shares for the given trader
- * Dispatch to the Trade Portfolio JSP for display
- *
- * @param userID The User buying shares
- * @param symbol The stock to purchase
- * @param amount The quantity of shares to purchase
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
-void doBuy(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String symbol,
- String quantity)
- throws ServletException, IOException {
-
- String results = "";
-
- try
- {
- OrderDataBean orderData = tAction.buy(userID, symbol, new Double(quantity).doubleValue(), TradeConfig.orderProcessingMode);
-
- req.setAttribute("orderData", orderData);
- req.setAttribute("results", results);
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute("results", results + "illegal argument:");
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE));
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- e,
- "TradeServletAction.doBuy(...)",
- "illegal argument. userID = " + userID,
- "symbol = " + symbol);
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.buy(...)"
- + " exception buying stock "
- + symbol
- + " for user "
- + userID,
- e);
- }
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.ORDER_PAGE));
-}
- /**
- * Create the Trade Home page with personalized information such as the traders account balance
- * Dispatch to the Trade Home JSP for display
- *
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @param results A short description of the results/success of this web request provided on the web page
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doHome(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String results)
- throws javax.servlet.ServletException, java.io.IOException {
- BigDecimal balance;
- String result = "";
- try
- {
- AccountDataBean accountData = tAction.getAccountData(userID);
- Collection holdingDataBeans = tAction.getHoldings(userID);
-
- //Edge Caching:
- //Getting the MarketSummary has been moved to the JSP
- //MarketSummary.jsp. This makes the MarketSummary a
- //standalone "fragment", and thus is a candidate for
- //Edge caching.
- //marketSummaryData = tAction.getMarketSummary();
-
- req.setAttribute("accountData", accountData);
- req.setAttribute("holdingDataBeans", holdingDataBeans);
- //See Edge Caching above
- //req.setAttribute("marketSummaryData", marketSummaryData);
- req.setAttribute("results", results);
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute("results", results + "check userID = "+ userID + " and that the database is populated");
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE));
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- "TradeServletAction.doHome(...)" +
- "illegal argument, information should be in exception string" +
- "treating this as a user error and forwarding on to a new page",
- e);
- }
- catch (javax.ejb.FinderException e)
- {
- //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute(
- "results",
- results + "\nCould not find account for + " + userID);
- //requestDispatch(ctx, req, resp, TradeConfig.getPage(TradeConfig.HOME_PAGE));
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- "TradeServletAction.doHome(...)" +
- "Error finding account for user " + userID +
- "treating this as a user error and forwarding on to a new page", e);
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.doHome(...)"
- + " exception user ="
- + userID,
- e);
- }
-
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE));
- }
-/**
- * Login a Trade User.
- * Dispatch to the Trade Home JSP for display
- *
- * @param userID The User to login
- * @param passwd The password supplied by the trader used to authenticate
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @param results A short description of the results/success of this web request provided on the web page
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
-void doLogin(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String passwd)
-throws javax.servlet.ServletException, java.io.IOException
-{
-
- String results = "";
- try
- {
- //Got a valid userID and passwd, attempt login
-
- AccountDataBean accountData = tAction.login(userID, passwd);
-
- if (accountData != null)
- {
- HttpSession session = req.getSession(true);
- session.setAttribute("uidBean", userID);
- session.setAttribute("sessionCreationDate", new java.util.Date());
- results = "Ready to Trade";
- doHome(ctx, req, resp, userID, results);
- return;
- }
- else
- {
- req.setAttribute(
- "results",
- results + "\nCould not find account for + " + userID);
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.log(
- "TradeServletAction.doLogin(...)",
- "Error finding account for user " + userID + "",
- "user entered a bad username or the database is not populated");
- }
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute("results", results + "illegal argument:" + e.getMessage());
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- e,
- "TradeServletAction.doLogin(...)",
- "illegal argument, information should be in exception string",
- "treating this as a user error and forwarding on to a new page");
-
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException(
- "TradeServletAction.doLogin(...)"
- + "Exception logging in user "
- + userID
- + "with password"
- + passwd
- ,e);
- }
-
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.WELCOME_PAGE));
-
-}
- /**
- * Logout a Trade User
- * Dispatch to the Trade Welcome JSP for display
- *
- * @param userID The User to logout
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @param results A short description of the results/success of this web request provided on the web page
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doLogout(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID)
- throws ServletException, IOException {
- String results = "";
-
- try
- {
- tAction.logout(userID);
-
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page, at the end of the page.
- req.setAttribute("results", results + "illegal argument:" + e.getMessage());
-
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- e,
- "TradeServletAction.doLogout(...)",
- "illegal argument, information should be in exception string",
- "treating this as a user error and forwarding on to a new page");
- }
- catch (Exception e)
- {
- //log the exception and foward to a error page
- Log.error(
- e,
- "TradeServletAction.doLogout(...):",
- "Error logging out" + userID,
- "fowarding to an error page");
- //set the status_code to 500
- throw new ServletException(
- "TradeServletAction.doLogout(...)"
- + "exception logging out user "
- + userID,
- e);
- }
- HttpSession session = req.getSession();
- if (session != null)
- {
- session.invalidate();
- }
-
- Object o = req.getAttribute("TSS-RecreateSessionInLogout");
- if (o != null && ((Boolean)o).equals(Boolean.TRUE)){
- // Recreate Session object before writing output to the response
- // Once the response headers are written back to the client the opportunity
- // to create a new session in this request may be lost
- // This is to handle only the TradeScenarioServlet case
- session = req.getSession(true);
- }
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.WELCOME_PAGE));
- }
- /**
- * Retrieve the current portfolio of stock holdings for the given trader
- * Dispatch to the Trade Portfolio JSP for display
- *
- * @param userID The User requesting to view their portfolio
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @param results A short description of the results/success of this web request provided on the web page
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doPortfolio(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String results)
- throws ServletException, IOException {
-
- try
- {
- //Get the holdiings for this user
-
- Collection quoteDataBeans = new ArrayList();
- Collection holdingDataBeans = tAction.getHoldings(userID);
-
-
- //Walk through the collection of user
- // holdings and creating a list of quotes
- if (holdingDataBeans.size() > 0 )
- {
-
- Iterator it = holdingDataBeans.iterator();
- while ( it.hasNext() )
- {
- HoldingDataBean holdingData = (HoldingDataBean) it.next();
- QuoteDataBean quoteData = tAction.getQuote(holdingData.getQuoteID());
- quoteDataBeans.add(quoteData);
- }
- }
- else
- {
- results = results + ". Your portfolio is empty.";
- }
- req.setAttribute("results", results);
- req.setAttribute("holdingDataBeans", holdingDataBeans);
- req.setAttribute("quoteDataBeans", quoteDataBeans);
- requestDispatch(
- ctx,
- req,
- resp,
- userID,
- TradeConfig.getPage(TradeConfig.PORTFOLIO_PAGE));
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //forward them to another page rather than throw a 500
- req.setAttribute("results", results + "illegal argument:" + e.getMessage());
- requestDispatch(
- ctx,
- req,
- resp,
- userID,
- TradeConfig.getPage(TradeConfig.PORTFOLIO_PAGE));
- //log the exception with an error level of 3 which means, handled exception but would invalidate a automation run
- Log.error(
- e,
- "TradeServletAction.doPortfolio(...)",
- "illegal argument, information should be in exception string",
- "user error");
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.doPortfolio(...)"
- + " exception user ="
- + userID,
- e);
- }
- }
-
- /**
- * Retrieve the current Quote for the given stock symbol
- * Dispatch to the Trade Quote JSP for display
- *
- * @param userID The stock symbol used to get the current quote
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doQuotes(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String symbols)
- throws ServletException, IOException {
- String results = "";
-
- //Edge Caching:
- //Getting Quotes has been moved to the JSP
- //Quote.jsp. This makes each Quote a
- //standalone "fragment", and thus is a candidate for
- //Edge caching.
- //
-
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.QUOTE_PAGE));
- }
- /**
- * Register a new trader given the provided user Profile information such as address, email, etc.
- * Dispatch to the Trade Home JSP for display
- *
- * @param userID The User to create
- * @param passwd The User password
- * @param fullname The new User fullname info
- * @param ccn The new User credit card info
- * @param money The new User opening account balance
- * @param address The new User address info
- * @param email The new User email info
- * @return The userID of the new trader
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doRegister(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String passwd,
- String cpasswd,
- String fullname,
- String ccn,
- String openBalanceString,
- String email,
- String address)
- throws ServletException, IOException {
- String results = "";
-
-
- try
- {
- // Validate user passwords match and are atleast 1 char in length
- if ((passwd.equals(cpasswd)) && (passwd.length() >= 1))
- {
-
- AccountDataBean accountData = tAction.register(userID, passwd, fullname, address, email, ccn, new BigDecimal(openBalanceString));
- if (accountData == null)
- {
- results = "Registration operation failed;";
- System.out.println(results);
- req.setAttribute("results", results);
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.REGISTER_PAGE));
- }
- else
- {
- doLogin(ctx, req, resp, userID, passwd);
- results =
- "Registration operation succeeded; Account " + accountData.getAccountID() + " has been created.";
- req.setAttribute("results", results);
-
- }
- }
- else
- {
- //Password validation failed
- results = "Registration operation failed, your passwords did not match";
- System.out.println(results);
- req.setAttribute("results", results);
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.REGISTER_PAGE));
- }
-
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.doRegister(...)"
- + " exception user ="
- + userID,
- e);
- }
- }
- /**
- * Sell a current holding of stock shares for the given trader.
- * Dispatch to the Trade Portfolio JSP for display
- *
- * @param userID The User buying shares
- * @param symbol The stock to sell
- * @param indx The unique index identifying the users holding to sell
- * @param ctx the servlet context
- * @param req the HttpRequest object
- * @param resp the HttpResponse object
- * @exception javax.servlet.ServletException If a servlet specific exception is encountered
- * @exception javax.io.IOException If an exception occurs while writing results back to the user
- *
- */
- void doSell(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- Integer holdingID)
- throws ServletException, IOException {
- String results = "";
- try
- {
- OrderDataBean orderData = tAction.sell(userID, holdingID, TradeConfig.orderProcessingMode);
-
- req.setAttribute("orderData", orderData);
- req.setAttribute("results", results);
- }
- catch (java.lang.IllegalArgumentException e)
- { //this is a user error so I will
- //just log the exception and then later on I will redisplay the portfolio page
- //because this is just a user exception
- Log.error(
- e,
- "TradeServletAction.doSell(...)",
- "illegal argument, information should be in exception string",
- "user error");
- }
- catch (Exception e)
- {
- //log the exception with error page
- throw new ServletException("TradeServletAction.doSell(...)"
- + " exception selling holding "
- + holdingID
- + " for user ="
- + userID,
- e);
- }
- requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.ORDER_PAGE));
- }
-
- void doWelcome(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String status)
- throws ServletException, IOException {
-
- req.setAttribute("results", status);
- requestDispatch(ctx, req, resp, null, TradeConfig.getPage(TradeConfig.WELCOME_PAGE));
- }
-
-
- private void requestDispatch(
- ServletContext ctx,
- HttpServletRequest req,
- HttpServletResponse resp,
- String userID,
- String page)
- throws ServletException, IOException {
-
- ctx.getRequestDispatcher(page).include(req, resp);
- }
- private void sendRedirect(HttpServletResponse resp, String page)
- throws ServletException, IOException {
- resp.sendRedirect(resp.encodeRedirectURL(page));
- }
+ TradeServletAction() {
+ if (TradeConfig.getAccessMode() == TradeConfig.STANDARD)
+ tAction = new TradeAction();
+ else if (TradeConfig.getAccessMode() == TradeConfig.WEBSERVICES)
+ tAction = new TradeWebSoapProxy();
+ }
+
+ /**
+ * Display User Profile information such as address, email, etc. for the
+ * given Trader Dispatch to the Trade Account JSP for display
+ *
+ * @param userID
+ * The User to display profile info
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @param results
+ * A short description of the results/success of this web request
+ * provided on the web page
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doAccount(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String results)
+ throws javax.servlet.ServletException, java.io.IOException {
+ try {
+
+ AccountDataBean accountData = tAction.getAccountData(userID);
+ AccountProfileDataBean accountProfileData = tAction
+ .getAccountProfileData(userID);
+ Collection orderDataBeans = tAction.getOrders(userID);
+
+ req.setAttribute("accountData", accountData);
+ req.setAttribute("accountProfileData", accountProfileData);
+ req.setAttribute("orderDataBeans", orderDataBeans);
+ req.setAttribute("results", results);
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.ACCOUNT_PAGE));
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page rather than throw a 500
+ req.setAttribute("results", results
+ + "could not find account for userID = " + userID);
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.HOME_PAGE));
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log
+ .error(
+ "TradeServletAction.doAccount(...)",
+ "illegal argument, information should be in exception string",
+ e);
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.doAccount(...)"
+ + " exception user =" + userID, e);
+ }
+
+ }
+
+ /**
+ * Update User Profile information such as address, email, etc. for the
+ * given Trader Dispatch to the Trade Account JSP for display If any in put
+ * is incorrect revert back to the account page w/ an appropriate message
+ *
+ * @param userID
+ * The User to upddate profile info
+ * @param password
+ * The new User password
+ * @param cpassword
+ * Confirm password
+ * @param fullname
+ * The new User fullname info
+ * @param address
+ * The new User address info
+ * @param cc
+ * The new User credit card info
+ * @param email
+ * The new User email info
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doAccountUpdate(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String password,
+ String cpassword, String fullName, String address,
+ String creditcard, String email)
+ throws javax.servlet.ServletException, java.io.IOException {
+ String results = "";
+
+ // First verify input data
+ boolean doUpdate = true;
+ if (password.equals(cpassword) == false) {
+ results = "Update profile error: passwords do not match";
+ doUpdate = false;
+ } else if (password.length() <= 0 || fullName.length() <= 0
+ || address.length() <= 0 || creditcard.length() <= 0
+ || email.length() <= 0) {
+ results = "Update profile error: please fill in all profile information fields";
+ doUpdate = false;
+ }
+ AccountProfileDataBean accountProfileData = new AccountProfileDataBean(
+ userID, password, fullName, address, email, creditcard);
+ try {
+ if (doUpdate) {
+ accountProfileData = tAction
+ .updateAccountProfile(accountProfileData);
+ results = "Account profile update successful";
+ }
+
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page rather than throw a 500
+ req
+ .setAttribute(
+ "results",
+ results
+ + "invalid argument, check userID is correct, and the database is populated"
+ + userID);
+ Log
+ .error(
+ e,
+ "TradeServletAction.doAccount(...)",
+ "illegal argument, information should be in exception string",
+ "treating this as a user error and forwarding on to a new page");
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException(
+ "TradeServletAction.doAccountUpdate(...)"
+ + " exception user =" + userID, e);
+ }
+ doAccount(ctx, req, resp, userID, results);
+ }
+
+ /**
+ * Buy a new holding of shares for the given trader Dispatch to the Trade
+ * Portfolio JSP for display
+ *
+ * @param userID
+ * The User buying shares
+ * @param symbol
+ * The stock to purchase
+ * @param amount
+ * The quantity of shares to purchase
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doBuy(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String symbol,
+ String quantity) throws ServletException, IOException {
+
+ String results = "";
+
+ try {
+ OrderDataBean orderData = tAction.buy(userID, symbol, new Double(
+ quantity).doubleValue(), TradeConfig.orderProcessingMode);
+
+ req.setAttribute("orderData", orderData);
+ req.setAttribute("results", results);
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page rather than throw a 500
+ req.setAttribute("results", results + "illegal argument:");
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.HOME_PAGE));
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log.error(e, "TradeServletAction.doBuy(...)",
+ "illegal argument. userID = " + userID, "symbol = "
+ + symbol);
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.buy(...)"
+ + " exception buying stock " + symbol + " for user "
+ + userID, e);
+ }
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.ORDER_PAGE));
+ }
+
+ /**
+ * Create the Trade Home page with personalized information such as the
+ * traders account balance Dispatch to the Trade Home JSP for display
+ *
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @param results
+ * A short description of the results/success of this web request
+ * provided on the web page
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doHome(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String results)
+ throws javax.servlet.ServletException, java.io.IOException {
+ BigDecimal balance;
+ String result = "";
+ try {
+ AccountDataBean accountData = tAction.getAccountData(userID);
+ Collection holdingDataBeans = tAction.getHoldings(userID);
+
+ // Edge Caching:
+ // Getting the MarketSummary has been moved to the JSP
+ // MarketSummary.jsp. This makes the MarketSummary a
+ // standalone "fragment", and thus is a candidate for
+ // Edge caching.
+ // marketSummaryData = tAction.getMarketSummary();
+
+ req.setAttribute("accountData", accountData);
+ req.setAttribute("holdingDataBeans", holdingDataBeans);
+ // See Edge Caching above
+ // req.setAttribute("marketSummaryData", marketSummaryData);
+ req.setAttribute("results", results);
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page rather than throw a 500
+ req.setAttribute("results", results + "check userID = " + userID
+ + " and that the database is populated");
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.HOME_PAGE));
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log
+ .error(
+ "TradeServletAction.doHome(...)"
+ + "illegal argument, information should be in exception string"
+ + "treating this as a user error and forwarding on to a new page",
+ e);
+ } catch (javax.ejb.FinderException e) {
+ // this is a user error so I will
+ // forward them to another page rather than throw a 500
+ req.setAttribute("results", results
+ + "\nCould not find account for + " + userID);
+ // requestDispatch(ctx, req, resp,
+ // TradeConfig.getPage(TradeConfig.HOME_PAGE));
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log
+ .error(
+ "TradeServletAction.doHome(...)"
+ + "Error finding account for user "
+ + userID
+ + "treating this as a user error and forwarding on to a new page",
+ e);
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.doHome(...)"
+ + " exception user =" + userID, e);
+ }
+
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.HOME_PAGE));
+ }
+
+ /**
+ * Login a Trade User. Dispatch to the Trade Home JSP for display
+ *
+ * @param userID
+ * The User to login
+ * @param passwd
+ * The password supplied by the trader used to authenticate
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @param results
+ * A short description of the results/success of this web request
+ * provided on the web page
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doLogin(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String passwd)
+ throws javax.servlet.ServletException, java.io.IOException {
+
+ String results = "";
+ try {
+ // Got a valid userID and passwd, attempt login
+
+ AccountDataBean accountData = tAction.login(userID, passwd);
+
+ if (accountData != null) {
+ HttpSession session = req.getSession(true);
+ session.setAttribute("uidBean", userID);
+ session.setAttribute("sessionCreationDate",
+ new java.util.Date());
+ results = "Ready to Trade";
+ doHome(ctx, req, resp, userID, results);
+ return;
+ } else {
+ req.setAttribute("results", results
+ + "\nCould not find account for + " + userID);
+ // log the exception with an error level of 3 which means,
+ // handled exception but would invalidate a automation run
+ Log.log(
+ "TradeServletAction.doLogin(...)",
+ "Error finding account for user " + userID + "",
+ "user entered a bad username or the database is not populated");
+ }
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page rather than throw a 500
+ req.setAttribute("results", results + "illegal argument:"
+ + e.getMessage());
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log
+ .error(
+ e,
+ "TradeServletAction.doLogin(...)",
+ "illegal argument, information should be in exception string",
+ "treating this as a user error and forwarding on to a new page");
+
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.doLogin(...)"
+ + "Exception logging in user " + userID + "with password"
+ + passwd, e);
+ }
+
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.WELCOME_PAGE));
+
+ }
+
+ /**
+ * Logout a Trade User Dispatch to the Trade Welcome JSP for display
+ *
+ * @param userID
+ * The User to logout
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @param results
+ * A short description of the results/success of this web request
+ * provided on the web page
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doLogout(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID) throws ServletException,
+ IOException {
+ String results = "";
+
+ try {
+ tAction.logout(userID);
+
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page, at the end of the page.
+ req.setAttribute("results", results + "illegal argument:"
+ + e.getMessage());
+
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log
+ .error(
+ e,
+ "TradeServletAction.doLogout(...)",
+ "illegal argument, information should be in exception string",
+ "treating this as a user error and forwarding on to a new page");
+ } catch (Exception e) {
+ // log the exception and foward to a error page
+ Log.error(e, "TradeServletAction.doLogout(...):",
+ "Error logging out" + userID, "fowarding to an error page");
+ // set the status_code to 500
+ throw new ServletException("TradeServletAction.doLogout(...)"
+ + "exception logging out user " + userID, e);
+ }
+ HttpSession session = req.getSession();
+ if (session != null) {
+ session.invalidate();
+ }
+
+ Object o = req.getAttribute("TSS-RecreateSessionInLogout");
+ if (o != null && ((Boolean) o).equals(Boolean.TRUE)) {
+ // Recreate Session object before writing output to the response
+ // Once the response headers are written back to the client the
+ // opportunity
+ // to create a new session in this request may be lost
+ // This is to handle only the TradeScenarioServlet case
+ session = req.getSession(true);
+ }
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.WELCOME_PAGE));
+ }
+
+ /**
+ * Retrieve the current portfolio of stock holdings for the given trader
+ * Dispatch to the Trade Portfolio JSP for display
+ *
+ * @param userID
+ * The User requesting to view their portfolio
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @param results
+ * A short description of the results/success of this web request
+ * provided on the web page
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doPortfolio(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String results)
+ throws ServletException, IOException {
+
+ try {
+ // Get the holdiings for this user
+
+ Collection quoteDataBeans = new ArrayList();
+ Collection holdingDataBeans = tAction.getHoldings(userID);
+
+ // Walk through the collection of user
+ // holdings and creating a list of quotes
+ if (holdingDataBeans.size() > 0) {
+
+ Iterator it = holdingDataBeans.iterator();
+ while (it.hasNext()) {
+ HoldingDataBean holdingData = (HoldingDataBean) it.next();
+ QuoteDataBean quoteData = tAction.getQuote(holdingData
+ .getQuoteID());
+ quoteDataBeans.add(quoteData);
+ }
+ } else {
+ results = results + ". Your portfolio is empty.";
+ }
+ req.setAttribute("results", results);
+ req.setAttribute("holdingDataBeans", holdingDataBeans);
+ req.setAttribute("quoteDataBeans", quoteDataBeans);
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.PORTFOLIO_PAGE));
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // forward them to another page rather than throw a 500
+ req.setAttribute("results", results + "illegal argument:"
+ + e.getMessage());
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.PORTFOLIO_PAGE));
+ // log the exception with an error level of 3 which means, handled
+ // exception but would invalidate a automation run
+ Log
+ .error(
+ e,
+ "TradeServletAction.doPortfolio(...)",
+ "illegal argument, information should be in exception string",
+ "user error");
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.doPortfolio(...)"
+ + " exception user =" + userID, e);
+ }
+ }
+
+ /**
+ * Retrieve the current Quote for the given stock symbol Dispatch to the
+ * Trade Quote JSP for display
+ *
+ * @param userID
+ * The stock symbol used to get the current quote
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doQuotes(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String symbols)
+ throws ServletException, IOException {
+ String results = "";
+
+ // Edge Caching:
+ // Getting Quotes has been moved to the JSP
+ // Quote.jsp. This makes each Quote a
+ // standalone "fragment", and thus is a candidate for
+ // Edge caching.
+ //
+
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.QUOTE_PAGE));
+ }
+
+ /**
+ * Register a new trader given the provided user Profile information such as
+ * address, email, etc. Dispatch to the Trade Home JSP for display
+ *
+ * @param userID
+ * The User to create
+ * @param passwd
+ * The User password
+ * @param fullname
+ * The new User fullname info
+ * @param ccn
+ * The new User credit card info
+ * @param money
+ * The new User opening account balance
+ * @param address
+ * The new User address info
+ * @param email
+ * The new User email info
+ * @return The userID of the new trader
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doRegister(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String passwd,
+ String cpasswd, String fullname, String ccn,
+ String openBalanceString, String email, String address)
+ throws ServletException, IOException {
+ String results = "";
+
+ try {
+ // Validate user passwords match and are atleast 1 char in length
+ if ((passwd.equals(cpasswd)) && (passwd.length() >= 1)) {
+
+ AccountDataBean accountData = tAction.register(userID, passwd,
+ fullname, address, email, ccn, new BigDecimal(
+ openBalanceString));
+ if (accountData == null) {
+ results = "Registration operation failed;";
+ System.out.println(results);
+ req.setAttribute("results", results);
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.REGISTER_PAGE));
+ } else {
+ doLogin(ctx, req, resp, userID, passwd);
+ results = "Registration operation succeeded; Account "
+ + accountData.getAccountID() + " has been created.";
+ req.setAttribute("results", results);
+
+ }
+ } else {
+ // Password validation failed
+ results = "Registration operation failed, your passwords did not match";
+ System.out.println(results);
+ req.setAttribute("results", results);
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.REGISTER_PAGE));
+ }
+
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.doRegister(...)"
+ + " exception user =" + userID, e);
+ }
+ }
+
+ /**
+ * Sell a current holding of stock shares for the given trader. Dispatch to
+ * the Trade Portfolio JSP for display
+ *
+ * @param userID
+ * The User buying shares
+ * @param symbol
+ * The stock to sell
+ * @param indx
+ * The unique index identifying the users holding to sell
+ * @param ctx
+ * the servlet context
+ * @param req
+ * the HttpRequest object
+ * @param resp
+ * the HttpResponse object
+ * @exception javax.servlet.ServletException
+ * If a servlet specific exception is encountered
+ * @exception javax.io.IOException
+ * If an exception occurs while writing results back to the
+ * user
+ *
+ */
+ void doSell(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, Integer holdingID)
+ throws ServletException, IOException {
+ String results = "";
+ try {
+ OrderDataBean orderData = tAction.sell(userID, holdingID,
+ TradeConfig.orderProcessingMode);
+
+ req.setAttribute("orderData", orderData);
+ req.setAttribute("results", results);
+ } catch (java.lang.IllegalArgumentException e) { // this is a user
+ // error so I will
+ // just log the exception and then later on I will redisplay the
+ // portfolio page
+ // because this is just a user exception
+ Log
+ .error(
+ e,
+ "TradeServletAction.doSell(...)",
+ "illegal argument, information should be in exception string",
+ "user error");
+ } catch (Exception e) {
+ // log the exception with error page
+ throw new ServletException("TradeServletAction.doSell(...)"
+ + " exception selling holding " + holdingID + " for user ="
+ + userID, e);
+ }
+ requestDispatch(ctx, req, resp, userID, TradeConfig
+ .getPage(TradeConfig.ORDER_PAGE));
+ }
+
+ void doWelcome(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String status) throws ServletException,
+ IOException {
+
+ req.setAttribute("results", status);
+ requestDispatch(ctx, req, resp, null, TradeConfig
+ .getPage(TradeConfig.WELCOME_PAGE));
+ }
+
+ private void requestDispatch(ServletContext ctx, HttpServletRequest req,
+ HttpServletResponse resp, String userID, String page)
+ throws ServletException, IOException {
+
+ ctx.getRequestDispatcher(page).include(req, resp);
+ }
+
+ private void sendRedirect(HttpServletResponse resp, String page)
+ throws ServletException, IOException {
+ resp.sendRedirect(resp.encodeRedirectURL(page));
+ }
}
Added: geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/jboss-web.xml
URL: http://svn.apache.org/viewcvs/geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/jboss-web.xml?rev=395900&view=auto
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/jboss-web.xml (added)
+++ geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/jboss-web.xml Fri Apr 21 07:36:22 2006
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.3//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd">
+
+<jboss-web>
+
+ <resource-ref>
+ <res-ref-name>jdbc/TradeDataSource</res-ref-name>
+ <jndi-name>jdbc/TradeDataSource</jndi-name>
+ </resource-ref>
+
+ <resource-ref>
+ <res-ref-name>jms/QueueConnectionFactory</res-ref-name>
+ <jndi-name>ConnectionFactory</jndi-name>
+ </resource-ref>
+
+ <resource-ref>
+ <res-ref-name>jms/TopicConnectionFactory</res-ref-name>
+ <jndi-name>ConnectionFactory</jndi-name>
+ </resource-ref>
+
+ <ejb-ref>
+ <ejb-ref-name>ejb/Trade</ejb-ref-name>
+ <jndi-name>Trade</jndi-name>
+ </ejb-ref>
+
+ <ejb-ref>
+ <ejb-ref-name>ejb/Quote</ejb-ref-name>
+ <jndi-name>Quote</jndi-name>
+ </ejb-ref>
+
+
+ <message-destination-ref>
+ <message-destination-ref-name>jms/TradeBrokerQueue</message-destination-ref-name>
+ <jndi-name>TradeBrokerQueue</jndi-name>
+ </message-destination-ref>
+
+ <message-destination-ref>
+ <message-destination-ref-name>jms/TradeStreamerTopic</message-destination-ref-name>
+ <jndi-name>TradeStreamerTopic</jndi-name>
+ </message-destination-ref>
+</jboss-web>
Modified: geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewcvs/geronimo/daytrader/trunk/modules/web/src/main/webapp/WEB-INF/web.xml?rev=395900&r1=395899&r2=395900&view=diff
==============================================================================
--- 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 Apr 21 07:36:22 2006
@@ -97,13 +97,13 @@
<description>Sets the population of Trade users when driving
with TradeScenarioServlet.</description>
<param-name>maxUsers</param-name>
- <param-value>5</param-value>
+ <param-value>50</param-value>
</init-param>
<init-param>
<description>Sets the population of Stock quotes used when
driving with TradeScenarioServlet.</description>
<param-name>maxQuotes</param-name>
- <param-value>10</param-value>
+ <param-value>100</param-value>
</init-param>
<init-param>
<description>Sets the number of iterations on web/ejb
Modified: geronimo/daytrader/trunk/modules/web/src/main/webapp/account.jsp
URL: http://svn.apache.org/viewcvs/geronimo/daytrader/trunk/modules/web/src/main/webapp/account.jsp?rev=395900&r1=395899&r2=395900&view=diff
==============================================================================
--- geronimo/daytrader/trunk/modules/web/src/main/webapp/account.jsp (original)
+++ geronimo/daytrader/trunk/modules/web/src/main/webapp/account.jsp Fri Apr 21 07:36:22 2006
@@ -6,261 +6,299 @@
<LINK rel="stylesheet" href="style.css" type="text/css" />
</HEAD>
<BODY bgcolor="#ffffff" link="#000099" vlink="#000099">
-<%@ page import="java.util.Collection, java.util.Iterator, java.math.BigDecimal, org.apache.geronimo.samples.daytrader.*, org.apache.geronimo.samples.daytrader.util.*" session="true" isThreadSafe="true" isErrorPage="false"%>
+<%@ page
+ import="java.util.Collection,java.util.Iterator,java.math.BigDecimal,org.apache.geronimo.samples.daytrader.*,org.apache.geronimo.samples.daytrader.util.*"
+ session="true" isThreadSafe="true" isErrorPage="false"%>
<jsp:useBean id="results" scope="request" type="java.lang.String" />
-<jsp:useBean id="accountData" type="org.apache.geronimo.samples.daytrader.AccountDataBean" scope="request" />
-<jsp:useBean id="accountProfileData" type="org.apache.geronimo.samples.daytrader.AccountProfileDataBean" scope="request"/>
-<jsp:useBean id="orderDataBeans" type="java.util.Collection" scope="request"/>
+<jsp:useBean id="accountData"
+ type="org.apache.geronimo.samples.daytrader.AccountDataBean"
+ scope="request" />
+<jsp:useBean id="accountProfileData"
+ type="org.apache.geronimo.samples.daytrader.AccountProfileDataBean"
+ scope="request" />
+<jsp:useBean id="orderDataBeans" type="java.util.Collection"
+ scope="request" />
<TABLE height="54">
- <TBODY>
- <TR>
- <TD bgcolor="#8080c0" align="left" width="500" height="10" colspan="5"><FONT color="#ffffff"><B>Trade Account</B></FONT></TD>
- <TD align="center" bgcolor="#000000" width="100" height="10"><FONT color="#ffffff"><B>Trade</B></FONT></TD>
- </TR>
- <TR align="center">
- <TD><B><A href="app?action=home">Home</A></B><B> </B></TD>
- <TD><B><A href="app?action=account">Account</A></B><B> </B></TD>
- <TD><B><A href="app?action=portfolio">Portfolio</A></B><B> </B></TD>
- <TD><B><A href="app?action=quotes&symbols=s:0,s:1,s:2,s:3,s:4">Quotes/Trade</A></B></TD>
- <TD><B><A href="app?action=logout">Logoff</A></B></TD>
- <TD></TD>
- </TR>
- <TR>
- <TD align="right" colspan="6">
- <HR>
- <FONT color="#ff0000" size="-2"><%= new java.util.Date() %></FONT></TD>
- </TR>
-<%
-boolean showAllOrders = request.getParameter("showAllOrders")==null?false:true;
-Collection closedOrders = (Collection)request.getAttribute("closedOrders");
-if ( (closedOrders != null) && (closedOrders.size()>0) )
-{
-%>
- <TR>
- <TD colspan="6" bgcolor="#ff0000"><BLINK><B><FONT color="#ffffff">Alert: The following Order(s) have completed.</FONT></B></BLINK></TD>
- </TR>
- <TR align="center">
- <TD colspan="6">
- <TABLE border="1" style="font-size: smaller">
- <TBODY>
-<%
- Iterator it = closedOrders.iterator();
- while (it.hasNext() )
- {
- OrderDataBean closedOrderData = (OrderDataBean)it.next();
-%>
- <TR align="center">
- <TD><A href="docs/glossary.html">order ID</A></TD>
- <TD><A href="docs/glossary.html">order status</A></TD>
- <TD><A href="docs/glossary.html">creation date</A></TD>
- <TD><A href="docs/glossary.html">completion date</A></TD>
- <TD><A href="docs/glossary.html">txn fee</A></TD>
- <TD><A href="docs/glossary.html">type</A></TD>
- <TD><A href="docs/glossary.html">symbol</A></TD>
- <TD><A href="docs/glossary.html">quantity</A></TD>
- </TR>
- <TR align="center">
- <TD><%= closedOrderData.getOrderID()%></TD>
- <TD><%= closedOrderData.getOrderStatus()%></TD>
- <TD><%= closedOrderData.getOpenDate()%></TD>
- <TD><%= closedOrderData.getCompletionDate()%></TD>
- <TD><%= closedOrderData.getOrderFee()%></TD>
- <TD><%= closedOrderData.getOrderType()%></TD>
- <TD><%= FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%></TD>
- <TD><%= closedOrderData.getQuantity()%></TD>
- </TR>
- <%
- }
+ <TBODY>
+ <TR>
+ <TD bgcolor="#c93333" align="left" width="640" height="10" colspan=5><B><FONT
+ color="#ffffff">DayTrader Account</FONT></B></TD>
+ <TD align="center" bgcolor="#000000" width="100" height="10"><FONT
+ color="#ffffff"><B>DayTrader</B></FONT></TD>
+ </TR>
+ <TR align="left">
+ <TD><B><A href="app?action=home">Home</A></B><B> </B></TD>
+ <TD><B><A href="app?action=account">Account</A></B><B> </B></TD>
+ <TD><B><A href="app?action=portfolio">Portfolio</A></B><B> </B></TD>
+ <TD><B><A href="app?action=quotes&symbols=s:0,s:1,s:2,s:3,s:4">Quotes/Trade</A></B></TD>
+ <TD><B><A href="app?action=logout">Logoff</A></B></TD>
+ <TD></TD>
+ </TR>
+ <TR>
+ <TD align="right" colspan="6">
+ <HR>
+ <FONT color="#ff0000" size="-2"><%=new java.util.Date()%></FONT></TD>
+ </TR>
+ <%
+boolean showAllOrders = request.getParameter("showAllOrders") == null ? false
+ : true;
+ Collection closedOrders = (Collection) request
+ .getAttribute("closedOrders");
+ if ((closedOrders != null) && (closedOrders.size() > 0)) {
+
+ %>
+ <TR>
+ <TD colspan="6" bgcolor="#ff0000"><BLINK><B><FONT color="#ffffff">Alert:
+ The following Order(s) have completed.</FONT></B></BLINK></TD>
+ </TR>
+ <TR align="center">
+ <TD colspan="6">
+ <TABLE border="1" style="font-size: smaller">
+ <TBODY>
+ <%
+Iterator it = closedOrders.iterator();
+ while (it.hasNext()) {
+ OrderDataBean closedOrderData = (OrderDataBean) it.next();
+%>
+ <TR align="center">
+ <TD><A href="docs/glossary.html">order ID</A></TD>
+ <TD><A href="docs/glossary.html">order status</A></TD>
+ <TD><A href="docs/glossary.html">creation date</A></TD>
+ <TD><A href="docs/glossary.html">completion date</A></TD>
+ <TD><A href="docs/glossary.html">txn fee</A></TD>
+ <TD><A href="docs/glossary.html">type</A></TD>
+ <TD><A href="docs/glossary.html">symbol</A></TD>
+ <TD><A href="docs/glossary.html">quantity</A></TD>
+ </TR>
+ <TR align="center">
+ <TD><%=closedOrderData.getOrderID()%></TD>
+ <TD><%=closedOrderData.getOrderStatus()%></TD>
+ <TD><%=closedOrderData.getOpenDate()%></TD>
+ <TD><%=closedOrderData.getCompletionDate()%></TD>
+ <TD><%=closedOrderData.getOrderFee()%></TD>
+ <TD><%=closedOrderData.getOrderType()%></TD>
+ <TD><%=FinancialUtils.printQuoteLink(closedOrderData
+ .getSymbol())%></TD>
+ <TD><%=closedOrderData.getQuantity()%></TD>
+ </TR>
+ <%
+}
%>
-
- </TBODY>
- </TABLE>
- </TD>
- </TR>
- <%
+
+ </TBODY>
+ </TABLE>
+ </TD>
+ </TR>
+ <%
}
%>
- </TBODY>
+ </TBODY>
</TABLE>
<TABLE width="620">
- <TBODY>
- <TR>
- <TD valign="top" width="643">
- <TABLE width="100%">
- <TBODY>
- <TR>
- <TD colspan="8"><FONT color="#ff0000"><%= results %></FONT></TD>
- </TR>
- <TR>
- <TD colspan="8" align="left" bgcolor="#cccccc"><B>Account Information</B></TD>
- </TR>
- <TR>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">account created:</A></TD>
- <TD align="left" valign="bottom" colspan="2"><%= accountData.getCreationDate()
-%></TD>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">last login: </A></TD>
- <TD align="left" valign="bottom" colspan="3"><%= accountData.getLastLogin()
-%></TD>
- <TD align="left" valign="bottom"></TD>
- </TR>
- <TR>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">account ID</A></TD>
- <TD valign="bottom"><%= accountData.getAccountID()
-%></TD>
- <TD valign="bottom"></TD>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">total logins: </A></TD>
- <TD valign="bottom"><%= accountData.getLoginCount()
-%></TD>
- <TD valign="bottom"></TD>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">cash balance: </A></TD>
- <TD valign="bottom"><%= accountData.getBalance()
-%></TD>
- </TR>
- <TR>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">user ID:</A></TD>
- <TD valign="bottom"><%= accountData.getProfileID()
-%></TD>
- <TD valign="bottom"></TD>
- <TD align="right" valign="bottom"><A href="docs/glossary.html">total logouts: </A></TD>
- <TD valign="bottom"><%= accountData.getLogoutCount()
-%></TD>
- <TD valign="bottom"></TD>
- <TD valign="bottom" align="right"><A href="docs/glossary.html">opening balance: </A></TD>
- <TD valign="bottom"><%= accountData.getOpenBalance()
-%></TD>
- </TR>
- <TR>
- <TD colspan="8"></TD>
- </TR>
- </TBODY>
- </TABLE>
- <TABLE width="100%">
- <TBODY>
+ <TBODY>
+ <TR>
+ <TD valign="top" width="643">
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD colspan="8"><FONT color="#ff0000"><%=results%></FONT></TD>
+ </TR>
+ <TR>
+ <TD colspan="8" align="left" bgcolor="#cccccc"><B>Account
+ Information</B></TD>
+ </TR>
+ <TR>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">account
+ created:</A></TD>
+ <TD align="left" valign="bottom" colspan="2"><%=accountData.getCreationDate()%></TD>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">last
+ login: </A></TD>
+ <TD align="left" valign="bottom" colspan="3"><%=accountData.getLastLogin()%></TD>
+ <TD align="left" valign="bottom"></TD>
+ </TR>
+ <TR>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">account
+ ID</A></TD>
+ <TD valign="bottom"><%=accountData.getAccountID()%></TD>
+ <TD valign="bottom"></TD>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">total
+ logins: </A></TD>
+ <TD valign="bottom"><%=accountData.getLoginCount()%></TD>
+ <TD valign="bottom"></TD>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">cash
+ balance: </A></TD>
+ <TD valign="bottom"><%=accountData.getBalance()%></TD>
+ </TR>
+ <TR>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">user
+ ID:</A></TD>
+ <TD valign="bottom"><%=accountData.getProfileID()%></TD>
+ <TD valign="bottom"></TD>
+ <TD align="right" valign="bottom"><A href="docs/glossary.html">total
+ logouts: </A></TD>
+ <TD valign="bottom"><%=accountData.getLogoutCount()%></TD>
+ <TD valign="bottom"></TD>
+ <TD valign="bottom" align="right"><A href="docs/glossary.html">opening
+ balance: </A></TD>
+ <TD valign="bottom"><%=accountData.getOpenBalance()%></TD>
+ </TR>
+ <TR>
+ <TD colspan="8"></TD>
+ </TR>
+ </TBODY>
+ </TABLE>
+ <TABLE width="100%">
+ <TBODY>
+
+ <TR>
+ <TD colspan="5" bgcolor="#cccccc"><B>Total Orders: </B><%=orderDataBeans.size()%></TD>
+ <TD bgcolor="#cccccc" align="right"><B><A
+ href="app?action=account&showAllOrders=true">show all orders</A></B></TD>
+ </TR>
+ <TR align="center">
+ <TD colspan="6">
+ <TABLE border="1" style="font-size: smaller">
+ <CAPTION align="bottom"><B>Recent Orders</B></CAPTION>
+ <TBODY>
+ <TR align="center">
+ <TD><A href="docs/glossary.html">order ID</A></TD>
+ <TD><A href="docs/glossary.html">order Status</A></TD>
+ <TD><A href="docs/glossary.html">creation date</A></TD>
+ <TD><A href="docs/glossary.html">completion date</A></TD>
+ <TD><A href="docs/glossary.html">txn fee</A></TD>
+ <TD><A href="docs/glossary.html">type</A></TD>
+ <TD><A href="docs/glossary.html">symbol</A></TD>
+ <TD><A href="docs/glossary.html">quantity</A></TD>
+ <TD><A href="docs/glossary.html">price</A></TD>
+ <TD><A href="docs/glossary.html">total</A></TD>
+ </TR>
+ <%Iterator it = orderDataBeans.iterator();
+ int count = 0;
+ while (it.hasNext()) {
+ if ((showAllOrders == false) && (count++ >= 5))
+ break;
+ OrderDataBean orderData = (OrderDataBean) it.next();
+
+ %>
+ <TR bgcolor="#fafcb6" align="center">
+ <TD><%=orderData.getOrderID()%></TD>
+ <TD><%=orderData.getOrderStatus()%></TD>
+ <TD><%=orderData.getOpenDate()%></TD>
+ <TD><%=orderData.getCompletionDate()%></TD>
+ <TD><%=orderData.getOrderFee()%></TD>
+ <TD><%=orderData.getOrderType()%></TD>
+ <TD><%=FinancialUtils.printQuoteLink(orderData.getSymbol())%></TD>
+ <TD><%=orderData.getQuantity()%></TD>
+ <TD><%=orderData.getPrice()%></TD>
+ <TD><%=orderData.getPrice().multiply(
+ new BigDecimal(orderData.getQuantity()))%></TD>
+ </TR>
+ <%}
- <TR>
- <TD colspan="5" bgcolor="#cccccc"><B>Total Orders: </B><%= orderDataBeans.size()
-%></TD>
- <TD bgcolor="#cccccc" align="right"><B><A href="app?action=account&showAllOrders=true">show all orders</A></B></TD>
- </TR>
- <TR align="center">
- <TD colspan="6">
- <TABLE border="1" style="font-size: smaller">
- <CAPTION align="bottom"><B>Recent Orders</B></CAPTION>
- <TBODY>
- <TR align="center">
- <TD><A href="docs/glossary.html">order ID</A></TD>
- <TD><A href="docs/glossary.html">order Status</A></TD>
- <TD><A href="docs/glossary.html">creation date</A></TD>
- <TD><A href="docs/glossary.html">completion date</A></TD>
- <TD><A href="docs/glossary.html">txn fee</A></TD>
- <TD><A href="docs/glossary.html">type</A></TD>
- <TD><A href="docs/glossary.html">symbol</A></TD>
- <TD><A href="docs/glossary.html">quantity</A></TD>
- <TD><A href="docs/glossary.html">price</A></TD>
- <TD><A href="docs/glossary.html">total</A></TD>
- </TR>
- <%
-Iterator it = orderDataBeans.iterator();
-int count=0;
-while (it.hasNext()) {
- if ( (showAllOrders == false) && (count++ >= 5) )
- break;
- OrderDataBean orderData = (OrderDataBean) it.next();
- %>
- <TR bgcolor="#fafcb6" align="center">
- <TD><%= orderData.getOrderID() %></TD>
- <TD><%= orderData.getOrderStatus() %></TD>
- <TD><%= orderData.getOpenDate() %></TD>
- <TD><%= orderData.getCompletionDate() %></TD>
- <TD><%= orderData.getOrderFee() %></TD>
- <TD><%= orderData.getOrderType() %></TD>
- <TD><%= FinancialUtils.printQuoteLink(orderData.getSymbol()) %></TD>
- <TD><%= orderData.getQuantity() %></TD>
- <TD><%= orderData.getPrice() %></TD>
- <TD><%= orderData.getPrice().multiply(new BigDecimal(orderData.getQuantity())) %></TD>
- </TR>
- <% }
- %></TBODY>
- </TABLE>
- </TD>
- </TR>
- <TR>
- <TD colspan="6"></TD>
- </TR>
- </TBODY>
- </TABLE>
- <TABLE width="100%">
- <FORM>
- <TBODY>
- <TR>
- <TD colspan="6" bgcolor="#cccccc"><B>Account Profile</B></TD>
- </TR>
- <TR>
- <TD align="right" valign="top" width="113">
- <A href="docs/glossary.html">user ID:</A></TD>
- <TD align="left" valign="top" colspan="2" width="228"><INPUT size="30" type="text" maxlength="30" readonly name="userID" value="<%= accountProfileData.getUserID() %>"></TD>
- <TD align="right" valign="top" width="73" colspan="2">
- <A href="docs/glossary.html">full name: </A></TD>
- <TD align="left" valign="top"><INPUT size="30" type="text" maxlength="30" name="fullname" value="<%= accountProfileData.getFullName() %>"></TD>
- </TR>
- <TR>
- <TD align="right" width="113"> <A href="docs/glossary.html">password: </A></TD>
- <TD colspan="2" width="228"><INPUT size="30" type="password" maxlength="30" name="password" value="<%= accountProfileData.getPassword() %>"> </TD>
- <TD align="right" width="73" colspan="2"><A href="docs/glossary.html">address: </A></TD>
- <TD><INPUT size="30" type="text" maxlength="30" name="address" value="<%= accountProfileData.getAddress() %>"></TD>
- </TR>
- <TR>
- <TD align="right" width="113"> <A href="docs/glossary.html">confirm password: </A><BR>
- </TD>
- <TD colspan="2" align="left" width="228"><INPUT size="30" type="password" maxlength="30" name="cpassword" value="<%= accountProfileData.getPassword() %>"></TD>
- <TD align="right" width="73" colspan="2"><A href="docs/glossary.html">credit card: </A></TD>
- <TD align="left"><INPUT size="30" type="text" maxlength="30" name="creditcard" value="<%= accountProfileData.getCreditCard() %>" readonly></TD>
- </TR>
- <TR>
- <TD align="right" width="113"><A href="docs/glossary.html">email address: </A></TD>
- <TD colspan="2" align="left" width="228"><INPUT size="30" type="text" maxlength="30" name="email" value="<%= accountProfileData.getEmail() %>"></TD>
- <TD align="right" width="73" colspan="2"></TD>
- <TD align="center"><INPUT type="submit" name="action" value="update_profile"></TD>
- </TR>
- <TR>
- <TD width="113"></TD>
- <TD colspan="5"></TD>
- </TR>
- </TBODY>
- </FORM>
- </TABLE>
- </TD>
- </TR>
- </TBODY>
+ %>
+ </TBODY>
+ </TABLE>
+ </TD>
+ </TR>
+ <TR>
+ <TD colspan="6"></TD>
+ </TR>
+ </TBODY>
+ </TABLE>
+ <TABLE width="100%">
+ <FORM action=""></FORM>
+ <TBODY>
+ <TR>
+ <TD colspan="6" bgcolor="#cccccc"><B>Account Profile</B></TD>
+ </TR>
+ <TR>
+ <TD align="right" valign="top" width="113"><A
+ href="docs/glossary.html">user ID:</A></TD>
+ <TD align="left" valign="top" colspan="2" width="228"><INPUT
+ size="30" type="text" maxlength="30" readonly name="userID"
+ value="<%= accountProfileData.getUserID() %>"></TD>
+ <TD align="right" valign="top" width="73" colspan="2"><A
+ href="docs/glossary.html">full name: </A></TD>
+ <TD align="left" valign="top"><INPUT size="30" type="text"
+ maxlength="30" name="fullname"
+ value="<%= accountProfileData.getFullName() %>"></TD>
+ </TR>
+ <TR>
+ <TD align="right" width="113"><A href="docs/glossary.html">password:
+ </A></TD>
+ <TD colspan="2" width="228"><INPUT size="30" type="password"
+ maxlength="30" name="password"
+ value="<%= accountProfileData.getPassword() %>"></TD>
+ <TD align="right" width="73" colspan="2"><A
+ href="docs/glossary.html">address: </A></TD>
+ <TD><INPUT size="30" type="text" maxlength="30" name="address"
+ value="<%= accountProfileData.getAddress() %>"></TD>
+ </TR>
+ <TR>
+ <TD align="right" width="113"><A href="docs/glossary.html">confirm
+ password: </A><BR>
+ </TD>
+ <TD colspan="2" align="left" width="228"><INPUT size="30"
+ type="password" maxlength="30" name="cpassword"
+ value="<%= accountProfileData.getPassword() %>"></TD>
+ <TD align="right" width="73" colspan="2"><A
+ href="docs/glossary.html">credit card: </A></TD>
+ <TD align="left"><INPUT size="30" type="text" maxlength="30"
+ name="creditcard"
+ value="<%= accountProfileData.getCreditCard() %>" readonly></TD>
+ </TR>
+ <TR>
+ <TD align="right" width="113"><A href="docs/glossary.html">email
+ address: </A></TD>
+ <TD colspan="2" align="left" width="228"><INPUT size="30"
+ type="text" maxlength="30" name="email"
+ value="<%= accountProfileData.getEmail() %>"></TD>
+ <TD align="right" width="73" colspan="2"></TD>
+ <TD align="center"><INPUT type="submit" name="action"
+ value="update_profile"></TD>
+ </TR>
+ <TR>
+ <TD width="113"></TD>
+ <TD colspan="5"></TD>
+ </TR>
+ </TBODY>
+ <FORM action=""></FORM>
+ </TABLE>
+ </TD>
+ </TR>
+ </TBODY>
</TABLE>
<TABLE height="54" style="font-size: smaller">
- <TBODY>
- <TR>
- <TD colspan="2">
- <HR>
- </TD>
- </TR>
- <TR>
- <TD colspan="2">
- <TABLE width="100%" style="font-size: smaller">
- <TBODY>
- <TR>
- <TD>Note: Click any <A href="docs/glossary.html">symbol</A> for a quote or to trade.</TD>
- <TD align="right"><FORM><INPUT type="submit" name="action" value="quotes"> <INPUT size="20" type="text" name="symbols" value="s:0, s:1, s:2, s:3, s:4"></FORM></TD>
- </TR>
- </TBODY>
- </TABLE>
- </TD>
- </TR>
- <TR>
- <TD bgcolor="#8080c0" align="left" width="500" height="10"><B><FONT color="#ffffff">Trade Account</FONT></B></TD>
- <TD align="center" bgcolor="#000000" width="100" height="10"><FONT color="#ffffff"><B>Trade</B></FONT></TD>
- </TR>
- <TR>
- <TD colspan="2" align="center">Apache Geronimo Performance Benchmark Sample DayTrader<BR>
-Copyright 2005, Apache Software Foundation</TD>
- </TR>
- </TBODY>
+ <TBODY>
+ <TR>
+ <TD colspan="2">
+ <HR>
+ </TD>
+ </TR>
+ <TR>
+ <TD colspan="2">
+ <TABLE width="100%" style="font-size: smaller">
+ <TBODY>
+ <TR>
+ <TD>Note: Click any <A href="docs/glossary.html">symbol</A> for a
+ quote or to trade.</TD>
+ <TD align="right">
+ <FORM action=""><INPUT type="submit" name="action" value="quotes">
+ <INPUT size="20" type="text" name="symbols"
+ value="s:0, s:1, s:2, s:3, s:4"></FORM>
+ </TD>
+ </TR>
+ </TBODY>
+ </TABLE>
+ </TD>
+ </TR>
+ <TR>
+ <TD bgcolor="#c93333" align="left" width="640" height="10"><B><FONT
+ color="#ffffff">DayTrader Account</FONT></B></TD>
+ <TD align="center" bgcolor="#000000" width="100" height="10"><FONT
+ color="#ffffff"><B>DayTrader</B></FONT></TD>
+ </TR>
+ </TBODY>
</TABLE>
</BODY>
</HTML>