1 /*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.nashorn.api.scripting;
27
28 import java.io.CharArrayReader;
29 import java.io.IOException;
30 import java.io.Reader;
31 import java.net.URL;
32 import java.nio.charset.Charset;
33 import java.util.Objects;
34 import jdk.nashorn.internal.runtime.Source;
35
36 /**
37 * A Reader that reads from a URL. Used to make sure that the reader
38 * reads content from given URL and can be trusted to do so.
39 *
40 * @since 1.8u40
41 */
42 @jdk.Exported
43 public final class URLReader extends Reader {
44 // underlying URL
45 private final URL url;
46 // Charset used to convert
47 private final Charset cs;
48
49 // lazily initialized underlying reader for URL
50 private Reader reader;
51
52 /**
53 * Constructor
54 *
55 * @param url URL for this URLReader
56 * @throws NullPointerException if url is null
57 */
58 public URLReader(final URL url) {
59 this(url, (Charset)null);
60 }
61
62 /**
63 * Constructor
64 *
65 * @param url URL for this URLReader
66 * @param charsetName Name of the Charset used to convert bytes to chars
67 * @throws NullPointerException if url is null
68 */
69 public URLReader(final URL url, final String charsetName) {
70 this(url, Charset.forName(charsetName));
71 }
72
73 /**
74 * Constructor
75 *
76 * @param url URL for this URLReader
77 * @param cs Charset used to convert bytes to chars
78 * @throws NullPointerException if url is null
79 */
80 public URLReader(final URL url, final Charset cs) {
81 this.url = Objects.requireNonNull(url);
82 this.cs = cs;
83 }
84
85 @Override
86 public int read(final char cbuf[], final int off, final int len) throws IOException {
87 return getReader().read(cbuf, off, len);
88 }
89
90 @Override
91 public void close() throws IOException {
92 getReader().close();
93 }
94
95 /**
96 * URL of this reader
97 * @return the URL from which this reader reads.
98 */
99 public URL getURL() {
100 return url;
101 }
102
103 /**
104 * Charset used by this reader
105 *
106 * @return the Chartset used to convert bytes to chars
107 */
108 public Charset getCharset() {
109 return cs;
110 }
111
112 // lazily initialize char array reader using URL content
113 private Reader getReader() throws IOException {
114 synchronized (lock) {
115 if (reader == null) {
116 reader = new CharArrayReader(Source.readFully(url, cs));
117 }
118 }
119
120 return reader;
121 }
122 }
--- EOF ---