#// Usage: jjs -scripting gutenberg.js/* * Copyright (c) 2014, 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. */// Simple example that demonstrates reading XML Rss feed// to generate a HTML file from script and show it by browser// Java classes usedvar Characters = Java.type("javax.xml.stream.events.Characters");var Factory = Java.type("javax.xml.stream.XMLInputFactory");var File = Java.type("java.io.File");var FileWriter = Java.type("java.io.FileWriter");var PrintWriter = Java.type("java.io.PrintWriter");var URL = Java.type("java.net.URL");// read Rss feed from a URL. Returns an array// of objects having only title and link propertiesfunction readRssFeed(url) { var fac = Factory.newInstance(); var reader = fac.createXMLEventReader(url.openStream()); // get text content from next event function getChars() { var result = ""; var e = reader.nextEvent(); if (e instanceof Characters) { result = e.getData(); } return result; } var items = []; var title, link; var inItem = false; while (reader.hasNext()) { var evt = reader.nextEvent(); if (evt.isStartElement()) { var local = evt.name.localPart; if (local == "item") { // capture title, description now inItem = true; } if (inItem) { switch (local) { case 'title': title = getChars(); break; case 'link': link = getChars(); break; } } } else if (evt.isEndElement()) { var local = evt.name.localPart; if (local == "item") { // one item done, save it in result array items.push({ title: title, link: link }); inItem = false; } } } return items;}// generate simple HTML for an RSS feedfunction getBooksHtml() { var url = new URL("http://www.gutenberg.org/cache/epub/feeds/today.rss"); var items = readRssFeed(url); var str = "<ul>"; // Nashorn's string interpolation and heredoc // support is very handy in generating text content // that is filled with elements from runtime objects. // We insert title and link in <li> elements here. for each (i in items) { str += <<EOF<li> <a href="${i.link}">${i.title}</a></li>EOF } str += "</ul>"; return str;}// write the string to the given filefunction writeTo(file, str) { var w = new PrintWriter(new FileWriter(file)); try { w.print(str); } finally { w.close(); }}// generate books HTMLvar str = getBooksHtml();// write to file. __DIR__ is directory where// this script is stored.var file = new File(__DIR__ + "books.html");writeTo(file, str);// show it by desktop browsertry { var Desktop = Java.type("java.awt.Desktop"); Desktop.desktop.browse(file.toURI());} catch (e) { print(e);}