public GUICyJobMonitor(
     CyServiceRegistrar registrar, CyJobManagerImpl jobManager, JobStatusBar statusBar) {
   this.serviceRegistrar = registrar;
   this.jobManager = jobManager;
   this.statusBar = statusBar;
   jobManager.setJobMonitor(this);
   logger = Logger.getLogger(CyUserLog.NAME);
   statusMap = new ConcurrentHashMap<>();
   CySwingApplication swingApp = registrar.getService(CySwingApplication.class);
   dialog = new GUIJobDialog(serviceRegistrar, swingApp, statusMap, jobManager, this);
   statusBar.setDialog(dialog);
 }
  public void jobStatusChanged(CyJob job, CyJobStatus status) {
    String jobId = job.getJobId();
    Status stat = status.getStatus();
    if (statusMap.containsKey(job) && statusMap.get(job).getStatus().equals(stat)) return;

    statusMap.put(job, status);
    dialog.mapChanged();
    statusBar.updateIcon(statusMap.values());

    // Temporary - for debugging purposes
    switch (stat) {
      case FAILED:
        logger.error("JobManager: Job " + jobId + " has failed!");
        break;
      case ERROR:
        logger.error("JobManager: Job " + jobId + " has experienced an error!");
        break;

      case CANCELED:
        logger.warn("JobManager: Job " + jobId + " has been canceled!");
        break;
      case PURGED:
        logger.warn("JobManager: Job " + jobId + " has been purged!");
        break;
      case TERMINATED:
        logger.warn("JobManager: Job " + jobId + " was terminated");
        break;

      case FINISHED:
        logger.info("JobManager: Job " + jobId + " has finished");
        break;
      case SUBMITTED:
        logger.info("JobManager: Job " + jobId + " was submitted");
        break;
      case QUEUED:
        logger.info("JobManager: Job " + jobId + " has been queued");
        break;
      case RUNNING:
        logger.info("JobManager: Job " + jobId + " is running");
        break;
    }
  }
 public void updateIcon() {
   statusBar.updateIcon(statusMap.values());
 }