View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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.rest.panels.request.views.html;
14  
15  import java.awt.BorderLayout;
16  import java.awt.Component;
17  import java.awt.Dimension;
18  import java.awt.event.ActionEvent;
19  import java.beans.PropertyChangeEvent;
20  import java.beans.PropertyChangeListener;
21  
22  import javax.swing.AbstractAction;
23  import javax.swing.Action;
24  import javax.swing.JComponent;
25  import javax.swing.JLabel;
26  import javax.swing.JPanel;
27  import javax.swing.JToggleButton;
28  
29  import com.eviware.soapui.SoapUI;
30  import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
31  import com.eviware.soapui.impl.support.http.HttpRequestInterface;
32  import com.eviware.soapui.impl.support.panels.AbstractHttpXmlRequestDesktopPanel.HttpResponseDocument;
33  import com.eviware.soapui.impl.support.panels.AbstractHttpXmlRequestDesktopPanel.HttpResponseMessageEditor;
34  import com.eviware.soapui.impl.wsdl.WsdlSubmitContext;
35  import com.eviware.soapui.impl.wsdl.submit.transports.http.HttpResponse;
36  import com.eviware.soapui.impl.wsdl.support.MessageExchangeModelItem;
37  import com.eviware.soapui.model.iface.Request.SubmitException;
38  import com.eviware.soapui.support.UISupport;
39  import com.eviware.soapui.support.components.BrowserComponent;
40  import com.eviware.soapui.support.components.JXToolBar;
41  import com.eviware.soapui.support.editor.views.AbstractXmlEditorView;
42  import com.eviware.soapui.support.editor.xml.XmlEditor;
43  
44  @SuppressWarnings( "unchecked" )
45  public class HttpHtmlResponseView extends AbstractXmlEditorView<HttpResponseDocument> implements PropertyChangeListener
46  {
47  	private HttpRequestInterface<?> httpRequest;
48  	private JPanel panel;
49  	private BrowserComponent browser;
50  	private static JToggleButton recordButton;
51  	private boolean recordHttpTrafic;
52  	private MessageExchangeModelItem messageExchangeModelItem;
53  	private boolean hasResponseForRecording;
54  
55  	public boolean isRecordHttpTrafic()
56  	{
57  		return recordHttpTrafic;
58  	}
59  
60  	public void setRecordHttpTrafic( boolean recordHttpTrafic )
61  	{
62  		// no change?
63  		if( recordHttpTrafic == this.recordHttpTrafic )
64  			return;
65  
66  		if( recordHttpTrafic )
67  		{
68  			recordButton.setIcon( UISupport.createImageIcon( "/record_http_true.gif" ) );
69  			recordButton.setToolTipText( "Stop recording" );
70  			recordButton.setSelected( true );
71  			browser.setRecordingHttpHtmlResponseView( HttpHtmlResponseView.this );
72  		}
73  		else
74  		{
75  			browser.setRecordingHttpHtmlResponseView( null );
76  			recordButton.setIcon( UISupport.createImageIcon( "/record_http_false.gif" ) );
77  			recordButton.setToolTipText( "Start recording" );
78  			recordButton.setSelected( false );
79  		}
80  		this.recordHttpTrafic = recordHttpTrafic;
81  
82  	}
83  
84  	public HttpHtmlResponseView( HttpResponseMessageEditor httpRequestMessageEditor, HttpRequestInterface<?> httpRequest )
85  	{
86  		super( "HTML", httpRequestMessageEditor, HttpHtmlResponseViewFactory.VIEW_ID );
87  		this.httpRequest = httpRequest;
88  		httpRequest.addPropertyChangeListener( this );
89  	}
90  
91  	public HttpHtmlResponseView( XmlEditor xmlEditor, MessageExchangeModelItem messageExchangeModelItem )
92  	{
93  		super( "HTML", xmlEditor, HttpHtmlResponseViewFactory.VIEW_ID );
94  		this.messageExchangeModelItem = messageExchangeModelItem;
95  		this.httpRequest = ( HttpRequestInterface<?> )messageExchangeModelItem;
96  		messageExchangeModelItem.addPropertyChangeListener( this );
97  	}
98  
99  	public JComponent getComponent()
100 	{
101 		if( panel == null )
102 		{
103 			panel = new JPanel( new BorderLayout() );
104 
105 			if( SoapUI.isJXBrowserDisabled() )
106 			{
107 				panel.add( new JLabel( "Browser Component is disabled" ) );
108 			}
109 			else
110 			{
111 				browser = new BrowserComponent( false, true );
112 				Component component = browser.getComponent();
113 				component.setMinimumSize( new Dimension( 100, 100 ) );
114 				panel.add( buildToolbar(), BorderLayout.NORTH );
115 				panel.add( component, BorderLayout.CENTER );
116 
117 				HttpResponse response = httpRequest.getResponse();
118 				if( response != null )
119 					setEditorContent( response );
120 			}
121 		}
122 
123 		return panel;
124 	}
125 
126 	@Override
127 	public void release()
128 	{
129 		super.release();
130 
131 		if( browser != null )
132 			browser.release();
133 
134 		if( messageExchangeModelItem != null )
135 			messageExchangeModelItem.removePropertyChangeListener( this );
136 		else
137 			httpRequest.removePropertyChangeListener( this );
138 
139 		httpRequest = null;
140 		messageExchangeModelItem = null;
141 	}
142 
143 	protected void setEditorContent( HttpResponse httpResponse )
144 	{
145 		if( httpResponse != null )
146 		{
147 			try
148 			{
149 				browser.setContent( new String( httpResponse.getContentAsString().getBytes( "utf-8" ) ), httpResponse
150 						.getURL().toURI().toString() );
151 
152 				// browser.navigate( httpResponse.getURL().toURI().toString(),
153 				// httpResponse.getRequestContent(), null );
154 				hasResponseForRecording = true;
155 			}
156 			catch( Throwable e )
157 			{
158 				e.printStackTrace();
159 			}
160 		}
161 		else
162 		{
163 			browser.setContent( "<missing content>" );
164 			hasResponseForRecording = false;
165 		}
166 	}
167 
168 	private Component buildToolbar()
169 	{
170 		JXToolBar toolbar = UISupport.createToolbar();
171 		recordButton = new JToggleButton( new RecordHttpTraficAction() );
172 
173 		toolbar.addLabeledFixed( "Record HTTP trafic", recordButton );
174 		return toolbar;
175 	}
176 
177 	public void propertyChange( PropertyChangeEvent evt )
178 	{
179 		if( evt.getPropertyName().equals( AbstractHttpRequestInterface.RESPONSE_PROPERTY ) )
180 		{
181 			if( browser != null )
182 				setEditorContent( ( ( HttpResponse )evt.getNewValue() ) );
183 		}
184 	}
185 
186 	@Override
187 	public void setXml( String xml )
188 	{
189 	}
190 
191 	public boolean saveDocument( boolean validate )
192 	{
193 		return false;
194 	}
195 
196 	public void setEditable( boolean enabled )
197 	{
198 	}
199 
200 	private class RecordHttpTraficAction extends AbstractAction
201 	{
202 		public RecordHttpTraficAction()
203 		{
204 			putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/record_http_false.gif" ) );
205 			putValue( Action.SHORT_DESCRIPTION, "Start recording" );
206 		}
207 
208 		@Override
209 		public void actionPerformed( ActionEvent arg0 )
210 		{
211 			if( browser == null )
212 				return;
213 
214 			if( isRecordHttpTrafic() )
215 			{
216 				setRecordHttpTrafic( false );
217 			}
218 			else
219 			{
220 				if( !hasResponseForRecording )
221 				{
222 					// resubmit so we have "live" content
223 					try
224 					{
225 						getHttpRequest().submit( new WsdlSubmitContext( getHttpRequest() ), false ).waitUntilFinished();
226 					}
227 					catch( SubmitException e )
228 					{
229 						SoapUI.logError( e );
230 					}
231 				}
232 
233 				setRecordHttpTrafic( true );
234 			}
235 		}
236 	}
237 
238 	public HttpRequestInterface<?> getHttpRequest()
239 	{
240 		return httpRequest;
241 	}
242 }