private static String createLogMessage(final CallTree tree, final CallTreeNode node) {
   String jvnCallMessage;
   if (node.isFieldAccess()) {
     jvnCallMessage =
         JavelinLogMaker.createJavelinLog(ID_FIELD_READ, node.getStartTime(), tree, node);
   } else {
     jvnCallMessage = JavelinLogMaker.createJavelinLog(ID_CALL, node.getStartTime(), tree, node);
   }
   return jvnCallMessage;
 }
 /**
  * CallTreeに保存された全てのInvocationと実行時間を再帰的にListに保存します。<br>
  *
  * @param invocationList Invocationを保存するリスト。
  * @param accumulateTimeList 実行時間を保存するリスト。
  * @param node CallTreeNode
  */
 private void addInvocationList(
     List<Invocation> invocationList, List<Long> accumulateTimeList, final CallTreeNode node) {
   invocationList.add(node.getInvocation());
   accumulateTimeList.add(node.getAccumulatedTime());
   List<CallTreeNode> children = node.getChildren();
   for (int index = 0; index < children.size(); index++) {
     CallTreeNode child = children.get(index);
     addInvocationList(invocationList, accumulateTimeList, child);
   }
 }
  private static void writeThrowLog(
      final StringBuilder writer, final CallTree tree, final CallTreeNode node) {
    String jvnThrowMessage =
        JavelinLogMaker.createJavelinLog(ID_THROW, node.getThrowTime(), tree, node);

    // ファイルに1メッセージを書き込む。
    if (jvnThrowMessage != null) {
      writer.append(jvnThrowMessage);
    }
  }
  /**
   * Javelinログとして、ファイルに出力する。 javelin.download.maxを超える場合には、分割して送信する。
   *
   * @param jvnLogBuilder ライター
   * @param tree {@link CallTree}オブジェクト
   * @param node ノード。
   * @param endNode ログに出力する CallTree の最後のノード(このノードまで出力される)
   * @param callback JavelinCallback。
   * @param jvnFileFullPath jvnファイルのフルパス。
   * @param jvnFileName jvnファイル名。
   * @param telegramId 電文 ID。
   * @param itemName アイテム名。
   * @return 引き続きノードを出力する場合は <code>true</code> 、ノード出力を終了する場合は <code>false</code>
   */
  public static boolean generateJavelinFileImpl(
      final StringBuilder jvnLogBuilder,
      final CallTree tree,
      final CallTreeNode node,
      final CallTreeNode endNode,
      JavelinLogCallback callback,
      String jvnFileName,
      String jvnFileFullPath,
      final long telegramId,
      final String itemName) {
    JavelinConfig config = new JavelinConfig();
    if (jvnLogBuilder.length() > config.getJvnDownloadMax()) {
      flushBuffer(
          jvnLogBuilder, jvnFileName, jvnFileFullPath, callback, config, telegramId, itemName);
    }

    if (node == null) {
      StackTraceElement[] stacktraces = ThreadUtil.getCurrentStackTrace();
      String stackTraceStr = "(JavelinFileGenerator#generateJavelinFileImpl) node is NULL.\n";
      stackTraceStr += ThreadUtil.getStackTrace(stacktraces, stacktraces.length);
      SystemLogger.getInstance().warn(stackTraceStr);
      return true;
    }

    // ファイルに1メッセージを書き込む。
    if (node.getInvocation() != null) {
      String jvnCallMessage = createLogMessage(tree, node);
      if (jvnCallMessage != null) {
        jvnLogBuilder.append(jvnCallMessage);
      }
    }

    List<CallTreeNode> children = node.getChildren();
    boolean continuePrint = true;
    for (int index = 0; index < children.size(); index++) {
      CallTreeNode child = children.get(index);
      continuePrint =
          generateJavelinFileImpl(
              jvnLogBuilder,
              tree,
              child,
              endNode,
              callback,
              jvnFileName,
              jvnFileFullPath,
              telegramId,
              itemName);
      if (continuePrint == false || child == endNode) {
        continuePrint = false;
        break;
      }
    }

    // Throwログを書き込む。
    if (node.getThrowable() != null) {
      writeThrowLog(jvnLogBuilder, tree, node);
    }

    // Eventログを書き込む。
    CommonEvent[] eventList = node.getEventList();
    if (eventList != null) {
      for (CommonEvent event : eventList) {
        writeEventLog(jvnLogBuilder, tree, node, event);
      }
    }

    String jvnReturnMessage = "";
    if (node.getEndTime() >= 0) {
      if (node.isFieldAccess()) {
        jvnReturnMessage =
            JavelinLogMaker.createJavelinLog(ID_FIELD_WRITE, node.getEndTime(), tree, node);
      } else {
        jvnReturnMessage =
            JavelinLogMaker.createJavelinLog(ID_RETURN, node.getEndTime(), tree, node);
      }
    }

    // ファイルに1メッセージを書き込む。
    if (jvnReturnMessage != null) {
      jvnLogBuilder.append(jvnReturnMessage);
    }

    return continuePrint;
  }