diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java index c700664b1..f39df9e4d 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java @@ -396,8 +396,15 @@ public class ClassificationServiceImpl implements ClassificationService { } private boolean isReferentialIntegrityConstraintViolation(PersistenceException e) { - return e.getCause() instanceof SQLException && ((SQLException) e.getCause()).getSQLState().equals("23503") - || e.getCause() instanceof SQLIntegrityConstraintViolationException && e.getMessage().contains("-532"); + return isH2OrPostgresIntegrityConstraintViolation(e) || isDb2IntegrityConstraintViolation(e); + } + + private boolean isDb2IntegrityConstraintViolation(PersistenceException e) { + return e.getCause() instanceof SQLIntegrityConstraintViolationException && e.getMessage().contains("-532"); + } + + private boolean isH2OrPostgresIntegrityConstraintViolation(PersistenceException e) { + return e.getCause() instanceof SQLException && ((SQLException) e.getCause()).getSQLState().equals("23503"); } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskServiceImpl.java index f6ca01966..78f0d5b32 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskServiceImpl.java @@ -487,10 +487,9 @@ public class TaskServiceImpl implements TaskService { taskanaEngine.openConnection(); LOGGER.debug("entry to transferBulk(targetWbId = {}, taskIds = {})", destinationWorkbasketId, taskIds); // Check pre-conditions with trowing Exceptions - if (destinationWorkbasketId == null || destinationWorkbasketId.isEmpty() || taskIds == null - || taskIds.isEmpty()) { + if (destinationWorkbasketId == null || destinationWorkbasketId.isEmpty()) { throw new InvalidArgumentException( - "DestinationWorkbasketId or TaskIds must not be null or empty."); + "DestinationWorkbasketId must not be null or empty."); } Workbasket destinationWorkbasket = workbasketService.getWorkbasket(destinationWorkbasketId); @@ -510,9 +509,9 @@ public class TaskServiceImpl implements TaskService { LOGGER.debug("entry to transferBulk(targetWbKey = {}, domain = {}, taskIds = {})", destinationWorkbasketKey, destinationWorkbasketDomain, taskIds); // Check pre-conditions with trowing Exceptions - if (destinationWorkbasketKey == null || destinationWorkbasketDomain == null || taskIds == null) { + if (destinationWorkbasketKey == null || destinationWorkbasketDomain == null) { throw new InvalidArgumentException( - "DestinationWorkbasketKey or domain or TaskIds can´t be used as NULL-Parameter."); + "DestinationWorkbasketKey or domain can´t be used as NULL-Parameter."); } Workbasket destinationWorkbasket = workbasketService.getWorkbasket(destinationWorkbasketKey, destinationWorkbasketDomain); @@ -527,6 +526,12 @@ public class TaskServiceImpl implements TaskService { private BulkOperationResults transferTasks(List taskIdsToBeTransferred, Workbasket destinationWorkbasket) throws InvalidArgumentException { + // Check pre-conditions with trowing Exceptions + if (taskIdsToBeTransferred == null + || taskIdsToBeTransferred.isEmpty() || taskIdsToBeTransferred.contains("")) { + throw new InvalidArgumentException( + "TaskIds must not be null,empty or an empty string."); + } BulkOperationResults bulkLog = new BulkOperationResults<>(); // convert to ArrayList if necessary to prevent a UnsupportedOperationException while removing @@ -558,7 +563,7 @@ public class TaskServiceImpl implements TaskService { } // check source WB (read)+transfer Set workbasketIds = new HashSet<>(); - taskSummaries.stream().forEach(t -> workbasketIds.add(t.getWorkbasketId())); + taskSummaries.forEach(t -> workbasketIds.add(t.getWorkbasketId())); WorkbasketQueryImpl query = (WorkbasketQueryImpl) workbasketService.createWorkbasketQuery(); query.setUsedToAugmentTasks(true); List sourceWorkbaskets; @@ -585,8 +590,8 @@ public class TaskServiceImpl implements TaskService { bulkLog.addError(currentTaskId, new InvalidStateException("Completed task with id " + currentTaskId + " cannot be transferred.")); taskIdIterator.remove(); - } else if (!sourceWorkbaskets.stream() - .anyMatch(wb -> taskSummary.getWorkbasketId().equals(wb.getId()))) { + } else if (sourceWorkbaskets.stream() + .noneMatch(wb -> taskSummary.getWorkbasketId().equals(wb.getId()))) { bulkLog.addError(currentTaskId, new NotAuthorizedException( "The workbasket of this task got not TRANSFER permissions. TaskId=" + currentTaskId)); @@ -1397,43 +1402,6 @@ public class TaskServiceImpl implements TaskService { } } - /** - * hold a pair of priority and Duration. - * - * @author bbr - */ - static class PrioDurationHolder { - - private Duration duration; - - private int prio; - - PrioDurationHolder(Duration duration, int prio) { - super(); - this.duration = duration; - this.prio = prio; - } - - public Duration getDuration() { - return duration; - } - - public int getPrio() { - return prio; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("PrioDurationHolder [duration="); - builder.append(duration); - builder.append(", prio="); - builder.append(prio); - builder.append("]"); - return builder.toString(); - } - } - BulkOperationResults classificationChanged(String taskId, String classificationId) throws TaskNotFoundException, ClassificationNotFoundException { LOGGER.debug("entry to classificationChanged(taskId = {} , classificationId = {} )", taskId, classificationId); @@ -1501,4 +1469,41 @@ public class TaskServiceImpl implements TaskService { return result; } + /** + * hold a pair of priority and Duration. + * + * @author bbr + */ + static class PrioDurationHolder { + + private Duration duration; + + private int prio; + + PrioDurationHolder(Duration duration, int prio) { + super(); + this.duration = duration; + this.prio = prio; + } + + public Duration getDuration() { + return duration; + } + + public int getPrio() { + return prio; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("PrioDurationHolder [duration="); + builder.append(duration); + builder.append(", prio="); + builder.append(prio); + builder.append("]"); + return builder.toString(); + } + } + } diff --git a/lib/taskana-core/src/main/java/pro/taskana/mappings/TaskMapper.java b/lib/taskana-core/src/main/java/pro/taskana/mappings/TaskMapper.java index da7ec89fc..341d39b47 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/mappings/TaskMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/mappings/TaskMapper.java @@ -183,9 +183,7 @@ public interface TaskMapper { @Param("referencetask") TaskSummaryImpl referencetask); @Select("") @Results(value = { diff --git a/lib/taskana-core/src/test/java/acceptance/task/TransferTaskAccTest.java b/lib/taskana-core/src/test/java/acceptance/task/TransferTaskAccTest.java index a01719760..631199795 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/TransferTaskAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/task/TransferTaskAccTest.java @@ -193,9 +193,7 @@ public class TransferTaskAccTest extends AbstractAccTest { @WithAccessId(userName = "teamlead_1", groupNames = {"group_1"}) @Test public void testBulkTransferTaskWithExceptions() - throws SQLException, NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException, - WorkbasketNotFoundException, TaskAlreadyExistException, InvalidWorkbasketException, TaskNotFoundException, - InvalidStateException, InvalidOwnerException { + throws NotAuthorizedException, InvalidArgumentException, WorkbasketNotFoundException, TaskNotFoundException { TaskService taskService = taskanaEngine.getTaskService(); Workbasket wb = taskanaEngine.getWorkbasketService().getWorkbasket("USER_1_1", "DOMAIN_A"); Instant before = Instant.now(); @@ -203,7 +201,6 @@ public class TransferTaskAccTest extends AbstractAccTest { taskIdList.add("TKI:000000000000000000000000000000000006"); // working taskIdList.add("TKI:000000000000000000000000000000000041"); // NotAuthorized READ taskIdList.add("TKI:200000000000000000000000000000000006"); // NotAuthorized TRANSFER - taskIdList.add(""); // InvalidArgument taskIdList.add(null); // InvalidArgument (added with ""), duplicate taskIdList.add("TKI:000000000000000000000000000000000099"); // TaskNotFound taskIdList.add("TKI:100000000000000000000000000000000006"); // already completed @@ -257,14 +254,11 @@ public class TransferTaskAccTest extends AbstractAccTest { userName = "teamlead_1", groupNames = {"group_1"}) @Test - public void testTransferTasksWithListNotSupportingRemove() - throws SQLException, NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException, - WorkbasketNotFoundException, TaskAlreadyExistException, InvalidWorkbasketException, TaskNotFoundException, - InvalidStateException, InvalidOwnerException { + public void testTransferTasksWithListNotSupportingRemove() throws NotAuthorizedException, InvalidArgumentException, + WorkbasketNotFoundException { TaskService taskService = taskanaEngine.getTaskService(); - List taskIds = Collections.singletonList(""); + List taskIds = Collections.singletonList("TKI:000000000000000000000000000000000006"); taskService.transferTasks("WBI:100000000000000000000000000000000006", taskIds); - } @WithAccessId(