diff --git a/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/PagingParameters.java b/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/PagingParameters.java
new file mode 100644
index 000000000..e255efa52
--- /dev/null
+++ b/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/PagingParameters.java
@@ -0,0 +1,69 @@
+package io.oasp.module.rest.service.api;
+
+import net.sf.mmm.util.search.api.SearchCriteria;
+import net.sf.mmm.util.search.base.AbstractSearchCriteria;
+
+/**
+ * This type is a wrapper for paging parameters used in REST API. Provides also convenient conversion to
+ * {@link SearchCriteria} query.
+ *
+ * @author llaszkie
+ */
+public class PagingParameters {
+
+ /**
+ * An empty parameters indicating no paging in request.
+ */
+ public static final PagingParameters NO_PAGING = new PagingParameters();
+
+ private static final int DEFAULT_MAX_RESULT_PER_PAGE = 100;
+
+ private boolean off;
+
+ private int pageNumber;
+
+ private int count;
+
+ /**
+ * The constructor.
+ *
+ * @param pageNumber number of the requested page (1-based index)
+ * @param count limit of entries for one page. if null
default value will be used
+ */
+ public PagingParameters(int pageNumber, Integer count) {
+
+ super();
+ this.pageNumber = pageNumber;
+ this.count = count != null ? count : DEFAULT_MAX_RESULT_PER_PAGE;
+ }
+
+ /**
+ * The constructor. Indicates NO paging.
+ */
+ public PagingParameters() {
+
+ super();
+ this.off = true;
+ }
+
+ /**
+ * @return true
if NO paging was requested
+ */
+ public boolean isOff() {
+
+ return this.off;
+ }
+
+ /**
+ * Arms provided criteria with held paging parameters unless paging parameters were NOT provided.
+ *
+ * @param criteria criteria to be extended.
+ */
+ public void extendIfRequested(AbstractSearchCriteria criteria) {
+
+ if (!this.off) {
+ criteria.setHitOffset((this.pageNumber - 1) * this.count);
+ criteria.setMaximumHitCount(this.count);
+ }
+ }
+}
\ No newline at end of file
diff --git a/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/RequestParameters.java b/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/RequestParameters.java
index d7b2d417b..ab8197cec 100644
--- a/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/RequestParameters.java
+++ b/oasp4j-modules/oasp4j-rest/src/main/java/io/oasp/module/rest/service/api/RequestParameters.java
@@ -192,6 +192,25 @@ public List getList(String key) {
return list;
}
+ /**
+ * Gets the paging parameters from the request (if provided). There are two of them. The "page" points to a requested
+ * chunk of data (1-based index: obligatory if paging functionality is desired). The "count" allows client to specify
+ * the chunk size (optional: a default value 100 for page size will be used if omitted)
+ *
+ * @return the {@link PagingParameters} as provided or complemented with default or an empty one if NO paging was
+ * requested
+ */
+ public PagingParameters getPaging() {
+
+ Integer page = get("page", Integer.class, false);
+ if (null != page) {
+ Integer count = get("count", Integer.class, false);
+ return new PagingParameters(page, count);
+ }
+
+ return PagingParameters.NO_PAGING;
+ }
+
/**
* @param uriInfo is the {@link UriInfo}.
* @return a new instance of {@link RequestParameters} for {@link UriInfo#getQueryParameters()}.
diff --git a/oasp4j-modules/oasp4j-rest/src/test/java/io/oasp/module/rest/service/api/PagingParametersTest.java b/oasp4j-modules/oasp4j-rest/src/test/java/io/oasp/module/rest/service/api/PagingParametersTest.java
new file mode 100644
index 000000000..830b202e7
--- /dev/null
+++ b/oasp4j-modules/oasp4j-rest/src/test/java/io/oasp/module/rest/service/api/PagingParametersTest.java
@@ -0,0 +1,65 @@
+package io.oasp.module.rest.service.api;
+
+import net.sf.mmm.util.search.base.AbstractSearchCriteria;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * This type is the test-case of {@link PagingParameters}
+ *
+ * @author llaszkie
+ */
+public class PagingParametersTest extends Assert {
+
+ private PagingParameters parameters;
+
+ /**
+ * Test method for {@link io.oasp.module.rest.service.api.PagingParameters#isOff()}.
+ */
+ @Test
+ public void testIsOff() {
+
+ // given // when
+ this.parameters = new PagingParameters();
+
+ // then
+ assertTrue("Paging support is off.", this.parameters.isOff());
+ }
+
+ /**
+ * Test method for {@link io.oasp.module.rest.service.api.PagingParameters#isOff()}.
+ */
+ @Test
+ public void testIsOn() {
+
+ // given // when
+ this.parameters = new PagingParameters(1, null);
+
+ // then
+ assertFalse("Paging support is on.", this.parameters.isOff());
+ }
+
+ /**
+ * Test method for
+ * {@link io.oasp.module.rest.service.api.PagingParameters#extendIfRequested(net.sf.mmm.util.search.base.AbstractSearchCriteria)}
+ * .
+ */
+ @Test
+ @SuppressWarnings("serial")
+ public void testExtend() {
+
+ // given
+ this.parameters = new PagingParameters(2, 5);
+ AbstractSearchCriteria criteria = new AbstractSearchCriteria() {
+ };
+
+ // when
+ this.parameters.extendIfRequested(criteria);
+
+ // then
+ assertEquals("Search criteria offset was set.", 1 * 5, criteria.getHitOffset());
+ assertEquals("Search criteria maximum hit count was set.", 5, criteria.getMaximumHitCount().intValue());
+ }
+
+}
diff --git a/oasp4j-samples/oasp4j-sample-core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java b/oasp4j-samples/oasp4j-sample-core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java
index 0f9ba5c8b..9778a8bbc 100644
--- a/oasp4j-samples/oasp4j-sample-core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java
+++ b/oasp4j-samples/oasp4j-sample-core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java
@@ -92,6 +92,7 @@ public List findOrders(@Context UriInfo info) {
OrderSearchCriteriaTo criteria = new OrderSearchCriteriaTo();
criteria.setTableId(parameters.get("tableId", Long.class, false));
criteria.setState(parameters.get("state", OrderState.class, false));
+ parameters.getPaging().extendIfRequested(criteria);
return this.salesManagement.findOrderCtos(criteria);
}
@@ -111,6 +112,7 @@ public List findOrderPositions(@Context UriInfo info) {
criteria.setCookId(parameters.get("cookId", Long.class, false));
criteria.setState(parameters.get("state", OrderPositionState.class, false));
criteria.setMealOrSideDish(parameters.get("mealOrSideDish", boolean.class, false));
+ parameters.getPaging().extendIfRequested(criteria);
return this.salesManagement.findOrderPositions(criteria);
}
diff --git a/oasp4j-samples/oasp4j-sample-core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTest.java b/oasp4j-samples/oasp4j-sample-core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTest.java
new file mode 100644
index 000000000..bcb59c3a2
--- /dev/null
+++ b/oasp4j-samples/oasp4j-sample-core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTest.java
@@ -0,0 +1,158 @@
+package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState;
+import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState;
+import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement;
+import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto;
+import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto;
+import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo;
+import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+/**
+ * This is the test-case of {@link SalesmanagementRestServiceImpl}.
+ *
+ * @author llaszkie
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class SalesmanagementRestServiceTest extends Assert {
+
+ @Mock
+ private Salesmanagement salesManagement;
+
+ @Mock
+ private UriInfo info;
+
+ @InjectMocks
+ private SalesmanagementRestServiceImpl salesManagementRestService = new SalesmanagementRestServiceImpl();
+
+ /**
+ * Test method for
+ * {@link io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceImpl#findOrders(javax.ws.rs.core.UriInfo)}
+ * .
+ */
+ @Test
+ public void testShouldFindOrders() {
+
+ // given
+ MultivaluedMap parameters = new MultivaluedHashMap<>();
+ parameters.putSingle("tableId", "1");
+ parameters.putSingle("state", "OPEN");
+ when(this.info.getQueryParameters()).thenReturn(parameters);
+
+ List expectedOrders = new ArrayList<>();
+ when(this.salesManagement.findOrderCtos(any(OrderSearchCriteriaTo.class))).thenReturn(expectedOrders);
+
+ // and when
+ List foundOrders = this.salesManagementRestService.findOrders(this.info);
+
+ // then expected orders were found
+ assertSame("Expected orders were found.", expectedOrders, foundOrders);
+ // then expected criteria were provided
+ OrderSearchCriteriaTo expectedCriteria = new OrderSearchCriteriaTo();
+ expectedCriteria.setTableId(1L);
+ expectedCriteria.setState(OrderState.OPEN);
+ verify(this.salesManagement, times(1)).findOrderCtos(eq(expectedCriteria));
+ }
+
+ /**
+ * Test method for
+ * {@link io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceImpl#findOrders(javax.ws.rs.core.UriInfo)}
+ * .
+ */
+ @Test
+ public void testShouldFindOrdersWithPaging() {
+
+ // given
+ MultivaluedMap parameters = new MultivaluedHashMap<>();
+ parameters.putSingle("page", "3");
+ parameters.putSingle("count", "100");
+ when(this.info.getQueryParameters()).thenReturn(parameters);
+
+ // and when
+ this.salesManagementRestService.findOrders(this.info);
+
+ // then expected criteria were provided
+ OrderSearchCriteriaTo expectedCriteria = new OrderSearchCriteriaTo();
+ expectedCriteria.setHitOffset(200);
+ expectedCriteria.setMaximumHitCount(100);
+ verify(this.salesManagement, times(1)).findOrderCtos(eq(expectedCriteria));
+ }
+
+ /**
+ * Test method for
+ * {@link io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceImpl#findOrderPositions(javax.ws.rs.core.UriInfo)}
+ * .
+ */
+ @Test
+ public void testShouldFindOrderPositions() {
+
+ // given
+ MultivaluedMap parameters = new MultivaluedHashMap<>();
+ parameters.putSingle("orderId", "1");
+ parameters.putSingle("cookId", "2");
+ parameters.putSingle("state", "PAYED");
+ parameters.putSingle("mealOrSideDish", "true");
+ when(this.info.getQueryParameters()).thenReturn(parameters);
+
+ List expectedOrderPositions = new ArrayList<>();
+ when(this.salesManagement.findOrderPositions(any(OrderPositionSearchCriteriaTo.class))).thenReturn(
+ expectedOrderPositions);
+
+ // and when
+ List foundOrderPositions = this.salesManagementRestService.findOrderPositions(this.info);
+
+ // then expected order positions were found
+ assertSame("Expected order positions were found.", expectedOrderPositions, foundOrderPositions);
+ // then expected criteria were provided
+ OrderPositionSearchCriteriaTo expectedCriteria = new OrderPositionSearchCriteriaTo();
+ expectedCriteria.setOrderId(1L);
+ expectedCriteria.setCookId(2L);
+ expectedCriteria.setState(OrderPositionState.PAYED);
+ expectedCriteria.setMealOrSideDish(true);
+ verify(this.salesManagement, times(1)).findOrderPositions(eq(expectedCriteria));
+ }
+
+ /**
+ * Test method for
+ * {@link io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceImpl#findOrderPositions(javax.ws.rs.core.UriInfo)}
+ * .
+ */
+ @Test
+ public void testShouldFindOrderPositionsWithPaging() {
+
+ // given
+ MultivaluedMap parameters = new MultivaluedHashMap<>();
+ parameters.putSingle("page", "4");
+ parameters.putSingle("count", "50");
+ when(this.info.getQueryParameters()).thenReturn(parameters);
+
+ // and when
+ this.salesManagementRestService.findOrderPositions(this.info);
+
+ // then expected criteria were provided
+ OrderPositionSearchCriteriaTo expectedCriteria = new OrderPositionSearchCriteriaTo();
+ expectedCriteria.setHitOffset(150);
+ expectedCriteria.setMaximumHitCount(50);
+ verify(this.salesManagement, times(1)).findOrderPositions(eq(expectedCriteria));
+ }
+
+}