View Javadoc

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