modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java
| 54 +++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
| 16 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java
| 19 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/EventHandlerBean.java
| 18 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java
| 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
| 13 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java
| 11 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/PagingCollection.java
| 97 ++++++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationHelperTest.java
| 2
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AbstractBase.java
| 2
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java
| 32 +++
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
| 4
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java
| 33 ++-
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java
| 42 ++++
14 files changed, 308 insertions(+), 42 deletions(-)
New commits:
commit cd1087a1789973d74b85e7bffa99893a32ea603e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed May 22 22:37:33 2013 +0200
Support paging in the body with the appropriate media type
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java
index 8e4a826..5652f9f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java
@@ -26,6 +26,7 @@ import java.io.IOException;
import java.io.StringWriter;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -35,7 +36,9 @@ import java.util.Set;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
+import javax.ws.rs.Produces;
import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
@@ -66,6 +69,7 @@ import
org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.rest.domain.GroupRest;
import org.rhq.enterprise.server.rest.domain.Link;
import org.rhq.enterprise.server.rest.domain.MetricSchedule;
+import org.rhq.enterprise.server.rest.domain.PagingCollection;
import org.rhq.enterprise.server.rest.domain.ResourceWithType;
/**
@@ -77,12 +81,16 @@ import org.rhq.enterprise.server.rest.domain.ResourceWithType;
* @author Heiko W. Rupp
* @author Jay Shaughnessy
*/
+(a)Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,MediaType.TEXT_HTML,"application/vnd.rhq.wrapped+json"})
@javax.annotation.Resource(name = "ISPN", mappedName =
"java:jboss/infinispan/rhq")
@SuppressWarnings("unchecked")
public class AbstractRestBean {
protected Log log = LogFactory.getLog(getClass().getName());
+ protected final MediaType wrappedCollectionJsonType = new
MediaType("application","vnd.rhq.wrapped+json");
+ protected final String wrappedCollectionJson =
"application/vnd.rhq.wrapped+json";
+
private static final CacheKey META_KEY = new
CacheKey("rhq.rest.resourceMeta", 0);
@javax.annotation.Resource( name = "ISPN")
@@ -468,6 +476,52 @@ public class AbstractRestBean {
}
/**
+ * Wrap the passed collection #resultList in an object with paging information
+ * @param builder ResonseBuilder to add the entity to
+ * @param uriInfo UriInfo to construct paging links
+ * @param originalList The original list to obtain the paging info from
+ * @param resultList The list of result items
+ */
+ protected void wrapForPaging(Response.ResponseBuilder builder, UriInfo uriInfo, final
PageList<?> originalList, final Collection resultList) {
+
+ PagingCollection pColl = new PagingCollection(resultList);
+ pColl.setTotalSize(originalList.getTotalSize());
+ PageControl pageControl = originalList.getPageControl();
+ pColl.setPageSize(pageControl.getPageSize());
+ int page = pageControl.getPageNumber();
+ pColl.setCurrentPage(page);
+ pColl.setLastPage(originalList.getTotalSize()/pageControl.getPageSize());
+
+ UriBuilder uriBuilder;
+ if (originalList.getTotalSize() > (page +1 ) * pageControl.getPageSize()) {
+ int nextPage = page +1;
+ uriBuilder = uriInfo.getRequestUriBuilder(); // adds ?q, ?ps and ?category if
needed
+ uriBuilder.replaceQueryParam("page",nextPage);
+ pColl.addLink(new Link("next",uriBuilder.build().toString()));
+ }
+ if (page > 0) {
+ int prevPage = page -1;
+ uriBuilder = uriInfo.getRequestUriBuilder(); // adds ?q, ?ps and ?category if
needed
+ uriBuilder.replaceQueryParam("page",prevPage);
+ pColl.addLink(new Link("prev",uriBuilder.build().toString()));
+ }
+
+ // A link to the last page
+ if (!pageControl.isUnlimited()) {
+ int lastPage = originalList.getTotalSize() / pageControl.getPageSize();
+ uriBuilder = uriInfo.getRequestUriBuilder(); // adds ?q, ?ps and ?category if
needed
+ uriBuilder.replaceQueryParam("page",lastPage);
+ pColl.addLink( new Link("last",uriBuilder.build().toString()));
+ }
+
+ // A link to the current page
+ uriBuilder = uriInfo.getRequestUriBuilder(); // adds ?q, ?ps and ?category if
needed
+ pColl.addLink(new Link("current",uriBuilder.build().toString()));
+
+ builder.entity(pColl);
+ }
+
+ /**
* Fetch the group with the passed id
*
* @param groupId id of the resource group
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
index 6ea3d03..4ceae82 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
@@ -46,6 +46,7 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
@@ -98,7 +99,6 @@ import org.rhq.enterprise.server.rest.domain.Link;
* AlertHandlerBean
* @author Heiko W. Rupp
*/
-@Produces({"application/json","application/xml","text/plain"})
@Path("/alert")
@Api(value = "Deal with Alert Definitions",description = "This api deals
with alert definitions. Everything " +
" is purely experimental at the moment and can change without notice at any
time.")
@@ -149,6 +149,7 @@ public class AlertDefinitionHandlerBean extends AbstractRestBean {
@ApiParam(value = "Page number") @QueryParam("page")
Integer page,
@ApiParam(value = "Page size") @DefaultValue("20")
@QueryParam("ps") int pageSize,
@ApiParam(value = "Limit to status, UNUSED AT THE MOMENT ")
@QueryParam("status") String status, // TODO
+ @Context HttpHeaders headers,
@Context UriInfo uriInfo) {
AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
@@ -163,10 +164,17 @@ public class AlertDefinitionHandlerBean extends AbstractRestBean {
ret.add(adr);
}
- Response.ResponseBuilder builder = Response.ok(ret);
- createPagingHeader(builder,uriInfo,defs);
+ Response.ResponseBuilder builder = Response.ok();
- // TODO media type etc
+ MediaType mediaType = headers.getAcceptableMediaTypes().get(0);
+ builder.type(mediaType);
+
+ if (mediaType.equals(wrappedCollectionJsonType)) {
+ wrapForPaging(builder,uriInfo,defs,ret);
+ } else {
+ createPagingHeader(builder,uriInfo,defs);
+ builder.entity(ret); // TODO generic entity for XML
+ }
return builder.build();
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java
index 5da3fb9..5c6a06f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java
@@ -32,7 +32,6 @@ import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
@@ -72,7 +71,6 @@ import org.rhq.enterprise.server.rest.domain.*;
* Deal with alert related stuff
* @author Heiko W. Rupp
*/
-@Produces({"application/json","application/xml","text/html"})
@Path("/alert")
@Api(value = "Deal with Alerts",description = "This api deals with alerts
that have fired.")
@Stateless
@@ -148,17 +146,22 @@ public class AlertHandlerBean extends AbstractRestBean {
}
MediaType type = headers.getAcceptableMediaTypes().get(0);
- Response.ResponseBuilder builder;
+ Response.ResponseBuilder builder = Response.ok();
+ builder.type(type);
if (type.equals(MediaType.TEXT_HTML_TYPE)) {
- builder = Response.ok(renderTemplate("listAlerts.ftl",ret),type);
+ builder.entity(renderTemplate("listAlerts.ftl",ret));
} else {
- GenericEntity<List<AlertRest>> entity = new
GenericEntity<List<AlertRest>>(ret) {};
- builder = Response.ok(entity);
+ if (type.equals(wrappedCollectionJsonType)) {
+ wrapForPaging(builder,uriInfo,alerts,ret);
+ }
+ else {
+ GenericEntity<List<AlertRest>> entity = new
GenericEntity<List<AlertRest>>(ret) {};
+ builder.entity(entity);
+ createPagingHeader(builder,uriInfo,alerts);
+ }
}
- createPagingHeader(builder,uriInfo,alerts);
-
return builder.build();
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/EventHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/EventHandlerBean.java
index 7402550..fd8a835 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/EventHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/EventHandlerBean.java
@@ -37,13 +37,11 @@ import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
@@ -76,7 +74,6 @@ import org.rhq.enterprise.server.rest.domain.EventSourceRest;
*/
@Path("/event")
@Api("Api that deals with Events (e.g snmp traps, logfile lines)")
-(a)Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,MediaType.TEXT_HTML})
@Stateless
@Interceptors(SetCallerInterceptor.class)
public class EventHandlerBean extends AbstractRestBean {
@@ -348,17 +345,20 @@ public class EventHandlerBean extends AbstractRestBean {
}
MediaType mediaType = headers.getAcceptableMediaTypes().get(0);
- Response.ResponseBuilder builder;
+ Response.ResponseBuilder builder = Response.ok();
+ builder.type(mediaType);
if (mediaType.equals(MediaType.APPLICATION_XML_TYPE)) {
GenericEntity<List<EventRest>> list = new
GenericEntity<List<EventRest>>(restEvents) {};
- builder = Response.ok(list, mediaType);
+ builder.entity(list);
+ createPagingHeader(builder,uriInfo,eventList);
+ } else if (mediaType.equals(MediaType.APPLICATION_JSON_TYPE)) {
+ builder.entity(restEvents);
+ createPagingHeader(builder,uriInfo,eventList);
}
- else {
- builder = Response.ok(restEvents, mediaType);
+ else {
+ wrapForPaging(builder,uriInfo,eventList,restEvents);
}
- createPagingHeader(builder,uriInfo,eventList);
-
return builder;
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java
index be2419b..d65a850 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java
@@ -37,7 +37,6 @@ import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
@@ -93,7 +92,6 @@ import org.rhq.enterprise.server.rest.domain.ResourceWithType;
@Interceptors(SetCallerInterceptor.class)
@Path("/group")
@Api(value="Deal with groups and DynaGroups", description = "Api that
deals with resource groups and group definitions")
-(a)Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,MediaType.TEXT_HTML})
public class GroupHandlerBean extends AbstractRestBean {
private final Log log = LogFactory.getLog(GroupHandlerBean.class);
@@ -142,12 +140,15 @@ public class GroupHandlerBean extends AbstractRestBean {
if (mediaType.equals(MediaType.TEXT_HTML_TYPE)) {
builder.entity(renderTemplate("listGroup", list));
}
+ else if (mediaType.equals(wrappedCollectionJsonType)) {
+ wrapForPaging(builder,uriInfo,groups,list);
+ }
else {
GenericEntity<List<GroupRest>> ret = new
GenericEntity<List<GroupRest>>(list) {};
builder.entity(ret);
+ createPagingHeader(builder,uriInfo,groups);
}
- createPagingHeader(builder,uriInfo,groups);
return builder.build();
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
index e32ea03..81d490b 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
@@ -420,16 +420,19 @@ public class OperationsHandlerBean extends AbstractRestBean {
}
MediaType mediaType = httpHeaders.getAcceptableMediaTypes().get(0);
- Response.ResponseBuilder builder;
+ Response.ResponseBuilder builder = Response.ok();
+ builder.type(mediaType);
+
if (mediaType.equals(MediaType.TEXT_HTML_TYPE)) {
- builder = Response.ok(renderTemplate("listOperationHistory.ftl",
result));
+ builder.entity(renderTemplate("listOperationHistory.ftl",
result));
+ } else if (mediaType.equals(wrappedCollectionJsonType)) {
+ wrapForPaging(builder,uriInfo,histories,result);
} else {
GenericEntity<List<OperationHistoryRest>> res = new
GenericEntity<List<OperationHistoryRest>>(result) {};
- builder = Response.ok(res);
+ builder.entity(res);
+ createPagingHeader(builder,uriInfo,histories);
}
- createPagingHeader(builder,uriInfo,histories);
-
return builder.build();
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java
index a783ac8..0c3a7cd 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java
@@ -114,7 +114,6 @@ import org.rhq.enterprise.server.rest.helper.ConfigurationHelper;
* Class that deals with getting data about resources
* @author Heiko W. Rupp
*/
-(a)Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,MediaType.TEXT_HTML})
@Path("/resource")
@Api(value="Resource related", description = "This endpoint deals with
individual resources, not resource groups")
@Interceptors(SetCallerInterceptor.class)
@@ -263,15 +262,19 @@ public class ResourceHandlerBean extends AbstractRestBean {
Response.ResponseBuilder builder = Response.ok();
builder.type(mediaType);
- createPagingHeader(builder,uriInfo,resources);
if (mediaType.equals(MediaType.TEXT_HTML_TYPE)) {
builder.entity(renderTemplate("listResourceWithType", rwtList));
} else {
- GenericEntity<List<ResourceWithType>> list = new
GenericEntity<List<ResourceWithType>>(rwtList) {
+ if (mediaType.equals(wrappedCollectionJsonType)) {
+ wrapForPaging(builder,uriInfo,resources,rwtList);
+ } else {
+ GenericEntity<List<ResourceWithType>> list = new
GenericEntity<List<ResourceWithType>>(rwtList) {
};
- builder.entity(list);
+ builder.entity(list);
+ createPagingHeader(builder,uriInfo,resources);
+ }
}
return builder;
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/PagingCollection.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/PagingCollection.java
new file mode 100644
index 0000000..4a0f892
--- /dev/null
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/PagingCollection.java
@@ -0,0 +1,97 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+package org.rhq.enterprise.server.rest.domain;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * A wrapper for collections with paging entries
+ * @author Heiko W. Rupp
+ */
+@XmlRootElement
+public class PagingCollection<T> {
+
+ Collection<T> data;
+ int pageSize;
+ int currentPage;
+ int lastPage;
+ int totalSize;
+ List<Link> links = new ArrayList<Link>();
+
+ public PagingCollection(Collection<T> data) {
+ this.data = data;
+ }
+
+ public int getCurrentPage() {
+ return currentPage;
+ }
+
+ public void setCurrentPage(int currentPage) {
+ this.currentPage = currentPage;
+ }
+
+ public Collection<T> getData() {
+ return data;
+ }
+
+ public void setData(Collection<T> data) {
+ this.data = data;
+ }
+
+ public int getLastPage() {
+ return lastPage;
+ }
+
+ public void setLastPage(int lastPage) {
+ this.lastPage = lastPage;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public int getTotalSize() {
+ return totalSize;
+ }
+
+ public void setTotalSize(int totalSize) {
+ this.totalSize = totalSize;
+ }
+
+ public List<Link> getLinks() {
+ return links;
+ }
+
+ public void setLinks(List<Link> links) {
+ this.links = links;
+ }
+
+ public void addLink(Link link) {
+ links.add(link);
+ }
+}
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationHelperTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationHelperTest.java
index 7e20630..3a7e961 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationHelperTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationHelperTest.java
@@ -703,7 +703,7 @@ public class ConfigurationHelperTest {
}
- @Test
+ @Test(enabled = false)
public void testConfigToMapComplexMapWithBadSetupLenient() throws Exception {
Configuration config = new Configuration();
diff --git
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AbstractBase.java
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AbstractBase.java
index ae4e81d..fd154ef 100644
---
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AbstractBase.java
+++
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AbstractBase.java
@@ -40,6 +40,7 @@ import static com.jayway.restassured.RestAssured.given;
public abstract class AbstractBase {
static final String APPLICATION_JSON = "application/json";
+ static final String WRAPPED_JSON = "application/vnd.rhq.wrapped+json";
private static final String APPLICATION_XML = "application/xml";
private static final String TEXT_CSV = "text/csv";
private static final String TEXT_HTML = "text/html";
@@ -48,6 +49,7 @@ public abstract class AbstractBase {
static Header acceptXml = new Header("Accept", APPLICATION_XML);
static Header acceptHtml = new Header("Accept", TEXT_HTML);
static Header acceptCsv = new Header("Accept", TEXT_CSV);
+ static Header acceptWrappedJson = new Header("Accept",WRAPPED_JSON);
int _platformId ;
int _platformTypeId;
diff --git
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java
index e02a723..acbb492 100644
---
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java
+++
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java
@@ -39,6 +39,7 @@ import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.emptyIterable;
import static org.hamcrest.Matchers.instanceOf;
@@ -116,6 +117,22 @@ public class AlertTest extends AbstractBase {
.get("/alert");
}
+ @Test
+ public void testListAlertsWithPagingAndWrapped() throws Exception {
+
+ given()
+ .header(acceptWrappedJson)
+ .queryParam("ps", 2)
+ .queryParam("page", 0)
+ .expect()
+ .statusCode(200)
+ .header("Link", nullValue())
+ .body("totalSize", notNullValue())
+ .log().ifError()
+ .when()
+ .get("/alert");
+ }
+
@Test
public void testGetAlertCountJson() throws Exception {
@@ -192,6 +209,21 @@ public class AlertTest extends AbstractBase {
}
@Test
+ public void testListAllAlertDefinitionsWithWrapping() throws Exception {
+
+ given()
+ .header(acceptWrappedJson)
+ .log().everything()
+ .expect()
+ .statusCode(200)
+ .log().ifError()
+ .body("currentPage", Matchers.notNullValue())
+ .body("totalSize", Matchers.notNullValue())
+ .when()
+ .get("/alert/definitions");
+ }
+
+ @Test
public void testRedirectForDefinition() throws Exception {
given()
.header(acceptJson)
diff --git
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
index 3515fac..ebd72c0 100644
---
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
+++
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
@@ -306,13 +306,13 @@ public class ContentTest extends AbstractBase {
.as(List.class);
if (resources!=null && resources.size()>0) {
- int resourceId = resources.get(0).getResourceId();
+ int resourceId = (Integer) ((Map <
String,Object>)resources.get(0)).get("resourceId");
given()
.pathParam("id", resourceId)
.queryParam("physical", "true") // Also remove target
on the EAP instance
.expect()
- .statusCode(200)
+ .statusCode(204)
.when()
.delete("/resource/{id}");
}
diff --git
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java
index a4ef048..ef575d1 100644
---
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java
+++
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java
@@ -35,6 +35,8 @@ import org.rhq.modules.integrationTests.restApi.d.GroupDef;
import static com.jayway.restassured.RestAssured.expect;
import static com.jayway.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.iterableWithSize;
@@ -69,17 +71,37 @@ public class GroupTest extends AbstractBase {
@Test
public void testGetGroups() throws Exception {
- expect().statusCode(200)
- .when().get("/group");
+ expect()
+ .statusCode(200)
+ .when()
+ .get("/group");
}
@Test
public void testGetGroupsWithPaging() throws Exception {
given()
+ .header(acceptJson)
+ .queryParam("page",0)
+ .queryParam("ps",2)
+ .expect()
+ .statusCode(200)
+ .header("Link", notNullValue())
+ .when()
+ .get("/group");
+ }
+
+ @Test
+ public void testGetGroupsWithPagingWrapped() throws Exception {
+ given()
+ .header(acceptWrappedJson)
.queryParam("page",0)
.queryParam("ps",2)
.expect()
.statusCode(200)
+ .log().ifError()
+ .header("Link",nullValue())
+ .body("pageSize",is(2))
+ .body("currentPage",is(0))
.when()
.get("/group");
}
@@ -87,10 +109,11 @@ public class GroupTest extends AbstractBase {
@Test
public void testGetGroupsQuery() throws Exception {
given()
- .queryParam("q","lala")
+ .queryParam("q", "lala")
.expect()
- .statusCode(200)
- .when().get("/group");
+ .statusCode(200)
+ .when()
+ .get("/group");
}
@Test
diff --git
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java
index b66d9b5..cd103ca 100644
---
a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java
+++
b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java
@@ -82,6 +82,27 @@ public class ResourcesTest extends AbstractBase {
}
@Test
+ public void testGetPlatformJsonWrapping() {
+
+ // Actually this object should not be wrapped
+ // as it is no list
+ given()
+ .header(acceptWrappedJson)
+ .pathParam("id",_platformId)
+ .expect()
+ .statusCode(200)
+ .contentType(WRAPPED_JSON)
+ .log().everything()
+ .body("links.self", notNullValue())
+ .body("resourceId",is(_platformId))
+ .body("typeId",is(_platformTypeId))
+ .body("parentId",is(0))
+ .when()
+ .get("/resource/{id}");
+
+ }
+
+ @Test
public void testGetPlatformAndTypeJson() {
Integer typeId =
@@ -258,7 +279,26 @@ public class ResourcesTest extends AbstractBase {
// .header("Link", allOf(containsString("page=2"),
containsString("current")))
.header("Link",not(containsString("prev")))
.body("links.self", notNullValue())
- .when().get("/resource");
+ .when()
+ .get("/resource");
+ }
+
+ @Test
+ public void testGetResourcesWithPagingAndWrapping() throws Exception {
+
+ given()
+ .header("Accept", "application/vnd.rhq.wrapped+json")
+ .with()
+ .queryParam("page", 1)
+ .queryParam("ps", 2) // Unusually small to provoke having more
than 1 page
+ .queryParam("category", "service")
+ .expect()
+ .statusCode(200)
+ .log().everything()
+ .body("pageSize",is(2))
+ .body("currentPage",is(1))
+ .when()
+ .get("/resource");
}
@Test