This is an automated email from the ASF dual-hosted git repository.

mbenson pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ant.git

commit 738fcd8d619cd6838ab561cdd75a3d00815854a6
Author: Matt Benson <mben...@apache.org>
AuthorDate: Tue Feb 15 17:37:54 2022 -0600

    refactor script manager to enum
---
 .../apache/tools/ant/taskdefs/optional/Script.java |  10 ++
 .../ant/taskdefs/optional/script/ScriptDef.java    |  10 ++
 .../types/optional/AbstractScriptComponent.java    |  10 ++
 .../tools/ant/types/optional/ScriptFilter.java     |  11 ++
 .../tools/ant/types/optional/ScriptSelector.java   |  10 ++
 .../org/apache/tools/ant/util/ScriptManager.java   |  25 ++++
 .../apache/tools/ant/util/ScriptRunnerCreator.java | 163 ++++++++++++---------
 .../apache/tools/ant/util/ScriptRunnerHelper.java  |  13 +-
 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 416a8f8..cb322f0 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 4a3aeba..9f97b96 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 19bebf1..bbdaa01 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 a5a8348..9e7455c 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 5f1b5ea..dfc393a 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 0000000..be5de8e
--- /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 26bbd12..7982f67 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 acec791..e97f425 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;
     }
 
     /**

Reply via email to