--- old/make/com/sun/script/Makefile 2013-05-10 13:34:22.248880578 +0530 +++ new/make/com/sun/script/Makefile 2013-05-10 13:34:21.948879097 +0530 @@ -31,32 +31,9 @@ AUTO_FILES_JAVA_DIRS = com/sun/script -# -# Files that need to be copied -# -SERVICEDIR = $(CLASSBINDIR)/META-INF/services - -FILES_copy = \ - $(SERVICEDIR)/javax.script.ScriptEngineFactory - include $(BUILDDIR)/common/Classes.gmk -all: classes copy-files - -# -# Copy the service provider configuration file into the resource -# directory. -# - -copy-files: $(FILES_copy) - -$(SERVICEDIR)/%: $(SHARE_SRC)/classes/com/sun/script/javascript/META-INF/services/% - $(install-file) - -.PHONY: copy-files - +all: classes clean:: - $(RM) -r $(CLASSDESTDIR)/com/sun/script/javascript - $(RM) $(FILES_copy) - + $(RM) -r $(CLASSDESTDIR)/com/sun/script --- old/make/sun/Makefile 2013-05-10 13:34:22.744883017 +0530 +++ new/make/sun/Makefile 2013-05-10 13:34:22.548882072 +0530 @@ -31,12 +31,6 @@ PRODUCT = sun include $(BUILDDIR)/common/Defs.gmk -# Rhino/Mozilla java sources -ORG_EXISTS := $(call DirExists,$(CLOSED_SRC)/share/classes/sun/org,,) -ifneq ("$(ORG_EXISTS)", "") - ORG_SUBDIR = org -endif - # Non windows subdirs ifneq ($(PLATFORM), windows) ifndef OPENJDK @@ -83,7 +77,7 @@ $(LWAWT_PRE_SUBDIR) $(DISPLAY_LIBS) $(DGA_SUBDIR) $(LWAWT_SUBDIR) \ jawt font jpeg cmm $(DISPLAY_TOOLS) SUBDIRS_management = management -SUBDIRS_misc = $(ORG_SUBDIR) rmi tracing +SUBDIRS_misc = rmi tracing SUBDIRS_tools = native2ascii serialver tools jconsole ifndef OPENJDK --- old/make/tools/src/build/tools/deps/refs.allowed 2013-05-10 13:34:23.276885673 +0530 +++ new/make/tools/src/build/tools/deps/refs.allowed 2013-05-10 13:34:23.092884770 +0530 @@ -30,7 +30,6 @@ # Residual references to java.beans. # The RemoveMethods tool does not yet purge the constant pool. -# Rhino is due to be replaced so not worth addressing this dependency now. # -java.beans.PropertyChangeListener=java.util.logging.LogManager,sun.org.mozilla.javascript.internal.Context,compact1,compact2,compact3 -java.beans.PropertyChangeEvent=sun.org.mozilla.javascript.internal.Context,compact3 +java.beans.PropertyChangeListener=java.util.logging.LogManager,compact1,compact2,compact3 +java.beans.PropertyChangeEvent=compact3 --- old/makefiles/CopyFiles.gmk 2013-05-10 13:34:23.780888169 +0530 +++ new/makefiles/CopyFiles.gmk 2013-05-10 13:34:23.576887165 +0530 @@ -458,24 +458,6 @@ ifndef OPENJDK -JS_RESOURCES_FILES := Messages.properties Messages_fr.properties -JS_RESOURCES_SRC_DIR := $(JDK_TOPDIR)/src/closed/share/classes/sun/org/mozilla/javascript/internal/resources -JS_RESOURCES_DST_DIR := $(JDK_OUTPUTDIR)/classes/sun/org/mozilla/javascript/internal/resources - -JS_RESOURCES_SRC := $(foreach F,$(JS_RESOURCES_FILES),$(JS_RESOURCES_SRC_DIR)/$(F)) -JS_RESOURCES_DST := $(foreach F,$(JS_RESOURCES_FILES),$(JS_RESOURCES_DST_DIR)/$(F)) - -$(JS_RESOURCES_DST_DIR)/% : $(JS_RESOURCES_SRC_DIR)/% - $(call install-file) - -COPY_FILES += $(JS_RESOURCES_DST) - -endif - -########################################################################################## - -ifndef OPENJDK - # # Solaris X11 Direct Graphics Access library # --- old/makefiles/CopyIntoClasses.gmk 2013-05-10 13:34:24.288890711 +0530 +++ new/makefiles/CopyIntoClasses.gmk 2013-05-10 13:34:24.080889660 +0530 @@ -172,10 +172,6 @@ else ALL_META-INF_DIRS:=$(ALL_META-INF_DIRS_share) endif -# Filter out META-INF dirs that shouldn't be included -ifdef OPENJDK - ALL_META-INF_DIRS:=$(filter-out %com/sun/script/javascript/META-INF,$(ALL_META-INF_DIRS)) -endif ifndef OPENJDK ALL_META-INF_DIRS += $(JDK_TOPDIR)/src/closed/share/classes/sun/java2d/cmm/kcms/META-INF --- old/makefiles/profile-rtjar-includes.txt 2013-05-10 13:34:24.756893019 +0530 +++ new/makefiles/profile-rtjar-includes.txt 2013-05-10 13:34:24.560892044 +0530 @@ -140,7 +140,6 @@ sun/net/www/protocol/http/ntlm \ sun/net/www/protocol/http/spnego \ sun/nio/ch/sctp \ - sun/org/mozilla \ sun/security/acl \ sun/security/jgss \ sun/security/krb5 \ @@ -161,10 +160,6 @@ javax/management/remote/rmi/_RMIServerImpl_Tie.class \ javax/management/remote/rmi/_RMIServer_Stub.class -PROFILE_3_INCLUDE_METAINF_SERVICES := \ - META-INF/services/javax.script.ScriptEngineFactory - - FULL_JRE_RTJAR_INCLUDE_PACKAGES := \ com/oracle \ com/sun/accessibility/internal/resources \ --- old/make/sun/org/Makefile 2013-05-10 13:34:25.252895479 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,39 +0,0 @@ -# -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Makefile for building Mozilla modules -# - -BUILDDIR = ../.. -PRODUCT = org -include $(BUILDDIR)/common/Defs.gmk - -SUBDIRS = mozilla -include $(BUILDDIR)/common/Subdirs.gmk - -all build clean clobber:: - $(SUBDIRS-loop) - --- old/make/sun/org/mozilla/Makefile 2013-05-10 13:34:25.596897186 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,39 +0,0 @@ -# -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Makefile for building Mozilla JavaScript modules -# - -BUILDDIR = ../../.. -PRODUCT = org -include $(BUILDDIR)/common/Defs.gmk - -SUBDIRS = javascript -include $(BUILDDIR)/common/Subdirs.gmk - -all build clean clobber:: - $(SUBDIRS-loop) - --- old/make/sun/org/mozilla/javascript/Makefile 2013-05-10 13:34:25.924898804 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,64 +0,0 @@ -# -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Makefile for building all of sun.org.mozilla.javascript.internal.* -# - -BUILDDIR = ../../../.. -PACKAGE = sun.org.mozilla.javascript.internal -PRODUCT = sun -include $(BUILDDIR)/common/Defs.gmk - -AUTO_FILES_JAVA_DIRS = sun/org/mozilla/javascript/internal - -RESOURCEDIR = \ - $(CLASSDESTDIR)/sun/org/mozilla/javascript/internal/resources - -FILES_copy = \ - $(RESOURCEDIR)/Messages.properties \ - $(RESOURCEDIR)/Messages_fr.properties - -# -# Rules -# - -include $(BUILDDIR)/common/Classes.gmk - -all: classes copy-files - -# -# Copy resource messages file for Rhino JavaScript interpreter -# - -copy-files: $(FILES_copy) - -$(RESOURCEDIR)/%: $(CLOSED_SRC)/share/classes/sun/org/mozilla/javascript/internal/resources/% - $(install-file) - -.PHONY: copy-files - -clean clobber:: - $(RM) -rf $(CLASSDESTDIR)/sun/org/mozilla/javascript --- old/src/share/classes/com/sun/script/javascript/ExternalScriptable.java 2013-05-10 13:34:26.404901191 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,467 +0,0 @@ -/* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; -import sun.org.mozilla.javascript.internal.*; -import javax.script.*; -import java.util.*; - -/** - * ExternalScriptable is an implementation of Scriptable - * backed by a JSR 223 ScriptContext instance. - * - * @author Mike Grogan - * @author A. Sundararajan - * @since 1.6 - */ - -final class ExternalScriptable implements Scriptable { - /* Underlying ScriptContext that we use to store - * named variables of this scope. - */ - private ScriptContext context; - - /* JavaScript allows variables to be named as numbers (indexed - * properties). This way arrays, objects (scopes) are treated uniformly. - * Note that JSR 223 API supports only String named variables and - * so we can't store these in Bindings. Also, JavaScript allows name - * of the property name to be even empty String! Again, JSR 223 API - * does not support empty name. So, we use the following fallback map - * to store such variables of this scope. This map is not exposed to - * JSR 223 API. We can just script objects "as is" and need not convert. - */ - private Map indexedProps; - - // my prototype - private Scriptable prototype; - // my parent scope, if any - private Scriptable parent; - - ExternalScriptable(ScriptContext context) { - this(context, new HashMap()); - } - - ExternalScriptable(ScriptContext context, Map indexedProps) { - if (context == null) { - throw new NullPointerException("context is null"); - } - this.context = context; - this.indexedProps = indexedProps; - } - - ScriptContext getContext() { - return context; - } - - private boolean isEmpty(String name) { - return name.equals(""); - } - - /** - * Return the name of the class. - */ - public String getClassName() { - return "Global"; - } - - /** - * Returns the value of the named property or NOT_FOUND. - * - * If the property was created using defineProperty, the - * appropriate getter method is called. - * - * @param name the name of the property - * @param start the object in which the lookup began - * @return the value of the property (may be null), or NOT_FOUND - */ - public synchronized Object get(String name, Scriptable start) { - if (isEmpty(name)) { - if (indexedProps.containsKey(name)) { - return indexedProps.get(name); - } else { - return NOT_FOUND; - } - } else { - synchronized (context) { - int scope = context.getAttributesScope(name); - if (scope != -1) { - Object value = context.getAttribute(name, scope); - return Context.javaToJS(value, this); - } else { - return NOT_FOUND; - } - } - } - } - - /** - * Returns the value of the indexed property or NOT_FOUND. - * - * @param index the numeric index for the property - * @param start the object in which the lookup began - * @return the value of the property (may be null), or NOT_FOUND - */ - public synchronized Object get(int index, Scriptable start) { - Integer key = new Integer(index); - if (indexedProps.containsKey(index)) { - return indexedProps.get(key); - } else { - return NOT_FOUND; - } - } - - /** - * Returns true if the named property is defined. - * - * @param name the name of the property - * @param start the object in which the lookup began - * @return true if and only if the property was found in the object - */ - public synchronized boolean has(String name, Scriptable start) { - if (isEmpty(name)) { - return indexedProps.containsKey(name); - } else { - synchronized (context) { - return context.getAttributesScope(name) != -1; - } - } - } - - /** - * Returns true if the property index is defined. - * - * @param index the numeric index for the property - * @param start the object in which the lookup began - * @return true if and only if the property was found in the object - */ - public synchronized boolean has(int index, Scriptable start) { - Integer key = new Integer(index); - return indexedProps.containsKey(key); - } - - /** - * Sets the value of the named property, creating it if need be. - * - * @param name the name of the property - * @param start the object whose property is being set - * @param value value to set the property to - */ - public void put(String name, Scriptable start, Object value) { - if (start == this) { - synchronized (this) { - if (isEmpty(name)) { - indexedProps.put(name, value); - } else { - synchronized (context) { - int scope = context.getAttributesScope(name); - if (scope == -1) { - scope = ScriptContext.ENGINE_SCOPE; - } - context.setAttribute(name, jsToJava(value), scope); - } - } - } - } else { - start.put(name, start, value); - } - } - - /** - * Sets the value of the indexed property, creating it if need be. - * - * @param index the numeric index for the property - * @param start the object whose property is being set - * @param value value to set the property to - */ - public void put(int index, Scriptable start, Object value) { - if (start == this) { - synchronized (this) { - indexedProps.put(new Integer(index), value); - } - } else { - start.put(index, start, value); - } - } - - /** - * Removes a named property from the object. - * - * If the property is not found, no action is taken. - * - * @param name the name of the property - */ - public synchronized void delete(String name) { - if (isEmpty(name)) { - indexedProps.remove(name); - } else { - synchronized (context) { - int scope = context.getAttributesScope(name); - if (scope != -1) { - context.removeAttribute(name, scope); - } - } - } - } - - /** - * Removes the indexed property from the object. - * - * If the property is not found, no action is taken. - * - * @param index the numeric index for the property - */ - public void delete(int index) { - indexedProps.remove(new Integer(index)); - } - - /** - * Get the prototype of the object. - * @return the prototype - */ - public Scriptable getPrototype() { - return prototype; - } - - /** - * Set the prototype of the object. - * @param prototype the prototype to set - */ - public void setPrototype(Scriptable prototype) { - this.prototype = prototype; - } - - /** - * Get the parent scope of the object. - * @return the parent scope - */ - public Scriptable getParentScope() { - return parent; - } - - /** - * Set the parent scope of the object. - * @param parent the parent scope to set - */ - public void setParentScope(Scriptable parent) { - this.parent = parent; - } - - /** - * Get an array of property ids. - * - * Not all property ids need be returned. Those properties - * whose ids are not returned are considered non-enumerable. - * - * @return an array of Objects. Each entry in the array is either - * a java.lang.String or a java.lang.Number - */ - public synchronized Object[] getIds() { - String[] keys = getAllKeys(); - int size = keys.length + indexedProps.size(); - Object[] res = new Object[size]; - System.arraycopy(keys, 0, res, 0, keys.length); - int i = keys.length; - // now add all indexed properties - for (Object index : indexedProps.keySet()) { - res[i++] = index; - } - return res; - } - - /** - * Get the default value of the object with a given hint. - * The hints are String.class for type String, Number.class for type - * Number, Scriptable.class for type Object, and Boolean.class for - * type Boolean.

