/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.gameserver.script.faenor;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import javax.script.ScriptContext;
import org.w3c.dom.Node;
import com.l2jserver.Config;
import com.l2jserver.gameserver.script.Parser;
import com.l2jserver.gameserver.script.ParserNotCreatedException;
import com.l2jserver.gameserver.script.ScriptDocument;
import com.l2jserver.gameserver.script.ScriptEngine;
import com.l2jserver.gameserver.script.ScriptPackage;
import com.l2jserver.gameserver.scripting.L2ScriptEngineManager;
/**
* @author Luis Arias
*
*/
public class FaenorScriptEngine extends ScriptEngine
{
static Logger _log = Logger.getLogger(FaenorScriptEngine.class.getName());
public final static String PACKAGE_DIRECTORY = "data/faenor/";
public final static boolean DEBUG = true;
private LinkedList<ScriptDocument> _scripts;
public static FaenorScriptEngine getInstance()
{
return SingletonHolder._instance;
}
private FaenorScriptEngine()
{
_scripts = new LinkedList<ScriptDocument>();
loadPackages();
parsePackages();
}
public void reloadPackages()
{
_scripts = new LinkedList<ScriptDocument>();
parsePackages();
}
private void loadPackages()
{
File packDirectory = new File(Config.DATAPACK_ROOT, PACKAGE_DIRECTORY);//_log.sss(packDirectory.getAbsolutePath());
FileFilter fileFilter = new FileFilter() {
public boolean accept(File file)
{
return file.getName().endsWith(".zip");
}
};
File[] files = packDirectory.listFiles(fileFilter);
if (files == null)
return;
ZipFile zipPack;
for (File file : files)
{
try
{
zipPack = new ZipFile(file);
}
catch (ZipException e)
{
_log.log(Level.WARNING, "", e);
continue;
}
catch (IOException e)
{
_log.log(Level.WARNING, "", e);
continue;
}
ScriptPackage module = new ScriptPackage(zipPack);
List<ScriptDocument> scrpts = module.getScriptFiles();
for (ScriptDocument script : scrpts)
{
_scripts.add(script);
}
try
{
zipPack.close();
}
catch (IOException e)
{
}
}
/*for (ScriptDocument script : scripts)
{
_log.sss("Script: "+script);
}
_log.sss("Sorting");
orderScripts();
for (ScriptDocument script : scripts)
{
_log.sss("Script: "+script);
}*/
}
public void orderScripts()
{
if (_scripts.size() > 1)
{
//ScriptDocument npcInfo = null;
for (int i = 0; i < _scripts.size();)
{
if (_scripts.get(i).getName().contains("NpcStatData"))
{
_scripts.addFirst(_scripts.remove(i));
//scripts.set(i, scripts.get(0));
//scripts.set(0, npcInfo);
}
else
{
i++;
}
}
}
}
public void parsePackages()
{
L2ScriptEngineManager sem = L2ScriptEngineManager.getInstance();
ScriptContext context = sem.getScriptContext("beanshell");
try
{
sem.eval("beanshell", "double log1p(double d) { return Math.log1p(d); }");
sem.eval("beanshell", "double pow(double d, double p) { return Math.pow(d,p); }");
for (ScriptDocument script : _scripts)
{
parseScript(script, context);
}
}
catch (Exception e)
{
_log.log(Level.WARNING, "", e);
}
}
public void parseScript(ScriptDocument script, ScriptContext context)
{
if (DEBUG)
{
_log.fine("Parsing Script: " + script.getName());
}
Node node = script.getDocument().getFirstChild();
String parserClass = "faenor.Faenor" + node.getNodeName() + "Parser";
Parser parser = null;
try
{
parser = createParser(parserClass);
}
catch (ParserNotCreatedException e)
{
_log.log(Level.WARNING, "ERROR: No parser registered for Script: " + parserClass + ": " + e.getMessage(), e);
}
if (parser == null)
{
_log.warning("Unknown Script Type: " + script.getName());
return;
}
try
{
parser.parseScript(node, context);
_log.fine(script.getName() + "Script Sucessfullty Parsed.");
}
catch (Exception e)
{
_log.log(Level.WARNING, "Script Parsing Failed: " + e.getMessage(), e);
}
}
@Override
public String toString()
{
if (_scripts.isEmpty())
return "No Packages Loaded.";
StringBuilder out = new StringBuilder();
out.append("Script Packages currently loaded:\n");
for (ScriptDocument script : _scripts)
{
out.append(script);
}
return out.toString();
}
@SuppressWarnings("synthetic-access")
private static class SingletonHolder
{
protected static final FaenorScriptEngine _instance = new FaenorScriptEngine();
}
}