docs: private void outputResult() throws DITAOTException {
          try {
              tempFileNameScheme = (TempFileNameScheme) Class.forName(job.getProperty("temp-file-name-scheme")).newInstance();
          } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
              throw new RuntimeException(e);
          }
          tempFileNameScheme.setBaseDir(baseInputDir);
  
          // assume empty Job
          final URI rootTemp = tempFileNameScheme.generateTempFileName(rootFile);
          final File relativeRootFile = toFile(rootTemp);
  
          job.setInputDir(baseInputDir);
          job.setInputMap(rootTemp);
          
          //If root input file is marked resource only due to conref or other feature, remove that designation
          if (resourceOnlySet.contains(rootFile)) {
              resourceOnlySet.remove(rootFile);
          }
  
          job.setProperty(INPUT_DITAMAP_LIST_FILE_LIST, USER_INPUT_FILE_LIST_FILE);
          final File inputfile = new File(job.tempDir, USER_INPUT_FILE_LIST_FILE);
          writeListFile(inputfile, relativeRootFile.toString());
  
          job.setProperty("tempdirToinputmapdir.relative.value", StringUtils.escapeRegExp(getPrefix(relativeRootFile)));
          job.setProperty("uplevels", getLevelsPath(rootTemp));
  
          resourceOnlySet.addAll(listFilter.getResourceOnlySet());
  
          if (job.getOnlyTopicInMap() || !job.crawlTopics()) {
              resourceOnlySet.addAll(listFilter.getNonTopicrefReferenceSet());
          }
  
          for (final URI file: outDitaFilesSet) {
              getOrCreateFileInfo(fileinfos, file).isOutDita = true;
          }
          for (final URI file: fullTopicSet) {
              final FileInfo ff = getOrCreateFileInfo(fileinfos, file);
              if (ff.format == null) {
                  ff.format = sourceFormat.getOrDefault(ff.src, ATTR_FORMAT_VALUE_DITA);
              }
          }
          for (final URI file: fullMapSet) {
              final FileInfo ff = getOrCreateFileInfo(fileinfos, file);
              if (ff.format == null) {
                  ff.format = ATTR_FORMAT_VALUE_DITAMAP;
              }
          }
          for (final URI file: hrefTopicSet) {
              final FileInfo f = getOrCreateFileInfo(fileinfos, file);
              f.hasLink = true;
              if (f.format == null && sourceFormat.containsKey(f.src)) {
                  f.format = sourceFormat.get(f.src);
              }
          }
          for (final URI file: conrefSet) {
              getOrCreateFileInfo(fileinfos, file).hasConref = true;
          }
          for (final Reference file: formatSet) {
              getOrCreateFileInfo(fileinfos, file.filename).format = file.format;
          }
          for (final URI file: flagImageSet) {
              final FileInfo f = getOrCreateFileInfo(fileinfos, file);
              f.isFlagImage = true;
              f.format = ATTR_FORMAT_VALUE_IMAGE;
          }
          for (final String format: htmlSet.keySet()) {
              for (final URI file : htmlSet.get(format)) {
                  getOrCreateFileInfo(fileinfos, file).format = format;
              }
          }
          for (final URI file: hrefTargetSet) {
              final FileInfo f = getOrCreateFileInfo(fileinfos, file);
              f.isTarget = true;
              if (f.format == null && sourceFormat.containsKey(f.src)) {
                  f.format = sourceFormat.get(f.src);
              }
          }
          for (final URI file: schemeSet) {
              getOrCreateFileInfo(fileinfos, file).isSubjectScheme = true;
          }
          for (final URI file: coderefTargetSet) {
              final FileInfo f = getOrCreateFileInfo(fileinfos, file);
              f.isSubtarget = true;
              if (f.format == null) {
                  f.format = PR_D_CODEREF.localName;
              }
          }
          for (final URI file: conrefpushSet) {
              getOrCreateFileInfo(fileinfos, file).isConrefPush = true;
          }
          for (final URI file: keyrefSet) {
              getOrCreateFileInfo(fileinfos, file).hasKeyref = true;
          }
          for (final URI file: coderefSet) {
              getOrCreateFileInfo(fileinfos, file).hasCoderef = true;
          }
          for (final URI file: resourceOnlySet) {
              getOrCreateFileInfo(fileinfos, file).isResourceOnly = true;
          }
  
          addFlagImagesSetToProperties(job, relFlagImagesSet);
  
          final Map<URI, URI> filteredCopyTo = filterConflictingCopyTo(copyTo, fileinfos.values());
  
          for (final FileInfo fs: fileinfos.values()) {
              if (!failureList.contains(fs.src)) {
                  final URI src = filteredCopyTo.get(fs.src);
                  // correct copy-to
                  if (src != null) {
                      final FileInfo corr = new FileInfo.Builder(fs).src(src).build();
                      job.add(corr);
                  } else {
                      job.add(fs);
                  }
              }
          }
          for (final URI target : filteredCopyTo.keySet()) {
              final URI tmp = tempFileNameScheme.generateTempFileName(target);
              final FileInfo fi = new FileInfo.Builder().result(target).uri(tmp).build();
              job.add(fi);
          }
  
          final FileInfo root = job.getFileInfo(rootFile);
          if (root == null) {
              throw new RuntimeException("Unable to set input file to job configuration");
          }
          job.add(new FileInfo.Builder(root)
                  .isInput(true)
                  .build());
  
          try {
              logger.info("Serializing job specification");
              if (!job.tempDir.exists() && !job.tempDir.mkdirs()) {
                  throw new DITAOTException("Failed to create " + job.tempDir + " directory");
              }
              job.write();
          } catch (final IOException e) {
              throw new DITAOTException("Failed to serialize job configuration files: " + e.getMessage(), e);
          }
  
          try {
              SubjectSchemeReader.writeMapToXML(addMapFilePrefix(listFilter.getRelationshipGrap()), new File(job.tempDir, FILE_NAME_SUBJECT_RELATION));
              SubjectSchemeReader.writeMapToXML(addMapFilePrefix(schemeDictionary), new File(job.tempDir, FILE_NAME_SUBJECT_DICTIONARY));
          } catch (final IOException e) {
              throw new DITAOTException("Failed to serialize subject scheme files: " + e.getMessage(), e);
          }
  
          if (INDEX_TYPE_ECLIPSEHELP.equals(transtype)) {
              final DelayConrefUtils delayConrefUtils = new DelayConrefUtils();
              delayConrefUtils.setLogger(logger);
              delayConrefUtils.setJob(job);
              delayConrefUtils.writeMapToXML(exportAnchorsFilter.getPluginMap());
              delayConrefUtils.writeExportAnchors(exportAnchorsFilter, tempFileNameScheme);
          }
  
          KeyDef.writeKeydef(new File(job.tempDir, SUBJECT_SCHEME_KEYDEF_LIST_FILE), addFilePrefix(schemekeydefMap.values()));
      }