/**
   * {@inheritDoc}
   *
   * @param reportContainer
   */
  @Override
  protected Object getReportPlotData(
      ReportSearchCondition cond, ReportProcessReturnContainer reportContainer) {
    // 検索条件を取得する。
    String database = cond.getDatabases().get(0);
    Timestamp startTime = cond.getStartDate();
    Timestamp endTime = cond.getEndDate();

    // DBからデータを検索する。
    List<ItemData> commonsPoolSizeData = null;
    try {
      commonsPoolSizeData =
          GraphItemAccessUtil.findItemData(
              database,
              Constants.ITEMNAME_POOL_SIZE,
              CompressOperator.SIMPLE_AVERAGE,
              startTime,
              endTime);
    } catch (SQLException ex) {
      LOGGER.log(
          LogIdConstants.EXCEPTION_IN_READING,
          ex,
          ReporterConfigAccessor.getReportName(getReportType()));
      return null;
    }

    return commonsPoolSizeData;
  }
  /**
   * {@inheritDoc}
   *
   * @param cond
   * @param reportContainer
   */
  @SuppressWarnings("unchecked")
  @Override
  protected void outputReport(
      Object plotData, ReportSearchCondition cond, ReportProcessReturnContainer reportContainer) {
    List<ItemData> commonsPoolSizeData = (List<ItemData>) plotData;

    // 項目名が"Max:[email protected]","Num:[email protected]"となっているので、
    // ":"の後が等しいものをまとめ、同一のグラフに出力する。
    Map<String, List<ServerPoolRecord>> serverPoolRecordMap =
        new HashMap<String, List<ServerPoolRecord>>();
    for (ItemData itemData : commonsPoolSizeData) {
      String[] itemName = StringUtils.split(itemData.getItemName(), ":");
      if (!serverPoolRecordMap.containsKey(itemName[1])) {
        List<ServerPoolRecord> serverPoolRecords = new ArrayList<ServerPoolRecord>(200);
        for (ItemRecord itemRecord : itemData.getRecords()) {
          ServerPoolRecord serverPoolRecord = new ServerPoolRecord();
          serverPoolRecord.setMeasurementTime(itemRecord.getMeasurementTime());
          serverPoolRecords.add(serverPoolRecord);
        }
        serverPoolRecordMap.put(itemName[1], serverPoolRecords);
      }
      for (int index = 0; index < itemData.getRecords().size(); index++) {
        ItemRecord itemRecord = itemData.getRecords().get(index);
        ServerPoolRecord serverPoolRecord = serverPoolRecordMap.get(itemName[1]).get(index);
        if ("Max".equals(itemName[0])) {
          serverPoolRecord.setServerPoolMax(itemRecord.getValue());
        } else if ("Num".equals(itemName[0])) {
          serverPoolRecord.setServerPoolNum(itemRecord.getValue());
        }
      }
    }

    // 出力するレポートの種類に応じて、テンプレートのファイルパスを取得する。
    String templateFilePath;
    try {
      templateFilePath = TemplateFileManager.getInstance().getTemplateFile(ReportType.SERVER_POOL);
    } catch (IOException exception) {
      reportContainer.setHappendedError(exception);
      return;
    }

    // レポート出力の引数情報を取得する。
    String outputFolderPath =
        getOutputFolderName()
            + File.separator
            + ReporterConfigAccessor.getProperty(super.getReportType().getId() + ".outputFile");
    Timestamp startTime = cond.getStartDate();
    Timestamp endTime = cond.getEndDate();

    // レポート出力を実行する。
    RecordReporter<ServerPoolRecord> reporter =
        new RecordReporter<ServerPoolRecord>(getReportType());

    for (Map.Entry<String, List<ServerPoolRecord>> serverPoolRecordEntry :
        serverPoolRecordMap.entrySet()) {
      ServerPoolRecord[] records =
          serverPoolRecordEntry.getValue().toArray(new ServerPoolRecord[] {});
      String itemName = serverPoolRecordEntry.getKey();
      String[] graphTitles = {"Commons Poolのサイズ(" + itemName + ")"};
      reporter.outputReport(
          templateFilePath, outputFolderPath, itemName, graphTitles, records, startTime, endTime);
    }
  }