Fixed class loader of the script engine.
The script engine didn't have the plugin class loader. Instead, it had the thread context class loader. The problem with this is that this prevents scripts from instantiating classes from other plugins to e.g. implement undo when WorldEdit is available. The thread context class loader is now set to the plugin class loader while instantiating the script engine which solves this issue.
This commit is contained in:
parent
88b8e29992
commit
3b06ec5e08
1 changed files with 17 additions and 9 deletions
|
@ -1,13 +1,16 @@
|
||||||
package net.walterhiggins.scriptcraft;
|
package net.walterhiggins.scriptcraft;
|
||||||
|
|
||||||
import java.io.InputStreamReader;
|
import org.bukkit.command.Command;
|
||||||
import javax.script.*;
|
import org.bukkit.command.CommandSender;
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
|
||||||
import org.bukkit.command.*;
|
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import javax.script.Invocable;
|
||||||
|
import javax.script.ScriptEngine;
|
||||||
|
import javax.script.ScriptEngineManager;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class ScriptCraftPlugin extends JavaPlugin implements Listener
|
public class ScriptCraftPlugin extends JavaPlugin implements Listener
|
||||||
{
|
{
|
||||||
|
@ -19,12 +22,15 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener
|
||||||
@Override
|
@Override
|
||||||
public void onEnable()
|
public void onEnable()
|
||||||
{
|
{
|
||||||
|
Thread currentThread = Thread.currentThread();
|
||||||
|
ClassLoader previousClassLoader = currentThread.getContextClassLoader();
|
||||||
|
currentThread.setContextClassLoader(getClassLoader());
|
||||||
try{
|
try{
|
||||||
ScriptEngineManager factory = new ScriptEngineManager();
|
ScriptEngineManager factory = new ScriptEngineManager();
|
||||||
this.engine = factory.getEngineByName("JavaScript");
|
this.engine = factory.getEngineByName("JavaScript");
|
||||||
if (this.engine == null){
|
if (this.engine == null){
|
||||||
this.getLogger().severe(NO_JAVASCRIPT_MESSAGE);
|
this.getLogger().severe(NO_JAVASCRIPT_MESSAGE);
|
||||||
} else {
|
} else {
|
||||||
Invocable inv = (Invocable)this.engine;
|
Invocable inv = (Invocable)this.engine;
|
||||||
this.engine.eval(new InputStreamReader(this.getResource("boot.js")));
|
this.engine.eval(new InputStreamReader(this.getResource("boot.js")));
|
||||||
inv.invokeFunction("__scboot", this, engine);
|
inv.invokeFunction("__scboot", this, engine);
|
||||||
|
@ -32,6 +38,8 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
this.getLogger().severe(e.getMessage());
|
this.getLogger().severe(e.getMessage());
|
||||||
|
}finally{
|
||||||
|
currentThread.setContextClassLoader(previousClassLoader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public List<String> onTabComplete(CommandSender sender, Command cmd,
|
public List<String> onTabComplete(CommandSender sender, Command cmd,
|
||||||
|
@ -62,7 +70,7 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener
|
||||||
this.getLogger().severe(NO_JAVASCRIPT_MESSAGE);
|
this.getLogger().severe(NO_JAVASCRIPT_MESSAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
jsResult = ((Invocable)this.engine).invokeFunction("__onCommand", sender, cmd, label, args);
|
jsResult = ((Invocable)this.engine).invokeFunction("__onCommand", sender, cmd, label, args);
|
||||||
}catch (Exception se){
|
}catch (Exception se){
|
||||||
this.getLogger().severe(se.toString());
|
this.getLogger().severe(se.toString());
|
||||||
|
|
Reference in a new issue