3import java.io.IOException;
5import org.springframework.beans.factory.BeanClassLoaderAware;
6import org.springframework.scripting.ScriptCompilationException;
7import org.springframework.scripting.ScriptFactory;
8import org.springframework.scripting.ScriptSource;
9import org.springframework.util.Assert;
12 * Base class for script factories.
16public abstract class GenericScriptFactory implements ScriptFactory, BeanClassLoaderAware {
18 private final String scriptSourceLocator;
20 private Object scriptResult;
21 private String beanName;
22 private Class[] returnType = null;
24 private final Object scriptClassMonitor = new Object();
26 public GenericScriptFactory(String scriptSourceLocator, String beanName, Class returnType) {
27 Assert.hasText(scriptSourceLocator, "'scriptSourceLocator' must not be empty");
28 Assert.hasText(beanName, "'beanName' must not be empty");
30 this.scriptSourceLocator = scriptSourceLocator;
31 this.beanName = beanName;
32 if (returnType != null) {
33 this.returnType = new Class[]{ returnType };
37 public void setBeanClassLoader(ClassLoader classLoader) {
40 public String getScriptSourceLocator() {
41 return this.scriptSourceLocator;
44 public Class[] getScriptInterfaces() {
48 public boolean requiresConfigInterface() {
52 public Class getScriptedObjectType(ScriptSource scriptSource) throws IOException, ScriptCompilationException {
53 synchronized (this.scriptClassMonitor) {
54 if (this.scriptResult == null || scriptSource.isModified()) {
57 return this.scriptResult.getClass();
61 protected Object getScriptResult() {
65 protected void setScriptResult(Object scriptResult) {
66 this.scriptResult = scriptResult;
69 protected String getBeanName() {
73 protected Object getScriptClassMonitor() {
74 return scriptClassMonitor;
77 public abstract Object getScriptedObject(ScriptSource scriptSource, Class[] actualInterfaces) throws IOException, ScriptCompilationException;