View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 eviware.com
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 }