AbstractPublisher.java
01 package examples.webapp.pubsub.stock;
02 
03 import java.io.IOException;
04 import java.util.ArrayList;
05 import java.util.List;
06 import java.util.Timer;
07 import java.util.TimerTask;
08 
09 import org.json.JSONObject;
10 
11 public abstract class AbstractPublisher {
12   private SymbolsProvider symbolsProvider = new SymbolsProvider();
13   private TradeSimulator tradeSimulator = new TradeSimulator();
14   private Stock[] stocks;
15   private Timer timer;
16   
17   protected AbstractPublisher() {
18     initStockList();
19   }
20   
21   private void initStockList() {
22     String[] symbols = getSymbolsProvider().getAllSymbols();
23     stocks = new Stock[symbols.length];
24     for (int i=0; i<symbols.length; i++) {
25       stocks[inew Stock(symbols[i]);
26     }
27   }
28   
29   protected abstract Client getClient();
30   
31   protected SymbolsProvider getSymbolsProvider() {
32     return this.symbolsProvider;
33   }
34   
35   protected TradeSimulator getTradeSimulator() {
36     return this.tradeSimulator;
37   }
38   
39   protected void printMessage(String message) {
40     System.out.println(message);
41   }
42   
43   public void startup() {
44     final AbstractPublisher publisher = this;
45     timer = new Timer();
46     timer.scheduleAtFixedRate(new TimerTask() {
47       public void run() {
48         publisher.publish();
49       }}02000);
50   }
51   
52   public void halt() {
53     timer.cancel();
54     try {
55       getClient().close();
56     catch (IOException e) {
57       printMessage(e.toString());
58     }
59   }
60   
61   public void publish() {
62     List<String> channels = new ArrayList<String>();
63     List<JSONObject> data = new ArrayList<JSONObject>();
64     for (int i=0; i<stocks.length; i++) {
65       if (Math.random()<0.3continue;
66       getTradeSimulator().simulateTrade(stocks[i]);
67       JSONObject publish = new JSONObject();
68       publish.put("stock", stocks[i].toJSONObject());
69       channels.add("/stock/" + stocks[i].getSymbol());
70       data.add(publish);
71       printMessage(stocks[i].getSymbol() ", " + stocks[i].getFormatedPrice() 
72             ", " + stocks[i].getFormatedOpenPrice() ", " + stocks[i].getQuantity());
73     }
74     try {
75       getClient().publish(channels.toArray(new String[channels.size()]), data.toArray(new JSONObject[data.size()]));
76     catch (IOException e) {
77       printMessage(e.toString());
78     }   
79   }
80 }