View Javadoc

1   /*
2    *  soapUI, copyright (C) 2006 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
6    *  either version 2.1 of the License, or (at your option) any later version.
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.impl.wsdl.mock;
14  
15  import groovy.lang.GroovyShell;
16  
17  import java.util.ArrayList;
18  import java.util.HashSet;
19  import java.util.List;
20  import java.util.Set;
21  
22  import javax.servlet.http.HttpServletRequest;
23  import javax.servlet.http.HttpServletResponse;
24  import javax.swing.ImageIcon;
25  
26  import com.eviware.soapui.config.MockOperationConfig;
27  import com.eviware.soapui.config.MockServiceConfig;
28  import com.eviware.soapui.impl.actions.ShowDesktopPanelAction;
29  import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
30  import com.eviware.soapui.impl.wsdl.WsdlOperation;
31  import com.eviware.soapui.impl.wsdl.WsdlProject;
32  import com.eviware.soapui.impl.wsdl.actions.mockservice.AddNewMockOperationAction;
33  import com.eviware.soapui.impl.wsdl.actions.mockservice.CloneMockServiceAction;
34  import com.eviware.soapui.impl.wsdl.actions.mockservice.RemoveMockServiceAction;
35  import com.eviware.soapui.impl.wsdl.actions.mockservice.RenameMockServiceAction;
36  import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
37  import com.eviware.soapui.impl.wsdl.support.HelpUrls;
38  import com.eviware.soapui.impl.wsdl.support.ModelItemIconAnimator;
39  import com.eviware.soapui.model.iface.Operation;
40  import com.eviware.soapui.model.mock.MockOperation;
41  import com.eviware.soapui.model.mock.MockResult;
42  import com.eviware.soapui.model.mock.MockRunListener;
43  import com.eviware.soapui.model.mock.MockRunner;
44  import com.eviware.soapui.model.mock.MockService;
45  import com.eviware.soapui.model.mock.MockServiceListener;
46  import com.eviware.soapui.model.project.Project;
47  import com.eviware.soapui.support.ScriptingSupport;
48  import com.eviware.soapui.support.action.ActionSupport;
49  
50  public class WsdlMockService extends AbstractWsdlModelItem<MockServiceConfig> implements MockService
51  {
52  	private static final String REQUIRE_SOAP_VERSION = WsdlMockService.class.getName() + "@require-soap-version";
53  	private List<WsdlMockOperation> mockOperations = new ArrayList<WsdlMockOperation>();
54     private Set<MockRunListener> mockRunListeners = new HashSet<MockRunListener>();
55     private Set<MockServiceListener> mockServiceListeners = new HashSet<MockServiceListener>();
56     private MockServiceIconAnimator iconAnimator;
57  	private WsdlMockRunner mockRunner;
58  	private GroovyShell shell;
59  	
60  	public WsdlMockService( Project project, MockServiceConfig config)
61  	{
62  		super( config, project, "/mockService.gif" );
63  		
64  		List<MockOperationConfig> testStepConfigs = config.getMockOperationList();
65        for (MockOperationConfig tsc : testStepConfigs )
66        {
67           WsdlMockOperation testStep = new WsdlMockOperation( this, tsc );
68           mockOperations.add( testStep );
69        }
70        
71        if( !config.isSetPort() || config.getPort() < 1 )
72        	config.setPort( 8080 );
73        
74        if( !config.isSetPath() )
75        	config.setPath( "/" );
76        
77        addAction( new ShowDesktopPanelAction( "Open MockService Editor", 
78           		"Opens the MockService Editor for this MockService", this ));
79       // addAction( new MockServiceOptionsAction( this ));
80        addAction( ActionSupport.SEPARATOR_ACTION );
81        addAction( new AddNewMockOperationAction( this ));
82        addAction( new CloneMockServiceAction( this ));
83        addAction( ActionSupport.SEPARATOR_ACTION );
84        addAction( new RenameMockServiceAction( this ) );
85        addAction( new RemoveMockServiceAction( this ) );
86        addAction( ActionSupport.SEPARATOR_ACTION );
87        addAction( new ShowOnlineHelpAction( HelpUrls.MOCKSERVICE_HELP_URL ));
88        
89        iconAnimator = new MockServiceIconAnimator();
90        addMockRunListener( iconAnimator );
91        
92        shell = ScriptingSupport.createGroovyShell( null );
93  	}
94  
95  	public void addMockRunListener( MockRunListener listener )
96  	{
97  		mockRunListeners.add( listener );
98  	}
99  
100 	public String getPath()
101 	{
102 		return getConfig().getPath();
103 	}
104 
105 	public MockOperation getMockOperationAt( int index )
106 	{
107 		return mockOperations.get( index );
108 	}
109 
110 	public MockOperation getMockOperationByName( String name )
111 	{
112 		return ( MockOperation ) getWsdlModelItemByName( mockOperations, name );
113 	}
114 
115 	public int getMockOperationCount()
116 	{
117 		return mockOperations.size();
118 	}
119 
120 	public WsdlProject getProject()
121 	{
122 		return ( WsdlProject ) getParent();
123 	}
124 
125 	public int getPort()
126 	{
127 		return getConfig().getPort();
128 	}
129 
130 	public void removeMockRunListener( MockRunListener listener )
131 	{
132 		mockRunListeners.remove( listener );
133 	}
134 
135 	public WsdlMockRunner start() throws Exception
136 	{
137 		String path = getPath();
138 		if( path == null || path.trim().length() == 0 || path.trim().charAt( 0 ) != '/' )
139 			throw new Exception( "Invalid path; must start with '/'");
140 		
141 		mockRunner = new WsdlMockRunner( this );
142 		return mockRunner;
143 	}
144 
145 	public WsdlMockRunner getMockRunner()
146 	{
147 		return mockRunner;
148 	}
149 
150 	public boolean hasMockOperation( Operation operation )
151 	{
152 		for( int c = 0; c < getMockOperationCount(); c++ )
153 		{
154 			WsdlMockOperation mockOperation = mockOperations.get( c );
155 			if( mockOperation.getOperation() == operation )
156 				return true;
157 		}
158 		
159 		return false;
160 	}
161 
162 	public WsdlMockOperation addNewMockOperation( WsdlOperation operation )
163 	{
164 		if( hasMockOperation( operation ))
165 			return null;
166 		
167 		MockOperationConfig config = getConfig().addNewMockOperation();
168 		config.setName( operation.getName() );
169 		WsdlMockOperation mockOperation = new WsdlMockOperation( this, config, operation );
170 		
171 		mockOperations.add( mockOperation );
172 		fireMockOperationAdded( mockOperation );
173 		
174 		return mockOperation;
175 	}
176 
177 	public void setPort( int port )
178 	{
179 		int oldPort = getPort();
180 		if( port != oldPort )
181 		{
182 			getConfig().setPort( port );
183 			notifyPropertyChanged( PORT_PROPERTY, oldPort, port );
184 		}
185 	}
186 
187 	public void setPath( String path )
188 	{
189 		String oldPath = getPath();
190 		if( !path.equals( oldPath ))
191 		{
192 			getConfig().setPath( path );
193 			notifyPropertyChanged( PATH_PROPERTY, oldPath, path );
194 		}
195 	}
196 
197 	public MockRunListener [] getMockRunListeners()
198 	{
199 		return mockRunListeners.toArray( new MockRunListener[mockRunListeners.size()] );
200 	}
201 
202 	public void removeMockOperation( WsdlMockOperation mockOperation )
203 	{
204 		int ix = mockOperations.indexOf( mockOperation );
205 		if( ix == -1 )
206 			throw new RuntimeException( "Unkonws MockOperation specified to removeMockOperation" );
207 		
208 		mockOperations.remove( ix );
209 		fireMockOperationRemoved( mockOperation );
210 		mockOperation.release();
211 		getConfig().removeMockOperation( ix );
212 	}
213 
214 	public void addMockServiceListener( MockServiceListener listener )
215 	{
216 		mockServiceListeners.add(  listener  );
217 	}
218 
219 	public void removeMockServiceListener( MockServiceListener listener )
220 	{
221 		mockServiceListeners.remove( listener );
222 	}
223 	
224 	protected void fireMockOperationAdded( WsdlMockOperation mockOperation )
225 	{
226 		MockServiceListener[] listeners = mockServiceListeners.toArray( new MockServiceListener[mockServiceListeners.size()] );
227 		for( MockServiceListener listener : listeners )
228 		{
229 			listener.mockOperationAdded( mockOperation );
230 		}
231 	}
232 	
233 	protected void fireMockOperationRemoved( WsdlMockOperation mockOperation )
234 	{
235 		MockServiceListener[] listeners = mockServiceListeners.toArray( new MockServiceListener[mockServiceListeners.size()] );
236 		for( MockServiceListener listener : listeners )
237 		{
238 			listener.mockOperationRemoved( mockOperation );
239 		}
240 	}
241 	
242 	protected void fireMockResponseAdded( WsdlMockResponse mockResponse )
243 	{
244 		MockServiceListener[] listeners = mockServiceListeners.toArray( new MockServiceListener[mockServiceListeners.size()] );
245 		for( MockServiceListener listener : listeners )
246 		{
247 			listener.mockResponseAdded( mockResponse );
248 		}
249 	}
250 	
251 	protected void fireMockResponseRemoved( WsdlMockResponse mockResponse )
252 	{
253 		MockServiceListener[] listeners = mockServiceListeners.toArray( new MockServiceListener[mockServiceListeners.size()] );
254 		for( MockServiceListener listener : listeners )
255 		{
256 			listener.mockResponseRemoved( mockResponse );
257 		}
258 	}
259 
260 	@Override
261 	public ImageIcon getIcon()
262 	{
263 		return iconAnimator.getIcon();
264 	}
265 
266 	private class MockServiceIconAnimator extends ModelItemIconAnimator implements MockRunListener
267 	{
268 		public MockServiceIconAnimator()
269 		{
270 			super( WsdlMockService.this, "/mockService.gif", 
271 					new String[] {"/mockService_1.gif", "/mockService_2.gif",
272 						"/mockService_3.gif", "/mockService_4.gif"} );
273 		}
274 
275 		public void onMockRequest( MockRunner runner, HttpServletRequest request, HttpServletResponse response )
276 		{
277 		}
278 
279 		public void onMockResult( MockResult result )
280 		{
281 		}
282 
283 		public void onMockRunnerStart( MockRunner mockRunner )
284 		{
285 			start();
286 		}
287 
288 		public void onMockRunnerStop( MockRunner mockRunner )
289 		{
290 			stop();
291 			WsdlMockService.this.mockRunner = null; 
292 		}
293 	}
294 	
295 	public String getLocalEndpoint()
296 	{
297 		return "http://127.0.0.1:" + getPort() + getPath();
298 	}
299 
300 	public GroovyShell getScriptShell()
301 	{
302 		return shell;
303 	}
304 
305 	public boolean isRequireSoapVersion()
306 	{
307 		return getSettings().getBoolean( REQUIRE_SOAP_VERSION );
308 	}
309 	
310 	public void setRequireSoapVersion( boolean requireSoapVersion )
311 	{
312 	   getSettings().setBoolean( REQUIRE_SOAP_VERSION, requireSoapVersion );	
313 	}
314 }