summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatt Benson <mbenson@apache.org>2022-02-15 17:37:54 -0600
committerMatt Benson <mbenson@apache.org>2022-02-15 17:37:54 -0600
commit738fcd8d619cd6838ab561cdd75a3d00815854a6 (patch)
treea58b1b7180993a19697d65da0a6fb70fda425ec2 /src
parentf20a9f3cb228b6144822c7b13b0617f5790f3fc6 (diff)
downloadant-738fcd8d619cd6838ab561cdd75a3d00815854a6.tar.gz
refactor script manager to enum
Diffstat (limited to 'src')
-rw-r--r--src/main/org/apache/tools/ant/taskdefs/optional/Script.java10
-rw-r--r--src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java10
-rw-r--r--src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java10
-rw-r--r--src/main/org/apache/tools/ant/types/optional/ScriptFilter.java11
-rw-r--r--src/main/org/apache/tools/ant/types/optional/ScriptSelector.java10
-rw-r--r--src/main/org/apache/tools/ant/util/ScriptManager.java25
-rw-r--r--src/main/org/apache/tools/ant/util/ScriptRunnerCreator.java163
-rw-r--r--src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java13
8 files changed, 180 insertions, 72 deletions
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Script.java b/src/main/org/apache/tools/ant/taskdefs/optional/Script.java
index 416a8f8d0..cb322f06c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/Script.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/Script.java
@@ -24,6 +24,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.util.ScriptManager;
import org.apache.tools.ant.util.ScriptRunnerHelper;
/**
@@ -58,11 +59,20 @@ public class Script extends Task {
*
* @param manager the scripting manager.
*/
+ @Deprecated
public void setManager(String manager) {
helper.setManager(manager);
}
/**
+ * Set the script manager.
+ * @param manager
+ */
+ public void setManager(ScriptManager manager) {
+ helper.setManager(manager);
+ }
+
+ /**
* Defines the language (required).
*
* @param language the scripting language name for the script.
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java b/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
index 4a3aeba42..9f97b9615 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
@@ -35,6 +35,7 @@ import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.taskdefs.DefBase;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.util.ClasspathUtils;
+import org.apache.tools.ant.util.ScriptManager;
import org.apache.tools.ant.util.ScriptRunnerBase;
import org.apache.tools.ant.util.ScriptRunnerHelper;
@@ -353,11 +354,20 @@ public class ScriptDef extends DefBase {
*
* @param manager the scripting manager.
*/
+ @Deprecated
public void setManager(String manager) {
helper.setManager(manager);
}
/**
+ * Set the script manager.
+ * @param manager
+ */
+ public void setManager(ScriptManager manager) {
+ helper.setManager(manager);
+ }
+
+ /**
* Defines the language (required).
*
* @param language the scripting language name for the script.
diff --git a/src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java b/src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java
index 19bebf191..bbdaa018e 100644
--- a/src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java
+++ b/src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java
@@ -23,6 +23,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.util.ScriptManager;
import org.apache.tools.ant.util.ScriptRunnerBase;
import org.apache.tools.ant.util.ScriptRunnerHelper;
@@ -83,11 +84,20 @@ public abstract class AbstractScriptComponent extends ProjectComponent {
*
* @param manager the scripting manager.
*/
+ @Deprecated
public void setManager(String manager) {
helper.setManager(manager);
}
/**
+ * Set the script manager.
+ * @param manager
+ */
+ public void setManager(ScriptManager manager) {
+ helper.setManager(manager);
+ }
+
+ /**
* Defines the language (required).
*
* @param language the scripting language name for the script.
diff --git a/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java b/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java
index a5a83487c..9e7455c88 100644
--- a/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java
+++ b/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java
@@ -25,6 +25,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.filters.TokenFilter;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.util.ScriptManager;
import org.apache.tools.ant.util.ScriptRunnerBase;
import org.apache.tools.ant.util.ScriptRunnerHelper;
@@ -137,9 +138,19 @@ public class ScriptFilter extends TokenFilter.ChainableReaderFilter {
*
* @param manager the scripting manager.
*/
+ @Deprecated
public void setManager(String manager) {
helper.setManager(manager);
}
+
+ /**
+ * Set the script manager.
+ * @param manager
+ */
+ public void setManager(ScriptManager manager) {
+ helper.setManager(manager);
+ }
+
/**
* Set the classpath to be used when searching for classes and resources.
*
diff --git a/src/main/org/apache/tools/ant/types/optional/ScriptSelector.java b/src/main/org/apache/tools/ant/types/optional/ScriptSelector.java
index 5f1b5ea14..dfc393a5a 100644
--- a/src/main/org/apache/tools/ant/types/optional/ScriptSelector.java
+++ b/src/main/org/apache/tools/ant/types/optional/ScriptSelector.java
@@ -24,6 +24,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.selectors.BaseSelector;
+import org.apache.tools.ant.util.ScriptManager;
import org.apache.tools.ant.util.ScriptRunnerBase;
import org.apache.tools.ant.util.ScriptRunnerHelper;
@@ -70,11 +71,20 @@ public class ScriptSelector extends BaseSelector {
*
* @param manager the scripting manager.
*/
+ @Deprecated
public void setManager(String manager) {
helper.setManager(manager);
}
/**
+ * Set the script manager.
+ * @param manager
+ */
+ public void setManager(ScriptManager manager) {
+ helper.setManager(manager);
+ }
+
+ /**
* Defines the language (required).
*
* @param language the scripting language name for the script.
diff --git a/src/main/org/apache/tools/ant/util/ScriptManager.java b/src/main/org/apache/tools/ant/util/ScriptManager.java
new file mode 100644
index 000000000..be5de8e13
--- /dev/null
+++ b/src/main/org/apache/tools/ant/util/ScriptManager.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.util;
+
+/**
+ * Script manager {@code enum}.
+ */
+public enum ScriptManager {
+ auto, bsf, javax;
+} \ No newline at end of file
diff --git a/src/main/org/apache/tools/ant/util/ScriptRunnerCreator.java b/src/main/org/apache/tools/ant/util/ScriptRunnerCreator.java
index 26bbd126e..7982f6729 100644
--- a/src/main/org/apache/tools/ant/util/ScriptRunnerCreator.java
+++ b/src/main/org/apache/tools/ant/util/ScriptRunnerCreator.java
@@ -17,6 +17,13 @@
*/
package org.apache.tools.ant.util;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.MagicNames;
import org.apache.tools.ant.Project;
@@ -26,22 +33,74 @@ import org.apache.tools.ant.Project;
* create a ScriptRunner based on a classloader and on a language.
*/
public class ScriptRunnerCreator {
- private static final String AUTO = "auto";
+ private static class ScriptRunnerFactory {
+ final String managerClass;
+ final String runnerClass;
+
+ ScriptRunnerFactory(String managerClass, String runnerClass) {
+ this.managerClass = managerClass;
+ this.runnerClass = runnerClass;
+ }
+
+ boolean validateManager(Project project, String language, ClassLoader scriptLoader) {
+ try {
+ Class.forName(managerClass, true, scriptLoader);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ ScriptRunnerBase getRunner(Project project, String language, ClassLoader scriptLoader) {
+ if (!validateManager(project, language, scriptLoader)) {
+ return null;
+ }
+ final ScriptRunnerBase runner;
+ try {
+ runner = Class.forName(runnerClass, true, scriptLoader)
+ .asSubclass(ScriptRunnerBase.class).getDeclaredConstructor().newInstance();
+
+ runner.setProject(project);
+ } catch (Exception ex) {
+ throw ReflectUtil.toBuildException(ex);
+ }
+ runner.setLanguage(language);
+ runner.setScriptClassLoader(scriptLoader);
+ return runner;
+ }
+ }
+
+ private static final Map<ScriptManager, ScriptRunnerFactory> RUNNER_FACTORIES;
+
private static final String UTIL_OPT = MagicNames.ANT_CORE_PACKAGE + ".util.optional";
- private static final String BSF = "bsf";
private static final String BSF_PACK = "org.apache.bsf";
private static final String BSF_MANAGER = BSF_PACK + ".BSFManager";
private static final String BSF_RUNNER = UTIL_OPT + ".ScriptRunner";
- private static final String JAVAX = "javax";
private static final String JAVAX_MANAGER = "javax.script.ScriptEngineManager";
private static final String JAVAX_RUNNER = UTIL_OPT + ".JavaxScriptRunner";
- private Project project;
- private String manager;
- private String language;
- private ClassLoader scriptLoader = null;
+ static {
+ final Map<ScriptManager, ScriptRunnerFactory> m = new EnumMap<>(ScriptManager.class);
+
+ m.put(ScriptManager.bsf, new ScriptRunnerFactory(BSF_MANAGER, BSF_RUNNER) {
+ @Override
+ boolean validateManager(Project project, String language, ClassLoader scriptLoader) {
+ if (scriptLoader.getResource(LoaderUtils.classNameToResource(BSF_MANAGER)) == null) {
+ return false;
+ }
+ new ScriptFixBSFPath().fixClassLoader(scriptLoader, language);
+ return true;
+ }
+ });
+
+ m.put(ScriptManager.javax, new ScriptRunnerFactory(JAVAX_MANAGER, JAVAX_RUNNER));
+
+ RUNNER_FACTORIES = Collections.unmodifiableMap(m);
+ }
+
+ private Project project;
/**
* Constructor for creator.
@@ -58,17 +117,29 @@ public class ScriptRunnerCreator {
* @param classLoader the classloader to use
* @return the created script runner.
* @throws BuildException if unable to create the ScriptRunner.
+ * @deprecated Use {@link #createRunner(ScriptManager,String,ClassLoader)} instead
+ */
+ @Deprecated
+ public synchronized ScriptRunnerBase createRunner(String manager, String language,
+ ClassLoader classLoader) {
+ return createRunner(ScriptManager.valueOf(manager), language, classLoader);
+ }
+
+ /**
+ * Create a ScriptRunner.
+ * @param manager the {@link ScriptManager}
+ * @param language the language.
+ * @param classLoader the classloader to use
+ * @return the created script runner.
+ * @throws BuildException if unable to create the ScriptRunner.
*/
- public synchronized ScriptRunnerBase createRunner(
- String manager, String language, ClassLoader classLoader) {
- this.manager = manager;
- this.language = language;
- this.scriptLoader = classLoader;
+ public synchronized ScriptRunnerBase createRunner(ScriptManager manager, String language,
+ ClassLoader classLoader) {
if (language == null) {
throw new BuildException("script language must be specified");
}
- if (!manager.equals(AUTO) && !manager.equals(JAVAX) && !manager.equals(BSF)) {
+ if (manager == null) {
throw new BuildException("Unsupported language prefix " + manager);
}
@@ -76,64 +147,16 @@ public class ScriptRunnerCreator {
// This version does not check if the scriptManager
// supports the language.
- ScriptRunnerBase ret = null;
- ret = createRunner(BSF, BSF_MANAGER, BSF_RUNNER);
- if (ret == null) {
- ret = createRunner(JAVAX, JAVAX_MANAGER, JAVAX_RUNNER);
- }
- if (ret != null) {
- return ret;
- }
- if (JAVAX.equals(manager)) {
- throw new BuildException(
- "Unable to load the script engine manager " + "(" + JAVAX_MANAGER + ")");
- }
- if (BSF.equals(manager)) {
- throw new BuildException(
- "Unable to load the BSF script engine manager " + "(" + BSF_MANAGER + ")");
- }
- throw new BuildException("Unable to load a script engine manager "
- + "(" + BSF_MANAGER + " or " + JAVAX_MANAGER + ")");
- }
-
- /**
- * Create a script runner if the scriptManager matches the passed
- * in manager.
- * This checks if the script manager exists in the scriptLoader
- * classloader and if so it creates and returns the script runner.
- * @param checkManager check if the manager matches this value.
- * @param managerClass the name of the script manager class.
- * @param runnerClass the name of ant's script runner for this manager.
- * @return the script runner class.
- * @throws BuildException if there is a problem creating the runner class.
- */
- private ScriptRunnerBase createRunner(
- String checkManager, String managerClass, String runnerClass) {
- ScriptRunnerBase runner = null;
- if (!manager.equals(AUTO) && !manager.equals(checkManager)) {
- return null;
- }
- if (managerClass.equals(BSF_MANAGER)) {
- if (scriptLoader.getResource(LoaderUtils.classNameToResource(managerClass)) == null) {
- return null;
- }
- new ScriptFixBSFPath().fixClassLoader(scriptLoader, language);
+ final Set<ScriptManager> managers;
+ if (manager == ScriptManager.auto) {
+ managers = EnumSet.complementOf(EnumSet.of(ScriptManager.auto));
} else {
- try {
- Class.forName(managerClass, true, scriptLoader);
- } catch (Exception ex) {
- return null;
- }
- }
- try {
- runner = (ScriptRunnerBase) Class.forName(
- runnerClass, true, scriptLoader).getDeclaredConstructor().newInstance();
- runner.setProject(project);
- } catch (Exception ex) {
- throw ReflectUtil.toBuildException(ex);
+ managers = EnumSet.of(manager);
}
- runner.setLanguage(language);
- runner.setScriptClassLoader(scriptLoader);
- return runner;
+ return managers.stream().map(RUNNER_FACTORIES::get)
+ .map(f -> f.getRunner(project, language, classLoader)).findFirst()
+ .orElseThrow(() -> new BuildException(
+ managers.stream().map(RUNNER_FACTORIES::get).map(f -> f.managerClass).collect(
+ Collectors.joining("|", "Unable to load script engine manager (", ")"))));
}
}
diff --git a/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java b/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
index acec7915b..e97f4252f 100644
--- a/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
+++ b/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
@@ -32,9 +32,9 @@ public class ScriptRunnerHelper {
private ClasspathUtils.Delegate cpDelegate = null;
private File srcFile;
private String encoding;
- private String manager = "auto";
private String language;
private String text;
+ private ScriptManager manager = ScriptManager.auto;
private boolean compiled = false;
private boolean setBeans = true;
private ProjectComponent projectComponent;
@@ -157,8 +157,17 @@ public class ScriptRunnerHelper {
*
* @param manager the scripting manager - "bsf" or "javax" or "auto"
*/
+ @Deprecated
public void setManager(String manager) {
- this.manager = manager;
+ setManager(manager == null ? null : ScriptManager.valueOf(manager));
+ }
+
+ /**
+ * Set the manager.
+ * @param manager
+ */
+ public void setManager(ScriptManager manager) {
+ this.manager = manager == null ? ScriptManager.auto : manager;
}
/**