View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2009 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.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 }