Introduce filter parameter in Manager

This commit is contained in:
René Pfeuffer
2019-04-09 13:09:16 +02:00
parent f5933cb6d5
commit fbd6f4f3c7
8 changed files with 38 additions and 27 deletions

View File

@@ -35,6 +35,7 @@ package sonia.scm;
import java.util.Collection;
import java.util.Comparator;
import java.util.function.Predicate;
/**
* Base interface for all manager classes.
@@ -82,11 +83,12 @@ public interface Manager<T extends ModelObject>
* Returns all object of the store sorted by the given {@link java.util.Comparator}
*
*
* @param filter to filter the returned objects
* @param comparator to sort the returned objects
* @since 1.4
* @return all object of the store sorted by the given {@link java.util.Comparator}
*/
Collection<T> getAll(Comparator<T> comparator);
Collection<T> getAll(Predicate<T> filter, Comparator<T> comparator);
/**
* Returns objects from the store which are starts at the given start
@@ -125,6 +127,7 @@ public interface Manager<T extends ModelObject>
* <p>This default implementation reads all items, first, so you might want to adapt this
* whenever reading is expensive!</p>
*
* @param filter to filter returned objects
* @param comparator to sort the returned objects
* @param pageNumber the number of the page to be returned (zero based)
* @param pageSize the size of the pages
@@ -134,8 +137,8 @@ public interface Manager<T extends ModelObject>
* page. If the requested page number exceeds the existing pages, an
* empty page result is returned.
*/
default PageResult<T> getPage(Comparator<T> comparator, int pageNumber, int pageSize) {
return PageResult.createPage(getAll(comparator), pageNumber, pageSize);
default PageResult<T> getPage(Predicate<T> filter, Comparator<T> comparator, int pageNumber, int pageSize) {
return PageResult.createPage(getAll(filter, comparator), pageNumber, pageSize);
}
}

View File

