public boolean open(Node jobNode, String fname, boolean importfile) {
    Spoon spoon = Spoon.getInstance();
    try {
      // Call extension point(s) before the file has been opened
      ExtensionPointHandler.callExtensionPoint(
          spoon.getLog(), KettleExtensionPoint.JobBeforeOpen.id, fname);

      JobMeta jobMeta = new JobMeta();
      jobMeta.loadXML(jobNode, fname, spoon.getRepository(), spoon.getMetaStore(), false, spoon);
      jobMeta.setRepositoryDirectory(spoon.getDefaultSaveLocation(jobMeta));
      jobMeta.setRepository(spoon.getRepository());
      jobMeta.setMetaStore(spoon.getMetaStore());
      spoon.setJobMetaVariables(jobMeta);
      spoon.getProperties().addLastFile(LastUsedFile.FILE_TYPE_JOB, fname, null, false, null);
      spoon.addMenuLast();

      // If we are importing into a repository we need to fix
      // up the references to other jobs and transformations
      // if any exist.
      if (importfile) {
        if (spoon.getRepository() != null) {
          jobMeta = fixLinks(jobMeta);
        }
      } else {
        jobMeta.clearChanged();
      }

      jobMeta.setFilename(fname);
      spoon.delegates.jobs.addJobGraph(jobMeta);

      // Call extension point(s) now that the file has been opened
      ExtensionPointHandler.callExtensionPoint(
          spoon.getLog(), KettleExtensionPoint.JobAfterOpen.id, jobMeta);

      spoon.refreshTree();
      SpoonPerspectiveManager.getInstance().activatePerspective(MainSpoonPerspective.class);
      return true;

    } catch (KettleException e) {
      new ErrorDialog(
          spoon.getShell(),
          BaseMessages.getString(PKG, "Spoon.Dialog.ErrorOpening.Title"),
          BaseMessages.getString(PKG, "Spoon.Dialog.ErrorOpening.Message") + fname,
          e);
    }
    return false;
  }
 SpoonPerspectiveManager getSpoonPerspectiveManager() {
   return SpoonPerspectiveManager.getInstance();
 }