1 16 17 package org.springframework.scripting.groovy; 18 19 import java.io.IOException ; 20 21 import groovy.lang.GroovyClassLoader; 22 import groovy.lang.GroovyObject; 23 import groovy.lang.Script; 24 import org.codehaus.groovy.control.CompilationFailedException; 25 26 import org.springframework.beans.factory.BeanClassLoaderAware; 27 import org.springframework.scripting.ScriptCompilationException; 28 import org.springframework.scripting.ScriptFactory; 29 import org.springframework.scripting.ScriptSource; 30 import org.springframework.util.Assert; 31 import org.springframework.util.ClassUtils; 32 33 48 public class GroovyScriptFactory implements ScriptFactory, BeanClassLoaderAware { 49 50 private final String scriptSourceLocator; 51 52 private final GroovyObjectCustomizer groovyObjectCustomizer; 53 54 private GroovyClassLoader groovyClassLoader = new GroovyClassLoader(ClassUtils.getDefaultClassLoader()); 55 56 private Class scriptClass; 57 58 private Class scriptResultClass; 59 60 private final Object scriptClassMonitor = new Object (); 61 62 63 70 public GroovyScriptFactory(String scriptSourceLocator) { 71 this(scriptSourceLocator, null); 72 } 73 74 86 public GroovyScriptFactory(String scriptSourceLocator, GroovyObjectCustomizer groovyObjectCustomizer) { 87 Assert.hasText(scriptSourceLocator, "'scriptSourceLocator' must not be empty"); 88 this.scriptSourceLocator = scriptSourceLocator; 89 this.groovyObjectCustomizer = groovyObjectCustomizer; 90 } 91 92 93 public void setBeanClassLoader(ClassLoader classLoader) { 94 this.groovyClassLoader = new GroovyClassLoader(classLoader); 95 } 96 97 public String getScriptSourceLocator() { 98 return this.scriptSourceLocator; 99 } 100 101 106 public Class [] getScriptInterfaces() { 107 return null; 108 } 109 110 114 public boolean requiresConfigInterface() { 115 return false; 116 } 117 118 119 123 public Object getScriptedObject(ScriptSource scriptSource, Class [] actualInterfaces) 124 throws IOException , ScriptCompilationException { 125 126 try { 127 Class scriptClassToExecute = null; 128 129 synchronized (this.scriptClassMonitor) { 130 if (this.scriptClass == null || scriptSource.isModified()) { 131 this.scriptClass = this.groovyClassLoader.parseClass(scriptSource.getScriptAsString()); 132 133 if (Script.class.isAssignableFrom(this.scriptClass)) { 134 Object result = executeScript(this.scriptClass); 136 this.scriptResultClass = (result != null ? result.getClass() : null); 137 return result; 138 } 139 else { 140 this.scriptResultClass = this.scriptClass; 141 } 142 } 143 scriptClassToExecute = this.scriptClass; 144 } 145 146 return executeScript(scriptClassToExecute); 148 } 149 catch (CompilationFailedException ex) { 150 throw new ScriptCompilationException( 151 "Could not compile Groovy script: " + scriptSource, ex); 152 } 153 } 154 155 public Class getScriptedObjectType(ScriptSource scriptSource) 156 throws IOException , ScriptCompilationException { 157 158 synchronized (this.scriptClassMonitor) { 159 if (this.scriptClass == null || scriptSource.isModified()) { 160 this.scriptClass = this.groovyClassLoader.parseClass(scriptSource.getScriptAsString()); 161 162 if (Script.class.isAssignableFrom(this.scriptClass)) { 163 Object result = executeScript(this.scriptClass); 165 this.scriptResultClass = (result != null ? result.getClass() : null); 166 } 167 else { 168 this.scriptResultClass = this.scriptClass; 169 } 170 } 171 return this.scriptResultClass; 172 } 173 } 174 175 182 protected Object executeScript(Class scriptClass) throws ScriptCompilationException { 183 try { 184 GroovyObject goo = (GroovyObject) scriptClass.newInstance(); 185 186 if (this.groovyObjectCustomizer != null) { 187 this.groovyObjectCustomizer.customize(goo); 189 } 190 191 if (goo instanceof Script) { 192 return ((Script) goo).run(); 194 } 195 else { 196 return goo; 198 } 199 } 200 catch (InstantiationException ex) { 201 throw new ScriptCompilationException( 202 "Could not instantiate Groovy script class: " + scriptClass.getName(), ex); 203 } 204 catch (IllegalAccessException ex) { 205 throw new ScriptCompilationException( 206 "Could not access Groovy script constructor: " + scriptClass.getName(), ex); 207 } 208 } 209 210 211 public String toString() { 212 return "GroovyScriptFactory: script source locator [" + this.scriptSourceLocator + "]"; 213 } 214 215 } 216 | Popular Tags |