/**
   * Executes the given workflow in the specified representation file.
   *
   * @param workflowFile the workflow {@link File}
   * @param representationID the representation ID
   * @param fileID the file ID
   * @return a WorkflowExecutionOutput with the output directory and command output.
   * @throws ExecutePlanException if an error occurs during the execution
   */
  private WorkflowExecutionOutput executeWorkflowInFile(
      final File workflowFile, final String representationID, final String fileID)
      throws ExecutePlanException {

    logger.info("Executing workflow in file " + representationID + "/" + fileID);

    File inputValueFile = null;
    try {

      // Write the downloaded stream to a temporary file in the disk
      final InputStream inputStream = rodaDownloader.get(representationID, fileID);
      inputValueFile = File.createTempFile(representationID + "_" + fileID + "_", "");
      IOUtils.copyLarge(inputStream, new FileOutputStream(inputValueFile));

      final String outputDir = inputValueFile.getAbsolutePath() + "_taverna/";

      final String executionOutput =
          CommandUtility.execute(
              taverna_bin,
              "-outputdir",
              outputDir,
              "-inputvalue",
              workflowInputPort,
              inputValueFile.getAbsolutePath(),
              workflowFile.getAbsolutePath());

      logger.info("Workflow executed with sucess!");
      logger.debug("Command output: " + executionOutput);

      return new WorkflowExecutionOutput(outputDir, executionOutput);

    } catch (NoSuchRODAObjectException e) {
      logger.error("Error getting file - " + e.getMessage());
      throw new ExecutePlanException("Error getting file " + fileID + " - " + e.getMessage(), e);
    } catch (DownloaderException e) {
      logger.error("Error getting file - " + e.getMessage());
      throw new ExecutePlanException("Error getting file " + fileID + " - " + e.getMessage(), e);
    } catch (IOException e) {
      logger.error("Error getting file - " + e.getMessage());
      throw new ExecutePlanException("Error getting file " + fileID + " - " + e.getMessage(), e);
    } catch (CommandException e) {
      logger.error("Error executing taverna workflow in file " + fileID + " - " + e.getMessage());
      logger.debug("Command output: " + e.getOutput());
      throw new ExecutePlanException(
          "Error executing taverna workflow in file " + fileID + " - " + e.getMessage(), e);
    } finally {

      if (inputValueFile != null) {
        if (FileUtils.deleteQuietly(inputValueFile)) {
          logger.debug("Deleted temporary file " + inputValueFile);
        } else {
          logger.warn("Error deleting temporary file " + inputValueFile);
        }
      }
    }
  }
  protected String getVersion() throws ConverterException {
    try {

      String version = getClass().getName() + "/" + VERSION + " - ";

      String executableVersion = CommandUtility.execute(this.office2pdfExecutable, "--version");

      return version + executableVersion;

    } catch (CommandException e) {
      logger.warn("Exception getting Doc2Pdf version - " + e.getMessage(), e);
      throw new ConverterException("Exception getting Doc2Pdf version - " + e.getMessage(), e);
    }
  }
  protected RepresentationFile convertRootFile(
      RepresentationFile originalRootFile, File tempDirectory, StringBuffer report)
      throws IOException, CommandException {

    // /tmp/original.../F0
    File originalFile = new File(URI.create(originalRootFile.getAccessURL()));
    // Detect extension by DROID
    String origNameWithExt = originalRootFile.getOriginalName();
    FileFormat detectedFileFormat = FormatUtility.getFileFormat(originalFile, origNameWithExt);
    if ((detectedFileFormat != null)
        && (detectedFileFormat.getExtensions() != null)
        && (detectedFileFormat.getExtensions().length > 0)) {
      origNameWithExt = origNameWithExt + "." + detectedFileFormat.getExtensions()[0];
    }
    // /tmp/original.../originalName.doc
    File originalFileWithExtension = new File(originalFile.getParentFile(), origNameWithExt);
    // mv /tmp/original.../F0 /tmp/original.../originalName.doc
    FileUtils.moveFile(originalFile, originalFileWithExtension);

    // /tmp/converted.../F0
    File convertedFile = new File(tempDirectory, originalFile.getName());
    // /tmp/converted.../originalName.doc.pdf
    File convertedFileWithExtension =
        new File(tempDirectory, originalRootFile.getOriginalName() + this.formatExtension);

    // Execute the command
    List<String> commandArgs = new ArrayList<String>();
    commandArgs.add(this.office2pdfExecutable);
    commandArgs.add(originalFileWithExtension.getAbsolutePath());
    commandArgs.add(convertedFileWithExtension.getAbsolutePath());

    String convertOutput = CommandUtility.execute(commandArgs);

    String commandline = StringUtility.join(commandArgs, " "); // $NON-NLS-1$

    String message;
    if (StringUtils.isBlank(convertOutput)) {
      message =
          String.format(
              "%s: %s => %s%n(Command: %s)%n%n", //$NON-NLS-1$
              originalRootFile.getId(),
              originalRootFile.getOriginalName(),
              convertedFileWithExtension.getName(),
              commandline);
    } else {
      message =
          String.format(
              "%s: %s => %s (%s)%n(Command: %s)%n%n",
              originalRootFile //$NON-NLS-1$
                  .getId(),
              originalRootFile.getOriginalName(),
              convertedFileWithExtension.getName(),
              convertOutput,
              commandline);
    }

    logger.trace(message);
    report.append(message);

    // mv /tmp/converted.../originalName.doc.pdf /tmp/converted.../F0
    FileUtils.moveFile(convertedFileWithExtension, convertedFile);

    RepresentationFile convertedRootFile = new RepresentationFile(originalRootFile);

    // convertedRootFile.setMimetype(format);
    convertedRootFile.importFileFormat(
        FormatUtility.getFileFormat(convertedFile, convertedFileWithExtension.getName()));
    convertedRootFile.setSize(convertedFile.length());
    convertedRootFile.setAccessURL(convertedFile.getAbsolutePath());
    convertedRootFile.setOriginalName(convertedRootFile.getOriginalName() + this.formatExtension);

    return convertedRootFile;
  }