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:
Pieter van Ginkel 2014-09-07 09:12:58 +02:00
parent 88b8e29992
commit 3b06ec5e08

View file

@ -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());