View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 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 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 }