package com.heb.storm.risk;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichSpout;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
import com.heb.finance.analytics.model.RiskSensitivity;
@SuppressWarnings("serial")
public class RiskSpout implements IRichSpout {
private static final Logger LOG = Logger.getLogger("RiskSensitivityInsertRunner");
private static String[] roots = { "London", "New York", "Hong Kong", "Singapore", "Tokyo", "Paris", "Frankfurt", "Sydney", "Chicago", "Madrid" };
private static String[] divisions = { "FX", "Equity", "Equity Derivatives", "Bonds", "IRS", "Futures", "CDS", "ABS", "Funds", "Commodities" };
private static String[] sensitivities = { "irDelta", "irGamma", "irVega", "fxDelta", "fxGamma", "fxVega", "crDelta", "crGamma",
"crVega", "maturity" };
private static String DESK = "desk";
private static String POSITION = "position";
private static String TRADER = "trader";
private static Set<String> noOfDistinctPaths = new HashSet<String>();
boolean isDistributed;
SpoutOutputCollector collector;
public RiskSpout() {
this(true);
}
public RiskSpout(boolean isDistributed) {
this.isDistributed = isDistributed;
}
public boolean isDistributed() {
return this.isDistributed;
}
@SuppressWarnings("rawtypes")
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
}
public void close() {
}
public void nextTuple() {
RiskSensitivity riskSensitivity = this.createNewRandomRiskSensitivity();
this.collector.emit(new Values(riskSensitivity), riskSensitivity.getValue());
Thread.yield();
}
private RiskSensitivity createNewRandomRiskSensitivity() {
String root = roots[(int) (Math.random() * roots.length)];
String division = divisions[(int) (Math.random() * divisions.length)];
String sensitivity = sensitivities[(int) (Math.random() * sensitivities.length)];
String desk = DESK + new Double(Math.random() * 5).intValue();
String trader = TRADER + new Double(Math.random() * 20).intValue();
String position = POSITION + new Double(Math.random() * 20).intValue();
String path = root + RiskSensitivity.SEPARATOR + division +
RiskSensitivity.SEPARATOR + desk + RiskSensitivity.SEPARATOR + trader;
noOfDistinctPaths.add(path);
return new RiskSensitivity(sensitivity, path, position, new BigDecimal(Math.random()*10));
}
public void ack(Object msgId) {
}
public void fail(Object msgId) {
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("risk_sensitivity"));
}
@Override
public void activate() {
// TODO Auto-generated method stub
}
@Override
public void deactivate() {
// TODO Auto-generated method stub
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}