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 }