View Javadoc

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