package org.oddjob.beanbus.destinations; import javax.inject.Inject; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.oddjob.arooa.deploy.annotations.ArooaHidden; import org.oddjob.arooa.deploy.annotations.ArooaText; import org.oddjob.arooa.life.Configured; import org.oddjob.beanbus.AbstractFilter; import org.oddjob.beanbus.Transformer; /** * @oddjob.description Provide a Script as a {@link Filter}. * * @oddjob.example * * A simple example. * * {@oddjob.xml.resource org/oddjob/beanbus/destinations/TransformerScriptExample.xml} * * @author rob * * @param <F> The from type. * @param <T> The to type. */ public class TransformerScript<F, T> extends AbstractFilter<F, T> { private String script; private Transformer<F, T> transformer; private ClassLoader classLoader; private String language; @SuppressWarnings("unchecked") @Configured public void configured() throws ScriptException { if (language == null) { language = "JavaScript"; } ScriptEngineManager manager = new ScriptEngineManager( classLoader); ScriptEngine engine = manager.getEngineByName(language); engine.eval(script); if (! (engine instanceof Invocable)) { throw new IllegalStateException( "Script Engine is not Invocable."); } Invocable invocable = (Invocable) engine; transformer = invocable.getInterface(Transformer.class); if (transformer == null) { throw new IllegalStateException( "The script does not implement the Transformer interface."); } } @Override protected T filter(F from) { return transformer.transform(from); } public String getScript() { return script; } @ArooaText public void setScript(String script) { this.script = script; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public ClassLoader getClassLoader() { return classLoader; } @ArooaHidden @Inject public void setClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } }