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 }