View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 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.mockoperation;
14  
15  import java.awt.event.ActionEvent;
16  import java.util.ArrayList;
17  import java.util.List;
18  
19  import com.eviware.soapui.config.DispatchStyleConfig;
20  import com.eviware.soapui.impl.WsdlInterfaceFactory;
21  import com.eviware.soapui.impl.support.AbstractInterface;
22  import com.eviware.soapui.impl.wsdl.WsdlInterface;
23  import com.eviware.soapui.impl.wsdl.WsdlOperation;
24  import com.eviware.soapui.impl.wsdl.WsdlProject;
25  import com.eviware.soapui.impl.wsdl.actions.iface.AbstractSwingAction;
26  import com.eviware.soapui.impl.wsdl.mock.WsdlMockOperation;
27  import com.eviware.soapui.impl.wsdl.mock.WsdlMockResult;
28  import com.eviware.soapui.impl.wsdl.support.HelpUrls;
29  import com.eviware.soapui.model.iface.Interface;
30  import com.eviware.soapui.model.iface.Operation;
31  import com.eviware.soapui.model.mock.MockResponse;
32  import com.eviware.soapui.model.util.ModelItemNames;
33  import com.eviware.soapui.support.UISupport;
34  import com.eviware.soapui.support.action.swing.DefaultActionList;
35  import com.eviware.soapui.support.xml.XmlUtils;
36  import com.eviware.x.form.XFormDialog;
37  import com.eviware.x.form.XFormField;
38  import com.eviware.x.form.XFormFieldListener;
39  import com.eviware.x.form.support.ADialogBuilder;
40  import com.eviware.x.form.support.AField;
41  import com.eviware.x.form.support.AForm;
42  import com.eviware.x.form.support.AField.AFieldType;
43  
44  /***
45   * Displays the options for the specified WsdlMockOperation
46   * 
47   * @author ole.matzura
48   */
49  
50  public class WsdlMockOperationOptionsAction extends AbstractSwingAction<WsdlMockOperation>
51  {
52  	private XFormDialog dialog;
53  	private DefineNamespacesAction defineNamespacesAction;
54  	private WsdlProject project;
55  
56  	public WsdlMockOperationOptionsAction( WsdlMockOperation mockOperation )
57  	{
58  		super( "MockOperation Options", "Sets options for this MockOperation", mockOperation );
59  		
60  		project = mockOperation.getMockService().getProject();
61  	}
62  	
63  	@Override
64  	public void actionPerformed( ActionEvent arg0, WsdlMockOperation mockOperation )
65  	{
66  		if( mockOperation.getOperation() == null )
67  		{
68  			UISupport.showErrorMessage( "Missing operation for this mock response" );
69  			return;
70  		}
71  		
72  		if( dialog == null )
73  		{
74  			DefaultActionList actions = new DefaultActionList();
75  			defineNamespacesAction = new DefineNamespacesAction( mockOperation );
76  			actions.addAction( defineNamespacesAction  );
77  			
78  			dialog = ADialogBuilder.buildDialog( Form.class, actions );
79  			dialog.getFormField( Form.DISPATCH_STYLE ).addFormFieldListener( new XFormFieldListener() {
80  
81  				public void valueChanged( XFormField sourceField, String newValue, String oldValue )
82  				{
83  					boolean enabled = newValue.equals( "XPATH" ) || newValue.equals( "SCRIPT" );
84  					
85  					enableXPathFields( enabled );
86  					defineNamespacesAction.setEnabled( enabled);
87  				}} );
88  			
89  			dialog.getFormField( Form.INTERFACE ).addFormFieldListener( new XFormFieldListener() {
90  
91  				public void valueChanged( XFormField sourceField, String newValue, String oldValue )
92  				{
93  					WsdlInterface iface = (WsdlInterface) project.getInterfaceByName( newValue );
94  					dialog.setOptions( Form.OPERATION,  
95  								new ModelItemNames<Operation>( iface.getOperationList() ).getNames() );
96  				}} );
97  		}
98  
99  		List<Interface> interfaces = new ArrayList<Interface>();
100 		for( int c = 0; c < project.getInterfaceCount(); c++ )
101 		{
102 			AbstractInterface<?> iface = project.getInterfaceAt( c );
103 			if( iface.getInterfaceType().equals(WsdlInterfaceFactory.WSDL_TYPE) && iface.getOperationCount() > 0 )
104 				interfaces.add( iface);
105 		}
106 		
107 		dialog.setOptions( Form.INTERFACE, new ModelItemNames<Interface>( interfaces ).getNames() );
108 		dialog.setOptions( Form.OPERATION,  
109 					new ModelItemNames<Operation>( interfaces.get( 0 ).getOperationList() ).getNames() );
110 
111 		dialog.setValue( Form.INTERFACE, mockOperation.getOperation().getInterface().getName() );
112 		dialog.setValue( Form.OPERATION, mockOperation.getOperation().getName() );
113 		
114 		dialog.setOptions( Form.DEFAULT_RESPONSE, 
115 					new ModelItemNames<MockResponse>( mockOperation.getMockResponses() ).getNames() );
116 		
117 		dialog.setValue( Form.DISPATCH_STYLE, mockOperation.getDispatchStyle().toString() );
118 		dialog.setValue( Form.DISPATCH_PATH, mockOperation.getDispatchPath() );
119 		dialog.setValue( Form.DEFAULT_RESPONSE, mockOperation.getDefaultResponse() );
120 		
121 		enableXPathFields( dialog.getValue( Form.DISPATCH_STYLE ).equals( "XPATH" ) ||
122 					dialog.getValue( Form.DISPATCH_STYLE ).equals( "SCRIPT" ));
123 		
124 		if( dialog.show() )
125 		{
126 			mockOperation.setDispatchStyle( 
127 						DispatchStyleConfig.Enum.forString( dialog.getValue( Form.DISPATCH_STYLE )) );
128 			mockOperation.setDispatchPath( dialog.getValue( Form.DISPATCH_PATH ));
129 			mockOperation.setDefaultResponse( dialog.getValue( Form.DEFAULT_RESPONSE ) );
130 			
131 			WsdlInterface iface = (WsdlInterface) project.getInterfaceByName( dialog.getValue( Form.INTERFACE ) );
132 			WsdlOperation operation = iface.getOperationByName( dialog.getValue( Form.OPERATION ) );
133 			
134 			if( operation != mockOperation.getOperation() )
135 				mockOperation.setOperation( operation );
136 		}
137 	}
138 	
139 	private void enableXPathFields( boolean enabled )
140 	{
141 		dialog.getFormField( Form.DISPATCH_PATH ).setEnabled( enabled);
142 		dialog.getFormField( Form.DEFAULT_RESPONSE ).setEnabled( enabled);
143 		defineNamespacesAction.setEnabled( enabled );
144 	}
145 
146 	@AForm(description="Set options for this MockOperation", name="MockOperation Options",
147 			 helpUrl=HelpUrls.MOCKOPERATIONOPTIONS_HELP_URL, icon=UISupport.OPTIONS_ICON_PATH)
148 	private class Form
149 	{
150 		@AField(description = "Specifies the operation to be mocked", name = "Operation", type = AFieldType.ENUMERATION)
151 		public final static String OPERATION = "Operation";
152 		
153 		@AField(description = "Specifies the interface containing the operation to be mocked", name = "Interface", type = AFieldType.ENUMERATION)
154 		public final static String INTERFACE = "Interface";
155 		
156 		@AField(description="How to dispatch requests to responses", name="Dispatch Style", 
157 					type=AFieldType.ENUMERATION, values= {"SEQUENCE", "RANDOM", "XPATH", "SCRIPT" })
158 		public final static String DISPATCH_STYLE = "Dispatch Style";
159 		
160 		@AField(description="The XPath to use for selecting the corresponding response", name="Dispatch Path",
161 					type=AFieldType.STRINGAREA)
162 		public final static String DISPATCH_PATH = "Dispatch Path";
163 		
164 		@AField(description="Default response to use", name="Default Response", 
165 					type=AFieldType.ENUMERATION )
166 		public final static String DEFAULT_RESPONSE = "Default Response";
167 	}
168 	
169 	public class DefineNamespacesAction extends AbstractSwingAction<WsdlMockOperation>
170 	{
171 		public DefineNamespacesAction( WsdlMockOperation mockOperation )
172 		{
173 			super( "Define Namespaces", "Defines namespaces from last Mock Request", mockOperation );
174 		}
175 
176 		@Override
177 		public void actionPerformed( ActionEvent arg0, WsdlMockOperation mockOperation )
178 		{
179 			WsdlMockResult result = mockOperation.getLastMockResult();
180 			if( result == null || result.getMockRequest() == null )
181 			{
182 				UISupport.showErrorMessage( "Missing request to define from" );
183 			}
184 			else
185 			{
186 				try
187 				{
188 					String ns = XmlUtils.declareXPathNamespaces( result.getMockRequest().getRequestContent() );
189 					if( ns != null )
190 					{
191 						ns += dialog.getValue( Form.DISPATCH_PATH );
192 						dialog.setValue( Form.DISPATCH_PATH, ns );
193 					}
194 				}
195 				catch( Exception e )
196 				{
197 					UISupport.showErrorMessage( e );
198 				}
199 			}	
200 		}
201 	}
202 }