View Javadoc

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