/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. */ package com.liferay.portal.kernel.dao.search; import com.liferay.portal.kernel.util.DeterminateKeyGenerator; import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.TextFormatter; import com.liferay.portal.kernel.util.Validator; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.servlet.http.HttpServletRequest; /** * @author Brian Wing Shun Chan */ public class SearchContainer<R> { public static final int DEFAULT_CUR = 1; public static final String DEFAULT_CUR_PARAM = "cur"; public static final int DEFAULT_DELTA = GetterUtil.getInteger( PropsUtil.get(PropsKeys.SEARCH_CONTAINER_PAGE_DEFAULT_DELTA)); public static final boolean DEFAULT_DELTA_CONFIGURABLE = true; public static final String DEFAULT_DELTA_PARAM = "delta"; public static final String DEFAULT_DEPRECATED_TOTAL_VAR = "deprecatedTotal"; public static final boolean DEFAULT_FORCE_POST = false; public static final String DEFAULT_ORDER_BY_COL_PARAM = "orderByCol"; public static final String DEFAULT_ORDER_BY_TYPE_PARAM = "orderByType"; public static final String DEFAULT_RESULTS_VAR = "results"; public static final String DEFAULT_TOTAL_VAR = "total"; public static final String DEFAULT_VAR = "searchContainer"; public static final int MAX_DELTA = 200; public SearchContainer() { _curParam = DEFAULT_CUR_PARAM; _displayTerms = null; _portletRequest = null; _searchTerms = null; } public SearchContainer( PortletRequest portletRequest, DisplayTerms displayTerms, DisplayTerms searchTerms, String curParam, int cur, int delta, PortletURL iteratorURL, List<String> headerNames, String emptyResultsMessage) { this ( portletRequest, displayTerms, searchTerms, curParam, cur, delta, iteratorURL, headerNames, emptyResultsMessage, StringPool.BLANK); } public SearchContainer( PortletRequest portletRequest, DisplayTerms displayTerms, DisplayTerms searchTerms, String curParam, int cur, int delta, PortletURL iteratorURL, List<String> headerNames, String emptyResultsMessage, String cssClass) { _portletRequest = portletRequest; _displayTerms = displayTerms; _searchTerms = searchTerms; _curParam = curParam; boolean resetCur = ParamUtil.getBoolean(portletRequest, "resetCur"); if (resetCur) { _cur = DEFAULT_CUR; } else { if (cur < 1) { _cur = ParamUtil.getInteger( portletRequest, _curParam, DEFAULT_CUR); if (_cur < 1) { _cur = DEFAULT_CUR; } } else { _cur = cur; } } if (!_curParam.equals(DEFAULT_CUR_PARAM)) { _deltaParam = DEFAULT_DELTA_PARAM + StringUtil.replace( _curParam, DEFAULT_CUR_PARAM, StringPool.BLANK); } setDelta(ParamUtil.getInteger(portletRequest, _deltaParam, delta)); _iteratorURL = iteratorURL; _iteratorURL.setParameter(_curParam, String.valueOf(_cur)); _iteratorURL.setParameter(_deltaParam, String.valueOf(_delta)); _setParameter(DisplayTerms.KEYWORDS); _setParameter(DisplayTerms.ADVANCED_SEARCH); _setParameter(DisplayTerms.AND_OPERATOR); if (headerNames != null) { _headerNames = new ArrayList<>(headerNames.size()); _headerNames.addAll(headerNames); _buildNormalizedHeaderNames(_headerNames); } _emptyResultsMessage = emptyResultsMessage; if (Validator.isNotNull(cssClass)) { _cssClass = cssClass; } } public SearchContainer( PortletRequest portletRequest, DisplayTerms displayTerms, DisplayTerms searchTerms, String curParam, int delta, PortletURL iteratorURL, List<String> headerNames, String emptyResultsMessage) { this ( portletRequest, displayTerms, searchTerms, curParam, 0, delta, iteratorURL, headerNames, emptyResultsMessage); } public SearchContainer( PortletRequest portletRequest, PortletURL iteratorURL, List<String> headerNames, String emptyResultsMessage) { this( portletRequest, null, null, DEFAULT_CUR_PARAM, DEFAULT_DELTA, iteratorURL, headerNames, emptyResultsMessage); } public String getClassName() { return _className; } public String getCssClass() { return _cssClass; } public int getCur() { return _cur; } public String getCurParam() { return _curParam; } public int getDelta() { return _delta; } public String getDeltaParam() { return _deltaParam; } public DisplayTerms getDisplayTerms() { return _displayTerms; } public String getEmptyResultsMessage() { return _emptyResultsMessage; } public String getEmptyResultsMessageCssClass() { return _emptyResultsMessageCssClass; } public int getEnd() { return _end; } public List<String> getHeaderNames() { return _headerNames; } public String getId(HttpServletRequest request, String namespace) { if (_uniqueId) { return _id; } if (Validator.isNotNull(_id)) { _id = PortalUtil.getUniqueElementId(request, namespace, _id); _uniqueId = true; return _id; } String id = null; if (Validator.isNotNull(_className)) { String simpleClassName = _className; int pos = simpleClassName.lastIndexOf(StringPool.PERIOD); if (pos != -1) { simpleClassName = simpleClassName.substring(pos + 1); } String variableCasingSimpleClassName = TextFormatter.format( simpleClassName, TextFormatter.I); id = TextFormatter.formatPlural(variableCasingSimpleClassName); id = id.concat("SearchContainer"); _id = PortalUtil.getUniqueElementId(request, namespace, id); _uniqueId = true; return _id; } id = DeterminateKeyGenerator.generate("taglib_search_container"); _id = id.concat("SearchContainer"); _uniqueId = true; return _id; } public PortletURL getIteratorURL() { return _iteratorURL; } public List<String> getNormalizedHeaderNames() { return _normalizedHeaderNames; } public Map<String, String> getOrderableHeaders() { return _orderableHeaders; } public String getOrderByCol() { return _orderByCol; } public String getOrderByColParam() { return _orderByColParam; } public OrderByComparator<R> getOrderByComparator() { return _orderByComparator; } public String getOrderByJS() { return _orderByJS; } public String getOrderByType() { return _orderByType; } public String getOrderByTypeParam() { return _orderByTypeParam; } public PortletRequest getPortletRequest() { return _portletRequest; } public int getResultEnd() { return _resultEnd; } public List<ResultRow> getResultRows() { return _resultRows; } public List<R> getResults() { return _results; } public RowChecker getRowChecker() { return _rowChecker; } public RowMover getRowMover() { return _rowMover; } public DisplayTerms getSearchTerms() { return _searchTerms; } public int getStart() { return _start; } public int getTotal() { return _total; } public String getTotalVar() { return _totalVar; } public boolean hasResults() { return !_results.isEmpty(); } public boolean isDeltaConfigurable() { return _deltaConfigurable; } public boolean isForcePost() { return _forcePost; } public boolean isHover() { return _hover; } public boolean isRecalculateCur() { if ((_total == 0) && (_cur == DEFAULT_CUR)) { return false; } if (((_cur - 1) * _delta) >= _total) { return true; } return false; } public boolean isSearch() { if (_searchTerms != null) { return _searchTerms.isSearch(); } return _search; } public void setClassName(String className) { _className = className; } public void setCssClass(String cssClass) { _cssClass = cssClass; } public void setDelta(int delta) { if (delta <= 0) { _delta = DEFAULT_DELTA; } else if (delta > MAX_DELTA) { _delta = MAX_DELTA; } else { _delta = delta; } _calculateStartAndEnd(); } public void setDeltaConfigurable(boolean deltaConfigurable) { _deltaConfigurable = deltaConfigurable; } public void setDeltaParam(String deltaParam) { _deltaParam = deltaParam; } public void setEmptyResultsMessage(String emptyResultsMessage) { _emptyResultsMessage = emptyResultsMessage; } public void setEmptyResultsMessageCssClass( String emptyResultsMessageCssClass) { _emptyResultsMessageCssClass = emptyResultsMessageCssClass; } public void setForcePost(boolean forcePost) { _forcePost = forcePost; } public void setHeaderNames(List<String> headerNames) { _headerNames = headerNames; _buildNormalizedHeaderNames(headerNames); } public void setHover(boolean hover) { _hover = hover; } public void setId(String id) { _id = id; } public void setIteratorURL(PortletURL iteratorURL) { _iteratorURL = iteratorURL; } public void setOrderableHeaders(Map<String, String> orderableHeaders) { _orderableHeaders = orderableHeaders; } public void setOrderByCol(String orderByCol) { _orderByCol = orderByCol; _iteratorURL.setParameter(_orderByColParam, _orderByCol); } public void setOrderByColParam(String orderByColParam) { _orderByColParam = orderByColParam; } public void setOrderByComparator(OrderByComparator<R> orderByComparator) { _orderByComparator = orderByComparator; } public void setOrderByJS(String orderByJS) { _orderByJS = orderByJS; } public void setOrderByType(String orderByType) { _orderByType = orderByType; _iteratorURL.setParameter(_orderByTypeParam, _orderByType); } public void setOrderByTypeParam(String orderByTypeParam) { _orderByTypeParam = orderByTypeParam; } public void setResults(List<R> results) { _results = results; } public void setRowChecker(RowChecker rowChecker) { _rowChecker = rowChecker; } public void setRowMover(RowMover rowMover) { _rowMover = rowMover; } public void setSearch(boolean search) { _search = search; } public void setTotal(int total) { _total = total; _calculateCur(); _calculateStartAndEnd(); } public void setTotalVar(String totalVar) { _totalVar = totalVar; } private void _buildNormalizedHeaderNames(List<String> headerNames) { if (headerNames == null) { return; } _normalizedHeaderNames = new ArrayList<>(headerNames.size()); for (String headerName : headerNames) { _normalizedHeaderNames.add( FriendlyURLNormalizerUtil.normalize(headerName)); } } private void _calculateCur() { if (_total == 0) { _cur = DEFAULT_CUR; return; } if (isRecalculateCur()) { if ((_total % _delta) == 0) { _cur = _total / _delta; } else { _cur = (_total / _delta) + 1; } } } private void _calculateStartAndEnd() { int[] startAndEnd = SearchPaginationUtil.calculateStartAndEnd( _cur, _delta); _start = startAndEnd[0]; _end = startAndEnd[1]; _resultEnd = _end; if (_resultEnd > _total) { _resultEnd = _total; } } private void _setParameter(String name) { String value = _portletRequest.getParameter(name); if (value != null) { _iteratorURL.setParameter(name, value); } } private String _className; private String _cssClass = StringPool.BLANK; private int _cur; private final String _curParam; private int _delta = DEFAULT_DELTA; private boolean _deltaConfigurable = DEFAULT_DELTA_CONFIGURABLE; private String _deltaParam = DEFAULT_DELTA_PARAM; private final DisplayTerms _displayTerms; private String _emptyResultsMessage; private String _emptyResultsMessageCssClass; private int _end; private boolean _forcePost = DEFAULT_FORCE_POST; private List<String> _headerNames; private boolean _hover = true; private String _id; private PortletURL _iteratorURL; private List<String> _normalizedHeaderNames; private Map<String, String> _orderableHeaders; private String _orderByCol; private String _orderByColParam = DEFAULT_ORDER_BY_COL_PARAM; private OrderByComparator<R> _orderByComparator; private String _orderByJS; private String _orderByType; private String _orderByTypeParam = DEFAULT_ORDER_BY_TYPE_PARAM; private final PortletRequest _portletRequest; private int _resultEnd; private final List<ResultRow> _resultRows = new ArrayList<>(); private List<R> _results = new ArrayList<>(); private RowChecker _rowChecker; private RowMover _rowMover; private boolean _search; private final DisplayTerms _searchTerms; private int _start; private int _total; private String _totalVar; private boolean _uniqueId; }