Wed, 07 Oct 2015 10:01:40 -0700
Merge
1 #// Usage: jjs -scripting gutenberg.js
3 /*
4 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * - Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * - Neither the name of Oracle nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
34 // Simple example that demonstrates reading XML Rss feed
35 // to generate a HTML file from script and show it by browser
37 // Java classes used
38 var Characters = Java.type("javax.xml.stream.events.Characters");
39 var Factory = Java.type("javax.xml.stream.XMLInputFactory");
40 var File = Java.type("java.io.File");
41 var FileWriter = Java.type("java.io.FileWriter");
42 var PrintWriter = Java.type("java.io.PrintWriter");
43 var URL = Java.type("java.net.URL");
45 // read Rss feed from a URL. Returns an array
46 // of objects having only title and link properties
47 function readRssFeed(url) {
48 var fac = Factory.newInstance();
49 var reader = fac.createXMLEventReader(url.openStream());
51 // get text content from next event
52 function getChars() {
53 var result = "";
54 var e = reader.nextEvent();
55 if (e instanceof Characters) {
56 result = e.getData();
57 }
58 return result;
59 }
61 var items = [];
62 var title, link;
63 var inItem = false;
64 while (reader.hasNext()) {
65 var evt = reader.nextEvent();
66 if (evt.isStartElement()) {
67 var local = evt.name.localPart;
68 if (local == "item") {
69 // capture title, description now
70 inItem = true;
71 }
73 if (inItem) {
74 switch (local) {
75 case 'title':
76 title = getChars();
77 break;
78 case 'link':
79 link = getChars();
80 break;
81 }
82 }
83 } else if (evt.isEndElement()) {
84 var local = evt.name.localPart;
85 if (local == "item") {
86 // one item done, save it in result array
87 items.push({ title: title, link: link });
88 inItem = false;
89 }
90 }
91 }
93 return items;
94 }
96 // generate simple HTML for an RSS feed
97 function getBooksHtml() {
98 var url = new URL("http://www.gutenberg.org/cache/epub/feeds/today.rss");
99 var items = readRssFeed(url);
101 var str = "<ul>";
103 // Nashorn's string interpolation and heredoc
104 // support is very handy in generating text content
105 // that is filled with elements from runtime objects.
106 // We insert title and link in <li> elements here.
107 for each (i in items) {
108 str += <<EOF
109 <li>
110 <a href="${i.link}">${i.title}</a>
111 </li>
112 EOF
113 }
114 str += "</ul>";
115 return str;
116 }
118 // write the string to the given file
119 function writeTo(file, str) {
120 var w = new PrintWriter(new FileWriter(file));
121 try {
122 w.print(str);
123 } finally {
124 w.close();
125 }
126 }
128 // generate books HTML
129 var str = getBooksHtml();
131 // write to file. __DIR__ is directory where
132 // this script is stored.
133 var file = new File(__DIR__ + "books.html");
134 writeTo(file, str);
136 // show it by desktop browser
137 try {
138 var Desktop = Java.type("java.awt.Desktop");
139 Desktop.desktop.browse(file.toURI());
140 } catch (e) {
141 print(e);
142 }