View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2009 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.support.editor.views.xml.raw;
14  
15  import java.beans.PropertyChangeEvent;
16  
17  import com.eviware.soapui.impl.support.AbstractHttpRequest;
18  import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
19  import com.eviware.soapui.impl.wsdl.WsdlRequest;
20  import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
21  import com.eviware.soapui.impl.wsdl.support.MessageExchangeModelItem;
22  import com.eviware.soapui.model.ModelItem;
23  import com.eviware.soapui.model.iface.MessageExchange;
24  import com.eviware.soapui.support.editor.Editor;
25  import com.eviware.soapui.support.editor.EditorView;
26  import com.eviware.soapui.support.editor.registry.RequestEditorViewFactory;
27  import com.eviware.soapui.support.editor.registry.ResponseEditorViewFactory;
28  import com.eviware.soapui.support.editor.xml.XmlDocument;
29  import com.eviware.soapui.support.editor.xml.XmlEditor;
30  import com.eviware.soapui.support.types.StringToStringMap;
31  
32  public class RawXmlEditorFactory implements ResponseEditorViewFactory, RequestEditorViewFactory
33  {
34  	public static final String VIEW_ID = "Raw";
35  
36  	public String getViewId()
37  	{
38  		return VIEW_ID;
39  	}
40  
41  	@SuppressWarnings( "unchecked" )
42  	public EditorView<?> createResponseEditorView( Editor<?> editor, ModelItem modelItem )
43  	{
44  		if( modelItem instanceof MessageExchangeModelItem )
45  		{
46  			return new WsdlMessageExchangeResponseRawXmlEditor( ( MessageExchangeModelItem )modelItem, ( XmlEditor )editor );
47  		}
48  		else if( modelItem instanceof AbstractHttpRequestInterface<?> )
49  		{
50  			return new HttpResponseRawXmlEditor( ( AbstractHttpRequest<?> )modelItem, ( XmlEditor )editor );
51  		}
52  		else if( modelItem instanceof WsdlMockResponse )
53  		{
54  			return new WsdlMockResponseRawXmlEditor( ( WsdlMockResponse )modelItem, ( XmlEditor )editor );
55  		}
56  
57  		return null;
58  	}
59  
60  	@SuppressWarnings( "unchecked" )
61  	public EditorView<XmlDocument> createRequestEditorView( Editor<?> editor, ModelItem modelItem )
62  	{
63  		if( modelItem instanceof MessageExchangeModelItem )
64  		{
65  			return new WsdlMessageExchangeRequestRawXmlEditor( ( MessageExchangeModelItem )modelItem, ( XmlEditor )editor );
66  		}
67  		else if( modelItem instanceof AbstractHttpRequestInterface<?> )
68  		{
69  			return new HttpRequestRawXmlEditor( ( AbstractHttpRequest<?> )modelItem, ( XmlEditor )editor );
70  		}
71  		else if( modelItem instanceof WsdlMockResponse )
72  		{
73  			return new WsdlMockRequestRawXmlEditor( ( WsdlMockResponse )modelItem, ( XmlEditor )editor );
74  		}
75  
76  		return null;
77  	}
78  
79  	private static class HttpRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
80  	{
81  		private final AbstractHttpRequest<?> request;
82  
83  		public HttpRequestRawXmlEditor( AbstractHttpRequest<?> request, XmlEditor<XmlDocument> editor )
84  		{
85  			super( "Raw", editor, "The actual content of the last submitted request" );
86  			this.request = request;
87  
88  			request.addPropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
89  		}
90  
91  		@Override
92  		public void propertyChange( PropertyChangeEvent evt )
93  		{
94  			if( evt.getPropertyName().equals( WsdlRequest.RESPONSE_PROPERTY ) )
95  			{
96  				setXml( "" );
97  			}
98  		}
99  
100 		@Override
101 		public String getContent()
102 		{
103 			if( request.getResponse() == null || request.getResponse().getRawRequestData() == null )
104 				return "";
105 			else
106 				return new String( request.getResponse().getRawRequestData() );
107 		}
108 
109 		@Override
110 		public void release()
111 		{
112 			request.removePropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
113 			super.release();
114 		}
115 	}
116 
117 	private static class HttpResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
118 	{
119 		private final AbstractHttpRequest<?> request;
120 
121 		public HttpResponseRawXmlEditor( AbstractHttpRequest<?> request, XmlEditor<XmlDocument> editor )
122 		{
123 			super( "Raw", editor, "The actual content of the last received response" );
124 			this.request = request;
125 
126 			request.addPropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
127 		}
128 
129 		@Override
130 		public void propertyChange( PropertyChangeEvent evt )
131 		{
132 			if( evt.getPropertyName().equals( WsdlRequest.RESPONSE_PROPERTY ) )
133 			{
134 				setXml( "" );
135 			}
136 		}
137 
138 		@Override
139 		public String getContent()
140 		{
141 			if( request.getResponse() == null )
142 				return "<missing response>";
143 
144 			return new String( request.getResponse().getRawResponseData() );
145 		}
146 
147 		@Override
148 		public void release()
149 		{
150 			request.removePropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
151 			super.release();
152 		}
153 	}
154 
155 	private static class WsdlMockRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
156 	{
157 		private final WsdlMockResponse request;
158 
159 		public WsdlMockRequestRawXmlEditor( WsdlMockResponse response, XmlEditor<XmlDocument> editor )
160 		{
161 			super( "Raw", editor, "The actual content of the last received mock request" );
162 			this.request = response;
163 
164 			response.addPropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
165 		}
166 
167 		@Override
168 		public void propertyChange( PropertyChangeEvent evt )
169 		{
170 			if( evt.getPropertyName().equals( WsdlMockResponse.MOCKRESULT_PROPERTY ) )
171 			{
172 				setXml( "" );
173 			}
174 		}
175 
176 		@Override
177 		public String getContent()
178 		{
179 			if( request.getMockResult() == null )
180 				return "<missing request>";
181 
182 			return buildRawContent( request.getMockResult().getMockRequest().getRequestHeaders(), request.getMockResult()
183 					.getMockRequest().getRawRequestData() );
184 		}
185 
186 		@Override
187 		public void release()
188 		{
189 			request.removePropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
190 			super.release();
191 		}
192 	}
193 
194 	private static class WsdlMockResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
195 	{
196 		private final WsdlMockResponse request;
197 
198 		public WsdlMockResponseRawXmlEditor( WsdlMockResponse response, XmlEditor<XmlDocument> editor )
199 		{
200 			super( "Raw", editor, "The actual content of the last returned Mock Response" );
201 			this.request = response;
202 
203 			response.addPropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
204 		}
205 
206 		@Override
207 		public void propertyChange( PropertyChangeEvent evt )
208 		{
209 			if( evt.getPropertyName().equals( WsdlMockResponse.MOCKRESULT_PROPERTY ) )
210 			{
211 				setXml( "" );
212 			}
213 		}
214 
215 		@Override
216 		public String getContent()
217 		{
218 			if( request.getMockResult() == null )
219 				return "<missing response>";
220 
221 			StringToStringMap headers = request.getMockResult().getResponseHeaders();
222 			byte[] data = request.getMockResult().getRawResponseData();
223 
224 			return buildRawContent( headers, data );
225 		}
226 
227 		@Override
228 		public void release()
229 		{
230 			request.removePropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
231 			super.release();
232 		}
233 	}
234 
235 	private static String buildRawContent( StringToStringMap headers, byte[] data )
236 	{
237 		StringBuffer result = new StringBuffer();
238 		String status = headers.get( "#status#" );
239 		if( status != null )
240 			result.append( status ).append( '\n' );
241 
242 		for( String header : headers.keySet() )
243 		{
244 			if( header.equals( "#status#" ) )
245 				continue;
246 
247 			result.append( header ).append( ": " ).append( headers.get( header ) ).append( '\n' );
248 		}
249 		result.append( '\n' );
250 
251 		if( data != null )
252 			result.append( new String( data ).trim() );
253 
254 		return result.toString().trim();
255 	}
256 
257 	private static class WsdlMessageExchangeResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
258 	{
259 		private final MessageExchangeModelItem response;
260 
261 		public WsdlMessageExchangeResponseRawXmlEditor( MessageExchangeModelItem response, XmlEditor<XmlDocument> editor )
262 		{
263 			super( "Raw", editor, "The raw response data" );
264 			this.response = response;
265 		}
266 
267 		@Override
268 		public String getContent()
269 		{
270 			MessageExchange me = response.getMessageExchange();
271 			return me == null || me.getRawResponseData() == null ? "" : new String( me.getRawResponseData() );
272 		}
273 	}
274 
275 	private static class WsdlMessageExchangeRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
276 	{
277 		private final MessageExchangeModelItem request;
278 
279 		public WsdlMessageExchangeRequestRawXmlEditor( MessageExchangeModelItem request, XmlEditor<XmlDocument> editor )
280 		{
281 			super( "Raw", editor, "The raw request data" );
282 			this.request = request;
283 		}
284 
285 		@Override
286 		public String getContent()
287 		{
288 			MessageExchange me = request.getMessageExchange();
289 			return me == null || me.getRawRequestData() == null ? "" : new String( me.getRawRequestData() );
290 		}
291 	}
292 }