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.model.ModelItem;
22 import com.eviware.soapui.model.iface.Interface;
23 import com.eviware.soapui.model.iface.Operation;
24 import com.eviware.soapui.model.iface.Request;
25 import com.eviware.soapui.model.mock.MockOperation;
26 import com.eviware.soapui.model.mock.MockResponse;
27 import com.eviware.soapui.model.mock.MockRunContext;
28 import com.eviware.soapui.model.mock.MockService;
29 import com.eviware.soapui.model.project.Project;
30 import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
31 import com.eviware.soapui.model.testsuite.LoadTest;
32 import com.eviware.soapui.model.testsuite.LoadTestRunContext;
33 import com.eviware.soapui.model.testsuite.TestCase;
34 import com.eviware.soapui.model.testsuite.TestCaseRunContext;
35 import com.eviware.soapui.model.testsuite.TestStep;
36 import com.eviware.soapui.model.testsuite.TestSuite;
37 import com.eviware.soapui.support.scripting.ScriptEnginePool;
38 import com.eviware.soapui.support.scripting.SoapUIScriptEngine;
39 import com.eviware.soapui.support.scripting.SoapUIScriptEngineRegistry;
40 import com.eviware.soapui.support.types.StringToObjectMap;
41
42 public class EvalPropertyResolver implements PropertyResolver
43 {
44 private Logger log = Logger.getLogger( EvalPropertyResolver.class );
45 private Map<String,ScriptEnginePool> scriptEnginePools = new HashMap<String, ScriptEnginePool>();
46
47 public String resolveProperty( PropertyExpansionContext context, String name, boolean globalOverride )
48 {
49 if( name.length() == 0 || name.charAt( 0 ) != '=' )
50 return null;
51
52 name = name.substring( 1 );
53
54 StringToObjectMap objects = new StringToObjectMap( context.getProperties() );
55 objects.put( "context", context );
56 objects.put( "log", SoapUI.ensureGroovyLog() );
57
58 if( context instanceof TestCaseRunContext )
59 {
60 objects.put( "testRunner", ( ( TestCaseRunContext )context ).getTestRunner() );
61 }
62
63 if( context instanceof LoadTestRunContext )
64 {
65 objects.put( "loadTestRunner", ( ( LoadTestRunContext )context ).getLoadTestRunner() );
66 }
67
68 if( context instanceof MockRunContext )
69 {
70 objects.put( "mockRunner", ( ( MockRunContext )context ).getMockRunner() );
71 }
72
73 ModelItem modelItem = context.getModelItem();
74 if( modelItem instanceof TestCase )
75 {
76 objects.put( "testCase", modelItem );
77 }
78 else if( modelItem instanceof TestStep )
79 {
80 objects.put( "testStep", modelItem );
81 }
82 else if( modelItem instanceof TestSuite )
83 {
84 objects.put( "testSuite", modelItem );
85 }
86 if( modelItem instanceof LoadTest )
87 {
88 objects.put( "loadTest", modelItem );
89 }
90 else if( modelItem instanceof Project )
91 {
92 objects.put( "project", modelItem );
93 }
94 else if( modelItem instanceof MockService )
95 {
96 objects.put( "mockService", modelItem );
97 }
98 else if( modelItem instanceof MockOperation )
99 {
100 objects.put( "mockOperation", modelItem );
101 }
102 else if( modelItem instanceof MockResponse )
103 {
104 objects.put( "mockResponse", modelItem );
105 }
106 else if( modelItem instanceof Request )
107 {
108 objects.put( "request", modelItem );
109 }
110 else if( modelItem instanceof Operation )
111 {
112 objects.put( "operation", modelItem );
113 }
114 else if( modelItem instanceof Interface )
115 {
116 objects.put( "interface", modelItem );
117 }
118
119 if( modelItem != null )
120 {
121 objects.put( "modelItem", modelItem );
122 }
123
124 return doEval( name, modelItem, objects );
125 }
126
127 private String doEval( String name, ModelItem modelItem, StringToObjectMap objects )
128 {
129 String engineId = SoapUIScriptEngineRegistry.getScriptEngineId( modelItem );
130
131 synchronized( this )
132 {
133 if( !scriptEnginePools.containsKey( engineId ))
134 scriptEnginePools.put( engineId, new ScriptEnginePool( engineId ) );
135 }
136
137 ScriptEnginePool scriptEnginePool = scriptEnginePools.get( engineId );
138 SoapUIScriptEngine scriptEngine = scriptEnginePool.getScriptEngine();
139 try
140 {
141 scriptEngine.setScript( name );
142 for( String key : objects.keySet() )
143 scriptEngine.setVariable( key, objects.get( key ) );
144
145 Object result = scriptEngine.run();
146 return result == null ? null : result.toString();
147 }
148 catch( Throwable e )
149 {
150 log.error( "Error evaluating script", e );
151 return e.getMessage();
152 }
153 finally
154 {
155 scriptEngine.clearVariables();
156 scriptEnginePool.returnScriptEngine( scriptEngine );
157 }
158 }
159 }