001/* 002 * (C) Copyright 2016-2018 Nuxeo (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * "Guillaume Renard" 018 */ 019 020package org.nuxeo.ecm.platform.usermanager.providers; 021 022import java.util.ArrayList; 023import java.util.Iterator; 024import java.util.List; 025 026import org.apache.commons.lang3.StringUtils; 027import org.nuxeo.ecm.core.api.NuxeoGroup; 028import org.nuxeo.ecm.platform.query.api.AbstractPageProvider; 029import org.nuxeo.ecm.platform.query.api.PageProvider; 030import org.nuxeo.ecm.platform.usermanager.UserManager; 031import org.nuxeo.runtime.api.Framework; 032 033/** 034 * @since 8.2 035 */ 036public abstract class AbstractGroupMemberPageProvider<T> extends AbstractPageProvider<T> implements PageProvider<T> { 037 038 private static final long serialVersionUID = 1L; 039 040 protected static int safeLongToInt(long l) { 041 if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) { 042 throw new IllegalArgumentException(l + " cannot be cast to int without changing its value."); 043 } 044 return (int) l; 045 } 046 047 protected UserManager userManager; 048 049 protected List<T> currentPage; 050 051 @Override 052 public List<T> getCurrentPage() { 053 if (currentPage == null) { 054 currentPage = new ArrayList<>(); 055 NuxeoGroup group = (NuxeoGroup) getParameters()[0]; 056 String query = null; 057 if (getParameters().length > 1) { 058 query = (String) getParameters()[1]; 059 } 060 List<String> members = getMembers(group); 061 062 // remove entries not starting with our query 063 if (StringUtils.isNotEmpty(query) && !"*".equals(query)) { 064 query = query.toLowerCase(); 065 final Iterator<String> it = members.iterator(); 066 while (it.hasNext()) { 067 if (!it.next().toLowerCase().startsWith(query)) { 068 it.remove(); 069 } 070 } 071 } 072 073 int limit = safeLongToInt(getCurrentPageOffset() + getPageSize()); 074 if (limit > members.size()) { 075 limit = members.size(); 076 } 077 078 for (String member : members.subList(safeLongToInt(getCurrentPageOffset()), limit)) { 079 T object = getMember(member); 080 if (object != null) { 081 currentPage.add(object); 082 } 083 } 084 085 setResultsCount(members.size()); 086 } 087 return currentPage; 088 } 089 090 protected abstract List<String> getMembers(NuxeoGroup group); 091 092 protected abstract T getMember(String id); 093 094 @Override 095 public long getPageLimit() { 096 long pageSize = getPageSize(); 097 if (pageSize == 0) { 098 return 0; 099 } 100 return ((NuxeoGroup) getParameters()[0]).getMemberGroups().size() / pageSize; 101 } 102 103 @Override 104 public boolean isSortable() { 105 return false; 106 } 107 108 @Override 109 protected void pageChanged() { 110 currentPage = null; 111 super.pageChanged(); 112 } 113 114 protected UserManager getUserManager() { 115 if (userManager == null) { 116 userManager = Framework.getService(UserManager.class); 117 } 118 return userManager; 119 } 120}