1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Loads the contents of a file all at once and passes its contents off to
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * {@link org.antlr.runtime.ANTLRStringStream}.
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Currently this class can only be used in the Rhino JS interpreter.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @class
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @extends org.antlr.runtime.ANTLRStringStream
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param {String} fileName path of the file to be loaded
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param {String} [encoding] name of the charset used for decoding
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.runtime.ANTLRFileStream = function(fileName, encoding) {
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    this.fileName = fileName;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // @todo need to add support for other JS interpreters that have file i/o
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // hooks (SpiderMonkey and WSH come to mind).
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    var method;
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (org.antlr.env.ua.rhino) {
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        method = "loadFileUsingJava";
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } else {
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        throw new Error(
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ANTLR File I/O is not supported in this JS implementation."
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        );
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    var data = this[method](fileName, encoding);
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    org.antlr.runtime.ANTLRFileStream.superclass.constructor.call(this, data);
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.lang.extend(org.antlr.runtime.ANTLRFileStream,
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  org.antlr.runtime.ANTLRStringStream,
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** @lends org.antlr.runtime.ANTLRFileStream.prototype */{
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Get the file path from which the input was loaded.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @returns {String} the file path from which the input was loaded
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getSourceName: function() {
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return this.fileName;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Read the file and return its contents as a JS string.
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @private
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param {String} fileName path of the file to be loaded
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param {String} [encoding] name of the charset used for decoding
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @returns {String} the contents of the file
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    loadFileUsingJava: function(fileName, encoding) {
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // read the file using Java methods
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var f = new java.io.File(fileName),
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            size = f.length(),
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            isr,
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fis = new java.io.FileInputStream(f);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (encoding) {
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            isr = new java.io.InputStreamReader(fis, encoding);
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else {
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            isr = new java.io.InputStreamReader(fis);
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var data = java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, size);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        isr.read(data, 0, size);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // convert java char array to a javascript string
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return new String(new java.lang.String(data));
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver});
64