src/jdk/nashorn/api/scripting/ScriptObjectMirror.java

Print this page




  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.AbstractMap;
  29 import java.util.ArrayList;
  30 import java.util.Collection;
  31 import java.util.Collections;
  32 import java.util.HashSet;
  33 import java.util.Iterator;
  34 import java.util.List;
  35 import java.util.Map;
  36 import java.util.Set;
  37 import java.util.concurrent.Callable;
  38 import jdk.nashorn.internal.runtime.Context;
  39 import jdk.nashorn.internal.runtime.ScriptFunction;
  40 import jdk.nashorn.internal.runtime.ScriptObject;

  41 import netscape.javascript.JSObject;
  42 
  43 /**
  44  * Mirror object that wraps a given ScriptObject instance. User can
  45  * access ScriptObject via the java.util.Map interface.
  46  */
  47 final class ScriptObjectMirror extends JSObject implements Map<Object, Object> {
  48     private final ScriptObject sobj;
  49     private final ScriptObject global;
  50 
  51     ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
  52         this.sobj = sobj;
  53         this.global = global;
  54     }
  55 
  56     @Override
  57     public boolean equals(final Object other) {
  58         if (other instanceof ScriptObjectMirror) {
  59             return sobj.equals(((ScriptObjectMirror)other).sobj);
  60         }
  61 
  62         return false;
  63     }
  64 
  65     @Override
  66     public int hashCode() {
  67         return sobj.hashCode();
  68     }
  69 










  70     private <V> V inGlobal(final Callable<V> callable) {
  71         final ScriptObject oldGlobal = Context.getGlobal();
  72         final boolean globalChanged = (oldGlobal != global);
  73         if (globalChanged) {
  74             NashornScriptEngine.setNashornGlobal(global);
  75         }
  76         try {
  77             return callable.call();
  78         } catch (final RuntimeException e) {
  79             throw e;
  80         } catch (final Exception e) {
  81             throw new AssertionError("Cannot happen", e);
  82         } finally {
  83             if (globalChanged) {
  84                 NashornScriptEngine.setNashornGlobal(oldGlobal);
  85             }
  86         }
  87     }
  88 
  89     // JSObject methods




  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.AbstractMap;
  29 import java.util.ArrayList;
  30 import java.util.Collection;
  31 import java.util.Collections;
  32 import java.util.HashSet;
  33 import java.util.Iterator;
  34 import java.util.List;
  35 import java.util.Map;
  36 import java.util.Set;
  37 import java.util.concurrent.Callable;
  38 import jdk.nashorn.internal.runtime.Context;
  39 import jdk.nashorn.internal.runtime.ScriptFunction;
  40 import jdk.nashorn.internal.runtime.ScriptObject;
  41 import jdk.nashorn.internal.runtime.ScriptRuntime;
  42 import netscape.javascript.JSObject;
  43 
  44 /**
  45  * Mirror object that wraps a given ScriptObject instance. User can
  46  * access ScriptObject via the java.util.Map interface.
  47  */
  48 final class ScriptObjectMirror extends JSObject implements Map<Object, Object> {
  49     private final ScriptObject sobj;
  50     private final ScriptObject global;
  51 
  52     ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
  53         this.sobj = sobj;
  54         this.global = global;
  55     }
  56 
  57     @Override
  58     public boolean equals(final Object other) {
  59         if (other instanceof ScriptObjectMirror) {
  60             return sobj.equals(((ScriptObjectMirror)other).sobj);
  61         }
  62 
  63         return false;
  64     }
  65 
  66     @Override
  67     public int hashCode() {
  68         return sobj.hashCode();
  69     }
  70 
  71     @Override
  72     public String toString() {
  73         return inGlobal(new Callable<String>() {
  74             @Override
  75             public String call() {
  76                 return ScriptRuntime.safeToString(sobj);
  77             }
  78         });
  79     }
  80 
  81     private <V> V inGlobal(final Callable<V> callable) {
  82         final ScriptObject oldGlobal = Context.getGlobal();
  83         final boolean globalChanged = (oldGlobal != global);
  84         if (globalChanged) {
  85             NashornScriptEngine.setNashornGlobal(global);
  86         }
  87         try {
  88             return callable.call();
  89         } catch (final RuntimeException e) {
  90             throw e;
  91         } catch (final Exception e) {
  92             throw new AssertionError("Cannot happen", e);
  93         } finally {
  94             if (globalChanged) {
  95                 NashornScriptEngine.setNashornGlobal(oldGlobal);
  96             }
  97         }
  98     }
  99 
 100     // JSObject methods