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 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 }