DocFacade.java

package sk.iway.iwcm.doc;

import static sk.iway.iwcm.Tools.isEmpty;
import static sk.iway.iwcm.Tools.isInteger;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.IntRange;
import org.apache.commons.lang.math.Range;

import sk.iway.iwcm.DBPool;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.users.UsersDB;

/**
 *  DocFacade.java
 *
 *@Title        webjet4
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2010
 *@author       $Author: marosurbanec $
 *@version      $Revision: 1.3 $
 *@created      Date: 20.1.2010 18:28:46
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class DocFacade
{

	List<GroupDetails> groups;
	boolean recursive;
	Identity user;
	StringBuilder sql = new StringBuilder();
	int pageSize;
	int currentPage;
	int allDocumentsCount = 0;

	public List<DocDetails> news (Map<String, Object> options, HttpServletRequest request)
	{
		user = UsersDB.getCurrentUser(request);
		recursive = Boolean.TRUE.equals(options.get("recursive"));
		pageSize = Integer.parseInt(options.get("per_page").toString());
		currentPage = 0;

		if (isInteger(request.getParameter("page")))
			currentPage = Math.max(Integer.parseInt(request.getParameter("page")) - 1, 0);
		sql.append("SELECT * FROM documents WHERE 1 AND group_id IN(");

		String group_ids = options.get("group_ids").toString();
		getGroupsFor(group_ids);

		for (GroupDetails group : groups)
		{

			if (group.isInternal() || !canUserAccess(group))
				continue;
			sql.append(group.getGroupId()).append(',');
		}

		sql = new StringBuilder(StringUtils.chomp(sql.toString(), ",")).append(')');
		if (options.get("where_sql") != null)
			sql.append(' ').append(options.get("where_sql").toString()).append(' ');

		sql.append(" ORDER BY ").append(options.get("order_by"));

		List<DocDetails> documents;
		Logger.debug(getClass(), "Getting documents: "+sql);
		documents = retrieveDocumentsMatchingSql();

		request.setAttribute("page_count", allDocumentsCount % pageSize == 0 ? allDocumentsCount / pageSize : allDocumentsCount / pageSize + 1);
		return new ArrayList<DocDetails>(documents.subList(0, documents.size() < pageSize ? documents.size() : pageSize));
	}

	private boolean canUserAccess(GroupDetails group)
	{
		if (isEmpty(group.getPasswordProtected()))
			return true;

		if (user == null)
			return false;

		List<String> userGroups = Arrays.asList(user.getUserGroupsIds().split(","));
		List<String> groupsWithAccess = Arrays.asList(group.getPasswordProtected().split(","));

		return CollectionUtils.containsAny(userGroups, groupsWithAccess);
	}

	private void getGroupsFor(String groupIds)
	{
		groups = new ArrayList<GroupDetails>();

		groupIds = groupIds.replace("+", ",");

		if (recursive)
			groupIds = GroupsDB.getRecursiveGroupsSqlIn(groupIds);

		for (String id : groupIds.split(","))
		{
			int groupId = Integer.parseInt(id);
			groups.add(GroupsDB.getInstance().findGroup(groupId));
		}
	}

	private List<DocDetails> retrieveDocumentsMatchingSql()
	{
		Connection db_conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<DocDetails> documents = new ArrayList<DocDetails>();
		try
		{
			db_conn = DBPool.getConnection();
			ps = db_conn.prepareStatement(sql.toString());
			rs = ps.executeQuery();
			Range pagingFilter = new IntRange(currentPage*pageSize + 1, (currentPage+1)*pageSize);
			while (rs.next())
			{
				if (pagingFilter.containsInteger(++allDocumentsCount))
					documents.add(DocDB.getDocDetails(rs, true, true));
			}
			rs.close();
			ps.close();
			db_conn.close();
			rs = null;
			ps = null;
			db_conn = null;
		}
		catch (Exception ex)
		{
			sk.iway.iwcm.Logger.error(ex);
		}
		finally
		{
			try
			{
				if (rs != null)
					rs.close();
				if (ps != null)
					ps.close();
				if (db_conn != null)
					db_conn.close();
			}
			catch (Exception ex2)
			{
			}
		}
		return documents;
	}
}