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.beans.PropertyChangeEvent;
19 import java.beans.PropertyChangeListener;
20 import java.io.File;
21 import java.io.FileNotFoundException;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24
25 import javax.swing.BorderFactory;
26 import javax.swing.JComponent;
27 import javax.swing.JLabel;
28 import javax.swing.JPanel;
29
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.submit.transports.http.HttpResponse;
35 import com.eviware.soapui.support.UISupport;
36 import com.eviware.soapui.support.components.BrowserComponent;
37 import com.eviware.soapui.support.components.JXToolBar;
38 import com.eviware.soapui.support.editor.inspectors.attachments.ContentTypeHandler;
39 import com.eviware.soapui.support.editor.views.AbstractXmlEditorView;
40
41 @SuppressWarnings( "unchecked" )
42 public class HttpHtmlResponseView extends AbstractXmlEditorView<HttpResponseDocument> implements PropertyChangeListener
43 {
44 private final HttpRequestInterface<?> restRequest;
45 private JPanel contentPanel;
46 private JPanel panel;
47 private JLabel statusLabel;
48 private BrowserComponent browser;
49
50 public HttpHtmlResponseView( HttpResponseMessageEditor httpRequestMessageEditor, HttpRequestInterface<?> httpRequest )
51 {
52 super( "HTML", httpRequestMessageEditor, HttpHtmlResponseViewFactory.VIEW_ID );
53 this.restRequest = httpRequest;
54
55 httpRequest.addPropertyChangeListener( this );
56 }
57
58 public JComponent getComponent()
59 {
60 if( panel == null )
61 {
62 panel = new JPanel( new BorderLayout() );
63
64 panel.add( buildToolbar(), BorderLayout.NORTH );
65 panel.add( buildContent(), BorderLayout.CENTER );
66 panel.add( buildStatus(), BorderLayout.SOUTH );
67 }
68
69 return panel;
70 }
71
72 @Override
73 public void release()
74 {
75 super.release();
76
77 if( browser != null )
78 browser.release();
79
80 restRequest.removePropertyChangeListener( this );
81 }
82
83 private Component buildStatus()
84 {
85 statusLabel = new JLabel();
86 statusLabel.setBorder( BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );
87 return statusLabel;
88 }
89
90 private Component buildContent()
91 {
92 contentPanel = new JPanel( new BorderLayout() );
93
94 if( BrowserComponent.isJXBrowserDisabled() )
95 {
96 contentPanel.add( new JLabel( "Browser Component is disabled" ));
97 }
98 else
99 {
100 browser = new BrowserComponent( false );
101
102 HttpResponse response = restRequest.getResponse();
103 if( response != null )
104 setEditorContent( response );
105
106 Component component = browser.getComponent();
107 component.setMinimumSize( new Dimension( 100, 100 ) );
108 contentPanel.add( component );
109 }
110 return contentPanel;
111 }
112
113 protected void setEditorContent( HttpResponse httpResponse )
114 {
115
116 if( httpResponse != null && httpResponse.getContentType() != null )
117 {
118 String contentType = httpResponse.getContentType();
119 if( contentType.contains( "html" ) || contentType.contains( "xml" ) || contentType.contains( "text" ) )
120 {
121 try
122 {
123 browser.setContent( httpResponse.getContentAsString(), contentType, httpResponse.getURL().toURI()
124 .toString() );
125 }
126 catch( Exception e )
127 {
128 e.printStackTrace();
129 }
130 }
131 else
132 {
133 try
134 {
135 String ext = ContentTypeHandler.getExtensionForContentType( contentType );
136 File temp = File.createTempFile( "response", "." + ext );
137 FileOutputStream fileOutputStream = new FileOutputStream( temp );
138 writeHttpBody( httpResponse.getRawResponseData(), fileOutputStream );
139 fileOutputStream.close();
140 browser.navigate( temp.getAbsolutePath(), null );
141 temp.deleteOnExit();
142 }
143 catch( FileNotFoundException e )
144 {
145 e.printStackTrace();
146 }
147 catch( IOException e )
148 {
149 e.printStackTrace();
150 }
151 }
152 }
153 else
154 {
155 browser.setContent( "<missing content>", "text/plain" );
156 }
157 }
158
159 private void writeHttpBody( byte[] rawResponse, FileOutputStream out ) throws IOException
160 {
161 int index = 0;
162 byte[] divider = "\r\n\r\n".getBytes();
163 for( ; index < ( rawResponse.length - divider.length ); index++ )
164 {
165 int i;
166 for( i = 0; i < divider.length; i++ )
167 {
168 if( rawResponse[index + i] != divider[i] )
169 break;
170 }
171
172 if( i == divider.length )
173 {
174 out.write( rawResponse, index + divider.length, rawResponse.length - ( index + divider.length ) );
175 }
176 }
177
178 out.write( rawResponse );
179 }
180
181 private Component buildToolbar()
182 {
183 JXToolBar toolbar = UISupport.createToolbar();
184
185 return toolbar;
186 }
187
188 public void propertyChange( PropertyChangeEvent evt )
189 {
190 if( evt.getPropertyName().equals( AbstractHttpRequestInterface.RESPONSE_PROPERTY ) )
191 {
192 if( browser != null )
193 setEditorContent( ( ( HttpResponse )evt.getNewValue() ) );
194 }
195 }
196
197 @Override
198 public void setXml( String xml )
199 {
200 }
201
202 public boolean saveDocument( boolean validate )
203 {
204 return false;
205 }
206
207 public void setEditable( boolean enabled )
208 {
209 }
210
211 }