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