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