diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskCountPerWorkbasket.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskCountPerWorkbasket.java deleted file mode 100644 index 674346d69..000000000 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskCountPerWorkbasket.java +++ /dev/null @@ -1,29 +0,0 @@ -package pro.taskana.impl; - -/** - * This class keeps a count of tasks that are contained in a workbasket. - * - * @author bbr - */ -public class TaskCountPerWorkbasket { - - Integer taskCount; - String workbasketId; - - public Integer getTaskCount() { - return taskCount; - } - - public void setTaskCount(Integer taskCount) { - this.taskCount = taskCount; - } - - public String getWorkbasketId() { - return workbasketId; - } - - public void setWorkbasketId(String workbasketId) { - this.workbasketId = workbasketId; - } - -} diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java index b6bd78b3e..2751115f7 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java @@ -3,8 +3,6 @@ package pro.taskana.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import org.apache.ibatis.exceptions.PersistenceException; import org.apache.ibatis.session.RowBounds; @@ -20,13 +18,13 @@ import pro.taskana.TaskanaEngine; import pro.taskana.TaskanaRole; import pro.taskana.TimeInterval; import pro.taskana.WorkbasketPermission; -import pro.taskana.WorkbasketSummary; import pro.taskana.exceptions.InvalidArgumentException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.NotAuthorizedToQueryWorkbasketException; import pro.taskana.exceptions.TaskanaRuntimeException; import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.impl.util.LoggerUtils; +import pro.taskana.security.CurrentUserContext; /** * TaskQuery for generating dynamic sql. @@ -34,7 +32,7 @@ import pro.taskana.impl.util.LoggerUtils; public class TaskQueryImpl implements TaskQuery { private static final String LINK_TO_MAPPER = "pro.taskana.mappings.QueryMapper.queryTaskSummaries"; - private static final String LINK_TO_TASK_COUNT_PER_WORKBASKET = "pro.taskana.mappings.QueryMapper.queryTaskCountPerWorkbasket"; + private static final String LINK_TO_COUNTER = "pro.taskana.mappings.QueryMapper.countQueryTasks"; private static final String LINK_TO_VALUEMAPPER = "pro.taskana.mappings.QueryMapper.queryTaskColumnValues"; private static final String TIME_INTERVAL = "TimeInterval "; private static final String IS_INVALID = " is invalid."; @@ -108,6 +106,7 @@ public class TaskQueryImpl implements TaskQuery { private String[] custom15Like; private String[] custom16In; private String[] custom16Like; + private String[] accessIdIn; private TimeInterval[] createdIn; private TimeInterval[] claimedIn; private TimeInterval[] completedIn; @@ -704,6 +703,7 @@ public class TaskQueryImpl implements TaskQuery { taskanaEngine.openConnection(); checkOpenPermissionForSpecifiedWorkbaskets(); List tasks = new ArrayList<>(); + setupAccessIds(); tasks = taskanaEngine.getSqlSession().selectList(LINK_TO_MAPPER, this); if (LOGGER.isDebugEnabled()) { LOGGER.debug("mapper returned {} resulting Objects: {} ", tasks.size(), @@ -723,6 +723,22 @@ public class TaskQueryImpl implements TaskQuery { } } + private void setupAccessIds() { + if (taskanaEngine.isUserInRole(TaskanaRole.ADMIN)) { + this.accessIdIn = null; + } else if (this.accessIdIn == null) { + String[] accessIds = new String[0]; + List ucAccessIds = CurrentUserContext.getAccessIds(); + if (ucAccessIds != null && !ucAccessIds.isEmpty()) { + accessIds = new String[ucAccessIds.size()]; + accessIds = ucAccessIds.toArray(accessIds); + } + this.accessIdIn = accessIds; + WorkbasketQueryImpl.lowercaseAccessIds(this.accessIdIn); + } + + } + @Override public List listValues(String columnName, SortDirection sortDirection) { LOGGER.debug("Entry to listValues(dbColumnName={}) this = {}", columnName, this); @@ -752,6 +768,7 @@ public class TaskQueryImpl implements TaskQuery { taskanaEngine.openConnection(); checkOpenPermissionForSpecifiedWorkbaskets(); RowBounds rowBounds = new RowBounds(offset, limit); + setupAccessIds(); List tasks = taskanaEngine.getSqlSession().selectList(LINK_TO_MAPPER, this, rowBounds); result = taskService.augmentTaskSummariesByContainedSummaries(tasks); return result; @@ -782,6 +799,7 @@ public class TaskQueryImpl implements TaskQuery { try { taskanaEngine.openConnection(); checkOpenPermissionForSpecifiedWorkbaskets(); + setupAccessIds(); TaskSummaryImpl taskSummaryImpl = taskanaEngine.getSqlSession().selectOne(LINK_TO_MAPPER, this); if (taskSummaryImpl == null) { return null; @@ -807,36 +825,15 @@ public class TaskQueryImpl implements TaskQuery { try { taskanaEngine.openConnection(); checkOpenPermissionForSpecifiedWorkbaskets(); - List taskCounts = taskanaEngine.getSqlSession() - .selectList(LINK_TO_TASK_COUNT_PER_WORKBASKET, this); - return countTasksInAuthorizedWorkbaskets(taskCounts); + setupAccessIds(); + rowCount = taskanaEngine.getSqlSession().selectOne(LINK_TO_COUNTER, this); + return (rowCount == null) ? 0L : rowCount; } finally { taskanaEngine.returnConnection(); LOGGER.debug("exit from count(). Returning result {} ", rowCount); } } - private long countTasksInAuthorizedWorkbaskets(List taskCounts) { - Set retrievedWorkbasketIds = taskCounts.stream().map(TaskCountPerWorkbasket::getWorkbasketId).collect( - Collectors.toSet()); - // use WorkbasketQuery to filter for authorized WorkBaskets - WorkbasketQueryImpl query = (WorkbasketQueryImpl) taskanaEngine.getWorkbasketService().createWorkbasketQuery(); - query.setUsedToAugmentTasks(true); - List allowedWorkbaskets = query - .idIn(retrievedWorkbasketIds.toArray(new String[0])) - .list(); - Set authorizedWorkbasketIds = allowedWorkbaskets.stream().map(WorkbasketSummary::getId).collect( - Collectors.toSet()); - - long count = 0; - for (TaskCountPerWorkbasket taskCount : taskCounts) { - if (authorizedWorkbasketIds.contains(taskCount.getWorkbasketId())) { - count += taskCount.getTaskCount().intValue(); - } - } - return count; - } - private void checkOpenPermissionForSpecifiedWorkbaskets() { if (taskanaEngine.isUserInRole(TaskanaRole.ADMIN)) { LOGGER.debug("Skipping permissions check since user is in role ADMIN."); diff --git a/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java index e0380e948..11a193cf9 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java @@ -10,7 +10,6 @@ import pro.taskana.impl.ClassificationQueryImpl; import pro.taskana.impl.ClassificationSummaryImpl; import pro.taskana.impl.ObjectReference; import pro.taskana.impl.ObjectReferenceQueryImpl; -import pro.taskana.impl.TaskCountPerWorkbasket; import pro.taskana.impl.TaskQueryImpl; import pro.taskana.impl.TaskSummaryImpl; import pro.taskana.impl.WorkbasketAccessItemImpl; @@ -31,6 +30,12 @@ public interface QueryMapper { @Select("") - @Results(value = { - @Result(property = "taskCount", column = "TASK_COUNT"), - @Result(property = "workbasketId", column = "WORKBASKET_ID")}) - List queryTaskCountPerWorkbasket(TaskQueryImpl taskQuery); + Long countQueryTasks(TaskQueryImpl taskQuery); @Select("