package com.openedit.entermedia.scripts;
import groovy.lang.Binding;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import groovy.util.GroovyScriptEngine;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.config.Configuration;
import com.openedit.config.ScriptPathLoader;
import com.openedit.page.Page;
import com.openedit.page.PageSettings;
import com.openedit.page.manage.PageManager;
public class GroovyScriptRunner implements ScriptRunner
{
private static Log log = LogFactory.getLog(GroovyScriptRunner.class);
protected PageManager fieldPageManager;
protected ModuleManager fieldModuleManager;
protected File fieldRoot;
protected Map<String,GroovyScriptEngine> fieldEnginesByPackage;
public GroovyScriptEngine getEngine(String inPackageRoot)
{
if( fieldEnginesByPackage == null )
{
fieldEnginesByPackage = new HashMap();
}
GroovyScriptEngine engine = fieldEnginesByPackage.get(inPackageRoot);
if( engine == null )
{
Collection folders = loadPackages(inPackageRoot);
try
{
engine = new GroovyScriptEngine((String[])folders.toArray(new String[folders.size()]));
}
catch (IOException e)
{
throw new OpenEditException(e);
}
fieldEnginesByPackage.put(inPackageRoot, engine);
}
return engine;
}
public File getRoot()
{
return fieldRoot;
}
public void setRoot(File inRoot)
{
fieldRoot = inRoot;
}
public ModuleManager getModuleManager() {
return fieldModuleManager;
}
public void setModuleManager(ModuleManager inModuleManager) {
fieldModuleManager = inModuleManager;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
@Override
public Object exec(final Script inScript, Map variableMap) throws OpenEditException
{
Page page = inScript.getPage();
try
{
Object returned = null;
// removed, use Spring
// if( inScript.getMethod() != null )
// {
// File file = new File(page.getContentItem().getAbsolutePath());
// //String text = DefaultGroovyMethods.getText(new FileInputStream(file), "UTF-8");
// Class scriptClass = loader.parseClass(file);
//
// final GroovyObject object = (GroovyObject) scriptClass.newInstance();
// InvokerHelper.setProperties(object,variableMap);
//
//
// for (Iterator iterator = inScript.getConfiguration().getChildIterator("property"); iterator.hasNext();) {
// Configuration beanconfig = (Configuration) iterator.next();
//// <!--
//// <property name="cookieEncryption">
//// <ref bean="stringEncryption" />
//// </property>
//// -->
//
// String name = beanconfig.getAttribute("name");
// Configuration ref = beanconfig.getChild("ref");
// if(ref != null){
// String beanid = ref.getAttribute("bean");
// Object bean = getModuleManager().getBean(beanid);
// object.setProperty(name, bean);
// }
//
// }
//
// returned = object.invokeMethod(inScript.getMethod(), null);
//
// }
// else
// {
Binding binding = new Binding();
for (Iterator iterator = variableMap.keySet().iterator(); iterator.hasNext();)
{
String key = (String) iterator.next();
binding.setProperty(key,variableMap.get(key));
}
String filename = page.getPath();
String packageroot = page.getProperty("packageroot");
if( packageroot == null )
{
packageroot = page.getDirectory();
}
filename = filename.substring(packageroot.length() + 1);
if( log.isDebugEnabled() )
{
log.debug("Running " + filename);
}
GroovyScriptEngine engine = getEngine(packageroot);
binding.setProperty("engine", engine);
returned = engine.run(filename, binding); //Pass in only the script file name i.e. conversion/
// }
return returned;
}
catch (OpenEditException e)
{
throw (OpenEditException)e;
}
catch (Exception e)
{
throw new OpenEditException(e, inScript.getPage().getPath() );
}
}
protected Collection loadPackages(String inPackageRoot)
{
//catalog Events scripts
Page proot = getPageManager().getPage(inPackageRoot);
List folders = new ArrayList();
folders.add(proot.getContentItem().getAbsolutePath() + "/");
for( Object parent: proot.getPageSettings().getFallBacks() )
{
String path = ((PageSettings)parent).getPath();
path = path.replace("/_site.xconf", "");
path = path.replace(".xconf", "/");
path = getPageManager().getPage(path).getContentItem().getAbsolutePath();
path = path + "/";
if( !folders.contains(path))
{
folders.add(path);
}
}
ScriptPathLoader loader = new ScriptPathLoader();
loader.setRoot(getRoot());
List basefolders = loader.findPaths();
folders.addAll(basefolders);
return folders;
}
//Use Spring
public Object newInstance(Script inScript)
{
Page page = inScript.getPage();
Collection folders = loadPackages(page.getPath());
try
{
GroovyScriptEngine engine = new GroovyScriptEngine((String[])folders.toArray(new String[folders.size()]));
GroovyClassLoader loader = engine.getGroovyClassLoader();
Object returned = null;
File file = new File(page.getContentItem().getAbsolutePath());
//String text = DefaultGroovyMethods.getText(new FileInputStream(file), "UTF-8");
Class scriptClass = loader.parseClass(file);
if( log.isDebugEnabled() )
{
log.debug("Parsing a class " + file);
}
GroovyObject object = (GroovyObject) scriptClass.newInstance(); //This may not be a real object if the script does not define a public class
if(inScript.getConfiguration() != null){
for (Iterator iterator = inScript.getConfiguration().getChildIterator("property"); iterator.hasNext();) {
Configuration beanconfig = (Configuration) iterator.next();
// <!--
// <property name="cookieEncryption">
// <ref bean="stringEncryption" />
// </property>
// -->
String name = beanconfig.getAttribute("name");
Configuration ref = beanconfig.getChild("ref");
if(ref != null){
String bean = beanconfig.getAttribute("bean");
}
Object bean = getModuleManager().getBean("bean");
object.setProperty(name, bean);
}
}
return object;
}
catch (Exception ex)
{
throw new OpenEditException(ex);
}
}
}