/**
   * Génère un rapport de métriques McCabe.
   *
   * @param pReport le nom de rapport à générer.
   * @throws Exception si un problème d'exécution apparaît.
   */
  protected void createReport(final String pReport) throws Exception {
    LOGGER.info(McCabeMessages.getString("logs.create.report", pReport));
    // Lancement de la création de tous les rapports
    String reportFileName = computeReportFileName(pReport);
    ArrayList params = new ArrayList();
    params.add(mConfiguration.getCliCommand());
    String param = null;
    for (int j = 0; j < mConfiguration.getMetricsCommand().length; j++) {
      // Remplacer les paramètres configurables (%...%), ce sont des paramètres
      // qui remplacent des clés dans les paramètres de configuration
      // des analyses McCabe (classpath pour Java,...)
      param =
          mConfiguration.getMetricsCommand()[j].replaceAll(
              McCabeMessages.getString("key.substition.report_name"), pReport);
      param =
          param.replaceAll(McCabeMessages.getString("key.substition.report_out"), reportFileName);
      params.add(param);
    }
    String type[] = new String[0];
    String modifiedParams[] = (String[]) params.toArray(type);

    mProcess =
        createProcessManager(
            modifiedParams, mConfiguration.getSubWorkspace(), mConfiguration.getLogger());
    // On veut gérer les informations lancées par le processus en sortie
    mProcess.setOutputHandler(this);
    int resultMetrics = mProcess.startProcess(this);
    if (resultMetrics != 0) {
      throw new McCabeException(
          McCabeMessages.getString("error.processing") + " #" + resultMetrics);
    }
  }
  /**
   * Parse les fichiers sources afin d'en extraire les métriques.
   *
   * @return le résultat du process de parsing.
   * @throws Exception si un problème de parsing apparaît.
   */
  protected int parseSource() throws Exception {
    // Execute le parsing des sources avec McCabe
    String[] parseCommand = new String[mConfiguration.getParserCommand().length + 1];
    parseCommand[0] = mConfiguration.getCliCommand();
    for (int i = 1; i < parseCommand.length; i++) {
      // On met en forme la liste des paramètres pour la passer au process
      parseCommand[i] = mConfiguration.getParserCommand()[i - 1];
    }
    LOGGER.info(
        McCabeMessages.getString(
            "logs.running_parsing",
            new Object[] {mProject.getParent().getName(), mProject.getName()}));
    mProcess =
        createProcessManager(
            parseCommand, mConfiguration.getSubWorkspace(), mConfiguration.getLogger());
    // On veut gérer les informations lancées par le processus en sortie
    mProcess.setOutputHandler(this);
    // On cherche à avoir un comportement synchrone pour être sûr de ne pas
    // avoir un état des données incohérent
    int resultParse = mProcess.startProcess(this);
    LOGGER.info(
        McCabeMessages.getString(
            "logs.return_parsing",
            new Object[] {
              mProject.getParent().getName(), mProject.getName(), new Integer(resultParse)
            }));

    return resultParse;
  }