package mypackage.bolts;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;
import me.prettyprint.cassandra.model.ConfigurableConsistencyLevel;
import me.prettyprint.cassandra.serializers.StringSerializer;
import me.prettyprint.cassandra.service.FailoverPolicy;
import me.prettyprint.hector.api.Cluster;
import me.prettyprint.hector.api.HConsistencyLevel;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.factory.HFactory;
import me.prettyprint.hector.api.mutation.Mutator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
//import org.apache.log4j.Logger;
/**
* Populates the cassandra tables.
*
* @author Michael Vogiatzis
*
*/
public class CassandraBolt extends BaseRichBolt {
private static final Logger log = LoggerFactory.getLogger(CassandraBolt.class);
// getLogger(CassandraBolt.class);
private static Cluster cluster;
private static Keyspace keyspace;
private static Mutator<String> mutator;
OutputCollector ouc;
@Override
public void prepare(Map stormConf, TopologyContext context,
OutputCollector collector) {
ouc = collector;
// load from properties file
Properties prop = new Properties();
try {
prop.load(new FileInputStream("config.properties"));
} catch (IOException ex) {
log.error(ex.toString());
}
//cassandra configuration
cluster = HFactory.getOrCreateCluster(
prop.getProperty("CLUSTERNAME"), prop.getProperty("HOST"));
ConfigurableConsistencyLevel ccl = new ConfigurableConsistencyLevel();
ccl.setDefaultReadConsistencyLevel(HConsistencyLevel.ONE);
keyspace = HFactory.createKeyspace("links", cluster, ccl,
FailoverPolicy.FAIL_FAST);
mutator = HFactory.createMutator(keyspace, StringSerializer.get());
}
@Override
public void execute(Tuple tuple) {
String expUrl = tuple.getStringByField("expUrl");
if (expUrl != null) {
String shortUrl = tuple.getStringByField("shortUrl");
updateDB(shortUrl, expUrl);
log.info("DB Update!");
}
ouc.ack(tuple);
}
/**
* Updates the cassandra table links with unshortened urls.
* @param shortUrl
* @param expandedUrl
*/
public void updateDB(String shortUrl, String expandedUrl){
mutator.addInsertion(shortUrl, "l", HFactory.createColumn("u", expandedUrl));
mutator.execute();
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
}