1
2
3
4
5
6
7
8
9
10
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
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 }