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    }