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 2008/11/26 10:52:44 UTC
svn commit: r720797 [2/9] - in
/incubator/stonehenge/contrib/stocktrader/ruby: ./ order_processor/
order_processor/keys/ order_processor/policies/ trader_client/
trader_client/app/ trader_client/app/controllers/
trader_client/app/helpers/ trader_client...
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_logic.rb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_logic.rb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_logic.rb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_logic.rb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,487 @@
+
+# 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.
+
+
+require "trade_utils.rb"
+
+require 'wsf' # Use WSO2 WSF/Ruby module
+
+#include WSO2::WSF
+
+# Constant definition
+WSDL_FILE_NAME = "public/wsdl/noimports.wsdl"
+LOG_FILE_NAME = "wsf_ruby_client.log"
+CONFIG_WSDL_NAME = "public/wsdl/config_svc.wsdl"
+CLIENT_NAME = "RUBY_CLIENT"
+
+#####################
+# Web Services Client
+#####################
+
+
+# Get proxy client
+def GetProxy()
+ endpoint = GetBSEndpoint();
+ if(endpoint != nil)
+ client = WSO2::WSF::WSClient.new({"wsdl" => WSDL_FILE_NAME,
+ "to" => endpoint}, LOG_FILE_NAME)
+
+ return client.get_proxy
+ else
+ return nil
+ end
+end
+
+
+# Get client
+def GetClient()
+ endpoint = GetBSEndpoint();
+ if(endpoint != nil)
+ client = WSO2::WSF::WSClient.new(
+ {"to" => endpoint, "use_soap" => 1.1}, LOG_FILE_NAME)
+
+ return client
+ else
+ return nil
+ end
+end
+
+# Sends login request to verify whether current user is authorized
+# @param userid user id of current user
+# @param password password given by current user
+# @return profile id of the user if login is success. NULL otherwise
+def Login(userid, password)
+ proxy = GetProxy()
+ if(proxy != nil)
+ response = proxy.login({"login"=> {"userID"=> userid,
+ "password" => password}})
+ if(response["loginResponse"] != nil && response["loginResponse"]["loginReturn"] != nil)
+ return response["loginResponse"]["loginReturn"]["profileID"]
+ else
+ return nil
+ end
+ end
+end
+
+# When user logout, user id will be deleted from the cookie
+# @param username user id of current user
+
+def LogoutUser(username)
+
+ client = GetClient()
+ input = "<x:logout xmlns:x=\"http://trade.samples.websphere.ibm.com\"><userID>#{username}</userID></x:logout>"
+ begin
+ response = client.request(input)
+ rescue WSO2::WSF::WSFault => wsfault
+ end
+ DeleteCookie()
+end
+
+
+# get the orders
+def GetOrders(userid)
+ proxy = GetProxy()
+ response =proxy.getOrders({"getOrders"=> {"userID" => userid}})
+ if(response != nil && response["getOrdersResponse"] != nil &&
+ response["getOrdersResponse"]["getOrdersReturn"] != nil)
+ ret = response["getOrdersResponse"]["getOrdersReturn"]
+ return ret
+ end
+end
+
+# Given the order details of a user, this method calculates summery of
+# activities of the user. This includes total money spent on buying stocks
+# total money earned from selling them etc.
+# @param ordersReturn collection of orders of a user
+# @return summery of user's activities
+
+
+def GetUserAccountSummary(ordersReturn)
+ index = 0
+ sells = 0
+ buys = 0
+ tax = 0
+
+ if(ordersReturn["OrderDataBean"].class.to_s == "Array")
+ while((order = ordersReturn["OrderDataBean"][index]) != nil)
+ if(order.class.to_s == "Hash")
+ if (order["orderType"] == "buy")
+ buys = buys + ((order["price"].to_f) *
+ (order["quantity"].to_i)) +
+ (order["orderFee"].to_f)
+ elsif (order["orderType"] == "sell")
+ sells = sells + ((order["price"].to_f) *
+ (order["quantity"].to_i)) -
+ (order["orderFee"].to_f)
+ end
+ tax = tax + order["orderFee"].to_f;
+ end
+ index = index + 1;
+ end
+ else
+ order = ordersReturn["OrderDataBean"]
+ if(order.class.to_s == "Hash")
+ if (order["orderType"] == "buy")
+ buys = buys + ((order["price"].to_f) *
+ (order["quantity"].to_i)) +
+ (order["orderFee"].to_f)
+ elsif (order["orderType"] == "sell")
+ sells = sells + ((order["price"].to_f) *
+ (order["quantity"].to_i)) -
+ (order["orderFee"].to_f)
+ end
+ tax = tax + order["orderFee"].to_f;
+ end
+ end
+ return {"totalBuys" => buys,
+ "totalSells" => sells,
+ "totalTax" => tax,
+ "totalImpact" => buys + tax - sells}
+end
+
+# Updates account profile information
+# @param userID id of the user
+# @param fullname full name of the user
+# @param email email address of the user
+# @param address address of the user
+# @param creditcard credit card number of the user
+# @param password password of the user
+# @return account details of the modified user on success. NULL otherwise.
+
+def UpdateAccountProfile(userID, fullName, email,
+ address, creditCard, password)
+ proxy = GetProxy();
+ input = {"updateAccountProfile" =>
+ {"profileData" =>
+ { "userID" => userID,
+ "password" => password,
+ "fullName" => fullName,
+ "address" => address,
+ "email" => email,
+ "creditCard" => creditCard}}}
+ response = proxy.updateAccountProfile(input);
+ return response;
+end
+
+
+# Gets account details of current user
+# @param userid user id of current user
+# @return account details if success. NULL otherwise
+
+def GetAccountData(userid)
+ proxy = GetProxy()
+ input = {"getAccountData" =>
+ {"userID" => userid}}
+ response = proxy.getAccountData(input)
+ if(response["getAccountDataResponse"] != nil &&
+ response["getAccountDataResponse"]["getAccountDataReturn"] != nil)
+ return response["getAccountDataResponse"]["getAccountDataReturn"]
+ end
+end
+
+# Gets account profile information of current user
+# @param userid user id of current user
+# @return account profile data of current user if success. NULL otherwise
+
+def GetAccountProfileData(userid)
+ proxy = GetProxy()
+ input = {"getAccountProfileData" =>
+ {"userID" => userid}}
+ response = proxy.getAccountProfileData(input)
+ if(response["getAccountProfileDataResponse"] != nil &&
+ response["getAccountProfileDataResponse"]["getAccountProfileDataReturn"] != nil)
+ return response["getAccountProfileDataResponse"]["getAccountProfileDataReturn"]
+ end
+end
+
+# Gets closed orders of current user
+# @return collection of orders whose status is closed
+
+def GetClosedOrders(userid)
+ proxy = GetProxy()
+ input = {"getClosedOrders" =>
+ {"userID" => userid}}
+ response = proxy.getClosedOrders(input)
+ #return response
+ if(response != nil &&
+ response["getClosedOrdersResponse"] != nil &&
+ response["getClosedOrdersResponse"]["getClosedOrdersReturn"] != nil)
+ return response["getClosedOrdersResponse"]["getClosedOrdersReturn"]
+ end
+ return nil
+end
+
+
+# Gets quote of given symbol
+# @param symbol id of the stock
+# @return details of the symbol when success. NULL otherwise
+
+def GetQuote(symbol)
+
+ proxy = GetProxy();
+ input = {"getQuote" =>
+ {"symbol" => symbol}}
+ response = proxy.getQuote(input)
+ if(response != nil &&
+ response["getQuoteResponse"] != nil &&
+ response["getQuoteResponse"]["getQuoteReturn"] != nil)
+ getQuoteReturn = response["getQuoteResponse"]["getQuoteReturn"]
+ return getQuoteReturn
+ end
+ return nil
+end
+
+
+# Buys number of stocks of given symbol
+# @param userID user id of current user
+# @param symbol symbol of needed stock
+# @quantity number of stocks needed
+# @mode mode of buying
+# @return details of buy order if success. NULL otherwise
+
+def Buy(userID, symbol, quantity, mode)
+ proxy = GetProxy()
+ input = {"buy" =>
+ {"symbol" => symbol,
+ "userID" => userID,
+ "quantity" => quantity.to_f,
+ "orderProcessingMode" => mode.to_i}}
+ response = proxy.buy(input)
+ if(response != nil &&
+ response["buyResponse"] != nil &&
+ response["buyResponse"]["buyReturn"] != nil)
+ return response["buyResponse"]["buyReturn"]
+ end
+ return nil
+end
+
+# Sells given holding or part of it of given user
+# @param userID user id of current user
+# @param holdingID holding id of the holding
+# @param quantity number of stocks to be sold
+# @return details of sell order if success. NULL otherwise
+
+def SellEnhanced(userID, holdingID, quantity)
+ proxy = GetProxy()
+ input = {"sellEnhanced" =>
+ {"userID" => userID,
+ "holdingID" => holdingID.to_i,
+ "quantity" => quantity.to_f}}
+ response = proxy.sellEnhanced(input)
+ if(response != nil &&
+ response["sellEnhancedResponse"] != nil &&
+ response["sellEnhancedResponse"]["sellEnhancedReturn"] != nil)
+ return response["sellEnhancedResponse"]["sellEnhancedReturn"]
+ end
+ return nil
+end
+
+
+# Gets holding details of given user
+# @param userid user id of current user
+# returns collection of holding if success. NULL otherwise
+
+def GetHoldings(userID)
+ proxy = GetProxy();
+ input = {"getHoldings" =>
+ {"userID" => userID}}
+ response = proxy.getHoldings(input)
+ if(response != nil &&
+ response["getHoldingsResponse"] != nil &&
+ response["getHoldingsResponse"]["getHoldingsReturn"] != nil)
+ return response["getHoldingsResponse"]["getHoldingsReturn"]
+ end
+ return nil
+end
+
+
+# This method registes a new user in the system
+# @param userID id of the user
+# @param password password of the user
+# @param fullname full name of the user
+# @param address address of the user
+# @param email email address of the user
+# @param creditcard credit card number of the user
+# @param openBalance initial balance of the user
+# @return account details of the registerd user on success. NULL otherwise.
+
+def RegisterUser(userID, password, fullname,
+ address, email, creditcard, openBalance)
+
+ proxy = GetProxy()
+ input = {"register" =>
+ {"userID" => userID,
+ "password" => password,
+ "fullname" => fullname,
+ "address" => address,
+ "email" => email,
+ "creditcard" => creditcard,
+ "openBalance" => openBalance.to_f}}
+ response = proxy.register(input)
+ if(response != nil &&
+ response["registerResponse"] != nil &&
+ response["registerResponse"]["registerReturn"] != nil)
+ return response["registerResponse"]["registerReturn"]
+ end
+ return response
+end
+
+require 'rexml/document'
+include REXML
+
+# Gets market summary
+# @return market summery
+
+def GetMarketSummary
+# proxy = GetProxy()
+# input = {"getMarketSummary" => nil}
+# response = proxy.getMarketSummary(input)
+# if(response != nil &&
+# response["getMarketSummaryResponse"] != nil &&
+# response["getMarketSummaryResponse"]["getMarketSummaryReturn"] != nil)
+# return response["getMarketSummaryResponse"]["getMarketSummaryReturn"]
+# end
+# return response
+ client = GetClient()
+ input = "<x:getMarketSummary xmlns:x=\"http://trade.samples.websphere.ibm.com\"></x:getMarketSummary>"
+
+ response = client.request(input)
+
+ doc = Document.new(response.payload_to_s)
+
+ ret_val = {}
+ ret_val["TSIA"]= XPath.first(doc, "//pq:TSIA", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(doc, "//pq:TSIA", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil
+ ret_val["openTSIA"]= XPath.first(doc, "//pq:openTSIA", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(doc, "//pq:openTSIA", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil
+ ret_val["volume"]= XPath.first(doc, "//pq:volume", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(doc, "//pq:volume", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil
+ ret_val["summaryDate"]= XPath.first(doc, "//pq:summaryDate", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(doc, "//pq:summaryDate", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil
+
+ top_gainers_arr = Array.new
+ XPath.each(doc, "//pq:topGainers/pq:QuoteDataBean",{"pq" => "http://trade.samples.websphere.ibm.com"}) do |quote|
+ top_gainers_arr <<
+ {
+ "symbol" => XPath.first(quote, "./pq:symbol", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:symbol", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "companyName" => XPath.first(quote, "./pq:companyName", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:companyName", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "price" => XPath.first(quote, "./pq:price", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:price", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "open" => XPath.first(quote, "./pq:open", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:open", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "low" => XPath.first(quote, "./pq:low", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:low", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "high" => XPath.first(quote, "./pq:high", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:high", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "change" => XPath.first(quote, "./pq:change", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:change", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "volume" => XPath.first(quote, "./pq:volume", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:volume", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil
+ }
+ end
+
+ top_losers_arr = Array.new
+ XPath.each(doc, "//pq:topLosers/pq:QuoteDataBean",{"pq" => "http://trade.samples.websphere.ibm.com"}) do |quote|
+ top_losers_arr <<
+ { "symbol" => XPath.first(quote, "./pq:symbol", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:symbol", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "companyName" => XPath.first(quote, "./pq:companyName", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:companyName", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "price" => XPath.first(quote, "./pq:price", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:price", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "open" => XPath.first(quote, "./pq:open", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:open", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "low" => XPath.first(quote, "./pq:low", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:low", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "high" => XPath.first(quote, "./pq:high", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:high", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "change" => XPath.first(quote, "./pq:change", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:change", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil,
+ "volume" => XPath.first(quote, "./pq:volume", {"pq" => "http://trade.samples.websphere.ibm.com"})?
+ XPath.first(quote, "./pq:volume", {"pq" => "http://trade.samples.websphere.ibm.com"}).text.to_s : nil
+ }
+ end
+
+ ret_val["topLosers"] = top_losers_arr
+ ret_val["topGainers"] = top_gainers_arr
+
+
+ return ret_val
+end
+
+
+
+# Given the holdings of a user, this methods calculate total market value of
+# holding and number of holdings
+# @param holdings collection of holdings of a user
+# @return summery of holding details
+
+def GetHoldingInformation(holdingsReturn)
+ quoteInfo = {}
+ index = 0
+ marketValue = 0
+ totalHoldings = 0
+ while ((bean=holdingsReturn["HoldingDataBean"][index]) != nil)
+ if (!quoteInfo[bean["quoteID"]])
+ quotesReturn = GetQuote(bean["quoteID"])
+ quoteInfo[bean["quoteID"]] = quotesReturn["price"]
+ end
+
+ quoteID = bean["quoteID"]
+ totalHoldings = totalHoldings + bean["purchasePrice"].to_f * (bean["quantity"].to_i)
+ marketValue = marketValue + (quoteInfo[quoteID].to_i) * (bean["quantity"].to_i)
+
+ index = index + 1
+ end
+
+ holdingInfo = {"totalHoldings" => marketValue, "noOfHoldings" => index }
+ return holdingInfo
+end
+
+# Get the endpoint of business service
+def GetBSEndpoint()
+ #get the endpoint first
+ endpoint = GetEndpoint()
+ if(endpoint == nil)
+ return nil
+ end
+ # create client in WSDL mode
+ client = WSO2::WSF::WSClient.new({"wsdl" =>CONFIG_WSDL_NAME,
+ "to" => endpoint}, LOG_FILE_NAME)
+
+ # get proxy object reference form client
+ proxy = client.get_proxy();
+ input = {"ClientConfigRequest" =>
+ {"Client" => CLIENT_NAME } }
+
+ response = proxy.ClientConfigRequest(input);
+ if(response && response["ClientConfigResponse"])
+ bsendpoint = response["ClientConfigResponse"]["BS"]
+ end
+ cookies[:bsendpoint] = { :value => bsendpoint,
+ :expires => Time.now + 24.hour}
+ return bsendpoint
+end
+
+
+# Get the endpoint of the business service to be consumed
+def GetEndpoint()
+ return cookies[:endpoint]
+end
+
+
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_utils.rb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_utils.rb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_utils.rb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/controllers/trade_utils.rb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,117 @@
+
+# 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.
+
+
+# Store business service's endpoint in cookie
+# @param endPoint end point address of the business service
+def WriteEndpoint(endpoint)
+ if(cookies[:endpoint] == endpoint)
+ return false
+ else
+ cookies[:endpoint] = { :value => endpoint, :expires => Time.now + 24.hour}
+ if(cookies[:bsendpoint])
+ cookies.delete :bsendpoint
+ end
+ return true
+ end
+end
+
+
+# Checks whether user is logged in. If the user is logged in, user id
+# cookie would have been already set. Checking whether cookie is set
+# equals to checking whether user is logged in.
+def IsLoggedIn()
+ return cookies[:username] != nil &&
+ !cookies[:username].empty?
+end
+
+# Writes user id to cookie
+# @param username user id of the current user
+def WriteUsername(username)
+ cookies[:username] = { :value => username, :expires => Time.now + 24.hour}
+end
+
+# Deletes user id from cookie
+# @param username user id of current user
+def DeleteCookie()
+ cookies.delete :username
+end
+
+# Retrun the user
+def GetUserFromCookie()
+ return cookies[:username]
+end
+
+def obj_to_s(obj, terminator= "\n", index = 0)
+ str = ""
+ index.times do |num|
+ str = str + " "
+ end
+ if(obj.class.to_s == "Hash")
+ str = str + "{"
+ obj.each do |key, value|
+ value_to_str = obj_to_s(value, terminator, index + 2)
+ str = str + key + " => " + value_to_str + " "
+ end
+ str = str + "}"
+ elsif(obj.class.to_s == "Array")
+ str = str + "["
+ obj.each do |value|
+ value_to_str = obj_to_s(value, terminator, index + 2)
+ str = str + value_to_str + " "
+ end
+ str = str + "]"
+ elsif(obj.class.to_s == "String")
+ str = str + obj + " "
+ elsif(obj.class.to_s == "FixNum")
+ str = str + obj.to_s + " "
+ elsif(obj.class.to_s == "Float")
+ str = str + obj.to_s + " "
+ else
+ str = str + obj.to_s + " "
+ end
+ str = str + terminator
+ return str
+end
+
+
+def convert_date(str)
+ if(str)
+ date_arr = str.to_s.tr("T:.", "-").split("-")
+ year = date_arr[0]
+ mon = date_arr[1]
+ date = date_arr[2]
+ hour = date_arr[3]
+ min = date_arr[4]
+ sec = date_arr[5]
+
+ if(hour.to_i > 12)
+ hour = hour.to_i - 12
+ hour = hour.to_s
+ ampm = "PM"
+ else
+ ampm = "AM"
+ end
+
+ return mon.to_s + "/" +
+ date.to_s + "/" +
+ year.to_s + " " +
+ hour.to_s + ":" +
+ min.to_s + ":" +
+ sec.to_s + " " + ampm
+ end
+ return ""
+end
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/application_helper.rb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/application_helper.rb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/application_helper.rb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/application_helper.rb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,19 @@
+
+# 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.
+
+# Methods added to this helper will be available to all templates in the application.
+module ApplicationHelper
+end
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/trade_helper.rb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/trade_helper.rb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/trade_helper.rb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/helpers/trade_helper.rb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,18 @@
+
+# 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.
+
+module TradeHelper
+end
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/layouts/default.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/layouts/default.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/layouts/default.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/layouts/default.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8" />
+ <meta name="generator" content="Adobe GoLive" />
+ <title>WSO2 WSF/Ruby StockTrader Welcome</title>
+ <link href="/stylesheets/style.css" rel="stylesheet" type="text/css" media="all" />
+ </head>
+
+ <body>
+
+ <div id="content">
+ <div id="header">
+ <div class="logo"><img src="/images/logo.gif"></div>
+ </div>
+
+ <div id="header-links">
+ <table>
+ <tr>
+ <td>
+ <a href="/trade/index">Welcome</a>
+ </td>
+ <td>
+ <a href="/trade/home">Home</a>
+ </td>
+ <td>
+ <a href="/trade/account">Account</a>
+ </td>
+ <td>
+ <a href="/trade/portfolio">Portfolio</a>
+ </td>
+ <td>
+ <a href="/trade/quotes">Quotes/Trade</a>
+ </td>
+ <td>
+ <a href="/trade/glossary">Glossary</a>
+ </td>
+ <td>
+ <a href="/trade/config">Config</a>
+ </td>
+ <td>
+ <a href="/trade/login">Login/Logout</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <%= @content_for_layout %>
+
+ <div id="footer">
+ <div style="float:left;">Copyright 2008, WSO2 Inc.</div>
+ <div style="margin-left:432px;float:left;">Powered by
+ <img align="top" src="/images/powered-by-logo.gif" style="margin-top:-3px; margin-left: 0px;"/></div>
+ </div>
+ </div>
+
+ </body>
+</html>
+
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/account.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/account.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/account.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/account.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,232 @@
+<div id="middle">
+
+ <%
+ # Checking whether there is new status change happened in the
+ # related to a particular order.
+ if (@closedOrders != nil)
+ %>
+ <p style="color: red" align="center">Trade Alert:
+ The following orders have completed.</p>
+ <table class="table-outer"
+ cellspacing="0" align="center"><thead>
+ <tr><th>Order ID</th><th>Order Status</th>
+ <th>Creation Date</th><th>Completion Date</th>
+ <th>Txn Fee</th><th>Type</th><th>Symbol</th>
+ <th>Quantity</th></tr></thead><tbody>
+
+ <%
+ index = 0
+ if(@closedOrders["OrderDataBean"].class.to_s == "Array")
+ while ((order = @closedOrders["OrderDataBean"][index]) != nil)
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr>
+ <td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td>$<%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+ <td><%=order["symbol"]%></td>
+ <td><%=order["quantity"]%></td>
+ </tr>
+ <%
+ index = index + 1
+ end
+ else
+ order = @closedOrders["OrderDataBean"]
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr>
+ <td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td>$<%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+ <td><%=order["symbol"]%></td>
+ <td><%=order["quantity"]%></td>
+ </tr>
+ <%
+ end
+ %>
+ </tbody></table><br/><br/>
+ <%
+ end
+ %>
+
+
+ <%
+ # Display the account summary information of a particular user.
+ if (@accountSummary != nil)
+ %>
+ <div class="main-title"><h1>Account Information
+ </h1><script type="text/javascript">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script></div>
+
+ <table class="table-outer" cellspacing="0" align="center">
+ <thead><tr><th>Subtotal Buys</th><th>Subtotal Sells</th><th>Subtotal Fees
+ </th><th>Net Impact Cash Balance</th></tr></thead><tbody><tr>
+
+ <td class="currency"><%=@accountSummary["totalBuys"] %></td>
+ <td class="currency"><%=@accountSummary["totalSells"] %></td>
+ <td class="currency"><%=@accountSummary["totalTax"] %></td>
+ <td class="currency">
+
+ <%
+ if (@accountSummary["totalImpact"].to_i > 0)
+ %>
+ <span class="price-loss"><%=@accountSummary["totalImpact"]%></span>
+ <%
+ elsif (@accountSummary["totalImpact"].to_i < 0)
+ %>
+ <span class="price-gain"><%=@accountSummary["totalImpact"]%></span>
+ <%
+ else
+ %>
+ <span><%=@accountSummary["totalImpact"]%></span>
+ <%
+ end
+ %>
+ </td></tr></tbody></table>
+ <%
+ end
+ %>
+
+ <%
+ # Display the orders a particular user is associated with
+ if (@ordersReturn != nil)
+ %>
+ <div><p><b>Total Orders Shown</b></p></div>
+ <table class="table-outer" cellspacing="0" align="center"><thead><tr>
+ <th>Order ID</th><th>Order Status</th><th>Creation Date</th><th>Completion Date
+ </th><th>Txn Fee</th><th>Type</th><th>Symbol</th><th>Quantity</th><th>Price
+ </th><th>Total</th></tr></thead><tbody>
+ <%
+ index = 0
+ if(@ordersReturn["OrderDataBean"].class.to_s == "Array")
+ while((order = @ordersReturn["OrderDataBean"][index]) != nil)
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr><td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td class="currency"><%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+
+ <td><form action = "/trade/quotes" method = "post">
+ <input type="hidden" name="SYMBOLS" value="<%=order["symbol"]%>"/>
+ <input type="submit" name="GETQUOTE" value="<%=order["symbol"]%>"/></form></td>
+
+ <td class="currency"><%=order["quantity"]%></td>
+ <td class="currency">$<%=order["price"]%></td>
+ <td class="currency">$<%="%.2f" % ((order["price"].to_f * order["quantity"].to_i) + order["orderFee"].to_f)%></td></tr>
+
+ <%
+ index = index +1
+ end
+ else
+ order = @ordersReturn["OrderDataBean"]
+ openDate = converte_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr><td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td class="currency"><%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+
+ <td><form action = "/trade/quotes" method = "post">
+ <input type="hidden" name="SYMBOLS" value="<%=order["symbol"]%>"/>
+ <input type="submit" name="GETQUOTE" value="<%=order["symbol"]%>"/></form></td>
+
+ <td class="currency"><%=order["quantity"]%></td>
+ <td class="currency"><%=order["price"]%></td>
+ <td class="currency"><%="%.2f" % ((order["price"].to_f * order["quantity"].to_i) + order["orderFee"].to_f)%></td></tr>
+
+ <%
+ end
+ %>
+ </tbody></table>
+ <%
+ end
+ %>
+
+ <%
+ # Display the account profile information associted to a
+ # the user.
+ if (@userAccountProfileDataReturn)
+ %>
+ <form action = "/trade/account" method ="post">
+ <table class="profile" cellspacing="0" width="100%"><thead><tr>
+ <th>Update Account Profile:<%=@userId%></th></tr></thead><tbody><tr><td>
+ <table cellspacing="0" align="center">
+ <tr><td>Full Name:</td><td><input name="FULLNAME" type="text" value="<%=@userAccountProfileDataReturn["fullName"]%>" id="" size="25"/>
+ </td><td>Email Address:</td><td><input name="EMAIL" type="text" value="<%=@userAccountProfileDataReturn["email"]%>" id="" size="25"/></td></tr>
+ <tr><td>Address:</td><td><input name="ADDRESS" type="text" value="<%=@userAccountProfileDataReturn["address"]%>" id="" size="25"/></td>
+ <td>Password:</td><td><input type="password" name="PASSWORD" type="text" value="<%=@userAccountProfileDataReturn["password"]%>" id="" size="25"/></td></tr>
+ <tr><td>Credit Card:</td><td><input name="CREDITCARD" type="text" value="<%=@userAccountProfileDataReturn["creditCard"]%>" id="" size="25"/></td>
+ <td>Confirm Password:</td><td><input type="password" name="PASSWORD" type="text" value="<%=@userAccountProfileDataReturn["password"]%>" id="" size="25"/></td></tr>
+ <tr><td colspan="4" class="button"><input type="submit"
+ name="UPDATEUSERPROFILE"value="Update" class="button"/></td></tr>
+ </table>
+ </form>
+
+ <%
+ # Display the account information of a the user
+ if (@userAccountDataReturn)
+
+ creationDate = convert_date(@userAccountDataReturn["creationDate"])
+ lastLogin = convert_date(@userAccountDataReturn["lastLogin"])
+ %>
+ <table align="center" class="profile-content" cellspacing="0"><tbody>
+ <tr><td class="left">Account ID:</td>
+ <td><%=@userAccountDataReturn["accountID"]%></td><td class="left">
+ Account Created</td><td><%=creationDate%></td></tr>
+ <tr><td class="left">User ID:</td>
+ <td><%=@userAccountDataReturn["profileID"]%></td><td class="left">
+ Last Login:</td><td><%=lastLogin%></td></tr>
+ <tr><td class="left">Opening Balance:</td>
+ <td>$<%=@userAccountDataReturn["openBalance"]%></td>
+ <td class="left">Total Logins:</td>
+ <td><%=@userAccountDataReturn["loginCount"]%></td></tr>
+ <tr><td class="left">Cash Balance:</td>
+
+ <%
+ if (@userAccountDataReturn["balance"].to_f > 0)
+ %>
+ <td><span class="price-gain">$<%="%.2f" % @userAccountDataReturn["balance"]%></span></td>
+ <%
+ elsif(@userAccountDataReturn["balance"].to_f < 0)
+ %>
+ <td><span class="price-loss">$<%="%.2f" % ((-1) * @userAccountDataReturn["balance"].to_f)%></span></td>
+ <%
+ else
+ %>
+ <td>$<%=@userAccountDataReturn["balance"]%></td>
+ <%
+ end
+ %>
+ <td class="left">Total Logouts:</td>
+ <td><%=@userAccountDataReturn["logoutCount"]%></td></tr>
+ </tbody></table>
+ <%
+ end
+ %>
+ </td></tr></tbody></table>
+ <%
+ end
+ %>
+
+ <div class="bottom">
+ <form method = "post" action = "/trade/quotes">
+ <input type="text" value="<%=%>" name="SYMBOLS" size="25"/>
+ <input type="submit" value="Get Quote" name="GETQUOTE" class="button"/>
+ </form>
+ </div>
+</div>
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/config.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/config.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/config.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/config.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,26 @@
+<div id="middle">
+
+ <%= @message %>
+ <div class="main-title">
+ <h1>Config</h1>
+ <script type=\"text/javascript\">
+ var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());
+ </script>
+ </div>
+
+ <div class="login">
+ <form method="post" action="/trade/config">
+ <table>
+ <tr>
+ <td>Remote Host</td>
+ <td><input type="text" name = "ENDPOINT" value = <% if (GetEndpoint() == nil || GetEndpoint() == "") %>"http://localhost:80/TradeServiceWcf/TradeServiceWcf.svc"<% else %>"<%=GetEndpoint()%>" <%end%> size = "75"/></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td><input type = "submit" name = "SETENDPOINT" value = "Set" class="button"/></td>
+ </tr>
+ </table>
+ </form>
+ </div>
+</div>
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/confirmation.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/confirmation.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/confirmation.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/confirmation.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,50 @@
+<div id="middle">
+ <div class="main-title">
+ <h1>Trade</h1>
+ <script type=\"text/javascript\">
+ var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());
+ </script>
+ </div>
+
+ <div id="confirm">
+ <h2>Trade Confirmation</h2>
+ <div class="confirm-content">
+ <form action="/trade/quotes" method="post">
+
+ <%
+ if (@isSell)
+ %>
+ <p>You have requested to sell all or part of your holding <%=@holdingID%>
+ This holding has a total of <%=@quantity%> shares of stock <%=@symbol%>
+ Please indicate how many share to sell.</p>
+
+ <nobr>Number of Shares: <input type="text" name="QUANTITY" value="100" id="" size="10"/>
+ <input type="hidden" name="HOLDINGID" value="<%=@holdingID%>"></input>
+ <input type="submit" name="SELL" value="Sell" class="button"/>
+ <%
+ elsif (@isBuy)
+ %>
+ <nobr>Number of Shares: <input type="text" name="QUANTITY" value="100" id="" size="10"/>
+ <p>You have requested to buy shares of <%=@symbol%> which is currently trading at $".$price.".</p>
+ <input type="hidden" name="SYMBOL" value="<%=@symbol%>"></input>
+ <input type="submit" name="BUY" value="Buy" class="button"/>
+ <%
+ else
+ %>
+ <%=@messsage%>
+ <%
+ end
+ %>
+ <input type="submit" name = "CANCEL" value="Cancel" class="button"/></nobr>
+ </form>
+ </div>
+ </div>
+
+ <div class="bottom">
+ <form method = "post" action = "quotes.php">
+ <input type="text" value="<%=@symbol%>" name="SYMBOLS" size="25"/>
+ <input type="submit" value="Get Quote" name="GETQUOTE" class="button"/>
+ </form>
+ </div>
+</div>
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/glossary.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/glossary.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/glossary.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/glossary.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,151 @@
+ <div id="middle">
+ <div class="main-title">
+ <h1>Glossary</h1>
+ <script type="text/javascript">
+ var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());
+ </script>
+ </div>
+ <table align="center" class="glossary" >
+ <thead>
+ <tr>
+ <th>Term</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="left">Account ID</td>
+ <td>A unique Integer based key. Each user is assigned an account ID at account creation time.</td>
+ </tr>
+ <tr>
+ <td class="left">Account Created</td>
+ <td>The time and date the users account was first created.</td>
+ </tr>
+ <tr>
+ <td class="left">Cash Balance</td>
+ <td>The current cash balance in the users account. This does not include current stock holdings.</td>
+ </tr>
+ <td class="left">Company</td>
+ <td>The full company name for an individual stock.</td>
+ </tr>
+ <td class="left">Current Gain/Loss</td>
+ <td>The total gain or loss of this account, computed by substracting the current sum of cash/holdings minus the opening account balance.</td>
+ </tr>
+ <td class="left">Current Price</td>
+ <td>The current trading price for a given stock symbol.</td>
+ </tr>
+ <td class="left">Gain/Loss</td>
+ <td>The current gain or loss of an individual stock holding, computed as (current market value - holding basis).</td>
+ </tr>
+ </tr>
+ <td class="left">Last Login</td>
+ <td>The date and time this user last logged in to Trade.</td>
+ </tr>
+ </tr>
+ <td class="left">Market Value</td>
+ <td>The current total value of a stock holding, computed as (quantity * current price).</td>
+ </tr>
+ </tr>
+ <td class="left">Number of Holdings</td>
+ <td>The total number of stocks currently owned by this account.</td>
+ </tr>
+ </tr>
+ <td class="left">Open Price</td>
+ <td>The price of a given stock at the open of the trading session.</td>
+ </tr>
+ </tr>
+ <td class="left">Order ID</td>
+ <td>A unique Integer based key. Each order is assigned an order ID at order creation time.</td>
+ </tr>
+ </tr>
+ <td class="left">Opening Balance</td>
+ <td>The initial cash balance in this account when it was opened.</td>
+ </tr>
+ </tr>
+ <td class="left">Order Status</td>
+ <td>orders are opened, processed, closed and completed. Order status shows the current stat for this order.</td>
+ </tr>
+ </tr>
+ <td class="left">Price Range</td>
+ <td>The low and high prices for this stock during the current trading session</td>
+ </tr>
+ </tr>
+ <td class="left">Purchase Date</td>
+ <td>The date and time the a stock was purchased.</td>
+ </tr>
+ </tr>
+ <td class="left">Purchase Price</td>
+ <td>The price used when purchasing the stock.</td>
+ </tr>
+ </tr>
+ <td class="left">Purchase Basis</td>
+ <td>The total cost to purchase this holding. This is computed as (quantity * purchase price).</td>
+ </tr>
+ </tr>
+ <td class="left">Quantity</td>
+ <td>The number of stock shares in the order or user holding.</td>
+ </tr>
+ </tr>
+ <td class="left">Session Created</td>
+ <td>An HTTP session is created for each user at during login. Session created shows the time and day when the session was created.</td>
+ </tr>
+ </tr>
+ <td class="left">Sum of Cash/Holdings</td>
+ <td>The total current value of this account. This is the sum of the cash balance along with the value of current stock holdings.</td>
+ </tr>
+ </tr>
+ <td class="left">Symbol</td>
+ <td>The symbol for a Trade stock.</td>
+ </tr>
+ </tr>
+ <td class="left">Total Logins</td>
+ <td>The total number of logins performed by this user.</td>
+ </tr>
+ </tr>
+ <td class="left">Total Logouts</td>
+ <td>The total number of logouts performed by this user.</td>
+ </tr>
+ </tr>
+ <td class="left">Total of Holdings</td>
+ <td>The current total value of all stock holdings in this account given the current valuation of each stock held.</td>
+ </tr>
+ </tr>
+ <td class="left">Top gainers</td>
+ <td>The list of stocks (matching LIKE CLAUSE 's:1__%' per WebSphere Trade 6.1 behavior) gaining the most in price during the current trading session.</td>
+ </tr>
+ </tr>
+ <td class="left">Top Losers</td>
+ <td>The list of stocks (matching LIKE CLAUSE 's:1__%' per WebSphere Trade 6.1 behavior) falling the most in price during the current trading session.</td>
+ </tr>
+ </tr>
+ <td class="left">Trader Stock Index (TSIA)</td>
+ <td>A computed index of the top 20 stocks (matching LIKE CLAUSE 's:1__%' per WebSphere Trade 6.1 behavior) in Trade.</td>
+ </tr>
+ </tr>
+ <td class="left">Trading Volume</td>
+ <td>The total number of shares traded for stocks (matching LIKE CLAUSE 's:1__%' per WebSphere Trade 6.1 behavior) during this trading session.</td>
+ </tr>
+ </tr>
+ <td class="left">Txn Fee</td>
+ <td>The fee charged by the brokerage to process this order.</td>
+ </tr>
+ </tr>
+ <td class="left">Type</td>
+ <td>The order type (buy or sell).</td>
+ </tr>
+ </tr>
+ <td class="left">User ID</td>
+ <td>The unique user ID for the account chosen by the user at account registration.</td>
+ </tr>
+ </tr>
+ <td class="left">Volume</td>
+ <td>The total number of shares traded for this stock.</td>
+ </tr>
+ </tbody>
+ </table>
+
+
+
+
+ </div>
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/home.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/home.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/home.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/home.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,231 @@
+<div id="middle">
+ <div class="main-title"><h1>Home</h1><script type="text/javascript">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script></div>
+ <h3>Welcome <%=@userId%></h3>
+
+ <table>
+ <tr>
+ <td>
+ <div class="left">
+ <table class="normal">
+ <thead><tr><th colspan="2">User Statistics</th></tr></thead>
+
+ <%
+ if(@accountDataReturn)
+ creationDate = convert_date(@accountDataReturn["creationDate"])
+ lastLogin = convert_date(@accountDataReturn["lastLogin"])
+ %>
+ <tbody>
+ <tr><td class="left">Account ID:</td>
+ <td><%=@accountDataReturn["accountID"]%></td></tr>
+ <tr><td class="left">Account Created:</td>
+ <td><%=creationDate%></td></tr>
+ <tr><td class="left">Total Logins:</td>
+ <td><%=@accountDataReturn["loginCount"]%></td></tr>
+ <tr><td class="left">Session Created:</td>
+ <td><%=lastLogin%></td></tr>
+ </tbody>
+ <%
+ end
+ %>
+
+
+ <thead><tr><th colspan="2">Summary</th></tr></thead>
+ <%
+ if (!(@holdingInfo == nil) || (@accountDataReturn == nil))
+ %>
+ <tbody>
+ <tr><td class="left">Cash Balance:</td>
+ <td><%=@accountDataReturn["balance"]%></td></tr>
+
+ <tr><td class="left">Number of Holdings:</td>
+ <td><%=@noOfHoldings%></td></tr>
+
+ <tr><td class="left">Total of Holdings:</td><td>
+ <%=@totalHoldings%>
+ </td></tr>
+
+ <tr><td class="left">Sum of Cash and Holdings:</td><td>
+ $<%=@totalHoldings.to_f + (@accountDataReturn["balance"].to_f)%>
+ </td></tr>
+
+ <tr><td class="left">Opening Balance:</td><td>
+ $ <%=@accountDataReturn["openBalance"]%>
+ </td></tr>
+
+ <tr><td class="left">Current Gain/(Loss):</td>
+ <td><span class="price">
+ <% gain = ((@totalHoldings.to_f + (@accountDataReturn["balance"].to_f)) - @accountDataReturn["openBalance"].to_f)%>
+ <%
+ if (gain < 0)
+ %>
+ <%=(-1) * gain%>
+ <%
+ elsif (gain >= 0)
+ %>
+ <%=gain%>
+ <%
+ end
+ gainPercent = (gain/@accountDataReturn["openBalance"].to_f) * 100
+ %>
+ </span></td></tr>
+
+
+ <tr><td class="left">%Gain/(Loss):</td><td>
+
+ <%
+ if (gainPercent > 0)
+ %>
+ <span class="price-gain"><%=gainPercent%>%</span>
+ <%
+ elsif (gainPercent < 0)
+ %>
+ <span class="price-loss"><%=gainPercent%></span>
+ <%
+ else
+ %>
+ <span><%=gainPercent%>%</span>
+ <%
+ end
+ %>
+ </td></tr>
+ </tbody>
+ <%
+ end
+ %>
+ </table>
+ </td>
+
+ <td>
+ <div class="right">
+ <h3>Market Summary</h3>
+ <p><?php print(date("D, F j, Y, g:i a")); ?></p>
+
+ <table class="table-outer" cellspacing="0">
+ <%
+ if ((@holdingInfo != nil) && (@accountDataReturn != nil))
+ %>
+ <tr><td class="special">Trade Stock Index (TSIA)</td><td>
+ <%="%.2f" % @tsia%>
+ <%
+ if (@gain > 0)
+ %>
+ <span class="price-gain">$
+ <%
+ elsif (@gain < 0)
+ %>
+ <span class="price-loss">$
+ <%
+ else
+ %>
+ <span>$
+ <%
+ end
+ %>
+ <%="%.2f" % (@gain.to_f)%></span>
+ </td></tr>
+
+ <tr><td class="special">Trading Volume</td><td>
+
+ <%=@volume%>
+ </td></tr>
+
+ <tr><td class="special">Top Gainers</td><td>
+ <table class="table-inner" cellspacing="0">
+ <thead><tr><th>Symbol</th><th>Price</th><th>Change</th></tr></thead>
+ <tbody>
+
+ <%
+ index = 0
+ gainer = @topGainers[index]
+ while(gainer != nil)
+ %>
+ <tr><td><form action = "/trade/quotes" method = "post">
+ <input type="hidden" name="SYMBOLS" value="<%=gainer["symbol"]%>"/>
+ <input type="submit" name="GETQUOTE" value="<%=gainer["symbol"]%>"></input></form></td>
+
+ <td>$<%=gainer["price"]%></td>
+ <td>
+ <%
+ if ((gainer["change"].to_f) > 0)
+ %>
+ <span class="price-gain">$
+ <%
+ elsif ((gainer["change"].to_f) < 0)
+ %>
+ <span class="price-loss">$
+ <%
+ else
+ %>
+ <span>$
+ <%
+ end
+ %>
+
+ <%=gainer["change"]%>
+ </span></td>
+ </form></tr>
+
+ <%
+ index = index + 1
+ gainer = @topGainers[index]
+ end
+ %>
+
+ </tbody></table></td></tr>
+
+ <tr><td class="special">Top Losers</td><td>
+ <table class="table-inner" cellspacing="0"><thead>
+ <tr><th>Symbol</th><th>Price</th><th>Change</th></tr></thead><tbody>
+
+ <%
+ index = 0
+ loser = @topLosers[index]
+ while(loser)
+ %>
+ <tr><td><form action = "quotes.php" method = "post">
+ <input type="submit" name="SYMBOLS" value="<%=loser["symbol"]%>"></input></form></td>
+
+ <td>$<%=loser["price"]%></td>
+ <td>
+
+ <%
+ if ((loser["change"].to_f) > 0)
+ %>
+ <span class="price-gain">$
+ <%
+ elsif ((loser["change"].to_f) < 0)
+ %>
+ <span class="price-loss">$
+ <%
+ else
+ %>
+ <span>$
+ <%
+ end
+ %>
+ <%=loser["change"]%>
+ </span></td>
+ </tr>
+
+ <%
+ index = index + 1
+ loser = @topLosers[index]
+ end
+ %>
+ </tbody></table>
+ </td></tr></table>
+ </div>
+ </td></tr></table>
+ <%
+ end
+ %>
+
+
+ <div class="bottom">
+ <form method = "post" action = "/trade/quotes">
+ <input type="text" value="<%=%>" name="SYMBOLS" size="25"/>
+ <input type="submit" value="Get Quote" name="GETQUOTE" class="button"/>
+ </form>
+ </div>
+</div>
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/index.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/index.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/index.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/index.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,42 @@
+ <div id="middle">
+ <div class="main-title">
+ <h1>Welcome!</h1>
+ <script type=\"text/javascript\">
+ var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());
+ </script>
+ </div>
+ <table>
+ <tr>
+ <td>
+ <div class="left">
+ <p> The design of WSO2 StockTrader sample application is based on an online stock trading scenario with the functionality of the application equivalent to the <a href="http://msdn.microsoft.com/stocktrader">Microsoft .NET Stock Trader </a> sample benchmark application and <a href="https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=trade6">IBM WebSphere's Trade 6.1 </a> sample application. WSO2 StockTrader sample application is powered by <a href="http://wso2.org/projects/wsf/php">WSO2 WSF/PHP</a> and <a href="http://wso2.org/projects/wsas/java">WSO2 WSAS</a>. It serves to illustrate interoperability between PHP Java and .NET in deploying high-performance, scalable service oriented applications. </p>
+
+<p>For more details, check <a href="http://wso2.org/interop/stocktrader">WSO2 Stock Trader home page</a>. </p>
+
+ </div>
+ </td>
+ <td>
+ <div class="right">
+ <h3>Sample of Technologies Demonstrated</h3>
+ <table>
+ <tbody>
+ <tr>
+ <td>
+ <ul>
+ <li>Service-oriented, n-tier design with PHP, Java and .NET</li>
+ <li>Clean separation of UI, business services and DB access</li>
+ <li>WSO2 Web Services Framework For PHP</li>
+ <li>WSO2 Web Services Application Server</li>
+ <li>Interoperability with .NET</li>
+ <li>Loosely-coupled, message-oriented design</li>
+ </ul>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </tr>
+ </table>
+ </div>
+
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/login.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/login.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/login.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/login.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,36 @@
+<div id="middle">
+
+ <div class="main-title">
+ <h1>Login</h1>
+ <b><%= @message %> </b>
+ <script type="text/javascript">
+ var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());
+ </script>
+ </div>
+
+ <div class="login">
+ <form method="post" action="/trade/login">
+ <table>
+ <tr>
+ <td>Username</td>
+ <td><input name="USERNAME" size="25"/></td>
+ </tr>
+ <tr>
+ <td>Password</td>
+ <td><input type="password" name="PASSWORD" size="25"/></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td><input type="submit" name="LOGINREQUEST" value="Login" class="button"/></td>
+ </tr>
+ </table>
+ </form>
+
+ <p>Try password "xxx" for user "uid:0" to access the stock trader web application.</p>
+ <p class="new-user">
+ <a href="/trade/register">First time user?</a>
+ </p>
+</div>
+</div>
+
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/portfolio.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/portfolio.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/portfolio.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/portfolio.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,153 @@
+ <%
+ # Checking whether there is new status change happened in the
+ # related to a particular order.
+ if (@closedOrders != nil)
+ %>
+ <p style="color: red" align="center">Trade Alert:
+ The following orders have completed.</p>
+ <table class="table-outer"
+ cellspacing="0" align="center"><thead>
+ <tr><th>Order ID</th><th>Order Status</th>
+ <th>Creation Date</th><th>Completion Date</th>
+ <th>Txn Fee</th><th>Type</th><th>Symbol</th>
+ <th>Quantity</th></tr></thead><tbody>
+
+ <%
+ index = 0
+ if(@closedOrders["OrderDataBean"].class.to_s == "Array")
+ while ((order = @closedOrders["OrderDataBean"][index]) != nil)
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr>
+ <td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td>$<%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+ <td><%=order["symbol"]%></td>
+ <td><%=order["quantity"]%></td>
+ </tr>
+ <%
+ index = index + 1
+ end
+ else
+ order = @closedOrders["OrderDataBean"]
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr>
+ <td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td>$<%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+ <td><%=order["symbol"]%></td>
+ <td><%=order["quantity"]%></td>
+ </tr>
+ <%
+ end
+ %>
+ </tbody></table><br/><br/>
+ <%
+ end
+ %>
+
+ <%
+ if (@holdingsReturn)
+ %>
+ <div class="main-title">
+ <h1>Portfolio Information</h1><script type="text/javascript">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script></div>
+
+ <table class="table-outer" cellspacing="0" align="center">
+ <thead><tr><th>Holding ID</th><th>Purchase Date</th><th>Symbol</th>
+ <th>Quantity</th><th>Purchase Price</th><th>Current Price</th>
+ <th>Purchase Basis</th><th>Market Value</th><th>Gain(Loss)</th>
+ <th>Trade</th></tr></thead><tbody>
+ <%
+ index = 0;
+ purchaseBasis = 0;
+ marketValue = 0;
+ gain = 0;
+
+ while ((bean=@holdingsReturn["HoldingDataBean"][index]) != nil)
+
+ quoteID = bean["quoteID"]
+ purchaseBasis = purchaseBasis + bean["purchasePrice"].to_f * (bean["quantity"].to_i)
+ marketValue = marketValue + (@quoteInfo[quoteID].to_i) * (bean["quantity"].to_i)
+ gain = (@quoteInfo[quoteID].to_f - bean["purchasePrice"].to_f) * (bean["quantity"].to_i)
+
+ dateTime = convert_date(bean["purchaseDate"])
+ %>
+
+ <tr>
+ <td><%=bean["holdingID"]%></td>
+ <td><nobr><%=dateTime%></nobr></td>
+ <td>
+ <form action="/trade/quotes" method="post">
+ <input type="hidden" name="SYMBOLS" value="<%=bean["quoteID"]%>"/>
+ <input type="submit" name="GETQUOTE" value="<%=bean["quoteID"]%>"></input>
+ </form></td>
+ <td class="currency"><%=bean["quantity"]%></td>
+ <td class="currency">$<%=bean["purchasePrice"]%></td>
+ <td class="currency">$<%=@quoteInfo[quoteID]%></td>
+ <td class="currency">$<%="%.2f" % ((bean["purchasePrice"].to_f) * (bean["quantity"].to_i))%></td>
+ <td class="currency">$<%="%.2f" % (@quoteInfo[quoteID].to_f * bean["quantity"].to_i)%></td>
+ <td class="currency">
+ <%
+ if (gain > 0)
+ %>
+ <span class="price-gain">$<%="%.2f" % gain%></span>
+ <%
+ elsif (gain < 0)
+ gain = gain * -1
+ %>
+ <span class="price-loss">$<%="%.2f" % gain%></span>
+ <%
+ else
+ %>
+ <span>$<%="%.2f" % gain%></span>
+ <%
+ end
+ %>
+ </td><td class="currency">
+ <form action = "/trade/confirmation" method = "post">
+ <input type="hidden" name="HOLDINGID" value="<%=bean["holdingID"]%>"></input>
+ <input type="hidden" name="QUANTITY" value="<%=bean["quantity"]%>"></input>
+ <input type="hidden" name="SYMBOL" value="<%=bean["quoteID"]%>"></input>
+ <input type="submit" value = "Sell" name="SELL">
+ </input></td></tr></form>
+
+ <%
+ index = index + 1
+ end
+ %>
+ <tr class="total"><td colspan="6">Totals</td><td class="currency">$<%=purchaseBasis%></td>
+ <td class="currency">$<%=marketValue%></td><td>
+
+ <%
+ gain = marketValue - purchaseBasis
+ if (gain < 0)
+ %>
+ <span class=\"price-loss\">$<%=gain%></span></td><td></td></tr>
+ <%
+ elsif (gain > 0)
+ %>
+ <span class=\"price-gain\">$<%=gain%></span></td><td></td></tr>
+ <%
+ else
+ %>
+ <span>$<%=gain%></span></td><td></td></tr>
+ <%
+ end
+ %>
+
+ </tbody></table>
+ <%
+ end
+ %>
+
+
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/quotes.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/quotes.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/quotes.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/quotes.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,231 @@
+<div id="middle">
+
+ <%
+ # Checking whether there is new status change happened in the
+ # related to a particular order.
+ if (@closedOrders != nil)
+ %>
+ <p style="color: red" align="center">Trade Alert:
+ The following orders have completed.</p>
+ <table class="table-outer"
+ cellspacing="0" align="center"><thead>
+ <tr><th>Order ID</th><th>Order Status</th>
+ <th>Creation Date</th><th>Completion Date</th>
+ <th>Txn Fee</th><th>Type</th><th>Symbol</th>
+ <th>Quantity</th></tr></thead><tbody>
+
+ <%
+ index = 0
+ if(@closedOrders["OrderDataBean"].class.to_s == "Array")
+ while ((order = @closedOrders["OrderDataBean"][index]) != nil)
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr>
+ <td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td>$<%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+ <td><%=order["symbol"]%></td>
+ <td><%=order["quantity"]%></td>
+ </tr>
+ <%
+ index = index + 1
+ end
+ else
+ order = @closedOrders["OrderDataBean"]
+ openDate = convert_date(order["openDate"])
+ completionDate = convert_date(order["completionDate"])
+ %>
+ <tr>
+ <td><%=order["orderID"]%></td>
+ <td><%=order["orderStatus"]%></td>
+ <td><%=openDate%></td>
+ <td><%=completionDate%></td>
+ <td>$<%=order["orderFee"]%></td>
+ <td><%=order["orderType"]%></td>
+ <td><%=order["symbol"]%></td>
+ <td><%=order["quantity"]%></td>
+ </tr>
+ <%
+ end
+ %>
+ </tbody></table><br/><br/>
+ <%
+ end
+ %>
+
+ <%
+ if (@isReply)
+ # Check whether the user has requested to buy or sell some quote.
+ %>
+ <div class="main-title"><h1>New Order</h1>
+ <script type="text/javascript">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script></div>
+ <p align="center">Order
+ <%= (@buyReturn && @buyReturn["orderID"] != nil) ? @buyReturn["orderID"]: @sellEnhancedReturn["orderID"] %>
+ to
+ <%= (@buyReturn && @buyReturn["quantity"] != nil) ? "buy " + @buyReturn["quantity"]: "sell " + @sellEnhancedReturn["quantity"] %>
+ shares of s:0 has been submitted for processing.</p>
+ <p align="center">Order Details:</p>
+ <table class="table-outer" cellspacing="0" align="center"><thead><tr>
+ <th>Order ID</th><th>Order Status</th><th>Creation Date</th>
+ <th>Completion Date</th><th>Txn Fee</th><th>Type</th><th>Symbol</th>
+ <th>Quantity</th></tr></thead>
+ <tbody>
+ <%
+ if(@isBuy)
+ dateTime = convert_date(@buyReturn["openDate"])
+ %>
+ <tr>
+ <td><%=@buyReturn["orderID"]%></td>
+ <td><%=@buyReturn["orderStatus"]%></td>
+ <td><%=dateTime%></td>
+ <td>Pending </td>
+ <td>$<%=@buyReturn["orderFee"]%></td>
+ <td><%=@buyReturn["orderType"]%></td>
+ <td><%=@buyReturn["symbol"]%></td>
+ <td><%=@buyReturn["quantity"]%></td>
+ </tr>
+ <%
+ elsif (@isSell)
+ dateTime = convert_date(@sellEnhancedReturn["openDate"])
+ %>
+ <tr>
+ <td><%=@sellEnhancedReturn["orderID"]%></td>
+ <td><%=@sellEnhancedReturn["orderStatus"]%></td>
+ <td><%=dateTime%></td>
+ <td>Pending</td>
+ <td>$<%=@sellEnhancedReturn["orderFee"]%></td>
+ <td><%=@sellEnhancedReturn["orderType"]%></td>
+ <td><%=@sellEnhancedReturn["symbol"]%></td>
+ <td><%=@sellEnhancedReturn["quantity"]%></td>
+ </tr>
+ <%
+ end
+ %>
+ </tbody></table>
+ <%
+ elsif(@quotesReturn != nil) #else to isreply
+ %>
+ <div class=\"main-title\"><h1>Stock Quotes</h1>
+ <script type=\"text/javascript\">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script>
+ </div>
+ <table class="table-outer" cellspacing="0" align="center"><thead>
+ <tr><th>Symbol</th><th>Company</th><th>Volume</th><th>Price Range</th>
+ <th>Open Price</th><th>Current Price</th><th>Gain(Loss)</th><th>Trade</th></tr></thead><tbody>
+
+ <%
+ if(@quotesReturn["symbol"] != nil)
+ %>
+ <tr>
+ <td><%=@quotesReturn["symbol"]%></td>
+ <td><%=@quotesReturn["companyName"]%></td>
+ <td><%=@quotesReturn["volume"]%></td>
+ <td>$<%=@quotesReturn["low"]%>-$<%=@quotesReturn["high"]%></td>
+ <td>$<%=@quotesReturn["open"]%></td>
+ <td>$<%=@quotesReturn["price"]%></td>
+ <td>
+ <%
+ if (@quotesReturn["change"].to_f > 0)
+ %>
+ <span class="price-gain">$<%="%.2f" % @quotesReturn["change"]%></span>
+ <%
+ elsif (@quotesReturn["change"].to_f < 0)
+ abs_change = -1 * @quotesReturn["change"].to_f
+ %>
+ <span class="price-loss">$<%="%.2f" % (abs_change)%></span>
+ <%
+ else
+ %>
+ <span>$<%=@quotesReturn["change"]%></span>
+ <%
+ end
+ %>
+ </td><td><form action="/trade/confirmation" method="post">
+ <input type="hidden" name="QUANTITY" value="<%=@quotesReturn["volume"]%>"/>
+ <input type="hidden" name="SYMBOL" value="<%=@quotesReturn["symbol"]%>"/>
+ <input type="hidden" name="PRICE" value="<%=@quotesReturn["price"]%>"/>
+ <input type="submit" name="BUY" value="Buy"></input>
+ </form></td></tr>
+ <%
+ end
+ %>
+ </tbody></table>
+ <%
+ elsif(@quotesInitialPage) # else for isreply
+ %>
+ <div class="main-title"><h1>Stock Quotes</h1>
+ <script type="text/javascript">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script>
+ </div>
+ <table class="table-outer" cellspacing="0" align="center"><thead>
+ <tr><th>Symbol</th><th>Company</th><th>Volume</th><th>Price Range</th>
+ <th>Open Price</th><th>Current Price</th><th>Gain(Loss)</th><th>Trade</th></tr></thead><tbody>
+
+ <%
+ symbolCount = 0;
+ while(symbolCount < 5)
+ quotesReturn = GetQuote("s:" + symbolCount.to_s)
+
+ if (quotesReturn)
+ if (quotesReturn["symbol"])
+ %>
+ <tr>
+ <td><%=quotesReturn["symbol"]%></td>
+ <td><%=quotesReturn["companyName"]%></td>
+ <td><%=quotesReturn["volume"]%></td>
+ <td>$<%=quotesReturn["low"]%>-$<%=quotesReturn[">high"]%></td>
+ <td>$<%=quotesReturn["open"]%></td>
+ <td>$<%=quotesReturn["price"]%></td>
+ <td>
+ <%
+ if (quotesReturn["change"].to_f> 0)
+ %>
+ <span class="price-gain">$<%="%.2f" % quotesReturn["change"]%></span>
+ <%
+ elsif (quotesReturn["change"].to_f< 0)
+ abs_ret = -1 *quotesReturn["change"].to_f
+ %>
+ <span class="price-loss">$<%="%.2f" % (abs_ret)%></span>
+ <%
+ else
+ %>
+ <span>$<%=quotesReturn["change"]%></span>
+ <%
+ end
+ %>
+ </td>
+ <td><form action="/trade/confirmation" method="post">
+ <input type="hidden" name="QUANTITY" value="<%=quotesReturn["volume"]%>"/>
+ <input type="hidden" name="SYMBOL" value="<%=quotesReturn["symbol"]%>"/>
+ <input type="hidden" name="PRICE" value="<%=quotesReturn["price"]%>"/>
+ <input type="submit" name="BUY" value="Buy"></input></form></td></tr>
+ <%
+ end
+ %>
+ <%
+ end
+ symbolCount = symbolCount + 1
+ %>
+ <%
+ end
+ %>
+ </tbody></table>
+
+ <%
+ else
+ %>
+ <div class="main-title"><h1>Stock Quotes</h1>
+ <script type="text/javascript">var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());</script>
+ </div>
+ <%
+ end
+ %>
+
+
+</div>
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/register.html.erb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/register.html.erb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/register.html.erb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/app/views/trade/register.html.erb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,81 @@
+<%=@message%>
+<div id="middle">
+ <div class="main-title">
+ <h1>Register</h1>
+ <script type="text/javascript">
+ var thisdate = new Date();
+ document.writeln(thisdate.toLocaleString());
+ </script>
+ </div>
+
+ <%
+ if (@successfulRegistration)
+ %>
+ <p style="color: red" align="center">
+ Registration was successful, please <a href ="/trade/login">login</a>.</p>
+ <%
+ else
+ if (@invalidInformation)
+ %>
+ <p style="color: red" align="center">Please enter valid information.</p>
+ <%
+ end
+ %>
+ <table class="profile" cellspacing="0" width="100%">
+ <thead>
+ <tr>
+ <th>
+ Create Account Profile:
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <form action="/trade/register" method="post">
+ <table cellspacing="0" align="center">
+ <tr>
+ <td colspan="4" >
+
+ </td>
+ </tr>
+ <tr>
+ <td>Requested ID:</td>
+ <td><input name="REQUESTEDID" type="text" id="" size="25"/></td>
+ <td>Opening Balance:</td>
+ <td><input type="text" name="OPENBALANCE" value="100000" id="" size="25"/></td>
+ </tr>
+ <tr>
+ <td>Full Name:</td>
+ <td><input type="text" name="FULLNAME" id="" size="25"/></td>
+ <td>Email Address:</td>
+ <td><input type="text" name="EMAIL" id="" size="25"/></td>
+ </tr>
+ <tr>
+ <td>Address:</td>
+ <td><input name="ADDRESS" type="text" id="" size="25"/></td>
+ <td>Password:</td>
+ <td><input name="PASSWORD" type="password" id="" size="25"/></td>
+ </tr>
+ <tr>
+ <td>Credit Card:</td>
+ <td><input name="CREDITCARD" type="text" id="" size="25"/></td>
+ <td>Confirm Password:</td>
+ <td><input name="CONFIRMATIONPASSWORD" type="password" id="" size="25"/></td>
+ </tr>
+ <tr>
+ <td colspan="4" class="button">
+ <input type="submit" name="REGISTERUSER" value="Register" class="button"/>
+ </td>
+ </tr>
+ </table>
+ </form>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <%
+ end
+ %>
+</div>
+
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/boot.rb
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/boot.rb?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/boot.rb (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/boot.rb Wed Nov 26 02:52:40 2008
@@ -0,0 +1,127 @@
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+
+# Don't change this file!
+# Configure your app in config/environment.rb and config/environments/*.rb
+
+RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
+
+module Rails
+ class << self
+ def boot!
+ unless booted?
+ preinitialize
+ pick_boot.run
+ end
+ end
+
+ def booted?
+ defined? Rails::Initializer
+ end
+
+ def pick_boot
+ (vendor_rails? ? VendorBoot : GemBoot).new
+ end
+
+ def vendor_rails?
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
+ end
+
+ def preinitialize
+ load(preinitializer_path) if File.exist?(preinitializer_path)
+ end
+
+ def preinitializer_path
+ "#{RAILS_ROOT}/config/preinitializer.rb"
+ end
+ end
+
+ class Boot
+ def run
+ load_initializer
+ Rails::Initializer.run(:set_load_path)
+ end
+ end
+
+ class VendorBoot < Boot
+ def load_initializer
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
+ Rails::Initializer.run(:install_gem_spec_stubs)
+ end
+ end
+
+ class GemBoot < Boot
+ def load_initializer
+ self.class.load_rubygems
+ load_rails_gem
+ require 'initializer'
+ end
+
+ def load_rails_gem
+ if version = self.class.gem_version
+ gem 'rails', version
+ else
+ gem 'rails'
+ end
+ rescue Gem::LoadError => load_error
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
+ exit 1
+ end
+
+ class << self
+ def rubygems_version
+ Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
+ end
+
+ def gem_version
+ if defined? RAILS_GEM_VERSION
+ RAILS_GEM_VERSION
+ elsif ENV.include?('RAILS_GEM_VERSION')
+ ENV['RAILS_GEM_VERSION']
+ else
+ parse_gem_version(read_environment_rb)
+ end
+ end
+
+ def load_rubygems
+ require 'rubygems'
+
+ unless rubygems_version >= '0.9.4'
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
+ exit 1
+ end
+
+ rescue LoadError
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
+ exit 1
+ end
+
+ def parse_gem_version(text)
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
+ end
+
+ private
+ def read_environment_rb
+ File.read("#{RAILS_ROOT}/config/environment.rb")
+ end
+ end
+ end
+end
+
+# All that for this:
+Rails.boot!
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml Wed Nov 26 02:52:40 2008
@@ -0,0 +1,42 @@
+# MySQL. Versions 4.1 and 5.0 are recommended.
+#
+# Install the MySQL driver:
+# gem install mysql
+# On Mac OS X:
+# sudo gem install mysql -- --with-mysql-dir=/usr/local/mysql
+# On Mac OS X Leopard:
+# sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
+# This sets the ARCHFLAGS environment variable to your native architecture
+# On Windows:
+# gem install mysql
+# Choose the win32 build.
+# Install MySQL and put its /bin directory on your path.
+#
+# And be sure to use new-style password hashing:
+# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
+development:
+ adapter: mysql
+ encoding: utf8
+ database: rubytraderclient_development
+ username: %
+ password:
+ host: localhost
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ adapter: mysql
+ encoding: utf8
+ database: rubytraderclient_test
+ username: %
+ password:
+ host: localhost
+
+production:
+ adapter: mysql
+ encoding: utf8
+ database: rubytraderclient_production
+ username: %
+ password:
+ host: localhost
Added: incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml.bk
URL: http://svn.apache.org/viewvc/incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml.bk?rev=720797&view=auto
==============================================================================
--- incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml.bk (added)
+++ incubator/stonehenge/contrib/stocktrader/ruby/trader_client/config/database.yml.bk Wed Nov 26 02:52:40 2008
@@ -0,0 +1,19 @@
+# SQLite version 3.x
+# gem install sqlite3-ruby (not necessary on OS X Leopard)
+development:
+ adapter: sqlite3
+ database: db/development.sqlite3
+ timeout: 5000
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ adapter: sqlite3
+ database: db/test.sqlite3
+ timeout: 5000
+
+production:
+ adapter: sqlite3
+ database: db/production.sqlite3
+ timeout: 5000