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.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 }