console.js revision 1282:f879641b5a69
1/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 *   - Redistributions of source code must retain the above copyright
9 *     notice, this list of conditions and the following disclaimer.
10 *
11 *   - Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *   - Neither the name of Oracle nor the names of its
16 *     contributors may be used to endorse or promote products derived
17 *     from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/**
33 * Simple Web Console-like support for Nashorn. In addition to
34 * Web console object methods, this console add methods of
35 * java.io.Console as well. Note:not all web console methods are
36 * implemented but useful subset is implemented.
37 *
38 * See also: https://developer.mozilla.org/en/docs/Web/API/console
39 */
40
41
42if (typeof console == 'undefined') {
43
44(function() {
45    var LocalDateTime = Java.type("java.time.LocalDateTime");
46    var System = Java.type("java.lang.System");
47    var jconsole = System.console();
48
49    // add a new global variable called "console"
50    this.console = {
51    };
52
53    function addConsoleMethods() {
54        // expose methods of java.io.Console as an extension
55        var placeholder = "-*-";
56        // put a placeholder for each name from java.lang.Object
57        var objMethods = Object.bindProperties({}, new java.lang.Object());
58        for (var m in objMethods) {
59            console[m] = placeholder;
60        }
61
62        // bind only the methods of java.io.Console
63        // This bind will skip java.lang.Object methods as console
64        // has properties of same name.
65        Object.bindProperties(console, jconsole);
66
67        // Now, delete java.lang.Object methods
68        for (var m in console) {
69            if (console[m] == placeholder) {
70                delete console[m];
71            }
72        }
73    }
74
75    addConsoleMethods();
76
77    function consoleLog(type, msg) {
78        // print type of message, then time.
79        jconsole.format("%s [%s] ", type, LocalDateTime.now().toString());
80        if (typeof msg == 'string') {
81            jconsole.format(msg + "\n", Array.prototype.slice.call(arguments, 2));
82        } else {
83            // simple space separated values and newline at the end
84            var arr = Array.prototype.slice.call(arguments, 1);
85            jconsole.format("%s\n", arr.join(" "));
86        }
87    }
88
89    console.toString = function() "[object Console]";
90
91    // web console functions
92
93    console.assert = function(expr) {
94        if (! expr) {
95            arguments[0] = "Assertion Failed:";
96            consoleLog.apply(console, arguments);
97            // now, stack trace at the end
98            jconsole.format("%s\n", new Error().stack);
99        }
100    };
101
102    // dummy clear to avoid error!
103    console.clear = function() {};
104
105    var counter = {
106        get: function(label) {
107            if (! this[label]) {
108                return this[label] = 1;
109            } else {
110                return ++this[label];
111            }
112        }
113    };
114
115    // counter
116    console.count = function(label) {
117        label = label? String(label) : "<no label>";
118        jconsole.format("%s: %d\n",label, counter.get(label).intValue());
119    }
120
121    // logging
122    console.error = consoleLog.bind(jconsole, "ERROR");
123    console.info = consoleLog.bind(jconsole, "INFO");
124    console.log = console.info;
125    console.debug = console.log;
126    console.warn = consoleLog.bind(jconsole, "WARNING");
127
128    // print stack trace
129    console.trace = function() {
130        jconsole.format("%s\n", new Error().stack);
131    };
132})();
133
134}
135