/* * Copyright (c) 2005, 2013, 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 javax.script; import java.io.Reader; import java.util.Map; import java.util.Iterator; /** * Provides a standard implementation for several of the variants of the eval * method. *

* eval(Reader)

eval(String)

* eval(String, Bindings)

eval(Reader, Bindings) *

are implemented using the abstract methods *

* eval(Reader,ScriptContext) or * eval(String, ScriptContext) *

* with a SimpleScriptContext. *

* A SimpleScriptContext is used as the default ScriptContext * of the AbstractScriptEngine.. * * @author Mike Grogan * @since 1.6 */ public abstract class AbstractScriptEngine implements ScriptEngine { /** * The default ScriptContext of this AbstractScriptEngine. */ protected ScriptContext context; /** * Creates a new instance of AbstractScriptEngine using a SimpleScriptContext * as its default ScriptContext. */ public AbstractScriptEngine() { context = new SimpleScriptContext(); } /** * Creates a new instance using the specified Bindings as the * ENGINE_SCOPE Bindings in the protected context field. * * @param n The specified Bindings. * @throws NullPointerException if n is null. */ public AbstractScriptEngine(Bindings n) { this(); if (n == null) { throw new NullPointerException("n is null"); } context.setBindings(n, ScriptContext.ENGINE_SCOPE); } /** * Sets the value of the protected context field to the specified * ScriptContext. * * @param ctxt The specified ScriptContext. * @throws NullPointerException if ctxt is null. */ public void setContext(ScriptContext ctxt) { if (ctxt == null) { throw new NullPointerException("null context"); } context = ctxt; } /** * Returns the value of the protected context field. * * @return The value of the protected context field. */ public ScriptContext getContext() { return context; } /** * Returns the Bindings with the specified scope value in * the protected context field. * * @param scope The specified scope * * @return The corresponding Bindings. * * @throws IllegalArgumentException if the value of scope is * invalid for the type the protected context field. */ public Bindings getBindings(int scope) { if (scope == ScriptContext.GLOBAL_SCOPE) { return context.getBindings(ScriptContext.GLOBAL_SCOPE); } else if (scope == ScriptContext.ENGINE_SCOPE) { return context.getBindings(ScriptContext.ENGINE_SCOPE); } else { throw new IllegalArgumentException("Invalid scope value."); } } /** * Sets the Bindings with the corresponding scope value in the * context field. * * @param bindings The specified Bindings. * @param scope The specified scope. * * @throws IllegalArgumentException if the value of scope is * invalid for the type the context field. * @throws NullPointerException if the bindings is null and the scope is * ScriptContext.ENGINE_SCOPE */ public void setBindings(Bindings bindings, int scope) { if (scope == ScriptContext.GLOBAL_SCOPE) { context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);; } else if (scope == ScriptContext.ENGINE_SCOPE) { context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);; } else { throw new IllegalArgumentException("Invalid scope value."); } } /** * Sets the specified value with the specified key in the ENGINE_SCOPE * Bindings of the protected context field. * * @param key The specified key. * @param value The specified value. * * @throws NullPointerException if key is null. * @throws IllegalArgumentException if key is empty. */ public void put(String key, Object value) { Bindings nn = getBindings(ScriptContext.ENGINE_SCOPE); if (nn != null) { nn.put(key, value); } } /** * Gets the value for the specified key in the ENGINE_SCOPE of the * protected context field. * * @return The value for the specified key. * * @throws NullPointerException if key is null. * @throws IllegalArgumentException if key is empty. */ public Object get(String key) { Bindings nn = getBindings(ScriptContext.ENGINE_SCOPE); if (nn != null) { return nn.get(key); } return null; } /** * eval(Reader, Bindings) calls the abstract * eval(Reader, ScriptContext) method, passing it a ScriptContext * whose Reader, Writers and Bindings for scopes other that ENGINE_SCOPE * are identical to those members of the protected context field. The specified * Bindings is used instead of the ENGINE_SCOPE * * Bindings of the context field. * * @param reader A Reader containing the source of the script. * @param bindings A Bindings to use for the ENGINE_SCOPE * while the script executes. * * @return The return value from eval(Reader, ScriptContext) * @throws ScriptException if an error occurs in script. * @throws NullPointerException if any of the parameters is null. */ public Object eval(Reader reader, Bindings bindings ) throws ScriptException { ScriptContext ctxt = getScriptContext(bindings); return eval(reader, ctxt); } /** * Same as eval(Reader, Bindings) except that the abstract * eval(String, ScriptContext) is used. * * @param script A String containing the source of the script. * * @param bindings A Bindings to use as the ENGINE_SCOPE * while the script executes. * * @return The return value from eval(String, ScriptContext) * @throws ScriptException if an error occurs in script. * @throws NullPointerException if any of the parameters is null. */ public Object eval(String script, Bindings bindings) throws ScriptException { ScriptContext ctxt = getScriptContext(bindings); return eval(script , ctxt); } /** * eval(Reader) calls the abstract * eval(Reader, ScriptContext) passing the value of the context * field. * * @param reader A Reader containing the source of the script. * @return The return value from eval(Reader, ScriptContext) * @throws ScriptException if an error occurs in script. * @throws NullPointerException if any of the parameters is null. */ public Object eval(Reader reader) throws ScriptException { return eval(reader, context); } /** * Same as eval(Reader) except that the abstract * eval(String, ScriptContext) is used. * * @param script A String containing the source of the script. * @return The return value from eval(String, ScriptContext) * @throws ScriptException if an error occurs in script. * @throws NullPointerException if any of the parameters is null. */ public Object eval(String script) throws ScriptException { return eval(script, context); } /** * Returns a SimpleScriptContext. The SimpleScriptContext: *

*

*

* A SimpleScriptContext returned by this method is used to implement eval methods * using the abstract eval(Reader,Bindings) and eval(String,Bindings) * versions. * * @param nn Bindings to use for the ENGINE_SCOPE * @return The SimpleScriptContext */ protected ScriptContext getScriptContext(Bindings nn) { SimpleScriptContext ctxt = new SimpleScriptContext(); Bindings gs = getBindings(ScriptContext.GLOBAL_SCOPE); if (gs != null) { ctxt.setBindings(gs, ScriptContext.GLOBAL_SCOPE); } if (nn != null) { ctxt.setBindings(nn, ScriptContext.ENGINE_SCOPE); } else { throw new NullPointerException("Engine scope Bindings may not be null."); } ctxt.setReader(context.getReader()); ctxt.setWriter(context.getWriter()); ctxt.setErrorWriter(context.getErrorWriter()); return ctxt; } }