1
22
23 package com.liferay.portlet.stocks.util;
24
25 import com.liferay.portal.kernel.util.GetterUtil;
26 import com.liferay.portal.kernel.util.HttpUtil;
27 import com.liferay.portal.kernel.util.StringPool;
28 import com.liferay.portal.kernel.util.Time;
29 import com.liferay.portal.kernel.webcache.WebCacheException;
30 import com.liferay.portal.kernel.webcache.WebCacheItem;
31 import com.liferay.portlet.stocks.model.Stocks;
32
33 import java.util.StringTokenizer;
34
35
41 public class StocksWebCacheItem implements WebCacheItem {
42
43 public StocksWebCacheItem(String symbol) {
44 _symbol = symbol;
45 }
46
47 public Object convert(String key) throws WebCacheException {
48 String symbol = _symbol;
49 double lastTrade = 0.0;
50 double change = 0.0;
51 double open = 0.0;
52 double dayHigh = 0.0;
53 double dayLow = 0.0;
54 long volume = 0;
55
56 Stocks stocks = new Stocks(
57 symbol, lastTrade, change, open, dayHigh, dayLow, volume);
58
59 try {
60 String text = HttpUtil.URLtoString(
61 "http://finance.yahoo.com/d/quotes.csv?s=" +
62 symbol + "&f=sl1d1t1c1ohgv&e=.csv");
63
64 StringTokenizer st = new StringTokenizer(text, StringPool.COMMA);
65
66
68 st.nextToken();
69
70 try {
71 lastTrade = GetterUtil.getDouble(
72 st.nextToken().replace('"', ' ').trim());
73
74 stocks.setLastTrade(lastTrade);
75 }
76 catch (NumberFormatException nfe) {
77 stocks.setLastTradeAvailable(false);
78 }
79
80
82 st.nextToken();
83 st.nextToken();
84
85 try {
86 change = GetterUtil.getDouble(
87 st.nextToken().replace('"', ' ').trim());
88
89 stocks.setChange(change);
90 }
91 catch (NumberFormatException nfe) {
92 stocks.setChangeAvailable(false);
93 }
94
95 try {
96 open = GetterUtil.getDouble(
97 st.nextToken().replace('"', ' ').trim());
98
99 stocks.setOpen(open);
100 }
101 catch (NumberFormatException nfe) {
102 stocks.setOpenAvailable(false);
103 }
104
105 try {
106 dayHigh = GetterUtil.getDouble(
107 st.nextToken().replace('"', ' ').trim());
108
109 stocks.setDayHigh(dayHigh);
110 }
111 catch (NumberFormatException nfe) {
112 stocks.setDayHighAvailable(false);
113 }
114
115 try {
116 dayLow = GetterUtil.getDouble(
117 st.nextToken().replace('"', ' ').trim());
118
119 stocks.setDayLow(dayLow);
120 }
121 catch (NumberFormatException nfe) {
122 stocks.setDayLowAvailable(false);
123 }
124
125 try {
126 volume = GetterUtil.getLong(
127 st.nextToken().replace('"', ' ').trim());
128
129 stocks.setVolume(volume);
130 }
131 catch (NumberFormatException nfe) {
132 stocks.setVolumeAvailable(false);
133 }
134
135 if (!stocks.isValid()) {
136 throw new WebCacheException(symbol);
137 }
138 }
139 catch (Exception e) {
140 throw new WebCacheException(symbol + " " + e.toString());
141 }
142
143 return stocks;
144 }
145
146 public long getRefreshTime() {
147 return _REFRESH_TIME;
148 }
149
150 private static final long _REFRESH_TIME = Time.MINUTE * 20;
151
152 private String _symbol;
153
154 }