diff options
Diffstat (limited to 'samples/autoimports.js')
-rw-r--r-- | samples/autoimports.js | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/samples/autoimports.js b/samples/autoimports.js deleted file mode 100644 index 85683f54..00000000 --- a/samples/autoimports.js +++ /dev/null @@ -1,163 +0,0 @@ -# autoimports script requires -scripting mode - -/* - * Copyright (c) 2015, 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. - */ - -/* - * It is tedious to import Java classes used in a script. Sometimes it is easier - * use simple names of java classes and have a script auto import Java classes. - * You can load this script at the start of an interactive jjs session or at the - * start of your script. This script defines a __noSuchProperty__ hook to auto - * import Java classes as needed and when they are referred to for the first time - * in your script. You can also call the "autoimports" function to print script - * statements that you need to use in your script, i.e., have the function generate - * a script to import Java classes used by your script so far. After running your - * script, you can call autoimports to get the exact Java imports you need and replace - * the autoimports load with the generated import statements (to avoid costly init of - * the autoimports script). - */ - -(function() { - var ArrayList = Java.type("java.util.ArrayList"); - var HashMap = Java.type("java.util.HashMap"); - var JarFile = Java.type("java.util.jar.JarFile"); - var File = Java.type("java.io.File"); - var Files = Java.type("java.nio.file.Files"); - var FileSystems = Java.type("java.nio.file.FileSystems"); - var System = Java.type("java.lang.System"); - var URI = Java.type("java.net.URI"); - - // initialize a class to package map by iterating all - // classes available in the system by walking through "jrt fs" - - var clsToPkg = new HashMap(); - - // locate rt.jar from sun.boot.class.path - function findRtJar() { - var paths = System.getProperty("sun.boot.class.path").split(File.pathSeparator); - for each (var p in paths) { - if (p.endsWith("rt.jar") && new File(p).exists()) { - return p; - } - } - } - - - function addToClsToPkg(c, p) { - if (clsToPkg.containsKey(c)) { - var val = clsToPkg.get(c); - if (val instanceof ArrayList) { - val.add(p); - } else { - var al = new ArrayList(); - al.add(val); - al.add(p); - clsToPkg.put(c, al); - } - } else { - clsToPkg.put(c, p); - } - } - - // handle collision and allow user to choose package - function getPkgOfCls(c) { - var val = clsToPkg.get(c); - if (val instanceof ArrayList) { - var count = 1; - print("Multiple matches for " + c + ", choose package:"); - for each (var v in val) { - print(count + ". " + v); - count++; - } - var choice = parseInt(readLine()); - if (isNaN(choice) || choice < 1 || choice > val.size()) { - print("invalid choice: " + choice); - return undefined; - } - return val.get(choice - 1); - } else { - return val; - } - } - - var rtJar = findRtJar(); - var stream = new JarFile(rtJar).stream(); - try { - stream.forEach( - function(entry) { - var str = entry.name; - if (str.endsWith(".class")) { - if (str.startsWith("java") || - str.startsWith("javax") || - str.startsWith("org")) { - var lastIdx = str.lastIndexOf('/'); - if (lastIdx != -1) { - var pkg = str.substring(0, lastIdx).replaceAll('/', '.'); - var cls = str.substring(lastIdx + 1, str.lastIndexOf(".class")); - addToClsToPkg(cls, pkg); - } - } - } - }); - } finally { - stream.close(); - } - - var imports = new ArrayList(); - var global = this; - var oldNoSuchProp = global.__noSuchProperty__; - this.__noSuchProperty__ = function(name) { - 'use strict'; - - if (clsToPkg.containsKey(name)) { - var pkg = getPkgOfCls(name); - if (pkg) { - var clsName = pkg + "." + name; - imports.add("var " + name + " = Java.type('" + clsName + "');"); - return global[name] = Java.type(clsName); - } - } else if (typeof oldNoSuchProp == 'function') { - return oldNoSuchProp.call(this, name); - } - - if (typeof this == 'undefined') { - throw new ReferenceError(name); - } else { - return undefined; - } - } - - this.autoimports = function() { - for each (var im in imports) { - print(im); - } - } -})(); |