src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java
author sundar
Thu, 28 Jun 2018 18:04:19 +0530
changeset 50878 fb7800b66c92
parent 47750 0084b493dfc9
permissions -rw-r--r--
8204492: Add deprecation annotation to Nashorn APIs and warning to nashorn, jjs Reviewed-by: jlaskey, hannesw
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;
28785
a503c972d4bd 8072595: nashorn should not use obj.getClass() for null checks
sundar
parents: 28318
diff changeset
    31
import java.util.Objects;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import javax.script.ScriptEngine;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import javax.script.ScriptEngineFactory;
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
    34
import jdk.nashorn.internal.runtime.Context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import jdk.nashorn.internal.runtime.Version;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 * JSR-223 compliant script engine factory for Nashorn. The engine answers for:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
 * <ul>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
 * <li>names {@code "nashorn"}, {@code "Nashorn"}, {@code "js"}, {@code "JS"}, {@code "JavaScript"},
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
 * {@code "javascript"}, {@code "ECMAScript"}, and {@code "ecmascript"};</li>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
 * <li>MIME types {@code "application/javascript"}, {@code "application/ecmascript"}, {@code "text/javascript"}, and
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
 * {@code "text/ecmascript"};</li>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
 * <li>as well as for the extension {@code "js"}.</li>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
 * </ul>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
 * Programs executing in engines created using {@link #getScriptEngine(String[])} will have the passed arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
 * 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
    48
 *
50878
fb7800b66c92 8204492: Add deprecation annotation to Nashorn APIs and warning to nashorn, jjs
sundar
parents: 47750
diff changeset
    49
 * @deprecated Nashorn JavaScript script engine and APIs, and the jjs tool
fb7800b66c92 8204492: Add deprecation annotation to Nashorn APIs and warning to nashorn, jjs
sundar
parents: 47750
diff changeset
    50
 * are deprecated with the intent to remove them in a future release.
fb7800b66c92 8204492: Add deprecation annotation to Nashorn APIs and warning to nashorn, jjs
sundar
parents: 47750
diff changeset
    51
 *
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
    52
 * @since 1.8u40
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
 */
50878
fb7800b66c92 8204492: Add deprecation annotation to Nashorn APIs and warning to nashorn, jjs
sundar
parents: 47750
diff changeset
    54
@Deprecated(since="11", forRemoval=true)
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
public final class NashornScriptEngineFactory implements ScriptEngineFactory {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    public String getEngineName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
        return (String) getParameter(ScriptEngine.ENGINE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    public String getEngineVersion() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
        return (String) getParameter(ScriptEngine.ENGINE_VERSION);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    public List<String> getExtensions() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
        return Collections.unmodifiableList(extensions);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    public String getLanguageName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
        return (String) getParameter(ScriptEngine.LANGUAGE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    public String getLanguageVersion() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
        return (String) getParameter(ScriptEngine.LANGUAGE_VERSION);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
    public String getMethodCallSyntax(final String obj, final String method, final String... args) {
47750
0084b493dfc9 8068741: javax.script.ScriptEngineFactory.getMethodCallSyntax() spec allows null passed as an object
sundar
parents: 47216
diff changeset
    83
        final StringBuilder sb = new StringBuilder().
0084b493dfc9 8068741: javax.script.ScriptEngineFactory.getMethodCallSyntax() spec allows null passed as an object
sundar
parents: 47216
diff changeset
    84
            append(Objects.requireNonNull(obj)).append('.').
0084b493dfc9 8068741: javax.script.ScriptEngineFactory.getMethodCallSyntax() spec allows null passed as an object
sundar
parents: 47216
diff changeset
    85
            append(Objects.requireNonNull(method)).append('(');
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
        final int len = args.length;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
        if (len > 0) {
47750
0084b493dfc9 8068741: javax.script.ScriptEngineFactory.getMethodCallSyntax() spec allows null passed as an object
sundar
parents: 47216
diff changeset
    89
            sb.append(Objects.requireNonNull(args[0]));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
        for (int i = 1; i < len; i++) {
47750
0084b493dfc9 8068741: javax.script.ScriptEngineFactory.getMethodCallSyntax() spec allows null passed as an object
sundar
parents: 47216
diff changeset
    92
            sb.append(',').append(Objects.requireNonNull(args[i]));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
        sb.append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
    public List<String> getMimeTypes() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
        return Collections.unmodifiableList(mimeTypes);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
    public List<String> getNames() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        return Collections.unmodifiableList(names);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    public String getOutputStatement(final String toDisplay) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
        return "print(" + toDisplay + ")";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
    public Object getParameter(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
        switch (key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
        case ScriptEngine.NAME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
            return "javascript";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
        case ScriptEngine.ENGINE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
            return "Oracle Nashorn";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
        case ScriptEngine.ENGINE_VERSION:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
            return Version.version();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
        case ScriptEngine.LANGUAGE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
            return "ECMAScript";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        case ScriptEngine.LANGUAGE_VERSION:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
            return "ECMA - 262 Edition 5.1";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
        case "THREADING":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
            // The engine implementation is not thread-safe. Can't be
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
            // used to execute scripts concurrently on multiple threads.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
        default:
28318
bcfb5663e81a 8068524: NashornScriptEngineFactory.getParameter() throws IAE for an unknown key, doesn't conform to the general spec
sundar
parents: 28317
diff changeset
   132
            return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    public String getProgram(final String... statements) {
41615
ef3178885830 8071588: The spec for javax.script.ScriptEngineFactory.getProgram() should specify NPEs thrown
sundar
parents: 36141
diff changeset
   138
        Objects.requireNonNull(statements);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
        for (final String statement : statements) {
41615
ef3178885830 8071588: The spec for javax.script.ScriptEngineFactory.getProgram() should specify NPEs thrown
sundar
parents: 36141
diff changeset
   142
            sb.append(Objects.requireNonNull(statement)).append(';');
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   148
    // default options passed to Nashorn script engine
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   149
    private static final String[] DEFAULT_OPTIONS = new String[] { "-doe" };
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   150
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
    public ScriptEngine getScriptEngine() {
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   153
        try {
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   154
            return new NashornScriptEngine(this, DEFAULT_OPTIONS, getAppClassLoader(), null);
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   155
        } catch (final RuntimeException e) {
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   156
            if (Context.DEBUG) {
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   157
                e.printStackTrace();
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   158
            }
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   159
            throw e;
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   160
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    /**
36141
696d662bcdb7 8148379: jdk.nashorn.api.scripting spec. adjustments, clarifications
sundar
parents: 34903
diff changeset
   164
     * Create a new Script engine initialized with the given class loader.
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   165
     *
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   166
     * @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
   167
     * @return newly created script engine.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   168
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   169
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   170
     *         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
   171
     */
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   172
    public ScriptEngine getScriptEngine(final ClassLoader appLoader) {
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   173
        return newEngine(DEFAULT_OPTIONS, appLoader, null);
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   174
    }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   175
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   176
    /**
36141
696d662bcdb7 8148379: jdk.nashorn.api.scripting spec. adjustments, clarifications
sundar
parents: 34903
diff changeset
   177
     * Create a new Script engine initialized with the given class filter.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   178
     *
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   179
     * @param classFilter class filter to use.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   180
     * @return newly created script engine.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   181
     * @throws NullPointerException if {@code classFilter} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   182
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   183
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   184
     *         denies {@code RuntimePermission("nashorn.setConfig")}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   185
     */
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   186
    public ScriptEngine getScriptEngine(final ClassFilter classFilter) {
31094
7a9fa21da791 8085810: Return value of Objects.requireNonNull call can be used
sundar
parents: 28785
diff changeset
   187
        return newEngine(DEFAULT_OPTIONS, getAppClassLoader(), Objects.requireNonNull(classFilter));
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   188
    }
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   189
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   190
    /**
36141
696d662bcdb7 8148379: jdk.nashorn.api.scripting spec. adjustments, clarifications
sundar
parents: 34903
diff changeset
   191
     * Create a new Script engine initialized with the given arguments.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
     * @param args arguments array passed to script engine.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
     * @return newly created script engine.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   195
     * @throws NullPointerException if {@code args} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   196
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   197
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   198
     *         denies {@code RuntimePermission("nashorn.setConfig")}
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
     */
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24731
diff changeset
   200
    public ScriptEngine getScriptEngine(final String... args) {
31094
7a9fa21da791 8085810: Return value of Objects.requireNonNull call can be used
sundar
parents: 28785
diff changeset
   201
        return newEngine(Objects.requireNonNull(args), getAppClassLoader(), null);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   204
    /**
36141
696d662bcdb7 8148379: jdk.nashorn.api.scripting spec. adjustments, clarifications
sundar
parents: 34903
diff changeset
   205
     * Create a new Script engine initialized with the given arguments and the given class loader.
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   206
     *
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   207
     * @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
   208
     * @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
   209
     * @return newly created script engine.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   210
     * @throws NullPointerException if {@code args} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   211
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   212
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   213
     *         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
   214
     */
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   215
    public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader) {
31094
7a9fa21da791 8085810: Return value of Objects.requireNonNull call can be used
sundar
parents: 28785
diff changeset
   216
        return newEngine(Objects.requireNonNull(args), appLoader, null);
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   217
    }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   218
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   219
    /**
36141
696d662bcdb7 8148379: jdk.nashorn.api.scripting spec. adjustments, clarifications
sundar
parents: 34903
diff changeset
   220
     * Create a new Script engine initialized with the given arguments, class loader and class filter.
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   221
     *
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   222
     * @param args arguments array passed to script engine.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   223
     * @param appLoader class loader to be used as script "app" class loader.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   224
     * @param classFilter class filter to use.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   225
     * @return newly created script engine.
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   226
     * @throws NullPointerException if {@code args} or {@code classFilter} is {@code null}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   227
     * @throws SecurityException
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   228
     *         if the security manager's {@code checkPermission}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   229
     *         denies {@code RuntimePermission("nashorn.setConfig")}
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   230
     */
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   231
    public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader, final ClassFilter classFilter) {
31094
7a9fa21da791 8085810: Return value of Objects.requireNonNull call can be used
sundar
parents: 28785
diff changeset
   232
        return newEngine(Objects.requireNonNull(args), appLoader, Objects.requireNonNull(classFilter));
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   233
    }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   234
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   235
    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
   236
        checkConfigPermission();
26071
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   237
        try {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   238
            return new NashornScriptEngine(this, args, appLoader, classFilter);
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   239
        } catch (final RuntimeException e) {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   240
            if (Context.DEBUG) {
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   241
                e.printStackTrace();
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   242
            }
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   243
            throw e;
430e39f6731f 8050078: Nashorn ClassFilter Support
sundar
parents: 25865
diff changeset
   244
        }
16199
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   245
    }
3722d034c582 8007091: Provide private API to pass application class loader for nashorn script engine
sundar
parents: 16197
diff changeset
   246
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
    // -- Internals only below this point
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
16525
1409942e618e 8009982: Lazy execution bugfix. Added lazy sunspider unit test. Added mandreel to compile-octane test. Fixed warnings
lagergren
parents: 16522
diff changeset
   249
    private static void checkConfigPermission() {
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   250
        final SecurityManager sm = System.getSecurityManager();
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   251
        if (sm != null) {
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 17518
diff changeset
   252
            sm.checkPermission(new RuntimePermission(Context.NASHORN_SET_CONFIG));
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   253
        }
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   254
    }
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16199
diff changeset
   255
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
    private static final List<String> names;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
    private static final List<String> mimeTypes;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
    private static final List<String> extensions;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
    static {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
        names = immutableList(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
                    "nashorn", "Nashorn",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
                    "js", "JS",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
                    "JavaScript", "javascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
                    "ECMAScript", "ecmascript"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
                );
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
        mimeTypes = immutableList(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
                        "application/javascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
                        "application/ecmascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
                        "text/javascript",
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
                        "text/ecmascript"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
                    );
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
        extensions = immutableList("js");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
    private static List<String> immutableList(final String... elements) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
        return Collections.unmodifiableList(Arrays.asList(elements));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
    }
16197
1a5414cce91a 8007004: nashorn script engine should not use thread context class loader as script 'application loader'
sundar
parents: 16151
diff changeset
   281
1a5414cce91a 8007004: nashorn script engine should not use thread context class loader as script 'application loader'
sundar
parents: 16151
diff changeset
   282
    private static ClassLoader getAppClassLoader() {
16947
7e7191c30eb5 8010117: Annotate jdk caller sensitive methods with @sun.reflect.CallerSensitive
mchung
parents: 16525
diff changeset
   283
        // Revisit: script engine implementation needs the capability to
7e7191c30eb5 8010117: Annotate jdk caller sensitive methods with @sun.reflect.CallerSensitive
mchung
parents: 16525
diff changeset
   284
        // 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
   285
        // 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
   286
        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
   287
        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
   288
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
}