View Javadoc

1   /*
2    *  soapUI Pro, copyright (C) 2007-2008 eviware software ab 
3    */
4   
5   package com.eviware.soapui.impl.wsdl.actions.request;
6   
7   import com.eviware.soapui.SoapUI;
8   import com.eviware.soapui.config.CompressedStringConfig;
9   import com.eviware.soapui.config.MockResponseStepConfig;
10  import com.eviware.soapui.config.TestStepConfig;
11  import com.eviware.soapui.impl.wsdl.WsdlOperation;
12  import com.eviware.soapui.impl.wsdl.WsdlRequest;
13  import com.eviware.soapui.impl.wsdl.actions.support.AbstractAddToTestCaseAction;
14  import com.eviware.soapui.impl.wsdl.support.CompressedStringSupport;
15  import com.eviware.soapui.impl.wsdl.support.HelpUrls;
16  import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
17  import com.eviware.soapui.impl.wsdl.teststeps.WsdlMockResponseTestStep;
18  import com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.SchemaComplianceAssertion;
19  import com.eviware.soapui.impl.wsdl.teststeps.registry.WsdlMockResponseStepFactory;
20  import com.eviware.soapui.settings.WsdlSettings;
21  import com.eviware.soapui.support.UISupport;
22  import com.eviware.soapui.ui.desktop.SoapUIDesktop;
23  import com.eviware.x.form.XFormDialog;
24  import com.eviware.x.form.support.ADialogBuilder;
25  import com.eviware.x.form.support.AField;
26  import com.eviware.x.form.support.AField.AFieldType;
27  import com.eviware.x.form.support.AForm;
28  
29  public class AddRequestAsMockResponseStepAction extends AbstractAddToTestCaseAction<WsdlRequest>
30  {
31  	public static final String SOAPUI_ACTION_ID = "AddRequestAsMockResponseStepAction";
32  	private XFormDialog dialog;
33  
34  	public AddRequestAsMockResponseStepAction()
35  	{
36  		super( "Add as MockResponse Step", "Creates a MockResponseStep from this Request" );
37  	}
38  
39  	public void perform( WsdlRequest request, Object param )
40  	{
41  		WsdlTestCase testCase = getTargetTestCase( request.getOperation().getInterface().getProject() );
42  		if( testCase != null )
43  			addMockResponse( testCase, request );
44     }
45  
46  	protected boolean addMockResponse(WsdlTestCase testCase, WsdlRequest request)
47  	{
48  		String title = getName();
49  		boolean create = false;
50  
51  		if( dialog == null )
52  			dialog = ADialogBuilder.buildDialog( Form.class );
53  		
54  		WsdlOperation operation = request.getOperation();
55  		dialog.setValue( Form.STEP_NAME, operation.getName() );
56  		dialog.setBooleanValue( Form.CLOSE_REQUEST, true );
57  		dialog.setBooleanValue( Form.SHOW_TESTCASE, true );
58  		dialog.setIntValue( Form.PORT, 8181 );
59  		dialog.setValue( Form.PATH, "/" + operation.getName() );
60  		
61  		SoapUIDesktop desktop = SoapUI.getDesktop();
62  		dialog.getFormField( Form.CLOSE_REQUEST ).setEnabled( 
63  					desktop != null && desktop.hasDesktopPanel( request ));
64  		
65  		if( !dialog.show())
66  			return false;
67  
68  		TestStepConfig config = WsdlMockResponseStepFactory.createConfig( operation, request, false );
69  		MockResponseStepConfig mockResponseStepConfig = ((MockResponseStepConfig)config.getConfig());
70  
71  		config.setName( dialog.getValue( Form.STEP_NAME ) );
72  		mockResponseStepConfig.setPath( dialog.getValue( Form.PATH ) );
73  		mockResponseStepConfig.setPort( dialog.getIntValue( Form.PORT, 8181 ) );
74  		CompressedStringConfig responseContent = mockResponseStepConfig.getResponse().getResponseContent();
75  		
76  		if( request.getResponse() == null && !request.getOperation().isOneWay() )
77  		{
78  			create = UISupport.confirm( "Request is missing response, create default mock response instead?", title );
79  		}
80  		
81  		if( create )
82  		{
83  			String response = operation.createResponse( operation.getSettings().getBoolean( WsdlSettings.XML_GENERATION_ALWAYS_INCLUDE_OPTIONAL_ELEMENTS ) );
84  			CompressedStringSupport.setString( responseContent, response );
85  		}
86  		else if( request.getResponse() != null )
87  		{
88  			String response = request.getResponse().getContentAsString();
89  			CompressedStringSupport.setString( responseContent, response );
90  		}
91  		
92  		WsdlMockResponseTestStep testStep = (WsdlMockResponseTestStep) testCase.addTestStep( config );
93  
94  		if( dialog.getBooleanValue( Form.ADD_SCHEMA_ASSERTION ))
95  			testStep.addAssertion( SchemaComplianceAssertion.ID );
96  		
97  		UISupport.selectAndShow( testStep );
98  		
99  		if( dialog.getBooleanValue( Form.CLOSE_REQUEST ) && desktop != null )
100 		{
101 			desktop.closeDesktopPanel( request );
102 		}
103 		
104 		if( dialog.getBooleanValue( Form.SHOW_TESTCASE ) )
105 		{
106 			UISupport.selectAndShow( testCase );
107 		}
108 			
109 		return true;
110 	}
111 	
112 	@AForm( name="Add MockResponse to TestCase", description="Options for adding this requests response to a TestCase",
113 				helpUrl= HelpUrls.ADDREQUESTASMOCKRESPONSESTEP_HELP_URL, icon=UISupport.OPTIONS_ICON_PATH )
114 	private interface Form 
115 	{
116 		@AField( name="Name", description="Unique name of MockResponse Step")
117 		public final static String STEP_NAME = "Name";
118 
119 		@AField( name="Path", description="Path to listen on" )
120 		public final static String PATH = "Path";
121 		
122 		@AField( name="Port", description="Port to listen on", type=AFieldType.INT )
123 		public final static String PORT = "Port";
124 		
125 		@AField( name="Add Schema Assertion", description="Adds SchemaCompliance Assertion for request", type=AFieldType.BOOLEAN )
126 		public final static String ADD_SCHEMA_ASSERTION = "Add Schema Assertion";
127 
128 		@AField( name="Close Request Window", description="Closes the request editor if visible", type=AFieldType.BOOLEAN )
129 		public final static String CLOSE_REQUEST = "Close Request Window";
130 		
131 		@AField( name="Shows TestCase Editor", description="Shows the target steps TestCase editor", type=AFieldType.BOOLEAN )
132 		public final static String SHOW_TESTCASE = "Shows TestCase Editor";
133 	}
134 }