package cse308.swift.server.quotepoller; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.InputStream; import java.net.URL; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.ArrayList; import cse308.swift.shared.beans.Quote; public class YahooStockEngine { static Logger logger = Logger.getLogger(YahooStockEngine.class.getName()); final private String BASE_URL1 = "http://query.yahooapis.com/v1/public/yql" + "?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("; //url first part final private String BASE_URL2 = ")&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; //url last part String BASE_URL_Symbol = "%22AAPL%22"; /** * The XML list of quotes? */ NodeList nList; //Fetch me the souls! only one stock at a time for now /** * Fetch 3 quotes for test purposes */ public ArrayList fetch(){ String BASE_URL_Symbol = "%22AAPL%22,%22MSFT%22,%22GOOG%22"; //testing String URL_Final = BASE_URL1+ BASE_URL_Symbol +BASE_URL2; URL xmlUrl; Document doc = null; try { xmlUrl = new URL(URL_Final); //EDIT InputStream in = xmlUrl.openStream(); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(in); doc.getDocumentElement().normalize(); } catch (Exception e) { logger.error("Could Not Parse Yahoo Input Stream"); } nList = doc.getElementsByTagName("quote"); return parse(nList); } /** * Fetch the quotes for a variable number of stock symbol arguments. * These symbols are assumed to be correct. * @param symbols are Strings associated with symbols * @return The Array Kist of quotes: ArrayList */ public ArrayList fetchQuotes(String ... symbols) { StringBuilder strb = new StringBuilder(""); String urlFinal; URL xmlUrl; Document doc = null; /* strb.append(this.BASE_URL1); //prefix of URL base for( String s : symbols ) strb.append("%22" + s.toUpperCase() + "%22,"); //symbols wanted strb.append(this.BASE_URL2); //suffix of URL base urlFinal = strb.toString(); //concat it all */ strb.append(this.BASE_URL1); //prefix of URL base int i; for (i=0; i<=symbols.length-2; ++i) { strb.append("%22" + symbols[i].toUpperCase() + "%22,"); //symbols wanted } if (i==(symbols.length-1)) strb.append("%22" + symbols[i].toUpperCase() + "%22"); //last symbol strb.append(this.BASE_URL2); //suffix of URL base urlFinal = strb.toString(); //concat it all try { xmlUrl = new URL(urlFinal); //EDIT InputStream in = xmlUrl.openStream(); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(in); doc.getDocumentElement().normalize(); } catch (Exception e) { logger.error("Could Not Parse Yahoo Input Stream"); } nList = doc.getElementsByTagName("quote"); return parse(nList); } /** * Fetch the quotes for an Array List of Quotes. * These symbols are assumed to be correct. * @param symbols are Strings associated with symbols * @return The array list of quotes: ArrayList */ public ArrayList fetchQuotes(ArrayList symbols) { StringBuilder strb = new StringBuilder(""); String urlFinal; URL xmlUrl; Document doc = null; strb.append(this.BASE_URL1); //prefix of URL base int i; for (i=0; i<=symbols.size()-2; ++i) { strb.append("%22" + symbols.get(i).toUpperCase() + "%22,"); //symbols wanted } if (i==(symbols.size()-1)) strb.append("%22" + symbols.get(i).toUpperCase() + "%22"); //last symbol strb.append(this.BASE_URL2); //suffix of URL base urlFinal = strb.toString(); //concat it all try { xmlUrl = new URL(urlFinal); //EDIT InputStream in = xmlUrl.openStream(); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(in); doc.getDocumentElement().normalize(); } catch (Exception e) { logger.error("Could Not Parse Yahoo Input Stream"); } nList = doc.getElementsByTagName("quote"); return parse(nList); } /** * Pulls the XML values out by magic? * @param elmnt is the XML datafield * @param tagName is the tagName of the value desired * @return the string value associated with that tag. */ public String getValueFromTag(Element elmnt, String tagName) { NodeList firstElmntLst = elmnt.getElementsByTagName(tagName); Element firstElmnt = (Element) firstElmntLst.item(0); NodeList dataNm = firstElmnt.getChildNodes(); if(dataNm.item(0) != null) return (dataNm.item(0).getNodeValue()); return null; } private ArrayList parse(NodeList list) { ArrayList quotes = new ArrayList(); for(int i = 0; i < list.getLength(); i++) { YahooStockEngineQuote yQuote = new YahooStockEngineQuote(); Node nNode = list.item(i); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element elmnt = (Element) nNode; yQuote.setSymbol((elmnt.getAttribute("symbol")).toString()); yQuote.setAsk(getValueFromTag(elmnt, "Ask")); yQuote.setAverageDailyVolume(getValueFromTag(elmnt, "AverageDailyVolume")); yQuote.setBid(getValueFromTag(elmnt, "Bid")); yQuote.setAskRealTime(getValueFromTag(elmnt, "AskRealtime")); yQuote.setBidRealTime(getValueFromTag(elmnt, "BidRealtime")); yQuote.setBookValue(getValueFromTag(elmnt, "BookValue")); yQuote.setChangePercentChange(getValueFromTag(elmnt, "Change_PercentChange")); yQuote.setChange(getValueFromTag(elmnt, "Change")); yQuote.setChangeRealtime(getValueFromTag(elmnt, "Change")); yQuote.setAfterHoursChangeRealTime(getValueFromTag(elmnt, "AfterHoursChangeRealtime")); yQuote.setDividendShare(getValueFromTag(elmnt, "DividendShare")); yQuote.setLastTradeDate(getValueFromTag(elmnt, "LastTradeDate")); yQuote.setEarningsShare(getValueFromTag(elmnt, "EarningsShare")); yQuote.setEpsEstimateCurrentYear(getValueFromTag(elmnt, "EPSEstimateCurrentYear")); yQuote.setEpsEstimateNextYear(getValueFromTag(elmnt, "EPSEstimateNextYear")); yQuote.setEpsEstimateNextQuarter(getValueFromTag(elmnt, "EPSEstimateNextQuarter")); yQuote.setDaysLow(getValueFromTag(elmnt, "DaysLow")); yQuote.setDaysHigh(getValueFromTag(elmnt, "DaysHigh")); yQuote.setYearLow(getValueFromTag(elmnt, "YearLow")); yQuote.setYearHigh(getValueFromTag(elmnt, "YearHigh")); yQuote.setHoldingsGainPercent(getValueFromTag(elmnt, "HoldingsGainPercent")); yQuote.setHoldingsGainPercentRealtime(getValueFromTag(elmnt, "HoldingsGainPercentRealtime")); yQuote.setMoreInfo(getValueFromTag(elmnt, "MoreInfo")); yQuote.setMarketCapitalization(getValueFromTag(elmnt, "MarketCapitalization")); yQuote.setEbitda(getValueFromTag(elmnt, "EBITDA")); yQuote.setChangeFromYearLow(getValueFromTag(elmnt, "ChangeFromYearLow")); yQuote.setPercentChangeFromYearLow(getValueFromTag(elmnt, "PercentChangeFromYearLow")); yQuote.setLastTradeRealtimeWithTime(getValueFromTag(elmnt, "LastTradeRealtimeWithTime")); yQuote.setChangePercentRealtime(getValueFromTag(elmnt, "ChangePercentRealtime")); yQuote.setChangeFromYearHigh(getValueFromTag(elmnt, "ChangeFromYearHigh")); yQuote.setPercentChangeFromYearHigh(getValueFromTag(elmnt, "PercebtChangeFromYearHigh")); yQuote.setLastTradeWithTime(getValueFromTag(elmnt, "LastTradeWithTime")); yQuote.setLastTradePriceOnly(getValueFromTag(elmnt, "LastTradePriceOnly")); yQuote.setDaysRange(getValueFromTag(elmnt, "DaysRange")); yQuote.setDaysRangeRealtime(getValueFromTag(elmnt, "DaysRangeRealtime")); yQuote.setFiftyDayMovingAverage(getValueFromTag(elmnt, "FiftydayMovingAverage")); yQuote.setTwoHunderedDayMovingAverage(getValueFromTag(elmnt, "TwoHundreddayMovingAverage")); yQuote.setChangeFromTwoHundredDayMovingAverage(getValueFromTag(elmnt, "ChangeFromTwoHundreddayMovingAverage")); yQuote.setChangeFromFiftyDayMovingAverage(getValueFromTag(elmnt, "ChangeFromFiftydayMovingAverage")); yQuote.setPercentChangeFromTwoHundredDayMovingAverage(getValueFromTag(elmnt, "PercentChangeFromTwoHundreddayMovingAverage")); yQuote.setPercentChangeFromFiftyDayMovingAverage(getValueFromTag(elmnt, "PercentChangeFromFiftydayMovingAverage")); yQuote.setName(getValueFromTag(elmnt, "Name")); yQuote.setOpen(getValueFromTag(elmnt, "Open")); yQuote.setPreviousClose(getValueFromTag(elmnt, "PreviousClose")); yQuote.setChangeInPercent(getValueFromTag(elmnt, "ChangeinPercent")); yQuote.setPriceSales(getValueFromTag(elmnt, "PriceSales")); yQuote.setPriceBook(getValueFromTag(elmnt, "PriceBook")); yQuote.setExDividendDate(getValueFromTag(elmnt, "ExDividendDate")); yQuote.setPeRatio(getValueFromTag(elmnt, "PERatio")); yQuote.setPegRatio(getValueFromTag(elmnt, "PEGRatio")); yQuote.setPriceEpsEstimateCurrentYear(getValueFromTag(elmnt, "PriceEPSEstimateCurrentYear")); yQuote.setPriceEpsEstimateNextYear(getValueFromTag(elmnt, "PriceEPSEstimateNextYear")); yQuote.setShortRatio(getValueFromTag(elmnt, "ShortRatio")); yQuote.setLastTradeTime(getValueFromTag(elmnt, "LastTradeTime")); yQuote.setTickerTrend(getValueFromTag(elmnt, "TickerTrend")); yQuote.setOneYearPriceTarget(getValueFromTag(elmnt, "OneyrTargetPrice")); yQuote.setVolume(getValueFromTag(elmnt, "Volume")); yQuote.setYearRange(getValueFromTag(elmnt, "YearRange")); yQuote.setDaysValueChange(getValueFromTag(elmnt, "DaysValueChange")); yQuote.setDaysValueChangeRealtime(getValueFromTag(elmnt, "DaysValueChangeRealtime")); yQuote.setStockExchange(getValueFromTag(elmnt, "StockExchange")); yQuote.setPercentChange(getValueFromTag(elmnt, "PercentChange")); if(yQuote.getLastTradeDate() != null && yQuote.getVolume() != null) quotes.add(yQuote.formatYahooQuote()); } } return quotes; } }