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 [7/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/utils/src/main/java/org/apache/geronimo/daytrader/javaee6/utils/TradeConfig.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/utils/src/main/java/org/apache/geronimo/daytrader/javaee6/utils/TradeConfig.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/utils/src/main/java/org/apache/geronimo/daytrader/javaee6/utils/TradeConfig.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/utils/src/main/java/org/apache/geronimo/daytrader/javaee6/utils/TradeConfig.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,904 @@
+/**
+ * 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.utils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Random;
+
+
+/**
+ * TradeConfig is a JavaBean holding all configuration and runtime parameters for the Trade application
+ * TradeConfig sets runtime parameters such as the RunTimeMode (EJB3, DIRECT, SESSION3, JDBC, JPA)
+ *
+ */
+
+public class TradeConfig {
+
+ /* Trade Runtime Configuration Parameters */
+ public static final int UNKNOWN = -1;
+
+ /* Trade Runtime Mode parameters */
+ public static String[] runTimeModeNames = {"Full EJB3", "Direct (JDBC)", "Session (EJB3) To Direct", "Web JDBC", "Web JPA"};
+ public static final int EJB3 = 0;
+ public static final int DIRECT = 1;
+ public static final int SESSION3 = 2;
+ public static final int JDBC = 3;
+ public static final int JPA = 4;
+ public static int runTimeMode = DIRECT;
+
+ /* Trade JPA Layer parameters */
+ public static String[] jpaLayerNames = {"OpenJPA", "Hibernate"};
+ public static final int OPENJPA = 0;
+ public static final int HIBERNATE = 1;
+ public static int jpaLayer = OPENJPA;
+
+ public static String[] orderProcessingModeNames =
+ { "Synchronous", "Asynchronous_2-Phase" };
+ public static final int SYNCH = 0;
+ public static final int ASYNCH_2PHASE = 1;
+ public static int orderProcessingMode = SYNCH;
+
+ public static String[] accessModeNames = { "Standard", "WebServices" };
+ public static final int STANDARD = 0;
+ public static final int WEBSERVICES = 1;
+ private static int accessMode = STANDARD;
+
+ /* Trade Scenario Workload parameters */
+ public static String[] workloadMixNames = { "Standard", "High-Volume", };
+ public final static int SCENARIOMIX_STANDARD = 0;
+ public final static int SCENARIOMIX_HIGHVOLUME = 1;
+ public static int workloadMix = SCENARIOMIX_STANDARD;
+
+ /* Trade Web Interface parameters */
+ public static String[] webInterfaceNames = { "JSP", "JSP-Images" };
+ public static final int JSP = 0;
+ public static final int JSP_Images = 1;
+ public static int webInterface = JSP;
+
+ /* Trade Caching Type parameters */
+ public static String[] cachingTypeNames = { "DistributedMap", "Command Caching", "No Caching" };
+ public static final int DISTRIBUTEDMAP = 0;
+ public static final int COMMAND_CACHING = 1;
+ public static final int NO_CACHING = 2;
+ public static int cachingType = NO_CACHING;
+
+ /* Trade Database Scaling parameters*/
+ private static int MAX_USERS = 500;
+ private static int MAX_QUOTES = 1000;
+
+ /* Trade Database specific paramters */
+ public static String JDBC_UID = null;
+ public static String JDBC_PWD = null;
+ public static String DS_NAME = "java:comp/env/jdbc/TradeDataSource";
+
+ /*Trade SOAP specific parameters */
+ private static String SoapURL =
+ "http://localhost:8080/daytrader/services/TradeWSServices";
+
+ /*Trade XA Datasource specific parameters */
+ public static boolean JDBCDriverNeedsGlobalTransaction = false;
+
+ /* Trade Config Miscellaneous itmes */
+ public static String DATASOURCE = "java:comp/env/jdbc/TradeDataSource";
+ public static int KEYBLOCKSIZE = 1000;
+ public static int QUOTES_PER_PAGE = 10;
+ public static boolean RND_USER = true;
+ //public static int RND_SEED = 0;
+ private static int MAX_HOLDINGS = 10;
+ private static int count = 0;
+ private static Object userID_count_semaphore = new Object();
+ private static int userID_count = 0;
+ private static String hostName = null;
+ private static Random r0 = new Random(System.currentTimeMillis());
+ //private static Random r1 = new Random(RND_SEED);
+ private static Random randomNumberGenerator = r0;
+ public static final String newUserPrefix = "ru:";
+ public static final int verifyPercent = 5;
+ private static boolean trace = false;
+ private static boolean actionTrace = false;
+ private static boolean updateQuotePrices = true;
+ private static int primIterations = 1;
+ private static boolean longRun = true;
+ private static boolean publishQuotePriceChange = false;
+
+ /**
+ * -1 means every operation
+ * 0 means never perform a market summary
+ * > 0 means number of seconds between summaries. These will be
+ * synchronized so only one transaction in this period will create a summary and
+ * will cache its results.
+ */
+ private static int marketSummaryInterval = 20;
+
+ /*
+ * Penny stocks is a problem where the random price change factor gets a stock
+ * down to $.01. In this case trade jumpstarts the price back to $6.00 to
+ * keep the math interesting.
+ */
+ public static BigDecimal PENNY_STOCK_PRICE;
+ public static BigDecimal PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER;
+ static {
+ PENNY_STOCK_PRICE = new BigDecimal(0.01);
+ PENNY_STOCK_PRICE =
+ PENNY_STOCK_PRICE.setScale(2, BigDecimal.ROUND_HALF_UP);
+ PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER = new BigDecimal(600.0);
+ PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER.setScale(
+ 2,
+ BigDecimal.ROUND_HALF_UP);
+ }
+
+ /* CJB (DAYTRADER-25) - Also need to impose a ceiling on the quote price to ensure
+ * prevent account and holding balances from exceeding the databases decimal precision.
+ * At some point, this maximum value can be used to trigger a stock split.
+ */
+
+ public static BigDecimal MAXIMUM_STOCK_PRICE;
+ public static BigDecimal MAXIMUM_STOCK_SPLIT_MULTIPLIER;
+ static {
+ MAXIMUM_STOCK_PRICE = new BigDecimal(400);
+ MAXIMUM_STOCK_PRICE.setScale(2, BigDecimal.ROUND_HALF_UP);
+ MAXIMUM_STOCK_SPLIT_MULTIPLIER = new BigDecimal(0.5);
+ MAXIMUM_STOCK_SPLIT_MULTIPLIER.setScale(2, BigDecimal.ROUND_HALF_UP);
+ }
+
+ /* Trade Scenario actions mixes. Each of the array rows represents a specific Trade Scenario Mix.
+ The columns give the percentages for each action in the column header. Note: "login" is always 0.
+ logout represents both login and logout (because each logout operation will cause a new login when
+ the user context attempts the next action.
+ */
+ /* Trade Scenario Workload parameters */
+ public final static int HOME_OP = 0;
+ public final static int QUOTE_OP = 1;
+ public final static int LOGIN_OP = 2;
+ public final static int LOGOUT_OP = 3;
+ public final static int REGISTER_OP = 4;
+ public final static int ACCOUNT_OP = 5;
+ public final static int PORTFOLIO_OP = 6;
+ public final static int BUY_OP = 7;
+ public final static int SELL_OP = 8;
+ public final static int UPDATEACCOUNT_OP = 9;
+
+ private static int scenarioMixes[][] = {
+ // h q l o r a p b s u
+ { 20, 40, 0, 4, 2, 10, 12, 4, 4, 4 }, //STANDARD
+ {
+ 20, 40, 0, 4, 2, 7, 7, 7, 7, 6 }, //High Volume
+ };
+ private static char actions[] =
+ { 'h', 'q', 'l', 'o', 'r', 'a', 'p', 'b', 's', 'u' };
+ private static int sellDeficit = 0;
+ //Tracks the number of buys over sell when a users portfolio is empty
+ // Used to maintain the correct ratio of buys/sells
+
+ /* JSP pages for all Trade Actions */
+
+ public final static int WELCOME_PAGE = 0;
+ public final static int REGISTER_PAGE = 1;
+ public final static int PORTFOLIO_PAGE = 2;
+ public final static int QUOTE_PAGE = 3;
+ public final static int HOME_PAGE = 4;
+ public final static int ACCOUNT_PAGE = 5;
+ public final static int ORDER_PAGE = 6;
+ public final static int CONFIG_PAGE = 7;
+ public final static int STATS_PAGE = 8;
+
+ //FUTURE Add XML/XSL View
+ public static String webUI[][] =
+ {
+ {
+ "/welcome.jsp",
+ "/register.jsp",
+ "/portfolio.jsp",
+ "/quote.jsp",
+ "/tradehome.jsp",
+ "/account.jsp",
+ "/order.jsp",
+ "/config.jsp",
+ "/runStats.jsp" },
+ //JSP Interface
+ {
+ "/welcomeImg.jsp",
+ "/registerImg.jsp",
+ "/portfolioImg.jsp",
+ "/quoteImg.jsp",
+ "/tradehomeImg.jsp",
+ "/accountImg.jsp",
+ "/orderImg.jsp",
+ "/config.jsp",
+ "/runStats.jsp" },
+ //JSP Interface
+ };
+
+ // These are the property settings the VAJ access beans look for.
+ private static final String NAMESERVICE_TYPE_PROPERTY =
+ "java.naming.factory.initial";
+ private static final String NAMESERVICE_PROVIDER_URL_PROPERTY =
+ "java.naming.provider.url";
+
+ // FUTURE:
+ // If a "trade2.properties" property file is supplied, reset the default values
+ // to match those specified in the file. This provides a persistent runtime
+ // property mechanism during server startup
+
+ /**
+ * Return the hostname for this system
+ * Creation date: (2/16/2000 9:02:25 PM)
+ */
+
+ private static String getHostname() {
+ try {
+ if (hostName == null) {
+ hostName = java.net.InetAddress.getLocalHost().getHostName();
+ //Strip of fully qualifed domain if necessary
+ try {
+ hostName = hostName.substring(0, hostName.indexOf('.'));
+ } catch (Exception e) {
+ }
+ }
+ } catch (Exception e) {
+ Log.error(
+ "Exception getting local host name using 'localhost' - ",
+ e);
+ hostName = "localhost";
+ }
+ return hostName;
+ }
+
+ /**
+ * Return a Trade UI Web page based on the current configuration
+ * This may return a JSP page or a Servlet page
+ * Creation date: (3/14/2000 9:08:34 PM)
+ */
+
+ public static String getPage(int pageNumber) {
+ return webUI[webInterface][pageNumber];
+ }
+
+ /**
+ * Return the list of run time mode names
+ * Creation date: (3/8/2000 5:58:34 PM)
+ * @return java.lang.String[]
+ */
+ public static java.lang.String[] getRunTimeModeNames() {
+ return runTimeModeNames;
+ }
+
+ private static int scenarioCount = 0;
+
+ /**
+ * Return a Trade Scenario Operation based on the setting of the current mix (TradeScenarioMix)
+ * Creation date: (2/10/2000 9:08:34 PM)
+ */
+
+ public static char getScenarioAction(boolean newUser) {
+ int r = rndInt(100); //0 to 99 = 100
+ int i = 0;
+ int sum = scenarioMixes[workloadMix][i];
+ while (sum <= r) {
+ i++;
+ sum += scenarioMixes[workloadMix][i];
+ }
+
+ incrementScenarioCount();
+
+ /* In TradeScenarioServlet, if a sell action is selected, but the users portfolio is empty,
+ * a buy is executed instead and sellDefecit is incremented. This allows the number of buy/sell
+ * operations to stay in sync w/ the given Trade mix.
+ */
+
+ if ((!newUser) && (actions[i] == 'b')) {
+ synchronized (TradeConfig.class) {
+ if (sellDeficit > 0) {
+ sellDeficit--;
+ return 's';
+ //Special case for TradeScenarioServlet to note this is a buy switched to a sell to fix sellDeficit
+ }
+ }
+ }
+
+ return actions[i];
+ }
+
+ public static String getUserID() {
+ String userID;
+ if (RND_USER) {
+ userID = rndUserID();
+ } else {
+ userID = nextUserID();
+ }
+ return userID;
+ }
+ private static final BigDecimal orderFee = new BigDecimal("24.95");
+ private static final BigDecimal cashFee = new BigDecimal("0.0");
+ public static BigDecimal getOrderFee(String orderType) {
+ if ((orderType.compareToIgnoreCase("BUY") == 0)
+ || (orderType.compareToIgnoreCase("SELL") == 0))
+ return orderFee;
+
+ return cashFee;
+
+ }
+
+ /**
+ * Increment the sell deficit counter
+ * Creation date: (6/21/2000 11:33:45 AM)
+ */
+ public synchronized static void incrementSellDeficit() {
+ sellDeficit++;
+ }
+
+ public static String nextUserID() {
+ String userID;
+ synchronized (userID_count_semaphore) {
+ userID = "uid:" + userID_count;
+ userID_count++;
+ if (userID_count % MAX_USERS == 0) {
+ userID_count = 0;
+ }
+ }
+ return userID;
+ }
+ public static double random() {
+ return randomNumberGenerator.nextDouble();
+ }
+ public static String rndAddress() {
+ return rndInt(1000) + " Oak St.";
+ }
+ public static String rndBalance() {
+ //Give all new users a cool mill in which to trade
+ return "1000000";
+ }
+ public static String rndCreditCard() {
+ return rndInt(100)
+ + "-"
+ + rndInt(1000)
+ + "-"
+ + rndInt(1000)
+ + "-"
+ + rndInt(1000);
+ }
+ public static String rndEmail(String userID) {
+ return userID + "@" + rndInt(100) + ".com";
+ }
+ public static String rndFullName() {
+ return "first:" + rndInt(1000) + " last:" + rndInt(5000);
+ }
+ public static int rndInt(int i) {
+ return (new Float(random() * i)).intValue();
+ }
+ public static float rndFloat(int i) {
+ return (new Float(random() * i)).floatValue();
+ }
+ public static BigDecimal rndBigDecimal(float f) {
+ return (new BigDecimal(random() * f)).setScale(
+ 2,
+ BigDecimal.ROUND_HALF_UP);
+ }
+
+ public static boolean rndBoolean() {
+ return randomNumberGenerator.nextBoolean();
+ }
+
+ /**
+ * Returns a new Trade user
+ * Creation date: (2/16/2000 8:50:35 PM)
+ */
+ public synchronized static String rndNewUserID() {
+
+ return newUserPrefix
+ + getHostname()
+ + System.currentTimeMillis()
+ + count++;
+ }
+
+ public static float rndPrice() {
+ return ((new Integer(rndInt(200))).floatValue()) + 1.0f;
+ }
+ private final static BigDecimal ONE = new BigDecimal(1.0);
+ public static BigDecimal getRandomPriceChangeFactor() {
+ // CJB (DAYTRADER-25) - Vary change factor between 1.2 and 0.8
+ double percentGain = rndFloat(1) * 0.2;
+ if (random() < .5)
+ percentGain *= -1;
+ percentGain += 1;
+
+ // change factor is between +/- 20%
+ BigDecimal percentGainBD =
+ (new BigDecimal(percentGain)).setScale(2, BigDecimal.ROUND_HALF_UP);
+ if (percentGainBD.doubleValue() <= 0.0)
+ percentGainBD = ONE;
+
+ return percentGainBD;
+ }
+
+ public static float rndQuantity() {
+ return ((new Integer(rndInt(200))).floatValue()) + 1.0f;
+ }
+
+ public static String rndSymbol() {
+ return "s:" + rndInt(MAX_QUOTES - 1);
+ }
+ public static String rndSymbols() {
+
+ String symbols = "";
+ int num_symbols = rndInt(QUOTES_PER_PAGE);
+
+ for (int i = 0; i <= num_symbols; i++) {
+ symbols += "s:" + rndInt(MAX_QUOTES - 1);
+ if (i < num_symbols)
+ symbols += ",";
+ }
+ return symbols;
+ }
+
+ public static String rndUserID() {
+ String nextUser = getNextUserIDFromDeck();
+ if (Log.doTrace())
+ Log.trace("TradeConfig:rndUserID -- new trader = " + nextUser);
+
+ return nextUser;
+ }
+
+ private static synchronized String getNextUserIDFromDeck() {
+ int numUsers = getMAX_USERS();
+ if (deck == null) {
+ deck = new ArrayList(numUsers);
+ for (int i = 0; i < numUsers; i++)
+ deck.add(i, new Integer(i));
+ java.util.Collections.shuffle(deck, r0);
+ }
+ if (card >= numUsers)
+ card = 0;
+ return "uid:" + deck.get(card++);
+
+ }
+
+ //Trade implements a card deck approach to selecting
+ // users for trading with tradescenarioservlet
+ private static ArrayList deck = null;
+ private static int card = 0;
+
+ /**
+ * Set the list of run time mode names
+ * Creation date: (3/8/2000 5:58:34 PM)
+ * @param newRunTimeModeNames java.lang.String[]
+ */
+ public static void setRunTimeModeNames(
+ java.lang.String[] newRunTimeModeNames) {
+ runTimeModeNames = newRunTimeModeNames;
+ }
+ /**
+ * This is a convenience method for servlets to set Trade configuration parameters
+ * from servlet initialization parameters. The servlet provides the init param and its
+ * value as strings. This method then parses the parameter, converts the value to the
+ * correct type and sets the corresponding TradeConfig parameter to the converted value
+ *
+ */
+ public static void setConfigParam(String parm, String value) {
+ Log.log("TradeConfig setting parameter: " + parm + "=" + value);
+ // Compare the parm value to valid TradeConfig parameters that can be set
+ // by servlet initialization
+
+ // First check the proposed new parm and value - if empty or null ignore it
+ if (parm == null)
+ return;
+ parm = parm.trim();
+ if (parm.length() <= 0)
+ return;
+ if (value == null)
+ return;
+ value = value.trim();
+
+ if (parm.equalsIgnoreCase("runTimeMode")) {
+ try {
+ for (int i = 0; i < runTimeModeNames.length; i++) {
+ if (value.equalsIgnoreCase(runTimeModeNames[i])) {
+ setRunTimeMode(i);
+ break;
+ }
+ }
+ } catch (Exception e) {
+ //>>rjm
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "trying to set runtimemode to "
+ + value
+ + "reverting to current value: "
+ + runTimeModeNames[getRunTimeMode()],
+ e);
+ } // If the value is bad, simply revert to current
+ } else if (parm.equalsIgnoreCase("orderProcessingMode")) {
+ try {
+ for (int i = 0; i < orderProcessingModeNames.length; i++) {
+ if (value.equalsIgnoreCase(orderProcessingModeNames[i])) {
+ orderProcessingMode = i;
+ break;
+ }
+ }
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "trying to set orderProcessingMode to "
+ + value
+ + "reverting to current value: "
+ + orderProcessingModeNames[orderProcessingMode],
+ e);
+ } // If the value is bad, simply revert to current
+ } else if (parm.equalsIgnoreCase("accessMode")) {
+ try {
+ for (int i = 0; i < accessModeNames.length; i++) {
+ if (value.equalsIgnoreCase(accessModeNames[i])) {
+ accessMode = i;
+ break;
+ }
+ }
+ }
+ catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "trying to set accessMode to "
+ + value
+ + "reverting to current value: "
+ + accessModeNames[accessMode],
+ e);
+ }
+ } else if (parm.equalsIgnoreCase("webServicesEndpoint")) {
+ try {
+ setSoapURL(value);
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "Setting web services endpoint",
+ e);
+ } //On error, revert to saved
+ } else if (parm.equalsIgnoreCase("workloadMix")) {
+ try {
+ for (int i = 0; i < workloadMixNames.length; i++) {
+ if (value.equalsIgnoreCase(workloadMixNames[i])) {
+ workloadMix = i;
+ break;
+ }
+ }
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "trying to set workloadMix to "
+ + value
+ + "reverting to current value: "
+ + workloadMixNames[workloadMix],
+ e);
+ } // If the value is bad, simply revert to current
+ } else if (parm.equalsIgnoreCase("WebInterface")) {
+ try {
+ for (int i = 0; i < webInterfaceNames.length; i++) {
+ if (value.equalsIgnoreCase(webInterfaceNames[i])) {
+ webInterface = i;
+ break;
+ }
+ }
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "trying to set WebInterface to "
+ + value
+ + "reverting to current value: "
+ + webInterfaceNames[webInterface],
+ e);
+
+ } // If the value is bad, simply revert to current
+ } else if (parm.equalsIgnoreCase("CachingType")) {
+ try {
+ for (int i = 0; i < cachingTypeNames.length; i++) {
+ if (value.equalsIgnoreCase(cachingTypeNames[i])) {
+ cachingType = i;
+ break;
+ }
+ }
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "trying to set CachingType to "
+ + value
+ + "reverting to current value: "
+ + cachingTypeNames[cachingType],
+ e);
+ } // If the value is bad, simply revert to current
+ } else if (parm.equalsIgnoreCase("maxUsers")) {
+ try {
+ MAX_USERS = Integer.parseInt(value);
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "Setting maxusers, error parsing string to int:"
+ + value
+ + "revering to current value: "
+ + MAX_USERS,
+ e);
+ } //On error, revert to saved
+ } else if (parm.equalsIgnoreCase("maxQuotes")) {
+ try {
+ MAX_QUOTES = Integer.parseInt(value);
+ } catch (Exception e) {
+ //>>rjm
+ Log.error(
+ "TradeConfig.setConfigParm(...) minor exception caught"
+ + "Setting max_quotes, error parsing string to int "
+ + value
+ + "reverting to current value: "
+ + MAX_QUOTES,
+ e);
+ //<<rjm
+ } //On error, revert to saved
+ } else if (parm.equalsIgnoreCase("primIterations")) {
+ try {
+ primIterations = Integer.parseInt(value);
+ } catch (Exception e) {
+ Log.error(
+ "TradeConfig.setConfigParm(..): minor exception caught"
+ + "Setting primIterations, error parsing string to int:"
+ + value
+ + "revering to current value: "
+ + primIterations,
+ e);
+ } //On error, revert to saved
+ }
+ }
+
+ /**
+ * Gets the orderProcessingModeNames
+ * @return Returns a String[]
+ */
+ public static String[] getOrderProcessingModeNames() {
+ return orderProcessingModeNames;
+ }
+
+ /**
+ * Gets the workloadMixNames
+ * @return Returns a String[]
+ */
+ public static String[] getWorkloadMixNames() {
+ return workloadMixNames;
+ }
+
+ /**
+ * Gets the webInterfaceNames
+ * @return Returns a String[]
+ */
+ public static String[] getWebInterfaceNames() {
+ return webInterfaceNames;
+ }
+
+ /**
+ * Gets the webInterfaceNames
+ * @return Returns a String[]
+ */
+ public static String[] getCachingTypeNames() {
+ return cachingTypeNames;
+ }
+
+ /**
+ * Gets the scenarioMixes
+ * @return Returns a int[][]
+ */
+ public static int[][] getScenarioMixes() {
+ return scenarioMixes;
+ }
+
+ /**
+ * Gets the trace
+ * @return Returns a boolean
+ */
+ public static boolean getTrace() {
+ return trace;
+ }
+ /**
+ * Sets the trace
+ * @param trace The trace to set
+ */
+ public static void setTrace(boolean traceValue) {
+ trace = traceValue;
+ }
+
+ /**
+ * Gets the mAX_USERS.
+ * @return Returns a int
+ */
+ public static int getMAX_USERS() {
+ return MAX_USERS;
+ }
+
+ /**
+ * Sets the mAX_USERS.
+ * @param mAX_USERS The mAX_USERS to set
+ */
+ public static void setMAX_USERS(int mAX_USERS) {
+ MAX_USERS = mAX_USERS;
+ deck = null; // reset the card deck for selecting users
+ }
+
+ /**
+ * Gets the mAX_QUOTES.
+ * @return Returns a int
+ */
+ public static int getMAX_QUOTES() {
+ return MAX_QUOTES;
+ }
+
+ /**
+ * Sets the mAX_QUOTES.
+ * @param mAX_QUOTES The mAX_QUOTES to set
+ */
+ public static void setMAX_QUOTES(int mAX_QUOTES) {
+ MAX_QUOTES = mAX_QUOTES;
+ }
+
+ /**
+ * Gets the mAX_HOLDINGS.
+ * @return Returns a int
+ */
+ public static int getMAX_HOLDINGS() {
+ return MAX_HOLDINGS;
+ }
+
+ /**
+ * Sets the mAX_HOLDINGS.
+ * @param mAX_HOLDINGS The mAX_HOLDINGS to set
+ */
+ public static void setMAX_HOLDINGS(int mAX_HOLDINGS) {
+ MAX_HOLDINGS = mAX_HOLDINGS;
+ }
+
+ /**
+ * Gets the actionTrace.
+ * @return Returns a boolean
+ */
+ public static boolean getActionTrace() {
+ return actionTrace;
+ }
+
+ /**
+ * Sets the actionTrace.
+ * @param actionTrace The actionTrace to set
+ */
+ public static void setActionTrace(boolean actionTrace) {
+ TradeConfig.actionTrace = actionTrace;
+ }
+
+ /**
+ * Gets the scenarioCount.
+ * @return Returns a int
+ */
+ public static int getScenarioCount() {
+ return scenarioCount;
+ }
+
+ /**
+ * Sets the scenarioCount.
+ * @param scenarioCount The scenarioCount to set
+ */
+ public static void setScenarioCount(int scenarioCount) {
+ TradeConfig.scenarioCount = scenarioCount;
+ }
+
+ public static synchronized void incrementScenarioCount() {
+ scenarioCount++;
+ }
+
+ /**
+ * Gets the jdbc driver needs global transaction
+ * Some XA Drivers require a global transaction to be started
+ * for all SQL calls. To work around this, set this to true
+ * to cause the direct mode to start a user transaction.
+ * @return Returns a boolean
+ */
+ public static boolean getJDBCDriverNeedsGlobalTransaction() {
+ return JDBCDriverNeedsGlobalTransaction;
+ }
+
+ /**
+ * Sets the jdbc driver needs global transaction
+ * @param JDBCDriverNeedsGlobalTransactionVal the value
+ */
+ public static void setJDBCDriverNeedsGlobalTransaction(boolean JDBCDriverNeedsGlobalTransactionVal) {
+ JDBCDriverNeedsGlobalTransaction = JDBCDriverNeedsGlobalTransactionVal;
+ }
+
+ /**
+ * Gets the updateQuotePrices.
+ * @return Returns a boolean
+ */
+ public static boolean getUpdateQuotePrices() {
+ return updateQuotePrices;
+ }
+
+ /**
+ * Sets the updateQuotePrices.
+ * @param updateQuotePrices The updateQuotePrices to set
+ */
+ public static void setUpdateQuotePrices(boolean updateQuotePrices) {
+ TradeConfig.updateQuotePrices = updateQuotePrices;
+ }
+
+ public static String getSoapURL() {
+ return SoapURL;
+ }
+
+ public static void setSoapURL(String value) {
+ SoapURL = value;
+// TradeWebSoapProxy.updateServicePort();
+ }
+
+ public static int getAccessMode() {
+ return accessMode;
+ }
+
+ public static void setAccessMode(int value) {
+ accessMode = value;
+// TradeWebSoapProxy.updateServicePort();
+ }
+
+ public static int getRunTimeMode() {
+ return runTimeMode;
+ }
+
+ public static void setRunTimeMode(int value) {
+ runTimeMode = value;
+ }
+
+ public static int getPrimIterations() {
+ return primIterations;
+ }
+
+ public static void setPrimIterations(int iter) {
+ primIterations = iter;
+ }
+
+ public static boolean getLongRun() {
+ return longRun;
+ }
+
+ public static void setLongRun(boolean longRun) {
+ TradeConfig.longRun = longRun;
+ }
+
+ public static void setPublishQuotePriceChange(boolean publishQuotePriceChange) {
+ TradeConfig.publishQuotePriceChange = publishQuotePriceChange;
+ }
+
+ public static boolean getPublishQuotePriceChange() {
+ return publishQuotePriceChange;
+ }
+
+ public static void setMarketSummaryInterval(int seconds) {
+ TradeConfig.marketSummaryInterval = seconds;
+ }
+
+ public static int getMarketSummaryInterval() {
+ return TradeConfig.marketSummaryInterval;
+ }
+
+ /**
+ * Return the list of JPA Layer names
+ * Creation date: (01/10/2009)
+ * @return java.lang.String[]
+ */
+ public static java.lang.String[] getJPALayerNames() {
+ return jpaLayerNames;
+ }
+
+}
Added: geronimo/daytrader/trunk/javaee6/modules/web/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/pom.xml?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/pom.xml (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/pom.xml Thu Feb 17 08:23:57 2011
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>modules</artifactId>
+ <groupId>org.apache.geronimo.daytrader.javaee6</groupId>
+ <version>3.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.apache.geronimo.daytrader.javaee6</groupId>
+ <artifactId>web</artifactId>
+
+ <name>DayTrader :: Java EE 6 :: Modules - Web</name>
+ <description>Daytrader Java EE 6 Web Module</description>
+ <packaging>war</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.myfaces.core</groupId>
+ <artifactId>myfaces-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.daytrader.javaee6</groupId>
+ <artifactId>utils</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.daytrader.javaee6</groupId>
+ <artifactId>core</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.daytrader.javaee6</groupId>
+ <artifactId>entities</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jpa_2.0_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-ejb_3.1_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jta_1.1_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jms_1.1_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-annotation_1.1_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-servlet_3.0_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jsp_2.2_spec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.taglibs</groupId>
+ <artifactId>taglibs-standard-jstlel</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- Removed per DAYTRADER-7 due to interop issues on commercial AppServers
+ <dependency>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>jspc-maven-plugin</artifactId>
+ <version>1.4.4</version>
+ <scope>provided</scope>
+ </dependency>
+ -->
+ </dependencies>
+ <build>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestEntries>
+ <Class-Path>util.jar core.jar entities.jar</Class-Path>
+ </manifestEntries>
+ </archive>
+ <resources>
+ <resource
+ implementation="org.apache.maven.model.Resource">
+ <filtering>true</filtering>
+ <directory>
+ ${basedir}/src/main/webapp/WEB-INF
+ </directory>
+ <includes>
+ <include>web.xml</include>
+ </includes>
+ </resource>
+ </resources>
+ <webResources>
+ <resource>
+ <directory>${project.build.outputDirectory}</directory>
+ <includes>
+ <include>META-INF/LICENSE*</include>
+ <include>META-INF/NOTICE*</include>
+ <include>META-INF/DISCLAIMER*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>
+ ${basedir}/src/main/resources
+ </directory>
+ <targetPath>docs</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/tradeversion.html</include>
+ </includes>
+ </resource>
+ </webResources>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/OrdersAlertFilter.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/OrdersAlertFilter.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/OrdersAlertFilter.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/OrdersAlertFilter.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,118 @@
+/**
+ * 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 java.io.IOException;
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.annotation.WebFilter;
+
+
+import org.apache.geronimo.daytrader.javaee6.core.direct.TradeAction;
+import org.apache.geronimo.daytrader.javaee6.core.api.TradeServices;
+
+import org.apache.geronimo.daytrader.javaee6.utils.Log;
+import org.apache.geronimo.daytrader.javaee6.utils.TradeConfig;
+
+@WebFilter("/app")
+public class OrdersAlertFilter implements Filter {
+
+ /**
+ * Constructor for CompletedOrdersAlertFilter
+ */
+ public OrdersAlertFilter() {
+ super();
+ }
+
+ /**
+ * @see Filter#init(FilterConfig)
+ */
+ private FilterConfig filterConfig = null;
+ public void init(FilterConfig filterConfig) throws ServletException {
+ this.filterConfig = filterConfig;
+ }
+
+ /**
+ * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
+ */
+ public void doFilter(
+ ServletRequest req,
+ ServletResponse resp,
+ FilterChain chain)
+ throws IOException, ServletException {
+ if (filterConfig == null)
+ return;
+
+ try
+ {
+ String action = req.getParameter("action");
+ if ( action != null )
+ {
+ action = action.trim();
+ if ( (action.length() > 0) && (!action.equals("logout")) )
+ {
+ String userID;
+ if ( action.equals("login") )
+ userID = req.getParameter("uid");
+ else
+ userID = (String) ((HttpServletRequest) req).getSession().getAttribute("uidBean");
+ if ( (userID != null) && (userID.trim().length()>0) )
+ {
+ TradeServices tAction=null;
+ if(TradeConfig.getAccessMode() == TradeConfig.STANDARD) {
+ tAction = new TradeAction();
+ } else if(TradeConfig.getAccessMode() == TradeConfig.WEBSERVICES) {
+ try {
+ Class c = Class.forName("org.apache.geronimo.samples.daytrader.soap.TradeWebSoapProxy");
+ tAction = (TradeServices) c.newInstance();
+ }
+ catch (Exception e) {
+ Log.error("OrdersAlertFilter:doFilter() Creation of TradeWebSoapProxy failed\n" + e);
+ throw new IllegalArgumentException(e);
+ }
+ }
+ java.util.Collection closedOrders = tAction.getClosedOrders(userID);
+ if ( (closedOrders!=null) && (closedOrders.size() > 0) ) {
+ req.setAttribute("closedOrders", closedOrders);
+ }
+ if (Log.doTrace()) {
+ Log.printCollection("OrderAlertFilter: userID="+userID+" closedOrders=", closedOrders);
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Log.error(e, "OrdersAlertFilter - Error checking for closedOrders");
+ }
+
+ ServletContext sc = filterConfig.getServletContext();
+ //String xyz = (String) sc.getAttribute("hitCounter");
+ chain.doFilter(req, resp/*wrapper*/);
+
+ }
+
+ /**
+ * @see Filter#destroy()
+ */
+ public void destroy() {
+ this.filterConfig = null;
+ }
+
+}
+
Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeAppServlet.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeAppServlet.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeAppServlet.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeAppServlet.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,213 @@
+/**
+ * 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 org.apache.geronimo.daytrader.javaee6.core.direct.*;
+import org.apache.geronimo.daytrader.javaee6.utils.*;
+
+import java.io.IOException;
+
+
+/**
+ *
+ * TradeAppServlet provides the standard web interface to Trade and can be
+ * accessed with the Go Trade! link. Driving benchmark load using this interface
+ * requires a sophisticated web load generator that is capable of filling HTML
+ * forms and posting dynamic data.
+ */
+
+@WebServlet("/app")
+public class TradeAppServlet 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);
+ }
+ try {
+ if (TradeConfig.runTimeMode == TradeConfig.JDBC) {
+ TradeJDBCDirect.init();
+ } else if (TradeConfig.runTimeMode == TradeConfig.JPA) {
+ TradeJPADirect.init();
+ } else {
+ TradeJEEDirect.init();
+ }
+ } catch (Exception e) {
+ Log.error(e, "TradeAppServlet:init -- Error initializing TradeDirect");
+ }
+ }
+
+ /**
+ * Returns a string that contains information about TradeScenarioServlet
+ *
+ * @return The servlet information
+ */
+ public java.lang.String getServletInfo() {
+ return "TradeAppServlet provides the standard web interface to Trade";
+ }
+
+ /**
+ * 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 TradeAppServlet
+ *
+ * @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 {
+
+ String action = null;
+ String userID = null;
+ // String to create full dispatch path to TradeAppServlet w/ request
+ // Parameters
+ String dispPath = null; // Dispatch Path to TradeAppServlet
+
+ resp.setContentType("text/html");
+ TradeServletAction tsAction = new TradeServletAction();
+
+ // Dyna - need status string - prepended to output
+ action = req.getParameter("action");
+
+ ServletContext ctx = getServletConfig().getServletContext();
+
+ if (action == null) {
+ tsAction.doWelcome(ctx, req, resp, "");
+ return;
+ } else if (action.equals("login")) {
+ userID = req.getParameter("uid");
+ String passwd = req.getParameter("passwd");
+ String inScenario = req.getParameter("inScenario");
+ try {
+ tsAction.doLogin(ctx, req, resp, userID, passwd);
+ } catch (ServletException se) {
+ tsAction.doWelcome(ctx, req, resp, se.getMessage());
+ }
+ return;
+ } else if (action.equals("register")) {
+ userID = req.getParameter("user id");
+ String passwd = req.getParameter("passwd");
+ String cpasswd = req.getParameter("confirm passwd");
+ String fullname = req.getParameter("Full Name");
+ String ccn = req.getParameter("Credit Card Number");
+ String money = req.getParameter("money");
+ String email = req.getParameter("email");
+ String smail = req.getParameter("snail mail");
+ tsAction.doRegister(ctx, req, resp, userID, passwd, cpasswd,
+ fullname, ccn, money, email, smail);
+ return;
+ }
+
+ // The rest of the operations require the user to be logged in -
+ // Get the Session and validate the user.
+ HttpSession session = req.getSession();
+ userID = (String) session.getAttribute("uidBean");
+
+ if (userID == null) {
+ System.out
+ .println("TradeAppServlet service error: User Not Logged in");
+ tsAction.doWelcome(ctx, req, resp, "User Not Logged in");
+ return;
+ }
+ if (action.equals("quotes")) {
+ String symbols = req.getParameter("symbols");
+ tsAction.doQuotes(ctx, req, resp, userID, symbols);
+ } else if (action.equals("buy")) {
+ String symbol = req.getParameter("symbol");
+ String quantity = req.getParameter("quantity");
+ tsAction.doBuy(ctx, req, resp, userID, symbol, quantity);
+ } else if (action.equals("sell")) {
+ int holdingID = Integer.parseInt(req.getParameter("holdingID"));
+ tsAction.doSell(ctx, req, resp, userID, new Integer(holdingID));
+ } else if (action.equals("portfolio")
+ || action.equals("portfolioNoEdge")) {
+ tsAction.doPortfolio(ctx, req, resp, userID, "Portfolio as of "
+ + new java.util.Date());
+ } else if (action.equals("logout")) {
+ tsAction.doLogout(ctx, req, resp, userID);
+ } else if (action.equals("home")) {
+ tsAction.doHome(ctx, req, resp, userID, "Ready to Trade");
+ } else if (action.equals("account")) {
+ tsAction.doAccount(ctx, req, resp, userID, "");
+ } else if (action.equals("update_profile")) {
+ String password = req.getParameter("password");
+ String cpassword = req.getParameter("cpassword");
+ String fullName = req.getParameter("fullname");
+ String address = req.getParameter("address");
+ String creditcard = req.getParameter("creditcard");
+ String email = req.getParameter("email");
+ tsAction.doAccountUpdate(ctx, req, resp, userID,
+ password == null ? "" : password.trim(),
+ cpassword == null ? "" : cpassword.trim(),
+ fullName == null ? "" : fullName.trim(),
+ address == null ? "" : address.trim(),
+ creditcard == null ? "" : creditcard.trim(),
+ email == null ? "" : email.trim());
+ } else {
+ System.out.println("TradeAppServlet: Invalid Action=" + action);
+ tsAction.doWelcome(ctx, req, resp,
+ "TradeAppServlet: Invalid Action" + action);
+ }
+ }
+
+ private void sendRedirect(HttpServletResponse resp, String page)
+ throws ServletException, IOException {
+ resp.sendRedirect(resp.encodeRedirectURL(page));
+ }
+
+ // URL Path Prefix for dispatching to TradeAppServlet
+ private final static String tasPathPrefix = "/app?action=";
+
+}
\ No newline at end of file
Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeBuildDB.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeBuildDB.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeBuildDB.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeBuildDB.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,314 @@
+package org.apache.geronimo.daytrader.javaee6.web;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+
+import org.apache.geronimo.daytrader.javaee6.core.api.*;
+import org.apache.geronimo.daytrader.javaee6.core.direct.*;
+import org.apache.geronimo.daytrader.javaee6.core.beans.*;
+import org.apache.geronimo.daytrader.javaee6.entities.AccountDataBean;
+import org.apache.geronimo.daytrader.javaee6.entities.AccountProfileDataBean;
+import org.apache.geronimo.daytrader.javaee6.entities.OrderDataBean;
+import org.apache.geronimo.daytrader.javaee6.entities.QuoteDataBean;
+import org.apache.geronimo.daytrader.javaee6.utils.*;
+
+/**
+ * TradeBuildDB uses operations provided by the TradeApplication to
+ * (a) create the Database tables
+ * (b) populate a DayTrader database without creating the tables.
+ * Specifically, a new DayTrader User population is created using
+ * UserIDs of the form "uid:xxx" where xxx is a sequential number
+ * (e.g. uid:0, uid:1, etc.). New stocks are also created of the form "s:xxx",
+ * again where xxx represents sequential numbers (e.g. s:1, s:2, etc.)
+ */
+public class TradeBuildDB {
+
+ private boolean verbose = true;
+ private TradeConfig t = new TradeConfig();
+
+ /**
+ * Populate a Trade DB using standard out as a log
+ */
+ public TradeBuildDB() throws Exception {
+ this(new java.io.PrintWriter(System.out), null);
+ }
+
+ /**
+ * Re-create the DayTrader db tables and populate them OR just populate a
+ * DayTrader DB, logging to the provided output stream
+ */
+ public TradeBuildDB(java.io.PrintWriter out, String warPath)
+ throws Exception {
+ String symbol, companyName;
+ int errorCount = 0; // Give up gracefully after 10 errors
+ TradeAction tradeAction = new TradeAction();
+
+ // TradeStatistics.statisticsEnabled=false; // disable statistics
+ out.println("<HEAD><BR><EM> TradeBuildDB: Building DayTrader Database...</EM><BR>"
+ + "This operation will take several minutes. Please wait...</HEAD>");
+ out.println("<BODY>");
+
+ if (warPath != null) {
+ // out.println("<BR>TradeBuildDB: **** warPath= "+warPath+" ****</BR></BODY>");
+ TradeDBServices tradeDB = null;
+
+ if ((TradeConfig.getRunTimeMode() == TradeConfig.JDBC)
+ || (TradeConfig.getRunTimeMode() == TradeConfig.JPA)) {
+ tradeDB = new TradeJDBCDirect();
+ } else {
+ tradeDB = new TradeJEEDirect();
+ }
+
+ boolean success = false;
+ String dbProductName = null;
+ File ddlFile = null;
+ Object[] sqlBuffer = null;
+
+ // Find out the Database being used
+ try {
+ dbProductName = tradeDB.checkDBProductName();
+ } catch (Exception e) {
+ Log.error(e, "TradeBuildDB: Unable to check DB Product name");
+ }
+ if (dbProductName == null) {
+ out.println("<BR>TradeBuildDB: **** Unable to check DB Product name,"
+ + "please check Database/AppServer configuration and retry ****</BR></BODY>");
+ return;
+ }
+
+ // Locate DDL file for the specified database
+ try {
+ out.println("<BR>TradeBuildDB: **** Database Product detected: "
+ + dbProductName + " ****</BR>");
+ if (dbProductName.startsWith("DB2/")) { // if db is DB2
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "db2" + File.separatorChar + "Table.ddl");
+ } else if (dbProductName.startsWith("Apache Derby")) { // if db is Derby
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "derby" + File.separatorChar + "Table.ddl");
+ } else if (dbProductName.startsWith("Oracle")) { // if the Db is Oracle
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "oracle" + File.separatorChar + "Table.ddl");
+ } else if (dbProductName.startsWith("MySQL")) {// if the Db is MySQL
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "mysql" + File.separatorChar + "Table.ddl");
+ } else if (dbProductName.startsWith("Informix Dynamic Server")) { // if the Db is Informix dynamic server
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "informix" + File.separatorChar + "Table.ddl");
+ } else if (dbProductName.startsWith("Microsoft SQL Server")) { // if the Db is Microsoft SQLServer
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "sqlserver" + File.separatorChar + "Table.ddl");
+ } else if (dbProductName.startsWith("PostgreSQL")) { // if the Db is PostgreSQL
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "postgre" + File.separatorChar + "Table.ddl");
+ } else { // Unsupported "Other" Database
+ ddlFile = new File(warPath + File.separatorChar + "dbscripts"
+ + File.separatorChar + "other" + File.separatorChar + "Table.ddl");
+ out.println("<BR>TradeBuildDB: **** This Database is "
+ + "unsupported/untested use at your own risk ****</BR>");
+ }
+
+ if (!ddlFile.exists()) {
+ Log.error("TradeBuildDB: DDL file doesnt exist at path "
+ + ddlFile.getCanonicalPath()
+ + " , please provide the file and retry");
+ out.println("<BR>TradeBuildDB: DDL file doesnt exist at path <I>"
+ + ddlFile.getCanonicalPath() +
+ "</I> , please provide the file and retry ****</BR></BODY>");
+ return;
+ }
+ out.println("<BR>TradeBuildDB: **** The DDL file at path <I>"
+ + ddlFile.getCanonicalPath()
+ + "</I> will be used ****</BR>");
+ out.flush();
+ } catch (Exception e) {
+ Log.error(e,
+ "TradeBuildDB: Unable to locate DDL file for the specified database");
+ out.println("<BR>TradeBuildDB: **** Unable to locate DDL file for "
+ + "the specified database ****</BR></BODY>");
+ return;
+ }
+
+ // parse the DDL file and fill the SQL commands into a buffer
+ try {
+ sqlBuffer = parseDDLToBuffer(ddlFile);
+ } catch (Exception e) {
+ Log.error(e, "TradeBuildDB: Unable to parse DDL file");
+ out.println("<BR>TradeBuildDB: **** Unable to parse DDL file for the specified "+
+ "database ****</BR></BODY>");
+ return;
+ }
+ if ((sqlBuffer == null) || (sqlBuffer.length == 0)) {
+ out.println("<BR>TradeBuildDB: **** Parsing DDL file returned empty buffer, please check "+
+ "that a valid DB specific DDL file is available and retry ****</BR></BODY>");
+ return;
+ }
+
+ // send the sql commands buffer to drop and recreate the Daytrader tables
+ out.println("<BR>TradeBuildDB: **** Dropping and Recreating the DayTrader tables... ****</BR>");
+ try {
+ success = tradeDB.recreateDBTables(sqlBuffer, out);
+ } catch (Exception e) {
+ Log.error(e,
+ "TradeBuildDB: Unable to drop and recreate DayTrader Db Tables, "+
+ "please check for database consistency before continuing");
+ }
+ if (!success) {
+ out.println("<BR>TradeBuildDB: **** Unable to drop and recreate DayTrader Db Tables, "+
+ "please check for database consistency before continuing ****</BR></BODY>");
+ return;
+ }
+ out.println("<BR>TradeBuildDB: **** DayTrader tables successfully created! ****</BR><BR><b> "+
+ "Please Stop and Re-start your Daytrader application (or your application server) and then use "+
+ "the \"Repopulate Daytrader Database\" link to populate your database.</b></BR><BR><BR></BODY>");
+ return;
+ } // end of createDBTables
+
+ out.println("<BR>TradeBuildDB: **** Creating "
+ + TradeConfig.getMAX_QUOTES() + " Quotes ****</BR>");
+ // Attempt to delete all of the Trade users and Trade Quotes first
+ try {
+ tradeAction.resetTrade(true);
+ } catch (Exception e) {
+ Log.error(e, "TradeBuildDB: Unable to delete Trade users "+
+ "(uid:0, uid:1, ...) and Trade Quotes (s:0, s:1, ...)");
+ }
+ for (int i = 0; i < TradeConfig.getMAX_QUOTES(); i++) {
+ symbol = "s:" + i;
+ companyName = "S" + i + " Incorporated";
+ try {
+ QuoteDataBean quoteData =
+ tradeAction.createQuote(symbol, companyName,
+ new java.math.BigDecimal(TradeConfig.rndPrice()));
+ if (i % 10 == 0) {
+ out.print("....." + symbol);
+ if (i % 100 == 0) {
+ out.println(" -<BR>");
+ out.flush();
+ }
+ }
+ } catch (Exception e) {
+ if (errorCount++ >= 10) {
+ String error = "Populate Trade DB aborting after 10 create quote errors. Check "+
+ "the EJB datasource configuration. Check the log for details <BR><BR> Exception is: <BR> "
+ + e.toString();
+ Log.error(e, error);
+ throw e;
+ }
+ }
+ }
+ out.println("<BR>");
+ out.println("<BR>**** Registering " + TradeConfig.getMAX_USERS()
+ + " Users **** ");
+ errorCount = 0; // reset for user registrations
+
+ // Registration is a formal operation in Trade 2.
+ for (int i = 0; i < TradeConfig.getMAX_USERS(); i++) {
+ String userID = "uid:" + i;
+ String fullname = TradeConfig.rndFullName();
+ String email = TradeConfig.rndEmail(userID);
+ String address = TradeConfig.rndAddress();
+ String creditcard = TradeConfig.rndCreditCard();
+ double initialBalance =
+ (double) (TradeConfig.rndInt(100000)) + 200000;
+ if (i == 0) {
+ initialBalance = 1000000; // uid:0 starts with a cool million.
+ }
+ try {
+ AccountDataBean accountData =
+ tradeAction.register(userID, "xxx", fullname, address,
+ email, creditcard, new BigDecimal(initialBalance));
+ String results;
+ if (accountData != null) {
+ if (i % 50 == 0) {
+ out.print("<BR>Account# " + accountData.getAccountID()
+ + " userID=" + userID);
+ }
+
+ // 0-MAX_HOLDING (inclusive), avg holdings per user = (MAX-0)/2
+ int holdings = TradeConfig.rndInt(TradeConfig.getMAX_HOLDINGS() + 1);
+ double quantity = 0;
+ OrderDataBean orderData;
+ for (int j = 0; j < holdings; j++) {
+ symbol = TradeConfig.rndSymbol();
+ quantity = TradeConfig.rndQuantity();
+ orderData =
+ tradeAction.buy(userID, symbol, quantity,
+ TradeConfig.orderProcessingMode);
+ }
+ if (i % 50 == 0) {
+ out.println(" has " + holdings + " holdings.");
+ out.flush();
+ }
+ } else {
+ out.println("<BR>UID " + userID
+ + " already registered.</BR>");
+ out.flush();
+ }
+
+ } catch (Exception e) {
+ if (errorCount++ >= 10) {
+ AccountProfileDataBean accountProfileData = null;
+
+ String error = "Populate Trade DB aborting after 10 user registration errors. "+
+ "Check the log for details. <BR><BR> Exception is: <BR>" + e.toString();
+ Log.error(e, error);
+ throw e;
+ }
+ }
+ } // end-for
+ out.println("</BODY>");
+ }
+
+ public Object[] parseDDLToBuffer(File ddlFile) throws Exception {
+ BufferedReader br = null;
+ ArrayList sqlBuffer = new ArrayList(30); // initial capacity 30 assuming we have 30 ddl-sql statements to read
+
+ try {
+ if (Log.doTrace())
+ Log.traceEnter("TradeBuildDB:parseDDLToBuffer - " + ddlFile);
+
+ br = new BufferedReader(new FileReader(ddlFile));
+ String s;
+ String sql = new String();
+ while ((s = br.readLine()) != null) {
+ s = s.trim();
+ if ((s.length() != 0) && (s.charAt(0) != '#')) // Empty lines or lines starting with "#" are ignored
+ {
+ sql = sql + " " + s;
+ if (s.endsWith(";")) // reached end of sql statement
+ {
+ sql = sql.replace(';', ' '); // remove the semicolon
+ // System.out.println (sql);
+ sqlBuffer.add(sql);
+ sql = "";
+ }
+ }
+ }
+ } catch (IOException ex) {
+ Log.error("TradeBuildDB:parseDDLToBuffer Exeception during open/read of File: "
+ + ddlFile, ex);
+ throw ex;
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException ex) {
+ Log.error("TradeBuildDB:parseDDLToBuffer Failed to close BufferedReader",
+ ex);
+ }
+ }
+ }
+ return sqlBuffer.toArray();
+ }
+
+ public static void main(String args[]) throws Exception {
+ new TradeBuildDB();
+
+ }
+}
+
Added: geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeConfigServlet.java
URL: http://svn.apache.org/viewvc/geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeConfigServlet.java?rev=1071543&view=auto
==============================================================================
--- geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeConfigServlet.java (added)
+++ geronimo/daytrader/trunk/javaee6/modules/web/src/main/java/org/apache/geronimo/daytrader/javaee6/web/TradeConfigServlet.java Thu Feb 17 08:23:57 2011
@@ -0,0 +1,438 @@
+/**
+ * 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 org.apache.geronimo.daytrader.javaee6.core.direct.*;
+import org.apache.geronimo.daytrader.javaee6.core.beans.*;
+import org.apache.geronimo.daytrader.javaee6.utils.*;
+
+import java.io.IOException;
+
+/**
+ * TradeConfigServlet provides a servlet interface to adjust DayTrader runtime parameters.
+ * TradeConfigServlet updates values in the {@link org.apache.geronimo.samples.daytrader.web.TradeConfig} JavaBean holding
+ * all configuration and runtime parameters for the Trade application
+ *
+ */
+@WebServlet("/config")
+public class TradeConfigServlet extends HttpServlet {
+
+ /**
+ * Servlet initialization method.
+ */
+ public void init(ServletConfig config) throws ServletException
+ {
+ super.init(config);
+ }
+ /**
+ * Create the TradeConfig bean and pass it the config.jsp page
+ * to display the current Trade runtime configuration
+ * Creation date: (2/8/2000 3:43:59 PM)
+ */
+ void doConfigDisplay(
+ HttpServletRequest req,
+ HttpServletResponse resp,
+ String results)
+ throws Exception {
+
+ TradeConfig currentConfig = new TradeConfig();
+
+ req.setAttribute("tradeConfig", currentConfig);
+ req.setAttribute("status", results);
+ getServletConfig()
+ .getServletContext()
+ .getRequestDispatcher(TradeConfig.getPage(TradeConfig.CONFIG_PAGE))
+ .include(req, resp);
+ }
+
+ void doResetTrade(
+ HttpServletRequest req,
+ HttpServletResponse resp,
+ String results)
+ throws Exception
+ {
+ RunStatsDataBean runStatsData = new RunStatsDataBean();
+ TradeConfig currentConfig = new TradeConfig();
+ try
+ {
+ runStatsData = new TradeAction().resetTrade(false);
+
+ req.setAttribute("runStatsData", runStatsData);
+ req.setAttribute("tradeConfig", currentConfig);
+ results += "Trade Reset completed successfully";
+ req.setAttribute("status", results);
+
+ }
+ catch (Exception e)
+ {
+ results += "Trade Reset Error - see log for details";
+ Log.error(e, results);
+ throw e;
+ }
+ getServletConfig()
+ .getServletContext()
+ .getRequestDispatcher(TradeConfig.getPage(TradeConfig.STATS_PAGE))
+ .include(req, resp);
+
+ }
+
+
+ /**
+ * Update Trade runtime configuration paramaters
+ * Creation date: (2/8/2000 3:44:24 PM)
+ */
+ void doConfigUpdate(HttpServletRequest req, HttpServletResponse resp)
+ throws Exception {
+
+ TradeConfig currentConfig = new TradeConfig();
+
+ String currentConfigStr = "\n\n########## Trade configuration update. Current config:\n\n";
+ String runTimeModeStr = req.getParameter("RunTimeMode");
+ if (runTimeModeStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(runTimeModeStr);
+ if ((i >= 0)
+ && (i < TradeConfig.runTimeModeNames.length)) //Input validation
+ TradeConfig.setRunTimeMode(i);
+ }
+ catch (Exception e)
+ {
+ //>>rjm
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set runtimemode to " + runTimeModeStr,
+ "reverting to current value");
+
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tRunTimeMode:\t\t" + TradeConfig.runTimeModeNames[TradeConfig.getRunTimeMode()] + "\n";
+
+ /* Add JPA layer choice to avoid some ugly Hibernate bugs */
+ String jpaLayerStr = req.getParameter("JPALayer");
+ if (jpaLayerStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(jpaLayerStr);
+ if ((i >= 0)
+ && (i < TradeConfig.jpaLayerNames.length)) //Input validation
+ TradeConfig.jpaLayer = i;
+ }
+ catch (Exception e)
+ {
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set JPALayer to " + jpaLayerStr,
+ "reverting to current value");
+
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tJPALayer:\t\t" + TradeConfig.jpaLayerNames[TradeConfig.jpaLayer] + "\n";
+
+ String orderProcessingModeStr = req.getParameter("OrderProcessingMode");
+ if (orderProcessingModeStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(orderProcessingModeStr);
+ if ((i >= 0)
+ && (i < TradeConfig.orderProcessingModeNames.length)) //Input validation
+ TradeConfig.orderProcessingMode = i;
+ }
+ catch (Exception e)
+ {
+ //>>rjm
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set orderProcessing to " + orderProcessingModeStr,
+ "reverting to current value");
+
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tOrderProcessingMode:\t" + TradeConfig.orderProcessingModeNames[TradeConfig.orderProcessingMode] + "\n";
+
+ String accessModeStr = req.getParameter("AcessMode");
+ if (accessModeStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(accessModeStr);
+ if ((i >= 0)
+ && (i < TradeConfig.accessModeNames.length) && (i != TradeConfig.getAccessMode())) //Input validation
+ TradeConfig.setAccessMode(i);
+ }
+ catch (Exception e)
+ {
+ //>>rjm
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set orderProcessing to " + orderProcessingModeStr,
+ "reverting to current value");
+
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tAcessMode:\t\t" + TradeConfig.accessModeNames[TradeConfig.getAccessMode()] + "\n";
+
+
+ String workloadMixStr = req.getParameter("WorkloadMix");
+ if (workloadMixStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(workloadMixStr);
+ if ((i >= 0)
+ && (i < TradeConfig.workloadMixNames.length)) //Input validation
+ TradeConfig.workloadMix = i;
+ }
+ catch (Exception e)
+ {
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set workloadMix to " + workloadMixStr,
+ "reverting to current value");
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tWorkload Mix:\t\t" + TradeConfig.workloadMixNames[TradeConfig.workloadMix] + "\n";
+
+
+
+ String webInterfaceStr = req.getParameter("WebInterface");
+ if (webInterfaceStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(webInterfaceStr);
+ if ((i >= 0)
+ && (i < TradeConfig.webInterfaceNames.length)) //Input validation
+ TradeConfig.webInterface = i;
+ }
+ catch (Exception e)
+ {
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set WebInterface to " + webInterfaceStr,
+ "reverting to current value");
+
+
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tWeb Interface:\t\t" + TradeConfig.webInterfaceNames[TradeConfig.webInterface] + "\n";
+
+ String cachingTypeStr = req.getParameter("CachingType");
+ if (cachingTypeStr != null)
+ {
+ try
+ {
+ int i = Integer.parseInt(cachingTypeStr);
+ if ((i >= 0)
+ && (i < TradeConfig.cachingTypeNames.length)) //Input validation
+ TradeConfig.cachingType = i;
+ }
+ catch (Exception e)
+ {
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "trying to set CachingType to " + cachingTypeStr,
+ "reverting to current value");
+ } // If the value is bad, simply revert to current
+ }
+ currentConfigStr += "\t\tCachingType:\t\t" + TradeConfig.cachingTypeNames[TradeConfig.cachingType] + "\n";
+
+ String parm = req.getParameter("SOAP_URL");
+ if ((parm != null) && (parm.length() > 0))
+ {
+ if (!TradeConfig.getSoapURL().equals(parm)) {
+ TradeConfig.setSoapURL(parm);
+ }
+ }
+ else
+ {
+ TradeConfig.setSoapURL(null);
+ }
+
+ parm = req.getParameter("MaxUsers");
+ if ((parm != null) && (parm.length() > 0))
+ {
+ try
+ {
+ TradeConfig.setMAX_USERS(Integer.parseInt(parm));
+ }
+ catch (Exception e)
+ {
+ Log.error(
+ e,
+ "TradeConfigServlet.doConfigUpdate(..): minor exception caught",
+ "Setting maxusers, probably error parsing string to int:" + parm,
+ "revertying to current value: " + TradeConfig.getMAX_USERS());
+
+ } //On error, revert to saved
+ }
+ parm = req.getParameter("MaxQuotes");
+ if ((parm != null) && (parm.length() > 0))
+ {
+ try
+ {
+ TradeConfig.setMAX_QUOTES(Integer.parseInt(parm));
+ }
+ catch (Exception e)
+ {
+ //>>rjm
+ Log.error(
+ e,
+ "TradeConfigServlet: minor exception caught",
+ "trying to set max_quotes, error on parsing int " + parm,
+ "reverting to current value " + TradeConfig.getMAX_QUOTES());
+ //<<rjm
+
+ } //On error, revert to saved
+ }
+ currentConfigStr += "\t\t#Trade Users:\t\t" + TradeConfig.getMAX_USERS() + "\n";
+ currentConfigStr += "\t\t#Trade Quotes:\t\t" + TradeConfig.getMAX_QUOTES() + "\n";
+
+ parm = req.getParameter("marketSummaryInterval");
+ if ((parm != null) && (parm.length() > 0)) {
+ try {
+ TradeConfig.setMarketSummaryInterval(Integer.parseInt(parm));
+ }
+ catch (Exception e) {
+ Log.error(
+ e,
+ "TradeConfigServlet: minor exception caught",
+ "trying to set marketSummaryInterval, error on parsing int " + parm,
+ "reverting to current value " + TradeConfig.getMarketSummaryInterval());
+
+ }
+ }
+ currentConfigStr += "\t\tMarket Summary Interval:\t\t" + TradeConfig.getMarketSummaryInterval() + "\n";
+
+ parm = req.getParameter("primIterations");
+ if ((parm != null) && (parm.length() > 0)) {
+ try {
+ TradeConfig.setPrimIterations(Integer.parseInt(parm));
+ }
+ catch (Exception e) {
+ Log.error(
+ e,
+ "TradeConfigServlet: minor exception caught",
+ "trying to set primIterations, error on parsing int " + parm,
+ "reverting to current value " + TradeConfig.getPrimIterations());
+
+ }
+ }
+ currentConfigStr += "\t\tPrimitive Iterations:\t\t" + TradeConfig.getPrimIterations() + "\n";
+
+ String enablePublishQuotePriceChange = req.getParameter("EnablePublishQuotePriceChange");
+
+ if (enablePublishQuotePriceChange != null)
+ TradeConfig.setPublishQuotePriceChange(true);
+ else
+ TradeConfig.setPublishQuotePriceChange(false);
+ currentConfigStr += "\t\tTradeStreamer MDB Enabled:\t" + TradeConfig.getPublishQuotePriceChange() + "\n";
+
+ String enableTrace = req.getParameter("EnableTrace");
+ if (enableTrace != null)
+ Log.setTrace(true);
+ else
+ Log.setTrace(false);
+ String enableActionTrace = req.getParameter("EnableActionTrace");
+ if (enableActionTrace != null)
+ Log.setActionTrace(true);
+ else
+ Log.setActionTrace(false);
+
+ String enableLongRun = req.getParameter("EnableLongRun");
+
+ if (enableLongRun != null)
+ TradeConfig.setLongRun(true);
+ else
+ TradeConfig.setLongRun(false);
+ currentConfigStr += "\t\tLong Run Enabled:\t\t" + TradeConfig.getLongRun() + "\n";
+
+
+ System.out.println(currentConfigStr);
+
+ }
+
+ public void service(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ String action = null;
+ String result = "";
+
+ resp.setContentType("text/html");
+ try
+ {
+ action = req.getParameter("action");
+ if (action == null)
+ {
+ doConfigDisplay(req, resp, result + "<b><br>Current DayTrader Configuration:</br></b>");
+ return;
+ }
+ else if (action.equals("updateConfig"))
+ {
+ doConfigUpdate(req, resp);
+ result = "<B><BR>DayTrader Configuration Updated</BR></B>";
+ }
+ else if (action.equals("resetTrade"))
+ {
+ doResetTrade(req, resp, "");
+ return;
+ }
+ else if (action.equals("buildDB"))
+ {
+ resp.setContentType("text/html");
+ new TradeBuildDB(resp.getWriter(), null);
+ result = "DayTrader Database Built - " + TradeConfig.getMAX_USERS() + "users created";
+ }
+ else if (action.equals("buildDBTables"))
+ {
+ resp.setContentType("text/html");
+ new TradeBuildDB(resp.getWriter(), getServletConfig().getServletContext().getRealPath("/"));
+ }
+ doConfigDisplay(req, resp, result + "Current DayTrader Configuration:");
+ }
+ catch (Exception e)
+ {
+ Log.error(
+ e,
+ "TradeConfigServlet.service(...)",
+ "Exception trying to perform action=" + action);
+
+ resp.sendError(
+ 500,
+ "TradeConfigServlet.service(...)"
+ + "Exception trying to perform action="
+ + action
+ + "\nException details: " + e.toString());
+
+ }
+ }
+}