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);
        }