/** * 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.vulcan.provider.internal.pagination; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.vulcan.pagination.Page; import com.liferay.vulcan.pagination.Pagination; import java.util.Collection; import java.util.Map; import javax.ws.rs.ext.Provider; import org.apache.cxf.jaxrs.ext.ContextProvider; import org.apache.cxf.message.Message; import org.osgi.service.component.annotations.Component; /** * @author Alejandro Hernández * @author Carlos Sierra Andrés * @author Jorge Ferrer */ @Component(immediate = true, property = "liferay.vulcan.context.provider=true") @Provider public class PaginationContextProvider implements ContextProvider<Pagination> { @Override public Pagination createContext(Message message) { String queryString = (String)message.getContextualProperty( Message.QUERY_STRING); Map<String, String[]> parameterMap = HttpUtil.getParameterMap( queryString); int itemsPerPage = MapUtil.getInteger( parameterMap, "per_page", _ITEMS_PER_PAGE_DEFAULT); int pageNumber = MapUtil.getInteger( parameterMap, "page", _PAGE_NUMBER_DEFAULT); return new DefaultPagination(itemsPerPage, pageNumber); } private static final int _ITEMS_PER_PAGE_DEFAULT = 30; private static final int _PAGE_NUMBER_DEFAULT = 1; private static class DefaultPage<T> implements Page<T> { public DefaultPage( Collection<T> items, int itemsPerPage, int pageNumber, int totalCount) { _items = items; _itemsPerPage = itemsPerPage; _pageNumber = pageNumber; _totalCount = totalCount; } @Override public Collection<T> getItems() { return _items; } @Override public int getItemsPerPage() { return _itemsPerPage; } @Override public int getLastPageNumber() { return -Math.floorDiv(-_totalCount, _itemsPerPage); } @Override public int getPageNumber() { return _pageNumber; } @Override public int getTotalCount() { return _totalCount; } @Override public boolean hasNext() { if (getLastPageNumber() > _pageNumber) { return true; } return false; } @Override public boolean hasPrevious() { if (_pageNumber > 1) { return true; } return false; } private final Collection<T> _items; private final int _itemsPerPage; private final int _pageNumber; private final int _totalCount; } private static class DefaultPagination implements Pagination { public DefaultPagination(int itemsPerPage, int pageNumber) { _itemsPerPage = itemsPerPage; _pageNumber = pageNumber; } @Override public <T> Page<T> createPage(Collection<T> items, int totalCount) { return new DefaultPage<>( items, getItemsPerPage(), getPageNumber(), totalCount); } @Override public int getEndPosition() { return _pageNumber * _itemsPerPage; } @Override public int getItemsPerPage() { return _itemsPerPage; } @Override public int getPageNumber() { return _pageNumber; } @Override public int getStartPosition() { return (_pageNumber - 1) * _itemsPerPage; } private final int _itemsPerPage; private final int _pageNumber; } }