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: package org.apache.tools.ant.util;
019:
020: import org.apache.tools.ant.BuildException;
021: import org.apache.tools.ant.Project;
022:
023: /**
024: * This is a helper class used by ScriptRunnerHelper to
025: * create a ScriptRunner based on a classloader and
026: * on a language.
027: */
028: public class ScriptRunnerCreator {
029: private static final String AUTO = "auto";
030: private static final String OATAU = "org.apache.tools.ant.util";
031: private static final String UTIL_OPT = OATAU + ".optional";
032:
033: private static final String BSF = "bsf";
034: private static final String BSF_PACK = "org.apache.bsf";
035: private static final String BSF_MANAGER = BSF_PACK + ".BSFManager";
036: private static final String BSF_RUNNER = UTIL_OPT + ".ScriptRunner";
037:
038: private static final String JAVAX = "javax";
039: private static final String JAVAX_MANAGER = "javax.script.ScriptEngineManager";
040: private static final String JAVAX_RUNNER = UTIL_OPT
041: + ".JavaxScriptRunner";
042:
043: private Project project;
044: private String manager;
045: private String language;
046: private ClassLoader scriptLoader = null;
047:
048: /**
049: * Constructor for creator.
050: * @param project the current project.
051: */
052: public ScriptRunnerCreator(Project project) {
053: this .project = project;
054: }
055:
056: /**
057: * Create a ScriptRunner.
058: * @param manager the script manager ("auto" | "bsf" | "javax")
059: * @param language the language.
060: * @param classLoader the classloader to use
061: * @return the created script runner.
062: * @throws BuildException if unable to create the ScriptRunner.
063: */
064: public ScriptRunnerBase createRunner(String manager,
065: String language, ClassLoader classLoader) {
066: this .manager = manager;
067: this .language = language;
068: this .scriptLoader = classLoader;
069:
070: if (language == null) {
071: throw new BuildException(
072: "script language must be specified");
073: }
074: if (!manager.equals(AUTO) && !manager.equals(JAVAX)
075: && !manager.equals(BSF)) {
076: throw new BuildException("Unsupported language prefix "
077: + manager);
078: }
079:
080: // Check for bsf first then javax
081: // This version does not check if the scriptManager
082: // supports the language.
083:
084: ScriptRunnerBase ret = null;
085: ret = createRunner(BSF, BSF_MANAGER, BSF_RUNNER);
086: if (ret == null) {
087: ret = createRunner(JAVAX, JAVAX_MANAGER, JAVAX_RUNNER);
088: }
089: if (ret != null) {
090: return ret;
091: }
092: if (JAVAX.equals(manager)) {
093: throw new BuildException(
094: "Unable to load the script engine manager " + "("
095: + JAVAX_MANAGER + ")");
096: } else if (BSF.equals(manager)) {
097: throw new BuildException(
098: "Unable to load the BSF script engine manager "
099: + "(" + BSF_MANAGER + ")");
100: } else {
101: throw new BuildException(
102: "Unable to load a script engine manager " + "("
103: + BSF_MANAGER + " or " + JAVAX_MANAGER
104: + ")");
105: }
106: }
107:
108: /**
109: * Create a script runner if the scriptManager matches the passed
110: * in manager.
111: * This checks if the script manager exists in the scriptLoader
112: * classloader and if so it creates and returns the script runner.
113: * @param checkManager check if the manager matchs this value.
114: * @param mangagerClass the name of the script manager class.
115: * @param runnerClass the name of ant's script runner for this manager.
116: * @return the script runner class.
117: * @throws BuildException if there is a problem creating the runner class.
118: */
119: private ScriptRunnerBase createRunner(String checkManager,
120: String managerClass, String runnerClass) {
121: ScriptRunnerBase runner = null;
122: if (!manager.equals(AUTO) && !manager.equals(checkManager)) {
123: return null;
124: }
125: if (scriptLoader.getResource(LoaderUtils
126: .classNameToResource(managerClass)) == null) {
127: return null;
128: }
129: try {
130: runner = (ScriptRunnerBase) Class.forName(runnerClass,
131: true, scriptLoader).newInstance();
132: runner.setProject(project);
133: } catch (Exception ex) {
134: ReflectUtil.throwBuildException(ex);
135: // NotReached
136: }
137:
138: runner.setLanguage(language);
139: runner.setScriptClassLoader(scriptLoader);
140: return runner;
141: }
142: }
|