1 10 package org.nanocontainer.script.bsh; 11 12 import bsh.EvalError; 13 import bsh.Interpreter; 14 import org.picocontainer.Parameter; 15 import org.picocontainer.PicoContainer; 16 import org.picocontainer.PicoInitializationException; 17 import org.picocontainer.PicoIntrospectionException; 18 import org.picocontainer.defaults.AbstractComponentAdapter; 19 import org.picocontainer.defaults.UnsatisfiableDependenciesException; 20 21 import java.io.IOException ; 22 import java.io.InputStreamReader ; 23 import java.io.Reader ; 24 import java.net.URL ; 25 import java.util.Arrays ; 26 import java.util.Collections ; 27 28 52 public class BeanShellComponentAdapter extends AbstractComponentAdapter { 53 private final Parameter[] parameters; 54 55 private Object instance = null; 56 57 60 private final ClassLoader classLoader; 61 62 public BeanShellComponentAdapter(final Object componentKey, final Class componentImplementation, final Parameter[] parameters, final ClassLoader classLoader) { 63 super(componentKey, componentImplementation); 64 this.parameters = parameters; 65 this.classLoader = classLoader; 66 } 67 68 public BeanShellComponentAdapter(final Object componentKey, final Class componentImplementation, final Parameter[] parameters) { 69 this(componentKey, componentImplementation, parameters, BeanShellComponentAdapter.class.getClassLoader()); 70 } 71 72 public Object getComponentInstance(PicoContainer pico) 73 throws PicoInitializationException, PicoIntrospectionException { 74 75 if (instance == null) { 76 try { 77 Interpreter i = new Interpreter(); 78 i.setClassLoader(classLoader); 79 i.set("adapter", this); 80 i.set("picoContainer", pico); 81 i.set("componentKey", getComponentKey()); 82 i.set("componentImplementation", getComponentImplementation()); 83 i.set("parameters", parameters != null ? Arrays.asList(parameters) : Collections.EMPTY_LIST); 84 i.eval("import " + getComponentImplementation().getName() + ";"); 85 86 String scriptPath = "/" + getComponentImplementation().getName().replace('.', '/') + ".bsh"; 87 88 URL scriptURL = getComponentImplementation().getResource(scriptPath); 92 if (scriptURL == null) { 93 throw new BeanShellScriptInitializationException("Couldn't load script at path " + scriptPath); 94 } 95 Reader sourceReader = new InputStreamReader (scriptURL.openStream()); 96 i.eval(sourceReader, i.getNameSpace(), scriptURL.toExternalForm()); 97 98 instance = i.get("instance"); 99 if (instance == null) { 100 throw new BeanShellScriptInitializationException("The 'instance' variable was not instantiated"); 101 } 102 } catch (EvalError e) { 103 throw new BeanShellScriptInitializationException(e); 104 } catch (IOException e) { 105 throw new BeanShellScriptInitializationException(e); 106 } 107 } 108 return instance; 109 } 110 111 public void verify(PicoContainer pico) throws UnsatisfiableDependenciesException { 112 } 113 } 114 | Popular Tags |