public Stock getStock(Symbol symbol) { StringBuilder stringBuilder = new StringBuilder(getYahooCSVBasedURL()); String _symbol = symbol.toString(); stringBuilder.Append(_symbol).Append(YAHOO_STOCK_FORMAT); String location = stringBuilder.ToString(); for (int retry = 0; retry < NUM_OF_RETRY; retry++) { String respond = Gui.Utils.getResponseBodyAsStringBasedOnProxyAuthOption(location); if (respond == null) { continue; } List <Stock> stocks = YahooStockFormat.getInstance().parse(respond); if (stocks.Count == 1) { return(stocks[0]); } break; } throw new StockNotFoundException(symbol.toString()); }
public List <Stock> getStocksBySymbols(List <Symbol> symbols) { List <Stock> stocks = new List <Stock>(); if (symbols.Count == 0) { return(stocks); } int time = symbols.Count / MAX_STOCK_PER_ITERATION; int remainder = symbols.Count % MAX_STOCK_PER_ITERATION; for (int i = 0; i < time; i++) { int start = i * MAX_STOCK_PER_ITERATION; int end = start + MAX_STOCK_PER_ITERATION; StringBuilder stringBuilder = new StringBuilder(getYahooCSVBasedURL()); StringBuilder symbolBuilder = new StringBuilder(); List <Symbol> expectedSymbols = new List <Symbol>(); int endLoop = end - 1; for (int j = start; j < endLoop; j++) { String symbolString1 = null; try { //symbolString = java.net.URLEncoder.encode(symbols.get(j).toString(), "UTF-8"); symbolString1 = symbols[j].toString(); } catch (Exception ex) { throw new StockNotFoundException(); } symbolBuilder.Append(symbolString1).Append("+"); expectedSymbols.Add(symbols[j]); } String symbolString = null; try { //symbolString = java.net.URLEncoder.encode(symbols.get(end - 1).toString(), "UTF-8"); symbolString = symbols[end - 1].toString(); } catch (Exception ex) { throw new StockNotFoundException(); } symbolBuilder.Append(symbolString); expectedSymbols.Add(symbols[end - 1]); String _symbol = symbolBuilder.ToString(); stringBuilder.Append(_symbol).Append(YAHOO_STOCK_FORMAT); String location = stringBuilder.ToString(); bool success = false; for (int retry = 0; retry < NUM_OF_RETRY; retry++) { String respond = Gui.Utils.getResponseBodyAsStringBasedOnProxyAuthOption(location); if (respond == null) { continue; } List <Stock> tmpStocks = YahooStockFormat.getInstance().parse(respond); if (tmpStocks.Count != MAX_STOCK_PER_ITERATION) { if (retry == (NUM_OF_RETRY - 1)) { int currSize = tmpStocks.Count; int expectedSize = expectedSymbols.Count; if (this.isToleranceAllowed(currSize, expectedSize)) { List <Symbol> currSymbols = new List <Symbol>(); List <Stock> emptyStocks = new List <Stock>(); foreach (Stock stock in tmpStocks) { currSymbols.Add(stock.getSymbol()); } foreach (Symbol symbol in expectedSymbols) { if (currSymbols.Contains(symbol) == false) { emptyStocks.Add(Gui.Utils.getEmptyStock(Code.newInstance(symbol.toString()), symbol)); } } tmpStocks.AddRange(emptyStocks); } else { throw new StockNotFoundException("Expect " + expectedSize + " stock(s), but only receive " + currSize + " stock(s) from " + location); } } // if (retry == (NUM_OF_RETRY-1)) continue; } // if (tmpStocks.Count != MAX_STOCK_PER_ITERATION) stocks.AddRange(tmpStocks); success = true; break; } if (success == false) { throw new StockNotFoundException("Stock size (" + stocks.Count + ") inconsistent with symbol size (" + symbols.Count + ")"); } } int start2 = symbols.Count - remainder; int end2 = start2 + remainder; StringBuilder stringBuilder2 = new StringBuilder(getYahooCSVBasedURL()); StringBuilder symbolBuilder2 = new StringBuilder(); List <Symbol> expectedSymbols2 = new List <Symbol>(); int endLoop2 = end2 - 1; for (int i = start2; i < endLoop2; i++) { String symbolString = symbols[i].toString(); symbolBuilder2.Append(symbolString).Append("+"); expectedSymbols2.Add(symbols[i]); } String symbolString2 = symbols[end2 - 1].toString(); symbolBuilder2.Append(symbolString2); expectedSymbols2.Add(symbols[end2 - 1]); String _symbol2 = symbolBuilder2.ToString(); stringBuilder2.Append(_symbol2).Append(YAHOO_STOCK_FORMAT); String location2 = stringBuilder2.ToString(); for (int retry = 0; retry < NUM_OF_RETRY; retry++) { String respond = Gui.Utils.getResponseBodyAsStringBasedOnProxyAuthOption(location2); if (respond == null) { continue; } List <Stock> tmpStocks = YahooStockFormat.getInstance().parse(respond); if (tmpStocks.Count != remainder) { if (retry == (NUM_OF_RETRY - 1)) { int currSize = tmpStocks.Count; int expectedSize = expectedSymbols2.Count; if (this.isToleranceAllowed(currSize, expectedSize)) { List <Symbol> currSymbols = new List <Symbol>(); List <Stock> emptyStocks = new List <Stock>(); foreach (Stock stock in tmpStocks) { currSymbols.Add(stock.getSymbol()); } foreach (Symbol symbol in expectedSymbols2) { if (currSymbols.Contains(symbol) == false) { emptyStocks.Add(Gui.Utils.getEmptyStock(Code.newInstance(symbol.toString()), symbol)); } } tmpStocks.AddRange(emptyStocks); } else { throw new StockNotFoundException("Expect " + expectedSize + " stock(s), but only receive " + currSize + " stock(s) from " + location2); } } // if (retry == (NUM_OF_RETRY-1)) continue; } // if (tmpStocks.Count != remainder) stocks.AddRange(tmpStocks); break; } if (stocks.Count != symbols.Count) { throw new StockNotFoundException("Stock size (" + stocks.Count + ") inconsistent with symbol size (" + symbols.Count + ")"); } return(stocks); }