public class AssetReportServlet : IHttpHandler
{
private SortedDictionary<string,BigDecimal> groupTotal; // Store positions for all assets
private SortedDictionary<string,BigDecimal> positions;
private BigDecimal allPositions; // risks for all assets
private SortedDictionary<string,BigDecimal> m_hmRiskTable;
private SortedDictionary<string,string> assetToGroup;
private SortedDictionary<string,BigDecimal> assetFamily; private BigDecimal totalRisks; public AssetReportServlet() {} public void ProcessRequest(HttpContext context)
{
RecordSet records = (RecordSet) context.Items["queryResult"];
TextWriter writer = context.Response.Output;
groupTotal = new SortedDictionary<string,BigDecimal>();
positions = new SortedDictionary<string,BigDecimal>();
m_hmRiskTable = new SortedDictionary<string,BigDecimal>();
allPositions = new BigDecimal("0.00");
assetToGroup = new SortedDictionary<string,string>();
for (int row = 0; row < records.getRowCount(); row++)
{
BigDecimal pos = new BigDecimal(1);
BigDecimal r = new BigDecimal("0.00");
string issue = "";
issue = records.getItem(row, "ISSUE_NAME");
if (records.getItem(row, "ISSUE_FAMILY").ToUpper().StartsWith("FUND"))
{
// pos = (quantity * marketPrice) - total cost [TERM_ONE])
BigDecimal perItem = records.getDecimal(row, "MARKET_PRICE").subtract(records.getDecimal(row, "TERM_ONE"));
pos = perItem.multiply(records.getDecimal(row, "QUANTITY")).setScale(2, RoundingMode.ROUND_HALF_UP);
BigDecimal riskCoefficient = RiskAssessor.getInstance().getRiskCoefficient(records.getItem(row, "ISSUE_FAMILY"), records
.getDecimal(row, "TERM_TWO"));
BigDecimal product = riskCoefficient.multiply(pos);
r = product.divide(new BigDecimal("100.00"), 2, RoundingMode.ROUND_HALF_UP);
positions[issue] = pos; }
else
{
// TODO: Check with Betty on this
// pos = quantity * (marketPrice - unit cost [TERM_ONE])
pos = records.getDecimal(row, "QUANTITY").multiply(records.getDecimal(row, "MARKET_PRICE"));
pos = pos.subtract(records.getDecimal(row, "TERM_ONE")).setScale(2, RoundingMode.ROUND_HALF_UP);
BigDecimal product = records.getDecimal(row, "TERM_TWO").multiply(pos);
r = product.divide(new BigDecimal("100.00"), 2, RoundingMode.ROUND_HALF_UP);
positions[issue] = pos;
}
// else {
// pos = records.getDecimal(row, "POSITION");
// risk = records.getDecimal(row, "POSITION").multiply(new
// BigDecimal(0.10));
// } allPositions = allPositions.add(positions[issue]); String group = records.getItem(row, "ISSUE_GROUP");
String name = records.getItem(row, "ISSUE_NAME");
assetToGroup[name]= group;
BigDecimal value = new BigDecimal("0");
if (groupTotal.ContainsKey(group))
value = value.add(groupTotal[group]).setScale(2);
value = value.add(positions[issue]);
groupTotal[group]= value.setScale(2);
m_hmRiskTable[issue]= r;
} writer.Write("<groups>\n");
SortedDictionary<string, BigDecimal>.KeyCollection.Enumerator g = groupTotal.Keys.GetEnumerator();
// groups in sorted order
while (g.MoveNext())
{
String grp = g.Current;
BigDecimal position = groupTotal[grp];
BigDecimal product = position.multiply(new BigDecimal(100));
BigDecimal weight = product.divide(allPositions, 2, RoundingMode.ROUND_HALF_UP);
writer.Write("\t<group position='" + position.toPlainString());
writer.Write("' weight='" + weight);
writer.Write("'>\n");
writer.Write("\t\t" + grp + "\n");
SortedDictionary<string, BigDecimal>.KeyCollection.Enumerator i = positions.Keys.GetEnumerator();
bool notFirstOne = false;
// groups in sorted order
while (i.MoveNext())
{
string asset = i.Current;
// output asset only if it belongs to group
if (assetToGroup[asset].ToUpper().Equals(grp))
{
// add newline only if it's not first one
if (notFirstOne)
writer.Write("\n");
writer.Write("\t\t<asset position='" + positions[asset].toPlainString() + "' ");
BigDecimal p = positions[asset];
BigDecimal weight1 = p.multiply(new BigDecimal("100.00")).divide(position, 2, RoundingMode.ROUND_HALF_UP)
.setScale(2);
// output weight and risk
writer.Write("weight='" + weight1 + "' risk='" + m_hmRiskTable[asset].toPlainString() + "'>\n");
writer.Write("\t\t\t" + asset + "\n");
writer.Write("\t\t</asset>");
notFirstOne = true;
}
}
writer.Write("\n\t</group>\n");
}
writer.Write("</groups>\n");
writer.Flush();
} private List<string> sortedList()
{
List<string> strings = new List<string>();
foreach (string s in positions.Keys)
{
strings.Add(s);
}
strings.Sort();
return strings;
} public bool IsReusable
{
get { return true; }
}
}