1
2
3
4
5
6
7
8
9
10
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 }