@Override
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 == null ? new int[0] : alreadySelectedResourceIds));
PageControl pageControl = (PageControl) originalPageControl.clone();
criteria.setPageControl(pageControl);
int requiredPageSize = pageControl.getPageSize();
criteria.setRestriction(COUNT_ONLY);
int totalSize = findResourcesByCriteria(subject, criteria).getTotalSize();
int totalPages = (totalSize / requiredPageSize) + (((totalSize % requiredPageSize) > 0) ? 1 : 0);
criteria.setRestriction(COLLECTION_ONLY);
List<Resource> candidates = new LinkedList<Resource>();
for (int pageNumber = 0; candidates.size() < requiredPageSize && pageNumber < totalPages; pageNumber++) {
pageControl.setPageNumber(pageNumber);
PageList<Resource> foundResources = findResourcesByCriteria(subject, criteria);
Collection<Resource> filteredResources = filterOutAlreadySelectedResources(foundResources,
alreadySelectedResourceIdSet);
candidates.addAll(filteredResources);