From fbd6f4f3c7deeb9f987ab089744da2ec167c6110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 9 Apr 2019 13:09:16 +0200 Subject: [PATCH] Introduce filter parameter in Manager --- scm-core/src/main/java/sonia/scm/Manager.java | 9 ++++++--- .../main/java/sonia/scm/ManagerDecorator.java | 5 +++-- .../src/test/java/sonia/scm/ManagerTest.java | 18 ++++++++++-------- .../CollectionResourceManagerAdapter.java | 9 +++++---- .../v2/resources/IdResourceManagerAdapter.java | 4 ++-- .../sonia/scm/group/DefaultGroupManager.java | 7 ++++--- .../repository/DefaultRepositoryManager.java | 6 ++++-- .../sonia/scm/user/DefaultUserManager.java | 7 ++++--- 8 files changed, 38 insertions(+), 27 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/Manager.java b/scm-core/src/main/java/sonia/scm/Manager.java index 9a7f21d3ef..6e0b72295c 100644 --- a/scm-core/src/main/java/sonia/scm/Manager.java +++ b/scm-core/src/main/java/sonia/scm/Manager.java @@ -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 * 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 getAll(Comparator comparator); + Collection getAll(Predicate filter, Comparator comparator); /** * Returns objects from the store which are starts at the given start @@ -125,6 +127,7 @@ public interface Manager *

This default implementation reads all items, first, so you might want to adapt this * whenever reading is expensive!

* + * @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 * page. If the requested page number exceeds the existing pages, an * empty page result is returned. */ - default PageResult getPage(Comparator comparator, int pageNumber, int pageSize) { - return PageResult.createPage(getAll(comparator), pageNumber, pageSize); + default PageResult getPage(Predicate filter, Comparator comparator, int pageNumber, int pageSize) { + return PageResult.createPage(getAll(filter, comparator), pageNumber, pageSize); } } diff --git a/scm-core/src/main/java/sonia/scm/ManagerDecorator.java b/scm-core/src/main/java/sonia/scm/ManagerDecorator.java index f6e91aeced..0c46366a56 100644 --- a/scm-core/src/main/java/sonia/scm/ManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/ManagerDecorator.java @@ -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 implements Manager { } @Override - public Collection getAll(Comparator comparator) + public Collection getAll(Predicate filter, Comparator comparator) { - return decorated.getAll(comparator); + return decorated.getAll(filter, comparator); } @Override diff --git a/scm-core/src/test/java/sonia/scm/ManagerTest.java b/scm-core/src/test/java/sonia/scm/ManagerTest.java index 06c8eb3ea6..b26fdb3217 100644 --- a/scm-core/src/test/java/sonia/scm/ManagerTest.java +++ b/scm-core/src/test/java/sonia/scm/ManagerTest.java @@ -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; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java index c9eb6a9d26..1788ca2643 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java @@ -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, CollectionDto> mapToDto) { - PageResult pageResult = fetchPage(sortBy, desc, page, pageSize); + public Response getAll(int page, int pageSize, Predicate filter, String sortBy, boolean desc, Function, CollectionDto> mapToDto) { + PageResult pageResult = fetchPage(filter, sortBy, desc, page, pageSize); return Response.ok(mapToDto.apply(pageResult)).build(); } - private PageResult fetchPage(String sortBy, boolean desc, int pageNumber, + private PageResult fetchPage(Predicate filter, String sortBy, boolean desc, int pageNumber, int pageSize) { AssertUtil.assertPositive(pageNumber); AssertUtil.assertPositive(pageSize); @@ -57,7 +58,7 @@ class CollectionResourceManagerAdapter createComparator(String sortBy, boolean desc) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java index 2b2a4cf0ad..79a0e038d9 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java @@ -45,8 +45,8 @@ class IdResourceManagerAdapter, CollectionDto> mapToDto) { - return collectionAdapter.getAll(page, pageSize, sortBy, desc, mapToDto); + public Response getAll(int page, int pageSize, Predicate filter, String sortBy, boolean desc, Function, CollectionDto> mapToDto) { + return collectionAdapter.getAll(page, pageSize, filter, sortBy, desc, mapToDto); } public Response create(DTO dto, Supplier modelObjectSupplier, Function uriCreator) { diff --git a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java index 3320773e57..4fd89d657e 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java +++ b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java @@ -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 getAll() { - return getAll(null); + return getAll(group -> true, null); } /** @@ -262,14 +263,14 @@ public class DefaultGroupManager extends AbstractGroupManager * @return */ @Override - public Collection getAll(Comparator comparator) + public Collection getAll(Predicate filter, Comparator comparator) { List groups = new ArrayList<>(); PermissionActionCheck check = GroupPermissions.read(); for (Group group : groupDAO.getAll()) { - if (check.isPermitted(group)) { + if (filter.test(group) && check.isPermitted(group)) { groups.add(group.clone()); } } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index 12a7f7cc51..1bcd877620 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -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 getAll(Comparator comparator) { + public Collection getAll(Predicate filter, Comparator comparator) { List repositories = Lists.newArrayList(); PermissionActionCheck 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 getAll() { - return getAll(null); + return getAll(repository -> true, null); } diff --git a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java index a6c40b24f4..b44db8d62a 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java @@ -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 getAll() { - return getAll(null); + return getAll(user -> true, null); } /** @@ -292,13 +293,13 @@ public class DefaultUserManager extends AbstractUserManager * @return */ @Override - public Collection getAll(Comparator comparator) + public Collection getAll(Predicate filter, Comparator comparator) { List users = new ArrayList<>(); PermissionActionCheck check = UserPermissions.read(); for (User user : userDAO.getAll()) { - if (check.isPermitted(user)) { + if (filter.test(user) && check.isPermitted(user)) { users.add(user.clone()); } }