com.concursive.connect.web.modules.activity.utils.ProjectHistoryUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.concursive.connect.web.modules.activity.utils.ProjectHistoryUtils.java

Source

/*
 * ConcourseConnect
 * Copyright 2010 Concursive Corporation
 * http://www.concursive.com
 *
 * This file is part of ConcourseConnect and is licensed under a commercial
 * license, not an open source license.
 *
 * Attribution Notice: ConcourseConnect is an Original Work of software created
 * by Concursive Corporation
 */
package com.concursive.connect.web.modules.activity.utils;

import com.concursive.connect.web.modules.activity.beans.ProjectHistoryReplyBean;
import com.concursive.connect.web.modules.activity.dao.ProjectHistory;
import com.concursive.connect.web.modules.activity.dao.ProjectHistoryList;
import com.concursive.connect.web.modules.login.dao.User;
import com.concursive.connect.web.modules.login.utils.UserUtils;
import com.concursive.connect.web.modules.wiki.utils.WikiLink;
import com.concursive.connect.web.modules.wiki.utils.WikiUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Utilities for working with ProjectHistory classes
 *
 * @author matt rajkowski
 * @created Jan 13, 2010 11:57:31 AM
 */
public class ProjectHistoryUtils {
    private static final Log LOG = LogFactory.getLog(ProjectHistoryUtils.class);

    public synchronized static void insertReply(Connection db, ProjectHistory parentProjectHistory,
            ProjectHistoryReplyBean reply, User user) throws SQLException {
        // Construct a project history based on the parent project history and the reply bean
        ProjectHistory projectHistory = new ProjectHistory();
        projectHistory.setEnteredBy(user.getId());
        projectHistory.setProjectId(parentProjectHistory.getProjectId());
        projectHistory.setEventType(ProjectHistoryList.ADD_ACTIVITY_ENTRY_EVENT);
        if (ProjectHistoryList.SITE_CHATTER_OBJECT.equals(parentProjectHistory.getLinkObject())) {
            // Maintain the site-chatter value
            projectHistory.setLinkObject(ProjectHistoryList.SITE_CHATTER_OBJECT);
        } else {
            // Default to a user-entry value
            projectHistory.setLinkObject(ProjectHistoryList.ACTIVITY_ENTRY_OBJECT);
        }
        projectHistory.setLinkItemId(user.getId());
        // @todo move to application.xml
        projectHistory
                .setDescription(WikiLink.generateLink(user.getProfileProject())
                        + (parentProjectHistory.getProjectId() != user.getProfileProject().getId() ? " @"
                                + WikiLink.generateLink(parentProjectHistory.getProject()) : "")
                        + (user.getId() != parentProjectHistory.getEnteredBy()
                                ? " in reply to " + WikiLink.generateLink(
                                        UserUtils.loadUser(parentProjectHistory.getEnteredBy()).getProfileProject())
                                : "")
                        + ": " + WikiUtils.addWikiLinks(reply.getDescription()));
        projectHistory.setParentId(parentProjectHistory.getId());
        if (parentProjectHistory.getTopId() > -1) {
            projectHistory.setTopId(parentProjectHistory.getTopId());
        } else {
            projectHistory.setTopId(parentProjectHistory.getId());
        }
        projectHistory.setPosition(ProjectHistoryUtils.findNextPosition(db, projectHistory.getTopId()));
        projectHistory.setThreadPosition(ProjectHistoryUtils.findNextThreadPosition(db, parentProjectHistory));
        projectHistory.setIndent(parentProjectHistory.getIndent() + 1);
        projectHistory.setRelativeEnteredby(parentProjectHistory.getEnteredBy());
        projectHistory.setLineage(parentProjectHistory.getLineage() + parentProjectHistory.getId() + "/");

        // Reply transaction
        try {
            db.setAutoCommit(false);
            projectHistory.updateThreadPosition(db);
            projectHistory.updateChildCount(db);
            projectHistory.insert(db);
            projectHistory.updateRelativeDate(db);
            db.commit();
        } catch (Exception e) {
            db.rollback();
        } finally {
            db.setAutoCommit(true);
        }

    }

    public static int findNextPosition(Connection db, int projectHistoryId) throws SQLException {
        int position = 0;
        PreparedStatement pst = db.prepareStatement("SELECT max(position) AS position " + "FROM project_history "
                + "WHERE history_id = ? OR top_id = ? ");
        pst.setInt(1, projectHistoryId);
        pst.setInt(2, projectHistoryId);
        ResultSet rs = pst.executeQuery();
        if (rs.next()) {
            position = rs.getInt("position");
        }
        rs.close();
        pst.close();
        return (position + 1);
    }

    public static int findNextThreadPosition(Connection db, ProjectHistory parentProjectHistory)
            throws SQLException {
        int count = 0;
        PreparedStatement pst = db
                .prepareStatement("SELECT count(*) AS ccount " + "FROM project_history " + "WHERE lineage LIKE ? ");
        pst.setString(1, parentProjectHistory.getLineage() + parentProjectHistory.getId() + "/%");
        ResultSet rs = pst.executeQuery();
        if (rs.next()) {
            count = rs.getInt("ccount");
        }
        rs.close();
        pst.close();
        return (parentProjectHistory.getThreadPosition() + count + 1);
    }

    public static int queryAdditionalCommentsCount(Connection db, ProjectHistory projectHistory)
            throws SQLException {
        int count = 0;
        int topId = projectHistory.getTopId();
        if (topId == -1) {
            topId = projectHistory.getId();
        }
        PreparedStatement pst = db.prepareStatement("SELECT count(*) AS comment_count " + "FROM project_history "
                + "WHERE top_id = ? AND position > ? ");
        pst.setInt(1, topId);
        pst.setInt(2, projectHistory.getPosition());
        ResultSet rs = pst.executeQuery();
        if (rs.next()) {
            count = rs.getInt("comment_count");
        }
        rs.close();
        pst.close();
        return count;
    }
}