ca.myewb.model.PostModel.java Source code

Java tutorial

Introduction

Here is the source code for ca.myewb.model.PostModel.java

Source

/*
    
This file is part of OpenMyEWB.
    
OpenMyEWB is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
OpenMyEWB is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with OpenMyEWB.  If not, see <http://www.gnu.org/licenses/>.
    
OpenMyEWB is Copyright 2005-2009 Nicolas Kruchten (nicolas@kruchten.com), Francis Kung, Engineers Without Borders Canada, Michael Trauttmansdorff, Jon Fishbein, David Kadish
    
*/

package ca.myewb.model;

import java.io.StringWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.hibernate.Session;

import ca.myewb.beans.Post;
import ca.myewb.frame.Helpers;
import ca.myewb.frame.HibernateUtil;
import ca.myewb.frame.SafeHibList;
import ca.myewb.frame.servlet.AjaxServlet;
import ca.myewb.logic.PostLogic;
import ca.myewb.logic.TagLogic;

public class PostModel extends PostLogic {

    PostModel() {
        super();
    }

    public static PostModel newPost(UserModel currentUser, GroupModel targetGroup, String subject, String intro,
            String body, String unsplitTags) {
        return newPost(currentUser, targetGroup, subject, intro, body, unsplitTags, false);
    }

    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;
    }

    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 void delete() {
        delete(true);
    }

    public void delete(boolean removeFromParent) {
        AjaxServlet.invalidateFrontPageCache(getGroup().getId());
        if (parent == null) {
            //we're a toplevel post

            if (getWhiteboard() == null) {
                Iterator<PostModel> it = replies.iterator();
                while (it.hasNext()) {
                    PostModel reply = it.next();
                    reply.delete(false);
                    it.remove();
                    reply.setParent(null);
                }
            } else {
                getWhiteboard().delete();
            }
        } else {
            //we're a reply
            subject = "reply";
            intro = "parent's subject was: " + parent.getSubject();

            Calendar lReply = GregorianCalendar.getInstance();
            Calendar rCal = GregorianCalendar.getInstance();
            lReply.setTime(parent.getDate());

            for (PostModel r : parent.getReplies()) {
                rCal.setTime(r.getDate());
                if (!r.getGroup().equals(Helpers.getGroup("DeletedPosts")) && lReply.before(rCal)
                        && !r.equals(this)) {
                    lReply.setTime(r.getDate());
                }
            }

            parent.setLastReply(lReply.getTime());
            if (removeFromParent) {
                parent.getReplies().remove(this);
                parent = null;
            }
        }

        subject = "*deleted* " + subject;
        intro = "deleted " + (new Date()).toString() + ", original group was: " + group.getName() + "\n- - -\n"
                + intro;
        this.group = Helpers.getGroup("DeletedPosts");
        getSearchable().delete();
    }

    public PostModel clone() {
        PostModel p2 = new PostModel();
        p2.setPoster(getPoster());
        p2.setGroup(group);
        p2.setSubject(subject);
        p2.setIntro(intro);
        p2.setBody(body);
        p2.setDate(date);
        p2.setTags(tags);
        p2.setParent(parent);
        p2.setReplies(replies);
        p2.newReplies = newReplies;
        p2.setEmailed(emailed);

        return p2;
    }

    public void sendAsEmail(String sender) throws Exception {
        sendAsEmail(sender, null);
    }

    public void sendAsEmail(String sender, List<String> excludedEmails) throws Exception {
        String htmlMessage = doTemplateMerge(this, "emails/post.html.vm");
        String textMessage = doTemplateMerge(this, "emails/post.txt.vm");

        String shortname = getGroup().getTotalShortname();
        String fullSubject;

        if (parent == null) {
            this.setEmailed(true);
            fullSubject = "[" + shortname + "] " + subject;
        } else {
            fullSubject = "Re: [" + shortname + "] " + parent.getSubject();
        }

        List<String> groupMemberEmails = getGroup().getMemberEmails();
        if (excludedEmails != null) {
            groupMemberEmails.removeAll(excludedEmails);
        }

        if (!groupMemberEmails.isEmpty()) {
            EmailModel.sendEmail(sender, groupMemberEmails, fullSubject, textMessage, htmlMessage, shortname, true);
        }
    }

    public void sendAsWatchListEmail(String sender, List<String> emailsForReplies) throws Exception {
        String htmlMessage = doTemplateMerge(this, "emails/post.html.vm");
        String textMessage = doTemplateMerge(this, "emails/post.txt.vm");

        String shortname = Helpers.getEnShortName() + "-watchlist";
        String fullSubject = "Re: [" + shortname + "] " + parent.getSubject();

        EmailModel.sendEmail(sender, emailsForReplies, fullSubject, textMessage, htmlMessage, shortname, false);
    }

    private String doTemplateMerge(PostLogic post, String templatePath) throws Exception {
        Template template = Velocity.getTemplate(templatePath);
        VelocityContext ctx = new VelocityContext();
        ctx.put("post", post);
        ctx.put("helpers", new Helpers());

        StringWriter writer = new StringWriter();
        template.merge(ctx, writer);

        String toString = writer.toString();

        return toString;
    }

    public static Date getLatestReplyDate() {
        String sql = " SELECT max(`lastReply`) FROM posts ";
        return (Date) HibernateUtil.currentSession().createSQLQuery(sql).uniqueResult();
    }

    public List<String> getEmailsForReplies() {
        return new SafeHibList<String>(HibernateUtil.currentSession().createSQLQuery(
                "SELECT DISTINCT u.email FROM users u, flaggedposts p WHERE u.repliesasemails = 0b1 AND u.id = p.userid AND p.postid = :pid")
                .setInteger("pid", getId())).list();
    }

}