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