001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.util.optional;
020:
021: import org.apache.tools.ant.BuildException;
022:
023: import java.util.Iterator;
024: import org.apache.tools.ant.util.ScriptRunnerBase;
025: import org.apache.tools.ant.util.ReflectUtil;
026: import org.apache.tools.ant.util.ReflectWrapper;
027:
028: /**
029: * This class is used to run scripts using JSR 223.
030: * @since Ant 1.7.0
031: */
032: public class JavaxScriptRunner extends ScriptRunnerBase {
033: private ReflectWrapper engine;
034:
035: /**
036: * Get the name of the manager prefix.
037: * @return "javax"
038: */
039: public String getManagerName() {
040: return "javax";
041: }
042:
043: /** {@inheritDoc}. */
044: public boolean supportsLanguage() {
045: if (engine != null) {
046: return true;
047: }
048: checkLanguage();
049: ClassLoader origLoader = replaceContextLoader();
050: try {
051: return createEngine() != null;
052: } catch (Exception ex) {
053: return false;
054: } finally {
055: restoreContextLoader(origLoader);
056: }
057: }
058:
059: /**
060: * Do the work to run the script.
061: *
062: * @param execName the name that will be passed to the
063: * scripting engine for this script execution.
064: *
065: * @exception BuildException if someting goes wrong exectuing the script.
066: */
067: public void executeScript(String execName) throws BuildException {
068: evaluateScript(execName);
069: }
070:
071: /**
072: * Do the work to eval the script.
073: *
074: * @param execName the name that will be passed to the
075: * scripting engine for this script execution.
076: * @return the result of the evalulation
077: * @exception BuildException if someting goes wrong exectuing the script.
078: */
079: public Object evaluateScript(String execName) throws BuildException {
080: checkLanguage();
081: ClassLoader origLoader = replaceContextLoader();
082: try {
083: ReflectWrapper engine = createEngine();
084: if (engine == null) {
085: throw new BuildException(
086: "Unable to create javax script engine for "
087: + getLanguage());
088: }
089: for (Iterator i = getBeans().keySet().iterator(); i
090: .hasNext();) {
091: String key = (String) i.next();
092: Object value = getBeans().get(key);
093: engine.invoke("put", String.class, key, Object.class,
094: value);
095: }
096: // execute the script
097: return engine.invoke("eval", String.class, getScript());
098: } catch (Exception be) {
099: Throwable t = be;
100: Throwable te = (Throwable) ReflectUtil.invoke(be,
101: "getCause");
102: if (te != null) {
103: if (te instanceof BuildException) {
104: throw (BuildException) te;
105: } else {
106: t = te;
107: }
108: }
109: throw new BuildException(t);
110: } finally {
111: restoreContextLoader(origLoader);
112: }
113: }
114:
115: private ReflectWrapper createEngine() throws Exception {
116: if (engine != null) {
117: return engine;
118: }
119: ReflectWrapper manager = new ReflectWrapper(getClass()
120: .getClassLoader(), "javax.script.ScriptEngineManager");
121: Object e = manager.invoke("getEngineByName", String.class,
122: getLanguage());
123: if (e == null) {
124: return null;
125: }
126: ReflectWrapper ret = new ReflectWrapper(e);
127: if (getKeepEngine()) {
128: this.engine = ret;
129: }
130: return ret;
131: }
132: }
|