attila@963: /* attila@963: * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. attila@963: * attila@963: * Redistribution and use in source and binary forms, with or without attila@963: * modification, are permitted provided that the following conditions attila@963: * are met: attila@963: * attila@963: * - Redistributions of source code must retain the above copyright attila@963: * notice, this list of conditions and the following disclaimer. attila@963: * attila@963: * - Redistributions in binary form must reproduce the above copyright attila@963: * notice, this list of conditions and the following disclaimer in the attila@963: * documentation and/or other materials provided with the distribution. attila@963: * attila@963: * - Neither the name of Oracle nor the names of its attila@963: * contributors may be used to endorse or promote products derived attila@963: * from this software without specific prior written permission. attila@963: * attila@963: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS attila@963: * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, attila@963: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR attila@963: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR attila@963: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, attila@963: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, attila@963: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR attila@963: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF attila@963: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING attila@963: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS attila@963: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. attila@963: */ attila@963: attila@963: // Flexible script object using AbstractJSObject subclass attila@963: attila@963: var AbstractJSObject = Java.type("jdk.nashorn.api.scripting.AbstractJSObject"); attila@963: attila@963: // JSObject example that uses a map for properties and attila@963: // falls back to with methods on a java object (for missing attila@963: // properties attila@963: attila@963: function makeJSObj(map, fallback) { attila@963: return new AbstractJSObject() { attila@963: getMember: function(name) { attila@963: if (map.containsKey(name)) { attila@963: return map.get(name); attila@963: } attila@963: attila@963: var val = fallback[name]; attila@963: if (typeof val == 'function') { attila@963: return function() { attila@963: var a = arguments; attila@963: switch (a.length) { attila@963: case 0: return fallback[name](); attila@963: case 1: return fallback[name](a[0]); attila@963: case 2: return fallback[name](a[0], a[1]); attila@963: case 3: return fallback[name](a[0], a[1], a[2]); attila@963: case 4: return fallback[name](a[0], a[1], a[2], a[3]); attila@963: } attila@963: } attila@963: } attila@963: } attila@963: } attila@963: } attila@963: attila@963: var m = new java.util.HashMap(); attila@963: m.put("foo", 42); attila@963: m.put("bar", 'hello'); attila@963: attila@963: var obj = makeJSObj(m, new java.io.File(".")); attila@963: attila@963: print(obj.foo); attila@963: print(obj.bar); attila@963: print(obj.getAbsolutePath()); attila@963: print(obj.isDirectory());