PageRenderTime 66ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/src/jvm/backtype/storm/clojure/ClojureSpout.java

http://github.com/nathanmarz/storm
Java | 136 lines | 110 code | 25 blank | 1 comment | 1 complexity | 76fd78c89fbef23331ee38be0fa7292a MD5 | raw file
Possible License(s): Apache-2.0
  1. package backtype.storm.clojure;
  2. import backtype.storm.generated.StreamInfo;
  3. import backtype.storm.spout.ISpout;
  4. import backtype.storm.spout.SpoutOutputCollector;
  5. import backtype.storm.task.TopologyContext;
  6. import backtype.storm.topology.IRichSpout;
  7. import backtype.storm.topology.OutputFieldsDeclarer;
  8. import backtype.storm.tuple.Fields;
  9. import backtype.storm.utils.Utils;
  10. import clojure.lang.IFn;
  11. import clojure.lang.PersistentArrayMap;
  12. import clojure.lang.Keyword;
  13. import clojure.lang.Symbol;
  14. import clojure.lang.RT;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import java.util.Map;
  18. public class ClojureSpout implements IRichSpout {
  19. Map<String, StreamInfo> _fields;
  20. List<String> _fnSpec;
  21. List<String> _confSpec;
  22. List<Object> _params;
  23. ISpout _spout;
  24. public ClojureSpout(List fnSpec, List confSpec, List<Object> params, Map<String, StreamInfo> fields) {
  25. _fnSpec = fnSpec;
  26. _confSpec = confSpec;
  27. _params = params;
  28. _fields = fields;
  29. }
  30. @Override
  31. public void open(final Map conf, final TopologyContext context, final SpoutOutputCollector collector) {
  32. IFn hof = Utils.loadClojureFn(_fnSpec.get(0), _fnSpec.get(1));
  33. try {
  34. IFn preparer = (IFn) hof.applyTo(RT.seq(_params));
  35. final Map<Keyword,Object> collectorMap = new PersistentArrayMap( new Object[] {
  36. Keyword.intern(Symbol.create("output-collector")), collector,
  37. Keyword.intern(Symbol.create("context")), context});
  38. List<Object> args = new ArrayList<Object>() {{
  39. add(conf);
  40. add(context);
  41. add(collectorMap);
  42. }};
  43. _spout = (ISpout) preparer.applyTo(RT.seq(args));
  44. //this is kind of unnecessary for clojure
  45. try {
  46. _spout.open(conf, context, collector);
  47. } catch(AbstractMethodError ame) {
  48. }
  49. } catch (Exception e) {
  50. throw new RuntimeException(e);
  51. }
  52. }
  53. @Override
  54. public void close() {
  55. try {
  56. _spout.close();
  57. } catch(AbstractMethodError ame) {
  58. }
  59. }
  60. @Override
  61. public void nextTuple() {
  62. try {
  63. _spout.nextTuple();
  64. } catch(AbstractMethodError ame) {
  65. }
  66. }
  67. @Override
  68. public void ack(Object msgId) {
  69. try {
  70. _spout.ack(msgId);
  71. } catch(AbstractMethodError ame) {
  72. }
  73. }
  74. @Override
  75. public void fail(Object msgId) {
  76. try {
  77. _spout.fail(msgId);
  78. } catch(AbstractMethodError ame) {
  79. }
  80. }
  81. @Override
  82. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  83. for(String stream: _fields.keySet()) {
  84. StreamInfo info = _fields.get(stream);
  85. declarer.declareStream(stream, info.is_direct(), new Fields(info.get_output_fields()));
  86. }
  87. }
  88. @Override
  89. public Map<String, Object> getComponentConfiguration() {
  90. IFn hof = Utils.loadClojureFn(_confSpec.get(0), _confSpec.get(1));
  91. try {
  92. return (Map) hof.applyTo(RT.seq(_params));
  93. } catch (Exception e) {
  94. throw new RuntimeException(e);
  95. }
  96. }
  97. @Override
  98. public void activate() {
  99. try {
  100. _spout.activate();
  101. } catch(AbstractMethodError ame) {
  102. }
  103. }
  104. @Override
  105. public void deactivate() {
  106. try {
  107. _spout.deactivate();
  108. } catch(AbstractMethodError ame) {
  109. }
  110. }
  111. }