       1 /*
       2  * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
       3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       4  *
       5  * This code is free software; you can redistribute it and/or modify it
       6  * under the terms of the GNU General Public License version 2 only, as
       7  * published by the Free Software Foundation.  Oracle designates this
       8  * particular file as subject to the "Classpath" exception as provided
       9  * by Oracle in the LICENSE file that accompanied this code.
      10  *
      11  * This code is distributed in the hope that it will be useful, but WITHOUT
      12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14  * version 2 for more details (a copy is included in the LICENSE file that
      15  * accompanied this code).
      16  *
      17  * You should have received a copy of the GNU General Public License version
      18  * 2 along with this work; if not, write to the Free Software Foundation,
      19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
      20  *
      21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
      22  * or visit www.oracle.com if you need additional information or have any
      23  * questions.
      24  */
      25
      26 package jdk.nashorn.api.scripting;
      27
      28 import java.util.Collection;
      29 import java.util.Collections;
      30 import java.util.Objects;
      31 import java.util.Set;
      32
      33 /**
      34  * This is the base class for nashorn ScriptObjectMirror class.
      35  *
      36  * This class can also be subclassed by an arbitrary Java class. Nashorn will
      37  * treat objects of such classes just like nashorn script objects. Usual nashorn
      38  * operations like obj[i], obj.foo, obj.func(), delete obj.foo will be delegated
      39  * to appropriate method call of this class.
      40  *
      41  * @since 1.8u40
      42  */
      43 public abstract class AbstractJSObject implements JSObject {
      44     /**
      45      * The default constructor.
      46      */
      47     public AbstractJSObject() {}
      48
      49     /**
      50      * @implSpec This implementation always throws UnsupportedOperationException
      51      */
      52     @Override
      53     public Object call(final Object thiz, final Object... args) {
      54         throw new UnsupportedOperationException("call");
      55     }
      56
      57     /**
      58      * @implSpec This implementation always throws UnsupportedOperationException
      59      */
      60     @Override
      61     public Object newObject(final Object... args) {
      62         throw new UnsupportedOperationException("newObject");
      63     }
      64
      65     /**
      66      * @implSpec This imlementation always throws UnsupportedOperationException
      67      */
      68     @Override
      69     public Object eval(final String s) {
      70         throw new UnsupportedOperationException("eval");
      71     }
      72
      73     /**
      74      * @implSpec This implementation always returns null
      75      */
      76     @Override
      77     public Object getMember(final String name) {
      78         Objects.requireNonNull(name);
      79         return null;
      80     }
      81
      82     /**
      83      * @implSpec This implementation always returns null
      84      */
      85     @Override
      86     public Object getSlot(final int index) {
      87         return null;
      88     }
      89
      90     /**
      91      * @implSpec This implementation always returns false
      92      */
      93     @Override
      94     public boolean hasMember(final String name) {
      95         Objects.requireNonNull(name);
      96         return false;
      97     }
      98
      99     /**
     100      * @implSpec This implementation always returns false
     101      */
     102     @Override
     103     public boolean hasSlot(final int slot) {
     104         return false;
     105     }
     106
     107     /**
     108      * @implSpec This implementation is a no-op
     109      */
     110     @Override
     111     public void removeMember(final String name) {
     112         Objects.requireNonNull(name);
     113         //empty
     114     }
     115
     116     /**
     117      * @implSpec This implementation is a no-op
     118      */
     119     @Override
     120     public void setMember(final String name, final Object value) {
     121         Objects.requireNonNull(name);
     122         //empty
     123     }
     124
     125     /**
     126      * @implSpec This implementation is a no-op
     127      */
     128     @Override
     129     public void setSlot(final int index, final Object value) {
     130         //empty
     131     }
     132
     133     // property and value iteration
     134
     135     /**
     136      * @implSpec This implementation returns empty set
     137      */
     138     @Override
     139     public Set<String> keySet() {
     140         return Collections.emptySet();
     141     }
     142
     143     /**
     144      * @implSpec This implementation returns empty set
     145      */
     146     @Override
     147     public Collection<Object> values() {
     148         return Collections.emptySet();
     149     }
     150
     151     // JavaScript instanceof check
     152
     153     /**
     154      * @implSpec This implementation always returns false
     155      */
     156     @Override
     157     public boolean isInstance(final Object instance) {
     158         return false;
     159     }
     160
     161     @Override
     162     public boolean isInstanceOf(final Object clazz) {
     163         if (clazz instanceof JSObject) {
     164             return ((JSObject)clazz).isInstance(this);
     165         }
     166
     167         return false;
     168     }
     169
     170     @Override
     171     public String getClassName() {
     172         return getClass().getName();
     173     }
     174
     175     /**
     176      * @implSpec This implementation always returns false
     177      */
     178     @Override
     179     public boolean isFunction() {
     180         return false;
     181     }
     182
     183     /**
     184      * @implSpec This implementation always returns false
     185      */
     186     @Override
     187     public boolean isStrictFunction() {
     188         return false;
     189     }
     190
     191     /**
     192      * @implSpec This implementation always returns false
     193      */
     194     @Override
     195     public boolean isArray() {
     196         return false;
     197     }
     198
     199     /**
     200      * Returns this object's numeric value.
     201      *
     202      * @return this object's numeric value.
     203      * @deprecated use {@link #getDefaultValue(Class)} with {@link Number} hint instead.
     204      */
     205     @Override @Deprecated
     206     public double toNumber() {
     207         return Double.NaN;
     208     }
     209
     210     /**
     211      * When passed an {@link AbstractJSObject}, invokes its {@link #getDefaultValue(Class)} method. When passed any
     212      * other {@link JSObject}, it will obtain its {@code [[DefaultValue]]} method as per ECMAScript 5.1 section
     213      * 8.6.2.
     214      *
     215      * @param jsobj the {@link JSObject} whose {@code [[DefaultValue]]} is obtained.
     216      * @param hint the type hint. Should be either {@code null}, {@code Number.class} or {@code String.class}.
     217      * @return this object's default value.
     218      * @throws UnsupportedOperationException if the conversion can't be performed. The engine will convert this
     219      * exception into a JavaScript {@code TypeError}.
     220      * @deprecated use {@link JSObject#getDefaultValue(Class)} instead.
     221      */
     222     @Deprecated
     223     public static Object getDefaultValue(final JSObject jsobj, final Class<?> hint) {
     224         return jsobj.getDefaultValue(hint);
     225     }
     226 }