package hk.reality.stock.service.fetcher;
import static hk.reality.stock.service.fetcher.Utils.*;
import hk.reality.stock.model.StockDetail;
import hk.reality.stock.service.exception.DownloadException;
import hk.reality.stock.service.exception.ParseException;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class Money18QuoteFetcher extends BaseQuoteFetcher {
private static final String TAG = "Money18QuoteFetcher";
private static final String DATE_FORMAT = "yyyy/MM/dd HH:mm";
private static final String DATE_PARAM_FORMAT = "yyyyMMdd";
@Override
public StockDetail fetch(String quote) throws DownloadException, ParseException {
StockDetail d = new StockDetail();
String content = null;
HttpGet openReq = new HttpGet(getOpenUrl(quote));
try {
openReq.setHeader("Referer", "http://money18.on.cc/");
HttpResponse resp = getClient().execute(openReq);
content = EntityUtils.toString(resp.getEntity());
JSONObject json = preprocessJson(content);
double preClosePrice = json.getDouble("preCPrice");
HttpGet req = new HttpGet(getUpdateUrl(quote));
req.setHeader("Referer", "http://money18.on.cc/");
resp = getClient().execute(req);
content = EntityUtils.toString(resp.getEntity());
json = preprocessJson(content);
double price = json.getDouble("np");
double change = price - preClosePrice;
double changePercent = (price - preClosePrice) * 100.0 / preClosePrice;
Log.i(TAG, "change and change percent: " + change + ", " + changePercent +
". preClose: " + preClosePrice + ", price =" + price);
d.setPrice(new BigDecimal(json.getString("np")));
d.setChangePrice(new BigDecimal(rounded(change, 1000.0)));
d.setChangePricePercent(new BigDecimal(rounded(changePercent, 100.0)));
d.setDayHigh(new BigDecimal(json.getString("dyh")));
d.setDayLow(new BigDecimal(json.getString("dyl")));
d.setQuote(quote);
d.setSourceUrl(getUrl(quote));
SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
Date updateTime = formatter.parse(json.getString("ltt"));
Calendar updatedAt = Calendar.getInstance();
updatedAt.setTime(updateTime);
d.setUpdatedAt(updatedAt);
d.setVolume(new BigDecimal(json.getString("vol")).toPlainString());
return d;
} catch (ClientProtocolException e) {
openReq.abort();
throw new DownloadException("protocol exception", e);
} catch (IOException e) {
openReq.abort();
throw new DownloadException("download stock error", e);
} catch (JSONException e) {
openReq.abort();
throw new ParseException("unexpected return value," +
" content = " + content, e);
} catch (java.text.ParseException e) {
openReq.abort();
throw new ParseException("failed to parse date format," +
" content = " + content, e);
}
}
@Override
public String getUrl(String quote) {
return String.format("http://money18.on.cc/info/liveinfo_quote.html?symbol=%s", quote);
}
private String getOpenUrl(String quote) {
SimpleDateFormat formatter = new SimpleDateFormat(DATE_PARAM_FORMAT);
Calendar cal = Calendar.getInstance();
return String.format("http://money18.on.cc/js/daily/quote/%s_d.js?t=%s",
quote, formatter.format(cal.getTime()));
}
private String getUpdateUrl(String quote) {
return String.format("http://money18.on.cc/js/real/quote/%s_r.js", quote);
}
}