package net.sourceforge.solexatools.util;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.sourceforge.seqware.common.model.File;
import net.sourceforge.seqware.common.model.Study;
import org.springframework.context.support.MessageSourceAccessor;
/**
* <p>
* PaginationUtil class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class PaginationUtil {
/** Constant <code>SIZE_COUNT_TREE=20</code> */
public static final int SIZE_COUNT_TREE = 20;
/** Constant <code>SIZE_COUNT_FILE=5</code> */
public static final int SIZE_COUNT_FILE = 5;
private static String getOperation(HttpServletRequest request) {
String operation = (String) request.getParameter("action");
if (operation == null) {
operation = "";
}
return operation;
}
private static <T extends Object> List<T> subListImpl(HttpServletRequest request, String namePage, int sizeCount, List<T> list) {
List<T> result = Collections.synchronizedList(new LinkedList<T>());
if (list.isEmpty()) return result;
HttpSession session = request.getSession(false);
Integer numberPage = (Integer) session.getAttribute(namePage);
if (numberPage == null) numberPage = 0;
int count = numberPage;
String operation = getOperation(request);
// System.out.println("Operation=" + operation);
int size = list.size();
int maxCount = size / sizeCount;
if (size % sizeCount == 0) {
maxCount--;
}
// check count
if (count > maxCount) count = maxCount;
// System.out.println("maxCount = " + maxCount + ";");
if (operation.equals("next")) {
if (count < maxCount) {
count++;
}
}
if (operation.equals("previous")) {
if (count > 0) {
count--;
}
}
if (operation.equals("first")) {
count = 0;
}
if (operation.equals("last")) {
count = maxCount;
}
int addCount = sizeCount;
if (count == maxCount) {
if (size % sizeCount != 0) {
addCount = size % sizeCount;
}
}
// System.out.println("Count = " + count + "; addCount = " + addCount);
int fromIndex = count * sizeCount;
int toIndex = fromIndex + addCount;
// System.out.println("From = " + fromIndex + "; To = " + toIndex);
result = list.subList(fromIndex, toIndex);
session.setAttribute(namePage, count);
// removeOperation(request);
return result;
}
/**
* <p>
* subList.
* </p>
*
* @param page
* a int.
* @param sizeCount
* a int.
* @param list
* a {@link java.util.List} object.
* @return a {@link java.util.List} object.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static List subList(int page, int sizeCount, List list) {
List<File> result = Collections.synchronizedList(new LinkedList<File>());
if (list.isEmpty()) return result;
int size = list.size();
int maxCount = size / sizeCount;
if (size % sizeCount == 0) {
maxCount--;
}
int addCount = sizeCount;
if (page == maxCount) {
if (size % sizeCount != 0) {
addCount = size % sizeCount;
}
}
int fromIndex = page * sizeCount;
int toIndex = fromIndex + addCount;
result = list.subList(fromIndex, toIndex);
return result;
}
/**
* <p>
* subList.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param namePage
* a {@link java.lang.String} object.
* @param list
* a {@link java.util.List} object.
* @param <T>
* a T object.
* @return a {@link java.util.List} object.
*/
public static <T extends Object> List<T> subList(HttpServletRequest request, String namePage, List<T> list) {
return subListImpl(request, namePage, SIZE_COUNT_TREE, list);
}
/**
* <p>
* subList.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param namePage
* a {@link java.lang.String} object.
* @param sizeCount
* a int.
* @param list
* a {@link java.util.List} object.
* @param <T>
* a T object.
* @return a {@link java.util.List} object.
*/
public static <T extends Object> List<T> subList(HttpServletRequest request, String namePage, int sizeCount, List<T> list) {
return subListImpl(request, namePage, sizeCount, list);
}
/**
* <p>
* subListSD.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param namePage
* a {@link java.lang.String} object.
* @param list
* a {@link java.util.List} object.
* @return a {@link java.util.List} object.
*/
public static List subListSD(HttpServletRequest request, String namePage, List list) {
return subListImpl(request, namePage, SIZE_COUNT_FILE, list);
}
/**
* <p>
* getPageInfo.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param namePage
* a {@link java.lang.String} object.
* @param listView
* a {@link java.util.List} object.
* @param listAll
* a {@link java.util.List} object.
* @param nameNode
* a {@link java.lang.String} object.
* @param nameNodes
* a {@link java.lang.String} object.
* @param ma
* a {@link org.springframework.context.support.MessageSourceAccessor} object.
* @return a {@link net.sourceforge.solexatools.util.PageInfo} object.
*/
public static PageInfo getPageInfo(HttpServletRequest request, String namePage, List listView, List listAll, String nameNode,
String nameNodes, MessageSourceAccessor ma) {
PageInfo pageInfo = getPageInfoImpl(request, namePage, listView.size(), listAll.size(), SIZE_COUNT_TREE, ma);
String str = "";
// get node name
if (listView.size() > 1) {
str = " " + ma.getMessage(nameNodes) + ",";
} else if (listView.size() == 1) {
str = " " + ma.getMessage(nameNode) + ",";
}
pageInfo.setInfo(pageInfo.getInfo() + str);
return pageInfo;
}
/**
* <p>
* getPageInfoSD.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param namePage
* a {@link java.lang.String} object.
* @param listView
* a {@link java.util.List} object.
* @param allList
* a {@link java.util.List} object.
* @param ma
* a {@link org.springframework.context.support.MessageSourceAccessor} object.
* @return a {@link net.sourceforge.solexatools.util.PageInfo} object.
*/
public static PageInfo getPageInfoSD(HttpServletRequest request, String namePage, List listView, List allList, MessageSourceAccessor ma) {
return getPageInfoImpl(request, namePage, listView.size(), allList.size(), SIZE_COUNT_FILE, ma);
}
private static PageInfo getPageInfoImpl(HttpServletRequest request, String namePage, int countView, int countAll, int countPage,
MessageSourceAccessor ma) {
PageInfo pageInfo = new PageInfo();
String info = "";
if (countView == 0) {
pageInfo.setIsStart(true);
pageInfo.setIsEnd(true);
pageInfo.setInfo(info);
return pageInfo;
}
Integer numberPage = (Integer) request.getSession(false).getAttribute(namePage);
if (numberPage == null) numberPage = 0;
Integer startPos = (numberPage) * countPage + 1;
Integer endPos = (numberPage) * countPage + countView;
if (countView == 1) {
info = startPos.toString();
if (info.endsWith("1")) {
info = info + ma.getMessage("pagination.st");
} else {
info = info + ma.getMessage("pagination.th");
}
} else {
info = startPos + " — " + endPos;
}
info = info + " " + ma.getMessage("pagination.of") + " " + countAll;
if (startPos == 1) {
pageInfo.setIsStart(true);
}
if (endPos == countAll) {
pageInfo.setIsEnd(true);
}
pageInfo.setInfo(info);
return pageInfo;
}
/**
* <p>
* getPageNumber.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param requiredStudy
* a {@link net.sourceforge.seqware.common.model.Study} object.
* @param allList
* a {@link java.util.List} object.
* @return a int.
*/
public static int getPageNumber(HttpServletRequest request, Study requiredStudy, List<Study> allList) {
int size = allList.size();
int studyIndex = 1;
for (int i = 0; i < size; i++) {
if (requiredStudy.equals(allList.get(i))) {
studyIndex = i + 1;
break;
}
}
int pageNumber = studyIndex / SIZE_COUNT_TREE;
if (studyIndex % SIZE_COUNT_TREE > 0) {
pageNumber++;
}
return --pageNumber;
}
}