modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/GroupMemberCandidateResourcesTest.java
| 190 ++++++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
| 8
2 files changed, 196 insertions(+), 2 deletions(-)
New commits:
commit 5b0415a3703ce56bbc27fd348c9808e446207fed
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Wed Jul 10 15:52:07 2013 +0200
Bug 910646 - Unable to add more than 100 resources to a Compatible Group
Add integration test and throw UnsupportedOperationException if criteria has unlimited
PageControl
diff --git
a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/GroupMemberCandidateResourcesTest.java
b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/GroupMemberCandidateResourcesTest.java
new file mode 100644
index 0000000..3447799
--- /dev/null
+++
b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/GroupMemberCandidateResourcesTest.java
@@ -0,0 +1,190 @@
+/*
+ * 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.resource.test;
+
+import static org.rhq.core.domain.util.PageOrdering.ASC;
+
+import java.util.Arrays;
+
+import javax.ejb.EJBException;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.SessionTestHelper;
+
+/**
+ * @author Thomas Segismont
+ */
+public class GroupMemberCandidateResourcesTest extends AbstractEJB3Test {
+
+ private static final String GROUP_MEMBER_CANDIDATE_NAME_PREFIX =
GroupMemberCandidateResourcesTest.class
+ .getSimpleName() + "-";
+
+ private Subject overlord;
+
+ private ResourceManagerLocal resourceManager;
+
+ @Override
+ protected void beforeMethod() throws Exception {
+ SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ overlord = subjectManager.getOverlord();
+ resourceManager = LookupUtil.getResourceManager();
+ }
+
+ @Test
+ public void testNoCandidates() {
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setCaseSensitive(false);
+ criteria.addFilterName(GROUP_MEMBER_CANDIDATE_NAME_PREFIX);
+
+ PageList<Resource> groupMemberCandidateResources =
resourceManager.findGroupMemberCandidateResources(
+ overlord, criteria, new int[0]);
+
+ assertEquals(0, groupMemberCandidateResources.getTotalSize());
+ assertEquals(0, groupMemberCandidateResources.size());
+ }
+ });
+ }
+
+ @Test
+ public void testNoCandidatesWithExclusions() {
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setCaseSensitive(false);
+ criteria.addFilterName(GROUP_MEMBER_CANDIDATE_NAME_PREFIX);
+ int[] alreadySelectedResourceIds = new int[100];
+ for (int i = 0; i < alreadySelectedResourceIds.length; i++) {
+ alreadySelectedResourceIds[i] = i;
+ }
+
+ PageList<Resource> groupMemberCandidateResources =
resourceManager.findGroupMemberCandidateResources(
+ overlord, criteria, alreadySelectedResourceIds);
+
+ assertEquals(0, groupMemberCandidateResources.getTotalSize());
+ assertEquals(0, groupMemberCandidateResources.size());
+ }
+ });
+ }
+
+ @Test
+ public void testUnlimitedPageControl() {
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setPageControl(PageControl.getUnlimitedInstance());
+
+ try {
+ PageList<Resource> groupMemberCandidateResources =
resourceManager
+ .findGroupMemberCandidateResources(overlord, criteria, new
int[0]);
+ fail("findGroupMemberCandidateResources should throw
UnsupportedOperationException");
+ } catch (EJBException e) {
+ assertTrue(e.getCausedByException() instanceof
UnsupportedOperationException);
+ }
+ }
+ });
+ }
+
+ @Test
+ public void testPageControl() {
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ int resourcesCount = 100;
+ createTestResources(resourcesCount);
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setCaseSensitive(false);
+ criteria.addFilterName(GROUP_MEMBER_CANDIDATE_NAME_PREFIX);
+ criteria.addSortName(ASC);
+ int pageNumber = 5;
+ int pageSize = 7;
+ criteria.setPaging(pageNumber, pageSize);
+
+ PageList<Resource> groupMemberCandidateResources =
resourceManager.findGroupMemberCandidateResources(
+ overlord, criteria, new int[0]);
+
+ assertEquals(resourcesCount,
groupMemberCandidateResources.getTotalSize());
+ assertEquals(pageSize, groupMemberCandidateResources.size());
+ for (Resource groupMemberCandidateResource :
groupMemberCandidateResources) {
+
assertTrue(groupMemberCandidateResource.getName().startsWith(GROUP_MEMBER_CANDIDATE_NAME_PREFIX));
+ }
+ assertEquals(pageNumber,
groupMemberCandidateResources.getPageControl().getPageNumber());
+ assertEquals(pageSize,
groupMemberCandidateResources.getPageControl().getPageSize());
+ }
+ });
+ }
+
+ @Test
+ public void testPageControlWithExclusions() {
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ int resourcesCount = 100;
+ int[] resourcesIds = createTestResources(resourcesCount);
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setCaseSensitive(false);
+ criteria.addFilterName(GROUP_MEMBER_CANDIDATE_NAME_PREFIX);
+ criteria.addSortName(ASC);
+ int pageNumber = 5;
+ int pageSize = 7;
+ criteria.setPaging(pageNumber, pageSize);
+ int[] alreadySelectedResourceIds = Arrays.copyOfRange(resourcesIds, 13,
59);
+
+ PageList<Resource> groupMemberCandidateResources =
resourceManager.findGroupMemberCandidateResources(
+ overlord, criteria, alreadySelectedResourceIds);
+
+ assertEquals(resourcesCount,
groupMemberCandidateResources.getTotalSize());
+ assertEquals(pageSize, groupMemberCandidateResources.size());
+ for (Resource groupMemberCandidateResource :
groupMemberCandidateResources) {
+
assertTrue(groupMemberCandidateResource.getName().startsWith(GROUP_MEMBER_CANDIDATE_NAME_PREFIX));
+ }
+ assertEquals(pageNumber,
groupMemberCandidateResources.getPageControl().getPageNumber());
+ assertEquals(pageSize,
groupMemberCandidateResources.getPageControl().getPageSize());
+ }
+ });
+ }
+
+ private int[] createTestResources(int resourcesCount) {
+ int[] resourcesIds = new int[resourcesCount];
+ ResourceType testResourceType = SessionTestHelper.createNewResourceType(em);
+ for (int i = 0; i < resourcesCount; i++) {
+ resourcesIds[i] = SessionTestHelper.createNewResource(em,
GROUP_MEMBER_CANDIDATE_NAME_PREFIX + i,
+ testResourceType).getId();
+ }
+ return resourcesIds;
+ }
+
+}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 0c8594d..0aa09a4 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -2930,10 +2930,14 @@ public class ResourceManagerBean implements ResourceManagerLocal,
ResourceManage
public PageList<Resource> findGroupMemberCandidateResources(Subject subject,
ResourceCriteria criteria,
int[] alreadySelectedResourceIds) {
+ PageControl originalPageControl = getPageControl(criteria);
+ if (originalPageControl.isUnlimited()) {
+ throw new UnsupportedOperationException("Supplied criteria has an
unlimited PageControl");
+ }
+
Set<Integer> alreadySelectedResourceIdSet = new HashSet<Integer>(
- ArrayUtils.wrapInList(alreadySelectedResourceIds));
+ ArrayUtils.wrapInList(alreadySelectedResourceIds == null ? new int[0] :
alreadySelectedResourceIds));
- PageControl originalPageControl = getPageControl(criteria);
PageControl pageControl = (PageControl) originalPageControl.clone();
criteria.setPageControl(pageControl);