/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jhydra.core.scripting.java; import jhydra.core.config.IRuntimeConfig; import jhydra.core.logging.ILog; import jhydra.core.scripting.*; import jhydra.core.scripting.exceptions.CompileErrorException; import jhydra.core.scripting.exceptions.ScriptFatalException; import jhydra.core.scripting.exceptions.ScriptNotExistException; import jhydra.core.scripting.scriptinfo.IScriptInfo; import jhydra.core.scripting.scriptinfo.IScriptInfoFactory; import jhydra.core.scripting.scriptinfo.ScriptInfoFactory; import jhydra.core.scripting.scriptinfo.exceptions.ScriptInfoLoadException; import jhydra.core.uinav.IMasterNavigator; import jhydra.core.valuemap.IValueMap; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author jantic */ public class JavaFileScriptFactory implements IScriptFactory { private final IRuntimeConfig config; private final ILog log; private final IScriptInfoFactory scriptInfoFactory; private final IScriptFactory masterScriptFactory; private final Map<String,IScriptInfo> nameToScriptInfo = new HashMap<>(); public JavaFileScriptFactory(IRuntimeConfig config, ILog log, IScriptFactory masterScriptFactory) throws ScriptInfoLoadException{ this.config = config; this.log = log; this.masterScriptFactory = masterScriptFactory; this.scriptInfoFactory = new ScriptInfoFactory(); loadAllScriptInfos(); } @Override public IScript getScript(String name, IValueMap valueMap, IMasterNavigator navigator) throws ScriptFatalException, CompileErrorException{ final IScriptInfo scriptInfo = getScriptInfo(name); final IScriptCompiler compiler = new DynamicJavaCompiler(); final IBaseScript baseScript = compiler.getCompiledScript(scriptInfo); baseScript.initialize(navigator, valueMap, this.masterScriptFactory, this.config, this.log); return new RobustScript(baseScript, config, log); } @Override public Boolean hasScript(String name){ final String key = generateKey(name); return nameToScriptInfo.containsKey(key); } private IScriptInfo getScriptInfo(String name) throws ScriptNotExistException{ final String key = generateKey(name); if(nameToScriptInfo.containsKey(key)){ return nameToScriptInfo.get(key); } throw new ScriptNotExistException(name); } private String generateKey(String scriptName){ if(scriptName == null){ return ""; } return scriptName.trim().toLowerCase(); } private void loadAllScriptInfos() throws ScriptInfoLoadException{ final List<IScriptInfo> scriptInfos = scriptInfoFactory.getAllScriptInfosOfType(config, ScriptType.JAVA); for(IScriptInfo scriptInfo : scriptInfos){ final String key = generateKey(scriptInfo.getName()); if(!nameToScriptInfo.containsKey(key)){ nameToScriptInfo.put(key, scriptInfo); } else{ final String message = "Error- two scripts sharing the same name found! Name: " + scriptInfo.getName(); throw new ScriptInfoLoadException(message); } } } }