package javastory.scripting;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import javastory.channel.ChannelClient;
import javastory.channel.server.Portal;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import com.google.common.collect.Maps;
public class PortalScriptManager {
private static final PortalScriptManager instance = new PortalScriptManager();
private final Map<String, PortalScript> scripts = Maps.newHashMap();
private final static ScriptEngineFactory sef = new ScriptEngineManager().getEngineByName("javascript").getFactory();
public static PortalScriptManager getInstance() {
return instance;
}
private PortalScript getPortalScript(final String scriptName) {
if (this.scripts.containsKey(scriptName)) {
return this.scripts.get(scriptName);
}
final File scriptFile = new File("scripts/portal/" + scriptName + ".js");
if (!scriptFile.exists()) {
this.scripts.put(scriptName, null);
return null;
}
FileReader fr = null;
final ScriptEngine portal = sef.getScriptEngine();
try {
fr = new FileReader(scriptFile);
final CompiledScript compiled = ((Compilable) portal).compile(fr);
compiled.eval();
} catch (final ScriptException | IOException e) {
System.err.println("THROW" + e);
} finally {
if (fr != null) {
try {
fr.close();
} catch (final IOException e) {
System.err.println("ERROR CLOSING" + e);
}
}
}
final PortalScript script = ((Invocable) portal).getInterface(PortalScript.class);
this.scripts.put(scriptName, script);
return script;
}
public final void executePortalScript(final Portal portal, final ChannelClient c) {
final PortalScript script = this.getPortalScript(portal.getScriptName());
if (script != null) {
script.enter(new PortalPlayerInteraction(c, portal));
} else {
System.out.println(":: Unhandled portal script " + portal.getScriptName() + " ::");
}
}
public final void clearScripts() {
this.scripts.clear();
}
}