diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScriptUtil.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScriptUtil.java index 180b024e29..cdf3da72b0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScriptUtil.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScriptUtil.java @@ -4,9 +4,9 @@ * Licensed 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 - * + * * http://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. @@ -30,7 +30,7 @@ import ghidra.app.plugin.core.script.GhidraScriptMgrPlugin; import ghidra.app.util.headless.HeadlessAnalyzer; import ghidra.framework.Application; import ghidra.util.Msg; -import ghidra.util.classfinder.ClassSearcher; +import ghidra.util.classfinder.*; import utilities.util.FileUtilities; /** @@ -276,18 +276,18 @@ public class GhidraScriptUtil { } /** - * Returns a list of all supported Ghidra script providers + * Returns a list of all supported Ghidra script providers. + *

+ * NOTE: The list is {@link ExtensionPointProperties#priority() priority-sorted} * * @return a list of all supported Ghidra script providers + * @apiNote this method is synchronized so that two threads do not try to create the list when + * null */ - // Note: this method is synchronized so that two threads do not try to create the list when null public static synchronized List getProviders() { if (providers == null) { - providers = ClassSearcher.getInstances(GhidraScriptProvider.class) - .stream() - .filter(p -> !(p instanceof UnsupportedScriptProvider)) - .sorted() - .toList(); + providers = ClassSearcher.getInstances(GhidraScriptProvider.class, + new ClassExclusionFilter(UnsupportedScriptProvider.class)); } return providers; } diff --git a/Ghidra/Features/Jython/src/main/java/ghidra/jython/JythonScriptProvider.java b/Ghidra/Features/Jython/src/main/java/ghidra/jython/JythonScriptProvider.java index c91041bd4b..71b408e7e5 100644 --- a/Ghidra/Features/Jython/src/main/java/ghidra/jython/JythonScriptProvider.java +++ b/Ghidra/Features/Jython/src/main/java/ghidra/jython/JythonScriptProvider.java @@ -4,9 +4,9 @@ * Licensed 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 - * + * * http://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. @@ -19,12 +19,10 @@ import java.io.PrintWriter; import generic.jar.ResourceFile; import ghidra.app.script.*; -import ghidra.util.classfinder.ExtensionPointProperties; /** * A {@link GhidraScriptProvider} used to run Jython scripts */ -@ExtensionPointProperties(priority = 1000) // Enforce high priority so Jython is the default Python provider public class JythonScriptProvider extends AbstractPythonScriptProvider { @Override diff --git a/Ghidra/Features/PyGhidra/src/main/java/ghidra/pyghidra/PyGhidraScriptProvider.java b/Ghidra/Features/PyGhidra/src/main/java/ghidra/pyghidra/PyGhidraScriptProvider.java index 382c287c1e..a60feb90a3 100644 --- a/Ghidra/Features/PyGhidra/src/main/java/ghidra/pyghidra/PyGhidraScriptProvider.java +++ b/Ghidra/Features/PyGhidra/src/main/java/ghidra/pyghidra/PyGhidraScriptProvider.java @@ -29,12 +29,14 @@ import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramSelection; import ghidra.pyghidra.PythonFieldExposer.ExposedFields; import ghidra.util.SystemUtilities; +import ghidra.util.classfinder.ExtensionPointProperties; import ghidra.util.exception.AssertException; import ghidra.util.task.TaskMonitor; /** * {@link GhidraScript} provider for native python3 scripts */ +@ExtensionPointProperties(priority = 1000) // Enforce high priority so PyGhidra is the default Python provider public final class PyGhidraScriptProvider extends AbstractPythonScriptProvider { private static Consumer scriptRunner = null; @@ -102,7 +104,7 @@ public final class PyGhidraScriptProvider extends AbstractPythonScriptProvider { } /** - * Helper inner class that can create a {@link MethodHandles.Lookup} + * Helper inner class that can create a {@link java.lang.invoke.MethodHandles.Lookup} * that can access the protected fields of the {@link GhidraScript} */ private static class ExposedField extends PythonFieldExposer.ExposedField { @@ -136,7 +138,7 @@ public final class PyGhidraScriptProvider extends AbstractPythonScriptProvider { } /** - * Helper inner class that can create a {@link MethodHandles.Lookup} + * Helper inner class that can create a {@link java.lang.invoke.MethodHandles.Lookup} * that can access the protected fields of the {@link GhidraScript} */ private static class ExposedField extends PythonFieldExposer.ExposedField {