diff -r 10333b1b7402 -r 613987e37f79 nashorn/samples/cricket.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/cricket.js Wed Mar 11 14:30:40 2015 +0530 @@ -0,0 +1,140 @@ +#// Usage: jjs -scripting cricket.js + +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Example that demonstrates reading XML Rss feed. +// XML DOM Document element is wrapped by script +// "proxy" (JSAdapter constructor) + +// Java classes used +var DocBuilderFac = Java.type("javax.xml.parsers.DocumentBuilderFactory"); +var Node = Java.type("org.w3c.dom.Node"); + +// constants from Node class +var ELEMENT_NODE = Node.ELEMENT_NODE; +var TEXT_NODE = Node.TEXT_NODE; + +// parse XML from uri and return Document +function parseXML(uri) { + var docBuilder = DocBuilderFac.newInstance().newDocumentBuilder(); + return docBuilder["parse(java.lang.String)"](uri); +} + +// get child Elements of given name of the parent element given +function getChildElements(elem, name) { + var nodeList = elem.childNodes; + var childElems = []; + var len = nodeList.length; + for (var i = 0; i < len; i++) { + var node = nodeList.item(i); + if (node.nodeType == ELEMENT_NODE && + node.tagName == name) { + childElems.push(wrapElement(node)); + } + } + + return childElems; +} + +// get concatenated child text content of an Element +function getElemText(elem) { + var nodeList = elem.childNodes; + var len = nodeList.length; + var text = ''; + for (var i = 0; i < len; i++) { + var node = nodeList.item(i); + if (node.nodeType == TEXT_NODE) { + text += node.nodeValue; + } + } + + return text; +} + +// Wrap DOM Element object as a convenient script object +// using JSAdapter. JSAdapter is like java.lang.reflect.Proxy +// in that it allows property access, method calls be trapped +// by 'magic' methods like __get__, __call__. +function wrapElement(elem) { + if (! elem) { + return elem; + } + return new JSAdapter() { + // getter to expose child elements and attributes by name + __get__: function(name) { + if (typeof name == 'string') { + if (name.startsWith('@')) { + var attr = elem.getAttributeNode(name.substring(1)); + return !attr? undefined : attr.value; + } + + var arr = getChildElements(elem, name); + if (arr.length == 1) { + // single child element, expose as single element + return arr[0]; + } else { + // multiple children of given name, expose as array + return arr; + } + } + return undefined; + }, + + __call__: function(name) { + // toString override to get text content of this Element + if (name == 'toString' || name == 'valueOf') { + return getElemText(elem); + } + return undefined; + } + } +} + +function printCricketScore() { + var doc = parseXML("http://static.cricinfo.com/rss/livescores.xml"); + // wrap document root Element as script convenient object + var rss = wrapElement(doc.documentElement); + print("rss file version " + rss['@version']); + + print(rss.channel.title); + print(rss.channel.description); + print(rss.channel.pubDate); + + print("====================="); + + var items = rss.channel.item; + for each (var i in items) { + print(i.description); + } +} + +printCricketScore();