1 /*****************************************************************************/ 2 /* Software Testing Automation Framework (STAF) */ 3 /* (C) Copyright IBM Corp. 2002, 2004 */ 4 /* */ 5 /* This software is licensed under the Eclipse Public License (EPL) V1.0. */ 6 /*****************************************************************************/ 7 8 package com.ibm.staf.service.stax; 9 10 import javax.swing.*; 11 import javax.swing.event.*; 12 import com.ibm.staf.*; 13 import java.util.*; 14 import java.awt.*; 15 import java.awt.event.*; 16 import java.lang.reflect.*; 17 import java.io.*; 18 19 public class STAXMonitorSubjobExtension extends JFrame 20 implements STAXMonitorExtension, 21 ActionListener, 22 MouseListener, 23 ListSelectionListener 24 { 25 JPanel fPanel; 26 STAFHandle fHandle; 27 JTable fSubjobTable; 28 STAXMonitorTableModel fSubjobTableModel; 29 STAXMonitorTableSorter fSubjobModelSorter; 30 Vector<String> fSubjobColumns; 31 Hashtable<String, Calendar> fSubjobStartTimes = 32 new Hashtable<String, Calendar>(); 33 String fStaxMachine; 34 String fStaxServiceName; 35 String fStaxMachineNickname; 36 String fJobNumber; 37 MonitorElapsedTime fElapsedTime; 38 boolean fContinueElapsedTime = true; 39 STAXMonitorFrame fMonitorFrame; 40 String fLogViewerFontName = "Dialog"; 41 String fSaveAsDirectory = null; 42 String fTitle; 43 Hashtable<String, Vector> fSubjobHashtable = 44 new Hashtable<String, Vector>(); 45 JPopupMenu fSubjobPopupMenu = new JPopupMenu(); 46 JMenuItem fSubjobStartMonitorMenuItem = new JMenuItem("Start Monitoring"); 47 JMenuItem fSubjobShowJobLogMenuItem = new JMenuItem("Display Job Log"); 48 JMenuItem fSubjobShowJobUserLogMenuItem = 49 new JMenuItem("Display Job User Log"); 50 JMenuItem fSubjobTerminateMenuItem = new JMenuItem("Terminate Job"); 51 init(STAXMonitorFrame monitorFrame, boolean newJob, String staxMachineName, String staxServiceName, String jobNumber)52 public JComponent init(STAXMonitorFrame monitorFrame, boolean newJob, 53 String staxMachineName, 54 String staxServiceName, String jobNumber) 55 throws STAFException 56 { 57 fMonitorFrame = monitorFrame; 58 fStaxMachine = staxMachineName; 59 fStaxMachineNickname = monitorFrame.getSTAXMachineNickname(); 60 fStaxServiceName = staxServiceName; 61 fJobNumber = jobNumber; 62 fLogViewerFontName = monitorFrame.getParentMonitor(). 63 getLogViewerFontName(); 64 fSaveAsDirectory = monitorFrame.getParentMonitor(). 65 getSaveAsDirectory(); 66 67 fTitle = "Sub-jobs"; 68 69 fPanel = new JPanel(); 70 fPanel.setLayout(new BorderLayout()); 71 72 try 73 { 74 fHandle = STAXMonitorUtil.getNewSTAFHandle( 75 "STAFMonitorSubjobTableExtension"); 76 } 77 catch (STAFException ex) 78 { 79 } 80 81 fSubjobColumns = new Vector<String>(); 82 fSubjobColumns.addElement("Job ID"); 83 fSubjobColumns.addElement("Job Name"); 84 fSubjobColumns.addElement("Function"); 85 fSubjobColumns.addElement("Status"); 86 fSubjobColumns.addElement("Started"); 87 fSubjobColumns.addElement("Elapsed Time"); 88 fSubjobColumns.addElement("Result"); 89 90 fSubjobTableModel = new STAXMonitorTableModel(fSubjobColumns, 0); 91 92 fSubjobModelSorter = 93 new STAXMonitorTableSorter(fSubjobTableModel, 0); 94 95 fSubjobTable = new JTable(fSubjobModelSorter); 96 fSubjobModelSorter.addMouseListenerToHeaderInTable( 97 fSubjobTable, 6); 98 fSubjobTable.setRowSelectionAllowed(true); 99 fSubjobTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 100 101 fSubjobTable.addMouseListener(this); 102 fSubjobTable.getSelectionModel().addListSelectionListener(this); 103 104 fSubjobTable.getColumnModel().getColumn(0).setCellRenderer( 105 new STAXMonitorTableCellRenderer(new Color(0, 130, 0))); 106 107 fSubjobTable.getColumnModel().getColumn(0). 108 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 109 true, new Font("Dialog", Font.BOLD, 12))); 110 111 fSubjobTable.getColumnModel().getColumn(1).setCellRenderer( 112 new STAXMonitorTableCellRenderer(Color.blue)); 113 114 fSubjobTable.getColumnModel().getColumn(1). 115 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 116 true, new Font("Dialog", Font.BOLD, 12))); 117 118 fSubjobTable.getColumnModel().getColumn(2).setCellRenderer( 119 new STAXMonitorTableCellRenderer(new Color(0, 130, 0))); 120 121 fSubjobTable.getColumnModel().getColumn(2). 122 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 123 true, new Font("Dialog", Font.BOLD, 12))); 124 125 fSubjobTable.getColumnModel().getColumn(3).setCellRenderer( 126 new STAXMonitorTableCellRenderer(new Color(0, 130, 0))); 127 128 fSubjobTable.getColumnModel().getColumn(3). 129 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 130 true, new Font("Dialog", Font.BOLD, 12))); 131 132 fSubjobTable.getColumnModel().getColumn(4).setCellRenderer( 133 new STAXMonitorTableCellRenderer(new Color(0, 130, 0))); 134 135 fSubjobTable.getColumnModel().getColumn(4). 136 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 137 true, new Font("Dialog", Font.BOLD, 12))); 138 139 fSubjobTable.getColumnModel().getColumn(5).setCellRenderer( 140 new STAXMonitorTableCellRenderer(new Color(0, 130, 0))); 141 142 fSubjobTable.getColumnModel().getColumn(5). 143 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 144 true, new Font("Dialog", Font.BOLD, 12))); 145 146 fSubjobTable.getColumnModel().getColumn(6).setCellRenderer( 147 new STAXMonitorTableCellRenderer(new Color(0, 130, 0))); 148 149 fSubjobTable.getColumnModel().getColumn(6). 150 setHeaderRenderer(new STAXMonitorTableCellRenderer(Color.black, 151 true, new Font("Dialog", Font.BOLD, 12))); 152 153 fSubjobTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 154 155 STAXMonitorUtil.sizeColumnsToFitText(fSubjobTable); 156 157 if (!newJob) 158 { 159 String listRequest = "LIST JOB " + fJobNumber + " SUBJOBS"; 160 STAFResult listResult = fHandle.submit2( 161 fStaxMachine, fStaxServiceName, listRequest); 162 163 if (listResult.rc != 0) 164 { 165 throw new STAFException( 166 listResult.rc, 167 "Request=" + listRequest + 168 "\nResult=" + listResult.result); 169 } 170 171 java.util.List subjobList = (java.util.List)listResult.resultObj; 172 Iterator iter = subjobList.iterator(); 173 174 while (iter.hasNext()) 175 { 176 Map subjobMap = (Map)iter.next(); 177 String jobID = (String)subjobMap.get("jobID"); 178 String jobName = (String)subjobMap.get("jobName"); 179 String function = (String)subjobMap.get("function"); 180 181 // startTimestamp format is YYYYMMDD-HH:MM:SS 182 String startTimestamp = 183 (String)subjobMap.get("startTimestamp"); 184 String startDate = startTimestamp.substring(0, 8); 185 String startTime = startTimestamp.substring(9); 186 187 fSubjobStartTimes.put( 188 jobID, STAXMonitorUtil.getCalendar2(startDate, startTime)); 189 190 STAFResult queryResult = fHandle.submit2( 191 fStaxMachine, fStaxServiceName, "QUERY JOB " + jobID); 192 193 String fileName = ""; 194 String fileMachine = ""; 195 String args = ""; 196 String status = "Running"; 197 198 if (queryResult.rc == 48) 199 { 200 status = "Complete"; 201 } 202 else if (queryResult.rc == 0) 203 { 204 Map jobInfoMap = (HashMap)queryResult.resultObj; 205 206 fileName = (String)jobInfoMap.get("xmlFileName"); 207 fileMachine = (String)jobInfoMap.get("fileMachine"); 208 args = (String)jobInfoMap.get("arguments"); 209 } 210 211 String elapsedTimestamp = "00:00:00"; 212 213 Object rowData[] = new Object[8]; 214 rowData[0] = new String(jobID); 215 rowData[1] = jobName; 216 rowData[2] = function; 217 rowData[3] = status; 218 rowData[4] = startTimestamp; 219 rowData[5] = elapsedTimestamp; 220 rowData[6] = ""; 221 222 fSubjobTableModel.addRow(rowData); 223 224 STAXMonitorUtil.updateRowHeights(fSubjobTable, 6); 225 STAXMonitorUtil.sizeColumnsToFitText(fSubjobTable); 226 227 STAXMonitorUtil.updateRowHeights(fSubjobTable, 6); 228 STAXMonitorUtil.sizeColumnsToFitText(fSubjobTable); 229 230 Vector<Vector<String>> subjobDataVector = 231 new Vector<Vector<String>>(); 232 233 addRow(subjobDataVector, "Job ID", jobID); 234 addRow(subjobDataVector, "Job Name", jobName); 235 addRow(subjobDataVector, "Job File", fileName); 236 237 if (!fileMachine.equals("")) 238 { 239 addRow(subjobDataVector, "Job File Machine", 240 fileMachine); 241 } 242 243 addRow(subjobDataVector, "Function", function); 244 addRow(subjobDataVector, "Function Args", args); 245 246 synchronized(fSubjobHashtable) 247 { 248 fSubjobHashtable.put("Job " + jobID + " - " + jobName, 249 subjobDataVector); 250 } 251 } 252 } 253 254 fSubjobPopupMenu.add(fSubjobStartMonitorMenuItem); 255 fSubjobStartMonitorMenuItem.addActionListener(this); 256 fSubjobPopupMenu.addSeparator(); 257 fSubjobPopupMenu.add(fSubjobShowJobLogMenuItem); 258 fSubjobShowJobLogMenuItem.addActionListener(this); 259 fSubjobPopupMenu.add(fSubjobShowJobUserLogMenuItem); 260 fSubjobShowJobUserLogMenuItem.addActionListener(this); 261 fSubjobPopupMenu.addSeparator(); 262 fSubjobPopupMenu.add(fSubjobTerminateMenuItem); 263 fSubjobTerminateMenuItem.addActionListener(this); 264 265 fElapsedTime = new MonitorElapsedTime(); 266 fElapsedTime.start(); 267 268 return fSubjobTable; 269 } 270 getNotificationEventTypes()271 public String getNotificationEventTypes() 272 { 273 return "subjob"; 274 } 275 getTitle()276 public String getTitle() 277 { 278 return fTitle; 279 } 280 getExtensionType()281 public int getExtensionType() 282 { 283 return STAXMonitorFrame.EXTENSION_ACTIVE; 284 } 285 getComponent()286 public JComponent getComponent() 287 { 288 return fSubjobTable; 289 } 290 valueChanged(ListSelectionEvent e)291 public void valueChanged(ListSelectionEvent e) 292 { 293 int selectedRow = fSubjobTable.getSelectedRow(); 294 295 if (selectedRow == -1) 296 return; 297 298 String subjobID = (String) 299 fSubjobTable.getValueAt(selectedRow, 0); 300 301 String subjobName = (String) 302 fSubjobTable.getValueAt(selectedRow, 1); 303 304 synchronized(fSubjobHashtable) 305 { 306 fMonitorFrame.updateCurrentSelection("Job " + subjobID + 307 " - " + subjobName, (Vector)fSubjobHashtable.get("Job " + 308 subjobID + " - " + subjobName)); 309 } 310 } 311 handleEvent(Map map)312 public void handleEvent(Map map) 313 { 314 String block = (String)map.get("block"); 315 316 String jobID = (String)map.get("jobID"); 317 318 String jobName = (String)map.get("jobName"); 319 320 if (jobName == null) jobName = "<N/A>"; 321 322 if (jobName.equals("")) jobName = "<N/A>"; 323 324 String function = (String)map.get("function"); 325 326 if (function == null) function = ""; 327 328 String status = (String)map.get("status"); 329 330 String jobFile = (String)map.get("jobfile"); 331 332 if (jobFile == null) jobFile = ""; 333 334 String jobFileMachine = (String)map.get("jobfilemachine"); 335 336 if (jobFileMachine == null) jobFileMachine = ""; 337 338 String functionArgs = (String)map.get("functionargs"); 339 340 if (functionArgs == null) functionArgs = ""; 341 342 String clearLogs = (String)map.get("clearlogs"); 343 344 if (clearLogs == null) clearLogs = ""; 345 346 String logTCElapsedTime = (String)map.get("logtcelapsedtime"); 347 348 if (logTCElapsedTime == null) logTCElapsedTime = ""; 349 350 String logTCNumStarts = (String)map.get("logtcnumstarts"); 351 352 if (logTCNumStarts == null) logTCNumStarts = ""; 353 354 String logTCStartStop = (String)map.get("logtcstartstop"); 355 356 if (logTCStartStop == null) logTCStartStop = ""; 357 358 String pythonOutput = (String)map.get("pythonoutput"); 359 360 if (pythonOutput == null) pythonOutput = ""; 361 362 String pythonLogLevel = (String)map.get("pythonloglevel"); 363 364 if (pythonLogLevel == null) pythonLogLevel = ""; 365 366 String invalidLogLevelAction = (String)map.get("invalidloglevelaction"); 367 368 if (invalidLogLevelAction == null) invalidLogLevelAction = ""; 369 370 String scriptFilesMachine = (String)map.get("scriptfilesmachine"); 371 372 if (scriptFilesMachine == null) scriptFilesMachine = ""; 373 374 if (status.equals("start")) 375 { 376 String startDate = (String)map.get("startdate"); 377 378 if (startDate == null) startDate = ""; 379 380 String startTime = (String)map.get("starttime"); 381 382 if (startTime == null) startTime = ""; 383 384 Object rowData[] = new Object[7]; 385 rowData[0] = jobID; 386 rowData[1] = jobName; 387 rowData[2] = function; 388 rowData[3] = "Running"; 389 rowData[4] = startDate + "-" + startTime; 390 rowData[5] = "00:00:00"; 391 rowData[6] = ""; 392 393 fSubjobTableModel.addRow(rowData); 394 395 STAXMonitorUtil.updateRowHeights(fSubjobTable, 6); 396 STAXMonitorUtil.sizeColumnsToFitText(fSubjobTable); 397 398 Vector<Vector<String>> subjobDataVector = 399 new Vector<Vector<String>>(); 400 401 addRow(subjobDataVector, "Job ID", jobID); 402 addRow(subjobDataVector, "Job Name", jobName); 403 addRow(subjobDataVector, "Clear Logs", clearLogs); 404 addRow(subjobDataVector, "Log TC Elapsed Time", logTCElapsedTime); 405 addRow(subjobDataVector, "Log TC Num Starts", logTCNumStarts); 406 addRow(subjobDataVector, "Log TC Start/Stop", logTCStartStop); 407 addRow(subjobDataVector, "Python Output", pythonOutput); 408 addRow(subjobDataVector, "Python Log Level", pythonLogLevel); 409 addRow(subjobDataVector, "Invalid Log Level Action", 410 invalidLogLevelAction); 411 addRow(subjobDataVector, "Job File", jobFile); 412 413 if (!jobFileMachine.equals("")) 414 { 415 addRow(subjobDataVector, "Job File Machine", jobFileMachine); 416 } 417 418 addRow(subjobDataVector, "Function", function); 419 addRow(subjobDataVector, "Function Args", functionArgs); 420 421 boolean endOfScripts = false; 422 int scriptIndex = 0; 423 424 while (!endOfScripts) 425 { 426 String scriptfile = (String)map.get("scriptfile" + 427 scriptIndex++); 428 429 if (scriptfile != null) 430 { 431 if (scriptIndex == 1 && !scriptFilesMachine.equals("")) 432 { 433 addRow(subjobDataVector, "Script Files Machine", 434 scriptFilesMachine); 435 } 436 437 addRow(subjobDataVector, "Script File #" + scriptIndex, 438 scriptfile); 439 } 440 else 441 { 442 endOfScripts = true; 443 } 444 } 445 446 endOfScripts = false; 447 scriptIndex = 0; 448 449 while (!endOfScripts) 450 { 451 String script = (String)map.get("script" + scriptIndex++); 452 453 if (script != null) 454 { 455 addRow(subjobDataVector, "Script #" + scriptIndex, script); 456 } 457 else 458 { 459 endOfScripts = true; 460 } 461 } 462 463 addRow(subjobDataVector, "Started", startDate + "-" + startTime); 464 addRow(subjobDataVector, "Block", block); 465 466 synchronized(fSubjobHashtable) 467 { 468 fSubjobHashtable.put("Job " + jobID + " - " + jobName, 469 subjobDataVector); 470 } 471 472 fSubjobStartTimes.put( 473 jobID, STAXMonitorUtil.getCalendar2(startDate, startTime)); 474 } 475 else if (status.equals("stop")) 476 { 477 String result = STAFMarshallingContext.formatObject( 478 map.get("result")); 479 480 Vector jobsVector = fSubjobTableModel.getDataVector(); 481 482 boolean found = false; 483 int rowIndex = -1; 484 485 for (int j = 0; j < jobsVector.size(); j++) 486 { 487 if (!found) 488 { 489 if (((Vector)(jobsVector.elementAt(j))). 490 elementAt(0).equals(jobID)) 491 { 492 found = true; 493 rowIndex = j; 494 } 495 } 496 } 497 498 if (rowIndex > -1) 499 { 500 fSubjobTableModel.setValueAt("Complete", rowIndex, 3); 501 fSubjobTableModel.setValueAt(result, rowIndex, 6); 502 } 503 504 fSubjobStartTimes.remove(jobID); 505 506 synchronized (fSubjobTable) 507 { 508 fSubjobTable.updateUI(); 509 STAXMonitorUtil.updateRowHeights(fSubjobTable, 6); 510 STAXMonitorUtil.sizeColumnsToFitText(fSubjobTable); 511 } 512 } 513 } 514 addRow(Vector<Vector<String>> vector, String name, String value)515 public void addRow(Vector<Vector<String>> vector, String name, String value) 516 { 517 Vector<String> newRow = new Vector<String>(2); 518 newRow.add(name); 519 newRow.add(value); 520 vector.add(newRow); 521 } 522 actionPerformed(ActionEvent e)523 public void actionPerformed(ActionEvent e) 524 { 525 if (e.getSource() == fSubjobStartMonitorMenuItem) 526 { 527 fSubjobPopupMenu.setVisible(false); 528 529 synchronized(fSubjobModelSorter) 530 { 531 int rowIndex = fSubjobTable.getSelectedRow(); 532 String jobNumber = (String)fSubjobTable.getValueAt(rowIndex, 0); 533 534 fMonitorFrame.getParentMonitor(). 535 monitorExistingJob(jobNumber, -1); 536 } 537 } 538 else if (e.getSource() == fSubjobShowJobLogMenuItem) 539 { 540 fSubjobPopupMenu.setVisible(false); 541 542 synchronized(fSubjobModelSorter) 543 { 544 int rowIndex = fSubjobTable.getSelectedRow(); 545 String jobNumber = 546 (String)fSubjobTable.getValueAt(rowIndex, 0); 547 548 String[] showLogParms = new String[10]; 549 showLogParms[0] = "-machine"; 550 showLogParms[1] = fStaxMachine; 551 showLogParms[2] = "-machineNickname"; 552 showLogParms[3] = fStaxMachineNickname; 553 showLogParms[4] = "-name"; 554 showLogParms[5] = fStaxServiceName.toUpperCase() + 555 "_Job_" + jobNumber; 556 showLogParms[6] = "-fontName"; 557 showLogParms[7] = fLogViewerFontName; 558 showLogParms[8] = "-saveAsDirectory"; 559 showLogParms[9] = fSaveAsDirectory; 560 561 // Pass the STAX/JobMonitor/Controller handle to the log 562 // viewer (since it won't be deleted if the Job Monitor 563 // window is closed) 564 565 STAXMonitorLogViewer logViewer = new STAXMonitorLogViewer( 566 this, fMonitorFrame.getParentMonitor().fHandle, 567 showLogParms); 568 } 569 } 570 else if (e.getSource() == fSubjobShowJobUserLogMenuItem) 571 { 572 fSubjobPopupMenu.setVisible(false); 573 574 synchronized(fSubjobModelSorter) 575 { 576 int rowIndex = fSubjobTable.getSelectedRow(); 577 String jobNumber = 578 (String)fSubjobTable.getValueAt(rowIndex, 0); 579 580 String[] showLogParms = new String[10]; 581 showLogParms[0] = "-machine"; 582 showLogParms[1] = fStaxMachine; 583 showLogParms[2] = "-machineNickname"; 584 showLogParms[3] = fStaxMachineNickname; 585 showLogParms[4] = "-name"; 586 showLogParms[5] = fStaxServiceName.toUpperCase() + 587 "_Job_" + jobNumber + "_User"; 588 showLogParms[6] = "-fontName"; 589 showLogParms[7] = fLogViewerFontName; 590 showLogParms[8] = "-saveAsDirectory"; 591 showLogParms[9] = fSaveAsDirectory; 592 593 // Pass the STAX/JobMonitor/Controller handle to the log 594 // viewer (since it won't be deleted if the Job Monitor 595 // window is closed) 596 597 STAXMonitorLogViewer logViewer = new STAXMonitorLogViewer( 598 this, fMonitorFrame.getParentMonitor().fHandle, 599 showLogParms); 600 } 601 } 602 else if (e.getSource() == fSubjobTerminateMenuItem) 603 { 604 fSubjobPopupMenu.setVisible(false); 605 606 synchronized(fSubjobModelSorter) 607 { 608 int rowIndex = fSubjobTable.getSelectedRow(); 609 String jobNumber = 610 (String)fSubjobTable.getValueAt(rowIndex, 0); 611 612 int confirmation = JOptionPane.showConfirmDialog(this, 613 "Are you certain that you want\n" + 614 "to terminate Job # " + jobNumber + " ?", 615 "Confirm Job Termination", 616 JOptionPane.YES_NO_OPTION, 617 JOptionPane.QUESTION_MESSAGE); 618 619 if (!(confirmation == JOptionPane.YES_OPTION)) 620 { 621 return; 622 } 623 624 String request = "TERMINATE JOB " + jobNumber; 625 626 STAFResult result = fHandle.submit2( 627 fStaxMachine, fStaxServiceName, request); 628 629 if (result.rc != 0) 630 { 631 STAXMonitorUtil.showErrorDialog( 632 fMonitorFrame.getParentMonitor(), 633 "An error was encountered while " + 634 "attempting to terminate jobID " + jobNumber + 635 " rc=" + result.rc + " result=" + result.result); 636 } 637 } 638 } 639 } 640 mouseClicked(MouseEvent e)641 public void mouseClicked(MouseEvent e) 642 { 643 String subjobID = (String) 644 fSubjobTable.getValueAt(fSubjobTable.getSelectedRow(), 0); 645 646 String subjobName = (String) 647 fSubjobTable.getValueAt(fSubjobTable.getSelectedRow(), 1); 648 649 synchronized(fSubjobHashtable) 650 { 651 fMonitorFrame.updateCurrentSelection("Job " + subjobID + 652 " - " + subjobName, (Vector)fSubjobHashtable.get("Job " + 653 subjobID + " - " + subjobName)); 654 } 655 } 656 mouseEntered(MouseEvent e)657 public void mouseEntered(MouseEvent e) {} mouseExited(MouseEvent e)658 public void mouseExited(MouseEvent e) {} 659 mousePressed(MouseEvent e)660 public void mousePressed(MouseEvent e) 661 { 662 displayPopup(e); 663 } 664 mouseReleased(MouseEvent e)665 public void mouseReleased(MouseEvent e) 666 { 667 displayPopup(e); 668 } 669 displayPopup(MouseEvent e)670 public void displayPopup(MouseEvent e) 671 { 672 if (e.isPopupTrigger()) 673 { 674 synchronized (fSubjobModelSorter) 675 { 676 int tableIndex = 677 fSubjobTable.rowAtPoint(new Point(e.getX(), e.getY())); 678 679 if (tableIndex > -1) 680 { 681 fSubjobTable.setRowSelectionInterval(tableIndex, 682 tableIndex); 683 684 String status = 685 (String)fSubjobTableModel.getValueAt(tableIndex, 3); 686 687 if (status.equals("Complete")) 688 { 689 fSubjobTerminateMenuItem.setEnabled(false); 690 } 691 else 692 { 693 fSubjobTerminateMenuItem.setEnabled(true); 694 } 695 696 fSubjobPopupMenu.show(e.getComponent(), e.getX(), e.getY()); 697 } 698 } 699 } 700 } 701 term()702 public void term() 703 { 704 boolean fContinueSubjobMonitor = false; 705 706 STAXMonitorUtil.freeHandle(fHandle.getHandle()); 707 } 708 709 class MonitorElapsedTime extends Thread 710 { run()711 public void run() 712 { 713 final int waitTime = fMonitorFrame.getElapsedTimeInterval(); 714 715 if (waitTime == 0) 716 return; 717 718 while (fContinueElapsedTime) 719 { 720 synchronized(fSubjobTableModel) 721 { 722 Runnable SubjobRunnable = new Runnable() 723 { 724 public void run() 725 { 726 Vector dataVector = 727 fSubjobTableModel.getDataVector(); 728 729 for (int i = 0; i < dataVector.size(); i++) 730 { 731 Vector currentRow = 732 (Vector)(dataVector.elementAt(i)); 733 734 String jobID = 735 (String)currentRow.elementAt(0); 736 737 final int row = i; 738 739 synchronized(fSubjobStartTimes) 740 { 741 Calendar SubjobStarted = 742 fSubjobStartTimes.get(jobID); 743 744 if (SubjobStarted != null) 745 { 746 fSubjobTableModel.setValueAt( 747 STAXMonitorUtil.getElapsedTime( 748 SubjobStarted), row, 5); 749 } 750 } 751 } 752 753 fSubjobTable.repaint(); 754 } 755 }; 756 757 try 758 { 759 SwingUtilities.invokeAndWait(SubjobRunnable); 760 } 761 catch (InterruptedException ex) 762 { 763 ex.printStackTrace(); 764 } 765 catch (InvocationTargetException ex) 766 { 767 ex.printStackTrace(); 768 } 769 } 770 771 try 772 { 773 Thread.sleep(waitTime); 774 } 775 catch (InterruptedException ex) 776 { 777 } 778 } 779 } 780 } 781 782 }