1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.model.propertyexpansion.resolvers;
14
15 import java.util.HashMap;
16 import java.util.Map;
17
18 import org.apache.log4j.Logger;
19
20 import com.eviware.soapui.SoapUI;
21 import com.eviware.soapui.impl.wsdl.teststeps.TestRequest;
22 import com.eviware.soapui.model.ModelItem;
23 import com.eviware.soapui.model.iface.Interface;
24 import com.eviware.soapui.model.iface.Operation;
25 import com.eviware.soapui.model.iface.Request;
26 import com.eviware.soapui.model.mock.MockOperation;
27 import com.eviware.soapui.model.mock.MockResponse;
28 import com.eviware.soapui.model.mock.MockRunContext;
29 import com.eviware.soapui.model.mock.MockService;
30 import com.eviware.soapui.model.project.Project;
31 import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
32 import com.eviware.soapui.model.testsuite.LoadTest;
33 import com.eviware.soapui.model.testsuite.LoadTestRunContext;
34 import com.eviware.soapui.model.testsuite.SamplerTestStep;
35 import com.eviware.soapui.model.testsuite.TestCase;
36 import com.eviware.soapui.model.testsuite.TestCaseRunContext;
37 import com.eviware.soapui.model.testsuite.TestStep;
38 import com.eviware.soapui.model.testsuite.TestSuite;
39 import com.eviware.soapui.support.scripting.ScriptEnginePool;
40 import com.eviware.soapui.support.scripting.SoapUIScriptEngine;
41 import com.eviware.soapui.support.scripting.SoapUIScriptEngineRegistry;
42 import com.eviware.soapui.support.types.StringToObjectMap;
43
44 public class EvalPropertyResolver implements PropertyResolver
45 {
46 private Logger log = Logger.getLogger( EvalPropertyResolver.class );
47 private Map<String, ScriptEnginePool> scriptEnginePools = new HashMap<String, ScriptEnginePool>();
48
49 public String resolveProperty( PropertyExpansionContext context, String name, boolean globalOverride )
50 {
51 if( name.length() == 0 || name.charAt( 0 ) != '=' )
52 return null;
53
54 name = name.substring( 1 );
55
56 StringToObjectMap objects = new StringToObjectMap( context.getProperties() );
57 objects.put( "context", context );
58 objects.put( "log", SoapUI.ensureGroovyLog() );
59
60 if( context instanceof TestCaseRunContext )
61 {
62 TestCaseRunContext testCaseRunContext = ( TestCaseRunContext )context;
63 objects.put( "testRunner", testCaseRunContext.getTestRunner() );
64
65 objects.put( "testStep", testCaseRunContext.getCurrentStep() );
66
67 if( testCaseRunContext.getCurrentStep() instanceof SamplerTestStep )
68 {
69 objects.put( "request", ( ( SamplerTestStep )testCaseRunContext.getCurrentStep() ).getTestRequest() );
70 }
71 }
72
73 if( context instanceof LoadTestRunContext )
74 {
75 objects.put( "loadTestRunner", ( ( LoadTestRunContext )context ).getLoadTestRunner() );
76 }
77
78 if( context instanceof MockRunContext )
79 {
80 objects.put( "mockRunner", ( ( MockRunContext )context ).getMockRunner() );
81 }
82
83 ModelItem modelItem = context.getModelItem();
84 if( modelItem instanceof TestCase )
85 {
86 objects.put( "testCase", modelItem );
87
88 objects.put( "testSuite", ( ( TestCase )modelItem ).getTestSuite() );
89 objects.put( "project", ( ( TestCase )modelItem ).getTestSuite().getProject() );
90 }
91 else if( modelItem instanceof TestStep )
92 {
93 objects.put( "testStep", modelItem );
94
95 if( modelItem instanceof SamplerTestStep )
96 {
97 objects.put( "request", ( ( SamplerTestStep )modelItem ).getTestRequest() );
98 }
99
100 objects.put( "testCase", ( ( TestStep )modelItem ).getTestCase() );
101 objects.put( "testSuite", ( ( TestStep )modelItem ).getTestCase().getTestSuite() );
102 objects.put( "project", ( ( TestStep )modelItem ).getTestCase().getTestSuite().getProject() );
103 }
104 else if( modelItem instanceof TestSuite )
105 {
106 objects.put( "testSuite", modelItem );
107 objects.put( "project", ( ( TestSuite )modelItem ).getProject() );
108 }
109 if( modelItem instanceof LoadTest )
110 {
111 objects.put( "loadTest", modelItem );
112 objects.put( "testCase", ( ( LoadTest )modelItem ).getTestCase() );
113 objects.put( "testSuite", ( ( LoadTest )modelItem ).getTestCase().getTestSuite() );
114 objects.put( "project", ( ( LoadTest )modelItem ).getTestCase().getTestSuite().getProject() );
115 }
116 else if( modelItem instanceof Project )
117 {
118 objects.put( "project", modelItem );
119 }
120 else if( modelItem instanceof MockService )
121 {
122 objects.put( "mockService", modelItem );
123 objects.put( "project", ( ( MockService )modelItem ).getProject() );
124 }
125 else if( modelItem instanceof MockOperation )
126 {
127 objects.put( "mockOperation", modelItem );
128 objects.put( "mockService", ( ( MockOperation )modelItem ).getMockService() );
129 objects.put( "project", ( ( MockOperation )modelItem ).getMockService().getProject() );
130 }
131 else if( modelItem instanceof MockResponse )
132 {
133 objects.put( "mockResponse", modelItem );
134 objects.put( "mockOperation", ( ( MockResponse )modelItem ).getMockOperation() );
135 objects.put( "mockService", ( ( MockResponse )modelItem ).getMockOperation().getMockService() );
136 objects.put( "project", ( ( MockResponse )modelItem ).getMockOperation().getMockService().getProject() );
137 }
138 else if( modelItem instanceof Request )
139 {
140 objects.put( "request", modelItem );
141
142 if( modelItem instanceof TestRequest )
143 {
144 objects.put( "testStep", ( ( TestRequest )modelItem ).getTestStep() );
145 objects.put( "testCase", ( ( TestRequest )modelItem ).getTestStep().getTestCase() );
146 objects.put( "testSuite", ( ( TestRequest )modelItem ).getTestStep().getTestCase().getTestSuite() );
147 objects.put( "project", ( ( TestRequest )modelItem ).getTestStep().getTestCase().getTestSuite()
148 .getProject() );
149 }
150 }
151 else if( modelItem instanceof Operation )
152 {
153 objects.put( "operation", modelItem );
154 }
155 else if( modelItem instanceof Interface )
156 {
157 objects.put( "interface", modelItem );
158 }
159
160 if( modelItem != null )
161 {
162 objects.put( "modelItem", modelItem );
163 }
164
165 return doEval( name, modelItem, objects );
166 }
167
168 private String doEval( String name, ModelItem modelItem, StringToObjectMap objects )
169 {
170 String engineId = SoapUIScriptEngineRegistry.getScriptEngineId( modelItem );
171
172 synchronized( this )
173 {
174 if( !scriptEnginePools.containsKey( engineId ) )
175 scriptEnginePools.put( engineId, new ScriptEnginePool( engineId ) );
176 }
177
178 ScriptEnginePool scriptEnginePool = scriptEnginePools.get( engineId );
179 SoapUIScriptEngine scriptEngine = scriptEnginePool.getScriptEngine();
180 try
181 {
182 scriptEngine.setScript( name );
183 for( String key : objects.keySet() )
184 scriptEngine.setVariable( key, objects.get( key ) );
185
186 Object result = scriptEngine.run();
187 return result == null ? null : result.toString();
188 }
189 catch( Throwable e )
190 {
191 log.error( "Error evaluating script", e );
192 return e.getMessage();
193 }
194 finally
195 {
196 scriptEngine.clearVariables();
197 scriptEnginePool.returnScriptEngine( scriptEngine );
198 }
199 }
200 }