nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java
author sundar
Wed, 07 Jan 2015 14:02:30 +0530
changeset 28318 bcfb5663e81a
parent 28317 0aeeae75e696
child 28785 a503c972d4bd
permissions -rw-r--r--
8068524: NashornScriptEngineFactory.getParameter() throws IAE for an unknown key, doesn't conform to the general spec Reviewed-by: hannesw, attila
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.api.scripting;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import java.util.Arrays;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import java.util.Collections;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import javax.script.ScriptEngine;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import javax.script.ScriptEngineFactory;
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
    33
import jdk.nashorn.internal.runtime.Context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.runtime.Version;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
 * JSR-223 compliant script engine factory for Nashorn. The engine answers for:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 * <ul>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
 * <li>names {@code "nashorn"}, {@code "Nashorn"}, {@code "js"}, {@code "JS"}, {@code "JavaScript"},
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
 * {@code "javascript"}, {@code "ECMAScript"}, and {@code "ecmascript"};</li>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
 * <li>MIME types {@code "application/javascript"}, {@code "application/ecmascript"}, {@code "text/javascript"}, and
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
 * {@code "text/ecmascript"};</li>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
 * <li>as well as for the extension {@code "js"}.</li>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
 * </ul>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
 * Programs executing in engines created using {@link #getScriptEngine(String[])} will have the passed arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
 * accessible as a global variable named {@code "arguments"}.
28317
0aeeae75e696 8068431: @since and @jdk.Exported are missing in jdk.nashorn.api.scripting classes and package-info.java files
sundar
parents: 26071
diff changeset
    47
 *
0aeeae75e696 8068431: @since and @jdk.Exported are missing in jdk.nashorn.api.scripting classes and package-info.java files
sundar
parents: 26071
diff changeset
    48
 * @since 1.8u40
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
 */
28317
0aeeae75e696 8068431: @since and @jdk.Exported are missing in jdk.nashorn.api.scripting classes and package-info.java files
sundar
parents: 26071
diff changeset
    50
@jdk.Exported
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
public final class NashornScriptEngineFactory implements ScriptEngineFactory {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
    public String getEngineName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
        return (String) getParameter(ScriptEngine.ENGINE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
    public String getEngineVersion() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
        return (String) getParameter(ScriptEngine.ENGINE_VERSION);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    public List<String> getExtensions() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
        return Collections.unmodifiableList(extensions);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    public String getLanguageName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
        return (String) getParameter(ScriptEngine.LANGUAGE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    public String getLanguageVersion() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
        return (String) getParameter(ScriptEngine.LANGUAGE_VERSION);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
    public String getMethodCallSyntax(final String obj, final String method, final String... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
        final StringBuilder sb = new StringBuilder().append(obj).append('.').append(method).append('(');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
        final int len = args.length;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
        if (len > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
            sb.append(args[0]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
        for (int i = 1; i < len; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
            sb.append(',').append(args[i]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
        sb.append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
    public List<String> getMimeTypes() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
        return Collections.unmodifiableList(mimeTypes);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
    public List<String> getNames() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
        return Collections.unmodifiableList(names);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    public String getOutputStatement(final String toDisplay) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        return "print(" + toDisplay + ")";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
    public Object getParameter(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
        switch (key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
        case ScriptEngine.NAME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
            return "javascript";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
        case ScriptEngine.ENGINE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
            return "Oracle Nashorn";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        case ScriptEngine.ENGINE_VERSION:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
            return Version.version();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
        case ScriptEngine.LANGUAGE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
            return "ECMAScript";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
        case ScriptEngine.LANGUAGE_VERSION:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
            return "ECMA - 262 Edition 5.1";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
        case "THREADING":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
            // The engine implementation is not thread-safe. Can't be
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
            // used to execute scripts concurrently on multiple threads.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        default:
28318
bcfb5663e81a 8068524: NashornScriptEngineFactory.getParameter() throws IAE for an unknown key, doesn't conform to the general spec
sundar
parents: 28317
diff changeset
   126
            return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
    public String getProgram(final String... statements) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
        for (final String statement : statements) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
            sb.append(statement).append(';');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   141
    // default options passed to Nashorn script engine
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   142
    private static final String[] DEFAULT_OPTIONS = new String[] { "-doe" };
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   143
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
    public ScriptEngine getScriptEngine() {
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   146
        try {
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   147
            return new NashornScriptEngine(this, DEFAULT_OPTIONS, getAppClassLoader(), null);
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   148
        } catch (final RuntimeException e) {
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   149
            if (Context.DEBUG) {
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   150
                e.printStackTrace();
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   151
            }
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   152
            throw e;
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   153
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    /**
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   157
     * Create a new Script engine initialized by given class loader.
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   158
     *
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   159
     * @param appLoader class loader to be used as script "app" class loader.
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   160
     * @return newly created script engine.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   161
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   162
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   163
     *         denies {@code RuntimePermission("nashorn.setConfig")}
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   164
     */
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   165
    public ScriptEngine getScriptEngine(final ClassLoader appLoader) {
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   166
        return newEngine(DEFAULT_OPTIONS, appLoader, null);
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   167
    }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   168
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   169
    /**
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   170
     * Create a new Script engine initialized by given class filter.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   171
     *
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   172
     * @param classFilter class filter to use.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   173
     * @return newly created script engine.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   174
     * @throws NullPointerException if {@code classFilter} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   175
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   176
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   177
     *         denies {@code RuntimePermission("nashorn.setConfig")}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   178
     */
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   179
    public ScriptEngine getScriptEngine(final ClassFilter classFilter) {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   180
        classFilter.getClass(); // null check
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   181
        return newEngine(DEFAULT_OPTIONS, getAppClassLoader(), classFilter);
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   182
    }
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   183
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   184
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
     * Create a new Script engine initialized by given arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
     * @param args arguments array passed to script engine.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
     * @return newly created script engine.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   189
     * @throws NullPointerException if {@code args} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   190
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   191
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   192
     *         denies {@code RuntimePermission("nashorn.setConfig")}
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
     */
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
   194
    public ScriptEngine getScriptEngine(final String... args) {
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   195
        args.getClass(); // null check
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   196
        return newEngine(args, getAppClassLoader(), null);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   199
    /**
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   200
     * Create a new Script engine initialized by given arguments.
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   201
     *
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   202
     * @param args arguments array passed to script engine.
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   203
     * @param appLoader class loader to be used as script "app" class loader.
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   204
     * @return newly created script engine.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   205
     * @throws NullPointerException if {@code args} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   206
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   207
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   208
     *         denies {@code RuntimePermission("nashorn.setConfig")}
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   209
     */
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   210
    public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader) {
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   211
        args.getClass(); // null check
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   212
        return newEngine(args, appLoader, null);
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   213
    }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   214
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   215
    /**
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   216
     * Create a new Script engine initialized by given arguments.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   217
     *
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   218
     * @param args arguments array passed to script engine.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   219
     * @param appLoader class loader to be used as script "app" class loader.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   220
     * @param classFilter class filter to use.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   221
     * @return newly created script engine.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   222
     * @throws NullPointerException if {@code args} or {@code classFilter} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   223
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   224
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   225
     *         denies {@code RuntimePermission("nashorn.setConfig")}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   226
     */
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   227
    public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader, final ClassFilter classFilter) {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   228
        args.getClass(); // null check
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   229
        classFilter.getClass(); // null check
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   230
        return newEngine(args, appLoader, classFilter);
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   231
    }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   232
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   233
    private ScriptEngine newEngine(final String[] args, final ClassLoader appLoader, final ClassFilter classFilter) {
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   234
        checkConfigPermission();
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   235
        try {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   236
            return new NashornScriptEngine(this, args, appLoader, classFilter);
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   237
        } catch (final RuntimeException e) {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   238
            if (Context.DEBUG) {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   239
                e.printStackTrace();
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   240
            }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   241
            throw e;
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   242
        }
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   243
    }
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   244
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
    // -- Internals only below this point
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
16525
1409942e618e 8009982: Lazy execution bugfix. Added lazy sunspider unit test. Added mandreel to compile-octane test. Fixed warnings
lagergren
parents: 16522
diff changeset
   247
    private static void checkConfigPermission() {
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   248
        final SecurityManager sm = System.getSecurityManager();
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   249
        if (sm != null) {
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   250
            sm.checkPermission(new RuntimePermission(Context.NASHORN_SET_CONFIG));
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   251
        }
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   252
    }
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   253
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
    private static final List<String> names;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
    private static final List<String> mimeTypes;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
    private static final List<String> extensions;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
    static {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
        names = immutableList(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
                    "nashorn", "Nashorn",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
                    "js", "JS",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
                    "JavaScript", "javascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
                    "ECMAScript", "ecmascript"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
                );
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
        mimeTypes = immutableList(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
                        "application/javascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
                        "application/ecmascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
                        "text/javascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
                        "text/ecmascript"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
                    );
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
        extensions = immutableList("js");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    private static List<String> immutableList(final String... elements) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
        return Collections.unmodifiableList(Arrays.asList(elements));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
    }
16197
1a5414cce91a 8007004: nashorn script engine should not use thread context class loader as script 'application loader'
sundar
parents: 16151
diff changeset
   279
1a5414cce91a 8007004: nashorn script engine should not use thread context class loader as script 'application loader'
sundar
parents: 16151
diff changeset
   280
    private static ClassLoader getAppClassLoader() {
16947
7e7191c30eb5 8010117: Annotate jdk caller sensitive methods with @sun.reflect.CallerSensitive
mchung
parents: 16525
diff changeset
   281
        // Revisit: script engine implementation needs the capability to
7e7191c30eb5 8010117: Annotate jdk caller sensitive methods with @sun.reflect.CallerSensitive
mchung
parents: 16525
diff changeset
   282
        // find the class loader of the context in which the script engine
7e7191c30eb5 8010117: Annotate jdk caller sensitive methods with @sun.reflect.CallerSensitive
mchung
parents: 16525
diff changeset
   283
        // is running so that classes will be found and loaded properly
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 19459
diff changeset
   284
        final ClassLoader ccl = Thread.currentThread().getContextClassLoader();
16197
1a5414cce91a 8007004: nashorn script engine should not use thread context class loader as script 'application loader'
sundar
parents: 16151
diff changeset
   285
        return (ccl == null)? NashornScriptEngineFactory.class.getClassLoader() : ccl;
1a5414cce91a 8007004: nashorn script engine should not use thread context class loader as script 'application loader'
sundar
parents: 16151
diff changeset
   286
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
}