You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by vi...@apache.org on 2011/02/17 09:24:04 UTC

svn commit: r1071543 [8/15] - in /geronimo/daytrader/trunk: ./ assemblies/javaee/ javaee6/ javaee6/assemblies/ javaee6/assemblies/daytrader-ear/ javaee6/assemblies/daytrader-ear/src/ javaee6/assemblies/daytrader-ear/src/main/ javaee6/assemblies/daytrad...

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeDirectContextListener.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeDirectContextListener.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeDirectContextListener.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeDirectContextListener.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,41 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebListener;
+
+import org.apache.geronimo.daytrader.javaee6.core.direct.TradeJEEDirect;
+import org.apache.geronimo.daytrader.javaee6.utils.Log;
+
+@WebListener
+public class TradeDirectContextListener    implements ServletContextListener 
+{
+
+    //receieve trade web app startup/shutown events to start(initialized)/stop TradeJEEDirect
+    public void contextInitialized(ServletContextEvent event)
+    {
+        Log.trace("TradeDirectContextListener:contextInitialized - initializing TradeJEEDirect");        
+        TradeJEEDirect.init();
+    }
+    public void contextDestroyed(ServletContextEvent event)
+    {
+        Log.trace("TradeDirectContextListener:contextDestroyed - calling TradeJEEDirect:destroy()");        
+        TradeJEEDirect.destroy();
+    }
+
+}

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJDBCContextListener.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJDBCContextListener.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJDBCContextListener.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJDBCContextListener.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,43 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web;
+
+import javax.servlet.*;
+
+import javax.servlet.annotation.WebListener;
+
+import org.apache.geronimo.daytrader.javaee6.core.direct.TradeJDBCDirect;
+import org.apache.geronimo.daytrader.javaee6.utils.Log;
+
+@WebListener
+public class TradeJDBCContextListener
+    implements ServletContextListener 
+{
+
+    //receieve trade web app startup/shutown events to start(initialized)/stop TradeJDBCDirect
+    public void contextInitialized(ServletContextEvent event)
+    {
+        Log.trace("TradeJDBCContextListener:contextInitialized - initializing TradeJDBCDirect");
+        TradeJDBCDirect.init();
+    }
+    public void contextDestroyed(ServletContextEvent event)
+    {
+        Log.trace("TradeJDBCContextListener:contextDestroyed - calling TradeJDBCDirect:destroy()");        
+        TradeJDBCDirect.destroy();
+    }
+
+}

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJPAContextListener.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJPAContextListener.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJPAContextListener.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeJPAContextListener.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,42 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web;
+
+import javax.servlet.*;
+
+import javax.servlet.annotation.WebListener;
+
+import org.apache.geronimo.daytrader.javaee6.core.direct.TradeJPADirect;
+import org.apache.geronimo.daytrader.javaee6.utils.Log;
+
+@WebListener
+public class TradeJPAContextListener implements ServletContextListener 
+{
+
+    //receieve trade web app startup/shutown events to start(initialized)/stop TradeJPADirect
+    public void contextInitialized(ServletContextEvent event)
+    {
+        Log.trace("TradeJPAContextListener:contextInitialized - initializing TradeJPADirect");
+        TradeJPADirect.init();
+    }
+    public void contextDestroyed(ServletContextEvent event)
+    {
+        Log.trace("TradeJPAContextListener:contextDestroyed - calling TradeJPADirect:destroy()");        
+        TradeJPADirect.destroy();
+    }
+
+}

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeScenarioServlet.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeScenarioServlet.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeScenarioServlet.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeScenarioServlet.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,310 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.annotation.WebInitParam;
+
+import org.apache.geronimo.daytrader.javaee6.entities.HoldingDataBean;
+import org.apache.geronimo.daytrader.javaee6.utils.*;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * TradeScenarioServlet emulates a population of web users by generating a specific Trade operation 
+ * for a randomly chosen user on each access to the URL. Test this servlet by clicking Trade Scenario 
+ * and hit "Reload" on your browser to step through a Trade Scenario. To benchmark using this URL aim 
+ * your favorite web load generator (such as AKStress) at the Trade Scenario URL and fire away.
+ */
+@WebServlet(value = "/scenario", initParams = {
+        @WebInitParam(name = "runTimeMode", value = "Web JPA"),
+        @WebInitParam(name = "orderProcessingMode", value = "Synchronous"),
+        @WebInitParam(name = "accessMode", value = "Standard"),
+        @WebInitParam(name = "webServicesEndpoint", value = "http://localhost:8080/daytrader/services/TradeWSServices"),
+        @WebInitParam(name = "workloadMix", value = "Standard"),
+        @WebInitParam(name = "WebInterface", value = "JSP"),
+        @WebInitParam(name = "maxUsers", value = "200"),
+        @WebInitParam(name = "maxQuotes", value = "400"),
+        @WebInitParam(name = "primIterations", value = "1"),
+        @WebInitParam(name = "cachingType", value = "No Caching")})
+public class TradeScenarioServlet extends HttpServlet {
+
+   /**
+    * Servlet initialization method.
+    */
+    public void init(ServletConfig config) throws ServletException
+    {
+        super.init(config);
+        java.util.Enumeration en = config.getInitParameterNames();
+        while ( en.hasMoreElements() )
+        {
+            String parm = (String) en.nextElement();
+            String value = config.getInitParameter(parm);
+            TradeConfig.setConfigParam(parm, value);
+        }
+    }
+    
+   /**
+    * Returns a string that contains information about TradeScenarioServlet
+    *
+    * @return The servlet information
+    */
+    public java.lang.String getServletInfo()
+    {
+        return "TradeScenarioServlet emulates a population of web users";
+    }    
+
+
+
+   /**
+    * Process incoming HTTP GET requests
+    *
+    * @param request Object that encapsulates the request to the servlet
+    * @param response Object that encapsulates the response from the servlet
+    */
+    public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
+        throws ServletException, IOException
+    {
+        performTask(request,response);
+    }
+
+   /**
+    * Process incoming HTTP POST requests
+    *
+    * @param request Object that encapsulates the request to the servlet
+    * @param response Object that encapsulates the response from the servlet
+    */
+    public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
+        throws ServletException, IOException
+    {
+        performTask(request,response);
+    }    
+
+   /** 
+    * Main service method for TradeScenarioServlet
+    *
+    * @param request Object that encapsulates the request to the servlet
+    * @param response Object that encapsulates the response from the servlet
+    */    
+    public void performTask(HttpServletRequest req, HttpServletResponse resp)
+        throws ServletException, IOException {
+
+        // Scenario generator for Trade2
+        char action = ' ';
+        String userID = null;
+
+        // String to create full dispatch path to TradeAppServlet w/ request Parameters
+        String dispPath = null; // Dispatch Path to TradeAppServlet
+
+        String scenarioAction = (String) req.getParameter("action");
+        if ((scenarioAction != null) && (scenarioAction.length() >= 1))
+        {
+            action = scenarioAction.charAt(0);
+            if (action == 'n')
+            { //null;
+                try
+                {
+                    resp.setContentType("text/html");
+                    PrintWriter out = new PrintWriter(resp.getOutputStream());
+                    out.println("<HTML><HEAD>TradeScenarioServlet</HEAD><BODY>Hello</BODY></HTML>"); 
+                    out.close();
+                    return;
+    
+                }
+                catch (Exception e)
+                {
+                    Log.error(
+                        "trade_client.TradeScenarioServlet.service(...)" + 
+                        "error creating printwriter from responce.getOutputStream", e);
+                        
+                    resp.sendError(
+                            500, 
+                        "trade_client.TradeScenarioServlet.service(...): erorr creating and writing to PrintStream created from response.getOutputStream()"); 
+                } //end of catch
+    
+            } //end of action=='n'
+        }
+
+
+        ServletContext ctx = null;
+        HttpSession session = null;
+        try
+        {
+            ctx = getServletConfig().getServletContext();
+            // These operations require the user to be logged in. Verify the user and if not logged in
+            // change the operation to a login
+            session = req.getSession(true);
+            userID = (String) session.getAttribute("uidBean");
+        }
+        catch (Exception e)
+        {
+            Log.error(
+                "trade_client.TradeScenarioServlet.service(...): performing " + scenarioAction +
+                "error getting ServletContext,HttpSession, or UserID from session" +
+                "will make scenarioAction a login and try to recover from there", e);
+            userID = null;
+            action = 'l';
+        }
+
+        if (userID == null)
+        {
+            action = 'l'; // change to login
+            TradeConfig.incrementScenarioCount();
+        }
+        else if (action == ' ') {
+            //action is not specified perform a random operation according to current mix
+            // Tell getScenarioAction if we are an original user or a registered user 
+            // -- sellDeficits should only be compensated for with original users.
+            action = TradeConfig.getScenarioAction(
+                userID.startsWith(TradeConfig.newUserPrefix));
+        }    
+        switch (action)
+            {
+
+                case 'q' : //quote 
+                    dispPath = tasPathPrefix + "quotes&symbols=" + TradeConfig.rndSymbols();
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 'a' : //account
+                    dispPath = tasPathPrefix + "account";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 'u' : //update account profile
+                    dispPath = tasPathPrefix + "account";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+
+                    String fullName = "rnd" + System.currentTimeMillis();
+                    String address = "rndAddress";
+                    String   password = "xxx";
+                    String email = "rndEmail";
+                    String creditcard = "rndCC";
+                    dispPath = tasPathPrefix + "update_profile&fullname=" + fullName + 
+                        "&password=" + password + "&cpassword=" + password +                     
+                        "&address=" + address +    "&email=" + email + 
+                        "&creditcard=" +  creditcard;
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 'h' : //home
+                    dispPath = tasPathPrefix + "home";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 'l' : //login
+                    userID = TradeConfig.getUserID();
+                    String password2 = "xxx";
+                    dispPath = tasPathPrefix + "login&inScenario=true&uid=" + userID + "&passwd=" + password2;
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                        
+                    // login is successful if the userID is written to the HTTP session
+                    if (session.getAttribute("uidBean") == null) {
+                        System.out.println("TradeScenario login failed. Reset DB between runs");
+                    } 
+                    break;
+                case 'o' : //logout
+                    dispPath = tasPathPrefix + "logout";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 'p' : //portfolio
+                    dispPath = tasPathPrefix + "portfolio";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 'r' : //register
+                    //Logout the current user to become a new user
+                    // see note in TradeServletAction
+                    req.setAttribute("TSS-RecreateSessionInLogout", Boolean.TRUE);
+                    dispPath = tasPathPrefix + "logout";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+
+                    userID = TradeConfig.rndNewUserID();
+                    String passwd = "yyy";
+                    fullName = TradeConfig.rndFullName();
+                    creditcard = TradeConfig.rndCreditCard();
+                    String money = TradeConfig.rndBalance();
+                    email = TradeConfig.rndEmail(userID);
+                    String smail = TradeConfig.rndAddress();
+                    dispPath = tasPathPrefix + "register&Full Name=" + fullName + "&snail mail=" + smail +
+                        "&email=" + email + "&user id=" + userID + "&passwd=" + passwd + 
+                        "&confirm passwd=" + passwd + "&money=" + money + 
+                        "&Credit Card Number=" + creditcard;
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+                case 's' : //sell
+                    dispPath = tasPathPrefix + "portfolioNoEdge";
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+
+                    Collection holdings = (Collection) req.getAttribute("holdingDataBeans");
+                    int numHoldings = holdings.size();
+                    if (numHoldings > 0)
+                    {
+                        //sell first available security out of holding 
+                        
+                        Iterator it = holdings.iterator();
+                        boolean foundHoldingToSell = false;
+                        while (it.hasNext()) 
+                        {
+                            HoldingDataBean holdingData = (HoldingDataBean) it.next();
+                            if ( !(holdingData.getPurchaseDate().equals(new java.util.Date(0)))  )
+                            {
+                                Integer holdingID = holdingData.getHoldingID();
+
+                                dispPath = tasPathPrefix + "sell&holdingID="+holdingID;
+                                ctx.getRequestDispatcher(dispPath).include(req, resp);
+                                foundHoldingToSell = true;
+                                break;    
+                            }
+                        }
+                        if (foundHoldingToSell) break;
+                        if (Log.doTrace())
+                            Log.trace("TradeScenario: No holding to sell -switch to buy -- userID = " + userID + "  Collection count = " + numHoldings);        
+
+                    }
+                    // At this point: A TradeScenario Sell was requested with No Stocks in Portfolio
+                    // This can happen when a new registered user happens to request a sell before a buy
+                    // In this case, fall through and perform a buy instead
+
+                    /* Trade 2.037: Added sell_deficit counter to maintain correct buy/sell mix.
+                     * When a users portfolio is reduced to 0 holdings, a buy is requested instead of a sell.
+                     * This throws off the buy/sell mix by 1. This results in unwanted holding table growth
+                     * To fix this we increment a sell deficit counter to maintain the correct ratio in getScenarioAction
+                     * The 'z' action from getScenario denotes that this is a sell action that was switched from a buy
+                     * to reduce a sellDeficit
+                     */
+                    if (userID.startsWith(TradeConfig.newUserPrefix) == false)
+                    {
+                        TradeConfig.incrementSellDeficit();
+                    }
+                case 'b' : //buy
+                    String symbol = TradeConfig.rndSymbol();
+                    String amount = TradeConfig.rndQuantity() + "";
+
+                    dispPath = tasPathPrefix + "quotes&symbols=" + symbol;
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+
+                    dispPath = tasPathPrefix + "buy&quantity=" + amount + "&symbol=" + symbol;
+                    ctx.getRequestDispatcher(dispPath).include(req, resp);
+                    break;
+            } //end of switch statement 
+    }
+
+    // URL Path Prefix for dispatching to TradeAppServlet
+    private final static String tasPathPrefix = "/app?action=";
+
+}

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeServletAction.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeServletAction.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeServletAction.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeServletAction.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,775 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+
+import org.apache.geronimo.daytrader.javaee6.core.api.TradeServices;
+import org.apache.geronimo.daytrader.javaee6.core.direct.TradeAction;
+import org.apache.geronimo.daytrader.javaee6.entities.*;
+import org.apache.geronimo.daytrader.javaee6.utils.*;
+
+
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.math.BigDecimal;
+
+
+/**
+ * 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;
+
+    TradeServletAction() {
+        if (TradeConfig.getAccessMode() == TradeConfig.STANDARD) {
+            tAction = new TradeAction();
+        } else if (TradeConfig.getAccessMode() == TradeConfig.WEBSERVICES) {             
+            //Disable SOAP
+            //tAction = (TradeServices) new TradeWebSoapProxy();
+        } else {
+            throw new IllegalArgumentException(
+                "TradeServletAction - Uknown TradeConfig accessMode=" +
+                TradeConfig.getAccessMode());
+        }
+    }
+
+    /**
+     * 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);
+            ArrayList orderDataBeans = (TradeConfig.getLongRun() ? new ArrayList() : (ArrayList) 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<HoldingDataBean> 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) {
+            // moved to below
+        } catch (Exception e) {
+            boolean javaee = false;
+            // since we will not have the EJB Spec for non-JavaEE containers,
+            // lets try to handle the expected exception logic, where for
+            // JavaEE we should catch a javax.ejb.FinderException while
+            // for non-JavaEE we should catch a RuntimeException
+            try {
+                Class c = Class.forName("javax.ejb.FinderException");
+                javaee = true;
+                if ((c != null) && (e instanceof javax.ejb.FinderException)) { // JavaEE container
+                    // 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 (ClassNotFoundException cnne) {
+                // ignore, for the non-JavaEE web-only assemblies
+            }
+            
+            if (!javaee && (e instanceof RuntimeException)) {   // non-JavaEE container
+                // 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);                
+            } else {
+                // 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 user=" + 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");
+                throw new NullPointerException("User does not exist or password is incorrect!");
+            }
+        } 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.getMessage(), 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/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBBean.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBBean.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBBean.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBBean.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,127 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web.ejb3;
+
+import org.apache.geronimo.daytrader.javaee6.entities.*;
+import org.apache.geronimo.daytrader.javaee6.core.beans.RunStatsDataBean;
+import org.apache.geronimo.daytrader.javaee6.core.beans.MarketSummaryDataBean;
+import org.apache.geronimo.daytrader.javaee6.core.direct.TradeJEEDirect;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+import javax.ejb.*;
+
+
+@Stateless
+@TransactionAttribute(TransactionAttributeType.REQUIRED)
+@TransactionManagement(TransactionManagementType.CONTAINER)
+public class DirectSLSBBean implements DirectSLSBRemote, DirectSLSBLocal {
+
+    public DirectSLSBBean() {
+    }
+
+    public MarketSummaryDataBean getMarketSummary() throws Exception {
+        return (new TradeJEEDirect(true)).getMarketSummary();
+    }
+
+
+    public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception {
+        return (new TradeJEEDirect(true)).buy(userID, symbol, quantity, orderProcessingMode);
+    }
+
+    public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception {
+        return (new TradeJEEDirect(true)).sell(userID, holdingID, orderProcessingMode);
+    }
+
+    public void queueOrder(Integer orderID, boolean twoPhase) throws Exception {
+        (new TradeJEEDirect(true)).queueOrder(orderID, twoPhase);
+    }
+
+    public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception {
+        return (new TradeJEEDirect(true)).completeOrder(orderID, twoPhase);
+    }
+
+    public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception {
+        (new TradeJEEDirect(true)).cancelOrder(orderID, twoPhase);
+    }
+
+    public void orderCompleted(String userID, Integer orderID) throws Exception {
+        (new TradeJEEDirect(true)).orderCompleted(userID, orderID);
+    }
+
+    public Collection getOrders(String userID) throws Exception {
+        return (new TradeJEEDirect(true)).getOrders(userID);
+    }
+
+    public Collection getClosedOrders(String userID) throws Exception {
+        return (new TradeJEEDirect(true)).getClosedOrders(userID);
+    }
+
+    public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception {
+        return (new TradeJEEDirect(true)).createQuote(symbol, companyName, price);
+    }
+
+    public QuoteDataBean getQuote(String symbol) throws Exception {
+        return (new TradeJEEDirect(true)).getQuote(symbol);
+    }
+
+    public Collection getAllQuotes() throws Exception {
+        return (new TradeJEEDirect(true)).getAllQuotes();
+    }
+
+    public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) throws Exception {
+        return (new TradeJEEDirect(true)).updateQuotePriceVolume(symbol, newPrice, sharesTraded);
+    }
+
+    public Collection getHoldings(String userID) throws Exception {
+        return (new TradeJEEDirect(true)).getHoldings(userID);
+    }
+
+    public HoldingDataBean getHolding(Integer holdingID) throws Exception {
+        return (new TradeJEEDirect(true)).getHolding(holdingID);
+    }
+
+    public AccountDataBean getAccountData(String userID) throws Exception {
+        return (new TradeJEEDirect(true)).getAccountData(userID);
+    }
+
+    public AccountProfileDataBean getAccountProfileData(String userID) throws Exception {
+        return (new TradeJEEDirect(true)).getAccountProfileData(userID);
+    }
+
+    public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception {
+        return (new TradeJEEDirect(true)).updateAccountProfile(profileData);
+    }
+
+    public AccountDataBean login(String userID, String password) throws Exception {
+        return (new TradeJEEDirect(true)).login(userID, password);
+    }
+
+    public void logout(String userID) throws Exception {
+        (new TradeJEEDirect(true)).logout(userID);
+    }
+
+    public AccountDataBean register(String userID, String password, String fullname, String address, String email, String creditcard, BigDecimal openBalance) throws Exception {
+        return (new TradeJEEDirect(true)).register(userID, password, fullname, address, email, creditcard, openBalance);
+    }
+
+    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
+    public RunStatsDataBean resetTrade(boolean deleteAll) throws Exception {
+        return (new TradeJEEDirect(false)).resetTrade(deleteAll);
+    }
+}

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBLocal.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBLocal.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBLocal.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBLocal.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,26 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web.ejb3;
+
+import javax.ejb.Local;
+import org.apache.geronimo.daytrader.javaee6.core.api.TradeServices;
+
+@Local
+public interface DirectSLSBLocal extends TradeServices {
+}
+

Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBRemote.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBRemote.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBRemote.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/ejb3/DirectSLSBRemote.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,26 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.daytrader.javaee6.web.ejb3;
+
+import javax.ejb.Remote;
+import org.apache.geronimo.daytrader.javaee6.core.api.TradeServices;
+
+@Remote
+public interface DirectSLSBRemote extends TradeServices {
+}
+