1
2
3
4
5
6
7
8
9
10
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
171
172
173
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 }