1 18 19 package org.apache.jmeter.protocol.http.gui; 20 21 import java.awt.BorderLayout ; 22 import java.awt.Dimension ; 23 import java.awt.GridBagConstraints ; 24 import java.awt.GridBagLayout ; 25 import java.awt.event.ActionEvent ; 26 import java.awt.event.ActionListener ; 27 import java.awt.event.FocusEvent ; 28 import java.awt.event.FocusListener ; 29 import java.io.File ; 30 import java.io.IOException ; 31 32 import javax.swing.BorderFactory ; 33 import javax.swing.JButton ; 34 import javax.swing.JDialog ; 35 import javax.swing.JLabel ; 36 import javax.swing.JPanel ; 37 import javax.swing.JScrollPane ; 38 import javax.swing.JTable ; 39 import javax.swing.JTextField ; 40 import javax.swing.ListSelectionModel ; 41 import javax.swing.table.AbstractTableModel ; 42 import javax.swing.table.TableCellEditor ; 43 44 import org.apache.jmeter.config.gui.AbstractConfigGui; 45 import org.apache.jmeter.gui.util.FileDialoger; 46 import org.apache.jmeter.protocol.http.control.Header; 47 import org.apache.jmeter.protocol.http.control.HeaderManager; 48 import org.apache.jmeter.testelement.TestElement; 49 import org.apache.jmeter.util.JMeterUtils; 50 import org.apache.jorphan.logging.LoggingManager; 51 import org.apache.log.Logger; 52 53 59 public class HeaderPanel 60 extends AbstractConfigGui 61 implements ActionListener , FocusListener 62 { 63 transient private static Logger log = LoggingManager.getLoggerForClass(); 64 65 private static final String ADD_COMMAND = "Add"; 66 private static final String DELETE_COMMAND = "Delete"; 67 private static final String LOAD_COMMAND = "Load"; 68 private static final String SAVE_COMMAND = "Save"; 69 70 private InnerTableModel tableModel; 71 72 75 private JTable headerTable; 76 77 private JButton addButton; 78 private JButton deleteButton; 79 private JButton loadButton; 80 private JButton saveButton; 81 82 85 public HeaderPanel() 86 { 87 tableModel = new InnerTableModel(); 88 init(); 89 } 90 91 public TestElement createTestElement() 92 { 93 HeaderManager headerManager = tableModel.manager; 94 configureTestElement(headerManager); 95 return (TestElement) headerManager.clone(); 96 } 97 98 102 public void modifyTestElement(TestElement el) 103 { 104 el.clear(); 105 el.addTestElement(tableModel.manager); 106 configureTestElement(el); 107 } 108 109 public void configure(TestElement el) 110 { 111 tableModel.manager.clear(); 112 super.configure(el); 113 tableModel.manager.addTestElement((HeaderManager) el); 114 boolean hasRows = tableModel.getRowCount() > 0; 115 deleteButton.setEnabled(hasRows); 116 saveButton.setEnabled(hasRows); 117 118 } 119 120 public String getLabelResource() 121 { 122 return "header_manager_title"; 123 } 124 125 135 136 139 public void init() 140 { 141 setLayout(new BorderLayout ()); 142 setBorder(makeBorder()); 143 144 add(makeTitlePanel(), BorderLayout.NORTH); 145 add(createHeaderTablePanel(), BorderLayout.CENTER); 146 } 147 148 public void actionPerformed(ActionEvent e) 149 { 150 String action = e.getActionCommand(); 151 152 if (action.equals("Delete")) 153 { 154 if (tableModel.getRowCount() > 0) 155 { 156 if (headerTable.isEditing()) 159 { 160 TableCellEditor cellEditor = 161 headerTable.getCellEditor( 162 headerTable.getEditingRow(), 163 headerTable.getEditingColumn()); 164 cellEditor.cancelCellEditing(); 165 } 166 167 int rowSelected = headerTable.getSelectedRow(); 168 169 if (rowSelected != -1) 170 { 171 tableModel.removeRow(rowSelected); 172 tableModel.fireTableDataChanged(); 173 174 if (tableModel.getRowCount() == 0) 177 { 178 deleteButton.setEnabled(false); 179 saveButton.setEnabled(false); 180 } 181 182 else 185 { 186 int rowToSelect = rowSelected; 187 188 if (rowSelected >= tableModel.getRowCount()) 189 { 190 rowToSelect = rowSelected - 1; 191 } 192 193 headerTable.setRowSelectionInterval( 194 rowToSelect, 195 rowToSelect); 196 } 197 } 198 } 199 } 200 else if (action.equals("Add")) 201 { 202 if (headerTable.isEditing()) 205 { 206 TableCellEditor cellEditor = 207 headerTable.getCellEditor( 208 headerTable.getEditingRow(), 209 headerTable.getEditingColumn()); 210 cellEditor.stopCellEditing(); 211 } 212 213 tableModel.addNewRow(); 214 tableModel.fireTableDataChanged(); 215 216 if (!deleteButton.isEnabled()) 219 { 220 deleteButton.setEnabled(true); 221 } 222 if (!saveButton.isEnabled()) 223 { 224 saveButton.setEnabled(true); 225 } 226 227 int rowToSelect = tableModel.getRowCount() - 1; 229 headerTable.setRowSelectionInterval(rowToSelect, rowToSelect); 230 } 231 else if (action.equals("Load")) 232 { 233 try 234 { 235 File tmp = FileDialoger.promptToOpenFile().getSelectedFile(); 236 if (tmp != null) 237 { 238 tableModel.manager.addFile(tmp.getAbsolutePath()); 239 tableModel.fireTableDataChanged(); 240 241 if (tableModel.getRowCount() > 0) 242 { 243 deleteButton.setEnabled(true); 244 saveButton.setEnabled(true); 245 } 246 } 247 } 248 catch (IOException ex) 249 { 250 log.error("", ex); 251 } 252 catch (NullPointerException err) 253 { 254 } 255 } 256 else if (action.equals("Save")) 257 { 258 try 259 { 260 File tmp = 261 FileDialoger.promptToSaveFile(null).getSelectedFile(); 262 if (tmp != null) 263 { 264 tableModel.manager.save(tmp.getAbsolutePath()); 265 } 266 } 267 catch (IOException ex) 268 { 269 log.error("", ex); 270 } 271 catch (NullPointerException err) 272 { 273 } 274 } 275 } 276 277 public JPanel createHeaderTablePanel() 278 { 279 headerTable = new JTable (tableModel); 281 headerTable.addFocusListener(this); 282 headerTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 283 headerTable.setPreferredScrollableViewportSize(new Dimension (100, 70)); 284 285 JPanel panel = new JPanel (new BorderLayout (0, 5)); 286 panel.setBorder( 287 BorderFactory.createTitledBorder( 288 BorderFactory.createEtchedBorder(), 289 JMeterUtils.getResString("headers_stored"))); 290 panel.add(new JScrollPane (headerTable), BorderLayout.CENTER); 291 panel.add(createButtonPanel(), BorderLayout.SOUTH); 292 return panel; 293 } 294 295 private JButton createButton( 296 String resName, 297 char mnemonic, 298 String command, 299 boolean enabled) 300 { 301 JButton button = new JButton (JMeterUtils.getResString(resName)); 302 button.setMnemonic(mnemonic); 303 button.setActionCommand(command); 304 button.setEnabled(enabled); 305 button.addActionListener(this); 306 return button; 307 } 308 309 private JPanel createButtonPanel() 310 { 311 boolean tableEmpty = (tableModel.getRowCount() == 0); 312 313 addButton = createButton("add", 'A', ADD_COMMAND, true); 314 deleteButton = createButton("delete", 'D', DELETE_COMMAND, !tableEmpty); 315 loadButton = createButton("load", 'L', LOAD_COMMAND, true); 316 saveButton = createButton("save", 'S', SAVE_COMMAND, !tableEmpty); 317 318 JPanel buttonPanel = new JPanel (); 319 buttonPanel.add(addButton); 320 buttonPanel.add(deleteButton); 321 buttonPanel.add(loadButton); 322 buttonPanel.add(saveButton); 323 return buttonPanel; 324 } 325 326 331 class HeaderUpdater implements ActionListener 332 { 333 JTextField nameField = new JTextField (20); 334 JTextField valueField = new JTextField (20); 335 JButton ok = new JButton ("Ok"); 336 JButton cancel = new JButton ("Cancel"); 337 int index; 338 339 JDialog updateDialog; 340 341 public HeaderUpdater() 342 { 343 } 344 345 348 public JPanel getPanel() 349 { 350 JPanel main = new JPanel (); 351 GridBagLayout g = new GridBagLayout (); 352 353 main.setLayout(g); 354 GridBagConstraints c = new GridBagConstraints (); 355 c.fill = GridBagConstraints.BOTH; 356 c.gridwidth = 1; 357 c.gridheight = 1; 358 JLabel nameLabel = 359 new JLabel (JMeterUtils.getResString("name") + ":"); 360 c.gridx = 1; 361 c.gridy = 1; 362 g.setConstraints(nameLabel, c); 363 main.add(nameLabel); 364 JLabel valueLabel = 365 new JLabel (JMeterUtils.getResString("value") + ":"); 366 c.gridx = 1; 367 c.gridy = 2; 368 g.setConstraints(valueLabel, c); 369 main.add(valueLabel); 370 371 c.gridx = 2; 372 c.gridy = 1; 373 g.setConstraints(nameField, c); 374 main.add(nameField); 375 c.gridx = 2; 376 c.gridy = 2; 377 g.setConstraints(valueField, c); 378 main.add(valueField); 379 380 JPanel buttons = new JPanel (); 381 ok.setPreferredSize(cancel.getPreferredSize()); 382 buttons.add(ok); 383 buttons.add(cancel); 384 c.gridwidth = 2; 385 c.gridx = 1; 386 c.gridy = 7; 387 g.setConstraints(buttons, c); 388 main.add(buttons); 389 390 return main; 391 } 392 393 public void actionPerformed(ActionEvent e) 394 { 395 String command = e.getActionCommand(); 396 boolean valid = true; 397 index = -1; 398 if (command.equals("Edit")) 399 { 400 index = headerTable.getSelectedRow(); 401 if (index < 0) 402 { 403 valid = false; 404 } 405 else 406 { 407 Header c = tableModel.manager.get(index); 408 nameField = new JTextField (c.getName(), 20); 409 valueField = new JTextField (c.getValue(), 20); 410 ok = new JButton ("Ok"); 411 cancel = new JButton ("Cancel"); 412 } 413 } 414 else if (command.equals("Add")) 415 { 416 nameField = new JTextField (20); 417 valueField = new JTextField (20); 418 ok = new JButton ("Ok"); 419 cancel = new JButton ("Cancel"); 420 } 421 if (valid) 422 { 423 if (updateDialog != null) 424 { 425 updateDialog.dispose(); 426 } 427 updateDialog = new JDialog (); 428 updateDialog.setSize(350, 300); 429 430 ok.addActionListener(new ActionListener () 431 { 432 public void actionPerformed(ActionEvent ev) 433 { 434 int i = index; 435 Header c = new Header(); 436 if (i >= 0) 437 { 438 c = tableModel.manager.get(index); 439 } 440 c.setName(nameField.getText()); 441 c.setValue(valueField.getText()); 442 if (i < 0) 443 { 444 tableModel.manager.add(c); 445 } 446 tableModel.fireTableDataChanged(); 447 updateDialog.dispose(); 448 } 449 }); 450 cancel.addActionListener(new ActionListener () 451 { 452 public void actionPerformed(ActionEvent ev) 453 { 454 updateDialog.dispose(); 455 } 456 }); 457 updateDialog.getContentPane().add(getPanel()); 458 updateDialog.show(); 459 } 460 } 461 } 462 463 public void focusGained(FocusEvent e) 464 { 465 } 466 467 public void focusLost(FocusEvent e) 468 { 469 try 470 { 471 headerTable.getCellEditor().stopCellEditing(); 472 } 473 catch (RuntimeException err) 474 { 475 } 476 } 477 478 481 private class InnerTableModel extends AbstractTableModel 482 { 483 HeaderManager manager; 484 485 public InnerTableModel(HeaderManager man) 486 { 487 manager = man; 488 } 489 490 public InnerTableModel() 491 { 492 manager = new HeaderManager(); 493 } 494 495 public void removeRow(int row) 496 { 497 manager.remove(row); 498 } 499 500 public void addNewRow() 501 { 502 manager.add(); 503 } 504 505 public boolean isCellEditable(int row, int column) 506 { 507 return true; 509 } 510 511 public Class getColumnClass(int column) 512 { 513 return getValueAt(0, column).getClass(); 514 } 515 516 public int getRowCount() 517 { 518 return manager.getHeaders().size(); 519 } 520 521 524 public int getColumnCount() 525 { 526 return manager.getColumnCount(); 527 } 528 529 532 public String getColumnName(int column) 533 { 534 return manager.getColumnName(column); 535 } 536 537 540 public Object getValueAt(int row, int column) 541 { 542 Header head = manager.getHeader(row); 543 if (column == 0) 544 { 545 return head.getName(); 546 } 547 else if (column == 1) 548 { 549 return head.getValue(); 550 } 551 return null; 552 } 553 554 557 public void setValueAt(Object value, int row, int column) 558 { 559 Header header = manager.getHeader(row); 560 561 if (column == 0) 562 { 563 header.setName((String ) value); 564 } 565 else if (column == 1) 566 { 567 header.setValue((String ) value); 568 } 569 } 570 571 } 572 } 573 | Popular Tags |