1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.attachments;
14
15 import java.awt.Component;
16 import java.awt.Toolkit;
17 import java.awt.datatransfer.DataFlavor;
18 import java.awt.datatransfer.Transferable;
19 import java.awt.dnd.DnDConstants;
20 import java.awt.dnd.DropTarget;
21 import java.awt.dnd.DropTargetDragEvent;
22 import java.awt.dnd.DropTargetDropEvent;
23 import java.awt.dnd.DropTargetEvent;
24 import java.awt.dnd.DropTargetListener;
25 import java.awt.event.ActionEvent;
26 import java.awt.event.MouseAdapter;
27 import java.awt.event.MouseEvent;
28 import java.beans.PropertyChangeEvent;
29 import java.beans.PropertyChangeListener;
30 import java.io.File;
31 import java.io.FileOutputStream;
32 import java.io.IOException;
33 import java.util.List;
34
35 import javax.swing.AbstractListModel;
36 import javax.swing.ComboBoxModel;
37 import javax.swing.DefaultCellEditor;
38 import javax.swing.JButton;
39 import javax.swing.JComboBox;
40 import javax.swing.JFileChooser;
41 import javax.swing.JTable;
42 import javax.swing.event.ListSelectionEvent;
43 import javax.swing.event.ListSelectionListener;
44
45 import com.eviware.soapui.SoapUI;
46 import com.eviware.soapui.impl.wsdl.WsdlAttachmentPart;
47 import com.eviware.soapui.impl.wsdl.WsdlRequest;
48 import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
49 import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
50 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
51 import com.eviware.soapui.model.iface.Attachment;
52 import com.eviware.soapui.support.Tools;
53 import com.eviware.soapui.support.UISupport;
54
55 /***
56 * AttachmentPanel for WsdlMockResponse
57 *
58 * @author ole.matzura
59 */
60
61 public class MockAttachmentPanel extends javax.swing.JPanel
62 {
63 private DropTarget dropTarget;
64 private FileTransferHandler fileTransferHandler;
65 private MockAttachmentTableModel tableModel;
66 private JFileChooser fc;
67 private final WsdlMockResponse mockOperation;
68 boolean allowChange = false;
69 boolean isResponse = false;
70 private JButton exportBtn;
71
72 /*** Creates new form FileTableList */
73 public MockAttachmentPanel(WsdlMockResponse response, boolean isResponse)
74 {
75 this.mockOperation = response;
76 this.allowChange = isResponse;
77 this.isResponse = isResponse;
78 initComponents();
79 initFileTransfer();
80 }
81
82 public void release()
83 {
84 tableModel.release();
85 if( attachmentPartCellEditor != null )
86 attachmentPartCellEditor.release();
87 }
88
89 private void initFileTransfer()
90 {
91 if (allowChange)
92 {
93 fileTransferHandler = new FileTransferHandler(tableModel);
94 fileTable.setDragEnabled(true);
95 fileTable.setTransferHandler(fileTransferHandler);
96
97 dropTarget = new DropTarget();
98 dropTarget.setActive(true);
99 try
100 {
101 dropTarget.addDropTargetListener(new DropTargetListener()
102 {
103 public void dragEnter(DropTargetDragEvent dtde)
104 {
105 }
106
107 public void dragExit(DropTargetEvent dte)
108 {
109 }
110
111 public void dragOver(DropTargetDragEvent dtde)
112 {
113 }
114
115 @SuppressWarnings("unchecked")
116 public void drop(DropTargetDropEvent dtde)
117 {
118 try
119 {
120 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
121 Transferable trans = dtde.getTransferable();
122 List<File> files = (List<File>) trans.getTransferData(DataFlavor.javaFileListFlavor);
123 for (File f : files)
124 {
125 System.out.println("Dropping file: " + f.getName());
126
127 Boolean retval = UISupport.confirmOrCancel("Cache attachment in response?", "Att Attachment");
128 if (retval == null)
129 return;
130
131 tableModel.addFile(f, retval);
132 }
133
134 }
135 catch (Exception e)
136 {
137 SoapUI.logError( e );
138 }
139 }
140
141 public void dropActionChanged(DropTargetDragEvent dtde)
142 {
143 }
144 });
145 }
146 catch (Exception e)
147 {
148 SoapUI.logError( e );
149 }
150
151 jScrollPane1.getViewport().setDropTarget(dropTarget);
152 }
153 }
154
155 private void initComponents()
156 {
157 jScrollPane1 = new javax.swing.JScrollPane();
158 tableModel = new MockAttachmentTableModel(mockOperation, isResponse);
159 fileTable = new JTable(tableModel);
160
161 if (isResponse)
162 {
163 attachmentPartCellEditor = new AttachmentPartCellEditor();
164 fileTable.getColumnModel().getColumn(3).setCellEditor(attachmentPartCellEditor);
165 }
166
167 setLayout(new java.awt.BorderLayout());
168 jScrollPane1.setViewportView(fileTable);
169
170 add(jScrollPane1, java.awt.BorderLayout.CENTER);
171
172 jPanel1 = new javax.swing.JPanel();
173
174 if (allowChange)
175 {
176 addFileBtn = new javax.swing.JButton();
177 removeBtn = new javax.swing.JButton();
178
179 addFileBtn.setText("Add file");
180 addFileBtn.addActionListener(new java.awt.event.ActionListener()
181 {
182 public void actionPerformed(java.awt.event.ActionEvent evt)
183 {
184 addFileBtnActionPerformed(evt);
185 }
186 });
187
188 jPanel1.add(addFileBtn);
189
190 removeBtn.setText("Remove selected");
191 removeBtn.setEnabled(false);
192 removeBtn.addActionListener(new java.awt.event.ActionListener()
193 {
194 public void actionPerformed(java.awt.event.ActionEvent evt)
195 {
196 removeBtnActionPerformed(evt);
197 }
198 });
199
200 jPanel1.add(removeBtn);
201 }
202
203 exportBtn = new javax.swing.JButton();
204 exportBtn.setText("Export selected");
205 exportBtn.setEnabled(false);
206 exportBtn.addActionListener(new java.awt.event.ActionListener()
207 {
208 public void actionPerformed(java.awt.event.ActionEvent evt)
209 {
210 exportBtnActionPerformed(evt);
211 }
212 });
213
214 jPanel1.add(exportBtn);
215 jPanel1.add(new JButton(new ShowOnlineHelpAction(HelpUrls.ATTACHMENTS_HELP_URL)));
216 add(jPanel1, java.awt.BorderLayout.SOUTH);
217
218 fileTable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
219 {
220 public void valueChanged(ListSelectionEvent e)
221 {
222 if( removeBtn != null )
223 removeBtn.setEnabled(fileTable.getSelectedRowCount() > 0);
224
225 exportBtn.setEnabled(fileTable.getSelectedRowCount() > 0);
226 }
227 });
228
229 fileTable.addMouseListener(new MouseAdapter()
230 {
231 public void mouseClicked(MouseEvent e)
232 {
233 if (e.getClickCount() < 2)
234 return;
235
236 int ix = fileTable.getSelectedRow();
237 if (ix == -1)
238 return;
239
240 Attachment attachment = isResponse ? mockOperation.getAttachments()[ix]
241 : mockOperation.getMockResult().getMockRequest().getRequestAttachments()[ix];
242 String url = attachment.getUrl();
243 if (url != null)
244 {
245 Tools.openURL(url);
246 }
247 else
248 {
249 Toolkit.getDefaultToolkit().beep();
250 }
251 }
252 });
253 }
254
255 protected void exportBtnActionPerformed( ActionEvent evt )
256 {
257 File file = UISupport.getFileDialogs().saveAs( this, "Export Attachment.." );
258 while( file != null && file.exists() &&
259 !UISupport.confirm( "File " + file.getName() + " exists, overwrite?", "Export Attachment" ))
260 {
261 file = UISupport.getFileDialogs().saveAs( this, "Export Attachment.." );
262 }
263
264 if( file != null )
265 {
266 Attachment attachment = tableModel.getAttachmentAt(fileTable.getSelectedRow());
267 try
268 {
269 FileOutputStream out = new FileOutputStream( file );
270 long total = Tools.writeAll( out, attachment.getInputStream() );
271 UISupport.showInfoMessage( "Written [" + total + "] bytes to " + file.getName() );
272 }
273 catch( Exception e )
274 {
275 UISupport.showErrorMessage( e );
276 }
277 }
278 }
279
280 private void addFileBtnActionPerformed(java.awt.event.ActionEvent evt)
281 {
282 if (fc == null)
283 fc = new JFileChooser();
284
285 int returnVal = fc.showOpenDialog(this);
286
287 if (returnVal == JFileChooser.APPROVE_OPTION)
288 {
289 File file = fc.getSelectedFile();
290 Boolean retval = UISupport.confirmOrCancel("Cache attachment in request?", "Att Attachment");
291 if (retval == null)
292 return;
293 try
294 {
295 tableModel.addFile(file, retval);
296 }
297 catch (IOException e)
298 {
299 UISupport.showErrorMessage(e);
300 }
301 }
302 else
303 {
304 System.out.println("Open command cancelled by user.");
305 }
306 }
307
308 private void removeBtnActionPerformed(java.awt.event.ActionEvent evt)
309 {
310 if (UISupport.confirm("Remove selected attachments?", "Remove Attachments"))
311 tableModel.removeAttachment(fileTable.getSelectedRows());
312 }
313
314
315 private javax.swing.JButton addFileBtn;
316 private JTable fileTable;
317 private javax.swing.JPanel jPanel1;
318 private javax.swing.JScrollPane jScrollPane1;
319 private javax.swing.JButton removeBtn;
320 private AttachmentPartCellEditor attachmentPartCellEditor;
321
322
323
324 private class AttachmentPartCellEditor extends DefaultCellEditor
325 {
326 public AttachmentPartCellEditor()
327 {
328 super(new JComboBox(new PartsComboBoxModel()));
329 }
330
331 public void release()
332 {
333 ((PartsComboBoxModel) ((JComboBox) editorComponent).getModel()).release();
334 }
335
336 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
337 {
338 ((PartsComboBoxModel) ((JComboBox) editorComponent).getModel()).init(tableModel.getAttachmentAt(row));
339 return super.getTableCellEditorComponent(table, value, isSelected, row, column);
340 }
341 }
342
343 private final class PartsComboBoxModel extends AbstractListModel implements ComboBoxModel, PropertyChangeListener
344 {
345 private Attachment attachment;
346 private WsdlAttachmentPart[] parts;
347
348 public PartsComboBoxModel()
349 {
350 mockOperation.addPropertyChangeListener( this );
351 }
352
353 public void release()
354 {
355 mockOperation.removePropertyChangeListener( this );
356 }
357
358 public void init(Attachment attachment)
359 {
360 System.out.println( "Initializing parts..");
361 this.attachment = attachment;
362 parts = mockOperation.getDefinedAttachmentParts();
363 }
364
365 public Object getElementAt(int index)
366 {
367 return parts == null ? null : parts[index].getName();
368 }
369
370 public int getSize()
371 {
372 return parts == null ? 0 : parts.length;
373 }
374
375 public Object getSelectedItem()
376 {
377 return attachment == null ? null : attachment.getPart();
378 }
379
380 public void setSelectedItem(Object anItem)
381 {
382 if (attachment != null)
383 attachment.setPart((String) anItem);
384 }
385
386 public void propertyChange( PropertyChangeEvent arg0 )
387 {
388 if( arg0.getPropertyName().equals( WsdlRequest.ATTACHMENTS_PROPERTY ))
389 {
390
391 if( arg0.getOldValue() == attachment && arg0.getNewValue() == null )
392 {
393 attachment = null;
394 parts = null;
395 }
396 }
397 }
398 }
399 }