View Javadoc

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