diff --git a/src/main/java/org/parabot/core/parsers/scripts/LocalJavaScripts.java b/src/main/java/org/parabot/core/parsers/scripts/LocalJavaScripts.java index 3374944..d34de1c 100644 --- a/src/main/java/org/parabot/core/parsers/scripts/LocalJavaScripts.java +++ b/src/main/java/org/parabot/core/parsers/scripts/LocalJavaScripts.java @@ -60,7 +60,6 @@ public class LocalJavaScripts extends ScriptParser { t.printStackTrace(); } } - } } diff --git a/src/main/java/org/parabot/environment/scripts/loader/JavaScriptLoader.java b/src/main/java/org/parabot/environment/scripts/loader/JavaScriptLoader.java index 4fd5466..5e37b82 100644 --- a/src/main/java/org/parabot/environment/scripts/loader/JavaScriptLoader.java +++ b/src/main/java/org/parabot/environment/scripts/loader/JavaScriptLoader.java @@ -11,7 +11,7 @@ import java.util.List; /** * An environment to load a script * - * @author Everel + * @author Everel, JKetelaar */ public class JavaScriptLoader extends ASMClassLoader { private ClassPath classPath; @@ -27,15 +27,55 @@ public class JavaScriptLoader extends ASMClassLoader { * @return string array of class names that extends ServerProvider */ public final String[] getScriptClassNames() { - final List classNames = new ArrayList(); + final List classNames = new ArrayList<>(); for (ClassNode c : classPath.classes.values()) { - if (c.superName.replace('/', '.').equals( - Script.class.getName())) { + if (isScriptClass(c)) { classNames.add(c.name.replace('/', '.')); + } else { + ClassNode superClass = findClassNodeForName(c.superName); + if (superClass != null && isScriptClass(superClass)) { + classNames.add(c.name.replace('/', '.')); + } } } - return classNames.toArray(new String[classNames.size()]); + + String[] classes = new String[classNames.size()]; + for (int i = 0; i < classNames.size(); i++) { + classes[i] = classNames.get(i); + } + + return classes; } + /** + * Checks if given ClassNode is Script class + * + * @param classNode + * + * @return + */ + private boolean isScriptClass(ClassNode classNode) { + return classNode + .superName + .replace('/', '.') + .equals(Script.class.getName()); + } + + /** + * Finds a ClassNode instance for a given class name + * + * @param name + * + * @return + */ + private ClassNode findClassNodeForName(String name) { + for (ClassNode classNode : classPath.classes.values()) { + if (classNode.name.equals(name)) { + return classNode; + } + } + + return null; + } }