public class AssetReportServlet extends HttpServlet { private static final long serialVersionUID = 1L;
private TreeMap<String, BigDecimal> groupTotal; // Store positions for all assets
private TreeMap<String, BigDecimal> positions;
private BigDecimal allPositions; // Risks for all assets
private HashMap<String, BigDecimal> m_hmRiskTable;
private HashMap<String, String> assetToGroup;
RiskAssessor assessor; @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RecordSet records = (RecordSet) request.getAttribute("queryResult");
PrintWriter writer = response.getWriter();
execute(records, writer);
} public void execute(RecordSet records, PrintWriter output) throws IOException {
groupTotal = new TreeMap<String, BigDecimal>();
positions = new TreeMap<String, BigDecimal>();
m_hmRiskTable = new HashMap<String, BigDecimal>();
allPositions = new BigDecimal("0.00");
assetToGroup = new HashMap<String, String>();
for (int row = 0; row < records.getRowCount(); row++) {
BigDecimal pos = new BigDecimal(1);
BigDecimal r = new BigDecimal("0.00");
String issue = new String("");
issue = records.getItem(row, "ISSUE_NAME");
if (records.getItem(row, "ISSUE_FAMILY").toUpperCase().startsWith("FUND")) {
// pos = quantity * (market-unit price[TERM_TWO])
BigDecimal perItem = records.getDecimal(row, "MARKET_PRICE").subtract(records.getDecimal(row, "TERM_ONE"));
pos = perItem.multiply(records.getDecimal(row, "QUANTITY")).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal riskCoefficient = assessor.getRiskCoefficient(records.getItem(row, "ISSUE_FAMILY"), records
.getDecimal(row, "TERM_TWO"));
BigDecimal product = riskCoefficient.multiply(pos);
r = product.divide(new BigDecimal("100.00"), 2, BigDecimal.ROUND_HALF_UP);
positions.put(issue, pos); }
else {
// pos = (quantity * market) - total price[TERM_ONE]
pos = records.getDecimal(row, "QUANTITY").multiply(records.getDecimal(row, "MARKET_PRICE"));
pos = pos.subtract(records.getDecimal(row, "TERM_ONE")).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal product = records.getDecimal(row, "TERM_TWO").multiply(pos);
r = product.divide(new BigDecimal("100.00"), 2, BigDecimal.ROUND_HALF_UP);
positions.put(issue, pos);
}
// else {
// pos = records.getDecimal(row, "POSITION");
// risk = records.getDecimal(row, "POSITION").multiply(new BigDecimal("0.10"));
// } allPositions = allPositions.add(positions.get(issue)); String group = records.getItem(row, "ISSUE_GROUP");
String name = records.getItem(row, "ISSUE_NAME");
assetToGroup.put(name, group);
BigDecimal value = new BigDecimal("0");
if (groupTotal.containsKey(group))
value = value.add(groupTotal.get(group)).setScale(2);
value = value.add(positions.get(issue));
groupTotal.put(group, value.setScale(2));
m_hmRiskTable.put(issue, r);
} output.write("<groups>\n");
// groups in sorted order
Iterator<String> g = groupTotal.keySet().iterator();
while (g.hasNext()) {
String grp = g.next();
BigDecimal position = groupTotal.get(grp);
BigDecimal product = position.multiply(new BigDecimal(100));
BigDecimal weight = product.divide(allPositions, 2, BigDecimal.ROUND_HALF_UP);
output.write("\t<group position='" + position.toPlainString());
output.write("' weight='" + weight);
output.write("'>\n");
output.write("\t\t" + grp + "\n");
// groups in sorted order
Iterator<String> i = positions.keySet().iterator();
boolean notFirstOne = false;
while (i.hasNext()) {
String asset = i.next();
// Output asset only if it belongs in group
if (assetToGroup.get(asset).equalsIgnoreCase(grp)) {
// add newline only if not first item
if (notFirstOne)
output.write("\n");
output.write("\t\t<asset position='" + positions.get(asset).toPlainString() + "' ");
BigDecimal p = positions.get(asset);
BigDecimal weight1 = p.multiply(new BigDecimal("100.00")).divide(position, 2, BigDecimal.ROUND_HALF_UP)
.setScale(2);
output.write("weight='" + weight1 + "' risk='" + m_hmRiskTable.get(asset).toPlainString() + "'>\n");
output.write("\t\t\t" + asset + "\n");
output.write("\t\t</asset>");
notFirstOne = true;
}
}
output.write("\n\t</group>\n");
}
output.write("</groups>\n");
}
}