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.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 browser.release();
77 restRequest.removePropertyChangeListener( this );
78 }
79
80 private Component buildStatus()
81 {
82 statusLabel = new JLabel();
83 statusLabel.setBorder( BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );
84 return statusLabel;
85 }
86
87 private Component buildContent()
88 {
89 contentPanel = new JPanel( new BorderLayout() );
90
91 browser = new BrowserComponent( false );
92
93 HttpResponse response = restRequest.getResponse();
94 if( response != null )
95 setEditorContent( response );
96
97 Component component = browser.getComponent();
98 component.setMinimumSize( new Dimension( 100, 100 ) );
99 contentPanel.add( component );
100
101 return contentPanel;
102 }
103
104 protected void setEditorContent( HttpResponse httpResponse )
105 {
106
107 if( httpResponse != null && httpResponse.getContentType() != null )
108 {
109 String contentType = httpResponse.getContentType();
110 if( contentType.contains( "html" ) || contentType.contains( "xml" ) || contentType.contains( "text" ) )
111 {
112 try
113 {
114 browser.setContent( httpResponse.getContentAsString(), contentType, httpResponse.getURL().toURI()
115 .toString() );
116 }
117 catch( Exception e )
118 {
119 e.printStackTrace();
120 }
121 }
122 else
123 {
124 try
125 {
126 File temp = File.createTempFile( "response", ".tmp" );
127 new FileOutputStream( temp ).write( getHttpBody( httpResponse.getRawResponseData() ) );
128 browser.navigate( temp.getAbsolutePath(), null );
129 }
130 catch( FileNotFoundException e )
131 {
132 e.printStackTrace();
133 }
134 catch( IOException e )
135 {
136 e.printStackTrace();
137 }
138 }
139 }
140 else
141 {
142 browser.setContent( "<missing content>", "text/plain" );
143 }
144 }
145
146 private byte[] getHttpBody( byte[] rawResponse )
147 {
148 int index = 0;
149 byte[] divider = "\r\n\r\n".getBytes();
150 for( ; index < ( rawResponse.length - divider.length ); index++ )
151 {
152 int i;
153 for( i = 0; i < divider.length; i++ )
154 {
155 if( rawResponse[index + i] != divider[i] )
156 break;
157 }
158 if( i == divider.length )
159 {
160 byte[] data = new byte[rawResponse.length - ( index + divider.length )];
161 System.arraycopy( rawResponse, index + divider.length, data, 0, data.length );
162 return data;
163 }
164 }
165 return rawResponse;
166 }
167
168 private Component buildToolbar()
169 {
170 JXToolBar toolbar = UISupport.createToolbar();
171
172 return toolbar;
173 }
174
175 public void propertyChange( PropertyChangeEvent evt )
176 {
177 if( evt.getPropertyName().equals( AbstractHttpRequestInterface.RESPONSE_PROPERTY ) )
178 {
179 setEditorContent( ( ( HttpResponse )evt.getNewValue() ) );
180 }
181 }
182
183 @Override
184 public void setXml( String xml )
185 {
186 }
187
188 public boolean saveDocument( boolean validate )
189 {
190 return false;
191 }
192
193 public void setEditable( boolean enabled )
194 {
195 }
196
197 }