AbstractJSObject.java revision 1156:9eb891e01c37
1235426Sdelphij/* 2190225Srpaulo * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3190225Srpaulo * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4190225Srpaulo * 5190225Srpaulo * This code is free software; you can redistribute it and/or modify it 6190225Srpaulo * under the terms of the GNU General Public License version 2 only, as 7190225Srpaulo * published by the Free Software Foundation. Oracle designates this 8190225Srpaulo * particular file as subject to the "Classpath" exception as provided 9190225Srpaulo * by Oracle in the LICENSE file that accompanied this code. 10190225Srpaulo * 11190225Srpaulo * This code is distributed in the hope that it will be useful, but WITHOUT 12190225Srpaulo * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13190225Srpaulo * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14190225Srpaulo * version 2 for more details (a copy is included in the LICENSE file that 15190225Srpaulo * accompanied this code). 16190225Srpaulo * 17190225Srpaulo * You should have received a copy of the GNU General Public License version 18190225Srpaulo * 2 along with this work; if not, write to the Free Software Foundation, 19190225Srpaulo * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20190225Srpaulo * 21190225Srpaulo * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22190225Srpaulo * or visit www.oracle.com if you need additional information or have any 23190225Srpaulo * questions. 24190225Srpaulo */ 25190225Srpaulo 26190225Srpaulopackage jdk.nashorn.api.scripting; 27190225Srpaulo 28190225Srpauloimport java.util.Collection; 29190225Srpauloimport java.util.Collections; 30190225Srpauloimport java.util.Set; 31190225Srpaulo 32190225Srpaulo/** 33190225Srpaulo * This is the base class for nashorn ScriptObjectMirror class. 34190225Srpaulo * 35190225Srpaulo * This class can also be subclassed by an arbitrary Java class. Nashorn will 36190225Srpaulo * treat objects of such classes just like nashorn script objects. Usual nashorn 37190225Srpaulo * operations like obj[i], obj.foo, obj.func(), delete obj.foo will be glued 38190225Srpaulo * to appropriate method call of this class. 39190225Srpaulo * 40190225Srpaulo * @since 1.8u40 41190225Srpaulo */ 42190225Srpaulo@jdk.Exported 43190225Srpaulopublic abstract class AbstractJSObject implements JSObject { 44190225Srpaulo /** 45190225Srpaulo * Call this object as a JavaScript function. This is equivalent to 46190225Srpaulo * 'func.apply(thiz, args)' in JavaScript. 47190225Srpaulo * 48251129Sdelphij * @param thiz 'this' object to be passed to the function 49190225Srpaulo * @param args arguments to method 50190225Srpaulo * @return result of call 51190225Srpaulo */ 52190225Srpaulo @Override 53190225Srpaulo public Object call(final Object thiz, final Object... args) { 54190225Srpaulo throw new UnsupportedOperationException("call"); 55190225Srpaulo } 56190225Srpaulo 57190225Srpaulo /** 58190225Srpaulo * Call this 'constructor' JavaScript function to create a new object. 59190225Srpaulo * This is equivalent to 'new func(arg1, arg2...)' in JavaScript. 60190225Srpaulo * 61190225Srpaulo * @param args arguments to method 62251129Sdelphij * @return result of constructor call 63190225Srpaulo */ 64190225Srpaulo @Override 65190225Srpaulo public Object newObject(final Object... args) { 66190225Srpaulo throw new UnsupportedOperationException("newObject"); 67190225Srpaulo } 68190225Srpaulo 69190225Srpaulo /** 70235426Sdelphij * Evaluate a JavaScript expression. 71235426Sdelphij * 72190225Srpaulo * @param s JavaScript expression to evaluate 73190225Srpaulo * @return evaluation result 74190225Srpaulo */ 75190225Srpaulo @Override 76190225Srpaulo public Object eval(final String s) { 77190225Srpaulo throw new UnsupportedOperationException("eval"); 78190225Srpaulo } 79190225Srpaulo 80190225Srpaulo /** 81190225Srpaulo * Retrieves a named member of this JavaScript object. 82190225Srpaulo * 83235426Sdelphij * @param name of member 84235426Sdelphij * @return member 85190225Srpaulo */ 86190225Srpaulo @Override 87190225Srpaulo public Object getMember(final String name) { 88190225Srpaulo return null; 89190225Srpaulo } 90190225Srpaulo 91190225Srpaulo /** 92190225Srpaulo * Retrieves an indexed member of this JavaScript object. 93190225Srpaulo * 94190225Srpaulo * @param index index slot to retrieve 95190225Srpaulo * @return member 96190225Srpaulo */ 97190225Srpaulo @Override 98251129Sdelphij public Object getSlot(final int index) { 99190225Srpaulo return null; 100190225Srpaulo } 101190225Srpaulo 102190225Srpaulo /** 103190225Srpaulo * Does this object have a named member? 104190225Srpaulo * 105190225Srpaulo * @param name name of member 106190225Srpaulo * @return true if this object has a member of the given name 107190225Srpaulo */ 108190225Srpaulo @Override 109190225Srpaulo public boolean hasMember(final String name) { 110190225Srpaulo return false; 111190225Srpaulo } 112190225Srpaulo 113190225Srpaulo /** 114190225Srpaulo * Does this object have a indexed property? 115190225Srpaulo * 116190225Srpaulo * @param slot index to check 117190225Srpaulo * @return true if this object has a slot 118190225Srpaulo */ 119190225Srpaulo @Override 120190225Srpaulo public boolean hasSlot(final int slot) { 121190225Srpaulo return false; 122190225Srpaulo } 123190225Srpaulo 124190225Srpaulo /** 125190225Srpaulo * Remove a named member from this JavaScript object 126190225Srpaulo * 127190225Srpaulo * @param name name of the member 128190225Srpaulo */ 129190225Srpaulo @Override 130190225Srpaulo public void removeMember(final String name) { 131190225Srpaulo //empty 132190225Srpaulo } 133190225Srpaulo 134190225Srpaulo /** 135190225Srpaulo * Set a named member in this JavaScript object 136190225Srpaulo * 137190225Srpaulo * @param name name of the member 138190225Srpaulo * @param value value of the member 139190225Srpaulo */ 140190225Srpaulo @Override 141190225Srpaulo public void setMember(final String name, final Object value) { 142190225Srpaulo //empty 143190225Srpaulo } 144190225Srpaulo 145190225Srpaulo /** 146190225Srpaulo * Set an indexed member in this JavaScript object 147190225Srpaulo * 148190225Srpaulo * @param index index of the member slot 149190225Srpaulo * @param value value of the member 150190225Srpaulo */ 151190225Srpaulo @Override 152190225Srpaulo public void setSlot(final int index, final Object value) { 153190225Srpaulo //empty 154190225Srpaulo } 155190225Srpaulo 156190225Srpaulo // property and value iteration 157190225Srpaulo 158190225Srpaulo /** 159190225Srpaulo * Returns the set of all property names of this object. 160190225Srpaulo * 161190225Srpaulo * @return set of property names 162190225Srpaulo */ 163190225Srpaulo @Override 164190225Srpaulo @SuppressWarnings("unchecked") 165251129Sdelphij public Set<String> keySet() { 166190225Srpaulo return Collections.EMPTY_SET; 167190225Srpaulo } 168190225Srpaulo 169190225Srpaulo /** 170190225Srpaulo * Returns the set of all property values of this object. 171190225Srpaulo * 172190225Srpaulo * @return set of property values. 173190225Srpaulo */ 174190225Srpaulo @Override 175190225Srpaulo @SuppressWarnings("unchecked") 176190225Srpaulo public Collection<Object> values() { 177190225Srpaulo return Collections.EMPTY_SET; 178190225Srpaulo } 179190225Srpaulo 180190225Srpaulo // JavaScript instanceof check 181190225Srpaulo 182190225Srpaulo /** 183251129Sdelphij * Checking whether the given object is an instance of 'this' object. 184190225Srpaulo * 185190225Srpaulo * @param instance instace to check 186190225Srpaulo * @return true if the given 'instance' is an instance of this 'function' object 187190225Srpaulo */ 188190225Srpaulo @Override 189251129Sdelphij public boolean isInstance(final Object instance) { 190190225Srpaulo return false; 191251129Sdelphij } 192190225Srpaulo 193251129Sdelphij /** 194190225Srpaulo * Checking whether this object is an instance of the given 'clazz' object. 195190225Srpaulo * 196190225Srpaulo * @param clazz clazz to check 197190225Srpaulo * @return true if this object is an instance of the given 'clazz' 198190225Srpaulo */ 199190225Srpaulo @Override 200190225Srpaulo public boolean isInstanceOf(final Object clazz) { 201190225Srpaulo if (clazz instanceof JSObject) { 202190225Srpaulo return ((JSObject)clazz).isInstance(this); 203190225Srpaulo } 204190225Srpaulo 205190225Srpaulo return false; 206190225Srpaulo } 207190225Srpaulo 208190225Srpaulo /** 209190225Srpaulo * ECMA [[Class]] property 210190225Srpaulo * 211190225Srpaulo * @return ECMA [[Class]] property value of this object 212190225Srpaulo */ 213190225Srpaulo @Override 214190225Srpaulo public String getClassName() { 215190225Srpaulo return getClass().getName(); 216190225Srpaulo } 217190225Srpaulo 218190225Srpaulo /** 219190225Srpaulo * Is this a function object? 220190225Srpaulo * 221190225Srpaulo * @return if this mirror wraps a ECMAScript function instance 222190225Srpaulo */ 223190225Srpaulo @Override 224190225Srpaulo public boolean isFunction() { 225190225Srpaulo return false; 226190225Srpaulo } 227190225Srpaulo 228190225Srpaulo /** 229190225Srpaulo * Is this a 'use strict' function object? 230190225Srpaulo * 231190225Srpaulo * @return true if this mirror represents a ECMAScript 'use strict' function 232190225Srpaulo */ 233190225Srpaulo @Override 234190225Srpaulo public boolean isStrictFunction() { 235190225Srpaulo return false; 236190225Srpaulo } 237190225Srpaulo 238190225Srpaulo /** 239190225Srpaulo * Is this an array object? 240190225Srpaulo * 241190225Srpaulo * @return if this mirror wraps a ECMAScript array object 242190225Srpaulo */ 243190225Srpaulo @Override 244190225Srpaulo public boolean isArray() { 245190225Srpaulo return false; 246190225Srpaulo } 247190225Srpaulo 248190225Srpaulo /** 249190225Srpaulo * Returns this object's numeric value. 250190225Srpaulo * 251190225Srpaulo * @return this object's numeric value. 252190225Srpaulo */ 253190225Srpaulo @Override 254190225Srpaulo public double toNumber() { 255190225Srpaulo return Double.NaN; 256190225Srpaulo } 257190225Srpaulo} 258190225Srpaulo