private static StockQuote BuildQuote(XPathNavigator quoteNavigator) { if (!quoteNavigator.MoveToAttribute("Symbol", string.Empty)) { // error } string symbol = quoteNavigator.Value; double last = 0d, volume = 0d, change = 0d, percentChange = 0d; string lastTimeString; DateTime lastUpdate = DateTime.Today; quoteNavigator.MoveToParent(); if (quoteNavigator.MoveToChild("Last", string.Empty)) { last = quoteNavigator.ValueAsDouble; } if (quoteNavigator.MoveToNext("LastTime", string.Empty)) { lastTimeString = quoteNavigator.Value; DateTime.TryParseExact( lastTimeString, "h:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out lastUpdate); } if (quoteNavigator.MoveToNext("Volume", string.Empty)) { string volumeText = quoteNavigator.Value; if (!double.TryParse(volumeText, NumberStyles.Any, CultureInfo.InvariantCulture, out volume)) { volume = 0d; } } if (quoteNavigator.MoveToNext("Change", string.Empty)) { change = quoteNavigator.ValueAsDouble; } if (quoteNavigator.MoveToNext("PercentChange", string.Empty)) { percentChange = quoteNavigator.ValueAsDouble / 100; } StockQuote quote = new StockQuote(symbol, volume, last, lastUpdate, change, percentChange); return(quote); }
public IDictionary <string, StockQuote> GetQuotes(IEnumerable <string> symbols) { Dictionary <string, StockQuote> quotes = new Dictionary <string, StockQuote>(); StringBuilder flattenedSymbols = new StringBuilder(); foreach (string symbol in symbols) { quotes.Add(symbol, null); flattenedSymbols.Append(symbol); flattenedSymbols.Append(' '); } logger.Log("Retrieving quotes for " + flattenedSymbols, TraceEventType.Information); string payload = null; try { payload = implementation.DDSQuery(flattenedSymbols.ToString(), null, null); } catch (Exception e) { string message = "Error invoking service: " + e.Message; logger.Log(message, TraceEventType.Error); throw new StockQuoteServiceException(message, e); } logger.Log("Received result for " + flattenedSymbols, TraceEventType.Information); using (TextReader payloadReader = new StringReader(payload)) { XPathDocument document = null; try { document = new XPathDocument(payloadReader); } catch (Exception e) { string message = "Error parsing XML payload: " + e.Message; logger.Log(message, TraceEventType.Error); throw new StockQuoteServiceException(message, e); } logger.Log("Parsed result for " + flattenedSymbols, TraceEventType.Information); XPathNavigator navigator = document.CreateNavigator(); foreach (XPathNavigator quoteNavigator in navigator.Select("/StockData/Quotes/Quote")) { StockQuote quote = BuildQuote(quoteNavigator); if (quotes.ContainsKey(quote.Symbol)) { quotes[quote.Symbol] = quote; } else { logger.Log("Unexpected symbol '" + quote.Symbol + "'", TraceEventType.Warning); } } } return(quotes); }
private void SaveQuote(StockQuote updatedQuote) { try { this.repository.Save(updatedQuote); } catch (RepositoryException e) { this.logger.Log( string.Format( "Error saving the updated quote for '{0}': {1}", updatedQuote.Symbol, e.Message), TraceEventType.Warning); } }