protected boolean importJob(Node jobnode, RepositoryImportFeedbackInterface feedback)
      throws KettleException {
    // Load the job from the XML node.
    //
    JobMeta jobMeta = createJobMetaForNode(jobnode);
    feedback.setLabel(
        BaseMessages.getString(
            PKG,
            "RepositoryImporter.ImportJob.Label",
            Integer.toString(jobNumber),
            jobMeta.getName()));
    validateImportedElement(importRules, jobMeta);

    // What's the directory path?
    String directoryPath =
        Const.NVL(XMLHandler.getTagValue(jobnode, "directory"), Const.FILE_SEPARATOR);

    if (jobDirOverride != null) {
      directoryPath = jobDirOverride;
    }

    if (directoryPath.startsWith("/")) {
      // remove the leading root, we don't need it.
      directoryPath = directoryPath.substring(1);
    }

    // If we have a set of source directories to limit ourselves to, consider this.
    //
    if (limitDirs.size() > 0 && Const.indexOfString(directoryPath, limitDirs) < 0) {
      // Not in the limiting set of source directories, skip the import of this transformation...
      //
      feedback.addLog(
          BaseMessages.getString(
              PKG,
              "RepositoryImporter.SkippedJobNotPartOfLimitingDirectories.Log",
              jobMeta.getName()));
      return true;
    }

    RepositoryDirectoryInterface targetDirectory =
        getTargetDirectory(directoryPath, jobDirOverride, feedback);

    // OK, we loaded the job from XML and all went well...
    // See if the job already exists!
    ObjectId existintId = rep.getJobId(jobMeta.getName(), targetDirectory);
    if (existintId != null && askOverwrite) {
      overwrite = feedback.jobOverwritePrompt(jobMeta);
      askOverwrite = feedback.isAskingOverwriteConfirmation();
    } else {
      updateDisplay();
    }

    if (existintId == null || overwrite) {
      replaceSharedObjects(jobMeta);
      jobMeta.setRepositoryDirectory(targetDirectory);
      jobMeta.setObjectId(existintId);
      patchJobEntries(jobMeta);
      try {
        saveJobMeta(jobMeta);

        if (jobMeta.hasRepositoryReferences()) {
          referencingObjects.add(
              new RepositoryObject(
                  jobMeta.getObjectId(),
                  jobMeta.getName(),
                  jobMeta.getRepositoryDirectory(),
                  null,
                  null,
                  RepositoryObjectType.JOB,
                  null,
                  false));
        }

        feedback.addLog(
            BaseMessages.getString(
                PKG,
                "RepositoryImporter.JobSaved.Log",
                Integer.toString(jobNumber),
                jobMeta.getName()));
      } catch (Exception e) {
        feedback.addLog(
            BaseMessages.getString(
                PKG,
                "RepositoryImporter.ErrorSavingJob.Log",
                Integer.toString(jobNumber),
                jobMeta.getName(),
                Const.getStackTracker(e)));

        if (!feedback.askContinueOnErrorQuestion(
            BaseMessages.getString(PKG, "RepositoryImporter.DoYouWantToContinue.Title"),
            BaseMessages.getString(PKG, "RepositoryImporter.DoYouWantToContinue.Message"))) {
          return false;
        }
      }
    } else {
      feedback.addLog(
          BaseMessages.getString(
              PKG, "RepositoryImporter.SkippedExistingJob.Log", jobMeta.getName()));
    }
    return true;
  }
  /**
   * @param transnode The XML DOM node to read the transformation from
   * @return false if the import should be canceled.
   * @throws KettleException in case there is an unexpected error
   */
  protected boolean importTransformation(Node transnode, RepositoryImportFeedbackInterface feedback)
      throws KettleException {
    //
    // Load transformation from XML into a directory, possibly created!
    //
    TransMeta transMeta = createTransMetaForNode(transnode); // ignore shared objects
    feedback.setLabel(
        BaseMessages.getString(
            PKG,
            "RepositoryImporter.ImportTrans.Label",
            Integer.toString(transformationNumber),
            transMeta.getName()));

    validateImportedElement(importRules, transMeta);

    // What's the directory path?
    String directoryPath =
        Const.NVL(XMLHandler.getTagValue(transnode, "info", "directory"), Const.FILE_SEPARATOR);
    if (transDirOverride != null) {
      directoryPath = transDirOverride;
    }

    if (directoryPath.startsWith("/")) {
      // remove the leading root, we don't need it.
      directoryPath = directoryPath.substring(1);
    }

    // If we have a set of source directories to limit ourselves to, consider this.
    //
    if (limitDirs.size() > 0 && Const.indexOfString(directoryPath, limitDirs) < 0) {
      // Not in the limiting set of source directories, skip the import of this transformation...
      //
      feedback.addLog(
          BaseMessages.getString(
              PKG,
              "RepositoryImporter.SkippedTransformationNotPartOfLimitingDirectories.Log",
              transMeta.getName()));
      return true;
    }

    RepositoryDirectoryInterface targetDirectory =
        getTargetDirectory(directoryPath, transDirOverride, feedback);

    // OK, we loaded the transformation from XML and all went well...
    // See if the transformation already existed!
    ObjectId existingId = rep.getTransformationID(transMeta.getName(), targetDirectory);
    if (existingId != null && askOverwrite) {
      overwrite = feedback.transOverwritePrompt(transMeta);
      askOverwrite = feedback.isAskingOverwriteConfirmation();
    } else {
      updateDisplay();
    }

    if (existingId == null || overwrite) {
      replaceSharedObjects(transMeta);
      transMeta.setObjectId(existingId);
      transMeta.setRepositoryDirectory(targetDirectory);
      patchMappingSteps(transMeta);

      try {
        // Keep info on who & when this transformation was created...
        if (transMeta.getCreatedUser() == null || transMeta.getCreatedUser().equals("-")) {
          transMeta.setCreatedDate(new Date());
          if (rep.getUserInfo() != null) {
            transMeta.setCreatedUser(rep.getUserInfo().getLogin());
          } else {
            transMeta.setCreatedUser(null);
          }
        }
        saveTransMeta(transMeta);
        feedback.addLog(
            BaseMessages.getString(
                PKG,
                "RepositoryImporter.TransSaved.Log",
                Integer.toString(transformationNumber),
                transMeta.getName()));

        if (transMeta.hasRepositoryReferences()) {
          referencingObjects.add(
              new RepositoryObject(
                  transMeta.getObjectId(),
                  transMeta.getName(),
                  transMeta.getRepositoryDirectory(),
                  null,
                  null,
                  RepositoryObjectType.TRANSFORMATION,
                  null,
                  false));
        }

      } catch (Exception e) {
        feedback.addLog(
            BaseMessages.getString(
                PKG,
                "RepositoryImporter.ErrorSavingTrans.Log",
                Integer.toString(transformationNumber),
                transMeta.getName(),
                Const.getStackTracker(e)));

        if (!feedback.askContinueOnErrorQuestion(
            BaseMessages.getString(PKG, "RepositoryImporter.DoYouWantToContinue.Title"),
            BaseMessages.getString(PKG, "RepositoryImporter.DoYouWantToContinue.Message"))) {
          return false;
        }
      }
    } else {
      feedback.addLog(
          BaseMessages.getString(
              PKG, "RepositoryImporter.SkippedExistingTransformation.Log", transMeta.getName()));
    }
    return true;
  }