package bolts; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import java.net.*; import org.apache.log4j.Logger; import spouts.TwitterSpout; import twitter4j.Status; import twitter4j.URLEntity; import utils.Utils; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseBasicBolt; import backtype.storm.topology.base.BaseRichBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; /** * Gets a Tweet status and emits shortened urls along with their expansion if any. * * @author Michael Vogiatzis * */ public class UnshortenBolt extends BaseRichBolt{ private static final Logger log = Logger.getLogger(UnshortenBolt.class); private OutputCollector ouc; @Override public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { ouc = collector; } @Override public void execute(Tuple tuple) { Status s = (Status) tuple.getValueByField("tweet"); URLEntity[] urls = s.getURLEntities(); for (URLEntity url : urls){ String shortURL = url.getURL(); String expandedURL = Utils.unshortenIt(shortURL); if (expandedURL!=null) {ouc.emit(new Values(shortURL, expandedURL)); log.info("Emitting: " + shortURL + ", "+expandedURL); } } ouc.ack(tuple); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("shortUrl", "expUrl")); } }