1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.mockservice;
14
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.Map;
18 import java.util.Set;
19
20 import com.eviware.soapui.impl.WorkspaceImpl;
21 import com.eviware.soapui.impl.wsdl.WsdlInterface;
22 import com.eviware.soapui.impl.wsdl.WsdlOperation;
23 import com.eviware.soapui.impl.wsdl.WsdlProject;
24 import com.eviware.soapui.impl.wsdl.mock.WsdlMockService;
25 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
26 import com.eviware.soapui.model.iface.Interface;
27 import com.eviware.soapui.model.support.ModelSupport;
28 import com.eviware.soapui.support.SoapUIException;
29 import com.eviware.soapui.support.UISupport;
30 import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
31 import com.eviware.x.form.XFormDialog;
32 import com.eviware.x.form.XFormField;
33 import com.eviware.x.form.XFormFieldListener;
34 import com.eviware.x.form.support.ADialogBuilder;
35 import com.eviware.x.form.support.AField;
36 import com.eviware.x.form.support.AForm;
37 import com.eviware.x.form.support.AField.AFieldType;
38
39 /***
40 * Clones a WsdlMockService
41 *
42 * @author Ole.Matzura
43 */
44
45 public class CloneMockServiceAction extends AbstractSoapUIAction<WsdlMockService>
46 {
47 public final static String SOAPUI_ACTION_ID = "CloneMockServiceAction";
48 private XFormDialog dialog;
49
50 public CloneMockServiceAction()
51 {
52 super( "Clone MockService", "Clones this MockService" );
53 }
54
55 public void perform( WsdlMockService mockService, Object param )
56 {
57 if( dialog == null )
58 dialog = ADialogBuilder.buildDialog( Form.class );
59
60 dialog.getFormField( Form.CLONE_DESCRIPTION ).addFormFieldListener( new XFormFieldListener()
61 {
62
63 public void valueChanged( XFormField sourceField, String newValue, String oldValue )
64 {
65 if( dialog.getBooleanValue( Form.CLONE_DESCRIPTION ) )
66 {
67 dialog.getFormField( Form.DESCRIPTION ).setEnabled( false );
68 }
69 else
70 {
71 dialog.getFormField( Form.DESCRIPTION ).setEnabled( true );
72 }
73
74 }
75 } );
76 dialog.setValue( Form.NAME, "Copy of " + mockService.getName() );
77 dialog.setBooleanValue( Form.CLONE_DESCRIPTION, true );
78 dialog.getFormField( Form.DESCRIPTION ).setEnabled( false );
79 dialog.setValue( Form.DESCRIPTION, mockService.getDescription() );
80 WorkspaceImpl workspace = mockService.getProject().getWorkspace();
81 dialog.setOptions( Form.PROJECT, ModelSupport.getNames( workspace.getOpenProjectList(),
82 new String[] { "<Create New>" } ) );
83
84 dialog.setValue( Form.PROJECT, mockService.getProject().getName() );
85
86 if( dialog.show() )
87 {
88 String targetProjectName = dialog.getValue( Form.PROJECT );
89 String name = dialog.getValue( Form.NAME );
90
91 WsdlProject project = ( WsdlProject )mockService.getProject();
92 WsdlMockService clonedService = null;
93
94
95 boolean cloneDescription = dialog.getBooleanValue( Form.CLONE_DESCRIPTION );
96 String description = mockService.getDescription();
97 if( !cloneDescription )
98 {
99 description = dialog.getValue( Form.DESCRIPTION );
100 }
101 if( targetProjectName.equals( mockService.getProject().getName() ) )
102 {
103 clonedService = cloneMockServiceWithinProject( mockService, name, project, description );
104 }
105 else
106 {
107 clonedService = cloneToAnotherProject( mockService, targetProjectName, name, description );
108 }
109
110 if( clonedService != null )
111 {
112 UISupport.select( clonedService );
113 }
114
115 if( dialog.getBooleanValue( Form.MOVE ) )
116 {
117 project.removeMockService( mockService );
118 }
119 }
120 }
121
122 public WsdlMockService cloneToAnotherProject( WsdlMockService mockService, String targetProjectName, String name,
123 String description )
124 {
125 WorkspaceImpl workspace = mockService.getProject().getWorkspace();
126 WsdlProject targetProject = ( WsdlProject )workspace.getProjectByName( targetProjectName );
127 if( targetProject == null )
128 {
129 targetProjectName = UISupport.prompt( "Enter name for new Project", "Clone MockService", "" );
130 if( targetProjectName == null )
131 return null;
132
133 try
134 {
135 targetProject = workspace.createProject( targetProjectName, null );
136 }
137 catch( SoapUIException e )
138 {
139 UISupport.showErrorMessage( e );
140 }
141
142 if( targetProject == null )
143 return null;
144 }
145
146 Set<WsdlInterface> requiredInterfaces = getRequiredInterfaces( mockService, targetProject );
147
148 if( requiredInterfaces.size() > 0 )
149 {
150 String msg = "Target project [" + targetProjectName + "] is missing required interfaces;\r\n\r\n";
151 for( WsdlInterface iface : requiredInterfaces )
152 {
153 msg += iface.getName() + " [" + iface.getTechnicalId() + "]\r\n";
154 }
155 msg += "\r\nThese will be cloned to the targetProject as well";
156
157 if( !UISupport.confirm( msg, "Clone MockService" ) )
158 return null;
159
160 for( WsdlInterface iface : requiredInterfaces )
161 {
162 targetProject.importInterface( iface, false, true );
163 }
164 }
165
166 mockService = targetProject.importMockService( mockService, name, true, description );
167 UISupport.select( mockService );
168 return mockService;
169 }
170
171 public WsdlMockService cloneMockServiceWithinProject( WsdlMockService mockService, String name, WsdlProject project,
172 String description )
173 {
174 WsdlMockService newMockService = project.importMockService( mockService, name, true, description );
175 UISupport.select( newMockService );
176 return newMockService;
177 }
178
179 private Set<WsdlInterface> getRequiredInterfaces( WsdlMockService mockService, WsdlProject targetProject )
180 {
181 Set<WsdlInterface> requiredInterfaces = new HashSet<WsdlInterface>();
182
183 for( int i = 0; i < mockService.getMockOperationCount(); i++ )
184 {
185 WsdlOperation operation = mockService.getMockOperationAt( i ).getOperation();
186 if( operation != null )
187 requiredInterfaces.add( operation.getInterface() );
188 }
189
190 if( requiredInterfaces.size() > 0 && targetProject.getInterfaceCount() > 0 )
191 {
192 Map<String, WsdlInterface> bindings = new HashMap<String, WsdlInterface>();
193 for( WsdlInterface iface : requiredInterfaces )
194 {
195 bindings.put( iface.getTechnicalId(), iface );
196 }
197
198 for( Interface iface : targetProject.getInterfaceList() )
199 {
200 bindings.remove( iface.getTechnicalId() );
201 }
202
203 requiredInterfaces.retainAll( bindings.values() );
204 }
205
206 return requiredInterfaces;
207 }
208
209 @AForm( description = "Specify target Project and name of cloned MockService", name = "Clone MockService", helpUrl = HelpUrls.CLONEMOCKSERVICE_HELP_URL, icon = UISupport.TOOL_ICON_PATH )
210 public interface Form
211 {
212 @AField( name = "MockService Name", description = "The name of the cloned MockService", type = AFieldType.STRING )
213 public final static String NAME = "MockService Name";
214
215 @AField( name = "Target Project", description = "The target Project for the cloned MockService", type = AFieldType.ENUMERATION )
216 public final static String PROJECT = "Target Project";
217
218 @AField( name = "Move instead", description = "Moves the selected MockService instead of copying", type = AFieldType.BOOLEAN )
219 public final static String MOVE = "Move instead";
220
221 @AField( name = "Clone description", description = "Clones the description of selected TestCase", type = AFieldType.BOOLEAN )
222 public final static String CLONE_DESCRIPTION = "Clone description";
223
224 @AField( name = "Description", description = "Descroption of new TestCase", type = AFieldType.STRINGAREA )
225 public final static String DESCRIPTION = "Description";
226 }
227 }