public static void writeSeriesFile(
     AbstractProject<?, ?> project,
     String baseDateStr,
     String fileName,
     final AbstractBuild<?, ?> shimeBuild,
     PrintStream out,
     PrintStream err) {
   // stdout.printf("[%s]\n",
   // shimeBuild.getRootDir().getAbsolutePath());
   // stdout.printf("[%s]:[%s]:[%s]\n", baseDateStr,
   // shimeBuild.getNumber(), shimeBuild.getId());
   String prevData = PMUtils.findSeriesFile(project, fileName, out, err);
   String currentData = PMUtils.appendData(prevData, shimeBuild.getNumber(), baseDateStr);
   File file = new File(shimeBuild.getRootDir().getAbsolutePath(), fileName);
   WriteUtils.writeFile(currentData.getBytes(), file);
   out.printf("EVM時系列情報ファイル(%s)に情報を追記してビルド #%s に書き込みました。\n", fileName, shimeBuild.getNumber());
   out.printf("書き込み先: #%s \n", shimeBuild.getRootDir().getAbsolutePath());
 }
  /**
   * そのプロジェクトで、シメに使われたビルドの中で最新のビルドを返す。
   *
   * @param project
   * @return
   * @throws IOException
   */
  public static AbstractBuild<?, ?> findNewestBuild(AbstractProject project) throws IOException {
    String shimeFileName = PMConstants.DATE_DAT_FILENAME;
    AbstractBuild<?, ?> prevBuild = PMUtils.findBuild(project, shimeFileName);

    if (prevBuild != null) {
      return prevBuild;
    }
    return null;
  }
  /**
   * そのビルドを含むプロジェクトの基準日ファイルをさがし、基準日を取得する。
   *
   * @param build
   * @throws IOException
   */
  public static File findBaseDateFile(AbstractProject project) throws IOException {
    String shimeFileName = PMConstants.DATE_DAT_FILENAME;
    AbstractBuild<?, ?> prevBuild = PMUtils.findBuild(project, shimeFileName);

    if (prevBuild != null) {
      File target = new File(prevBuild.getRootDir(), shimeFileName);
      return target;
    }
    return null;
  }
 public static EVMViewBean getCurrentPVACEV(Job<?, ?> project) {
   final Run<?, ?> tb = project.getLastSuccessfulBuild();
   Run<?, ?> b = project.getLastBuild();
   while (b != null) {
     ProjectSummaryAction a =
         PMUtils.findActionByUrlEndsWith(b, ProjectSummaryAction.class, PMConstants.BASE);
     if (a != null) return a.getCurrentPVACEV();
     if (b == tb)
       // if even the last successful build didn't produce the test
       // result,
       // that means we just don't have any tests configured.
       return null;
     b = b.getPreviousBuild();
   }
   return null;
 }
 /**
  * 渡されたプロジェクトのうち、渡されたファイルがビルドディレクトリに存在する、直近のビルドを探して、返します。
  *
  * @param project
  * @param fileName
  * @param out
  * @param err
  * @return
  */
 public static String findSeriesFile(
     AbstractProject<?, ?> project, String fileName, PrintStream out, PrintStream err) {
   AbstractBuild<?, ?> build = PMUtils.findBuild(project, fileName);
   if (build == null) {
     out.printf("EVM時系列情報ファイル(%s)がプロジェクト上に存在しないので、ファイルを新規作成します。\n", fileName);
     return null;
   } else {
     out.printf("EVM時系列情報ファイル(%s)が ビルド #%s 上に見つかりました。\n", fileName, build.getNumber());
   }
   try {
     return ReadUtils.readFile(new File(build.getRootDir(), fileName));
   } catch (IOException e) {
     err.println("EVM時系列情報ファイルを探す際にエラーが発生したので、ファイルを新規作成します。");
   }
   return null;
 }
  public static void checkProjectAndMail(
      Project project,
      String otherAddresses,
      AbstractBuild build,
      BuildListener listener,
      boolean sendAll)
      throws IOException {

    // 参考 org.jenkinsci.plugins.tokenmacro.impl.BuildUrlMacro
    String BUILD_URL =
        new StringBuilder()
            .append(Hudson.getInstance().getRootUrl())
            .append(build.getUrl())
            .toString();
    String PROJECT_NAME = build.getProject().getName();
    String BUILD_NUMBER = String.valueOf(build.getNumber());

    String subject = String.format("%s - Build # %s のタスク", PROJECT_NAME, BUILD_NUMBER);
    String footer = String.format("Check console output at %s to view the results.", BUILD_URL);
    // ///////////////// 以下メール送信系の処理

    String header = null;
    List<PVACEVViewBean> list = null;
    if (!sendAll) {
      list = ViewUtils.getIsCheckPVACEVViewList(project);
      header = "以下、期限が過ぎましたが完了していない要注意タスクです。 ";
    } else {
      list = ViewUtils.getPVACEVViewBeanList(project);
      header = "以下、条件に合致したタスクです。 ";
    }

    if (list.isEmpty()) {
      listener.getLogger().println("[EVM Tools] : 要注意タスクはありませんでした。");
      return;
    }
    StringBuffer messageBuf = new StringBuffer();
    messageBuf.append(header);
    messageBuf.append("\n");
    messageBuf.append("\n");
    messageBuf.append("--------------------");
    messageBuf.append("\n");
    messageBuf.append("担当者\tタスクID\tタスク名\t期限");
    messageBuf.append("\n");
    for (PVACEVViewBean bean : list) {
      Date scheduledEndDate = bean.getScheduledEndDate();
      String endDate = "未設定";
      if (scheduledEndDate != null) {
        endDate = DateFormatUtils.format(scheduledEndDate, "yyyy/MM/dd");
      }
      String personInCharge =
          StringUtils.isEmpty(bean.getPersonInCharge()) ? "未設定" : bean.getPersonInCharge();

      String line =
          String.format(
              "%s\t%s\t%s\t%s", personInCharge, bean.getTaskId(), bean.getTaskName(), endDate);
      messageBuf.append(line);
      messageBuf.append("\n");
    }
    messageBuf.append("--------------------");
    messageBuf.append("\n");
    messageBuf.append("\n");
    messageBuf.append(footer);

    String message = new String(messageBuf);
    listener.getLogger().println("[EVM Tools] : --- 要注意タスク--- ");
    listener.getLogger().println(message);
    listener.getLogger().println("[EVM Tools] : --- 要注意タスク--- ");

    DescriptorImpl descriptor =
        (DescriptorImpl) Jenkins.getInstance().getDescriptor(EVMToolsBuilder.class);

    boolean useMail = !StringUtils.isEmpty(descriptor.getAddresses());
    listener.getLogger().println("[EVM Tools] メール送信する? :" + useMail);
    String address =
        StringUtils.isEmpty(otherAddresses) ? descriptor.getAddresses() : otherAddresses;
    listener.getLogger().println("[EVM Tools] 宛先:" + address);
    listener.getLogger().println("[EVM Tools] 期限切れ以外も通知?:" + sendAll);

    if (useMail && !StringUtils.isEmpty(address)) {
      String[] addresses = Utils.parseCommna(address);
      for (String string : addresses) {
        System.out.printf("[%s]\n", string);
      }
      try {
        if (addresses.length > 0) {
          PMUtils.sendMail(addresses, subject, message);
        } else {
          String errorMsg = "メール送信に失敗しました。宛先の設定がされていません";
          listener.getLogger().println("[EVM Tools] " + errorMsg);
          throw new AbortException(errorMsg);
        }
      } catch (MessagingException e) {
        String errorMsg = "メール送信に失敗しました。「システムの設定」で E-mail 通知 の設定や宛先などを見直してください";
        listener.getLogger().println("[EVM Tools] " + errorMsg);
        throw new AbortException(errorMsg);
      }
    }
  }