// $Id$\r
/**\r
* Copyright (C) 2007 EDIT\r
- * European Distributed Institute of Taxonomy \r
+ * European Distributed Institute of Taxonomy\r
* http://www.e-taxonomy.eu\r
- * \r
+ *\r
* The contents of this file are subject to the Mozilla Public License Version 1.1\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
*/\r
import eu.etaxonomy.cdm.api.service.IService;\r
import eu.etaxonomy.cdm.api.service.pager.Pager;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.remote.editor.ClassPropertyEditor;\r
+import eu.etaxonomy.cdm.remote.controller.util.PagerParameters;\r
+import eu.etaxonomy.cdm.remote.editor.CdmTypePropertyEditor;\r
import eu.etaxonomy.cdm.remote.editor.UUIDPropertyEditor;\r
\r
\r
*\r
* @param <T>\r
* @param <SERVICE>\r
- * \r
+ *\r
*/\r
public abstract class BaseListController <T extends CdmBase, SERVICE extends IService<T>> extends AbstractListController<T, SERVICE> {\r
\r
- public static final Integer DEFAULT_PAGESIZE = 20;\r
- public static final Integer DEFAULT_PAGE_NUMBER = 0;\r
- \r
- @InitBinder\r
+ @InitBinder\r
public void initBinder(WebDataBinder binder) {\r
- binder.registerCustomEditor(UUID.class, new UUIDPropertyEditor());\r
- binder.registerCustomEditor(Class.class, new ClassPropertyEditor());\r
- }\r
- \r
-\r
- /**\r
- * @param pageNumber\r
- * the number of the page to be returned, the first page has the\r
- * pageNumber = 1 - <i>optional parameter</i>\r
- * @param pageSize\r
- * the maximum number of entities returned per page (can be null\r
- * to return all entities in a single page) - <i>optional\r
- * parameter</i>\r
- * @param type\r
- * Further restricts the type of entities to be returned. \r
- * If null the base type <code><T></code> is being used. - <i>optional parameter</i>\r
- * @return\r
- * @throws IOException \r
- */\r
- @RequestMapping(method = RequestMethod.GET, params = "pageNumber")\r
- public Pager<T> doPage(\r
- @RequestParam(value = "pageNumber") Integer pageNumber,\r
- @RequestParam(value = "pageSize", required = false) Integer pageSize,\r
- @RequestParam(value = "class", required = false) Class<T> type,\r
- HttpServletRequest request, \r
- HttpServletResponse response) throws IOException\r
- {\r
- \r
- normalizeAndValidatePagerParameters(pageNumber, pageSize, response);\r
- \r
- return service.page(type, pageSize, pageNumber, null, DEFAULT_INIT_STRATEGY);\r
- }\r
- \r
- /**\r
- * @param pageNumber\r
- * @param pageSize\r
- * @param response\r
- * @throws IOException\r
- */\r
- public static void normalizeAndValidatePagerParameters(Integer pageNumber, Integer pageSize, HttpServletResponse response) throws IOException{\r
- \r
- if(pageNumber == null){ \r
- pageNumber = DEFAULT_PAGE_NUMBER;\r
- if(pageSize == null){ pageSize = DEFAULT_PAGESIZE;}\r
- }\r
- if(pageNumber < 0){\r
- HttpStatusMessage.fromString("The query parameter 'pageNumber' must not be a negative number").setStatusCode(HTTP_BAD_REQUEST).send(response);\r
- }\r
- if(pageSize < 0){\r
- HttpStatusMessage.fromString("The query parameter 'pageSize' must not be a negative number").setStatusCode(HTTP_BAD_REQUEST).send(response);\r
- }\r
- }\r
- \r
- /**\r
- * Parameter less method to be used as default when request without parameter are made. Otherwise\r
- * the nameless methods {@link #doPage(Integer, Integer, Class)} and {@link #doList(Integer, Integer, Class)}\r
- * are ambigous.\r
- * @return\r
- * @throws IOException \r
- */\r
- @RequestMapping(method = RequestMethod.GET)\r
- public Pager<T> doPage(HttpServletRequest request, HttpServletResponse response) throws IOException{\r
- return doPage(null, null, null, request, response);\r
- }\r
- \r
- /**\r
- * @param start\r
- * The offset index from the start of the list. The first entity\r
- * has the index = 0 - <i>required parameter</i>\r
- * @param limit\r
- * The maximum number of entities returned. - <i>optional parameter</i> \r
- * If limit is set to a value < 1 all entities will be returned\r
- * @param type\r
- * Further restricts the type of entities to be returned. \r
- * If null the base type <code><T></code> is being used. - <i>optional parameter</i>\r
- * @return a List of entities\r
- */\r
- @RequestMapping(method = RequestMethod.GET, params = "start")\r
- public List<T> doList(\r
- @RequestParam(value = "start", required = true) Integer start,\r
- @RequestParam(value = "limit", required = false) Integer limit,\r
- @RequestParam(value = "class", required = false) Class<T> type) {\r
- \r
- //if(start == null){ start = 0;}\r
- if(limit == null){ limit = DEFAULT_PAGESIZE;}\r
- if(limit < 1){ limit = null;}\r
- return service.list(type, limit, start, null, DEFAULT_INIT_STRATEGY);\r
- }\r
-\r
- /* TODO \r
+ binder.registerCustomEditor(UUID.class, new UUIDPropertyEditor());\r
+ binder.registerCustomEditor(Class.class, new CdmTypePropertyEditor());\r
+ }\r
+\r
+\r
+ /**\r
+ * NOTE: The indices for pages are 0-based see {@link Pager}\r
+ *\r
+ * @param pageIndex\r
+ * the index of the page to be returned, the first page has the\r
+ * pageIndex = 0 - <i>optional parameter</i>\r
+ * @param pageSize\r
+ * the maximum number of entities returned per page (can be null\r
+ * to return all entities in a single page) - <i>optional\r
+ * parameter</i>\r
+ * @param type\r
+ * Further restricts the type of entities to be returned.\r
+ * If null the base type <code><T></code> is being used. - <i>optional parameter</i>\r
+ * @return\r
+ * @throws IOException\r
+ */\r
+ @RequestMapping(method = RequestMethod.GET, params = "pageNumber")\r
+ public Pager<T> doPage(\r
+ @RequestParam(value = "pageNumber") Integer pageIndex,\r
+ @RequestParam(value = "pageSize", required = false) Integer pageSize,\r
+ @RequestParam(value = "class", required = false) Class<T> type,\r
+ HttpServletRequest request,\r
+ HttpServletResponse response) throws IOException\r
+ {\r
+\r
+ PagerParameters pagerParameters = new PagerParameters(pageSize, pageIndex);\r
+ pagerParameters.normalizeAndValidate(response);\r
+\r
+ return service.page(type, pagerParameters.getPageSize(), pagerParameters.getPageIndex(), null, DEFAULT_INIT_STRATEGY);\r
+ }\r
+\r
+ /**\r
+ * Parameter less method to be used as default when request without parameter are made. Otherwise\r
+ * the nameless methods {@link #doPage(Integer, Integer, Class)} and {@link #doList(Integer, Integer, Class)}\r
+ * are ambigous.\r
+ * @return\r
+ * @throws IOException\r
+ */\r
+ @RequestMapping(method = RequestMethod.GET)\r
+ public Pager<T> doPage(HttpServletRequest request, HttpServletResponse response) throws IOException{\r
+ return doPage(null, null, null, request, response);\r
+ }\r
+\r
+ /**\r
+ * @param start\r
+ * The offset index from the start of the list. The first entity\r
+ * has the index = 0 - <i>required parameter</i>\r
+ * @param limit\r
+ * The maximum number of entities returned. - <i>optional parameter</i>\r
+ * If limit is set to a value < 1 all entities will be returned\r
+ * @param type\r
+ * Further restricts the type of entities to be returned.\r
+ * If null the base type <code><T></code> is being used. - <i>optional parameter</i>\r
+ * @return a List of entities\r
+ */\r
+ @RequestMapping(method = RequestMethod.GET, params = "start")\r
+ public List<T> doList(\r
+ @RequestParam(value = "start", required = true) Integer start,\r
+ @RequestParam(value = "limit", required = false) Integer limit,\r
+ @RequestParam(value = "class", required = false) Class<T> type) {\r
+\r
+ //if(start == null){ start = 0;}\r
+ if(limit == null){ limit = PagerParameters.DEFAULT_PAGESIZE;}\r
+ if(limit < 1){ limit = null;}\r
+ return service.list(type, limit, start, null, DEFAULT_INIT_STRATEGY);\r
+ }\r
+\r
+ /* TODO\r
@RequestMapping(method = RequestMethod.POST)\r
public T doPost(@ModelAttribute("object") T object, BindingResult result) {\r
validator.validate(object, result);\r