@@ -37,6 +37,7 @@ package sonia.scm;
import java.io.IOException;
import java.util.Collection;
import java.util.Comparator;
import java.util.function.Predicate;
/**
* Basic decorator for manager classes.
@@ -104,9 +105,9 @@ public class ManagerDecorator<T extends ModelObject> implements Manager<T> {
}
@Override
public Collection<T> getAll(Comparator<T> comparator)
public Collection<T> getAll(Predicate<T> filter, Comparator<T> comparator)
{
return decorated.getAll(comparator);
return decorated.getAll(filter, comparator);
}
@Override

View File

@@ -5,6 +5,7 @@ import org.mockito.Mock;
import java.util.Collection;
import java.util.Comparator;
import java.util.function.Predicate;
import java.util.stream.IntStream;
import static java.util.stream.Collectors.toList;
@@ -18,21 +19,22 @@ public class ManagerTest {
@Mock
private Comparator comparator;
private Predicate predicate = x -> true;
@Test(expected = IllegalArgumentException.class)
public void validatesPageNumber() {
manager.getPage(comparator, -1, 5);
manager.getPage(predicate, comparator, -1, 5);
}
@Test(expected = IllegalArgumentException.class)
public void validatesPageSize() {
manager.getPage(comparator, 2, 0);
manager.getPage(predicate, comparator, 2, 0);
}
@Test
public void getsNoPage() {
givenItemCount = 0;
PageResult singlePage = manager.getPage(comparator, 0, 5);
PageResult singlePage = manager.getPage(predicate, comparator, 0, 5);
assertEquals(0, singlePage.getEntities().size());
assertEquals(givenItemCount, singlePage.getOverallCount());
}
@@ -40,7 +42,7 @@ public class ManagerTest {
@Test
public void getsSinglePageWithoutEnoughItems() {
givenItemCount = 3;
PageResult singlePage = manager.getPage(comparator, 0, 4);
PageResult singlePage = manager.getPage(predicate, comparator, 0, 4);
assertEquals(3, singlePage.getEntities().size() );
assertEquals(givenItemCount, singlePage.getOverallCount());
}
@@ -48,7 +50,7 @@ public class ManagerTest {
@Test
public void getsSinglePageWithExactCountOfItems() {
givenItemCount = 3;
PageResult singlePage = manager.getPage(comparator, 0, 3);
PageResult singlePage = manager.getPage(predicate, comparator, 0, 3);
assertEquals(3, singlePage.getEntities().size() );
assertEquals(givenItemCount, singlePage.getOverallCount());
}
@@ -56,11 +58,11 @@ public class ManagerTest {
@Test
public void getsTwoPages() {
givenItemCount = 3;
PageResult page1 = manager.getPage(comparator, 0, 2);
PageResult page1 = manager.getPage(predicate, comparator, 0, 2);
assertEquals(2, page1.getEntities().size());
assertEquals(givenItemCount, page1.getOverallCount());
PageResult page2 = manager.getPage(comparator, 1, 2);
PageResult page2 = manager.getPage(predicate, comparator, 1, 2);
assertEquals(1, page2.getEntities().size());
assertEquals(givenItemCount, page2.getOverallCount());
}
@@ -79,7 +81,7 @@ public class ManagerTest {
}
@Override
public Collection getAll(Comparator comparator) { return getAll(); }
public Collection getAll(Predicate filter, Comparator comparator) { return getAll(); }
@Override
public Collection getAll(int start, int limit) { return null; }

View File

@@ -12,6 +12,7 @@ import javax.ws.rs.core.Response;
import java.net.URI;
import java.util.Comparator;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
@@ -42,12 +43,12 @@ class CollectionResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
* Reads all model objects in a paged way, maps them using the given function and returns a corresponding http response.
* This handles all corner cases, eg. missing privileges.
*/
public Response getAll(int page, int pageSize, String sortBy, boolean desc, Function<PageResult<MODEL_OBJECT>, CollectionDto> mapToDto) {
PageResult<MODEL_OBJECT> pageResult = fetchPage(sortBy, desc, page, pageSize);
public Response getAll(int page, int pageSize, Predicate<MODEL_OBJECT> filter, String sortBy, boolean desc, Function<PageResult<MODEL_OBJECT>, CollectionDto> mapToDto) {
PageResult<MODEL_OBJECT> pageResult = fetchPage(filter, sortBy, desc, page, pageSize);
return Response.ok(mapToDto.apply(pageResult)).build();
}
private PageResult<MODEL_OBJECT> fetchPage(String sortBy, boolean desc, int pageNumber,
private PageResult<MODEL_OBJECT> fetchPage(Predicate<MODEL_OBJECT> filter, String sortBy, boolean desc, int pageNumber,
int pageSize) {
AssertUtil.assertPositive(pageNumber);
AssertUtil.assertPositive(pageSize);
@@ -57,7 +58,7 @@ class CollectionResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
sortBy = "id";
}
return manager.getPage(createComparator(sortBy, desc), pageNumber, pageSize);
return manager.getPage(filter, createComparator(sortBy, desc), pageNumber, pageSize);
}
private Comparator<MODEL_OBJECT> createComparator(String sortBy, boolean desc) {

View File

@@ -45,8 +45,8 @@ class IdResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
);
}
public Response getAll(int page, int pageSize, String sortBy, boolean desc, Function<PageResult<MODEL_OBJECT>, CollectionDto> mapToDto) {
return collectionAdapter.getAll(page, pageSize, sortBy, desc, mapToDto);
public Response getAll(int page, int pageSize, Predicate<MODEL_OBJECT> filter, String sortBy, boolean desc, Function<PageResult<MODEL_OBJECT>, CollectionDto> mapToDto) {
return collectionAdapter.getAll(page, pageSize, filter, sortBy, desc, mapToDto);
}
public Response create(DTO dto, Supplier<MODEL_OBJECT> modelObjectSupplier, Function<MODEL_OBJECT, String> uriCreator) {

View File

@@ -59,6 +59,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;
//~--- JDK imports ------------------------------------------------------------
@@ -250,7 +251,7 @@ public class DefaultGroupManager extends AbstractGroupManager
@Override
public Collection<Group> getAll()
{
return getAll(null);
return getAll(group -> true, null);
}
/**
@@ -262,14 +263,14 @@ public class DefaultGroupManager extends AbstractGroupManager
* @return
*/
@Override
public Collection<Group> getAll(Comparator<Group> comparator)
public Collection<Group> getAll(Predicate<Group> filter, Comparator<Group> comparator)
{
List<Group> groups = new ArrayList<>();
PermissionActionCheck<Group> check = GroupPermissions.read();
for (Group group : groupDAO.getAll())
{
if (check.isPermitted(group)) {
if (filter.test(group) && check.isPermitted(group)) {
groups.add(group.clone());
}
}

View File

@@ -64,6 +64,7 @@ import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.function.Predicate;
import static sonia.scm.AlreadyExistsException.alreadyExists;
import static sonia.scm.ContextEntry.ContextBuilder.entity;
@@ -253,13 +254,14 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
}
@Override
public Collection<Repository> getAll(Comparator<Repository> comparator) {
public Collection<Repository> getAll(Predicate<Repository> filter, Comparator<Repository> comparator) {
List<Repository> repositories = Lists.newArrayList();
PermissionActionCheck<Repository> check = RepositoryPermissions.read();
for (Repository repository : repositoryDAO.getAll()) {
if (handlerMap.containsKey(repository.getType())
&& filter.test(repository)
&& check.isPermitted(repository)) {
Repository r = repository.clone();
@@ -276,7 +278,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
@Override
public Collection<Repository> getAll() {
return getAll(null);
return getAll(repository -> true, null);
}

View File

@@ -62,6 +62,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Predicate;
/**
*
@@ -280,7 +281,7 @@ public class DefaultUserManager extends AbstractUserManager
@Override
public Collection<User> getAll()
{
return getAll(null);
return getAll(user -> true, null);
}
/**
@@ -292,13 +293,13 @@ public class DefaultUserManager extends AbstractUserManager
* @return
*/
@Override
public Collection<User> getAll(Comparator<User> comparator)
public Collection<User> getAll(Predicate<User> filter, Comparator<User> comparator)
{
List<User> users = new ArrayList<>();
PermissionActionCheck<User> check = UserPermissions.read();
for (User user : userDAO.getAll()) {
if (check.isPermitted(user)) {
if (filter.test(user) && check.isPermitted(user)) {
users.add(user.clone());
}
}