public PostModel reply(UserModel currentUser, String body, String tags) {
    if (!hasActiveWhiteboard()) {
      Session hibernateSession = HibernateUtil.currentSession();
      PostModel p = new PostModel();
      hibernateSession.save(p);
      AjaxServlet.invalidateFrontPageCache(getGroup().getId());

      p.setBody(body);
      addReply(p); // sets group on reply

      Logger.getLogger(this.getClass())
          .info("Post " + this.getId() + " has " + this.getReplies().size() + " replies.");

      if (this.getReplies().size() == Post.RepliesToFeature) {
        this.feature();
      }

      if (this.isFeatured()) {
        p.feature();
      }

      for (String tag : TagLogic.extractTagNames(tags)) {
        addTag(TagModel.getOrCreateTag(tag));
      }

      currentUser.addPost(p);

      setLastReply(new Date());

      hibernateSession.flush();
      Helpers.currentDailyStats().logReply();

      p.setSearchable(SearchableModel.newSearchable(p, null, null));

      return p;
    } else {
      Logger.getLogger(this.getClass()).debug("Tried to reply to a post that has a whiteboard.");
      return null;
    }
  }
  public static PostModel newPost(
      UserModel currentUser,
      GroupModel targetGroup,
      String subject,
      String intro,
      String body,
      String unsplitTags,
      boolean whiteboard) {
    Session hibernateSession = HibernateUtil.currentSession();
    PostModel p = new PostModel();
    hibernateSession.save(p);
    AjaxServlet.invalidateFrontPageCache(targetGroup.getId());

    p.setSubject(subject);
    p.setIntro(intro);

    if (!body.trim().equals("")) {
      p.setBody(body);
    }

    targetGroup.addPost(p);

    for (String tag : TagLogic.extractTagNames(unsplitTags)) {
      p.addTag(TagModel.getOrCreateTag(tag));
    }

    currentUser.addPost(p);

    hibernateSession.flush();

    if (whiteboard) {
      p.setWhiteboard(WhiteboardModel.newWhiteboard(null, p, null));
    }
    Helpers.currentDailyStats().logPost();

    p.setSearchable(SearchableModel.newSearchable(p, null, null));

    return p;
  }