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