/**
  * This will write all kind of configuration items into the configuration file and will format the
  * file.
  *
  * @param config The output file.
  * @param desc The description of the item.
  * @param key The name of the item
  * @param value The value of the item.
  */
 private void addConfiguration(PrintWriter config, String desc, String key, String value) {
   // Description first.
   config.print(desc);
   config.println();
   config.printf("%-22s", key);
   config.print(" = ");
   if (value != null) {
     config.println(value);
   } else {
     config.println();
   }
   config.println();
 }
  /**
   * This method will create the configuration for calling doxygen. Furthermore is will put all
   * configurable items into the configuration file.
   *
   * @param config The configuration.
   * @throws MavenReportException
   */
  public void buildConfigurationFile(File config) throws MavenReportException {
    config.getParentFile().mkdirs();

    PrintWriter out = null;
    try {
      out = new PrintWriter(new BufferedWriter(new FileWriter(config)));
      addConfiguration(out, DoxygenParameters.DOXYFILE_ENCODING, getDoxyfileEncoding());
      addConfiguration(out, DoxygenParameters.PROJECT_NAME, getProjectName());
      addConfiguration(out, DoxygenParameters.PROJECT_NUMBER, getProjectNumber());
      addConfiguration(
          out, DoxygenParameters.OUTPUT_DIRECTORY, getOutputDirectory().getAbsolutePath());
      addConfiguration(out, DoxygenParameters.CREATE_SUBDIRS, isCreateSubdirs());
      addConfiguration(out, DoxygenParameters.OUTPUT_LANGUAGE, getOutputLanguage());
      addConfiguration(out, DoxygenParameters.BRIEF_MEMBER_DESC, isBriefMemberDesc());
      addConfiguration(out, DoxygenParameters.REPEAT_BRIEF, isRepeatBrief());
      addConfiguration(out, DoxygenParameters.ABBREVIATE_BRIEF, getAbbreviateBrief());
      addConfiguration(out, DoxygenParameters.ALWAYS_DETAILED_SEC, isAlwaysDetailedSec());
      addConfiguration(out, DoxygenParameters.INLINE_INHERITED_MEMB, isInlineInheritedMemb());
      addConfiguration(out, DoxygenParameters.FULL_PATH_NAMES, isFullPathNames());
      addConfiguration(out, DoxygenParameters.STRIP_FROM_PATH, getStripFromPath());
      addConfiguration(out, DoxygenParameters.STRIP_FROM_INC_PATH, getStripFromIncPath());
      addConfiguration(out, DoxygenParameters.SHORT_NAMES, isShortNames());
      addConfiguration(out, DoxygenParameters.JAVADOC_AUTOBRIEF, isJavadocAutobrief());
      addConfiguration(out, DoxygenParameters.QT_AUTOBRIEF, isQtAutobrief());
      addConfiguration(out, DoxygenParameters.MULTILINE_CPP_IS_BRIEF, isMultilineCppIsBrief());
      addConfiguration(out, DoxygenParameters.INHERIT_DOCS, isInheritDocs());
      addConfiguration(out, DoxygenParameters.SEPARATE_MEMBER_PAGES, isSeparateMemberPages());
      addConfiguration(out, DoxygenParameters.TAB_SIZE, getTabSize());
      addConfiguration(out, DoxygenParameters.ALIASES, getAliases());
      addConfiguration(out, DoxygenParameters.OPTIMIZE_OUTPUT_FOR_C, isOptimizeOutputForC());
      addConfiguration(out, DoxygenParameters.OPTIMIZE_OUTPUT_JAVA, isOptimizeOutputJava());
      addConfiguration(out, DoxygenParameters.OPTIMIZE_FOR_FORTRAN, isOptimizeForFortran());
      addConfiguration(out, DoxygenParameters.OPTIMIZE_OUTPUT_VHDL, isOptimizeOutputVhdl());
      addConfiguration(out, DoxygenParameters.BUILTIN_STL_SUPPORT, isBuiltinStlSupport());
      addConfiguration(out, DoxygenParameters.CPP_CLI_SUPPORT, isCppCliSupport());
      addConfiguration(out, DoxygenParameters.SIP_SUPPORT, isSipSupport());
      addConfiguration(out, DoxygenParameters.IDL_PROPERTY_SUPPORT, isIdlPropertySupport());
      addConfiguration(out, DoxygenParameters.DISTRIBUTE_GROUP_DOC, isDistributeGroupDoc());
      addConfiguration(out, DoxygenParameters.SUBGROUPING, isSubgrouping());
      addConfiguration(out, DoxygenParameters.TYPEDEF_HIDES_STRUCT, isTypedefHidesStruct());
      addConfiguration(out, DoxygenParameters.SYMBOL_CACHE_SIZE, getSymbolCacheSize());
      addConfiguration(out, DoxygenParameters.EXTRACT_ALL, isExtractAll());
      addConfiguration(out, DoxygenParameters.EXTRACT_PRIVATE, isExtractPrivate());
      addConfiguration(out, DoxygenParameters.EXTRACT_STATIC, isExtractStatic());
      addConfiguration(out, DoxygenParameters.EXTRACT_LOCAL_CLASSES, isExtractLocalClasses());
      addConfiguration(out, DoxygenParameters.EXTRACT_LOCAL_METHODS, isExtractLocalMethods());
      addConfiguration(out, DoxygenParameters.EXTRACT_ANON_NSPACES, isExtractAnonNspaces());
      addConfiguration(out, DoxygenParameters.HIDE_UNDOC_MEMBERS, isHideUndocMembers());
      addConfiguration(out, DoxygenParameters.HIDE_UNDOC_CLASSES, isHideUndocClasses());
      addConfiguration(out, DoxygenParameters.HIDE_FRIEND_COMPOUNDS, isHideFriendCompounds());
      addConfiguration(out, DoxygenParameters.HIDE_IN_BODY_DOCS, isHideInBodyDocs());
      addConfiguration(out, DoxygenParameters.INTERNAL_DOCS, isInternalDocs());
      addConfiguration(out, DoxygenParameters.CASE_SENSE_NAMES, isCaseSenseNames());
      addConfiguration(out, DoxygenParameters.HIDE_SCOPE_NAMES, isHideScopeNames());
      addConfiguration(out, DoxygenParameters.SHOW_INCLUDE_FILES, isShowIncludeFiles());
      addConfiguration(out, DoxygenParameters.INLINE_INFO, isInlineInfo());
      addConfiguration(out, DoxygenParameters.SORT_MEMBER_DOCS, isSortMemberDocs());
      addConfiguration(out, DoxygenParameters.SORT_BRIEF_DOCS, isSortBriefDocs());
      addConfiguration(out, DoxygenParameters.SORT_GROUP_NAMES, isSortGroupNames());
      addConfiguration(out, DoxygenParameters.SORT_BY_SCOPE_NAME, isSortByScopeName());
      addConfiguration(out, DoxygenParameters.GENERATE_TODOLIST, isGenerateTodolist());
      addConfiguration(out, DoxygenParameters.GENERATE_TESTLIST, isGenerateTestlist());
      addConfiguration(out, DoxygenParameters.GENERATE_BUGLIST, isGenerateBuglist());
      addConfiguration(out, DoxygenParameters.GENERATE_DEPRECATEDLIST, isGenerateDeprecatedlist());
      addConfiguration(out, DoxygenParameters.ENABLED_SECTIONS, getEnabledSections());
      addConfiguration(out, DoxygenParameters.MAX_INITIALIZER_LINES, getMaxInitializerLines());
      addConfiguration(out, DoxygenParameters.SHOW_USED_FILES, isShowUsedFiles());
      addConfiguration(out, DoxygenParameters.SHOW_DIRECTORIES, isShowDirectories());
      addConfiguration(out, DoxygenParameters.SHOW_FILES, isShowFiles());
      addConfiguration(out, DoxygenParameters.SHOW_NAMESPACES, isShowNamespaces());
      addConfiguration(out, DoxygenParameters.FILE_VERSION_FILTER, getFileVersionFilter());
      addConfiguration(out, DoxygenParameters.LAYOUT_FILE, getLayoutFile());
      addConfiguration(out, DoxygenParameters.QUIET, isQuiet());
      addConfiguration(out, DoxygenParameters.WARNINGS, isWarnings());
      addConfiguration(out, DoxygenParameters.WARN_IF_UNDOCUMENTED, isWarnIfUndocumented());
      addConfiguration(out, DoxygenParameters.WARN_IF_DOC_ERROR, isWarnIfDocError());
      addConfiguration(out, DoxygenParameters.WARN_NO_PARAMDOC, isWarnNoParamdoc());
      addConfiguration(out, DoxygenParameters.WARN_FORMAT, getWarnFormat());
      addConfiguration(out, DoxygenParameters.WARN_LOGFILE, getWarnLogfile());
      addConfiguration(out, DoxygenParameters.INPUT, getInput());
      addConfiguration(out, DoxygenParameters.INPUT_ENCODING, getInputEncoding());
      addConfiguration(out, DoxygenParameters.FILE_PATTERNS, getFilePatterns());
      addConfiguration(out, DoxygenParameters.RECURSIVE, isRecursive());
      addConfiguration(out, DoxygenParameters.EXCLUDE, getExclude());
      addConfiguration(out, DoxygenParameters.EXCLUDE_SYMLINKS, isExcludeSymlinks());
      addConfiguration(out, DoxygenParameters.EXCLUDE_PATTERNS, getExcludePatterns());
      addConfiguration(out, DoxygenParameters.EXCLUDE_SYMBOLS, getExcludeSymbols());
      addConfiguration(out, DoxygenParameters.EXAMPLE_PATH, getExamplePath());
      addConfiguration(out, DoxygenParameters.EXAMPLE_PATTERNS, getExamplePatterns());
      addConfiguration(out, DoxygenParameters.EXAMPLE_RECURSIVE, isExampleRecursive());
      addConfiguration(out, DoxygenParameters.IMAGE_PATH, getImagePath());
      addConfiguration(out, DoxygenParameters.INPUT_FILTER, getInputFilter());
      addConfiguration(out, DoxygenParameters.FILTER_PATTERNS, getFilterPatterns());
      addConfiguration(out, DoxygenParameters.FILTER_SOURCE_FILES, isFilterSourceFiles());
      addConfiguration(out, DoxygenParameters.SOURCE_BROWSER, isSourceBrowser());
      addConfiguration(out, DoxygenParameters.INLINE_SOURCES, isInlineSources());
      addConfiguration(out, DoxygenParameters.STRIP_CODE_COMMENTS, isStripCodeComments());
      addConfiguration(out, DoxygenParameters.REFERENCED_BY_RELATION, isReferencedByRelation());
      addConfiguration(out, DoxygenParameters.REFERENCES_RELATION, isReferencesRelation());
      addConfiguration(out, DoxygenParameters.REFERENCES_LINK_SOURCE, isReferencesLinkSource());
      addConfiguration(out, DoxygenParameters.USE_HTAGS, isUseHtags());
      addConfiguration(out, DoxygenParameters.VERBATIM_HEADERS, isVerbatimHeaders());
      addConfiguration(out, DoxygenParameters.ALPHABETICAL_INDEX, isAlphabeticalIndex());
      addConfiguration(out, DoxygenParameters.COLS_IN_ALPHA_INDEX, getColsInAlphaIndex());
      addConfiguration(out, DoxygenParameters.IGNORE_PREFIX, getIgnorePrefix());
      addConfiguration(out, DoxygenParameters.GENERATE_HTML, isGenerateHtml());
      addConfiguration(out, DoxygenParameters.HTML_OUTPUT, getHtmlOutput());
      addConfiguration(out, DoxygenParameters.HTML_FILE_EXTENSION, getHtmlFileExtension());
      addConfiguration(out, DoxygenParameters.HTML_HEADER, getHtmlHeader());
      addConfiguration(out, DoxygenParameters.HTML_FOOTER, getHtmlFooter());
      addConfiguration(out, DoxygenParameters.HTML_STYLESHEET, getHtmlStylesheet());
      addConfiguration(out, DoxygenParameters.HTML_ALIGN_MEMBERS, isHtmlAlignMembers());
      addConfiguration(out, DoxygenParameters.HTML_DYNAMIC_SECTIONS, isHtmlDynamicSections());
      addConfiguration(out, DoxygenParameters.GENERATE_DOCSET, isGenerateDocset());
      addConfiguration(out, DoxygenParameters.DOCSET_FEEDNAME, getDocsetFeedname());
      addConfiguration(out, DoxygenParameters.DOCSET_BUNDLE_ID, getDocsetBundleId());
      addConfiguration(out, DoxygenParameters.GENERATE_HTMLHELP, isGenerateHtmlhelp());
      addConfiguration(out, DoxygenParameters.CHM_FILE, getChmFile());
      addConfiguration(out, DoxygenParameters.HHC_LOCATION, getHhcLocation());
      addConfiguration(out, DoxygenParameters.GENERATE_CHI, isGenerateChi());
      addConfiguration(out, DoxygenParameters.CHM_INDEX_ENCODING, getChmIndexEncoding());
      addConfiguration(out, DoxygenParameters.BINARY_TOC, isBinaryToc());
      addConfiguration(out, DoxygenParameters.TOC_EXPAND, isTocExpand());
      addConfiguration(out, DoxygenParameters.GENERATE_QHP, isGenerateQhp());
      addConfiguration(out, DoxygenParameters.QCH_FILE, getQchFile());
      addConfiguration(out, DoxygenParameters.QHP_NAMESPACE, getQhpNamespace());
      addConfiguration(out, DoxygenParameters.QHP_VIRTUAL_FOLDER, getQhpVirtualFolder());
      addConfiguration(out, DoxygenParameters.QHG_LOCATION, getQhgLocation());
      addConfiguration(out, DoxygenParameters.DISABLE_INDEX, isDisableIndex());
      addConfiguration(out, DoxygenParameters.ENUM_VALUES_PER_LINE, getEnumValuesPerLine());
      addConfiguration(out, DoxygenParameters.GENERATE_TREEVIEW, getGenerateTreeview());
      addConfiguration(out, DoxygenParameters.TREEVIEW_WIDTH, getTreeviewWidth());
      addConfiguration(out, DoxygenParameters.FORMULA_FONTSIZE, getFormulaFontsize());
      addConfiguration(out, DoxygenParameters.GENERATE_LATEX, isGenerateLatex());
      addConfiguration(out, DoxygenParameters.LATEX_OUTPUT, getLatexOutput());
      addConfiguration(out, DoxygenParameters.LATEX_CMD_NAME, getLatexCmdName());
      addConfiguration(out, DoxygenParameters.MAKEINDEX_CMD_NAME, getMakeindexCmdName());
      addConfiguration(out, DoxygenParameters.COMPACT_LATEX, isCompactLatex());
      addConfiguration(out, DoxygenParameters.PAPER_TYPE, getPaperType());
      addConfiguration(out, DoxygenParameters.EXTRA_PACKAGES, getExtraPackages());
      addConfiguration(out, DoxygenParameters.LATEX_HEADER, getLatexHeader());
      addConfiguration(out, DoxygenParameters.PDF_HYPERLINKS, isPdfHyperlinks());
      addConfiguration(out, DoxygenParameters.USE_PDFLATEX, isUsePdflatex());
      addConfiguration(out, DoxygenParameters.LATEX_BATCHMODE, isLatexBatchmode());
      addConfiguration(out, DoxygenParameters.LATEX_HIDE_INDICES, isLatexHideIndices());
      addConfiguration(out, DoxygenParameters.GENERATE_RTF, isGenerateRtf());
      addConfiguration(out, DoxygenParameters.RTF_OUTPUT, getRtfOutput());
      addConfiguration(out, DoxygenParameters.COMPACT_RTF, isCompactRtf());
      addConfiguration(out, DoxygenParameters.RTF_HYPERLINKS, isRtfHyperlinks());
      addConfiguration(out, DoxygenParameters.RTF_STYLESHEET_FILE, getRtfStylesheetFile());
      addConfiguration(out, DoxygenParameters.RTF_EXTENSIONS_FILE, getRtfExtensionsFile());
      addConfiguration(out, DoxygenParameters.GENERATE_MAN, isGenerateMan());
      addConfiguration(out, DoxygenParameters.MAN_OUTPUT, getManOutput());
      addConfiguration(out, DoxygenParameters.MAN_EXTENSION, getManExtension());
      addConfiguration(out, DoxygenParameters.MAN_LINKS, isManLinks());
      addConfiguration(out, DoxygenParameters.GENERATE_XML, isGenerateXml());
      addConfiguration(out, DoxygenParameters.XML_OUTPUT, getXmlOutput());
      addConfiguration(out, DoxygenParameters.XML_SCHEMA, getXmlSchema());
      addConfiguration(out, DoxygenParameters.XML_DTD, getXmlDtd());
      addConfiguration(out, DoxygenParameters.XML_PROGRAMLISTING, isXmlProgramlisting());
      addConfiguration(out, DoxygenParameters.GENERATE_AUTOGEN_DEF, isGenerateAutogenDef());
      addConfiguration(out, DoxygenParameters.GENERATE_PERLMOD, isGeneratePerlmod());
      addConfiguration(out, DoxygenParameters.PERLMOD_LATEX, isPerlmodLatex());
      addConfiguration(out, DoxygenParameters.PERLMOD_PRETTY, isPerlmodPretty());
      addConfiguration(out, DoxygenParameters.PERLMOD_MAKEVAR_PREFIX, getPerlmodMakevarPrefix());
      addConfiguration(out, DoxygenParameters.ENABLE_PREPROCESSING, isEnablePreprocessing());
      addConfiguration(out, DoxygenParameters.MACRO_EXPANSION, isMacroExpansion());
      addConfiguration(out, DoxygenParameters.EXPAND_ONLY_PREDEF, isExpandOnlyPredef());
      addConfiguration(out, DoxygenParameters.SEARCH_INCLUDES, isSearchIncludes());
      addConfiguration(out, DoxygenParameters.INCLUDE_PATH, getIncludePath());
      addConfiguration(out, DoxygenParameters.INCLUDE_FILE_PATTERNS, getIncludeFilePatterns());
      addConfiguration(out, DoxygenParameters.PREDEFINED, getPredefined());
      addConfiguration(out, DoxygenParameters.EXPAND_AS_DEFINED, getExpandAsDefined());
      addConfiguration(out, DoxygenParameters.SKIP_FUNCTION_MACROS, isSkipFunctionMacros());
      addConfiguration(out, DoxygenParameters.TAGFILES, getTagfiles());
      addConfiguration(out, DoxygenParameters.GENERATE_TAGFILE, getGenerateTagfile());
      addConfiguration(out, DoxygenParameters.ALLEXTERNALS, isAllexternals());
      addConfiguration(out, DoxygenParameters.EXTERNAL_GROUPS, isExternalGroups());
      addConfiguration(out, DoxygenParameters.PERL_PATH, getPerlPath());
      addConfiguration(out, DoxygenParameters.CLASS_DIAGRAMS, isClassDiagrams());
      addConfiguration(out, DoxygenParameters.MSCGEN_PATH, getMscgenPath());
      addConfiguration(out, DoxygenParameters.HIDE_UNDOC_RELATIONS, isHideUndocRelations());
      addConfiguration(out, DoxygenParameters.HAVE_DOT, isHaveDot());
      addConfiguration(out, DoxygenParameters.DOT_FONTNAME, getDotFontname());
      addConfiguration(out, DoxygenParameters.DOT_FONTSIZE, getDotFontsize());
      addConfiguration(out, DoxygenParameters.DOT_FONTPATH, getDotFontpath());
      addConfiguration(out, DoxygenParameters.CLASS_GRAPH, isClassGraph());
      addConfiguration(out, DoxygenParameters.COLLABORATION_GRAPH, isCollaborationGraph());
      addConfiguration(out, DoxygenParameters.GROUP_GRAPHS, isGroupGraphs());
      addConfiguration(out, DoxygenParameters.UML_LOOK, isUmlLook());
      addConfiguration(out, DoxygenParameters.TEMPLATE_RELATIONS, isTemplateRelations());
      addConfiguration(out, DoxygenParameters.INCLUDE_GRAPH, isIncludeGraph());
      addConfiguration(out, DoxygenParameters.INCLUDED_BY_GRAPH, isIncludedByGraph());
      addConfiguration(out, DoxygenParameters.CALL_GRAPH, isCallGraph());
      addConfiguration(out, DoxygenParameters.CALLER_GRAPH, isCallerGraph());
      addConfiguration(out, DoxygenParameters.GRAPHICAL_HIERARCHY, isGraphicalHierarchy());
      addConfiguration(out, DoxygenParameters.DIRECTORY_GRAPH, isDirectoryGraph());
      addConfiguration(out, DoxygenParameters.DOT_IMAGE_FORMAT, getDotImageFormat());
      addConfiguration(out, DoxygenParameters.DOT_PATH, getDotPath());
      addConfiguration(out, DoxygenParameters.DOTFILE_DIRS, getDotfileDirs());
      addConfiguration(out, DoxygenParameters.DOT_GRAPH_MAX_NODES, getDotGraphMaxNodes());
      addConfiguration(out, DoxygenParameters.MAX_DOT_GRAPH_DEPTH, getMaxDotGraphDepth());
      addConfiguration(out, DoxygenParameters.DOT_TRANSPARENT, isDotTransparent());
      addConfiguration(out, DoxygenParameters.DOT_MULTI_TARGETS, isDotMultiTargets());
      addConfiguration(out, DoxygenParameters.GENERATE_LEGEND, isGenerateLegend());
      addConfiguration(out, DoxygenParameters.DOT_CLEANUP, isDotCleanup());
      addConfiguration(out, DoxygenParameters.SEARCHENGINE, isSearchengine());

    } catch (IOException ex) {
      throw new MavenReportException(
          "Error creating Doxygen configuration file '" + config.getAbsolutePath() + "'.", ex);
    } finally {
      if (out != null) {
        out.close();
      }
    }
  }