package com.openedit.entermedia.scripts;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.openedit.ModuleManager;
import com.openedit.OpenEditException;
import com.openedit.WebPageRequest;
import com.openedit.config.Configuration;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
import com.openedit.users.UserManager;
import com.openedit.util.PathUtilities;
public class ScriptManager
{
private static final Log log = LogFactory.getLog(ScriptManager.class);
protected Map fieldScriptRunners;
protected ModuleManager fieldModuleManager;
protected PageManager fieldPageManager;
protected UserManager fieldUserManager;
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public ModuleManager getModuleManager()
{
return fieldModuleManager;
}
public void setModuleManager(ModuleManager inModuleManager)
{
fieldModuleManager = inModuleManager;
}
public Map getScriptRunners()
{
if (fieldScriptRunners == null)
{
fieldScriptRunners = new HashMap();
}
return fieldScriptRunners;
}
public void setScriptRunners(Map inScriptRunners)
{
fieldScriptRunners = inScriptRunners;
}
public ScriptRunner getRunner(String inName)
{
ScriptRunner runner = (ScriptRunner)getScriptRunners().get(inName);
if( runner == null)
{
runner = (ScriptRunner)getModuleManager().getBean(inName + "ScriptRunner");
getScriptRunners().put(inName,runner);
}
return runner;
}
public Script loadScript(String code) throws OpenEditException
{
try
{
Page scriptPage = getPageManager().getPage( code );
Script script = new Script();
script.setPage(scriptPage);
if (code.endsWith(".bsh"))
{
script.setType("bsh");
}
else if( code.endsWith(".js"))
{
script.setType("rhino");
}
else if (code.endsWith(".groovy"))
{
script.setType("groovy");
}
else
{
script.setType("bsf");
}
return script;
}
catch (Exception ex)
{
throw new OpenEditException(ex);
}
}
public Object execScript(Map variableMap, Script inScript) throws OpenEditException
{
ScriptRunner runner = getRunner(inScript.getType());
ScriptLogger logger = (ScriptLogger)variableMap.get("log");
if( logger == null)
{
logger = new ScriptLogger();
logger.setPrefix(inScript.getPage().getName());
}
variableMap.put("log", logger);
variableMap.put("userManager", getModuleManager().getBean( "userManager" ) );
variableMap.put("moduleManager", getModuleManager() );
variableMap.put("beanFactory", getModuleManager() );
variableMap.put("pageManager", getPageManager() );
variableMap.put("root", getModuleManager().getBean( "root" ) );
logger.debug("Running " +inScript.getPage() );
Object returned = runner.exec(inScript, variableMap);
return returned;
}
public Script loadScript(WebPageRequest inContext, Configuration inScriptconfig, String inFilepath)
{
String code = inScriptconfig.getValue();
//log.info("Start value: " + code);
code = inContext.getPage().getPageSettings().replaceProperty(code);
//log.info("Replaced value: " + code);
code = PathUtilities.resolveRelativePath(code, inFilepath);
//log.info("Final script: " + code + " using " + inFilepath);
Script script = loadScript(code);
String method = inScriptconfig.getAttribute("method");
script.setMethod(method);
script.setConfiguration(inScriptconfig);
return script;
}
}