AT: committing latest changes to the CDMLib to work from home and fix some outstandin...
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / controller / BaseListController.java
index d23a96f44ba2fc54c55b8d1663042a01b3d31438..78f1d168a43bd79420176b5babef6de356d2732c 100644 (file)
@@ -1,9 +1,9 @@
 // $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
@@ -29,7 +29,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 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
@@ -39,105 +40,85 @@ import eu.etaxonomy.cdm.remote.editor.UUIDPropertyEditor;
  *\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>&lt;T&gt;</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>&lt;T&gt;</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>&lt;T&gt;</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>&lt;T&gt;</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