public void doRespondingTimeGraph(StaplerRequest request, StaplerResponse response)
      throws IOException {
    PerformanceReportPosition performanceReportPosition = new PerformanceReportPosition();
    request.bindParameters(performanceReportPosition);
    String performanceReportNameFile = performanceReportPosition.getPerformanceReportPosition();
    if (performanceReportNameFile == null) {
      if (getPerformanceReportList().size() == 1) {
        performanceReportNameFile = getPerformanceReportList().get(0);
      } else {
        return;
      }
    }
    if (ChartUtil.awtProblemCause != null) {
      // not available. send out error message
      response.sendRedirect2(request.getContextPath() + "/images/headless.png");
      return;
    }
    DataSetBuilder<String, NumberOnlyBuildLabel> dataSetBuilderAverage =
        new DataSetBuilder<String, NumberOnlyBuildLabel>();
    List<?> builds = getProject().getBuilds();
    List<Integer> buildsLimits = getFirstAndLastBuild(request, builds);

    int nbBuildsToAnalyze = builds.size();
    for (Iterator<?> iterator = builds.iterator(); iterator.hasNext(); ) {
      AbstractBuild<?, ?> currentBuild = (AbstractBuild<?, ?>) iterator.next();
      if (nbBuildsToAnalyze <= buildsLimits.get(1) && buildsLimits.get(0) <= nbBuildsToAnalyze) {
        NumberOnlyBuildLabel label = new NumberOnlyBuildLabel(currentBuild);
        PerformanceBuildAction performanceBuildAction =
            currentBuild.getAction(PerformanceBuildAction.class);
        if (performanceBuildAction == null) {
          continue;
        }
        PerformanceReport performanceReport =
            performanceBuildAction
                .getPerformanceReportMap()
                .getPerformanceReport(performanceReportNameFile);
        if (performanceReport == null) {
          nbBuildsToAnalyze--;
          continue;
        }
        dataSetBuilderAverage.add(
            performanceReport.getMedian(), Messages.ProjectAction_Median(), label);
        dataSetBuilderAverage.add(
            performanceReport.getAverage(), Messages.ProjectAction_Average(), label);
        dataSetBuilderAverage.add(
            performanceReport.get90Line(), Messages.ProjectAction_Line90(), label);
      }
      nbBuildsToAnalyze--;
    }
    ChartUtil.generateGraph(
        request, response, createRespondingTimeChart(dataSetBuilderAverage.build()), 400, 200);
  }
  @Override
  public Collection<PerformanceReport> parse(
      AbstractBuild<?, ?> build, Collection<File> reports, TaskListener listener)
      throws IOException {
    List<PerformanceReport> result = new ArrayList<PerformanceReport>();

    PrintStream logger = listener.getLogger();
    for (File f : reports) {
      final PerformanceReport r = new PerformanceReport();
      r.setReportFileName(f.getName());
      logger.println("Performance: Parsing JMeter report file " + f.getName());
      BufferedReader reader = new BufferedReader(new FileReader(f));
      try {
        String line = reader.readLine();
        if (line != null && skipFirstLine) {
          logger.println("Performance: Skipping first line");
          line = reader.readLine();
        }
        while (line != null) {
          HttpSample sample = getSample(line);
          if (sample != null) {
            try {
              r.addSample(sample);
            } catch (SAXException e) {
              throw new RuntimeException("Unnable to add sample for line " + line, e);
            }
          }
          line = reader.readLine();
        }
      } finally {
        if (reader != null) reader.close();
      }
      result.add(r);
    }
    return result;
  }
  private DataSetBuilder getTrendReportData(
      final StaplerRequest request, String performanceReportNameFile) {

    DataSetBuilder<String, NumberOnlyBuildLabel> dataSet =
        new DataSetBuilder<String, NumberOnlyBuildLabel>();
    List<?> builds = getProject().getBuilds();
    List<Integer> buildsLimits = getFirstAndLastBuild(request, builds);

    int nbBuildsToAnalyze = builds.size();
    for (Iterator<?> iterator = builds.iterator(); iterator.hasNext(); ) {
      AbstractBuild<?, ?> currentBuild = (AbstractBuild<?, ?>) iterator.next();
      if (nbBuildsToAnalyze <= buildsLimits.get(1) && buildsLimits.get(0) <= nbBuildsToAnalyze) {
        NumberOnlyBuildLabel label = new NumberOnlyBuildLabel(currentBuild);
        PerformanceBuildAction performanceBuildAction =
            currentBuild.getAction(PerformanceBuildAction.class);
        if (performanceBuildAction == null) {
          continue;
        }
        PerformanceReport report = null;
        report =
            performanceBuildAction
                .getPerformanceReportMap()
                .getPerformanceReport(performanceReportNameFile);
        if (report == null) {
          nbBuildsToAnalyze--;
          continue;
        }
        dataSet.add(Math.round(report.getAverage()), Messages.ProjectAction_Average(), label);
        dataSet.add(Math.round(report.getMedian()), Messages.ProjectAction_Median(), label);
        dataSet.add(Math.round(report.get90Line()), Messages.ProjectAction_Line90(), label);
        dataSet.add(Math.round(report.getMin()), Messages.ProjectAction_Minimum(), label);
        dataSet.add(Math.round(report.getMax()), Messages.ProjectAction_Maximum(), label);
        dataSet.add(
            Math.round(report.errorPercent()), Messages.ProjectAction_PercentageOfErrors(), label);
        dataSet.add(Math.round(report.countErrors()), Messages.ProjectAction_Errors(), label);
      }
      nbBuildsToAnalyze--;
    }
    return dataSet;
  }