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 }