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.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  			// within same project?
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 }