001 package org.nanocontainer.script.bsh; 002 003 import java.io.IOException; 004 import java.io.Reader; 005 import java.net.URL; 006 007 import org.nanocontainer.script.NanoContainerMarkupException; 008 import org.nanocontainer.script.ScriptedContainerBuilder; 009 import org.picocontainer.PicoContainer; 010 011 import bsh.EvalError; 012 import bsh.Interpreter; 013 014 /** 015 * {@inheritDoc} 016 * The script has to assign a "pico" variable with an instance of 017 * {@link org.picocontainer.PicoContainer}. 018 * There is an implicit variable named "parent" that may contain a reference to a parent 019 * container. It is recommended to use this as a constructor argument to the instantiated 020 * PicoContainer. 021 * 022 * @author Aslak Hellesøy 023 * @author Michael Rimov 024 * @author Mauro Talevi 025 * @version $Revision: 3144 $ 026 */ 027 public class BeanShellContainerBuilder extends ScriptedContainerBuilder { 028 029 public BeanShellContainerBuilder(Reader script, ClassLoader classLoader) { 030 super(script, classLoader); 031 } 032 033 public BeanShellContainerBuilder(URL script, ClassLoader classLoader) { 034 super(script, classLoader); 035 } 036 037 protected PicoContainer createContainerFromScript(PicoContainer parentContainer, Object assemblyScope) { 038 Interpreter i = new Interpreter(); 039 try { 040 i.set("parent", parentContainer); 041 i.set("assemblyScope", assemblyScope); 042 i.setClassLoader(this.getClassLoader()); 043 i.eval(getScriptReader(), i.getNameSpace(), "nanocontainer.bsh"); 044 return (PicoContainer) i.get("pico"); 045 } catch (EvalError e) { 046 throw new NanoContainerMarkupException(e); 047 } catch (IOException e) { 048 throw new NanoContainerMarkupException(e); 049 } 050 } 051 }