1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support.scripting.groovy;
14
15 import groovy.lang.Binding;
16 import groovy.lang.GroovyClassLoader;
17 import groovy.lang.GroovyShell;
18 import groovy.lang.Script;
19
20 import com.eviware.soapui.support.scripting.SoapUIScriptEngine;
21
22 /***
23 * A Groovy ScriptEngine
24 *
25 * @author ole.matzura
26 */
27
28 public class SoapUIGroovyScriptEngine implements SoapUIScriptEngine
29 {
30 private GroovyClassLoader classLoader;
31 private GroovyShell shell;
32 private Binding binding;
33 private Script script;
34 private String scriptText;
35
36 public SoapUIGroovyScriptEngine( ClassLoader parentClassLoader )
37 {
38 classLoader = new GroovyClassLoader( parentClassLoader );
39 binding = new Binding();
40 shell = new GroovyShell( classLoader, binding );
41 }
42
43 public synchronized Object run() throws Exception
44 {
45 if( script == null )
46 {
47 compile();
48 }
49
50 return script.run();
51 }
52
53 public synchronized void setScript( String scriptText )
54 {
55 if( scriptText != null && scriptText.equals( this.scriptText ))
56 return;
57
58 if( script != null )
59 {
60 script.setBinding( null );
61 script = null;
62
63 if( shell != null )
64 shell.resetLoadedClasses();
65
66 classLoader.clearCache();
67 }
68
69 this.scriptText = scriptText;
70 }
71
72 public void compile() throws Exception
73 {
74 if( script == null )
75 {
76 script = shell.parse( scriptText );
77 script.setBinding( binding );
78 }
79 }
80
81 public void setVariable( String name, Object value )
82 {
83 binding.setVariable( name, value );
84 }
85
86 public void clearVariables()
87 {
88 binding.getVariables().clear();
89 }
90
91 public void release()
92 {
93 script = null;
94
95 if( binding != null )
96 {
97 binding.getVariables().clear();
98 binding = null;
99 }
100
101 if( shell != null )
102 {
103 shell.resetLoadedClasses();
104 shell = null;
105 }
106 }
107
108 protected Binding getBinding()
109 {
110 return binding;
111 }
112
113 protected GroovyClassLoader getClassLoader()
114 {
115 return classLoader;
116 }
117
118 protected synchronized void reset()
119 {
120 script = null;
121 }
122
123 protected Script getScript()
124 {
125 return script;
126 }
127
128 protected String getScriptText()
129 {
130 return scriptText;
131 }
132
133 protected GroovyShell getShell()
134 {
135 return shell;
136 }
137 }