/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.ext.security.management.search; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.uberfire.ext.security.management.api.AbstractEntityManager; import org.uberfire.ext.security.management.impl.SearchResponseImpl; /** * <p>Base runtime search engine implementation for collections of entities.</p> * @since 0.8.0 */ public abstract class AbstractRuntimeSearchEngine<T> implements RuntimeSearchEngine<T> { @Override public AbstractEntityManager.SearchResponse<T> search(Collection<T> entities, AbstractEntityManager.SearchRequest request) { if (entities == null || request == null) { return null; } // First page must be 1. if (request.getPage() <= 0) { throw new RuntimeException("First page must be 1."); } // Search elements using the given pattern & check the returning elements are not considered roles on UF. final String pattern = request.getSearchPattern(); final boolean isPatternEmpty = isEmpty(pattern); Collection<T> result = isPatternEmpty ? entities : new LinkedList<T>(); if (!isPatternEmpty) { for (T entity : entities) { final String id = getIdentifier(entity); if (!isConstrained(request, id) && id.contains(pattern)) { result.add(entity); } } } return createResponse(result, request); } protected boolean isConstrained(AbstractEntityManager.SearchRequest request, String name) { final Set<String> constrainedIdentifiers = request.getConstrainedIdentifiers(); if (null != constrainedIdentifiers) { for (final String id : constrainedIdentifiers) { if (id.equals(name)) { return true; } } } return false; } public AbstractEntityManager.SearchResponse<T> createResponse(Collection<T> entities, AbstractEntityManager.SearchRequest request) { List<T> result = new LinkedList<T>(entities); // Apply pagination. final int total = result.size(); // First page is 1. final int page = request.getPage() - 1; final int pageSize = request.getPageSize(); final int startPos = page * pageSize; final int endPos = startPos + pageSize > total ? total : startPos + pageSize; if (result.size() >= startPos) { result = result.subList(startPos, endPos); } // Return the paginated response. return new SearchResponseImpl<T>(result, page + 1, pageSize, total, total > endPos); } protected abstract String getIdentifier(T entity); protected boolean isEmpty(String str) { return str == null || str.trim().length() == 0; } }