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