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.wsdl.teststeps.actions;
14  
15  import java.awt.BorderLayout;
16  import java.awt.Component;
17  import java.awt.Dimension;
18  import java.awt.event.ActionEvent;
19  import java.util.ArrayList;
20  import java.util.Arrays;
21  import java.util.Date;
22  import java.util.List;
23  
24  import javax.swing.AbstractAction;
25  import javax.swing.JComponent;
26  import javax.swing.JLabel;
27  import javax.swing.JList;
28  import javax.swing.JPanel;
29  import javax.swing.JScrollPane;
30  import javax.swing.JTabbedPane;
31  import javax.swing.JTable;
32  import javax.swing.table.DefaultTableModel;
33  
34  import org.jdesktop.swingx.JXTable;
35  
36  import com.eviware.soapui.SoapUI;
37  import com.eviware.soapui.impl.wsdl.panels.request.StringToStringMapTableModel;
38  import com.eviware.soapui.impl.wsdl.support.MessageExchangeRequestMessageEditor;
39  import com.eviware.soapui.impl.wsdl.support.MessageExchangeResponseMessageEditor;
40  import com.eviware.soapui.model.ModelItem;
41  import com.eviware.soapui.model.iface.MessageExchange;
42  import com.eviware.soapui.model.support.ModelSupport;
43  import com.eviware.soapui.model.testsuite.AssertedXPath;
44  import com.eviware.soapui.model.testsuite.RequestAssertedMessageExchange;
45  import com.eviware.soapui.model.testsuite.ResponseAssertedMessageExchange;
46  import com.eviware.soapui.support.UISupport;
47  import com.eviware.soapui.support.types.StringToStringMap;
48  import com.eviware.soapui.ui.desktop.DesktopPanel;
49  import com.eviware.soapui.ui.support.DefaultDesktopPanel;
50  
51  /***
52   * Shows a desktop-panel with the TestStepResult for a WsdlTestRequestStepResult
53   * 
54   * @author Ole.Matzura
55   */
56  
57  public class ShowMessageExchangeAction extends AbstractAction
58  {
59  	private DefaultDesktopPanel desktopPanel;
60  	private final MessageExchange messageExchange;
61  	private final String ownerName;
62  	private MessageExchangeResponseMessageEditor responseMessageEditor;
63  	private MessageExchangeRequestMessageEditor requestMessageEditor;
64  
65  	public ShowMessageExchangeAction( MessageExchange messageExchange, String ownerName )
66  	{
67  		super( "Show Message Exchange" );
68  		this.ownerName = ownerName;
69  		this.messageExchange = messageExchange;
70  	}
71  
72  	public void actionPerformed( ActionEvent e )
73  	{
74  		try
75  		{
76  			UISupport.showDesktopPanel( buildFrame() );
77  		}
78  		catch( Exception ex )
79  		{
80  			SoapUI.logError( ex );
81  		}
82  	}
83  
84  	private DesktopPanel buildFrame()
85  	{
86  		if( desktopPanel == null )
87  		{
88  			desktopPanel = new MessageExchangeDesktopPanel( "Message Viewer", "Message for " + ownerName, buildContent() );
89  		}
90  
91  		return desktopPanel;
92  	}
93  
94  	private JComponent buildContent()
95  	{
96  		JTabbedPane messageTabs = new JTabbedPane();
97  		messageTabs.addTab( "Request Message", buildRequestTab() );
98  		messageTabs.addTab( "Response Message", buildResponseTab() );
99  		messageTabs.addTab( "Properties", buildPropertiesTab() );
100 
101 		String[] messages = messageExchange.getMessages();
102 		if( messages != null && messages.length > 0 )
103 			messageTabs.addTab( "Messages", buildMessagesTab() );
104 
105 		if( getAssertedXPaths().size() > 0 )
106 			messageTabs.addTab( "XPath Assertions", buildAssertionsTab() );
107 
108 		messageTabs.setPreferredSize( new Dimension( 500, 400 ) );
109 
110 		JPanel tabPanel = UISupport.createTabPanel( messageTabs, true );
111 
112 		Component descriptionPanel = UISupport.buildDescription( "MessageExchange Results",
113 				"See the request/response message below", null );
114 		tabPanel.add( descriptionPanel, BorderLayout.NORTH );
115 
116 		return tabPanel;
117 	}
118 
119 	private Component buildAssertionsTab()
120 	{
121 		List<AssertedXPath> assertedXPaths = getAssertedXPaths();
122 
123 		DefaultTableModel tm = new DefaultTableModel( assertedXPaths.size(), 2 );
124 		tm.setColumnIdentifiers( new String[] { "Label", "XPath" } );
125 
126 		JXTable table = new JXTable( tm );
127 		table.setHorizontalScrollEnabled( true );
128 		table.getColumn( 0 ).setPreferredWidth( 100 );
129 
130 		for( int c = 0; c < assertedXPaths.size(); c++ )
131 		{
132 			tm.setValueAt( assertedXPaths.get( c ).getLabel(), c, 0 );
133 			tm.setValueAt( assertedXPaths.get( c ).getPath(), c, 1 );
134 		}
135 
136 		return new JScrollPane( table );
137 	}
138 
139 	private List<AssertedXPath> getAssertedXPaths()
140 	{
141 		List<AssertedXPath> assertedXPaths = new ArrayList<AssertedXPath>();
142 
143 		if( messageExchange instanceof RequestAssertedMessageExchange )
144 		{
145 			AssertedXPath[] xpaths = ( ( RequestAssertedMessageExchange )messageExchange ).getAssertedXPathsForRequest();
146 			if( xpaths != null && xpaths.length > 0 )
147 			{
148 				assertedXPaths.addAll( Arrays.asList( xpaths ) );
149 			}
150 		}
151 
152 		if( messageExchange instanceof ResponseAssertedMessageExchange )
153 		{
154 			AssertedXPath[] xpaths = ( ( ResponseAssertedMessageExchange )messageExchange ).getAssertedXPathsForResponse();
155 			if( xpaths != null && xpaths.length > 0 )
156 			{
157 				assertedXPaths.addAll( Arrays.asList( xpaths ) );
158 			}
159 		}
160 		return assertedXPaths;
161 	}
162 
163 	private Component buildPropertiesTab()
164 	{
165 		StringToStringMap properties = new StringToStringMap();
166 		if( messageExchange != null && messageExchange.getProperties() != null )
167 		{
168 			properties.putAll( messageExchange.getProperties() );
169 
170 			// for( String name : messageExchange.getResponse().getPropertyNames())
171 			// {
172 			// properties.put( name, messageExchange.getResponse().getProperty(
173 			// name ) );
174 			// }
175 
176 			properties.put( "Timestamp", new Date( messageExchange.getTimestamp() ).toString() );
177 			properties.put( "Time Taken", String.valueOf( messageExchange.getTimeTaken() ) );
178 		}
179 		JTable table = new JTable( new StringToStringMapTableModel( properties, "Name", "Value", false ) );
180 		return new JScrollPane( table );
181 	}
182 
183 	private Component buildMessagesTab()
184 	{
185 		String[] messages = messageExchange.getMessages();
186 		return messages == null || messages.length == 0 ? new JLabel( "No messages to display" ) : new JScrollPane(
187 				new JList( messages ) );
188 	}
189 
190 	private Component buildResponseTab()
191 	{
192 		responseMessageEditor = new MessageExchangeResponseMessageEditor( messageExchange );
193 		return responseMessageEditor;
194 	}
195 
196 	private Component buildRequestTab()
197 	{
198 		requestMessageEditor = new MessageExchangeRequestMessageEditor( messageExchange );
199 		return requestMessageEditor;
200 	}
201 	
202 	private final class MessageExchangeDesktopPanel extends DefaultDesktopPanel
203 	{
204 		private MessageExchangeDesktopPanel( String title, String description, JComponent component )
205 		{
206 			super( title, description, component );
207 		}
208 
209 		@Override
210 		public boolean onClose( boolean canCancel )
211 		{
212 			requestMessageEditor.release();
213 			responseMessageEditor.release();
214 
215 			desktopPanel = null;
216 			
217 			return super.onClose( canCancel );
218 		}
219 
220 		@Override
221 		public boolean dependsOn( ModelItem modelItem )
222 		{
223 			return ModelSupport.dependsOn( messageExchange.getModelItem(), modelItem );
224 		}
225 	}
226 }