View Javadoc

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