diff --git a/history/taskana-simplehistory-provider/src/main/java/pro/taskana/simplehistory/impl/TaskanaHistoryEngineImpl.java b/history/taskana-simplehistory-provider/src/main/java/pro/taskana/simplehistory/impl/TaskanaHistoryEngineImpl.java index f4f3979d1..59fec61f4 100644 --- a/history/taskana-simplehistory-provider/src/main/java/pro/taskana/simplehistory/impl/TaskanaHistoryEngineImpl.java +++ b/history/taskana-simplehistory-provider/src/main/java/pro/taskana/simplehistory/impl/TaskanaHistoryEngineImpl.java @@ -70,8 +70,7 @@ public class TaskanaHistoryEngineImpl implements TaskanaHistoryEngine { .map(role -> getConfiguration().getRoleMap().get(role)) .collect(HashSet::new, Set::addAll, Set::addAll); - return CurrentUserContext.getAccessIds().stream() - .anyMatch(rolesMembers::contains); + return CurrentUserContext.getAccessIds().stream().anyMatch(rolesMembers::contains); } public void checkRoleMembership(TaskanaRole... roles) throws NotAuthorizedException { diff --git a/history/taskana-simplehistory-provider/src/test/java/acceptance/query/QueryHistoryAccTest.java b/history/taskana-simplehistory-provider/src/test/java/acceptance/query/QueryHistoryAccTest.java index a58fa6541..f9b62cabc 100644 --- a/history/taskana-simplehistory-provider/src/test/java/acceptance/query/QueryHistoryAccTest.java +++ b/history/taskana-simplehistory-provider/src/test/java/acceptance/query/QueryHistoryAccTest.java @@ -53,13 +53,9 @@ class QueryHistoryAccTest extends AbstractAccTest { .orderByCreated(SortDirection.DESCENDING); List results = query.list(); - assertThat(results) - .extracting(TaskanaHistoryEvent::getUserId) - .containsOnly("admin", "peter"); + assertThat(results).extracting(TaskanaHistoryEvent::getUserId).containsOnly("admin", "peter"); results = query.orderByUserId(SortDirection.DESCENDING).list(); - assertThat(results) - .extracting(TaskanaHistoryEvent::getUserId) - .containsOnly("admin", "peter"); + assertThat(results).extracting(TaskanaHistoryEvent::getUserId).containsOnly("admin", "peter"); assertThat(query.domainLike().count()).isEqualTo(13); } diff --git a/history/taskana-simplehistory-provider/src/test/java/acceptance/security/JaasExtension.java b/history/taskana-simplehistory-provider/src/test/java/acceptance/security/JaasExtension.java index 7a4ec81db..3413389d6 100644 --- a/history/taskana-simplehistory-provider/src/test/java/acceptance/security/JaasExtension.java +++ b/history/taskana-simplehistory-provider/src/test/java/acceptance/security/JaasExtension.java @@ -87,8 +87,7 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat Invocation invocation, ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext) { - WithAccessIds annotation = invocationContext.getExecutable().getAnnotation( - WithAccessIds.class); + WithAccessIds annotation = invocationContext.getExecutable().getAnnotation(WithAccessIds.class); if (annotation != null) { // our goal is to run each test returned from the test factory X times. X is the amount of // WithAccessId annotations. In order to achieve this we are wrapping the result from the @@ -236,8 +235,7 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat private static T extractAccessIdAndPerformInvocation( Invocation invocation, AnnotatedElement executable) { - return performInvocationWithAccessId(invocation, executable.getAnnotation( - WithAccessId.class)); + return performInvocationWithAccessId(invocation, executable.getAnnotation(WithAccessId.class)); } private static T performInvocationWithAccessId( @@ -250,8 +248,7 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat return Subject.doAs(subject, performInvocation); } - private static List getPrincipals( - WithAccessId withAccessId) { + private static List getPrincipals(WithAccessId withAccessId) { if (withAccessId != null) { return Stream.concat( Stream.of(withAccessId.user()).map(UserPrincipal::new), @@ -289,16 +286,14 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat return context.getStore(Namespace.create(getClass(), context.getRequiredTestMethod())); } - private static String getDisplayNameForAccessId( - WithAccessId withAccessId) { + private static String getDisplayNameForAccessId(WithAccessId withAccessId) { return String.format("for user '%s'", withAccessId.user()); } private static class JaasExtensionInvocationContext implements TestTemplateInvocationContext { private final WithAccessId withAccessId; - private JaasExtensionInvocationContext( - WithAccessId withAccessId) { + private JaasExtensionInvocationContext(WithAccessId withAccessId) { this.withAccessId = withAccessId; } diff --git a/history/taskana-simplehistory-rest-spring/src/test/java/pro/taskana/doc/api/TaskHistoryEventControllerRestDocumentation.java b/history/taskana-simplehistory-rest-spring/src/test/java/pro/taskana/doc/api/TaskHistoryEventControllerRestDocumentation.java index 153d41db2..47ccc78c4 100644 --- a/history/taskana-simplehistory-rest-spring/src/test/java/pro/taskana/doc/api/TaskHistoryEventControllerRestDocumentation.java +++ b/history/taskana-simplehistory-rest-spring/src/test/java/pro/taskana/doc/api/TaskHistoryEventControllerRestDocumentation.java @@ -173,7 +173,9 @@ public class TaskHistoryEventControllerRestDocumentation { this.mockMvc .perform( RestDocumentationRequestBuilders.get( - "http://127.0.0.1:" + port + "/api/v1/task-history-event/HEI:000000000000000000000000000000000000") + "http://127.0.0.1:" + + port + + "/api/v1/task-history-event/HEI:000000000000000000000000000000000000") .accept("application/hal+json") .header("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x")) .andExpect(MockMvcResultMatchers.status().isOk()) diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/api/WorkingDaysToDaysConverter.java b/lib/taskana-core/src/main/java/pro/taskana/common/api/WorkingDaysToDaysConverter.java index cd870386c..8f95c5d24 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/api/WorkingDaysToDaysConverter.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/api/WorkingDaysToDaysConverter.java @@ -22,7 +22,7 @@ import pro.taskana.common.api.exceptions.SystemException; * The WorkingDaysToDaysConverter provides a method to convert an age in working days into an age in * days. */ -public final class WorkingDaysToDaysConverter { +public class WorkingDaysToDaysConverter { // offset in days from easter sunday private static final long OFFSET_GOOD_FRIDAY = -2; // Good Friday diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/util/CheckedBiConsumer.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/util/CheckedBiConsumer.java index 095eca446..334c4ae12 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/util/CheckedBiConsumer.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/util/CheckedBiConsumer.java @@ -4,5 +4,4 @@ package pro.taskana.common.internal.util; public interface CheckedBiConsumer { void accept(T t, U u) throws E; - } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/MonitorService.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/MonitorService.java index d8e411144..45428bb6e 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/MonitorService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/MonitorService.java @@ -1,6 +1,6 @@ package pro.taskana.monitor.api; -import pro.taskana.monitor.api.reports.CategoryReport; +import pro.taskana.monitor.api.reports.ClassificationCategoryReport; import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.CustomFieldValueReport; import pro.taskana.monitor.api.reports.TaskStatusReport; @@ -20,12 +20,13 @@ public interface MonitorService { WorkbasketReport.Builder createWorkbasketReportBuilder(); /** - * Provides a {@link CategoryReport.Builder} for creating a {@link CategoryReport}, list the task - * ids of this report and list the values of an entered custom attribute. + * Provides a {@link ClassificationCategoryReport.Builder} for creating a {@link + * ClassificationCategoryReport}, list the task ids of this report and list the values of an + * entered custom attribute. * - * @return a {@link CategoryReport.Builder} + * @return a {@link ClassificationCategoryReport.Builder} */ - CategoryReport.Builder createCategoryReportBuilder(); + ClassificationCategoryReport.Builder createCategoryReportBuilder(); /** * Provides a {@link ClassificationReport.Builder} for creating a {@link ClassificationReport} or diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/api/Timestamp.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/TaskTimestamp.java similarity index 76% rename from lib/taskana-core/src/main/java/pro/taskana/task/api/Timestamp.java rename to lib/taskana-core/src/main/java/pro/taskana/monitor/api/TaskTimestamp.java index 41639cef7..22df94953 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/api/Timestamp.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/TaskTimestamp.java @@ -1,9 +1,9 @@ -package pro.taskana.task.api; +package pro.taskana.monitor.api; import pro.taskana.task.api.models.Task; /** This enum contains all timestamps saved in the database table for a {@link Task}. */ -public enum Timestamp { +public enum TaskTimestamp { CREATED, CLAIMED, COMPLETED, diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/CategoryReport.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationCategoryReport.java similarity index 66% rename from lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/CategoryReport.java rename to lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationCategoryReport.java index 66d13e3c9..f98ed7ce3 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/CategoryReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationCategoryReport.java @@ -4,6 +4,7 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.item.MonitorQueryItem; @@ -15,17 +16,23 @@ import pro.taskana.monitor.api.reports.item.MonitorQueryItem; * also the number of tasks of the respective cluster. The age of the tasks can be counted in days * or in working days. Tasks with Timestamp DUE = null are not considered. */ -public class CategoryReport extends Report { +public class ClassificationCategoryReport + extends Report { - public CategoryReport(List timeIntervalColumnHeaders) { + public ClassificationCategoryReport(List timeIntervalColumnHeaders) { super(timeIntervalColumnHeaders, new String[] {"CLASSIFICATION CATEGORIES"}); } - /** Builder for {@link CategoryReport}. */ + /** Builder for {@link ClassificationCategoryReport}. */ public interface Builder extends TimeIntervalReportBuilder { @Override - CategoryReport buildReport() throws NotAuthorizedException, InvalidArgumentException; + ClassificationCategoryReport buildReport() + throws NotAuthorizedException, InvalidArgumentException; + + @Override + ClassificationCategoryReport buildReport(TaskTimestamp timestamp) + throws NotAuthorizedException, InvalidArgumentException; } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationReport.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationReport.java index a8ce5e2d2..6726843d7 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/ClassificationReport.java @@ -4,6 +4,7 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem; @@ -28,6 +29,10 @@ public class ClassificationReport extends Report> { + private final Map> reportRows = new LinkedHashMap<>(); + private final Row sumRow; + private final String[] rowDesc; protected List columnHeaders; - private Map> reportRows = new LinkedHashMap<>(); - private Row sumRow; - private String[] rowDesc; protected Report(List columnHeaders, String[] rowDesc) { this.rowDesc = rowDesc; diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimeIntervalReportBuilder.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimeIntervalReportBuilder.java index cb8f79cb8..8a6ab74d8 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimeIntervalReportBuilder.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimeIntervalReportBuilder.java @@ -6,6 +6,7 @@ import java.util.Map; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.monitor.api.SelectedItem; +import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.item.AgeQueryItem; import pro.taskana.task.api.CustomField; @@ -59,13 +60,13 @@ public interface TimeIntervalReportBuilder< B stateIn(List states); /** - * Adds a list of categories to the builder. The created report contains only tasks with a - * category in this list. + * Adds a list of classificationCategories to the builder. The created report contains only tasks + * with a category in this list. * - * @param categories a list of categories + * @param classificationCategory a list of classificationCategories * @return the TimeIntervalReportBuilder */ - B categoryIn(List categories); + B classificationCategoryIn(List classificationCategory); /** * Adds a list of classificationIds to the builder. The created report contains only tasks with a @@ -123,4 +124,7 @@ public interface TimeIntervalReportBuilder< */ List listCustomAttributeValuesForCustomAttributeName(CustomField customField) throws NotAuthorizedException; + + Report buildReport(TaskTimestamp timestamp) + throws NotAuthorizedException, InvalidArgumentException; } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimestampReport.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimestampReport.java index d00bbd423..41ba8e264 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimestampReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/TimestampReport.java @@ -4,10 +4,10 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.item.TimestampQueryItem; import pro.taskana.monitor.api.reports.row.TimestampRow; -import pro.taskana.task.api.Timestamp; /** A {@link TimestampReport} displays created and competed tasks for a specific dates. */ public class TimestampReport extends Report { @@ -35,6 +35,6 @@ public class TimestampReport extends Report statuses); + Builder withTimestamps(List statuses); } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/WorkbasketReport.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/WorkbasketReport.java index 031c1a418..e2936372b 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/WorkbasketReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/api/reports/WorkbasketReport.java @@ -5,6 +5,7 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.monitor.api.CombinedClassificationFilter; +import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.item.MonitorQueryItem; @@ -30,14 +31,8 @@ public class WorkbasketReport extends Report" + "SELECT B.WORKBASKET_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM (" - + "SELECT T.WORKBASKET_KEY, (DAYS(T.DUE) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS " - + "SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.DUE) as AGE_IN_DAYS " - + "SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.DUE - CURRENT_TIMESTAMP) as AGE_IN_DAYS " + + "SELECT T.WORKBASKET_KEY, (DAYS(T.${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS " + + "SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.${timestamp}) as AGE_IN_DAYS " + + "SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS " + "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID " + "" + "" @@ -35,8 +35,8 @@ public interface MonitorMapper { + "" + "AND T.STATE IN (#{state}) " + "" - + "" - + "AND T.CLASSIFICATION_CATEGORY IN (#{category}) " + + "" + + "AND T.CLASSIFICATION_CATEGORY IN (#{category}) " + "" + "" + "AND T.DOMAIN IN (#{domain}) " @@ -69,66 +69,9 @@ public interface MonitorMapper { List getTaskCountOfWorkbaskets( @Param("workbasketIds") List workbasketIds, @Param("states") List states, - @Param("categories") List categories, - @Param("domains") List domains, - @Param("classificationIds") List classificationIds, - @Param("excludedClassificationIds") List excludedClassificationIds, - @Param("customAttributeFilter") Map customAttributeFilter, - @Param("combinedClassificationFilter") - List combinedClassificationFilter); - - @Select( - "") - @Results({ - @Result(column = "WORKBASKET_KEY", property = "key"), - @Result(column = "AGE_IN_DAYS", property = "ageInDays"), - @Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks") - }) - List getTaskCountOfWorkbasketsBasedOnPlannedDate( - @Param("workbasketIds") List workbasketIds, - @Param("states") List states, - @Param("categories") List categories, + @Param("classificationCategories") List classificationCategories, @Param("domains") List domains, + @Param("timestamp") TaskTimestamp timestamp, @Param("classificationIds") List classificationIds, @Param("excludedClassificationIds") List excludedClassificationIds, @Param("customAttributeFilter") Map customAttributeFilter, @@ -138,9 +81,9 @@ public interface MonitorMapper { @Select( "