1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.testcase;
14
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.Map;
18 import java.util.Set;
19
20 import javax.xml.namespace.QName;
21
22 import com.eviware.soapui.SoapUI;
23 import com.eviware.soapui.impl.WorkspaceImpl;
24 import com.eviware.soapui.impl.wsdl.WsdlInterface;
25 import com.eviware.soapui.impl.wsdl.WsdlProject;
26 import com.eviware.soapui.impl.wsdl.WsdlTestSuite;
27 import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
28 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
29 import com.eviware.soapui.model.iface.Interface;
30 import com.eviware.soapui.model.project.Project;
31 import com.eviware.soapui.model.support.ModelSupport;
32 import com.eviware.soapui.support.SoapUIException;
33 import com.eviware.soapui.support.UISupport;
34 import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
35 import com.eviware.x.form.XFormDialog;
36 import com.eviware.x.form.XFormField;
37 import com.eviware.x.form.XFormFieldListener;
38 import com.eviware.x.form.support.ADialogBuilder;
39 import com.eviware.x.form.support.AField;
40 import com.eviware.x.form.support.AForm;
41 import com.eviware.x.form.support.AField.AFieldType;
42
43 /***
44 * Clones a WsdlTestSuite
45 *
46 * @author Ole.Matzura
47 */
48
49 public class CloneTestCaseAction extends AbstractSoapUIAction<WsdlTestCase>
50 {
51 private static final String CREATE_NEW_OPTION = "<Create New>";
52 private XFormDialog dialog;
53
54 public CloneTestCaseAction()
55 {
56 super( "Clone TestCase", "Clones this TestCase" );
57 }
58
59 public void perform( WsdlTestCase testCase, Object param )
60 {
61 if( dialog == null )
62 {
63 dialog = ADialogBuilder.buildDialog( Form.class );
64 dialog.getFormField( Form.PROJECT ).addFormFieldListener( new XFormFieldListener() {
65
66 public void valueChanged( XFormField sourceField, String newValue, String oldValue )
67 {
68 if( newValue.equals( CREATE_NEW_OPTION ))
69 dialog.setOptions( Form.TESTSUITE, new String[] {CREATE_NEW_OPTION} );
70 else
71 {
72 Project project = SoapUI.getWorkspace().getProjectByName( newValue );
73 dialog.setOptions( Form.TESTSUITE,
74 ModelSupport.getNames( project.getTestSuites(), new String[] {CREATE_NEW_OPTION} ));
75 }
76 }} );
77 }
78
79 dialog.setValue( Form.NAME, "Copy of " + testCase.getName() );
80 WorkspaceImpl workspace = testCase.getTestSuite().getProject().getWorkspace();
81 dialog.setOptions( Form.PROJECT,
82 ModelSupport.getNames( workspace.getProjectList(), new String[] {CREATE_NEW_OPTION} ) );
83
84 dialog.setValue( Form.PROJECT, testCase.getTestSuite().getProject().getName() );
85
86 dialog.setOptions( Form.TESTSUITE,
87 ModelSupport.getNames( testCase.getTestSuite().getProject().getTestSuites(), new String[] {CREATE_NEW_OPTION} ) );
88
89 dialog.setValue( Form.TESTSUITE, testCase.getTestSuite().getName() );
90 boolean hasLoadTests = testCase.getLoadTestCount() > 0;
91 dialog.setBooleanValue( Form.CLONE_LOADTESTS, hasLoadTests );
92 dialog.getFormField( Form.CLONE_LOADTESTS ).setEnabled( hasLoadTests );
93
94 if( dialog.show() )
95 {
96 String targetProjectName = dialog.getValue( Form.PROJECT );
97 String targetTestSuiteName = dialog.getValue( Form.TESTSUITE );
98 String name = dialog.getValue( Form.NAME );
99
100 WsdlProject project = testCase.getTestSuite().getProject();
101 WsdlTestSuite targetTestSuite = null;
102 Set<WsdlInterface> requiredInterfaces = new HashSet<WsdlInterface>();
103
104
105 if( !targetProjectName.equals( project.getName() ))
106 {
107
108 for( int y = 0; y < testCase.getTestStepCount(); y++ )
109 {
110 WsdlTestStep testStep = testCase.getTestStepAt( y );
111 requiredInterfaces.addAll( testStep.getRequiredInterfaces() );
112 }
113
114 project = ( WsdlProject ) workspace.getProjectByName( targetProjectName );
115 if( project == null )
116 {
117 targetProjectName = UISupport.prompt( "Enter name for new Project", "Clone TestCase", "" );
118 if( targetProjectName == null )
119 return;
120
121 try
122 {
123 project = workspace.createProject( targetProjectName );
124 }
125 catch( SoapUIException e )
126 {
127 UISupport.showErrorMessage( e );
128 }
129
130 if( project == null )
131 return;
132 }
133
134 if( requiredInterfaces.size() > 0 && project.getInterfaceCount() > 0 )
135 {
136 Map<QName,WsdlInterface> bindings = new HashMap<QName,WsdlInterface>();
137 for( WsdlInterface iface : requiredInterfaces )
138 {
139 bindings.put( iface.getBindingName(), iface );
140 }
141
142 for( Interface iface : project.getInterfaces() )
143 {
144 bindings.remove( iface.getBindingName() );
145 }
146
147 requiredInterfaces.retainAll( bindings.values() );
148 }
149
150 if( requiredInterfaces.size() > 0 )
151 {
152 String msg = "Target project [" + targetProjectName +"] is missing required interfaces;\r\n\r\n";
153 for( WsdlInterface iface : requiredInterfaces )
154 {
155 msg += iface.getName() + " [" + iface.getBindingName() + "]\r\n";
156 }
157 msg += "\r\nThese will be cloned to the targetProject as well";
158
159 if( !UISupport.confirm( msg, "Clone TestCase" ))
160 return;
161
162 for( WsdlInterface iface : requiredInterfaces )
163 {
164 project.importInterface( iface );
165 }
166 }
167 }
168
169 targetTestSuite = project.getTestSuiteByName( targetTestSuiteName );
170 if( targetTestSuite == null )
171 {
172 targetTestSuiteName = UISupport.prompt( "Specify name for new TestSuite", "Clone TestCase",
173 "Copy of " + testCase.getTestSuite().getName() );
174 if( targetTestSuiteName == null )
175 return;
176
177 targetTestSuite = project.addNewTestSuite( targetTestSuiteName );
178 }
179
180 WsdlTestCase newTestCase = targetTestSuite.importTestCase( testCase, name, -1, dialog.getBooleanValue( Form.CLONE_LOADTESTS ) );
181 UISupport.select( newTestCase );
182
183 if( dialog.getBooleanValue( Form.MOVE ))
184 {
185 testCase.getTestSuite().removeTestCase( testCase );
186 }
187 }
188 }
189
190 @AForm(description = "Specify target Project/TestSuite and name of cloned TestCase", name = "Clone TestCase" )
191 protected interface Form
192 {
193 @AField( name="TestCase Name", description = "The name of the cloned TestCase", type=AFieldType.STRING )
194 public final static String NAME = "TestCase Name";
195
196 @AField( name="Target TestSuite", description = "The target TestSuite for the cloned TestCase", type=AFieldType.ENUMERATION )
197 public final static String TESTSUITE = "Target TestSuite";
198
199 @AField( name="Target Project", description = "The target Project for the cloned TestCase", type=AFieldType.ENUMERATION )
200 public final static String PROJECT = "Target Project";
201
202 @AField( name="Clone LoadTests", description = "Clone contained LoadTests", type=AFieldType.BOOLEAN )
203 public final static String CLONE_LOADTESTS = "Clone LoadTests";
204
205 @AField( name="Move instead", description = "Moves the selected TestCase instead of copying", type=AFieldType.BOOLEAN )
206 public final static String MOVE = "Move instead";
207 }
208 }