//
// 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.
//
// .NET StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications
using System;
using System.Text;
using System.Web;
using System.Web.Security;
using Trade.BusinessServiceClient;
using Trade.StockTraderWebApplicationModelClasses;
using Trade.StockTraderWebApplicationSettings;
using Trade.Utility;
namespace Trade.Web
{
///
/// Calls into Business Services to place an order (buy/sell). Note that this page is called from the
/// StockTrade.aspx page after user enters number of shares. This is slightly different than Trade 6.1 flow,
/// but necessary since we allow selling portions of a holding vs. just entire holding ala Trade 6.1. However,
/// for benchmarking this page can be called directly without visiting StockTrade.aspx when comparing perf to Trade 6.1,
/// for equivalence.
///
public partial class Order : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
BSLClient businessServicesClient = new BSLClient();
OrderDataUI order = null;
string userid = null;
string action = Input.InputText(Request["action"], 10) ?? string.Empty;
double quantity = 0;
string symbol = null;
int holdingID = -1;
bool badQuantity = false;
/****************************
* Buy a Stock
****************************/
if (action.Equals(StockTraderUtility.ORDER_TYPE_BUY))
{
if (!Double.TryParse(Request["quantity"], out quantity))
badQuantity = true;
symbol = Input.InputText(Request["symbol"], StockTraderUtility.SYMBOLSTRING_MAXLENGTH);
if (quantity > 0)
order = businessServicesClient.buy(userid, symbol, quantity);
else
badQuantity = true;
}
/****************************
* Sell a Stock
****************************/
else if (action.Equals(StockTraderUtility.ORDER_TYPE_SELL))
{
holdingID = Int32.Parse(Request["holdingid"]);
//WebSphere Trade 6.1 does not provide functionality for trading partial holdings.
//.NET StockTrader does, but will default to Trade 6.1 behavior and sell and entire holding if no
//quantity parameter is detected on the query string. Here we check if a quantity parameter actually
//exists on the query string. This is a bit of extra overhead, but done so we can add functionality
// (selling part of a holding) yet not sacrifice interop with WebSphere Trade 6.1
string quantityParam = Request["quantity"];
if (quantityParam != null)
{
quantity = Double.Parse(Request["quantity"]);
if (quantity <= 0)
badQuantity = true;
}
else
quantity = 0; //Value of 0 indicates to sell entire holding.
if (!badQuantity)
order = businessServicesClient.sell(userid, holdingID, quantity);
}
else
{
ConfirmMessage.Text = StockTraderUtility.EXCEPTION_MESSAGE_BAD_ACTION;
return;
}
if (!badQuantity)
{
if (order != null)
{
Cache.Remove(Settings.CACHE_KEY_CLOSED_ORDERSALERT + userid);
string orderIdStr = order.orderID.ToString();
OrderID.Text = orderIdStr;
OrderStatus.Text = order.orderStatus;
OpenDate.Text = order.openDate.ToString();
CompletionDate.Text = order.completionDate.ToString();
OrderFee.Text = string.Format("{0:C}", order.orderFee);
OrderType.Text = order.orderType;
string orderLink = order.quoteLink;
Symbol.Text = orderLink;
string orderQty = string.Format("{0:0,0}", order.quantity);
Quantity.Text = orderQty;
StringBuilder strBuilder = new StringBuilder("Order ");
strBuilder.Append(orderIdStr);
strBuilder.Append(" to ");
strBuilder.Append(order.orderType);
strBuilder.Append(" ");
strBuilder.Append(orderQty);
strBuilder.Append(" shares of ");
strBuilder.Append(orderLink);
strBuilder.Append(" has been submitted for processing.
");
strBuilder.Append("Order Details:");
ConfirmMessage.Text = (strBuilder.ToString());
// only show the panel if it didn't fail
this.OrderSummaryPanel.Visible = true;
}
else
ConfirmMessage.Text = StockTraderUtility.EXCEPTION_MESSAGE_BAD_ORDER_RETURN;
}
else
{
ConfirmMessage.Text = StockTraderUtility.EXCEPTION_MESSAGE_BAD_ORDER_PARMS;
}
}
}
}