1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.model.propertyexpansion.resolvers;
14
15 import com.eviware.soapui.SoapUI;
16 import com.eviware.soapui.model.ModelItem;
17 import com.eviware.soapui.model.iface.Interface;
18 import com.eviware.soapui.model.iface.Operation;
19 import com.eviware.soapui.model.iface.Request;
20 import com.eviware.soapui.model.mock.MockOperation;
21 import com.eviware.soapui.model.mock.MockResponse;
22 import com.eviware.soapui.model.mock.MockRunContext;
23 import com.eviware.soapui.model.mock.MockService;
24 import com.eviware.soapui.model.project.Project;
25 import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
26 import com.eviware.soapui.model.testsuite.*;
27 import com.eviware.soapui.support.scripting.ScriptEnginePool;
28 import com.eviware.soapui.support.scripting.SoapUIScriptEngine;
29 import com.eviware.soapui.support.types.StringToObjectMap;
30 import org.apache.log4j.Logger;
31
32 public class EvalPropertyResolver implements PropertyResolver
33 {
34 private Logger log = Logger.getLogger(EvalPropertyResolver.class);
35 private ScriptEnginePool scriptEnginePool = new ScriptEnginePool( null );
36
37 public String resolveProperty(PropertyExpansionContext context, String name, boolean globalOverride)
38 {
39 if (name.length() == 0 || name.charAt(0) != '=')
40 return null;
41
42 name = name.substring(1);
43
44 StringToObjectMap objects = new StringToObjectMap();
45 objects.put( "context", context);
46 objects.put( "log", SoapUI.ensureGroovyLog() );
47
48 if( context instanceof TestRunContext )
49 {
50 objects.put( "testRunner", ((TestRunContext)context).getTestRunner() );
51 }
52
53 if( context instanceof LoadTestRunContext )
54 {
55 objects.put( "loadTestRunner", ((LoadTestRunContext)context).getLoadTestRunner() );
56 }
57
58 if( context instanceof MockRunContext )
59 {
60 objects.put( "mockRunner", ((MockRunContext)context).getMockRunner() );
61 }
62
63 ModelItem modelItem = context.getModelItem();
64 if (modelItem instanceof TestCase)
65 {
66 objects.put( "testCase", modelItem );
67 }
68 else if (modelItem instanceof TestStep)
69 {
70 objects.put( "testStep", modelItem );
71 }
72 else if (modelItem instanceof TestSuite)
73 {
74 objects.put( "testSuite", modelItem );
75 }
76 if (modelItem instanceof LoadTest )
77 {
78 objects.put( "loadTest", modelItem );
79 }
80 else if (modelItem instanceof Project)
81 {
82 objects.put( "project", modelItem );
83 }
84 else if (modelItem instanceof MockService)
85 {
86 objects.put( "mockService", modelItem );
87 }
88 else if (modelItem instanceof MockOperation)
89 {
90 objects.put( "mockOperation", modelItem );
91 }
92 else if (modelItem instanceof MockResponse)
93 {
94 objects.put( "mockResponse", modelItem );
95 }
96 else if (modelItem instanceof Request)
97 {
98 objects.put( "request", modelItem );
99 }
100 else if (modelItem instanceof Operation)
101 {
102 objects.put( "operation", modelItem );
103 }
104 else if (modelItem instanceof Interface)
105 {
106 objects.put( "interface", modelItem );
107 }
108
109 if( modelItem != null )
110 {
111 objects.put( "modelItem", modelItem );
112 }
113
114 return doEval(name, modelItem, objects );
115 }
116
117 private String doEval(String name, ModelItem modelItem, StringToObjectMap objects)
118 {
119 SoapUIScriptEngine scriptEngine = scriptEnginePool.getScriptEngine();
120 try
121 {
122 scriptEngine.setScript(name);
123 for( String key : objects.keySet())
124 scriptEngine.setVariable(key, objects.get(key));
125
126 Object result = scriptEngine.run();
127 return result == null ? null : result.toString();
128 }
129 catch (Throwable e)
130 {
131 log.error("Error evaluating script", e);
132 return e.getMessage();
133 }
134 finally
135 {
136 scriptEngine.clearVariables();
137 scriptEnginePool.returnScriptEngine(scriptEngine);
138 }
139 }
140 }