1 10 package org.nanocontainer.script.groovy; 11 12 import groovy.lang.Binding; 13 import groovy.lang.GroovyClassLoader; 14 import groovy.lang.GroovyCodeSource; 15 import groovy.lang.GroovyObject; 16 import groovy.lang.MissingPropertyException; 17 import groovy.lang.Script; 18 19 import java.io.IOException ; 20 import java.io.InputStream ; 21 import java.io.Reader ; 22 import java.net.URL ; 23 24 import org.codehaus.groovy.control.CompilationFailedException; 25 import org.codehaus.groovy.runtime.InvokerHelper; 26 import org.nanocontainer.NanoContainer; 27 import org.nanocontainer.script.NanoContainerMarkupException; 28 import org.nanocontainer.script.ScriptedContainerBuilder; 29 import org.picocontainer.PicoContainer; 30 import org.picocontainer.alternatives.EmptyPicoContainer; 31 import org.nanocontainer.reflection.DefaultNanoPicoContainer; 32 33 45 public class GroovyContainerBuilder extends ScriptedContainerBuilder { 46 private Class scriptClass; 47 48 public GroovyContainerBuilder(final Reader script, ClassLoader classLoader) { 49 super(script, classLoader); 50 createGroovyClass(); 51 } 52 53 public GroovyContainerBuilder(final URL script, ClassLoader classLoader) { 54 super(script, classLoader); 55 createGroovyClass(); 56 } 57 58 protected PicoContainer createContainerFromScript(PicoContainer parentContainer, Object assemblyScope) { 60 61 Binding binding = new Binding(); 62 if ( parentContainer == null ){ 63 parentContainer = new DefaultNanoPicoContainer(getClassLoader(), new EmptyPicoContainer()); 64 } 65 binding.setVariable("parent", parentContainer); 66 binding.setVariable("builder", createGroovyNodeBuilder()); 67 binding.setVariable("assemblyScope", assemblyScope); 68 handleBinding(binding); 69 return runGroovyScript(binding); 70 } 71 72 76 protected GroovyObject createGroovyNodeBuilder() { 77 return new GroovyNodeBuilder(); 78 } 79 80 85 protected void handleBinding(Binding binding) { 86 } 88 89 90 95 private void createGroovyClass() { 96 try { 97 GroovyClassLoader loader = new GroovyClassLoader(getClassLoader()); 98 InputStream scriptIs = getScriptInputStream(); 99 GroovyCodeSource groovyCodeSource = new GroovyCodeSource(scriptIs,"nanocontainer.groovy","groovyGeneratedForNanoContainer"); 100 scriptClass = loader.parseClass(groovyCodeSource); 101 } catch (CompilationFailedException e) { 102 throw new GroovyCompilationException("Compilation Failed '" + e.getMessage() + "'", e); 103 } catch (IOException e) { 104 throw new NanoContainerMarkupException(e); 105 } 106 107 } 108 109 114 private PicoContainer runGroovyScript(Binding binding){ 115 Script script = createGroovyScript(binding); 116 117 Object result = script.run(); 118 Object picoVariable; 119 try { 120 picoVariable = binding.getVariable("pico"); 121 } catch (MissingPropertyException e) { 122 picoVariable = result; 123 } 124 if (picoVariable == null) { 125 throw new NullPointerException ("Groovy Script Variable: pico"); 126 } 127 128 if (picoVariable instanceof PicoContainer) { 129 return (PicoContainer) picoVariable; 130 } else if (picoVariable instanceof NanoContainer) { 131 return ((NanoContainer) picoVariable).getPico(); 132 } else { 133 throw new NanoContainerMarkupException("Bad type for pico:" + picoVariable.getClass().getName()); 134 } 135 136 } 137 138 private Script createGroovyScript(Binding binding) { 139 return InvokerHelper.createScript(scriptClass, binding); 140 } 141 } 142 | Popular Tags |