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.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 }