- * - * A hint of null means "no hint". - * - * See ECMA 8.6.2.6. - * - * @param hint the type hint - * @return the default value - */ - public Object getDefaultValue(Class typeHint) { - for (int i=0; i < 2; i++) { - boolean tryToString; - if (typeHint == ScriptRuntime.StringClass) { - tryToString = (i == 0); - } else { - tryToString = (i == 1); - } - - String methodName; - Object[] args; - if (tryToString) { - methodName = "toString"; - args = ScriptRuntime.emptyArgs; - } else { - methodName = "valueOf"; - args = new Object[1]; - String hint; - if (typeHint == null) { - hint = "undefined"; - } else if (typeHint == ScriptRuntime.StringClass) { - hint = "string"; - } else if (typeHint == ScriptRuntime.ScriptableClass) { - hint = "object"; - } else if (typeHint == ScriptRuntime.FunctionClass) { - hint = "function"; - } else if (typeHint == ScriptRuntime.BooleanClass - || typeHint == Boolean.TYPE) - { - hint = "boolean"; - } else if (typeHint == ScriptRuntime.NumberClass || - typeHint == ScriptRuntime.ByteClass || - typeHint == Byte.TYPE || - typeHint == ScriptRuntime.ShortClass || - typeHint == Short.TYPE || - typeHint == ScriptRuntime.IntegerClass || - typeHint == Integer.TYPE || - typeHint == ScriptRuntime.FloatClass || - typeHint == Float.TYPE || - typeHint == ScriptRuntime.DoubleClass || - typeHint == Double.TYPE) - { - hint = "number"; - } else { - throw Context.reportRuntimeError( - "Invalid JavaScript value of type " + - typeHint.toString()); - } - args[0] = hint; - } - Object v = ScriptableObject.getProperty(this, methodName); - if (!(v instanceof Function)) - continue; - Function fun = (Function) v; - Context cx = RhinoScriptEngine.enterContext(); - try { - v = fun.call(cx, fun.getParentScope(), this, args); - } finally { - cx.exit(); - } - if (v != null) { - if (!(v instanceof Scriptable)) { - return v; - } - if (typeHint == ScriptRuntime.ScriptableClass - || typeHint == ScriptRuntime.FunctionClass) - { - return v; - } - if (tryToString && v instanceof Wrapper) { - // Let a wrapped java.lang.String pass for a primitive - // string. - Object u = ((Wrapper)v).unwrap(); - if (u instanceof String) - return u; - } - } - } - // fall through to error - String arg = (typeHint == null) ? "undefined" : typeHint.getName(); - throw Context.reportRuntimeError( - "Cannot find default value for object " + arg); - } - - /** - * Implements the instanceof operator. - * - * @param instance The value that appeared on the LHS of the instanceof - * operator - * @return true if "this" appears in value's prototype chain - * - */ - public boolean hasInstance(Scriptable instance) { - // Default for JS objects (other than Function) is to do prototype - // chasing. - Scriptable proto = instance.getPrototype(); - while (proto != null) { - if (proto.equals(this)) return true; - proto = proto.getPrototype(); - } - return false; - } - - private String[] getAllKeys() { - ArrayList list = new ArrayList(); - synchronized (context) { - for (int scope : context.getScopes()) { - Bindings bindings = context.getBindings(scope); - if (bindings != null) { - list.ensureCapacity(bindings.size()); - for (String key : bindings.keySet()) { - list.add(key); - } - } - } - } - String[] res = new String[list.size()]; - list.toArray(res); - return res; - } - - /** - * We convert script values to the nearest Java value. - * We unwrap wrapped Java objects so that access from - * Bindings.get() would return "workable" value for Java. - * But, at the same time, we need to make few special cases - * and hence the following function is used. - */ - private Object jsToJava(Object jsObj) { - if (jsObj instanceof Wrapper) { - Wrapper njb = (Wrapper) jsObj; - /* importClass feature of ImporterTopLevel puts - * NativeJavaClass in global scope. If we unwrap - * it, importClass won't work. - */ - if (njb instanceof NativeJavaClass) { - return njb; - } - - /* script may use Java primitive wrapper type objects - * (such as java.lang.Integer, java.lang.Boolean etc) - * explicitly. If we unwrap, then these script objects - * will become script primitive types. For example, - * - * var x = new java.lang.Double(3.0); print(typeof x); - * - * will print 'number'. We don't want that to happen. - */ - Object obj = njb.unwrap(); - if (obj instanceof Number || obj instanceof String || - obj instanceof Boolean || obj instanceof Character) { - // special type wrapped -- we just leave it as is. - return njb; - } else { - // return unwrapped object for any other object. - return obj; - } - } else { // not-a-Java-wrapper - return jsObj; - } - } -} --- old/src/share/classes/com/sun/script/javascript/JSAdapter.java 2013-05-10 13:34:26.732902812 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,338 +0,0 @@ -/* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; - -import sun.org.mozilla.javascript.internal.*; -import java.util.*; - -/** - * JSAdapter is java.lang.reflect.Proxy equivalent for JavaScript. JSAdapter - * calls specially named JavaScript methods on an adaptee object when property - * access is attempted on it. - * - * Example: - * - * var y = { - * __get__ : function (name) { ... } - * __has__ : function (name) { ... } - * __put__ : function (name, value) {...} - * __delete__ : function (name) { ... } - * __getIds__ : function () { ... } - * }; - * - * var x = new JSAdapter(y); - * - * x.i; // calls y.__get__ - * i in x; // calls y.__has__ - * x.p = 10; // calls y.__put__ - * delete x.p; // calls y.__delete__ - * for (i in x) { print(i); } // calls y.__getIds__ - * - * If a special JavaScript method is not found in the adaptee, then JSAdapter - * forwards the property access to the adaptee itself. - * - * JavaScript caller of adapter object is isolated from the fact that - * the property access/mutation/deletion are really calls to - * JavaScript methods on adaptee. Use cases include 'smart' - * properties, property access tracing/debugging, encaptulation with - * easy client access - in short JavaScript becomes more "Self" like. - * - * Note that Rhino already supports special properties like __proto__ - * (to set, get prototype), __parent__ (to set, get parent scope). We - * follow the same double underscore nameing convention here. Similarly - * the name JSAdapter is derived from JavaAdapter -- which is a facility - * to extend, implement Java classes/interfaces by JavaScript. - * - * @author A. Sundararajan - * @since 1.6 - */ -public final class JSAdapter implements Scriptable, Function { - private JSAdapter(Scriptable obj) { - setAdaptee(obj); - } - - // initializer to setup JSAdapter prototype in the given scope - public static void init(Context cx, Scriptable scope, boolean sealed) - throws RhinoException { - JSAdapter obj = new JSAdapter(cx.newObject(scope)); - obj.setParentScope(scope); - obj.setPrototype(getFunctionPrototype(scope)); - obj.isPrototype = true; - ScriptableObject.defineProperty(scope, "JSAdapter", obj, - ScriptableObject.DONTENUM); - } - - public String getClassName() { - return "JSAdapter"; - } - - public Object get(String name, Scriptable start) { - Function func = getAdapteeFunction(GET_PROP); - if (func != null) { - return call(func, new Object[] { name }); - } else { - start = getAdaptee(); - return start.get(name, start); - } - } - - public Object get(int index, Scriptable start) { - Function func = getAdapteeFunction(GET_PROP); - if (func != null) { - return call(func, new Object[] { new Integer(index) }); - } else { - start = getAdaptee(); - return start.get(index, start); - } - } - - public boolean has(String name, Scriptable start) { - Function func = getAdapteeFunction(HAS_PROP); - if (func != null) { - Object res = call(func, new Object[] { name }); - return Context.toBoolean(res); - } else { - start = getAdaptee(); - return start.has(name, start); - } - } - - public boolean has(int index, Scriptable start) { - Function func = getAdapteeFunction(HAS_PROP); - if (func != null) { - Object res = call(func, new Object[] { new Integer(index) }); - return Context.toBoolean(res); - } else { - start = getAdaptee(); - return start.has(index, start); - } - } - - public void put(String name, Scriptable start, Object value) { - if (start == this) { - Function func = getAdapteeFunction(PUT_PROP); - if (func != null) { - call(func, new Object[] { name, value }); - } else { - start = getAdaptee(); - start.put(name, start, value); - } - } else { - start.put(name, start, value); - } - } - - public void put(int index, Scriptable start, Object value) { - if (start == this) { - Function func = getAdapteeFunction(PUT_PROP); - if( func != null) { - call(func, new Object[] { new Integer(index), value }); - } else { - start = getAdaptee(); - start.put(index, start, value); - } - } else { - start.put(index, start, value); - } - } - - public void delete(String name) { - Function func = getAdapteeFunction(DEL_PROP); - if (func != null) { - call(func, new Object[] { name }); - } else { - getAdaptee().delete(name); - } - } - - public void delete(int index) { - Function func = getAdapteeFunction(DEL_PROP); - if (func != null) { - call(func, new Object[] { new Integer(index) }); - } else { - getAdaptee().delete(index); - } - } - - public Scriptable getPrototype() { - return prototype; - } - - public void setPrototype(Scriptable prototype) { - this.prototype = prototype; - } - - public Scriptable getParentScope() { - return parent; - } - - public void setParentScope(Scriptable parent) { - this.parent = parent; - } - - public Object[] getIds() { - Function func = getAdapteeFunction(GET_PROPIDS); - if (func != null) { - Object val = call(func, new Object[0]); - // in most cases, adaptee would return native JS array - if (val instanceof NativeArray) { - NativeArray array = (NativeArray) val; - Object[] res = new Object[(int)array.getLength()]; - for (int index = 0; index < res.length; index++) { - res[index] = mapToId(array.get(index, array)); - } - return res; - } else if (val instanceof NativeJavaArray) { - // may be attempt wrapped Java array - Object tmp = ((NativeJavaArray)val).unwrap(); - Object[] res; - if (tmp.getClass() == Object[].class) { - Object[] array = (Object[]) tmp; - res = new Object[array.length]; - for (int index = 0; index < array.length; index++) { - res[index] = mapToId(array[index]); - } - } else { - // just return an empty array - res = Context.emptyArgs; - } - return res; - } else { - // some other return type, just return empty array - return Context.emptyArgs; - } - } else { - return getAdaptee().getIds(); - } - } - - public boolean hasInstance(Scriptable scriptable) { - if (scriptable instanceof JSAdapter) { - return true; - } else { - Scriptable proto = scriptable.getPrototype(); - while (proto != null) { - if (proto.equals(this)) return true; - proto = proto.getPrototype(); - } - return false; - } - } - - public Object getDefaultValue(Class hint) { - return getAdaptee().getDefaultValue(hint); - } - - public Object call(Context cx, Scriptable scope, Scriptable thisObj, - Object[] args) - throws RhinoException { - if (isPrototype) { - return construct(cx, scope, args); - } else { - Scriptable tmp = getAdaptee(); - if (tmp instanceof Function) { - return ((Function)tmp).call(cx, scope, tmp, args); - } else { - throw Context.reportRuntimeError("TypeError: not a function"); - } - } - } - - public Scriptable construct(Context cx, Scriptable scope, Object[] args) - throws RhinoException { - if (isPrototype) { - Scriptable topLevel = ScriptableObject.getTopLevelScope(scope); - JSAdapter newObj; - if (args.length > 0) { - newObj = new JSAdapter(Context.toObject(args[0], topLevel)); - } else { - throw Context.reportRuntimeError("JSAdapter requires adaptee"); - } - return newObj; - } else { - Scriptable tmp = getAdaptee(); - if (tmp instanceof Function) { - return ((Function)tmp).construct(cx, scope, args); - } else { - throw Context.reportRuntimeError("TypeError: not a constructor"); - } - } - } - - public Scriptable getAdaptee() { - return adaptee; - } - - public void setAdaptee(Scriptable adaptee) { - if (adaptee == null) { - throw new NullPointerException("adaptee can not be null"); - } - this.adaptee = adaptee; - } - - //-- internals only below this point - - // map a property id. Property id can only be an Integer or String - private Object mapToId(Object tmp) { - if (tmp instanceof Double) { - return new Integer(((Double)tmp).intValue()); - } else { - return Context.toString(tmp); - } - } - - private static Scriptable getFunctionPrototype(Scriptable scope) { - return ScriptableObject.getFunctionPrototype(scope); - } - - private Function getAdapteeFunction(String name) { - Object o = ScriptableObject.getProperty(getAdaptee(), name); - return (o instanceof Function)? (Function)o : null; - } - - private Object call(Function func, Object[] args) { - Context cx = Context.getCurrentContext(); - Scriptable thisObj = getAdaptee(); - Scriptable scope = func.getParentScope(); - try { - return func.call(cx, scope, thisObj, args); - } catch (RhinoException re) { - throw Context.reportRuntimeError(re.getMessage()); - } - } - - private Scriptable prototype; - private Scriptable parent; - private Scriptable adaptee; - private boolean isPrototype; - - // names of adaptee JavaScript functions - private static final String GET_PROP = "__get__"; - private static final String HAS_PROP = "__has__"; - private static final String PUT_PROP = "__put__"; - private static final String DEL_PROP = "__delete__"; - private static final String GET_PROPIDS = "__getIds__"; -} --- old/src/share/classes/com/sun/script/javascript/JavaAdapter.java 2013-05-10 13:34:27.064904457 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; - -import javax.script.Invocable; -import sun.org.mozilla.javascript.internal.*; - -/** - * This class implements Rhino-like JavaAdapter to help implement a Java - * interface in JavaScript. We support this using Invocable.getInterface. - * Using this JavaAdapter, script author could write: - * - * var r = new java.lang.Runnable() { - * run: function() { script... } - * }; - * - * r.run(); - * new java.lang.Thread(r).start(); - * - * Note that Rhino's JavaAdapter support allows extending a Java class and/or - * implementing one or more interfaces. This JavaAdapter implementation does - * not support these. - * - * @author A. Sundararajan - * @since 1.6 - */ -final class JavaAdapter extends ScriptableObject implements Function { - private JavaAdapter(Invocable engine) { - this.engine = engine; - } - - static void init(Context cx, Scriptable scope, boolean sealed) - throws RhinoException { - RhinoTopLevel topLevel = (RhinoTopLevel) scope; - Invocable engine = topLevel.getScriptEngine(); - JavaAdapter obj = new JavaAdapter(engine); - obj.setParentScope(scope); - obj.setPrototype(getFunctionPrototype(scope)); - /* - * Note that we can't use defineProperty. A property of this - * name is already defined in Context.initStandardObjects. We - * simply overwrite the property value! - */ - ScriptableObject.putProperty(topLevel, "JavaAdapter", obj); - } - - public String getClassName() { - return "JavaAdapter"; - } - - public Object call(Context cx, Scriptable scope, Scriptable thisObj, - Object[] args) throws RhinoException { - return construct(cx, scope, args); - } - - public Scriptable construct(Context cx, Scriptable scope, Object[] args) - throws RhinoException { - if (args.length == 2) { - Class clazz = null; - Object obj1 = args[0]; - if (obj1 instanceof Wrapper) { - Object o = ((Wrapper)obj1).unwrap(); - if (o instanceof Class && ((Class)o).isInterface()) { - clazz = (Class) o; - } - } else if (obj1 instanceof Class) { - if (((Class)obj1).isInterface()) { - clazz = (Class) obj1; - } - } - if (clazz == null) { - throw Context.reportRuntimeError("JavaAdapter: first arg should be interface Class"); - } - - Scriptable topLevel = ScriptableObject.getTopLevelScope(scope); - return cx.toObject(engine.getInterface(args[1], clazz), topLevel); - } else { - throw Context.reportRuntimeError("JavaAdapter requires two arguments"); - } - } - - private Invocable engine; -} --- old/src/share/classes/com/sun/script/javascript/META-INF/services/javax.script.ScriptEngineFactory 2013-05-10 13:34:27.396906112 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,5 +0,0 @@ - -#script engines supported - -com.sun.script.javascript.RhinoScriptEngineFactory #javascript - --- old/src/share/classes/com/sun/script/javascript/RhinoClassShutter.java 2013-05-10 13:34:27.728907752 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; - -import java.util.*; -import sun.org.mozilla.javascript.internal.*; - -/** - * This class prevents script access to certain sensitive classes. - * Note that this class checks over and above SecurityManager. i.e., although - * a SecurityManager would pass, class shutter may still prevent access. - * - * @author A. Sundararajan - * @since 1.6 - */ -final class RhinoClassShutter implements ClassShutter { - private static Map protectedClasses; - private static RhinoClassShutter theInstance; - - private RhinoClassShutter() { - } - - static synchronized ClassShutter getInstance() { - if (theInstance == null) { - theInstance = new RhinoClassShutter(); - protectedClasses = new HashMap(); - - // For now, we just have AccessController. Allowing scripts - // to this class will allow it to execute doPrivileged in - // bootstrap context. We can add more classes for other reasons. - protectedClasses.put("java.security.AccessController", Boolean.TRUE); - } - return theInstance; - } - - public boolean visibleToScripts(String fullClassName) { - // first do the security check. - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - int i = fullClassName.lastIndexOf("."); - if (i != -1) { - try { - sm.checkPackageAccess(fullClassName.substring(0, i)); - } catch (SecurityException se) { - return false; - } - } - } - // now, check is it a protected class. - return protectedClasses.get(fullClassName) == null; - } -} --- old/src/share/classes/com/sun/script/javascript/RhinoCompiledScript.java 2013-05-10 13:34:28.056909385 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; -import javax.script.*; -import sun.org.mozilla.javascript.internal.*; - -/** - * Represents compiled JavaScript code. - * - * @author Mike Grogan - * @since 1.6 - */ -final class RhinoCompiledScript extends CompiledScript { - - private RhinoScriptEngine engine; - private Script script; - - - RhinoCompiledScript(RhinoScriptEngine engine, Script script) { - this.engine = engine; - this.script = script; - } - - public Object eval(ScriptContext context) throws ScriptException { - - Object result = null; - Context cx = RhinoScriptEngine.enterContext(); - try { - - Scriptable scope = engine.getRuntimeScope(context); - Object ret = script.exec(cx, scope); - result = engine.unwrapReturnValue(ret); - } catch (RhinoException re) { - int line = (line = re.lineNumber()) == 0 ? -1 : line; - String msg; - if (re instanceof JavaScriptException) { - msg = String.valueOf(((JavaScriptException)re).getValue()); - } else { - msg = re.toString(); - } - ScriptException se = new ScriptException(msg, re.sourceName(), line); - se.initCause(re); - throw se; - } finally { - Context.exit(); - } - - return result; - } - - public ScriptEngine getEngine() { - return engine; - } - -} --- old/src/share/classes/com/sun/script/javascript/RhinoScriptEngine.java 2013-05-10 13:34:28.388911025 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,398 +0,0 @@ -/* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; -import com.sun.script.util.*; -import javax.script.*; -import sun.org.mozilla.javascript.internal.*; -import java.lang.reflect.Method; -import java.io.*; -import java.util.*; - - -/** - * Implementation of ScriptEngine using the Mozilla Rhino - * interpreter. - * - * @author Mike Grogan - * @author A. Sundararajan - * @since 1.6 - */ -public final class RhinoScriptEngine extends AbstractScriptEngine - implements Invocable, Compilable { - - private static final boolean DEBUG = false; - - /* Scope where standard JavaScript objects and our - * extensions to it are stored. Note that these are not - * user defined engine level global variables. These are - * variables have to be there on all compliant ECMAScript - * scopes. We put these standard objects in this top level. - */ - private RhinoTopLevel topLevel; - - /* map used to store indexed properties in engine scope - * refer to comment on 'indexedProps' in ExternalScriptable.java. - */ - private Map indexedProps; - - private ScriptEngineFactory factory; - private InterfaceImplementor implementor; - - private static final int languageVersion = getLanguageVersion(); - private static final int optimizationLevel = getOptimizationLevel(); - static { - ContextFactory.initGlobal(new ContextFactory() { - protected Context makeContext() { - Context cx = super.makeContext(); - cx.setLanguageVersion(languageVersion); - cx.setOptimizationLevel(optimizationLevel); - cx.setClassShutter(RhinoClassShutter.getInstance()); - cx.setWrapFactory(RhinoWrapFactory.getInstance()); - return cx; - } - }); - } - - private static final String RHINO_JS_VERSION = "rhino.js.version"; - private static int getLanguageVersion() { - int version; - String tmp = java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction(RHINO_JS_VERSION)); - if (tmp != null) { - version = Integer.parseInt((String)tmp); - } else { - version = Context.VERSION_1_8; - } - return version; - } - - private static final String RHINO_OPT_LEVEL = "rhino.opt.level"; - private static int getOptimizationLevel() { - int optLevel = -1; - // disable optimizer under security manager, for now. - if (System.getSecurityManager() == null) { - optLevel = Integer.getInteger(RHINO_OPT_LEVEL, -1); - } - return optLevel; - } - - /** - * Creates a new instance of RhinoScriptEngine - */ - public RhinoScriptEngine() { - - Context cx = enterContext(); - try { - topLevel = new RhinoTopLevel(cx, this); - } finally { - cx.exit(); - } - - indexedProps = new HashMap(); - - //construct object used to implement getInterface - implementor = new InterfaceImplementor(this) { - protected boolean isImplemented(Object thiz, Class iface) { - Context cx = enterContext(); - try { - if (thiz != null && !(thiz instanceof Scriptable)) { - thiz = cx.toObject(thiz, topLevel); - } - Scriptable engineScope = getRuntimeScope(context); - Scriptable localScope = (thiz != null)? (Scriptable) thiz : - engineScope; - for (Method method : iface.getMethods()) { - // ignore methods of java.lang.Object class - if (method.getDeclaringClass() == Object.class) { - continue; - } - Object obj = ScriptableObject.getProperty(localScope, method.getName()); - if (! (obj instanceof Function)) { - return false; - } - } - return true; - } finally { - cx.exit(); - } - } - - protected Object convertResult(Method method, Object res) - throws ScriptException { - Class desiredType = method.getReturnType(); - if (desiredType == Void.TYPE) { - return null; - } else { - return Context.jsToJava(res, desiredType); - } - } - }; - } - - public Object eval(Reader reader, ScriptContext ctxt) - throws ScriptException { - Object ret; - - Context cx = enterContext(); - try { - Scriptable scope = getRuntimeScope(ctxt); - String filename = (String) get(ScriptEngine.FILENAME); - filename = filename == null ? "" : filename; - - ret = cx.evaluateReader(scope, reader, filename , 1, null); - } catch (RhinoException re) { - if (DEBUG) re.printStackTrace(); - int line = (line = re.lineNumber()) == 0 ? -1 : line; - String msg; - if (re instanceof JavaScriptException) { - msg = String.valueOf(((JavaScriptException)re).getValue()); - } else { - msg = re.toString(); - } - ScriptException se = new ScriptException(msg, re.sourceName(), line); - se.initCause(re); - throw se; - } catch (IOException ee) { - throw new ScriptException(ee); - } finally { - cx.exit(); - } - - return unwrapReturnValue(ret); - } - - public Object eval(String script, ScriptContext ctxt) throws ScriptException { - if (script == null) { - throw new NullPointerException("null script"); - } - return eval(new StringReader(script) , ctxt); - } - - public ScriptEngineFactory getFactory() { - if (factory != null) { - return factory; - } else { - return new RhinoScriptEngineFactory(); - } - } - - public Bindings createBindings() { - return new SimpleBindings(); - } - - //Invocable methods - public Object invokeFunction(String name, Object... args) - throws ScriptException, NoSuchMethodException { - return invoke(null, name, args); - } - - public Object invokeMethod(Object thiz, String name, Object... args) - throws ScriptException, NoSuchMethodException { - if (thiz == null) { - throw new IllegalArgumentException("script object can not be null"); - } - return invoke(thiz, name, args); - } - - private Object invoke(Object thiz, String name, Object... args) - throws ScriptException, NoSuchMethodException { - Context cx = enterContext(); - try { - if (name == null) { - throw new NullPointerException("method name is null"); - } - - if (thiz != null && !(thiz instanceof Scriptable)) { - thiz = cx.toObject(thiz, topLevel); - } - - Scriptable engineScope = getRuntimeScope(context); - Scriptable localScope = (thiz != null)? (Scriptable) thiz : - engineScope; - Object obj = ScriptableObject.getProperty(localScope, name); - if (! (obj instanceof Function)) { - throw new NoSuchMethodException("no such method: " + name); - } - - Function func = (Function) obj; - Scriptable scope = func.getParentScope(); - if (scope == null) { - scope = engineScope; - } - Object result = func.call(cx, scope, localScope, - wrapArguments(args)); - return unwrapReturnValue(result); - } catch (RhinoException re) { - if (DEBUG) re.printStackTrace(); - int line = (line = re.lineNumber()) == 0 ? -1 : line; - ScriptException se = new ScriptException(re.toString(), re.sourceName(), line); - se.initCause(re); - throw se; - } finally { - cx.exit(); - } - } - - public T getInterface(Class clasz) { - try { - return implementor.getInterface(null, clasz); - } catch (ScriptException e) { - return null; - } - } - - public T getInterface(Object thiz, Class clasz) { - if (thiz == null) { - throw new IllegalArgumentException("script object can not be null"); - } - - try { - return implementor.getInterface(thiz, clasz); - } catch (ScriptException e) { - return null; - } - } - - private static final String printSource = - "function print(str, newline) { \n" + - " if (typeof(str) == 'undefined') { \n" + - " str = 'undefined'; \n" + - " } else if (str == null) { \n" + - " str = 'null'; \n" + - " } \n" + - " var out = context.getWriter(); \n" + - " if (!(out instanceof java.io.PrintWriter))\n" + - " out = new java.io.PrintWriter(out); \n" + - " out.print(String(str)); \n" + - " if (newline) out.print('\\n'); \n" + - " out.flush(); \n" + - "}\n" + - "function println(str) { \n" + - " print(str, true); \n" + - "}"; - - Scriptable getRuntimeScope(ScriptContext ctxt) { - if (ctxt == null) { - throw new NullPointerException("null script context"); - } - - // we create a scope for the given ScriptContext - Scriptable newScope = new ExternalScriptable(ctxt, indexedProps); - - // Set the prototype of newScope to be 'topLevel' so that - // JavaScript standard objects are visible from the scope. - newScope.setPrototype(topLevel); - - // define "context" variable in the new scope - newScope.put("context", newScope, ctxt); - - // define "print", "println" functions in the new scope - Context cx = enterContext(); - try { - cx.evaluateString(newScope, printSource, "print", 1, null); - } finally { - cx.exit(); - } - return newScope; - } - - - //Compilable methods - public CompiledScript compile(String script) throws ScriptException { - return compile(new StringReader(script)); - } - - public CompiledScript compile(java.io.Reader script) throws ScriptException { - CompiledScript ret = null; - Context cx = enterContext(); - - try { - String fileName = (String) get(ScriptEngine.FILENAME); - if (fileName == null) { - fileName = ""; - } - - Scriptable scope = getRuntimeScope(context); - Script scr = cx.compileReader(scope, script, fileName, 1, null); - ret = new RhinoCompiledScript(this, scr); - } catch (Exception e) { - if (DEBUG) e.printStackTrace(); - throw new ScriptException(e); - } finally { - cx.exit(); - } - return ret; - } - - - //package-private helpers - - static Context enterContext() { - // call this always so that initializer of this class runs - // and initializes custom wrap factory and class shutter. - return Context.enter(); - } - - void setEngineFactory(ScriptEngineFactory fac) { - factory = fac; - } - - Object[] wrapArguments(Object[] args) { - if (args == null) { - return Context.emptyArgs; - } - Object[] res = new Object[args.length]; - for (int i = 0; i < res.length; i++) { - res[i] = Context.javaToJS(args[i], topLevel); - } - return res; - } - - Object unwrapReturnValue(Object result) { - if (result instanceof Wrapper) { - result = ( (Wrapper) result).unwrap(); - } - - return result instanceof Undefined ? null : result; - } - - /* - public static void main(String[] args) throws Exception { - if (args.length == 0) { - System.out.println("No file specified"); - return; - } - - InputStreamReader r = new InputStreamReader(new FileInputStream(args[0])); - ScriptEngine engine = new RhinoScriptEngine(); - - engine.put("x", "y"); - engine.put(ScriptEngine.FILENAME, args[0]); - engine.eval(r); - System.out.println(engine.get("x")); - } - */ -} --- old/src/share/classes/com/sun/script/javascript/RhinoScriptEngineFactory.java 2013-05-10 13:34:28.720912672 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; -import javax.script.*; -import java.util.*; -import sun.org.mozilla.javascript.internal.*; -import com.sun.script.util.*; - -/** - * Factory to create RhinoScriptEngine - * - * @author Mike Grogan - * @since 1.6 - */ -public class RhinoScriptEngineFactory extends ScriptEngineFactoryBase { - - public RhinoScriptEngineFactory() { - } - - public List getExtensions() { - return extensions; - } - - public List getMimeTypes() { - return mimeTypes; - } - - public List getNames() { - return names; - } - - public Object getParameter(String key) { - if (key.equals(ScriptEngine.NAME)) { - return "javascript"; - } else if (key.equals(ScriptEngine.ENGINE)) { - return "Mozilla Rhino"; - } else if (key.equals(ScriptEngine.ENGINE_VERSION)) { - return "1.7 release 3 PRERELEASE"; - } else if (key.equals(ScriptEngine.LANGUAGE)) { - return "ECMAScript"; - } else if (key.equals(ScriptEngine.LANGUAGE_VERSION)) { - return "1.8"; - } else if (key.equals("THREADING")) { - return "MULTITHREADED"; - } else { - throw new IllegalArgumentException("Invalid key"); - } - } - - public ScriptEngine getScriptEngine() { - RhinoScriptEngine ret = new RhinoScriptEngine(); - ret.setEngineFactory(this); - return ret; - } - - public String getMethodCallSyntax(String obj, String method, String... args) { - - String ret = obj + "." + method + "("; - int len = args.length; - if (len == 0) { - ret += ")"; - return ret; - } - - for (int i = 0; i < len; i++) { - ret += args[i]; - if (i != len - 1) { - ret += ","; - } else { - ret += ")"; - } - } - return ret; - } - - public String getOutputStatement(String toDisplay) { - StringBuffer buf = new StringBuffer(); - int len = toDisplay.length(); - buf.append("print(\""); - for (int i = 0; i < len; i++) { - char ch = toDisplay.charAt(i); - switch (ch) { - case '"': - buf.append("\\\""); - break; - case '\\': - buf.append("\\\\"); - break; - default: - buf.append(ch); - break; - } - } - buf.append("\")"); - return buf.toString(); - } - - public String getProgram(String... statements) { - int len = statements.length; - String ret = ""; - for (int i = 0; i < len; i++) { - ret += statements[i] + ";"; - } - - return ret; - } - - /* - public static void main(String[] args) { - RhinoScriptEngineFactory fact = new RhinoScriptEngineFactory(); - System.out.println(fact.getParameter(ScriptEngine.ENGINE_VERSION)); - } - */ - - private static List names; - private static List mimeTypes; - private static List extensions; - - static { - names = new ArrayList(6); - names.add("js"); - names.add("rhino"); - names.add("JavaScript"); - names.add("javascript"); - names.add("ECMAScript"); - names.add("ecmascript"); - names = Collections.unmodifiableList(names); - - mimeTypes = new ArrayList(4); - mimeTypes.add("application/javascript"); - mimeTypes.add("application/ecmascript"); - mimeTypes.add("text/javascript"); - mimeTypes.add("text/ecmascript"); - mimeTypes = Collections.unmodifiableList(mimeTypes); - - extensions = new ArrayList(1); - extensions.add("js"); - extensions = Collections.unmodifiableList(extensions); - } -} --- old/src/share/classes/com/sun/script/javascript/RhinoTopLevel.java 2013-05-10 13:34:29.048914296 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; - -import sun.org.mozilla.javascript.internal.*; -import javax.script.*; - -/** - * This class serves as top level scope for Rhino. This class adds - * 3 top level functions (bindings, scope, sync) and two constructors - * (JSAdapter, JavaAdapter). - * - * @author A. Sundararajan - * @since 1.6 - */ -public final class RhinoTopLevel extends ImporterTopLevel { - RhinoTopLevel(Context cx, RhinoScriptEngine engine) { - super(cx); - this.engine = engine; - - - // initialize JSAdapter lazily. Reduces footprint & startup time. - new LazilyLoadedCtor(this, "JSAdapter", - "com.sun.script.javascript.JSAdapter", - false); - - /* - * initialize JavaAdapter. We can't lazy initialize this because - * lazy initializer attempts to define a new property. But, JavaAdapter - * is an exisiting property that we overwrite. - */ - JavaAdapter.init(cx, this, false); - - // add top level functions - String names[] = { "bindings", "scope", "sync" }; - defineFunctionProperties(names, RhinoTopLevel.class, - ScriptableObject.DONTENUM); - } - - /** - * The bindings function takes a JavaScript scope object - * of type ExternalScriptable and returns the underlying Bindings - * instance. - * - * var page = scope(pageBindings); - * with (page) { - * // code that uses page scope - * } - * var b = bindings(page); - * // operate on bindings here. - */ - public static Object bindings(Context cx, Scriptable thisObj, Object[] args, - Function funObj) { - if (args.length == 1) { - Object arg = args[0]; - if (arg instanceof Wrapper) { - arg = ((Wrapper)arg).unwrap(); - } - if (arg instanceof ExternalScriptable) { - ScriptContext ctx = ((ExternalScriptable)arg).getContext(); - Bindings bind = ctx.getBindings(ScriptContext.ENGINE_SCOPE); - return Context.javaToJS(bind, - ScriptableObject.getTopLevelScope(thisObj)); - } - } - return cx.getUndefinedValue(); - } - - /** - * The scope function creates a new JavaScript scope object - * with given Bindings object as backing store. This can be used - * to create a script scope based on arbitrary Bindings instance. - * For example, in webapp scenario, a 'page' level Bindings instance - * may be wrapped as a scope and code can be run in JavaScripe 'with' - * statement: - * - * var page = scope(pageBindings); - * with (page) { - * // code that uses page scope - * } - */ - public static Object scope(Context cx, Scriptable thisObj, Object[] args, - Function funObj) { - if (args.length == 1) { - Object arg = args[0]; - if (arg instanceof Wrapper) { - arg = ((Wrapper)arg).unwrap(); - } - if (arg instanceof Bindings) { - ScriptContext ctx = new SimpleScriptContext(); - ctx.setBindings((Bindings)arg, ScriptContext.ENGINE_SCOPE); - Scriptable res = new ExternalScriptable(ctx); - res.setPrototype(ScriptableObject.getObjectPrototype(thisObj)); - res.setParentScope(ScriptableObject.getTopLevelScope(thisObj)); - return res; - } - } - return cx.getUndefinedValue(); - } - - /** - * The sync function creates a synchronized function (in the sense - * of a Java synchronized method) from an existing function. The - * new function synchronizes on the this object of - * its invocation. - * js> var o = { f : sync(function(x) { - * print("entry"); - * Packages.java.lang.Thread.sleep(x*1000); - * print("exit"); - * })}; - * js> thread(function() {o.f(5);}); - * entry - * js> thread(function() {o.f(5);}); - * js> - * exit - * entry - * exit - */ - public static Object sync(Context cx, Scriptable thisObj, Object[] args, - Function funObj) { - if (args.length == 1 && args[0] instanceof Function) { - return new Synchronizer((Function)args[0]); - } else { - throw Context.reportRuntimeError("wrong argument(s) for sync"); - } - } - - RhinoScriptEngine getScriptEngine() { - return engine; - } - - private RhinoScriptEngine engine; -} --- old/src/share/classes/com/sun/script/javascript/RhinoWrapFactory.java 2013-05-10 13:34:29.380915944 +0530 +++ /dev/null 2013-05-10 12:59:49.904693460 +0530 @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.script.javascript; - -import java.lang.reflect.*; -import static sun.security.util.SecurityConstants.*; -import sun.org.mozilla.javascript.internal.*; - -/** - * This wrap factory is used for security reasons. JSR 223 script - * engine interface and JavaScript engine classes are run as bootstrap - * classes. For example, java.lang.Class.forName method (when called without - * class loader) uses caller's class loader. This may be exploited by script - * authors to access classes otherwise not accessible. For example, - * classes in sun.* namespace are normally not accessible to untrusted - * code and hence should not be accessible to JavaScript run from - * untrusted code. - * - * @author A. Sundararajan - * @since 1.6 - */ -final class RhinoWrapFactory extends WrapFactory { - private RhinoWrapFactory() {} - private static RhinoWrapFactory theInstance; - - static synchronized WrapFactory getInstance() { - if (theInstance == null) { - theInstance = new RhinoWrapFactory(); - } - return theInstance; - } - - // We use instance of this class to wrap security sensitive - // Java object. Please refer below. - private static class RhinoJavaObject extends NativeJavaObject { - RhinoJavaObject(Scriptable scope, Object obj, Class type) { - // we pass 'null' to object. NativeJavaObject uses - // passed 'type' to reflect fields and methods when - // object is null. - super(scope, null, type); - - // Now, we set actual object. 'javaObject' is protected - // field of NativeJavaObject. - javaObject = obj; - } - } - - public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, - Object javaObject, Class staticType) { - SecurityManager sm = System.getSecurityManager(); - ClassShutter classShutter = RhinoClassShutter.getInstance(); - if (javaObject instanceof ClassLoader) { - // Check with Security Manager whether we can expose a - // ClassLoader... - if (sm != null) { - sm.checkPermission(GET_CLASSLOADER_PERMISSION); - } - // if we fall through here, check permission succeeded. - return super.wrapAsJavaObject(cx, scope, javaObject, staticType); - } else { - String name = null; - if (javaObject instanceof Class) { - name = ((Class)javaObject).getName(); - } else if (javaObject instanceof Member) { - Member member = (Member) javaObject; - // Check member access. Don't allow reflective access to - // non-public members. Note that we can't call checkMemberAccess - // because that expects exact stack depth! - if (sm != null && !Modifier.isPublic(member.getModifiers())) { - return null; - } - name = member.getDeclaringClass().getName(); - } - // Now, make sure that no ClassShutter prevented Class or Member - // of it is accessed reflectively. Note that ClassShutter may - // prevent access to a class, even though SecurityManager permit. - if (name != null) { - if (!classShutter.visibleToScripts(name)) { - return null; - } else { - return super.wrapAsJavaObject(cx, scope, javaObject, staticType); - } - } - } - - // we have got some non-reflective object. - Class dynamicType = javaObject.getClass(); - String name = dynamicType.getName(); - if (!classShutter.visibleToScripts(name)) { - // Object of some sensitive class (such as sun.net.www.* - // objects returned from public method of java.net.URL class. - // We expose this object as though it is an object of some - // super class that is safe for access. - - Class type = null; - - // Whenever a Java Object is wrapped, we are passed with a - // staticType which is the type found from environment. For - // example, method return type known from signature. The dynamic - // type would be the actual Class of the actual returned object. - // If the staticType is an interface, we just use that type. - if (staticType != null && staticType.isInterface()) { - type = staticType; - } else { - // dynamicType is always a class type and never an interface. - // find an accessible super class of the dynamic type. - while (dynamicType != null) { - dynamicType = dynamicType.getSuperclass(); - name = dynamicType.getName(); - if (classShutter.visibleToScripts(name)) { - type = dynamicType; break; - } - } - // atleast java.lang.Object has to be accessible. So, when - // we reach here, type variable should not be null. - assert type != null: - "even java.lang.Object is not accessible?"; - } - // create custom wrapper with the 'safe' type. - return new RhinoJavaObject(scope, javaObject, type); - } else { - return super.wrapAsJavaObject(cx, scope, javaObject, staticType); - } - } -}