From 2c89353fc7ee964ec79367be4e7abe698fa271c3 Mon Sep 17 00:00:00 2001 From: holgerhagen Date: Thu, 18 Nov 2021 14:12:21 +0100 Subject: [PATCH] TSK-1769: TaskQuery on CustomFields distinguishes between empty / null. --- .../src/main/resources/sql/test-data/task.sql | 2 +- .../common/internal/util/SqlProviderUtil.java | 32 ++- .../internal/models/ClassificationImpl.java | 3 - .../models/ClassificationSummaryImpl.java | 64 ++---- .../monitor/internal/MonitorMapper.java | 6 +- .../ClassificationReportBuilderImpl.java | 4 +- .../reports/TaskStatusReportBuilderImpl.java | 24 ++- .../TimeIntervalReportBuilderImpl.java | 37 ++-- .../WorkbasketPriorityReportBuilderImpl.java | 37 ++-- .../reports/WorkbasketReportBuilderImpl.java | 2 +- .../taskana/task/internal/TaskQueryImpl.java | 204 +++++++++++++++--- .../task/internal/models/TaskImpl.java | 3 - .../task/internal/models/TaskSummaryImpl.java | 128 +++-------- .../internal/models/WorkbasketImpl.java | 3 - .../models/WorkbasketSummaryImpl.java | 32 +-- .../CreateClassificationAccTest.java | 45 ---- .../UpdateClassificationAccTest.java | 22 -- .../acceptance/task/CreateTaskAccTest.java | 48 ----- .../acceptance/task/QueryTasksAccTest.java | 96 +++++++++ .../acceptance/task/UpdateTaskAccTest.java | 25 +-- .../workbasket/CreateWorkbasketAccTest.java | 53 ----- .../workbasket/UpdateWorkbasketAccTest.java | 24 --- .../monitor/rest/MonitorController.java | 27 ++- 23 files changed, 439 insertions(+), 482 deletions(-) diff --git a/common/taskana-common-data/src/main/resources/sql/test-data/task.sql b/common/taskana-common-data/src/main/resources/sql/test-data/task.sql index 5e66ec813..8e2a44a8c 100644 --- a/common/taskana-common-data/src/main/resources/sql/test-data/task.sql +++ b/common/taskana-common-data/src/main/resources/sql/test-data/task.sql @@ -24,7 +24,7 @@ INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000020', 'ETI:0000000 INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000021', 'ETI:000000000000000000000000000000000021', '2018-01-29 15:55:21', null , null , '2018-01-29 15:55:21', null , '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000001' , 'GPK_KSC' , 'DOMAIN_A', 'PI_0000000000021' , 'DOC_0000000000000000021' , null , '00' , 'PASystem' , '00' , 'SDNR' , '11223344' , false , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , 'abc' , '' , '' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000022', 'ETI:000000000000000000000000000000000022', '2018-01-29 15:55:22', null , null , '2018-01-29 15:55:22', null , '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000001' , 'GPK_KSC' , 'DOMAIN_A', 'PI_0000000000022' , 'DOC_0000000000000000022' , null , '00' , 'PASystem' , '00' , 'SDNR' , '11223344' , false , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , 'abc' , '' , '' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000023', 'ETI:000000000000000000000000000000000023', '2018-01-29 15:55:23', null , null , '2018-01-29 15:55:23', null , '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000001' , 'GPK_KSC' , 'DOMAIN_A', 'PI_0000000000023' , 'DOC_0000000000000000023' , null , '00' , 'PASystem' , '00' , 'SDNR' , '11223344' , false , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , 'lnp' , '' , '' , '' , '' , '' , 'abc' , '' , '' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); -INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000024', 'ETI:000000000000000000000000000000000024', '2018-01-29 15:55:24', null , null , '2018-01-29 15:55:24', null , '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000001' , 'GPK_KSC' , 'DOMAIN_A', 'PI_0000000000024' , 'DOC_0000000000000000024' , null , '00' , 'PASystem' , '00' , 'SDNR' , '11223344' , false , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , 'abc' , '' , '' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); +INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000024', 'ETI:000000000000000000000000000000000024', '2018-01-29 15:55:24', null , null , '2018-01-29 15:55:24', null , '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000001' , 'GPK_KSC' , 'DOMAIN_A', 'PI_0000000000024' , 'DOC_0000000000000000024' , null , '00' , 'PASystem' , '00' , 'SDNR' , '11223344' , false , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , '' , null , '' , '' , '' , '' , 'abc' , '' , '' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); -- Tasks for WorkOnTaskAccTest INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000025', 'ETI:000000000000000000000000000000000025', '2018-01-29 15:55:24', null , null , '2018-01-29 15:55:24', '2018-01-29 15:55:24', '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000025' , 'DOC_0000000000000000025' , null , 'abcd00' , 'PASystem' , '00' , 'SDNR' , '98765432' , false , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , '' , '' , 'ert' , 'ert' , 'ert' , 'ert' , 'abc' , 'ert' , 'ert' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000026', 'ETI:000000000000000000000000000000000026', '2018-01-29 15:55:24', '2018-01-30 15:55:24', null , '2018-01-30 15:55:24', '2018-01-29 15:55:24', '2018-01-29 15:55:00', '2018-01-30 15:55:00', 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000026' , 'DOC_0000000000000000026' , 'user-1-1' , 'bcde00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , '' , 'abc' , '' , '' , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/SqlProviderUtil.java b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/SqlProviderUtil.java index 65afca526..2d28943ae 100644 --- a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/SqlProviderUtil.java +++ b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/SqlProviderUtil.java @@ -12,13 +12,22 @@ public class SqlProviderUtil { private SqlProviderUtil() {} public static StringBuilder whereIn(String collection, String column, StringBuilder sb) { - return sb.append("AND ") + .append(" != null'>AND (") + .append("") + .append("") .append(column) .append(" IN(#{item}) "); + .append("' separator=',' >#{item})") + .append("") + .append("0=1") + .append(""); + if (column.contains("t.CUSTOM_")) { + sb.append(" OR " + column + " IS NULL "); + } + return sb.append(") "); } public static StringBuilder whereIn(String collection, String column) { @@ -26,13 +35,24 @@ public class SqlProviderUtil { } public static StringBuilder whereNotIn(String collection, String column, StringBuilder sb) { - return sb.append("AND ") + .append(" != null'>AND (") + .append("") + .append("") .append(column) .append(" NOT IN(#{item}) "); + .append("' separator=',' >#{item})") + .append("") + .append("1=1") + .append(""); + if (column.contains("t.CUSTOM_")) { + sb.append(" AND " + column + " IS NOT NULL "); + sb.append(" OR " + column + " IS NULL "); + } + sb.append(") "); + return sb; } public static StringBuilder whereNotIn(String collection, String column) { diff --git a/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationImpl.java b/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationImpl.java index 33b5e2650..69ed9426c 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationImpl.java @@ -83,9 +83,6 @@ public class ClassificationImpl extends ClassificationSummaryImpl implements Cla @Override public void setCustomAttribute(ClassificationCustomField customField, String value) { - if (value == null) { - value = ""; - } switch (customField) { case CUSTOM_1: custom1 = value; diff --git a/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationSummaryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationSummaryImpl.java index 0833bf2b1..17c20210b 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationSummaryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/classification/internal/models/ClassificationSummaryImpl.java @@ -20,14 +20,14 @@ public class ClassificationSummaryImpl implements ClassificationSummary { protected int priority; protected String serviceLevel; // PddDThhHmmM protected String type; - protected String custom1 = ""; - protected String custom2 = ""; - protected String custom3 = ""; - protected String custom4 = ""; - protected String custom5 = ""; - protected String custom6 = ""; - protected String custom7 = ""; - protected String custom8 = ""; + protected String custom1; + protected String custom2; + protected String custom3; + protected String custom4; + protected String custom5; + protected String custom6; + protected String custom7; + protected String custom8; public ClassificationSummaryImpl() {} @@ -179,11 +179,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom1(String custom1) { - if (custom1 == null) { - this.custom1 = ""; - } else { - this.custom1 = custom1; - } + this.custom1 = custom1; } public String getCustom2() { @@ -191,11 +187,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom2(String custom2) { - if (custom2 == null) { - this.custom2 = ""; - } else { - this.custom2 = custom2; - } + this.custom2 = custom2; } public String getCustom3() { @@ -203,11 +195,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom3(String custom3) { - if (custom3 == null) { - this.custom3 = ""; - } else { - this.custom3 = custom3; - } + this.custom3 = custom3; } public String getCustom4() { @@ -215,11 +203,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom4(String custom4) { - if (custom4 == null) { - this.custom4 = ""; - } else { - this.custom4 = custom4; - } + this.custom4 = custom4; } public String getCustom5() { @@ -227,11 +211,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom5(String custom5) { - if (custom5 == null) { - this.custom5 = ""; - } else { - this.custom5 = custom5; - } + this.custom5 = custom5; } public String getCustom6() { @@ -239,11 +219,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom6(String custom6) { - if (custom6 == null) { - this.custom6 = ""; - } else { - this.custom6 = custom6; - } + this.custom6 = custom6; } public String getCustom7() { @@ -251,11 +227,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom7(String custom7) { - if (custom7 == null) { - this.custom7 = ""; - } else { - this.custom7 = custom7; - } + this.custom7 = custom7; } public String getCustom8() { @@ -263,11 +235,7 @@ public class ClassificationSummaryImpl implements ClassificationSummary { } public void setCustom8(String custom8) { - if (custom8 == null) { - this.custom8 = ""; - } else { - this.custom8 = custom8; - } + this.custom8 = custom8; } @Override diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java index 35c9ed8bf..8026cc7b7 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java @@ -89,9 +89,9 @@ public interface MonitorMapper { @Result(column = "STATE", property = "state") @Result(column = "COUNT", property = "count") List getTasksCountByState( - @Param("domains") List domains, - @Param("states") List states, - @Param("workbasketIds") List workbasketIds, + @Param("domains") String[] domains, + @Param("states") TaskState[] states, + @Param("workbasketIds") String[] workbasketIds, @Param("priorityMinimum") Integer priorityMinimum); @SelectProvider( diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java index 026f80cbb..9df942088 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java @@ -62,7 +62,7 @@ public class ClassificationReportBuilderImpl report.getRows().isEmpty() ? null : report.getRows().keySet().toArray(new String[0])) - .domainIn(domains != null ? domains.toArray(new String[0]) : null) + .domainIn(this.domains) .list() .stream() .collect( @@ -106,7 +106,7 @@ public class ClassificationReportBuilderImpl classificationService .createClassificationQuery() .keyIn(keys.length == 0 ? null : keys) - .domainIn(domains != null ? domains.toArray(new String[0]) : null) + .domainIn(this.domains) .list() .stream() .collect( diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TaskStatusReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TaskStatusReportBuilderImpl.java index ce810d2e1..d4692cc40 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TaskStatusReportBuilderImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TaskStatusReportBuilderImpl.java @@ -1,5 +1,6 @@ package pro.taskana.monitor.internal.reports; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -21,9 +22,9 @@ public class TaskStatusReportBuilderImpl implements TaskStatusReport.Builder { private final InternalTaskanaEngine taskanaEngine; private final MonitorMapper monitorMapper; private final WorkbasketService workbasketService; - private List domains; - private List states; - private List workbasketIds; + private String[] domains; + private TaskState[] states; + private String[] workbasketIds; private Integer priorityMinimum; public TaskStatusReportBuilderImpl( @@ -41,7 +42,8 @@ public class TaskStatusReportBuilderImpl implements TaskStatusReport.Builder { List tasks = this.monitorMapper.getTasksCountByState( this.domains, this.states, this.workbasketIds, this.priorityMinimum); - TaskStatusReport report = new TaskStatusReport(this.states); + TaskStatusReport report = + new TaskStatusReport(this.states != null ? Arrays.asList(this.states) : null); report.addItems(tasks); Map displayMap = taskanaEngine @@ -51,7 +53,7 @@ public class TaskStatusReportBuilderImpl implements TaskStatusReport.Builder { workbasketService .createWorkbasketQuery() .keyIn(report.getRows().keySet().toArray(new String[0])) - .domainIn(domains != null ? domains.toArray(new String[0]) : null) + .domainIn(domains) .list() .stream() .collect( @@ -68,7 +70,9 @@ public class TaskStatusReportBuilderImpl implements TaskStatusReport.Builder { @Override public TaskStatusReportBuilderImpl stateIn(List states) { - this.states = states; + if (states != null) { + this.states = states.toArray(new TaskState[0]); + } return this; } @@ -80,13 +84,17 @@ public class TaskStatusReportBuilderImpl implements TaskStatusReport.Builder { @Override public TaskStatusReportBuilderImpl domainIn(List domains) { - this.domains = domains; + if (domains != null) { + this.domains = domains.toArray(new String[0]); + } return this; } @Override public Builder workbasketIdsIn(List workbasketIds) { - this.workbasketIds = workbasketIds; + if (workbasketIds != null) { + this.workbasketIds = workbasketIds.toArray(new String[0]); + } return this; } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java index 70ac301ed..293503ba0 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java @@ -1,7 +1,6 @@ package pro.taskana.monitor.internal.reports; import java.time.Instant; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -41,12 +40,12 @@ abstract class TimeIntervalReportBuilderImpl< protected MonitorMapper monitorMapper; protected List columnHeaders; protected boolean inWorkingDays; - protected List workbasketIds; - protected List states; - protected List classificationCategories; - protected List domains; - protected List classificationIds; - protected List excludedClassificationIds; + protected String[] workbasketIds; + protected TaskState[] states; + protected String[] classificationCategories; + protected String[] domains; + protected String[] classificationIds; + protected String[] excludedClassificationIds; protected WorkingDaysToDaysConverter converter; private String[] custom1In; private String[] custom1NotIn; @@ -118,37 +117,49 @@ abstract class TimeIntervalReportBuilderImpl< @Override public B workbasketIdIn(List workbasketIds) { - this.workbasketIds = new ArrayList<>(workbasketIds); + if (workbasketIds != null) { + this.workbasketIds = workbasketIds.toArray(new String[0]); + } return _this(); } @Override public B stateIn(List states) { - this.states = new ArrayList<>(states); + if (states != null) { + this.states = states.toArray(new TaskState[0]); + } return _this(); } @Override public B classificationCategoryIn(List classificationCategories) { - this.classificationCategories = new ArrayList<>(classificationCategories); + if (classificationCategories != null) { + this.classificationCategories = classificationCategories.toArray(new String[0]); + } return _this(); } @Override public B classificationIdIn(List classificationIds) { - this.classificationIds = new ArrayList<>(classificationIds); + if (classificationIds != null) { + this.classificationIds = classificationIds.toArray(new String[0]); + } return _this(); } @Override public B excludedClassificationIdIn(List excludedClassificationIds) { - this.excludedClassificationIds = new ArrayList<>(excludedClassificationIds); + if (excludedClassificationIds != null) { + this.excludedClassificationIds = excludedClassificationIds.toArray(new String[0]); + } return _this(); } @Override public B domainIn(List domains) { - this.domains = new ArrayList<>(domains); + if (domains != null) { + this.domains = domains.toArray(new String[0]); + } return _this(); } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketPriorityReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketPriorityReportBuilderImpl.java index 4a864b394..b9fe7b981 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketPriorityReportBuilderImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketPriorityReportBuilderImpl.java @@ -1,6 +1,5 @@ package pro.taskana.monitor.internal.reports; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -25,12 +24,12 @@ public class WorkbasketPriorityReportBuilderImpl implements WorkbasketPriorityRe private final MonitorMapper monitorMapper; protected List columnHeaders; protected boolean inWorkingDays; - protected List workbasketIds; - protected List states; - protected List classificationCategories; - protected List domains; - protected List classificationIds; - protected List excludedClassificationIds; + protected String[] workbasketIds; + protected TaskState[] states; + protected String[] classificationCategories; + protected String[] domains; + protected String[] classificationIds; + protected String[] excludedClassificationIds; protected WorkingDaysToDaysConverter converter; private WorkbasketType[] workbasketTypes; private String[] custom1In; @@ -121,37 +120,49 @@ public class WorkbasketPriorityReportBuilderImpl implements WorkbasketPriorityRe @Override public Builder workbasketIdIn(List workbasketIds) { - this.workbasketIds = new ArrayList<>(workbasketIds); + if (workbasketIds != null) { + this.workbasketIds = workbasketIds.toArray(new String[0]); + } return this; } @Override public Builder stateIn(List states) { - this.states = new ArrayList<>(states); + if (states != null) { + this.states = states.toArray(new TaskState[0]); + } return this; } @Override public Builder classificationCategoryIn(List classificationCategories) { - this.classificationCategories = new ArrayList<>(classificationCategories); + if (classificationCategories != null) { + this.classificationCategories = classificationCategories.toArray(new String[0]); + } return this; } @Override public Builder classificationIdIn(List classificationIds) { - this.classificationIds = new ArrayList<>(classificationIds); + if (classificationIds != null) { + this.classificationIds = classificationIds.toArray(new String[0]); + } return this; } @Override public Builder excludedClassificationIdIn(List excludedClassificationIds) { - this.excludedClassificationIds = new ArrayList<>(excludedClassificationIds); + if (excludedClassificationIds != null) { + this.excludedClassificationIds = excludedClassificationIds.toArray(new String[0]); + } return this; } @Override public Builder domainIn(List domains) { - this.domains = new ArrayList<>(domains); + if (domains != null) { + this.domains = domains.toArray(new String[0]); + } return this; } diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java index db24b1cf4..ff36c1170 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java @@ -60,7 +60,7 @@ public class WorkbasketReportBuilderImpl workbasketService .createWorkbasketQuery() .keyIn(report.getRows().keySet().toArray(new String[0])) - .domainIn(domains != null ? domains.toArray(new String[0]) : null) + .domainIn(domains) .list() .stream() .collect( diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java index 54c9b7b33..097131bde 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java @@ -257,67 +257,99 @@ public class TaskQueryImpl implements TaskQuery { // endregion // region customAttributes private String[] custom1In; + private boolean custom1InContainsNull; private String[] custom1NotIn; + private boolean custom1NotInContainsNull; private String[] custom1Like; private String[] custom1NotLike; private String[] custom2In; + private boolean custom2InContainsNull; private String[] custom2NotIn; + private boolean custom2NotInContainsNull; private String[] custom2Like; private String[] custom2NotLike; private String[] custom3In; + private boolean custom3InContainsNull; private String[] custom3NotIn; + private boolean custom3NotInContainsNull; private String[] custom3Like; private String[] custom3NotLike; private String[] custom4In; + private boolean custom4InContainsNull; private String[] custom4NotIn; + private boolean custom4NotInContainsNull; private String[] custom4Like; private String[] custom4NotLike; private String[] custom5In; + private boolean custom5InContainsNull; private String[] custom5NotIn; + private boolean custom5NotInContainsNull; private String[] custom5Like; private String[] custom5NotLike; private String[] custom6In; + private boolean custom6InContainsNull; private String[] custom6NotIn; + private boolean custom6NotInContainsNull; private String[] custom6Like; private String[] custom6NotLike; private String[] custom7In; + private boolean custom7InContainsNull; private String[] custom7NotIn; + private boolean custom7NotInContainsNull; private String[] custom7Like; private String[] custom7NotLike; private String[] custom8In; + private boolean custom8InContainsNull; private String[] custom8NotIn; + private boolean custom8NotInContainsNull; private String[] custom8Like; private String[] custom8NotLike; private String[] custom9In; + private boolean custom9InContainsNull; private String[] custom9NotIn; + private boolean custom9NotInContainsNull; private String[] custom9Like; private String[] custom9NotLike; private String[] custom10In; + private boolean custom10InContainsNull; private String[] custom10NotIn; + private boolean custom10NotInContainsNull; private String[] custom10Like; private String[] custom10NotLike; private String[] custom11In; + private boolean custom11InContainsNull; private String[] custom11NotIn; + private boolean custom11NotInContainsNull; private String[] custom11Like; private String[] custom11NotLike; private String[] custom12In; + private boolean custom12InContainsNull; private String[] custom12NotIn; + private boolean custom12NotInContainsNull; private String[] custom12Like; private String[] custom12NotLike; private String[] custom13In; + private boolean custom13InContainsNull; private String[] custom13NotIn; + private boolean custom13NotInContainsNull; private String[] custom13Like; private String[] custom13NotLike; private String[] custom14In; + private boolean custom14InContainsNull; private String[] custom14NotIn; + private boolean custom14NotInContainsNull; private String[] custom14Like; private String[] custom14NotLike; private String[] custom15In; + private boolean custom15InContainsNull; private String[] custom15NotIn; + private boolean custom15NotInContainsNull; private String[] custom15Like; private String[] custom15NotLike; private String[] custom16In; + private boolean custom16InContainsNull; private String[] custom16NotIn; + private boolean custom16NotInContainsNull; private String[] custom16Like; private String[] custom16NotLike; // endregion @@ -1363,54 +1395,109 @@ public class TaskQueryImpl implements TaskQuery { throw new InvalidArgumentException( "At least one string has to be provided as a search parameter"); } + + List conditionList = new ArrayList<>(Arrays.asList(strings)); + boolean containsNull = conditionList.contains(null); + if (containsNull) { + conditionList.remove(null); + } + switch (customField) { case CUSTOM_1: - this.custom1In = strings; + this.custom1In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom1InContainsNull = true; + } break; case CUSTOM_2: - this.custom2In = strings; + this.custom2In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom2InContainsNull = true; + } break; case CUSTOM_3: - this.custom3In = strings; + this.custom3In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom3InContainsNull = true; + } break; case CUSTOM_4: - this.custom4In = strings; + this.custom4In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom4InContainsNull = true; + } break; case CUSTOM_5: - this.custom5In = strings; + this.custom5In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom5InContainsNull = true; + } break; case CUSTOM_6: - this.custom6In = strings; + this.custom6In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom6InContainsNull = true; + } break; case CUSTOM_7: - this.custom7In = strings; + this.custom7In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom7InContainsNull = true; + } break; case CUSTOM_8: - this.custom8In = strings; + this.custom8In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom8InContainsNull = true; + } break; case CUSTOM_9: - this.custom9In = strings; + this.custom9In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom9InContainsNull = true; + } break; case CUSTOM_10: - this.custom10In = strings; + this.custom10In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom10InContainsNull = true; + } break; case CUSTOM_11: - this.custom11In = strings; + this.custom11In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom11InContainsNull = true; + } break; case CUSTOM_12: - this.custom12In = strings; + this.custom12In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom12InContainsNull = true; + } break; case CUSTOM_13: - this.custom13In = strings; + this.custom13In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom13InContainsNull = true; + } break; case CUSTOM_14: - this.custom14In = strings; + this.custom14In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom14InContainsNull = true; + } break; case CUSTOM_15: - this.custom15In = strings; + this.custom15In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom15InContainsNull = true; + } break; case CUSTOM_16: - this.custom16In = strings; + this.custom16In = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom16InContainsNull = true; + } break; default: throw new SystemException("Unknown custom attribute '" + customField + "'"); @@ -1426,54 +1513,107 @@ public class TaskQueryImpl implements TaskQuery { throw new InvalidArgumentException( "At least one string has to be provided as a search parameter"); } + List conditionList = new ArrayList<>(Arrays.asList(strings)); + boolean containsNull = conditionList.contains(null); + if (containsNull) { + conditionList.remove(null); + } switch (customField) { case CUSTOM_1: - this.custom1NotIn = strings; + this.custom1NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom1NotInContainsNull = true; + } break; case CUSTOM_2: - this.custom2NotIn = strings; + this.custom2NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom2NotInContainsNull = true; + } break; case CUSTOM_3: - this.custom3NotIn = strings; + this.custom3NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom3NotInContainsNull = true; + } break; case CUSTOM_4: - this.custom4NotIn = strings; + this.custom4NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom4NotInContainsNull = true; + } break; case CUSTOM_5: - this.custom5NotIn = strings; + this.custom5NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom5NotInContainsNull = true; + } break; case CUSTOM_6: - this.custom6NotIn = strings; + this.custom6NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom6NotInContainsNull = true; + } break; case CUSTOM_7: - this.custom7NotIn = strings; + this.custom7NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom7NotInContainsNull = true; + } break; case CUSTOM_8: - this.custom8NotIn = strings; + this.custom8NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom8NotInContainsNull = true; + } break; case CUSTOM_9: - this.custom9NotIn = strings; + this.custom9NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom9NotInContainsNull = true; + } break; case CUSTOM_10: - this.custom10NotIn = strings; + this.custom10NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom10NotInContainsNull = true; + } break; case CUSTOM_11: - this.custom11NotIn = strings; + this.custom11NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom11NotInContainsNull = true; + } break; case CUSTOM_12: - this.custom12NotIn = strings; + this.custom12NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom12NotInContainsNull = true; + } break; case CUSTOM_13: - this.custom13NotIn = strings; + this.custom13NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom13NotInContainsNull = true; + } break; case CUSTOM_14: - this.custom14NotIn = strings; + this.custom14NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom14NotInContainsNull = true; + } break; case CUSTOM_15: - this.custom15NotIn = strings; + this.custom15NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom15NotInContainsNull = true; + } break; case CUSTOM_16: - this.custom16NotIn = strings; + this.custom16NotIn = conditionList.toArray(new String[0]); + if (containsNull) { + this.custom16NotInContainsNull = true; + } break; default: throw new SystemException("Unknown custom attribute '" + customField + "'"); diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskImpl.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskImpl.java index b8b980859..8de0de3b7 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskImpl.java @@ -110,9 +110,6 @@ public class TaskImpl extends TaskSummaryImpl implements Task { @Override public void setCustomAttribute(TaskCustomField customField, String value) { - if (value == null) { - value = ""; - } switch (customField) { case CUSTOM_1: custom1 = value; diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskSummaryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskSummaryImpl.java index 56335f941..886c57454 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskSummaryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/models/TaskSummaryImpl.java @@ -46,22 +46,22 @@ public class TaskSummaryImpl implements TaskSummary { protected boolean isTransferred; // All objects have to be serializable protected List attachmentSummaries = new ArrayList<>(); - protected String custom1 = ""; - protected String custom2 = ""; - protected String custom3 = ""; - protected String custom4 = ""; - protected String custom5 = ""; - protected String custom6 = ""; - protected String custom7 = ""; - protected String custom8 = ""; - protected String custom9 = ""; - protected String custom10 = ""; - protected String custom11 = ""; - protected String custom12 = ""; - protected String custom13 = ""; - protected String custom14 = ""; - protected String custom15 = ""; - protected String custom16 = ""; + protected String custom1; + protected String custom2; + protected String custom3; + protected String custom4; + protected String custom5; + protected String custom6; + protected String custom7; + protected String custom8; + protected String custom9; + protected String custom10; + protected String custom11; + protected String custom12; + protected String custom13; + protected String custom14; + protected String custom15; + protected String custom16; public TaskSummaryImpl() {} @@ -422,11 +422,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom1(String custom1) { - if (custom1 == null) { - this.custom1 = ""; - } else { - this.custom1 = custom1; - } + this.custom1 = custom1; } public String getCustom2() { @@ -435,11 +431,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom2(String custom2) { - if (custom2 == null) { - this.custom2 = ""; - } else { - this.custom2 = custom2; - } + this.custom2 = custom2; } public String getCustom3() { @@ -448,11 +440,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom3(String custom3) { - if (custom3 == null) { - this.custom3 = ""; - } else { - this.custom3 = custom3; - } + this.custom3 = custom3; } public String getCustom4() { @@ -461,11 +449,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom4(String custom4) { - if (custom4 == null) { - this.custom4 = ""; - } else { - this.custom4 = custom4; - } + this.custom4 = custom4; } public String getCustom5() { @@ -474,11 +458,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom5(String custom5) { - if (custom5 == null) { - this.custom5 = ""; - } else { - this.custom5 = custom5; - } + this.custom5 = custom5; } public String getCustom6() { @@ -487,11 +467,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom6(String custom6) { - if (custom6 == null) { - this.custom6 = ""; - } else { - this.custom6 = custom6; - } + this.custom6 = custom6; } public String getCustom7() { @@ -500,11 +476,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom7(String custom7) { - if (custom7 == null) { - this.custom7 = ""; - } else { - this.custom7 = custom7; - } + this.custom7 = custom7; } public String getCustom8() { @@ -513,11 +485,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom8(String custom8) { - if (custom8 == null) { - this.custom8 = ""; - } else { - this.custom8 = custom8; - } + this.custom8 = custom8; } public String getCustom9() { @@ -526,11 +494,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom9(String custom9) { - if (custom9 == null) { - this.custom9 = ""; - } else { - this.custom9 = custom9; - } + this.custom9 = custom9; } public String getCustom10() { @@ -539,11 +503,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom10(String custom10) { - if (custom10 == null) { - this.custom10 = ""; - } else { - this.custom10 = custom10; - } + this.custom10 = custom10; } public String getCustom11() { @@ -552,11 +512,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom11(String custom11) { - if (custom11 == null) { - this.custom11 = ""; - } else { - this.custom11 = custom11; - } + this.custom11 = custom11; } public String getCustom12() { @@ -565,11 +521,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom12(String custom12) { - if (custom12 == null) { - this.custom12 = ""; - } else { - this.custom12 = custom12; - } + this.custom12 = custom12; } public String getCustom13() { @@ -578,11 +530,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom13(String custom13) { - if (custom13 == null) { - this.custom13 = ""; - } else { - this.custom13 = custom13; - } + this.custom13 = custom13; } public String getCustom14() { @@ -591,11 +539,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom14(String custom14) { - if (custom14 == null) { - this.custom14 = ""; - } else { - this.custom14 = custom14; - } + this.custom14 = custom14; } public String getCustom15() { @@ -604,11 +548,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom15(String custom15) { - if (custom15 == null) { - this.custom15 = ""; - } else { - this.custom15 = custom15; - } + this.custom15 = custom15; } public String getCustom16() { @@ -617,11 +557,7 @@ public class TaskSummaryImpl implements TaskSummary { // auxiliary Method needed by Mybatis public void setCustom16(String custom16) { - if (custom16 == null) { - this.custom16 = ""; - } else { - this.custom16 = custom16; - } + this.custom16 = custom16; } protected boolean canEqual(Object other) { diff --git a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketImpl.java b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketImpl.java index feef9cc64..ce50573e4 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketImpl.java @@ -26,9 +26,6 @@ public class WorkbasketImpl extends WorkbasketSummaryImpl implements Workbasket @Override public void setCustomAttribute(WorkbasketCustomField customField, String value) { - if (value == null) { - value = ""; - } switch (customField) { case CUSTOM_1: custom1 = value; diff --git a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketSummaryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketSummaryImpl.java index 4aa89e341..818785507 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketSummaryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/models/WorkbasketSummaryImpl.java @@ -17,10 +17,10 @@ public class WorkbasketSummaryImpl implements WorkbasketSummary { protected String owner; protected String domain; protected WorkbasketType type; - protected String custom1 = ""; - protected String custom2 = ""; - protected String custom3 = ""; - protected String custom4 = ""; + protected String custom1; + protected String custom2; + protected String custom3; + protected String custom4; protected String orgLevel1; protected String orgLevel2; protected String orgLevel3; @@ -130,11 +130,7 @@ public class WorkbasketSummaryImpl implements WorkbasketSummary { } public void setCustom1(String custom1) { - if (custom1 == null) { - this.custom1 = ""; - } else { - this.custom1 = custom1; - } + this.custom1 = custom1; } public String getCustom2() { @@ -142,11 +138,7 @@ public class WorkbasketSummaryImpl implements WorkbasketSummary { } public void setCustom2(String custom2) { - if (custom2 == null) { - this.custom2 = ""; - } else { - this.custom2 = custom2; - } + this.custom2 = custom2; } public String getCustom3() { @@ -154,11 +146,7 @@ public class WorkbasketSummaryImpl implements WorkbasketSummary { } public void setCustom3(String custom3) { - if (custom3 == null) { - this.custom3 = ""; - } else { - this.custom3 = custom3; - } + this.custom3 = custom3; } public String getCustom4() { @@ -166,11 +154,7 @@ public class WorkbasketSummaryImpl implements WorkbasketSummary { } public void setCustom4(String custom4) { - if (custom4 == null) { - this.custom4 = ""; - } else { - this.custom4 = custom4; - } + this.custom4 = custom4; } @Override diff --git a/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java b/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java index df852a708..cfedca2fa 100644 --- a/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java @@ -4,14 +4,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import acceptance.AbstractAccTest; -import java.util.Arrays; -import org.assertj.core.api.SoftAssertions; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; -import pro.taskana.classification.api.ClassificationCustomField; import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.exceptions.ClassificationAlreadyExistException; import pro.taskana.classification.api.exceptions.MalformedServiceLevelException; @@ -55,48 +52,6 @@ class CreateClassificationAccTest extends AbstractAccTest { assertThat(classification.getId()).startsWith(IdGenerator.ID_PREFIX_CLASSIFICATION); } - @WithAccessId(user = "businessadmin") - @Test - void should_InitializeCustomFieldsToEmptyString_When_ClassificationIsCreated() throws Exception { - Classification classification = CLASSIFICATION_SERVICE.newClassification("Key01", "", "TASK"); - classification.setIsValidInDomain(true); - classification.setServiceLevel("P1D"); - Classification createdClassification = - CLASSIFICATION_SERVICE.createClassification(classification); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(ClassificationCustomField.values()) - .forEach( - customField -> - softly - .assertThat(createdClassification.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - - @WithAccessId(user = "businessadmin") - @Test - void should_SetCustomFieldToEmptyString_When_SetToNullByUser() throws Exception { - Classification classification = CLASSIFICATION_SERVICE.newClassification("Key02", "", "TASK"); - classification.setIsValidInDomain(true); - classification.setServiceLevel("P1D"); - Arrays.stream(ClassificationCustomField.values()) - .forEach(customField -> classification.setCustomAttribute(customField, null)); - Classification createdClassification = - CLASSIFICATION_SERVICE.createClassification(classification); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(ClassificationCustomField.values()) - .forEach( - customField -> - softly - .assertThat(createdClassification.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - @WithAccessId(user = "businessadmin") @Test void testCreateClassificationWithMasterCopy() throws Exception { diff --git a/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java b/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java index 81f56fd65..4bbfbdb93 100644 --- a/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java @@ -7,9 +7,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import acceptance.AbstractAccTest; import java.time.Duration; import java.time.Instant; -import java.util.Arrays; import java.util.List; -import org.assertj.core.api.SoftAssertions; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; @@ -76,26 +74,6 @@ class UpdateClassificationAccTest extends AbstractAccTest { assertThat(modifiedBefore).isBefore(updatedClassification.getModified()); } - @WithAccessId(user = "businessadmin") - @Test - void should_SetCustomAttributeToEmptyString_When_SetToNullDuringUpdate() throws Exception { - Classification classification = classificationService.getClassification("T2100", "DOMAIN_A"); - Arrays.stream(ClassificationCustomField.values()) - .forEach(customField -> classification.setCustomAttribute(customField, null)); - Classification updatedClassification = - classificationService.updateClassification(classification); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(ClassificationCustomField.values()) - .forEach( - customField -> - softly - .assertThat(updatedClassification.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - @Test void should_ThrowException_When_UserIsNotAuthorized() throws Exception { Classification classification = classificationService.getClassification("T2100", "DOMAIN_A"); diff --git a/lib/taskana-core/src/test/java/acceptance/task/CreateTaskAccTest.java b/lib/taskana-core/src/test/java/acceptance/task/CreateTaskAccTest.java index 5ffb02066..1b37a385d 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/CreateTaskAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/task/CreateTaskAccTest.java @@ -8,7 +8,6 @@ import acceptance.TaskTestMapper; import acceptance.TaskanaEngineProxy; import java.time.Duration; import java.time.Instant; -import java.util.Arrays; import java.util.Map; import java.util.Set; import java.util.function.Consumer; @@ -16,7 +15,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; -import org.assertj.core.api.SoftAssertions; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; @@ -576,52 +574,6 @@ class CreateTaskAccTest extends AbstractAccTest { assertThat(createdTask.getName()).isEqualTo("Test Name"); } - @WithAccessId(user = "user-1-1") - @Test - void should_SetCustomFieldToEmptyString_When_SetToNullByUser() throws Exception { - - Task newTask = taskService.newTask("USER-1-1", "DOMAIN_A"); - newTask.setClassificationKey("T2100"); - newTask.setPrimaryObjRef( - createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567")); - newTask.setName("Test Name"); - Arrays.stream(TaskCustomField.values()) - .forEach(customField -> newTask.setCustomAttribute(customField, null)); - Task createdTask = taskService.createTask(newTask); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(TaskCustomField.values()) - .forEach( - customField -> - softly - .assertThat(createdTask.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - - @WithAccessId(user = "user-1-1") - @Test - void should_InitializeCustomFieldsToEmptyString_When_TaskIsCreated() throws Exception { - - Task newTask = taskService.newTask("USER-1-1", "DOMAIN_A"); - newTask.setClassificationKey("T2100"); - newTask.setPrimaryObjRef( - createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567")); - newTask.setName("Test Name"); - Task createdTask = taskService.createTask(newTask); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(TaskCustomField.values()) - .forEach( - customField -> - softly - .assertThat(createdTask.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - @WithAccessId(user = "user-1-1") @Test void testUseClassificationMetadataFromCorrectDomainForNewTask() throws Exception { diff --git a/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java b/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java index 655310321..e13b31d96 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java @@ -343,6 +343,102 @@ class QueryTasksAccTest extends AbstractAccTest { assertThat(results).isEqualTo(expectedCount); } + @WithAccessId(user = "admin") + @Test + void should_ReturnTasksWithEmptyCustomField_When_QueriedByCustomFieldWhichIsNull() + throws InvalidArgumentException { + List results = + taskService + .createTaskQuery() + .customAttributeIn(TaskCustomField.CUSTOM_9, new String[] {null}) + .list(); + assertThat(results).hasSize(1); + + results = + taskService + .createTaskQuery() + .customAttributeIn(TaskCustomField.CUSTOM_9, null, "custom9") + .list(); + assertThat(results).hasSize(2); + + results = + taskService + .createTaskQuery() + .customAttributeIn(TaskCustomField.CUSTOM_9, new String[] {null}) + .customAttributeIn(TaskCustomField.CUSTOM_14, "abc") + .list(); + assertThat(results).hasSize(1); + } + + @WithAccessId(user = "admin") + @Test + void should_ReturnTasksWithNullCustomField_When_QueriedByCustomFieldWhichIsEmpty() + throws InvalidArgumentException { + List results = + taskService.createTaskQuery().customAttributeIn(TaskCustomField.CUSTOM_9, "").list(); + assertThat(results).hasSize(86); + } + + @WithAccessId(user = "admin") + @Test + void should_AllowToQueryTasksByCustomFieldWithNullAndEmptyInParallel() + throws InvalidArgumentException { + List results = + taskService + .createTaskQuery() + .customAttributeIn(TaskCustomField.CUSTOM_9, "", null) + .list(); + assertThat(results).hasSize(87); + } + + @WithAccessId(user = "admin") + @Test + void should_ReturnTasksWithEmptyCustomField_When_QueriedByCustomFieldWhichIsNotNull() + throws InvalidArgumentException { + List results = + taskService + .createTaskQuery() + .customAttributeNotIn(TaskCustomField.CUSTOM_9, new String[] {null}) + .list(); + assertThat(results).hasSize(87); + + results = + taskService + .createTaskQuery() + .customAttributeNotIn(TaskCustomField.CUSTOM_9, null, "custom9") + .list(); + assertThat(results).hasSize(86); + + results = + taskService + .createTaskQuery() + .customAttributeNotIn(TaskCustomField.CUSTOM_9, new String[] {null}) + .customAttributeNotIn(TaskCustomField.CUSTOM_10, "custom10") + .list(); + assertThat(results).hasSize(86); + } + + @WithAccessId(user = "admin") + @Test + void should_ReturnTasksWithNullCustomField_When_QueriedByCustomFieldWhichIsNotEmpty() + throws InvalidArgumentException { + List results = + taskService.createTaskQuery().customAttributeNotIn(TaskCustomField.CUSTOM_9, "").list(); + assertThat(results).hasSize(2); + } + + @WithAccessId(user = "admin") + @Test + void should_AllowToQueryTasksByCustomFieldWithNeitherNullOrEmptyInParallel() + throws InvalidArgumentException { + List results = + taskService + .createTaskQuery() + .customAttributeNotIn(TaskCustomField.CUSTOM_9, "", null) + .list(); + assertThat(results).hasSize(1); + } + @WithAccessId(user = "admin") @Test void should_ThrowException_When_SearchArgumentInLikeQueryIsNotGiven() { diff --git a/lib/taskana-core/src/test/java/acceptance/task/UpdateTaskAccTest.java b/lib/taskana-core/src/test/java/acceptance/task/UpdateTaskAccTest.java index df3c493b6..f418a3a88 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/UpdateTaskAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/task/UpdateTaskAccTest.java @@ -15,11 +15,9 @@ import static pro.taskana.task.api.TaskCustomField.CUSTOM_7; import acceptance.AbstractAccTest; import java.time.Instant; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.assertj.core.api.SoftAssertions; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; @@ -245,25 +243,6 @@ class UpdateTaskAccTest extends AbstractAccTest { assertThat(updatedTask).isNotNull(); } - @WithAccessId(user = "user-1-1") - @Test - void should_SetCustomAttributeToEmptyString_When_SetToNullDuringUpdate() throws Exception { - Task task = taskService.getTask("TKI:000000000000000000000000000000000000"); - Arrays.stream(TaskCustomField.values()) - .forEach(customField -> task.setCustomAttribute(customField, null)); - Task updatedTask = taskService.updateTask(task); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(TaskCustomField.values()) - .forEach( - customField -> - softly - .assertThat(updatedTask.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - @WithAccessId(user = "user-1-1") @Test void should_ThrowException_When_ModificationOfWorkbasketKeyIsAttempted() throws Exception { @@ -317,7 +296,7 @@ class UpdateTaskAccTest extends AbstractAccTest { assertThat(task.getCustomAttribute(CUSTOM_3)).isEqualTo("This is modifiedValue 3"); assertThat(task.getCustomAttribute(CUSTOM_7)).isEqualTo("This is modifiedValue 7"); assertThat(task.getCustomAttribute(CUSTOM_16)).isEqualTo("This is modifiedValue 16"); - assertThat(task.getCustomAttribute(CUSTOM_14)).isEmpty(); + assertThat(task.getCustomAttribute(CUSTOM_14)).isNull(); } } @@ -345,7 +324,7 @@ class UpdateTaskAccTest extends AbstractAccTest { assertThat(task.getCustomAttribute(CUSTOM_10)).isEqualTo("This is modifiedValue 10"); assertThat(task.getCustomAttribute(CUSTOM_12)).isEqualTo("This is modifiedValue 12"); assertThat(task.getCustomAttribute(CUSTOM_2)).isNotNull(); - assertThat(task.getCustomAttribute(CUSTOM_16)).isEmpty(); + assertThat(task.getCustomAttribute(CUSTOM_16)).isNull(); } } diff --git a/lib/taskana-core/src/test/java/acceptance/workbasket/CreateWorkbasketAccTest.java b/lib/taskana-core/src/test/java/acceptance/workbasket/CreateWorkbasketAccTest.java index 65e83aa03..1f686c389 100644 --- a/lib/taskana-core/src/test/java/acceptance/workbasket/CreateWorkbasketAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/workbasket/CreateWorkbasketAccTest.java @@ -4,9 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import acceptance.AbstractAccTest; -import java.util.Arrays; import java.util.List; -import org.assertj.core.api.SoftAssertions; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; @@ -17,7 +15,6 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.WithAccessId; -import pro.taskana.workbasket.api.WorkbasketCustomField; import pro.taskana.workbasket.api.WorkbasketPermission; import pro.taskana.workbasket.api.WorkbasketService; import pro.taskana.workbasket.api.WorkbasketType; @@ -102,56 +99,6 @@ class CreateWorkbasketAccTest extends AbstractAccTest { assertThatThrownBy(call).isInstanceOf(DomainNotFoundException.class); } - @WithAccessId(user = "businessadmin") - @Test - void should_InitializeCustomFieldsToEmptyString_When_WorkbasketIsCreated() - throws InvalidArgumentException, WorkbasketAlreadyExistException, DomainNotFoundException, - NotAuthorizedException { - WorkbasketService workbasketService = taskanaEngine.getWorkbasketService(); - - Workbasket workbasket = workbasketService.newWorkbasket("GPK_NULL1", "DOMAIN_A"); - workbasket.setName("Megabasket"); - workbasket.setType(WorkbasketType.GROUP); - workbasket.setOrgLevel1("company"); - Workbasket createdWorkbasket = workbasketService.createWorkbasket(workbasket); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(WorkbasketCustomField.values()) - .forEach( - customField -> - softly - .assertThat(createdWorkbasket.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - - @WithAccessId(user = "businessadmin") - @Test - void should_SetCustomFieldToEmptyString_When_SetToNullByUser() - throws InvalidArgumentException, WorkbasketAlreadyExistException, DomainNotFoundException, - NotAuthorizedException { - WorkbasketService workbasketService = taskanaEngine.getWorkbasketService(); - - Workbasket workbasket = workbasketService.newWorkbasket("GPK_NULL2", "DOMAIN_A"); - workbasket.setName("Megabasket"); - workbasket.setType(WorkbasketType.GROUP); - workbasket.setOrgLevel1("company"); - Arrays.stream(WorkbasketCustomField.values()) - .forEach(customField -> workbasket.setCustomAttribute(customField, null)); - Workbasket createdWorkbasket = workbasketService.createWorkbasket(workbasket); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(WorkbasketCustomField.values()) - .forEach( - customField -> - softly - .assertThat(createdWorkbasket.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - @WithAccessId(user = "businessadmin") @Test void testCreateWorkbasketWithMissingRequiredField() { diff --git a/lib/taskana-core/src/test/java/acceptance/workbasket/UpdateWorkbasketAccTest.java b/lib/taskana-core/src/test/java/acceptance/workbasket/UpdateWorkbasketAccTest.java index b51921a70..041e4d291 100644 --- a/lib/taskana-core/src/test/java/acceptance/workbasket/UpdateWorkbasketAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/workbasket/UpdateWorkbasketAccTest.java @@ -7,8 +7,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import acceptance.AbstractAccTest; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.Arrays; -import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; @@ -60,28 +58,6 @@ class UpdateWorkbasketAccTest extends AbstractAccTest { assertThat(updatedWorkbasket.getModified()).isNotEqualTo(modified); } - @WithAccessId(user = "businessadmin") - @Test - void should_SetCustomAttributeToEmptyString_When_SetToNullDuringUpdate() throws Exception { - WorkbasketService workbasketService = taskanaEngine.getWorkbasketService(); - Workbasket workbasket = workbasketService.getWorkbasket("GPK_KSC", "DOMAIN_A"); - Arrays.stream(WorkbasketCustomField.values()) - .forEach(customField -> workbasket.setCustomAttribute(customField, null)); - workbasketService.updateWorkbasket(workbasket); - - Workbasket updatedWorkbasket = workbasketService.getWorkbasket("GPK_KSC", "DOMAIN_A"); - - SoftAssertions softly = new SoftAssertions(); - Arrays.stream(WorkbasketCustomField.values()) - .forEach( - customField -> - softly - .assertThat(updatedWorkbasket.getCustomAttribute(customField)) - .describedAs("CustomField was null: " + customField) - .isNotNull()); - softly.assertAll(); - } - @WithAccessId(user = "businessadmin") @Test void should_ThrowException_When_UpdatingWorkbasketWithInvalidName() throws Exception { diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/monitor/rest/MonitorController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/monitor/rest/MonitorController.java index be7a1aa04..6e156a622 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/monitor/rest/MonitorController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/monitor/rest/MonitorController.java @@ -21,6 +21,7 @@ import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.ClassificationCategoryReport; import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.TaskCustomFieldValueReport; +import pro.taskana.monitor.api.reports.TaskStatusReport; import pro.taskana.monitor.api.reports.TimestampReport; import pro.taskana.monitor.api.reports.WorkbasketPriorityReport; import pro.taskana.monitor.api.reports.WorkbasketReport; @@ -298,19 +299,23 @@ public class MonitorController { @RequestParam(name = "priority-minimum", required = false) Integer priorityMinimum) throws NotAuthorizedException { + TaskStatusReport.Builder builder = monitorService.createTaskStatusReportBuilder(); + if (states != null && !states.isEmpty()) { + builder = builder.stateIn(states); + } + if (domains != null && !domains.isEmpty()) { + builder.domainIn(domains); + } + if (workbasketIds != null && !workbasketIds.isEmpty()) { + builder.workbasketIdsIn(workbasketIds); + } + if (priorityMinimum != null) { + builder.priorityMinimum(priorityMinimum); + } + return ResponseEntity.ok( reportRepresentationModelAssembler.toModel( - monitorService - .createTaskStatusReportBuilder() - .stateIn(states) - .domainIn(domains) - .workbasketIdsIn(workbasketIds) - .priorityMinimum(priorityMinimum) - .buildReport(), - domains, - states, - workbasketIds, - priorityMinimum)); + builder.buildReport(), domains, states, workbasketIds, priorityMinimum)); } /**