You are viewing a plain text version of this content. The canonical link for it is here.
Posted to stonehenge-commits@incubator.apache.org by sh...@apache.org on 2009/04/22 04:39:05 UTC
svn commit: r767366 [2/2] - in /incubator/stonehenge/trunk/stocktrader/wsas:
./ business_service/ business_service/resources/META-INF/
business_service/src/org/apache/stocktrader/
business_service/src/org/apache/stonehenge/ business_service/src/org/apa...
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLCustomerDAO.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLCustomerDAO.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLCustomerDAO.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLCustomerDAO.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,643 @@
+/*
+ * 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.stonehenge.stocktrader.mssql;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.CustomAccountBean;
+import org.apache.stonehenge.stocktrader.CustomAccountProfileBean;
+import org.apache.stonehenge.stocktrader.CustomHoldingBean;
+import org.apache.stonehenge.stocktrader.CustomOrderBean;
+import org.apache.stonehenge.stocktrader.dal.CustomerDAO;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+import org.apache.stonehenge.stocktrader.util.StockTraderUtility;
+
+public class MSSQLCustomerDAO extends AbstractMSSQLDAO implements CustomerDAO {
+ private static final Log logger = LogFactory.getLog(MSSQLCustomerDAO.class);
+
+ private static final String SQL_DEBIT_ACCOUNT = "UPDATE dbo.ACCOUNT WITH (ROWLOCK) SET BALANCE=(BALANCE-?) WHERE ACCOUNTID=?";
+ private static final String SQL_SELECT_HOLDING_LOCK = "Set NOCOUNT ON; SELECT dbo.HOLDING.ACCOUNT_ACCOUNTID, HOLDING.HOLDINGID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL FROM dbo.HOLDING WITH (ROWLOCK) INNER JOIN ORDERS ON HOLDING.HOLDINGID = ORDERS.HOLDING_HOLDINGID WHERE (ORDERS.ORDERID = ?)";
+ private static final String SQL_SELECT_HOLDING_NOLOCK = "Set NOCOUNT ON; SELECT HOLDING.ACCOUNT_ACCOUNTID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL FROM HOLDING WITH(NOLOCK) WHERE HOLDING.HOLDINGID=? AND HOLDING.ACCOUNT_ACCOUNTID = (SELECT ACCOUNTID FROM dbo.ACCOUNT WHERE PROFILE_USERID = ?)";
+ private static final String SQL_SELECT_CUSTOMER_PROFILE_BY_USERID = "Set NOCOUNT ON; SELECT accountprofile.USERID, accountprofile.PASSWORD, accountprofile.FULLNAME, accountprofile.ADDRESS, accountprofile.EMAIL, accountprofile.CREDITCARD FROM dbo.accountprofile WITH (NOLOCK) WHERE accountprofile.USERID = ?";
+ private static final String SQL_UPDATE_CUSTOMER_LOGIN = "UPDATE dbo.account WITH (ROWLOCK) SET LOGINCOUNT = (LOGINCOUNT + 1), LASTLOGIN = CURRENT_TIMESTAMP where PROFILE_USERID = ?";
+ private static final String SQL_SELECT_CUSTOMER_LOGIN = "SELECT account.ACCOUNTID, account.CREATIONDATE, account.OPENBALANCE, account.LOGOUTCOUNT, account.BALANCE, account.LASTLOGIN, account.LOGINCOUNT FROM dbo.account WITH (ROWLOCK) WHERE account.PROFILE_USERID = ?";
+ private static final String SQL_UPDATE_LOGOUT = "UPDATE dbo.account WITH (ROWLOCK) SET LOGOUTCOUNT = (LOGOUTCOUNT + 1) where PROFILE_USERID= ?";
+ private static final String SQL_SELECT_GET_CUSTOMER_BY_USERID = "Set NOCOUNT ON; SELECT account.ACCOUNTID, account.PROFILE_USERID, account.CREATIONDATE, account.OPENBALANCE, account.LOGOUTCOUNT, account.BALANCE, account.LASTLOGIN, account.LOGINCOUNT FROM account WHERE account.PROFILE_USERID = ?";
+ private static final String SQL_SELECT_ORDERS_BY_ID = " o.ORDERID, o.ORDERTYPE, o.ORDERSTATUS, o.OPENDATE, o.COMPLETIONDATE, o.QUANTITY, o.PRICE, o.ORDERFEE, o.QUOTE_SYMBOL from dbo.orders o where o.account_accountid = (select a.accountid from dbo.account a WITH (NOLOCK) where a.profile_userid = ?) ORDER BY o.ORDERID DESC";
+ private static final String SQL_SELECT_CLOSED_ORDERS = "Set NOCOUNT ON; SELECT ORDERID, ORDERTYPE, ORDERSTATUS, COMPLETIONDATE, OPENDATE, QUANTITY, PRICE, ORDERFEE, QUOTE_SYMBOL FROM dbo.orders WHERE ACCOUNT_ACCOUNTID = (select accountid from dbo.account WITH(NOLOCK) where profile_userid = ?) AND ORDERSTATUS = 'closed'";
+ private static final String SQL_UPDATE_CLOSED_ORDERS = "UPDATE dbo.orders SET ORDERSTATUS = 'completed' where ORDERSTATUS = 'closed' AND ACCOUNT_ACCOUNTID = (select accountid from dbo.account WITH (NOLOCK) where profile_userid = ?)";
+ private static final String SQL_INSERT_ACCOUNT_PROFILE = "INSERT INTO dbo.accountprofile VALUES (?, ?, ?, ?, ?, ?)";
+ private static final String SQL_INSERT_ACCOUNT = "INSERT INTO dbo.account (CREATIONDATE, OPENBALANCE, LOGOUTCOUNT, BALANCE, LASTLOGIN, LOGINCOUNT, PROFILE_USERID) VALUES (GetDate(), ?, ?, ?, ?, ?, ?); SELECT ID=@@IDENTITY";
+ private static final String SQL_UPDATE_ACCOUNT_PROFILE = "UPDATE dbo.accountprofile WITH (ROWLOCK) SET ADDRESS=?, PASSWORD=?, EMAIL=?, CREDITCARD=?, FULLNAME=? WHERE USERID=?";
+ private static final String SQL_SELECT_HOLDINGS = "SELECT HOLDING.HOLDINGID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL,HOLDING.ACCOUNT_ACCOUNTID from dbo.holding WHERE HOLDING.ACCOUNT_ACCOUNTID = (SELECT ACCOUNTID FROM ACCOUNT WHERE PROFILE_USERID = ?) ORDER BY HOLDING.HOLDINGID DESC";
+
+ public MSSQLCustomerDAO(Connection sqlConnection) throws DAOException {
+ super(sqlConnection);
+ }
+
+ public CustomHoldingBean getHoldingForUpdate(int orderId)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger
+ .debug("MSSQLCustomerDAO.getHoldingForUpdate(int)\nOrder ID :"
+ + orderId);
+ }
+
+ CustomHoldingBean holding = null;
+ PreparedStatement selectHoldingLockStat = null;
+ try {
+ selectHoldingLockStat = sqlConnection
+ .prepareStatement(SQL_SELECT_HOLDING_LOCK);
+ selectHoldingLockStat.setInt(1, orderId);
+ ResultSet rs = selectHoldingLockStat.executeQuery();
+ if (rs.next()) {
+ try {
+ holding = new CustomHoldingBean(
+ rs.getInt(1),
+ rs.getInt(2),
+ rs.getDouble(3),
+ rs.getBigDecimal(4),
+ StockTraderUtility.convertToCalendar(rs.getDate(5)),
+ rs.getString(6));
+ return holding;
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException(
+ "Exception is thrown when selecting the holding entry for order ID :"
+ + orderId, e);
+ } finally {
+ if (selectHoldingLockStat != null) {
+ try {
+ selectHoldingLockStat.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return holding;
+ }
+
+ public CustomHoldingBean getHolding(String userId, int holdingID)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("MSSQLCustomerDAO.getHolding(String,int)\nUserID :"
+ + userId + "\nOrder ID :" + holdingID);
+ }
+ CustomHoldingBean holding = null;
+ PreparedStatement selectHoldingNoLockStat = null;
+ try {
+ selectHoldingNoLockStat = sqlConnection
+ .prepareStatement(SQL_SELECT_HOLDING_NOLOCK);
+ selectHoldingNoLockStat.setInt(0, holdingID);
+ selectHoldingNoLockStat.setString(1, userId);
+
+ ResultSet rs = selectHoldingNoLockStat.executeQuery();
+ if (rs.next()) {
+ try {
+ holding = new CustomHoldingBean(
+ rs.getInt(1),
+ rs.getInt(2),
+ rs.getDouble(3),
+ rs.getBigDecimal(4),
+ StockTraderUtility.convertToCalendar(rs.getDate(5)),
+ rs.getString(6));
+ return holding;
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ logger.debug("", e);
+ throw new DAOException(
+ "Exception is thrown when selecting the holding entry for userID :"
+ + userId + " and orderID :" + holdingID, e);
+
+ } finally {
+ if (selectHoldingNoLockStat != null) {
+ try {
+ selectHoldingNoLockStat.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return holding;
+ }
+
+ public void updateAccountBalance(int accountId, BigDecimal total)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger
+ .debug("MSSQLCustomerDAO.updateAccoutBalance(int,BigDecimal)\n Account ID :"
+ + accountId + "\nTotal :" + total);
+ }
+ PreparedStatement debitAccountStat = null;
+ try {
+ debitAccountStat = sqlConnection
+ .prepareStatement(SQL_DEBIT_ACCOUNT);
+ debitAccountStat.setBigDecimal(1, total);
+ debitAccountStat.setInt(2, accountId);
+ debitAccountStat.executeUpdate();
+
+ } catch (SQLException e) {
+ throw new DAOException(
+ "Excpetion is thrown when updating the account balance for accountID :"
+ + accountId + " total :" + total, e);
+ } finally {
+ if (debitAccountStat != null) {
+ try {
+ debitAccountStat.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public CustomAccountBean login(String userId, String password)
+ throws DAOException {
+ PreparedStatement selectCustomerProfileByUserId = null;
+ PreparedStatement updateCustomerLogin = null;
+ PreparedStatement selectCustomerLogin = null;
+ try {
+ selectCustomerProfileByUserId = sqlConnection
+ .prepareStatement(SQL_SELECT_CUSTOMER_PROFILE_BY_USERID);
+ selectCustomerProfileByUserId.setString(1, userId);
+ ResultSet customerProfileRS = selectCustomerProfileByUserId
+ .executeQuery();
+ if (customerProfileRS.next()) {
+ try {
+ String userPassword = customerProfileRS.getString(2);
+ if (userPassword.equals(password)) {
+ try {
+ updateCustomerLogin = sqlConnection
+ .prepareStatement(SQL_UPDATE_CUSTOMER_LOGIN);
+ updateCustomerLogin.setString(1, userId);
+ updateCustomerLogin.executeUpdate();
+ selectCustomerLogin = sqlConnection
+ .prepareStatement(SQL_SELECT_CUSTOMER_LOGIN);
+ selectCustomerLogin.setString(1, userId);
+ ResultSet rs = selectCustomerLogin.executeQuery();
+ if (rs.next()) {
+ try {
+ CustomAccountBean accountData = new CustomAccountBean(
+ rs.getInt(1), userId,
+ StockTraderUtility
+ .convertToCalendar(rs
+ .getDate(2)), rs
+ .getBigDecimal(3), rs
+ .getInt(4), rs
+ .getBigDecimal(5),
+ StockTraderUtility
+ .convertToCalendar(rs
+ .getDate(6)), rs
+ .getInt(7) + 1);
+ return accountData;
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (updateCustomerLogin != null) {
+ try {
+ updateCustomerLogin.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ if (selectCustomerLogin != null) {
+ try {
+ selectCustomerLogin.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+ } finally {
+ try {
+ customerProfileRS.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (selectCustomerProfileByUserId != null) {
+ try {
+ selectCustomerProfileByUserId.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return null;
+ }
+
+ public void logoutUser(String userId) throws DAOException {
+ PreparedStatement updateLogout = null;
+ try {
+ updateLogout = sqlConnection.prepareStatement(SQL_UPDATE_LOGOUT);
+ updateLogout.setString(1, userId);
+ updateLogout.executeUpdate();
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (updateLogout != null) {
+ try {
+ updateLogout.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public CustomAccountBean getCustomerByUserId(String userId)
+ throws DAOException {
+ PreparedStatement getCustomerByUserId = null;
+
+ try {
+ getCustomerByUserId = sqlConnection
+ .prepareStatement(SQL_SELECT_GET_CUSTOMER_BY_USERID);
+ getCustomerByUserId.setString(1, userId);
+ ResultSet rs = getCustomerByUserId.executeQuery();
+ if (rs.next()) {
+ try {
+ CustomAccountBean bean = new CustomAccountBean(
+ rs.getInt(1), rs.getString(2), StockTraderUtility
+ .convertToCalendar(rs.getDate(3)), rs
+ .getBigDecimal(4), rs.getInt(5), rs
+ .getBigDecimal(6), StockTraderUtility
+ .convertToCalendar(rs.getDate(7)), rs
+ .getInt(8));
+ return bean;
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (getCustomerByUserId != null) {
+ try {
+ getCustomerByUserId.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return null;
+ }
+
+ public CustomAccountProfileBean getAccountProfileData(String userId)
+ throws DAOException {
+
+ PreparedStatement customerProfileByUserId = null;
+ try {
+ customerProfileByUserId = sqlConnection
+ .prepareStatement(SQL_SELECT_CUSTOMER_PROFILE_BY_USERID);
+ customerProfileByUserId.setString(1, userId);
+ ResultSet rs = customerProfileByUserId.executeQuery();
+ if (rs.next()) {
+ try {
+ CustomAccountProfileBean accountProfileDataBean = new CustomAccountProfileBean(
+ rs.getString(1), rs.getString(2), rs.getString(3),
+ rs.getString(4), rs.getString(5), rs.getString(6));
+ return accountProfileDataBean;
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (customerProfileByUserId != null) {
+ try {
+ customerProfileByUserId.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return null;
+ }
+
+ public List<CustomOrderBean> getOrders(String userId, boolean top,
+ int maxTop, int maxDefault) throws DAOException {
+ PreparedStatement selectOrdersById = null;
+ try {
+ String sqlQuery;
+ if (top) {
+ sqlQuery = "Select Top " + maxTop + SQL_SELECT_ORDERS_BY_ID;
+ } else {
+ sqlQuery = "Select Top " + maxDefault + SQL_SELECT_ORDERS_BY_ID;
+ }
+ selectOrdersById = sqlConnection.prepareStatement(sqlQuery);
+ selectOrdersById.setString(1, userId);
+ ResultSet rs = selectOrdersById.executeQuery();
+ List<CustomOrderBean> orders = new ArrayList<CustomOrderBean>();
+
+ try {
+ while (rs.next()) {
+ int orderId = rs.getInt(1);
+ Calendar openDate = StockTraderUtility.convertToCalendar(rs
+ .getDate(4));
+ Calendar completionDate = null;
+ try {
+ if (rs.getDate(5) != null) {
+ completionDate = StockTraderUtility
+ .convertToCalendar(rs.getDate(5));
+ } else {
+ completionDate = Calendar.getInstance();
+ completionDate.setTimeInMillis(0);
+ }
+ } catch (SQLException e) {
+ logger.debug("", e);
+ completionDate = Calendar.getInstance();
+ completionDate.setTimeInMillis(0);
+ }
+
+ CustomOrderBean orderBean = new CustomOrderBean(orderId, rs
+ .getString(2), rs.getString(3), openDate,
+ completionDate, rs.getDouble(6), rs
+ .getBigDecimal(7), rs.getBigDecimal(8), rs
+ .getString(9));
+ orders.add(orderBean);
+ }
+
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ return orders;
+
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (selectOrdersById != null) {
+ try {
+ selectOrdersById.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public List<CustomOrderBean> getClosedOrders(String userId)
+ throws DAOException {
+ PreparedStatement selectClosedOrders = null;
+ PreparedStatement updateClosedOrders = null;
+ try {
+ selectClosedOrders = sqlConnection
+ .prepareStatement(SQL_SELECT_CLOSED_ORDERS);
+ selectClosedOrders.setString(1, userId);
+ ResultSet rs = selectClosedOrders.executeQuery();
+ List<CustomOrderBean> closedOrders = new ArrayList<CustomOrderBean>();
+
+ try {
+ while (rs.next()) {
+ int orderId = rs.getInt(1);
+ Calendar openDate = StockTraderUtility.convertToCalendar(rs
+ .getDate(4));
+ Calendar completionDate = null;
+ try {
+ completionDate = StockTraderUtility
+ .convertToCalendar(rs.getDate(5));
+ } catch (SQLException e) {
+ logger.debug("", e);
+ completionDate = Calendar.getInstance();
+ completionDate.setTimeInMillis(0);
+ }
+ CustomOrderBean closedOrderBean = new CustomOrderBean(
+ orderId, rs.getString(2), rs.getString(3),
+ openDate, completionDate, rs.getDouble(6), rs
+ .getBigDecimal(7), rs.getBigDecimal(8), rs
+ .getString(9));
+ closedOrderBean
+ .setOrderStatus(StockTraderUtility.ORDER_STATUS_CLOSED);
+ closedOrders.add(closedOrderBean);
+ }
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+
+ if (!closedOrders.isEmpty()) {
+ updateClosedOrders = sqlConnection
+ .prepareStatement(SQL_UPDATE_CLOSED_ORDERS);
+ updateClosedOrders.setString(1, userId);
+ updateClosedOrders.executeUpdate();
+ }
+
+ return closedOrders;
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (selectClosedOrders != null) {
+ try {
+ selectClosedOrders.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ if (updateClosedOrders != null) {
+ try {
+ selectClosedOrders.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+
+ }
+ }
+
+ public void insertAccountProfile(CustomAccountProfileBean accountProfileBean)
+ throws DAOException {
+ PreparedStatement insertAccountProfile = null;
+ try {
+ insertAccountProfile = sqlConnection
+ .prepareStatement(SQL_INSERT_ACCOUNT_PROFILE);
+ insertAccountProfile.setString(1, accountProfileBean.getAddress());
+ insertAccountProfile.setString(2, accountProfileBean.getPassword());
+ insertAccountProfile.setString(3, accountProfileBean.getUserID());
+ insertAccountProfile.setString(4, accountProfileBean.getEmail());
+ insertAccountProfile.setString(5, accountProfileBean
+ .getCreditCard());
+ insertAccountProfile.setString(6, accountProfileBean.getFullName());
+ insertAccountProfile.executeUpdate();
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (insertAccountProfile != null) {
+ try {
+ insertAccountProfile.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public void insertAccount(CustomAccountBean accountBean)
+ throws DAOException {
+ PreparedStatement insertAccount = null;
+ try {
+ insertAccount = sqlConnection.prepareStatement(SQL_INSERT_ACCOUNT);
+ insertAccount.setBigDecimal(1, accountBean.getOpenBalance());
+ insertAccount.setInt(2, accountBean.getLogoutCount());
+ insertAccount.setBigDecimal(3, accountBean.getBalance());
+ insertAccount.setDate(4, StockTraderUtility
+ .convertToSqlDate(accountBean.getLastLogin()));
+ insertAccount.setInt(5, accountBean.getLoginCount());
+ insertAccount.setString(6, accountBean.getUserID());
+ insertAccount.executeUpdate();
+
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+
+ } finally {
+ if (insertAccount != null) {
+ try {
+ insertAccount.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public CustomAccountProfileBean update(
+ CustomAccountProfileBean customerAccountProfile)
+ throws DAOException {
+ PreparedStatement updateAccountProfile = null;
+ try {
+ updateAccountProfile = sqlConnection
+ .prepareStatement(SQL_UPDATE_ACCOUNT_PROFILE);
+ updateAccountProfile.setString(1, customerAccountProfile
+ .getAddress());
+ updateAccountProfile.setString(2, customerAccountProfile
+ .getPassword());
+ updateAccountProfile
+ .setString(3, customerAccountProfile.getEmail());
+ updateAccountProfile.setString(4, customerAccountProfile
+ .getCreditCard());
+ updateAccountProfile.setString(5, customerAccountProfile
+ .getFullName());
+ updateAccountProfile.setString(6, customerAccountProfile
+ .getUserID());
+ updateAccountProfile.executeUpdate();
+ return customerAccountProfile;
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (updateAccountProfile != null) {
+ try {
+ updateAccountProfile.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public List<CustomHoldingBean> getHoldings(String userID)
+ throws DAOException {
+ PreparedStatement selectHoldings = null;
+ try {
+ selectHoldings = sqlConnection
+ .prepareStatement(SQL_SELECT_HOLDINGS);
+ selectHoldings.setString(1, userID);
+ ResultSet rs = selectHoldings.executeQuery();
+ List<CustomHoldingBean> holdings = new ArrayList<CustomHoldingBean>();
+ try {
+ while (rs.next()) {
+ CustomHoldingBean holding = new CustomHoldingBean(
+ rs.getInt(1),
+ rs.getDouble(2),
+ rs.getBigDecimal(3),
+ StockTraderUtility.convertToCalendar(rs.getDate(4)),
+ rs.getString(5), rs.getInt(6));
+ holdings.add(holding);
+ }
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ return holdings;
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (selectHoldings != null) {
+ try {
+ selectHoldings.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLDAOFactory.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLDAOFactory.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLDAOFactory.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLDAOFactory.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,165 @@
+/*
+ * 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.stonehenge.stocktrader.mssql;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.dal.CustomerDAO;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+import org.apache.stonehenge.stocktrader.dal.DAOFactory;
+import org.apache.stonehenge.stocktrader.dal.MarketSummaryDAO;
+import org.apache.stonehenge.stocktrader.dal.OrderDAO;
+import org.apache.stonehenge.stocktrader.util.StockTraderUtility;
+
+public class MSSQLDAOFactory extends DAOFactory {
+ public static final String PROP_MSSQL_DB_HOST = "org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.host";
+ public static final String PROP_MSSQL_DB_PORT = "org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.port";
+ public static final String PROP_MSSQL_DB_NAME = "org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.db";
+ public static final String PROP_MSSQL_DB_USER = "org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.user";
+ public static final String PROP_MSSQL_PASSWORD = "org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.password";
+
+ private static Log logger = LogFactory.getLog(MSSQLDAOFactory.class);
+ private static MSSQLDAOFactory self = null;
+
+ private Properties prop = null;
+ private Connection sqlConnection = null;
+
+ private String connection = null;
+
+ static {
+ try {
+ Class.forName("net.sourceforge.jtds.jdbc.Driver");
+ } catch (ClassNotFoundException e) {
+ logger.warn("Unable to load DBDrive class", e);
+ }
+ }
+
+ public static DAOFactory getInstance() {
+ if (self == null) {
+ self = new MSSQLDAOFactory();
+ }
+ return self;
+ }
+
+ private MSSQLDAOFactory() {
+ }
+
+ public OrderDAO getOrderDAO() throws DAOException {
+ logger.debug("MSSQLDAOFactory.getOrderDAO");
+ try {
+ OrderDAO orderDAO = new MSSQLOrderDAO(getConnection());
+ return orderDAO;
+ } catch (SQLException e) {
+ logger.debug("", e);
+ throw new DAOException(
+ "Exception was thrown when instantiating MSSQLOrderDAO object",
+ e);
+ }
+ }
+
+ public CustomerDAO getCustomerDAO() throws DAOException {
+ logger.debug("MSSQLDAOFactory.getOrderDAO");
+ try {
+ CustomerDAO customerDAO = new MSSQLCustomerDAO(getConnection());
+ return customerDAO;
+ } catch (SQLException e) {
+ logger.debug("", e);
+ throw new DAOException(
+ "Exception was thrown when instantiating a MSSQLCustomerDAO",
+ e);
+ }
+ }
+
+ public MarketSummaryDAO getMarketSummaryDAO() throws DAOException {
+ logger.debug("MSSQLDAOFactory.getOrderDAO");
+ try {
+ MarketSummaryDAO marketSummaryDAO = new MSSQLMarketSummaryDAO(
+ getConnection());
+ return marketSummaryDAO;
+ } catch (SQLException e) {
+ logger.debug("", e);
+ throw new DAOException(
+ "Exception was thrown when instantiating a MarketSummaryDAO",
+ e);
+ }
+ }
+
+ private String getConnectionString() {
+ if (connection == null) {
+ prop = new Properties();
+ MessageContext messageContext = MessageContext
+ .getCurrentMessageContext();
+ if (messageContext != null) {
+ AxisService service = messageContext.getAxisService();
+ ClassLoader serviceClassLoader = service.getClassLoader();
+ InputStream is = serviceClassLoader
+ .getResourceAsStream(StockTraderUtility.MSSQL_DB_PROPERRTIES_FILE);
+ if (is != null) {
+ try {
+ prop.load(is);
+ } catch (IOException e) {
+ logger
+ .debug(
+ "Unable to load mssql-db properties file and using [jdbc:jtds:sqlserver://highlander:1433/StockTraderDB;user=trade;password=trade;] as the default connection",
+ e);
+ }
+ } else {
+ logger
+ .debug("Unable to load mssql-db properties file and using [jdbc:jtds:sqlserver://highlander:1433/StockTraderDB;user=trade;password=trade;] as the default connection");
+
+ }
+ }
+
+ if (prop == null) {
+ connection = "jdbc:jtds:sqlserver://highlander:1433/StockTraderDB;user=trade;password=trade";
+ } else {
+ StringBuffer buf = new StringBuffer();
+ buf.append("jdbc:jtds:sqlserver://");
+ buf.append(prop.getProperty(PROP_MSSQL_DB_HOST));
+ buf.append(":" + prop.getProperty(PROP_MSSQL_DB_PORT));
+ buf.append("/" + prop.getProperty(PROP_MSSQL_DB_NAME));
+ buf.append(";user=" + prop.getProperty(PROP_MSSQL_DB_USER));
+ buf.append(";password=" + prop.getProperty(PROP_MSSQL_PASSWORD));
+ buf.append(";");
+ connection = buf.toString();
+ }
+ }
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("MSSQLDAOFactory.getConnectionString()\nConnection :"
+ + connection);
+ }
+ return connection;
+ }
+
+ private Connection getConnection() throws SQLException {
+ if (sqlConnection == null || sqlConnection.isClosed()) {
+ sqlConnection = DriverManager.getConnection(getConnectionString());
+ }
+ return sqlConnection;
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLMarketSummaryDAO.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLMarketSummaryDAO.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLMarketSummaryDAO.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLMarketSummaryDAO.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,260 @@
+/*
+ * 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.stonehenge.stocktrader.mssql;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.CustomMarketSummaryBean;
+import org.apache.stonehenge.stocktrader.CustomQuoteBean;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+import org.apache.stonehenge.stocktrader.dal.MarketSummaryDAO;
+import org.apache.stonehenge.stocktrader.util.StockTraderSQLUtil;
+import org.apache.stonehenge.stocktrader.util.StockTraderUtility;
+
+public class MSSQLMarketSummaryDAO extends AbstractMSSQLDAO implements
+ MarketSummaryDAO {
+ private static final Log logger = LogFactory
+ .getLog(MSSQLMarketSummaryDAO.class);
+
+ private static final String SQL_SELECT_QUOTE = "Set NOCOUNT ON; SELECT symbol, companyname, volume, price, open1, low, high, change1 from dbo.quote with (ROWLOCK) where symbol = ?";
+ private static final String SQL_SELECT_QUOTE_NOLOCK = "Set NOCOUNT ON; SELECT symbol, companyname, volume, price, open1, low, high, change1 from dbo.quote with (NOLOCK) where symbol = ?";
+ private static final String SQL_UPDATE_STOCKPRICEVOLUME = "UPDATE dbo.QUOTE WITH (ROWLOCK) SET PRICE=?, Low=?, High=?, Change1=?-open1, VOLUME=VOLUME+? WHERE SYMBOL=?";
+
+ private static final String SQL_SELECT_MARKETSUMMARY_GAINERS = "Set NOCOUNT ON; SELECT symbol, companyname, volume, price, open1, low, high, change1 from dbo.quote with (NOLOCK) where symbol like 's:1__' order by change1 desc";
+ private static final String SQL_SELECT_MARKETSUMMARY_LOSERS = "Set NOCOUNT ON; SELECT symbol, companyname, volume, price, open1, low, high, change1 from dbo.quote with (NOLOCK) where symbol like 's:1__' order by change1";
+ private static final String SQL_SELECT_MARKETSUMMARY_TSIA = "Set NOCOUNT ON; select SUM(price)/count(*) as TSIA from dbo.quote where symbol like 's:1__'";
+ private static final String SQL_SELECT_MARKETSUMMARY_OPENTSIA = "Set NOCOUNT ON; select SUM(open1)/count(*) as openTSIA from dbo.quote where symbol like 's:1__'";
+ private static final String SQL_SELECT_MARKETSUMMARY_VOLUME = "Set NOCOUNT ON; SELECT SUM(volume) from dbo.quote where symbol like 's:1__'";
+
+ public MSSQLMarketSummaryDAO(Connection sqlConnection) throws DAOException {
+ super(sqlConnection);
+ }
+
+ public CustomQuoteBean getQuote(String symbol) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("MarketSummaryDAO.getQouteForUpdate(String)\nSymbol :"
+ + symbol);
+ }
+ PreparedStatement selectQuote = null;
+ try {
+ selectQuote = sqlConnection
+ .prepareStatement(SQL_SELECT_QUOTE_NOLOCK);
+ selectQuote.setString(1, symbol);
+ ResultSet rs = selectQuote.executeQuery();
+
+ try {
+ CustomQuoteBean quote = null;
+ if (rs.next()) {
+ quote = new CustomQuoteBean(rs.getString(1), rs
+ .getString(2), rs.getDouble(3),
+ rs.getBigDecimal(4), rs.getBigDecimal(5), rs
+ .getBigDecimal(6), rs.getBigDecimal(7), rs
+ .getDouble(8));
+ }
+ return quote;
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ try {
+ if (selectQuote != null) {
+ selectQuote.close();
+ }
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+
+ public CustomQuoteBean getQuoteForUpdate(String symbol) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("MarketSummaryDAO.getQouteForUpdate(String)\nSymbol :"
+ + symbol);
+ }
+ PreparedStatement qouteForUpdateStat = null;
+ try {
+ qouteForUpdateStat = sqlConnection
+ .prepareStatement(SQL_SELECT_QUOTE);
+ CustomQuoteBean quote = null;
+
+ qouteForUpdateStat.setString(1, symbol);
+ ResultSet rs = qouteForUpdateStat.executeQuery();
+
+ if (rs.next()) {
+ quote = new CustomQuoteBean(rs.getString(1), rs.getString(2),
+ rs.getDouble(3), rs.getBigDecimal(4), rs
+ .getBigDecimal(5), rs.getBigDecimal(6), rs
+ .getBigDecimal(7), rs.getDouble(8));
+
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ return quote;
+ } else {
+ throw new DAOException("No quote entry found");
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ try {
+ if (qouteForUpdateStat != null) {
+ qouteForUpdateStat.close();
+ }
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+
+ public void updateStockPriceVolume(double quantity, CustomQuoteBean quote)
+ throws DAOException {
+ BigDecimal priceChangeFactor = StockTraderUtility
+ .getRandomPriceChangeFactor(quote.getPrice());
+ BigDecimal newPrice = quote.getPrice().multiply(priceChangeFactor);
+
+ if (newPrice.compareTo(quote.getLow()) == -1) {
+ quote.setLow(newPrice);
+ }
+ if (newPrice.compareTo(quote.getHigh()) == 1) {
+ quote.setHigh(newPrice);
+ }
+
+ PreparedStatement updateStockPriceVolumeStat = null;
+ try {
+ updateStockPriceVolumeStat = sqlConnection
+ .prepareStatement(SQL_UPDATE_STOCKPRICEVOLUME);
+ updateStockPriceVolumeStat.setBigDecimal(1, newPrice);
+ updateStockPriceVolumeStat.setBigDecimal(2, quote.getLow());
+ updateStockPriceVolumeStat.setBigDecimal(3, quote.getHigh());
+ updateStockPriceVolumeStat.setBigDecimal(4, newPrice);
+ updateStockPriceVolumeStat.setFloat(5, (float) quantity);
+ updateStockPriceVolumeStat.setString(6, quote.getSymbol());
+ updateStockPriceVolumeStat.executeUpdate();
+
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ try {
+ if (updateStockPriceVolumeStat != null) {
+ updateStockPriceVolumeStat.close();
+ }
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+
+ public CustomMarketSummaryBean getCustomMarketSummary() throws DAOException {
+ BigDecimal tSIA = (BigDecimal) StockTraderSQLUtil.executeScalarNoParm(
+ SQL_SELECT_MARKETSUMMARY_TSIA, sqlConnection);
+ BigDecimal openTSIA = (BigDecimal) StockTraderSQLUtil
+ .executeScalarNoParm(SQL_SELECT_MARKETSUMMARY_OPENTSIA,
+ sqlConnection);
+ double totalVolume = ((Double) StockTraderSQLUtil.executeScalarNoParm(
+ SQL_SELECT_MARKETSUMMARY_VOLUME, sqlConnection)).doubleValue();
+
+ List<CustomQuoteBean> topGainers = new ArrayList<CustomQuoteBean>();
+ PreparedStatement gainers = null;
+ try {
+ gainers = sqlConnection
+ .prepareStatement(SQL_SELECT_MARKETSUMMARY_GAINERS);
+ ResultSet rs = gainers.executeQuery();
+
+ try {
+ for (int i = 0; rs.next() && i < 5; i++) {
+ CustomQuoteBean quote = new CustomQuoteBean(
+ rs.getString(1), rs.getString(2), rs.getDouble(3),
+ rs.getBigDecimal(4), rs.getBigDecimal(5), rs
+ .getBigDecimal(6), rs.getBigDecimal(7), rs
+ .getDouble(8));
+ topGainers.add(quote);
+ }
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (gainers != null) {
+ try {
+ gainers.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ List<CustomQuoteBean> topLosers = new ArrayList<CustomQuoteBean>();
+ PreparedStatement losers = null;
+ try {
+ losers = sqlConnection
+ .prepareStatement(SQL_SELECT_MARKETSUMMARY_LOSERS);
+ ResultSet rs = losers.executeQuery();
+
+ try {
+ for (int i = 0; rs.next() && i < 5; i++) {
+ CustomQuoteBean quote = new CustomQuoteBean(
+ rs.getString(1), rs.getString(2), rs.getDouble(3),
+ rs.getBigDecimal(4), rs.getBigDecimal(5), rs
+ .getBigDecimal(6), rs.getBigDecimal(7), rs
+ .getDouble(8));
+ topLosers.add(quote);
+ }
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (losers != null) {
+ try {
+ losers.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ CustomMarketSummaryBean marketSummary = new CustomMarketSummaryBean(
+ tSIA, openTSIA, totalVolume, topGainers, topLosers);
+ return marketSummary;
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLOrderDAO.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLOrderDAO.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLOrderDAO.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/mssql/MSSQLOrderDAO.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,448 @@
+/*
+ * 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.stonehenge.stocktrader.mssql;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Calendar;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.CustomHoldingBean;
+import org.apache.stonehenge.stocktrader.CustomOrderBean;
+import org.apache.stonehenge.stocktrader.CustomQuoteBean;
+import org.apache.stonehenge.stocktrader.dal.CustomerDAO;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+import org.apache.stonehenge.stocktrader.dal.DAOFactory;
+import org.apache.stonehenge.stocktrader.dal.MarketSummaryDAO;
+import org.apache.stonehenge.stocktrader.dal.OrderDAO;
+import org.apache.stonehenge.stocktrader.util.StockTraderUtility;
+
+public class MSSQLOrderDAO extends AbstractMSSQLDAO implements OrderDAO {
+ private static Log logger = LogFactory.getLog(MSSQLOrderDAO.class);
+
+ private static final String SQL_GET_ACCOUNTID_ORDER = "Set NOCOUNT ON; SELECT ACCOUNT_ACCOUNTID FROM dbo.ORDERS WITH (NOLOCK) WHERE ORDERID=?";
+ private static final String SQL_INSERT_HOLDING = "INSERT INTO dbo.HOLDING (PURCHASEPRICE, QUANTITY, PURCHASEDATE, ACCOUNT_ACCOUNTID, QUOTE_SYMBOL) VALUES (?, ?, ?, ?, ?); SELECT ID=@@IDENTITY";
+ private static final String SQL_UPDATE_HOLDING = "UPDATE dbo.HOLDING WITH (ROWLOCK) SET QUANTITY=QUANTITY-? WHERE HOLDINGID=?";
+ private static final String SQL_DELETE_HOLDING = "DELETE FROM dbo.HOLDING WITH (ROWLOCK) WHERE HOLDINGID=?";
+ private static final String SQL_SELECT_HOLDING = "SELECT HOLDING.HOLDINGID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL,HOLDING.ACCOUNT_ACCOUNTID FROM dbo.HOLDING WITH (NOLOCK) WHERE HOLDINGID= ?";
+ private static final String SQL_UPDATE_ORDER = "UPDATE dbo.ORDERS WITH (ROWLOCK) SET QUANTITY=? WHERE ORDERID=?";
+ private static final String SQL_CLOSE_ORDER = "UPDATE dbo.ORDERS WITH (ROWLOCK) SET ORDERSTATUS = ?, COMPLETIONDATE=GetDate(), HOLDING_HOLDINGID=?, PRICE=? WHERE ORDERID = ?";
+ private static final String SQL_GET_ACCOUNTID = "Set NOCOUNT ON; SELECT ACCOUNTID FROM dbo.ACCOUNT WITH (NOLOCK) WHERE PROFILE_USERID = ?";
+
+ // CHECKME
+ private static final String SQL_INSERT_ORDER = "INSERT INTO dbo.ORDERS (OPENDATE, ORDERFEE, PRICE, QUOTE_SYMBOL, QUANTITY, ORDERTYPE, ORDERSTATUS, ACCOUNT_ACCOUNTID, HOLDING_HOLDINGID) VALUES (GetDate(), ?, ?, ?, ?, ?, 'open', ?, ?)";
+ private static final String SQL_SELECT_ORDER_ID = "SELECT ID=@@IDENTITY FROM dbo.ORDERS WITH (NOLOCK) WHERE ORDERFEE=? AND PRICE=? AND QUOTE_SYMBOL=? AND QUANTITY=? AND ORDERTYPE=? AND ORDERSTATUS=? AND ACCOUNT_ACCOUNTID=? AND HOLDING_HOLDINGID=?";
+
+ public MSSQLOrderDAO(Connection sqlConnection) throws DAOException {
+ super(sqlConnection);
+ }
+
+ public CustomQuoteBean getQuoteForUpdate(String symbol) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("OrderDAO.getQuoteForUpdate()\nSymbol :" + symbol);
+ }
+
+ DAOFactory fac = MSSQLDAOFactory.getInstance();
+ MarketSummaryDAO marketSummaryDAO = fac.getMarketSummaryDAO();
+ return marketSummaryDAO.getQuoteForUpdate(symbol);
+ }
+
+ public int createHolding(CustomOrderBean order) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("OrderDAO.createHolding(OrderDataModel)\nOrderID :"
+ + order.getOrderID() + "\nOrderType :"
+ + order.getOrderType() + "\nSymbol :" + order.getSymbol()
+ + "\nQuantity :" + order.getQuantity() + "\nOrder Status :"
+ + order.getOrderStatus() + "\nOrder Open Date :"
+ + order.getOpenDate() + "\nCompletionDate :"
+ + order.getCompletionDate());
+ }
+
+ PreparedStatement getAccountIdStat = null;
+ int accountId = -1;
+
+ try {
+ getAccountIdStat = sqlConnection
+ .prepareStatement(SQL_GET_ACCOUNTID_ORDER);
+ getAccountIdStat.setInt(1, order.getOrderID());
+
+ ResultSet rs = getAccountIdStat.executeQuery();
+ if (rs.next()) {
+ accountId = Integer.parseInt(rs.getString(1));
+ order.setAccountId(accountId);
+ }
+
+ try {
+ rs.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ } catch (SQLException e) {
+ throw new DAOException(
+ "Exception is thrown when selecting the accountID from order entries where order ID :"
+ + order.getOrderID(), e);
+
+ } finally {
+ if (getAccountIdStat != null) {
+ try {
+ getAccountIdStat.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ }
+ }
+
+ if (accountId != -1) {
+ int holdingId = -1;
+ PreparedStatement insertHoldingStat = null;
+
+ try {
+ insertHoldingStat = sqlConnection
+ .prepareStatement(SQL_INSERT_HOLDING);
+ insertHoldingStat.setBigDecimal(1, order.getPrice());
+ // C# - insertHolding.setFloat(1, (float) order.getQuantity());
+ insertHoldingStat.setDouble(2, order.getQuantity());
+ Calendar openDate = (order.getOpenDate() != null) ? order
+ .getOpenDate() : Calendar.getInstance();
+ insertHoldingStat.setDate(3, StockTraderUtility
+ .convertToSqlDate(openDate));
+ insertHoldingStat.setInt(4, order.getAccountId());
+ insertHoldingStat.setString(5, order.getSymbol());
+
+ ResultSet rs = insertHoldingStat.executeQuery();
+ if (rs.next()) {
+ holdingId = rs.getInt(1);
+ }
+
+ try {
+ rs.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ return holdingId;
+
+ } catch (SQLException e) {
+ throw new DAOException(
+ "An exception is thrown during an insertion of a holding entry",
+ e);
+
+ } finally {
+ if (insertHoldingStat != null) {
+ try {
+ insertHoldingStat.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ public void updateHolding(int holdingId, double quantity)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("OrderDAO.updateHolding()\nHolding ID :" + holdingId
+ + "\nQuantity :" + quantity);
+ }
+
+ PreparedStatement updateHoldingStat = null;
+ try {
+ updateHoldingStat = sqlConnection
+ .prepareStatement(SQL_UPDATE_HOLDING);
+ updateHoldingStat.setDouble(1, quantity);
+ updateHoldingStat.setInt(2, holdingId);
+ updateHoldingStat.executeUpdate();
+
+ } catch (SQLException e) {
+ throw new DAOException(
+ "An exception is thrown during an updation of holding entry",
+ e);
+ } finally {
+ if (updateHoldingStat != null) {
+ try {
+ updateHoldingStat.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public void deleteHolding(int holdingId) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("OrderDAO.deleteHolding()\nHolding ID :" + holdingId);
+ }
+
+ PreparedStatement deleteHoldingStat = null;
+ try {
+ deleteHoldingStat = sqlConnection
+ .prepareStatement(SQL_DELETE_HOLDING);
+ deleteHoldingStat.setInt(1, holdingId);
+ deleteHoldingStat.execute();
+
+ } catch (SQLException e) {
+ throw new DAOException(
+ "An exception is thrown during deletion of a holding entry",
+ e);
+ } finally {
+ if (deleteHoldingStat != null) {
+ try {
+ deleteHoldingStat.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public CustomHoldingBean getHoldingForUpdate(int orderId)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("HoldingDataModel.getHoldingForUpdate()\nOrder ID :"
+ + orderId);
+ }
+ DAOFactory fac = MSSQLDAOFactory.getInstance();
+ CustomerDAO customerDAO = fac.getCustomerDAO();
+ return customerDAO.getHoldingForUpdate(orderId);
+ }
+
+ public CustomHoldingBean getHolding(int holdingId) throws DAOException {
+ CustomHoldingBean holding = null;
+ PreparedStatement selectHoldingStat = null;
+ try {
+ selectHoldingStat = sqlConnection
+ .prepareStatement(SQL_SELECT_HOLDING);
+ selectHoldingStat.setInt(1, holdingId);
+ ResultSet rs = selectHoldingStat.executeQuery();
+ if (rs.next()) {
+ try {
+ holding = new CustomHoldingBean(
+ rs.getInt(1),
+ rs.getDouble(2),
+ rs.getBigDecimal(3),
+ StockTraderUtility.convertToCalendar(rs.getDate(4)),
+ rs.getString(5),
+ rs.getInt(6));
+ return holding;
+
+ } finally {
+ try {
+ rs.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException(
+ "An Exception is thrown during selecting a holding entry",
+ e);
+ } finally {
+ if (selectHoldingStat != null) {
+ try {
+ selectHoldingStat.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return holding;
+ }
+
+ public void updateAccountBalance(int accountId, BigDecimal total)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger
+ .debug("OrderDAO.updateAccountBalance(int,BigDecimal)\nAccount ID :"
+ + accountId + "\nTotal :" + total);
+ }
+ DAOFactory fac = MSSQLDAOFactory.getInstance();
+ CustomerDAO customerDAO = fac.getCustomerDAO();
+ customerDAO.updateAccountBalance(accountId, total);
+ }
+
+ public void updateStockPriceVolume(double quantity, CustomQuoteBean quote)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger
+ .debug("OrderDAO.updateStockPriceVolume(double,QuatedataModle)\nQuantity :"
+ + quantity + "\nQuote\nSymbol" + quote.getSymbol());
+ }
+ DAOFactory fac = MSSQLDAOFactory.getInstance();
+ MarketSummaryDAO marketSummaryDAO = fac.getMarketSummaryDAO();
+ marketSummaryDAO.updateStockPriceVolume(quantity, quote);
+ }
+
+ public void updateOrder(CustomOrderBean order) throws DAOException {
+ PreparedStatement updateHoldingStat = null;
+ try {
+ updateHoldingStat = sqlConnection
+ .prepareStatement(SQL_UPDATE_ORDER);
+ updateHoldingStat.setDouble(1, order.getQuantity());
+ updateHoldingStat.setInt(2, order.getOrderID());
+ updateHoldingStat.executeUpdate();
+
+ } catch (SQLException e) {
+ throw new DAOException(
+ "An Exception is thrown during updating a holding entry", e);
+ } finally {
+ if (updateHoldingStat != null) {
+ try {
+ updateHoldingStat.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public void closeOrder(CustomOrderBean order) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("OrderDAO.closeOrder(OrderDataModel)\nOrderID :"
+ + order.getOrderID() + "\nOrderType :"
+ + order.getOrderType() + "\nSymbol :" + order.getSymbol()
+ + "\nQuantity :" + order.getQuantity() + "\nOrder Status :"
+ + order.getOrderStatus() + "\nOrder Open Date :"
+ + order.getOpenDate() + "\nCompletionDate :"
+ + order.getCompletionDate());
+ }
+
+ PreparedStatement closeOrderStat = null;
+ try {
+ closeOrderStat = sqlConnection.prepareStatement(SQL_CLOSE_ORDER);
+ closeOrderStat.setString(1, StockTraderUtility.ORDER_STATUS_CLOSED);
+ if (StockTraderUtility.ORDER_TYPE_SELL.equals(order.getOrderType())) {
+ closeOrderStat.setNull(2, Types.INTEGER);
+ } else {
+ closeOrderStat.setInt(2, order.getHoldingId());
+ }
+ closeOrderStat.setBigDecimal(3, order.getPrice());
+ closeOrderStat.setInt(4, order.getOrderID());
+ closeOrderStat.executeUpdate();
+
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+
+ } finally {
+ if (closeOrderStat != null) {
+ try {
+ closeOrderStat.close();
+ } catch (Exception e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+ public CustomOrderBean createOrder(String userID, String symbol,
+ String orderType, double quantity, int holdingID)
+ throws DAOException {
+ int orderID = 0;
+ Calendar minCalender = Calendar.getInstance();
+ minCalender.setTimeInMillis(0);
+ CustomOrderBean order = new CustomOrderBean(orderID, orderType,
+ StockTraderUtility.ORDER_STATUS_OPEN, Calendar.getInstance(),
+ minCalender, quantity, BigDecimal.valueOf(1),
+ StockTraderUtility.getOrderFee(orderType), symbol);
+ order.setHoldingId(holdingID);
+
+ PreparedStatement getAccountId = null;
+ try {
+ getAccountId = sqlConnection.prepareStatement(SQL_GET_ACCOUNTID);
+ getAccountId.setString(1, userID);
+ ResultSet rs = getAccountId.executeQuery();
+ if (rs.next()) {
+ order.setAccountId(rs.getInt(1));
+ }
+ } catch (SQLException e) {
+
+ } finally {
+ if (getAccountId != null) {
+ try {
+ getAccountId.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+
+ PreparedStatement insertOrder = null;
+ PreparedStatement selectOrderID = null;
+ try {
+ insertOrder = sqlConnection.prepareStatement(SQL_INSERT_ORDER);
+ insertOrder.setBigDecimal(1, order.getOrderFee());
+ insertOrder.setBigDecimal(2, order.getPrice());
+ insertOrder.setString(3, order.getSymbol());
+ insertOrder.setFloat(4, (float) order.getQuantity());
+ insertOrder.setString(5, order.getOrderType());
+ insertOrder.setInt(6, order.getAccountId());
+ insertOrder.setInt(7, order.getHoldingId());
+ insertOrder.executeUpdate();
+
+
+ selectOrderID = sqlConnection.prepareStatement(SQL_SELECT_ORDER_ID);
+ // ORDERFEE = ? AND PRICE = ? AND QUOTE_SYMBOL = ? AND QUANTITY = ?
+ // ORDERTYPE = ? ORDERSTATUS = ? AND ACCOUNT_ACCOUNTID = ?
+ // HOLDING_HOLDINGID = ?"
+ selectOrderID.setBigDecimal(1, order.getOrderFee());
+ selectOrderID.setBigDecimal(2, order.getPrice());
+ selectOrderID.setString(3, order.getSymbol());
+ selectOrderID.setDouble(4, order.getQuantity());
+ selectOrderID.setString(5, order.getOrderType());
+ selectOrderID.setString(6, "open");
+ selectOrderID.setInt(7, order.getAccountId());
+ selectOrderID.setInt(8, order.getHoldingId());
+ ResultSet rs = selectOrderID.executeQuery();
+ if (rs.next()) {
+ try {
+ order.setOrderID(rs.getInt(1));
+ } finally {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (insertOrder != null) {
+ try {
+ insertOrder.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ if (selectOrderID != null) {
+ try {
+ selectOrderID.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ return order;
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/OrderProcessorUtility.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/OrderProcessorUtility.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/OrderProcessorUtility.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/OrderProcessorUtility.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,40 @@
+/*
+ * 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.stonehenge.stocktrader.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A class which contains utility functions for order processing.
+ */
+public class OrderProcessorUtility {
+ private static final Log logger = LogFactory
+ .getLog(OrderProcessorUtility.class);
+
+ public static void pauseForTwoSeconds() {
+ logger.debug("OrderProcessorImpl.sleepForTwoSec()");
+ try {
+ Thread.sleep(2 * 1000);
+ } catch (InterruptedException e) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Unable to sleep for 2 sec", e);
+ }
+ }
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderSQLUtil.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderSQLUtil.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderSQLUtil.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderSQLUtil.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,56 @@
+/*
+ * 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.stonehenge.stocktrader.util;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+
+public class StockTraderSQLUtil {
+ private static final Log logger = LogFactory
+ .getLog(StockTraderSQLUtil.class);
+
+ public static Object executeScalarNoParm(String query, Connection sqlConnection)
+ throws DAOException {
+ PreparedStatement preparedStatement = null;
+ try {
+ preparedStatement = sqlConnection.prepareStatement(query);
+ ResultSet rs = preparedStatement.executeQuery();
+ if (rs.next()) {
+ return rs.getObject(1);
+ }
+ return null;
+ } catch (SQLException e) {
+ throw new DAOException("", e);
+ } finally {
+ if (preparedStatement != null) {
+ try {
+ preparedStatement.close();
+ } catch (SQLException e) {
+ logger.debug("", e);
+ }
+ }
+ }
+ }
+
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderUtility.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderUtility.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderUtility.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/common/src/org/apache/stonehenge/stocktrader/util/StockTraderUtility.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,100 @@
+/*
+ * 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.stonehenge.stocktrader.util;
+
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.util.Calendar;
+import java.util.Random;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class StockTraderUtility {
+
+ public static final String TRADE_ORDER_SERVICE_PROPERTY_FILE = "config-svc.properties";
+ public static final String TRADE_ORDER_SERVICE_SECURITY_FILE = "security-policy.xml";
+ public static final String MSSQL_DB_PROPERRTIES_FILE = "mssql-db.properties";
+ public static final String ORDER_TYPE_BUY = "buy";
+ public static final String ORDER_TYPE_SELL = "sell";
+ public static final String ORDER_TYPE_SELL_ENHANCED = "sellEnhanced";
+ public static final String ORDER_STATUS_CLOSED = "closed";
+ public static final String ORDER_STATUS_OPEN = "open";
+
+ public static final int MAX_QUERY_TOP_ORDERS = 5;
+ public static final int MAX_QUERY_ORDERS = 5;
+
+ public static final BigDecimal PENNY_STOCK_P = BigDecimal.valueOf(0.1);
+ public static final BigDecimal JUNK_STOCK_MIRACLE_MULTIPLIER = BigDecimal
+ .valueOf(500);
+ public static final BigDecimal STOCK_P_HIGH_BAR = BigDecimal.valueOf(1000);
+ public static final BigDecimal STOCK_P_HIGH_BAR_CRASH = BigDecimal
+ .valueOf(0.05);
+ public static final BigDecimal STOCK_CHANGE_MAX_PERCENT = BigDecimal
+ .valueOf(5);
+ public static final BigDecimal BUY_FEE = BigDecimal.valueOf(15.95);
+ public static final BigDecimal SELL_FEE = BigDecimal.valueOf(25.95);
+
+ private static final Log logger = LogFactory
+ .getLog(StockTraderUtility.class);
+
+ public static BigDecimal getRandomPriceChangeFactor(BigDecimal currentPrice) {
+ if (currentPrice.compareTo(PENNY_STOCK_P) == -1
+ || currentPrice.compareTo(PENNY_STOCK_P) == 0) {
+ return JUNK_STOCK_MIRACLE_MULTIPLIER;
+ } else if (currentPrice.compareTo(STOCK_P_HIGH_BAR) == 1
+ || currentPrice.compareTo(STOCK_P_HIGH_BAR) == 0) {
+ return STOCK_P_HIGH_BAR_CRASH;
+ }
+
+ BigDecimal factor = BigDecimal.valueOf(0);
+ Random rand = new Random();
+ int y = rand.nextInt(STOCK_CHANGE_MAX_PERCENT.subtract(BigDecimal.ONE)
+ .intValue());
+ y = y + 1;
+ int x = rand.nextInt();
+
+ if (x % 2 == 0) {
+ factor = BigDecimal.ONE.subtract((BigDecimal.valueOf(y))
+ .divide(BigDecimal.valueOf(100)));// / 100m;
+ } else
+ factor = BigDecimal.ONE.add(BigDecimal.ONE.add(BigDecimal
+ .valueOf(y).divide(BigDecimal.valueOf(100))));
+ return factor;
+ }
+
+ public static Date convertToSqlDate(Calendar calendar) {
+ return new Date(calendar.getTimeInMillis());
+ }
+
+ public static Calendar convertToCalendar(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(date.getTime());
+ return calendar;
+ }
+
+ public static BigDecimal getOrderFee(String orderType) {
+ if (StockTraderUtility.ORDER_TYPE_BUY.equals(orderType)
+ || StockTraderUtility.ORDER_TYPE_SELL.equals(orderType)) {
+ return BUY_FEE;
+ } else {
+ return SELL_FEE;
+ }
+ }
+
+}
Modified: incubator/stonehenge/trunk/stocktrader/wsas/order_processor/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/order_processor/pom.xml?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/order_processor/pom.xml (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/order_processor/pom.xml Wed Apr 22 04:39:03 2009
@@ -24,8 +24,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>OrderService</artifactId>
- <groupId>org.apache.stocktrader.order-service</groupId>
- <name>WSAS Stock Trader OrderProcessor Service</name>
+ <groupId>org.apache.stonehenge.stocktrader.order-service</groupId>
+ <name>Apache Stonehenge WSAS Stock Trader OrderProcessor Service</name>
<version>SNAPSHOT</version>
<properties>
<addressing.mar.version>SNAPSHOT</addressing.mar.version>
@@ -360,7 +360,7 @@
<version>${version}</version>
</dependency>
<dependency>
- <groupId>org.apache.stocktrader.common</groupId>
+ <groupId>org.apache.stonehenge.stocktrader.common</groupId>
<artifactId>stocktrader-wsas</artifactId>
<version>${version}</version>
</dependency>
Modified: incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/msec/META-INF/services.xml
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/msec/META-INF/services.xml?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/msec/META-INF/services.xml (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/msec/META-INF/services.xml Wed Apr 22 04:39:03 2009
@@ -24,7 +24,7 @@
class="org.tempuri.OrderProcessorMessageReceiverInOnly" />
</messageReceivers>
<parameter name="ServiceClass">
- org.apache.stocktrader.service.OrderProcessorImpl
+ org.apache.stonehenge.stocktrader.service.OrderProcessorImpl
</parameter>
<module ref="rampart"/>
<parameter name="messageReceiver.invokeOnSeparateThread"
@@ -122,7 +122,7 @@
<rampart:property name="org.apache.ws.security.crypto.merlin.keystore.password">password</rampart:property>
</rampart:crypto>
</rampart:encryptionCypto>
- <rampart:passwordCallbackClass>org.apache.stocktrader.service.OrderProcessorServicePasswordCB</rampart:passwordCallbackClass>
+ <rampart:passwordCallbackClass>org.apache.stonehenge.stocktrader.service.OrderProcessorServicePasswordCB</rampart:passwordCallbackClass>
</rampart:RampartConfig>
<!--rampart:RampartConfig xmlns:rampart="http://ws.apache.org/rampart/policy">
<rampart:user>bob</rampart:user>
Modified: incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/nosec/META-INF/services.xml
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/nosec/META-INF/services.xml?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/nosec/META-INF/services.xml (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/order_processor/resources/nosec/META-INF/services.xml Wed Apr 22 04:39:03 2009
@@ -24,7 +24,7 @@
class="org.tempuri.OrderProcessorMessageReceiverInOnly" />
</messageReceivers>
<parameter name="ServiceClass">
- org.apache.stocktrader.service.OrderProcessorImpl
+ org.apache.stonehenge.stocktrader.service.OrderProcessorImpl
</parameter>
<parameter name="messageReceiver.invokeOnSeparateThread"
value="true" />
Added: incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessManager.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessManager.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessManager.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessManager.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,188 @@
+/*
+ * 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.stonehenge.stocktrader.service;
+
+import java.math.BigDecimal;
+import java.util.Calendar;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.CustomHoldingBean;
+import org.apache.stonehenge.stocktrader.CustomOrderBean;
+import org.apache.stonehenge.stocktrader.CustomQuoteBean;
+import org.apache.stonehenge.stocktrader.HoldingBean;
+import org.apache.stonehenge.stocktrader.QuoteBean;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+import org.apache.stonehenge.stocktrader.dal.DAOFactory;
+import org.apache.stonehenge.stocktrader.mssql.MSSQLOrderDAO;
+import org.apache.stonehenge.stocktrader.util.StockTraderUtility;
+
+public class OrderProcessManager {
+ private static final Log logger = LogFactory
+ .getLog(OrderProcessManager.class);
+
+ private MSSQLOrderDAO orderDAO = null;
+
+ public void processAndCompleteOrder(CustomOrderBean order)
+ throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger
+ .debug("ProcessOrder.processAndCompleteOrder(OrderDataModel) \nOrderID :"
+ + order.getOrderID()
+ + "\nOrderType :"
+ + order.getOrderType()
+ + "\nSymbol :"
+ + order.getSymbol()
+ + "\nQuantity :"
+ + order.getQuantity()
+ + "\nOrder Status :"
+ + order.getOrderStatus()
+ + "\nOrder Open Date :"
+ + order.getOpenDate()
+ + "\nCompletionDate :"
+ + order.getCompletionDate());
+ }
+
+ try {
+ DAOFactory factory = DAOFactory
+ .getFacotry(DAOFactory.MS_SQL_FACTORY);
+
+ orderDAO = (MSSQLOrderDAO) factory.getOrderDAO();
+ orderDAO.beginTransaction();
+
+ BigDecimal total = null;
+ int holdingId = -1;
+
+ CustomQuoteBean quote = orderDAO.getQuoteForUpdate(order.getSymbol());
+ if (quote == null) {
+ if (logger.isDebugEnabled()) {
+ logger
+ .debug("Unable to locate a quote entry for the symbol :"
+ + order.getSymbol());
+ }
+ return;
+ }
+
+ order.setPrice(quote.getPrice());
+
+ if (StockTraderUtility.ORDER_TYPE_BUY.equals(order.getOrderType())) {
+ holdingId = orderDAO.createHolding(order);
+ BigDecimal orderQuantity = BigDecimal.valueOf(order
+ .getQuantity());
+ BigDecimal orderPrice = order.getPrice();
+ total = orderQuantity.multiply(orderPrice);
+
+ BigDecimal orderFee = order.getOrderFee();
+ if (orderFee != null) {
+ total = total.add(orderFee);
+ }
+
+ } else if (StockTraderUtility.ORDER_TYPE_SELL.equals(order
+ .getOrderType())) {
+ holdingId = sellHolding(order);
+ if (holdingId == -1) {
+ return;
+ }
+
+ BigDecimal orderQuantity = BigDecimal.valueOf(-1
+ * order.getQuantity());
+ BigDecimal orderPrice = order.getPrice();
+ total = orderQuantity.multiply(orderPrice);
+
+ BigDecimal orderFee = order.getOrderFee();
+ if (total != null) {
+ total = total.add(orderFee);
+ }
+ }
+
+ orderDAO.updateAccountBalance(order.getAccountId(), total);
+ orderDAO.updateStockPriceVolume(order.getQuantity(), quote);
+ order.setOrderStatus(StockTraderUtility.ORDER_STATUS_CLOSED);
+ order.setCompletionDate(Calendar.getInstance());
+ order.setHoldingId(holdingId);
+ orderDAO.closeOrder(order);
+ orderDAO.commitTransaction();
+
+ } catch (DAOException e) {
+ try {
+ orderDAO.rollbackTransaction();
+ } catch (DAOException e1) {
+ logger.error("", e1);
+ }
+ } finally {
+ if (orderDAO != null) {
+ try {
+ orderDAO.close();
+ } catch (DAOException e) {
+ logger.error("", e);
+ }
+ }
+ }
+ }
+
+ private int sellHolding(CustomOrderBean order) throws DAOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("ProcessOrder.sellHolding(OrderDataModel) \nOrderID :"
+ + order.getOrderID() + "\nOrderType :"
+ + order.getOrderType() + "\nSymbol :" + order.getSymbol()
+ + "\nQuantity :" + order.getQuantity() + "\nOrder Status :"
+ + order.getOrderStatus() + "\nOrder Open Date :"
+ + order.getOpenDate() + "\nCompletionDate :"
+ + order.getCompletionDate());
+ }
+
+ CustomHoldingBean holding = orderDAO.getHoldingForUpdate(order.getOrderID());
+
+ if (holding == null) {
+ // TODO : DAOException ..
+ throw new RuntimeException(
+ "Unable to locate a holding entry for orderID :"
+ + order.getOrderID());
+ }
+ order.setAccountId(holding.getAccountID());
+
+ // There are three distinct business cases here, each needs different
+ // treatment:
+ // a) Quantity requested is less than total shares in the holding --
+ // update holding.
+ // b) Quantity requested is equal to total shares in the holding --
+ // delete holding.
+ // c) Quantity requested is greater than total shares in the holding --
+ // delete holding, update order table.
+
+ if (order.getQuantity() < holding.getQuantity()) {
+ orderDAO.updateHolding(holding.getHoldingID(), order.getQuantity());
+
+ } else if (holding.getQuantity() == order.getQuantity()) {
+ orderDAO.deleteHolding(holding.getHoldingID());
+
+ } else if (order.getQuantity() > holding.getQuantity()) {
+ // We now need to back-update the order record quantity to reflect
+ // fact not all shares originally requested were sold since the
+ // holding had less shares in it, perhaps due to other orders placed
+ // against that holding that completed before this one. So we will
+ // sell the remaining shares, but need to update the final order to
+ // reflect this.
+ orderDAO.deleteHolding(holding.getHoldingID());
+ order.setQuantity(holding.getQuantity());
+ order.setAccountId(holding.getAccountID());
+ orderDAO.updateOrder(order);
+ }
+ return holding.getHoldingID();
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorImpl.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorImpl.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorImpl.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorImpl.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,91 @@
+/*
+ * 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.stonehenge.stocktrader.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stonehenge.stocktrader.CustomOrderBean;
+import org.apache.stonehenge.stocktrader.dal.DAOException;
+import org.apache.stonehenge.stocktrader.util.OrderProcessorUtility;
+import org.tempuri.OrderProcessorSkeleton;
+
+import traderorderhost.trade.IsOnline;
+import traderorderhost.trade.SubmitOrder;
+import traderorderhost.trade.SubmitOrderTransactedQueue;
+
+import com.ibm.websphere.samples.trade.OrderDataBean;
+
+public class OrderProcessorImpl extends OrderProcessorSkeleton {
+ private static final Log logger = LogFactory
+ .getLog(OrderProcessorImpl.class);
+ // OrderProcessManager is the controller for managing order processing.
+ private final OrderProcessManager orderProcessManager = new OrderProcessManager();
+
+ /**
+ * This method implements the isOnline operation of OrderProcessorService
+ * which is a In-Only Web services function.
+ */
+ public void isOnline(IsOnline isOnline) {
+ logger.debug("OrderProcessorImpl.isOnline(IsOnlines)");
+ }
+
+ /**
+ * This method is the implementation of SubmitOrderTransactedQueue function
+ * of OrderProcessorService.
+ */
+ public void SubmitOrderTransactedQueue(
+ SubmitOrderTransactedQueue submitOrderTransactedQueue) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("OrderProcessorImpl.SubmitOrder(SubmitOrder)");
+ OrderDataBean odb = submitOrderTransactedQueue.getOrder();
+ logger.debug("OrderID :" + odb.getOrderID() + "\nOrderType :"
+ + odb.getOrderType() + "\nSymbol :" + odb.getSymbol()
+ + "\nQuantity :" + odb.getQuantity() + "\nOrder Status :"
+ + odb.getOrderStatus() + "\nOrder Open Date :"
+ + odb.getOpenDate() + "\nCompletionDate :"
+ + odb.getCompletionDate());
+ }
+
+ OrderDataBean order = submitOrderTransactedQueue.getOrder();
+ CustomOrderBean orderData = new CustomOrderBean(order);
+ try {
+ processOrder(orderData);
+ } catch (DAOException e) {
+ logger.error("", e);
+ }
+ }
+
+ public void SubmitOrder(SubmitOrder submitOrder) {
+ OrderDataBean order = submitOrder.getOrder();
+ CustomOrderBean orderData = new CustomOrderBean(order);
+ try {
+ processOrder(orderData);
+ } catch (DAOException e) {
+ logger.error("", e);
+ }
+ }
+
+ private void processOrder(CustomOrderBean queueOrder) throws DAOException {
+ // 2 seconds delay to ensure that MSFT-BL has committed new order
+ // entries to the database which will happen when it gets HTTP 202
+ // accepted header
+ OrderProcessorUtility.pauseForTwoSeconds();
+ orderProcessManager.processAndCompleteOrder(queueOrder);
+ }
+}
Added: incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorServicePasswordCB.java
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorServicePasswordCB.java?rev=767366&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorServicePasswordCB.java (added)
+++ incubator/stonehenge/trunk/stocktrader/wsas/order_processor/src/org/apache/stonehenge/stocktrader/service/OrderProcessorServicePasswordCB.java Wed Apr 22 04:39:03 2009
@@ -0,0 +1,39 @@
+/*
+ * 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.stonehenge.stocktrader.service;
+
+import java.io.IOException;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+import org.apache.ws.security.WSPasswordCallback;
+
+public class OrderProcessorServicePasswordCB implements CallbackHandler {
+ public void handle(Callback[] callbacks) throws IOException,
+ UnsupportedCallbackException {
+ for (int i = 0; i < callbacks.length; i++) {
+ WSPasswordCallback pwcb = (WSPasswordCallback) callbacks[i];
+ String id = pwcb.getIdentifer();
+ if ("bob".equals(id))
+ pwcb.setPassword("password");
+ else if ("bob.cer".equals(id))
+ pwcb.setPassword("password");
+ }
+ }
+}
Modified: incubator/stonehenge/trunk/stocktrader/wsas/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/pom.xml?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/pom.xml (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/pom.xml Wed Apr 22 04:39:03 2009
@@ -24,7 +24,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>stocktrader</artifactId>
- <groupId>org.apache.stocktrader</groupId>
+ <groupId>org.apache.stonehenge.stocktrader</groupId>
<name>Stonehenge Stock Trader Java Implementation</name>
<version>SNAPSHOT</version>
<packaging>pom</packaging>
Modified: incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/config-svc.properties
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/config-svc.properties?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/config-svc.properties (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/config-svc.properties Wed Apr 22 04:39:03 2009
@@ -14,4 +14,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-org.apache.stocktrader.TradeConfigServiceClient.url= http://localhost:8080/php_stocktrader/config_service/config_svc.php
+org.apache.stonehenge.stocktrader.TradeConfigServiceClient.url= http://localhost:8080/php_stocktrader/config_service/config_svc.php
Modified: incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/mssql-db.properties
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/mssql-db.properties?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/mssql-db.properties (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/mssql-db.properties Wed Apr 22 04:39:03 2009
@@ -12,8 +12,8 @@
# 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.
-org.apache.stocktrader.mssql.MSSQLDAOFactory.host=localhost
-org.apache.stocktrader.mssql.MSSQLDAOFactory.port=1433
-org.apache.stocktrader.mssql.MSSQLDAOFactory.db=StockTraderDB
-org.apache.stocktrader.mssql.MSSQLDAOFactory.user=trade
-org.apache.stocktrader.mssql.MSSQLDAOFactory.password=trade
+org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.host=localhost
+org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.port=1433
+org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.db=StockTraderDB
+org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.user=trade
+org.apache.stonehenge.stocktrader.mssql.MSSQLDAOFactory.password=trade
Modified: incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/security-policy.xml
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/security-policy.xml?rev=767366&r1=767365&r2=767366&view=diff
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/security-policy.xml (original)
+++ incubator/stonehenge/trunk/stocktrader/wsas/resources/conf/security-policy.xml Wed Apr 22 04:39:03 2009
@@ -84,7 +84,7 @@
<rampart:property name="org.apache.ws.security.crypto.merlin.keystore.password">password</rampart:property>
</rampart:crypto>
</rampart:encryptionCypto>
- <rampart:passwordCallbackClass>org.apache.stocktrader.services.TradeOrderServiceClientPasswordCB</rampart:passwordCallbackClass>
+ <rampart:passwordCallbackClass>org.apache.stonehenge.stocktrader.services.TradeOrderServiceClientPasswordCB</rampart:passwordCallbackClass>
</rampart:RampartConfig>
</wsp:All>
</wsp:ExactlyOne>