001    /*****************************************************************************
002     * Copyright (C) NanoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by                                                          *
009     *****************************************************************************/
010    package org.nanocontainer.script.jython;
011    
012    import java.io.IOException;
013    import java.io.Reader;
014    import java.net.URL;
015    
016    import org.nanocontainer.script.NanoContainerMarkupException;
017    import org.nanocontainer.script.ScriptedContainerBuilder;
018    import org.picocontainer.PicoContainer;
019    import org.python.util.PythonInterpreter;
020    
021    /**
022     * {@inheritDoc}
023     * The script has to assign a "pico" variable with an instance of
024     * {@link PicoContainer}.
025     * There is an implicit variable named "parent" that may contain a reference to a parent
026     * container. It is recommended to use this as a constructor argument to the instantiated
027     * PicoContainer.
028     *
029     * @author Paul Hammant
030     * @author Mike Royle
031     * @author Aslak Hellesøy
032     * @author Mauro Talevi
033     * @version $Revision: 3144 $
034     */
035    public class JythonContainerBuilder extends ScriptedContainerBuilder {
036    
037        public JythonContainerBuilder(Reader script, ClassLoader classLoader) {
038            super(script, classLoader);
039        }
040    
041        public JythonContainerBuilder(URL script, ClassLoader classLoader) {
042            super(script, classLoader);
043        }
044    
045        protected PicoContainer createContainerFromScript(PicoContainer parentContainer, Object assemblyScope) {
046            try {
047                PythonInterpreter interpreter = new PythonInterpreter();
048                interpreter.exec("from org.picocontainer.defaults import *");
049                interpreter.exec("from org.nanocontainer import *");
050                interpreter.exec("from org.nanocontainer.reflection import *");
051                interpreter.exec("from java.net import *");
052                interpreter.set("parent", parentContainer);
053                interpreter.set("assemblyScope", assemblyScope);
054                interpreter.execfile(getScriptInputStream(), "nanocontainer.py");
055                return (PicoContainer) interpreter.get("pico", PicoContainer.class);
056            } catch (IOException e) {
057                throw new NanoContainerMarkupException(e);
058            }
059        }
060    }