protected void createJobTab(final String jobId) {
// Request Job Profile
final InternalClusterJobService jobService = ClusterManager.getInstance().getJobService();
final GridJobProfile profile = jobService.getProfile(jobId);
// Job Start Time
final long startTime = System.currentTimeMillis();
final JPanel jobPanel = new JPanel();
jobPanel.setLayout(new BorderLayout(10,10));
// Progess Panel
JPanel progressPanel = new JPanel();
progressPanel.setLayout(new BorderLayout(10,10));
progressPanel.setBorder(BorderFactory.createTitledBorder("Progress"));
jobPanel.add(progressPanel, BorderLayout.NORTH);
final JProgressBar progressBar = new JProgressBar();
progressBar.setStringPainted(true);
progressPanel.add(progressBar, BorderLayout.CENTER);
addUIElement("jobs."+jobId+".progress", progressBar); // Add to components map
// Buttons Panel
JPanel buttonsPanel = new JPanel();
jobPanel.add(buttonsPanel, BorderLayout.SOUTH);
buttonsPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
// Terminate Button
JButton terminateButton = new JButton("Terminate");
terminateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {
public void run() {
// Job Name = Class Name
String name = profile.getJob().getClass().getSimpleName();
// Request user confirmation
int option = JOptionPane.showConfirmDialog(ClusterMainUI.this,
"Are you sure to terminate GridJob "
+ name + "?",
"Nebula - Terminate GridJob",
JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.NO_OPTION) return;
// Attempt Cancel
boolean result = profile.getFuture().cancel();
// Notify results
if (result) {
JOptionPane.showMessageDialog(ClusterMainUI.this, "Grid Job '" +
name +
"terminated successfully.", "Nebula - Job Terminated",
JOptionPane.INFORMATION_MESSAGE);
}
else {
JOptionPane.showMessageDialog(ClusterMainUI.this, "Failed to terminate Grid Job '" +
name
, "Nebula - Job Termination Failed",
JOptionPane.WARNING_MESSAGE);
}
}
}).start();
}
});
buttonsPanel.add(terminateButton);
addUIElement("jobs."+jobId+".terminate", terminateButton); // Add to components map
// Close Tab Button
JButton closeButton = new JButton("Close Tab");
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
removeJobTab(jobId);
}
});
}
});
closeButton.setEnabled(false);
buttonsPanel.add(closeButton);
addUIElement("jobs."+jobId+".closetab", closeButton); // Add to components map
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new GridBagLayout());
jobPanel.add(centerPanel, BorderLayout.CENTER);
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weightx = 1.0;
/* -- Job Information -- */
JPanel jobInfoPanel = new JPanel();
jobInfoPanel.setBorder(BorderFactory.createTitledBorder("Job Information"));
jobInfoPanel.setLayout(new GridBagLayout());
c.gridy = 0;
c.ipady = 30;
centerPanel.add(jobInfoPanel, c);
GridBagConstraints c1 = new GridBagConstraints();
c1.fill = GridBagConstraints.BOTH;
c1.weightx = 1;
c1.weighty = 1;
// Name
jobInfoPanel.add(new JLabel("Name :"),c1);
JLabel jobNameLabel = new JLabel();
jobInfoPanel.add(jobNameLabel,c1);
jobNameLabel.setText(profile.getJob().getClass().getSimpleName());
addUIElement("jobs."+jobId+".job.name", jobNameLabel); // Add to components map
// Gap
jobInfoPanel.add(new JLabel(),c1);
// Type
jobInfoPanel.add(new JLabel("Type :"),c1);
JLabel jobType = new JLabel();
jobType.setText(getJobType(profile.getJob()));
jobInfoPanel.add(jobType,c1);
addUIElement("jobs."+jobId+".job.type", jobType ); // Add to components map
// Job Class Name
c1.gridy = 1;
c1.gridwidth = 1;
jobInfoPanel.add(new JLabel("GridJob Class :"),c1);
c1.gridwidth = GridBagConstraints.REMAINDER;
JLabel jobClassLabel = new JLabel();
jobClassLabel.setText(profile.getJob().getClass().getName());
jobInfoPanel.add(jobClassLabel,c1);
addUIElement("jobs."+jobId+".job.class", jobClassLabel); // Add to components map
/* -- Execution Information -- */
JPanel executionInfoPanel = new JPanel();
executionInfoPanel.setBorder(BorderFactory.createTitledBorder("Execution Statistics"));
executionInfoPanel.setLayout(new GridBagLayout());
c.gridy = 1;
c.ipady = 30;
centerPanel.add(executionInfoPanel, c);
GridBagConstraints c3 = new GridBagConstraints();
c3.weightx = 1;
c3.weighty = 1;
c3.fill = GridBagConstraints.BOTH;
// Start Time
executionInfoPanel.add(new JLabel("Job Status :"),c3);
final JLabel statusLabel = new JLabel("Initializing");
executionInfoPanel.add(statusLabel,c3);
addUIElement("jobs."+jobId+".execution.status", statusLabel); // Add to components map
// Status Update Listener
profile.getFuture().addGridJobStateListener(new GridJobStateListener() {
public void stateChanged(final GridJobState newState) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
statusLabel.setText(StringUtils.capitalize(newState.toString().toLowerCase()));
}
});
}
});
executionInfoPanel.add(new JLabel(),c3); // Space Holder
// Percent Complete
executionInfoPanel.add(new JLabel("Completed % :"),c3);
final JLabel percentLabel = new JLabel("-N/A-");
executionInfoPanel.add(percentLabel,c3);
addUIElement("jobs."+jobId+".execution.percentage", percentLabel); // Add to components map
c3.gridy = 1;
// Start Time
executionInfoPanel.add(new JLabel("Start Time :"),c3);
JLabel startTimeLabel = new JLabel(DateFormat.getInstance().format(new Date(startTime)));
executionInfoPanel.add(startTimeLabel,c3);
addUIElement("jobs."+jobId+".execution.starttime", startTimeLabel); // Add to components map
executionInfoPanel.add(new JLabel(),c3); // Space Holder
// Elapsed Time
executionInfoPanel.add(new JLabel("Elapsed Time :"),c3);
JLabel elapsedTimeLabel = new JLabel("-N/A-");
executionInfoPanel.add(elapsedTimeLabel,c3);
addUIElement("jobs."+jobId+".execution.elapsedtime", elapsedTimeLabel); // Add to components map
c3.gridy = 2;
// Tasks Deployed (Count)
executionInfoPanel.add(new JLabel("Tasks Deployed :"),c3);
JLabel tasksDeployedLabel = new JLabel("-N/A-");
executionInfoPanel.add(tasksDeployedLabel,c3);
addUIElement("jobs."+jobId+".execution.tasks", tasksDeployedLabel); // Add to components map
executionInfoPanel.add(new JLabel(),c3); // Space Holder
// Results Collected (Count)
executionInfoPanel.add(new JLabel("Results Collected :"),c3);
JLabel resultsCollectedLabel = new JLabel("-N/A-");
executionInfoPanel.add(resultsCollectedLabel,c3);
addUIElement("jobs."+jobId+".execution.results", resultsCollectedLabel); // Add to components map
c3.gridy = 3;
// Remaining Tasks (Count)
executionInfoPanel.add(new JLabel("Remaining Tasks :"),c3);
JLabel remainingTasksLabel = new JLabel("-N/A-");
executionInfoPanel.add(remainingTasksLabel,c3);
addUIElement("jobs."+jobId+".execution.remaining", remainingTasksLabel); // Add to components map
executionInfoPanel.add(new JLabel(),c3); // Space Holder
// Failed Tasks (Count)
executionInfoPanel.add(new JLabel("Failed Tasks :"),c3);
JLabel failedTasksLabel = new JLabel("-N/A-");
executionInfoPanel.add(failedTasksLabel,c3);
addUIElement("jobs."+jobId+".execution.failed", failedTasksLabel); // Add to components map
/* -- Submitter Information -- */
UUID ownerId = profile.getOwner();
GridNodeDelegate owner = ClusterManager.getInstance().getClusterRegistrationService().getGridNodeDelegate(ownerId);
JPanel ownerInfoPanel = new JPanel();
ownerInfoPanel.setBorder(BorderFactory.createTitledBorder("Owner Information"));
ownerInfoPanel.setLayout(new GridBagLayout());
c.gridy = 2;
c.ipady = 10;
centerPanel.add(ownerInfoPanel, c);
GridBagConstraints c2 = new GridBagConstraints();
c2.fill = GridBagConstraints.BOTH;
c2.weightx = 1;
c2.weighty = 1;
// Host Name
ownerInfoPanel.add(new JLabel("Host Name :"),c2);
JLabel hostNameLabel = new JLabel(owner.getProfile().getName());
ownerInfoPanel.add(hostNameLabel, c2);
addUIElement("jobs."+jobId+".owner.hostname", hostNameLabel); // Add to components map
// Gap
ownerInfoPanel.add(new JLabel(), c2);
// Host IP Address
ownerInfoPanel.add(new JLabel("Host IP :"), c2);
JLabel hostIPLabel = new JLabel(owner.getProfile().getIpAddress());
ownerInfoPanel.add(hostIPLabel,c2);
addUIElement("jobs."+jobId+".owner.hostip", hostIPLabel); // Add to components map
// Owner UUID
c2.gridy = 1;
c2.gridx = 0;
ownerInfoPanel.add(new JLabel("Owner ID :"),c2);
JLabel ownerIdLabel = new JLabel(profile.getOwner().toString());
c2.gridx = 1;
c2.gridwidth = 4;
ownerInfoPanel.add(ownerIdLabel,c2);
addUIElement("jobs."+jobId+".owner.id", ownerIdLabel); // Add to components map
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Create Tab
addUIElement("jobs." + jobId, jobPanel);
JTabbedPane tabs = getUIElement("tabs");
tabs.addTab(profile.getJob().getClass().getSimpleName(), jobPanel);
tabs.revalidate();
}
});
// Execution Information Updater Thread
new Thread(new Runnable() {
boolean initialized = false;
boolean unbounded = false;
public void run() {
// Unbounded, No Progress Supported
if ((!initialized) && profile.getJob() instanceof UnboundedGridJob<?>) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setIndeterminate(true);
progressBar.setStringPainted(false);
// Infinity Symbol
percentLabel.setText(String.valueOf('\u221e'));
}
});
initialized = true;
unbounded = true;
}
// Update Job Info
while(true) {
try {
// 500ms Interval
Thread.sleep(500);
} catch (InterruptedException e) {
log.warn("Interrupted Progress Updater Thread",e);
}
final int totalCount = profile.getTotalTasks();
final int tasksRem = profile.getTaskCount();
final int resCount = profile.getResultCount();
final int failCount = profile.getFailedCount();
showBusyIcon();
// Task Information
JLabel totalTaskLabel = getUIElement("jobs."+jobId+".execution.tasks");
totalTaskLabel.setText(String.valueOf(totalCount));
// Result Count
JLabel resCountLabel = getUIElement("jobs."+jobId+".execution.results");
resCountLabel.setText(String.valueOf(resCount));
// Remaining Task Count
JLabel remLabel = getUIElement("jobs."+jobId+".execution.remaining");
remLabel.setText(String.valueOf(tasksRem));
// Failed Task Count
JLabel failedLabel = getUIElement("jobs."+jobId+".execution.failed");
failedLabel.setText(String.valueOf(failCount));
// Elapsed Time
JLabel elapsedLabel = getUIElement("jobs."+jobId+".execution.elapsedtime");
elapsedLabel.setText(TimeUtils.timeDifference(startTime));
// Job State
final JLabel statusLabel = getUIElement("jobs."+jobId+".execution.status");
// If not in Executing Mode
if ((!profile.getFuture().isJobFinished())&&profile.getFuture().getState()!=GridJobState.EXECUTING) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Progress Bar
progressBar.setIndeterminate(true);
progressBar.setStringPainted(false);
// Status Text
String state = profile.getFuture().getState().toString();
statusLabel.setText(StringUtils.capitalize(state.toLowerCase()));
// Percentage Label
percentLabel.setText(String.valueOf('\u221e'));
}
});
}
else { // Executing Mode : Progress Information
// Job Finished, Stop
if (profile.getFuture().isJobFinished()) {
showIdleIcon();
return;
}
// Double check for status label
if (!statusLabel.getText().equalsIgnoreCase("executing")) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
String newstate = profile.getFuture().getState().toString();
statusLabel.setText(StringUtils.capitalize(newstate.toLowerCase()));
}
});
}
if (!unbounded) {
final int percentage = (int) (profile.percentage() * 100);
//final int failCount = profile.get
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// If finished at this point, do not update
if (progressBar.getValue()==100) {
return;
}
// If ProgressBar is in indeterminate
if (progressBar.isIndeterminate()) {
progressBar.setIndeterminate(false);
progressBar.setStringPainted(true);
}
// Update Progress Bar / Percent Label
progressBar.setValue(percentage);
percentLabel.setText(percentage + " %");
}
});
}
}
}
}
}).start();
// Job End Hook to Execute Job End Actions
ServiceEventsSupport.addServiceHook(new ServiceHookCallback() {
public void onServiceEvent(final ServiceMessage event) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JButton close = getUIElement("jobs."+jobId+".closetab");
JButton terminate = getUIElement("jobs."+jobId+".terminate");
terminate.setEnabled(false);
close.setEnabled(true);
JProgressBar progress = getUIElement("jobs."+jobId+".progress");
JLabel percentage = getUIElement("jobs."+jobId+".execution.percentage");
progress.setEnabled(false);
// If Successfully Finished
if (event.getType()==ServiceMessageType.JOB_END) {
if (profile.getFuture().getState()!=GridJobState.FAILED) {
// If Not Job Failed
progress.setValue(100);
percentage.setText("100 %");
}
else {