From fe587844e3222b7b4eb667faadfb437c751c65fe Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Mon, 27 Nov 2017 11:03:33 +0100 Subject: [PATCH 1/4] TSK-56 refactor Exceptions. Introduce TaskanaException and TaskanaRuntimeException --- .../exceptions/AutocommitFailedException.java | 2 +- .../exceptions/ConnectionNotSetException.java | 2 +- .../exceptions/NotAuthorizedException.java | 2 +- .../taskana/exceptions/NotFoundException.java | 2 +- .../taskana/exceptions/TaskanaException.java | 30 ++++++++++++++++++ .../exceptions/TaskanaRuntimeException.java | 31 +++++++++++++++++++ .../pro/taskana/impl/TaskanaEngineImpl.java | 2 +- .../WorkbasketServiceImplIntExplicitTest.java | 12 +++---- 8 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaException.java create mode 100644 lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaRuntimeException.java diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/AutocommitFailedException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/AutocommitFailedException.java index 1fd2bdaa4..79ca68138 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/exceptions/AutocommitFailedException.java +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/AutocommitFailedException.java @@ -5,7 +5,7 @@ package pro.taskana.exceptions; * */ @SuppressWarnings("serial") -public class AutocommitFailedException extends RuntimeException { +public class AutocommitFailedException extends TaskanaRuntimeException { public AutocommitFailedException(Throwable cause) { super("Autocommit failed", cause); } diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/ConnectionNotSetException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/ConnectionNotSetException.java index ae2e0713e..ddaa0e8a6 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/exceptions/ConnectionNotSetException.java +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/ConnectionNotSetException.java @@ -5,7 +5,7 @@ package pro.taskana.exceptions; * */ @SuppressWarnings("serial") -public class ConnectionNotSetException extends RuntimeException { +public class ConnectionNotSetException extends TaskanaRuntimeException { public ConnectionNotSetException() { super("Connection not set"); diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotAuthorizedException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotAuthorizedException.java index 5a20accbe..5a88216b9 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotAuthorizedException.java +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotAuthorizedException.java @@ -4,7 +4,7 @@ package pro.taskana.exceptions; * This exception is used to communicate a not authorized user. */ @SuppressWarnings("serial") -public class NotAuthorizedException extends Exception { +public class NotAuthorizedException extends TaskanaException { public NotAuthorizedException(String msg) { super(msg); diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotFoundException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotFoundException.java index 8a2456b7e..3b0f26623 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotFoundException.java +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/NotFoundException.java @@ -4,7 +4,7 @@ package pro.taskana.exceptions; * This exception will be thrown if a specific object is not in the database. */ @SuppressWarnings("serial") -public class NotFoundException extends Exception { +public class NotFoundException extends TaskanaException { public NotFoundException(String id) { super(id); diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaException.java new file mode 100644 index 000000000..8058fbdd0 --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaException.java @@ -0,0 +1,30 @@ +package pro.taskana.exceptions; + +/** + * common base class for Taskana's checked exceptions. + * @author bbr + * + */ +public class TaskanaException extends Exception { + + public TaskanaException() { + super(); + } + + public TaskanaException(String message) { + super(message); + } + + public TaskanaException(Throwable cause) { + super(cause); + } + + public TaskanaException(String message, Throwable cause) { + super(message, cause); + } + + public TaskanaException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaRuntimeException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaRuntimeException.java new file mode 100644 index 000000000..6ad0aedbb --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/TaskanaRuntimeException.java @@ -0,0 +1,31 @@ +package pro.taskana.exceptions; + +/** + * Common base class for Taskana's runtime exceptions. + * @author bbr + * + */ +public class TaskanaRuntimeException extends RuntimeException { + + public TaskanaRuntimeException() { + super(); + } + + public TaskanaRuntimeException(String message) { + super(message); + } + + public TaskanaRuntimeException(Throwable cause) { + super(cause); + } + + public TaskanaRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public TaskanaRuntimeException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java index d1074b922..f4a72c464 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java @@ -115,7 +115,7 @@ public class TaskanaEngineImpl implements TaskanaEngine { this.connection = connection; mode = ConnectionManagementMode.EXPLICIT; sessionManager.startManagedSession(connection); - } else { + } else if (this.connection != null) { this.connection = null; if (sessionManager.isManagedSessionStarted()) { sessionManager.close(); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java index 27fc97d6a..fb971f865 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java @@ -78,7 +78,7 @@ public class WorkbasketServiceImplIntExplicitTest { workbasket.setName("Megabasket"); workBasketService.createWorkbasket(workbasket); Assert.assertEquals(before + 1, workBasketService.getWorkbaskets().size()); - connection.close(); + taskanaEngineImpl.closeConnection(); } @Test @@ -104,7 +104,7 @@ public class WorkbasketServiceImplIntExplicitTest { workBasketService.createWorkbasket(workbasket2); Assert.assertEquals(before + THREE, workBasketService.getWorkbaskets().size()); connection.commit(); - connection.close(); + taskanaEngineImpl.closeConnection(); } @Test @@ -130,7 +130,7 @@ public class WorkbasketServiceImplIntExplicitTest { Workbasket foundWorkbasket = workBasketService.getWorkbasket(id2); Assert.assertEquals(id2, foundWorkbasket.getId()); connection.commit(); - connection.close(); + taskanaEngineImpl.closeConnection(); } @Test(expected = WorkbasketNotFoundException.class) @@ -140,7 +140,7 @@ public class WorkbasketServiceImplIntExplicitTest { workBasketService = taskanaEngine.getWorkbasketService(); workBasketService.getWorkbasket("fail"); connection.commit(); - connection.close(); + taskanaEngineImpl.closeConnection(); } @Test @@ -168,7 +168,6 @@ public class WorkbasketServiceImplIntExplicitTest { Assert.assertEquals(id2, foundWorkbasket.getId()); Assert.assertEquals(2, foundWorkbasket.getDistributionTargets().size()); connection.commit(); - connection.close(); } @Test @@ -213,7 +212,6 @@ public class WorkbasketServiceImplIntExplicitTest { Assert.assertEquals(workBasketService.getWorkbasket(id3).getCreated(), workBasketService.getWorkbasket(id3).getModified()); connection.commit(); - connection.close(); } @Test @@ -231,7 +229,6 @@ public class WorkbasketServiceImplIntExplicitTest { Assert.assertEquals(1, workBasketService.getAllAuthorizations().size()); connection.commit(); - connection.close(); } @Test @@ -255,7 +252,6 @@ public class WorkbasketServiceImplIntExplicitTest { Assert.assertEquals("Zaphod Beeblebrox", workBasketService.getWorkbasketAuthorization(accessItem.getId()).getAccessId()); connection.commit(); - connection.close(); } @After From eb4111e75b1a0da5dc7698140aa69508bc1cd136 Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Mon, 27 Nov 2017 13:20:32 +0100 Subject: [PATCH 2/4] TSK-57_refactor_query_interfaces --- .../main/java/pro/taskana/{persistence => }/BaseQuery.java | 2 +- .../pro/taskana/{persistence => }/ClassificationQuery.java | 2 +- .../src/main/java/pro/taskana/ClassificationService.java | 1 - .../taskana/{persistence => }/ObjectReferenceQuery.java | 2 +- .../main/java/pro/taskana/{persistence => }/TaskQuery.java | 2 +- .../src/main/java/pro/taskana/TaskService.java | 1 - .../src/main/java/pro/taskana/TaskanaEngine.java | 1 - .../java/pro/taskana/impl/ClassificationQueryImpl.java | 3 ++- .../java/pro/taskana/impl/ClassificationServiceImpl.java | 2 +- .../java/pro/taskana/impl/ObjectReferenceQueryImpl.java | 3 ++- .../src/main/java/pro/taskana/impl/TaskQueryImpl.java | 6 +++--- .../src/main/java/pro/taskana/impl/TaskServiceImpl.java | 2 +- .../java/pro/taskana/impl/TestClassificationQuery.java | 2 +- .../impl/integration/TaskServiceImplIntAutocommitTest.java | 4 ++-- .../impl/integration/TaskServiceImplIntExplicitTest.java | 4 ++-- rest/src/main/java/pro/taskana/rest/query/TaskFilter.java | 7 ++++--- 16 files changed, 22 insertions(+), 22 deletions(-) rename lib/taskana-core/src/main/java/pro/taskana/{persistence => }/BaseQuery.java (96%) rename lib/taskana-core/src/main/java/pro/taskana/{persistence => }/ClassificationQuery.java (98%) rename lib/taskana-core/src/main/java/pro/taskana/{persistence => }/ObjectReferenceQuery.java (97%) rename lib/taskana-core/src/main/java/pro/taskana/{persistence => }/TaskQuery.java (98%) diff --git a/lib/taskana-core/src/main/java/pro/taskana/persistence/BaseQuery.java b/lib/taskana-core/src/main/java/pro/taskana/BaseQuery.java similarity index 96% rename from lib/taskana-core/src/main/java/pro/taskana/persistence/BaseQuery.java rename to lib/taskana-core/src/main/java/pro/taskana/BaseQuery.java index 8cd404fc0..4b7f70be9 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/persistence/BaseQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/BaseQuery.java @@ -1,4 +1,4 @@ -package pro.taskana.persistence; +package pro.taskana; import java.util.List; diff --git a/lib/taskana-core/src/main/java/pro/taskana/persistence/ClassificationQuery.java b/lib/taskana-core/src/main/java/pro/taskana/ClassificationQuery.java similarity index 98% rename from lib/taskana-core/src/main/java/pro/taskana/persistence/ClassificationQuery.java rename to lib/taskana-core/src/main/java/pro/taskana/ClassificationQuery.java index 9cba69624..cad92b77d 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/persistence/ClassificationQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/ClassificationQuery.java @@ -1,4 +1,4 @@ -package pro.taskana.persistence; +package pro.taskana; import pro.taskana.model.Classification; diff --git a/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java b/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java index e3a05c7fa..da3e49c86 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java @@ -2,7 +2,6 @@ package pro.taskana; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Classification; -import pro.taskana.persistence.ClassificationQuery; import java.util.List; diff --git a/lib/taskana-core/src/main/java/pro/taskana/persistence/ObjectReferenceQuery.java b/lib/taskana-core/src/main/java/pro/taskana/ObjectReferenceQuery.java similarity index 97% rename from lib/taskana-core/src/main/java/pro/taskana/persistence/ObjectReferenceQuery.java rename to lib/taskana-core/src/main/java/pro/taskana/ObjectReferenceQuery.java index a0190e7d3..d5ea95a0f 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/persistence/ObjectReferenceQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/ObjectReferenceQuery.java @@ -1,4 +1,4 @@ -package pro.taskana.persistence; +package pro.taskana; import pro.taskana.model.ObjectReference; diff --git a/lib/taskana-core/src/main/java/pro/taskana/persistence/TaskQuery.java b/lib/taskana-core/src/main/java/pro/taskana/TaskQuery.java similarity index 98% rename from lib/taskana-core/src/main/java/pro/taskana/persistence/TaskQuery.java rename to lib/taskana-core/src/main/java/pro/taskana/TaskQuery.java index 32579dcfa..0873ee681 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/persistence/TaskQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskQuery.java @@ -1,4 +1,4 @@ -package pro.taskana.persistence; +package pro.taskana; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Task; diff --git a/lib/taskana-core/src/main/java/pro/taskana/TaskService.java b/lib/taskana-core/src/main/java/pro/taskana/TaskService.java index cb12f5e58..469b583d4 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskService.java @@ -9,7 +9,6 @@ import pro.taskana.model.DueWorkbasketCounter; import pro.taskana.model.Task; import pro.taskana.model.TaskState; import pro.taskana.model.TaskStateCounter; -import pro.taskana.persistence.TaskQuery; /** * The Task Service manages all operations on tasks. diff --git a/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java b/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java index f01b31a9f..3e836b837 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java @@ -1,6 +1,5 @@ package pro.taskana; -import pro.taskana.TaskanaEngine.ConnectionManagementMode; import pro.taskana.configuration.TaskanaEngineConfiguration; /** diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationQueryImpl.java index 5b1bf1016..78824c613 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationQueryImpl.java @@ -1,9 +1,10 @@ package pro.taskana.impl; import org.apache.ibatis.session.RowBounds; + +import pro.taskana.ClassificationQuery; import pro.taskana.TaskanaEngine; import pro.taskana.model.Classification; -import pro.taskana.persistence.ClassificationQuery; import java.util.Date; import java.util.List; 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 f04d0950a..dc081f719 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 @@ -1,12 +1,12 @@ package pro.taskana.impl; +import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationService; import pro.taskana.TaskanaEngine; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.impl.util.IdGenerator; import pro.taskana.model.Classification; import pro.taskana.model.mappings.ClassificationMapper; -import pro.taskana.persistence.ClassificationQuery; import java.sql.Date; import java.time.Duration; diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/ObjectReferenceQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/ObjectReferenceQueryImpl.java index f7886acda..e777b2495 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/ObjectReferenceQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/ObjectReferenceQueryImpl.java @@ -3,9 +3,10 @@ package pro.taskana.impl; import java.util.List; import org.apache.ibatis.session.RowBounds; + +import pro.taskana.ObjectReferenceQuery; import pro.taskana.TaskanaEngine; import pro.taskana.model.ObjectReference; -import pro.taskana.persistence.ObjectReferenceQuery; /** * Implementation of ObjectReferenceQuery interface. diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java index f0d6836ea..3feff4f3c 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskQueryImpl.java @@ -4,14 +4,14 @@ import java.util.List; import org.apache.ibatis.session.RowBounds; +import pro.taskana.ClassificationQuery; +import pro.taskana.ObjectReferenceQuery; +import pro.taskana.TaskQuery; import pro.taskana.TaskanaEngine; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Task; import pro.taskana.model.TaskState; import pro.taskana.model.WorkbasketAuthorization; -import pro.taskana.persistence.ClassificationQuery; -import pro.taskana.persistence.ObjectReferenceQuery; -import pro.taskana.persistence.TaskQuery; /** * TaskQuery for generating dynamic sql. 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 790d169cb..91f53451d 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 @@ -9,6 +9,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pro.taskana.TaskQuery; import pro.taskana.TaskService; import pro.taskana.TaskanaEngine; import pro.taskana.exceptions.NotAuthorizedException; @@ -23,7 +24,6 @@ import pro.taskana.model.TaskStateCounter; import pro.taskana.model.WorkbasketAuthorization; import pro.taskana.model.mappings.ObjectReferenceMapper; import pro.taskana.model.mappings.TaskMapper; -import pro.taskana.persistence.TaskQuery; /** * This is the implementation of TaskService. diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TestClassificationQuery.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TestClassificationQuery.java index d589f3104..85c6a8985 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TestClassificationQuery.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TestClassificationQuery.java @@ -1,8 +1,8 @@ package pro.taskana.impl; +import pro.taskana.ClassificationQuery; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Classification; -import pro.taskana.persistence.ClassificationQuery; import java.util.ArrayList; import java.util.Date; diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java index 915b04bb5..2e7e816b3 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java @@ -14,6 +14,8 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import pro.taskana.ClassificationQuery; +import pro.taskana.ObjectReferenceQuery; import pro.taskana.TaskanaEngine; import pro.taskana.TaskanaEngine.ConnectionManagementMode; import pro.taskana.configuration.TaskanaEngineConfiguration; @@ -28,8 +30,6 @@ import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.impl.util.IdGenerator; import pro.taskana.model.Task; import pro.taskana.model.TaskState; -import pro.taskana.persistence.ClassificationQuery; -import pro.taskana.persistence.ObjectReferenceQuery; /** * Integration Test for TaskServiceImpl transactions with connection management mode AUTOCOMMIT. diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java index c18c802c9..536354c16 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java @@ -16,6 +16,8 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import pro.taskana.ClassificationQuery; +import pro.taskana.ObjectReferenceQuery; import pro.taskana.TaskanaEngine; import pro.taskana.TaskanaEngine.ConnectionManagementMode; import pro.taskana.configuration.TaskanaEngineConfiguration; @@ -30,8 +32,6 @@ import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.impl.util.IdGenerator; import pro.taskana.model.Task; import pro.taskana.model.TaskState; -import pro.taskana.persistence.ClassificationQuery; -import pro.taskana.persistence.ObjectReferenceQuery; /** * Integration Test for TaskServiceImpl transactions with connection management mode EXPLICIT. diff --git a/rest/src/main/java/pro/taskana/rest/query/TaskFilter.java b/rest/src/main/java/pro/taskana/rest/query/TaskFilter.java index 115cbb92f..94803f58b 100644 --- a/rest/src/main/java/pro/taskana/rest/query/TaskFilter.java +++ b/rest/src/main/java/pro/taskana/rest/query/TaskFilter.java @@ -7,14 +7,15 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; + +import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationService; +import pro.taskana.ObjectReferenceQuery; +import pro.taskana.TaskQuery; import pro.taskana.TaskService; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Task; import pro.taskana.model.TaskState; -import pro.taskana.persistence.ClassificationQuery; -import pro.taskana.persistence.ObjectReferenceQuery; -import pro.taskana.persistence.TaskQuery; @Component public class TaskFilter { From 27e529baa02acb6353b08175d7f56f6c13aebceb Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Tue, 28 Nov 2017 10:28:43 +0100 Subject: [PATCH 3/4] Fix mapper problem --- .../pro/taskana/model/mappings/WorkbasketMapper.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/WorkbasketMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/WorkbasketMapper.java index 93fd2ce38..62b70cd0a 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/WorkbasketMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/WorkbasketMapper.java @@ -46,11 +46,11 @@ public interface WorkbasketMapper { @Select("") @Results(value = { @Result(property = "id", column = "ID"), From cadab6f570221b1736ea8585e5f0f8575ab757f1 Mon Sep 17 00:00:00 2001 From: Marcel Lengl <52546181+LenglBoy@users.noreply.github.com> Date: Tue, 28 Nov 2017 13:31:22 +0100 Subject: [PATCH 4/4] TSK-45: added TaskSummary, a general SummaryController for shorter Classes, Unittest for Service and Integrationtest for Service. REST tested. --- .../main/java/pro/taskana/SummaryService.java | 13 ++ .../main/java/pro/taskana/TaskanaEngine.java | 7 + .../pro/taskana/impl/SummaryServiceImpl.java | 45 ++++++ .../pro/taskana/impl/TaskanaEngineImpl.java | 10 ++ .../java/pro/taskana/model/TaskSummary.java | 129 +++++++++++++++++ .../taskana/model/mappings/SummaryMapper.java | 32 ++++ .../taskana/impl/SummaryServiceImplTest.java | 100 +++++++++++++ .../SummaryServiceImplIntAutoCommitTest.java | 137 ++++++++++++++++++ .../pro/taskana/rest/RestApplication.java | 6 + .../pro/taskana/rest/SummaryController.java | 38 +++++ .../taskana/rest/WorkbasketController.java | 3 +- .../main/resources/sql/sample-data/task.sql | 8 +- 12 files changed, 523 insertions(+), 5 deletions(-) create mode 100644 lib/taskana-core/src/main/java/pro/taskana/SummaryService.java create mode 100644 lib/taskana-core/src/main/java/pro/taskana/impl/SummaryServiceImpl.java create mode 100644 lib/taskana-core/src/main/java/pro/taskana/model/TaskSummary.java create mode 100644 lib/taskana-core/src/main/java/pro/taskana/model/mappings/SummaryMapper.java create mode 100644 lib/taskana-core/src/test/java/pro/taskana/impl/SummaryServiceImplTest.java create mode 100644 lib/taskana-core/src/test/java/pro/taskana/impl/integration/SummaryServiceImplIntAutoCommitTest.java create mode 100644 rest/src/main/java/pro/taskana/rest/SummaryController.java diff --git a/lib/taskana-core/src/main/java/pro/taskana/SummaryService.java b/lib/taskana-core/src/main/java/pro/taskana/SummaryService.java new file mode 100644 index 000000000..1c980fb21 --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/SummaryService.java @@ -0,0 +1,13 @@ +package pro.taskana; + +import java.util.List; + +import pro.taskana.model.TaskSummary; + +/** + * This interface manages the summaries of some models. + */ +public interface SummaryService { + + List getTaskSummariesByWorkbasketId(String workbasketId); +} diff --git a/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java b/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java index 3e836b837..46902f2d0 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngine.java @@ -25,6 +25,13 @@ public interface TaskanaEngine { */ ClassificationService getClassificationService(); + /** + * Can be used for each operation for summaries with short-infos about + * one or more objects. + * @return a SummaryService-BEAN + */ + SummaryService getSummaryService(); + /** * The Taskana configuration. * @return the TaskanaConfiguration diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/SummaryServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/SummaryServiceImpl.java new file mode 100644 index 000000000..5645e9ddc --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/SummaryServiceImpl.java @@ -0,0 +1,45 @@ +package pro.taskana.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import pro.taskana.SummaryService; +import pro.taskana.TaskanaEngine; +import pro.taskana.model.TaskSummary; +import pro.taskana.model.mappings.SummaryMapper; + +/** + * @author mle + * Organization of Table-Summaries with less informations. + */ +public class SummaryServiceImpl implements SummaryService { + + public static final Logger LOGGER = LoggerFactory.getLogger(SummaryServiceImpl.class); + private SummaryMapper summaryMapper; + private TaskanaEngineImpl taskanaEngineImpl; + + public SummaryServiceImpl(TaskanaEngine taskanaEngine, SummaryMapper summaryMapper) { + this.summaryMapper = summaryMapper; + this.taskanaEngineImpl = (TaskanaEngineImpl) taskanaEngine; + } + + @Override + public List getTaskSummariesByWorkbasketId(String workbasketId) { + List taskSummaries = new ArrayList<>(); + try { + taskanaEngineImpl.openConnection(); + taskSummaries = summaryMapper.findTasksummariesByWorkbasketId(workbasketId); + } catch (Exception ex) { + LOGGER.error("Getting TASKSUMMARY failed internal.", ex); + } finally { + if (taskSummaries == null) { + taskSummaries = new ArrayList<>(); + } + taskanaEngineImpl.returnConnection(); + } + return taskSummaries; + } +} diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java index f4a72c464..59f5b0e97 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskanaEngineImpl.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pro.taskana.ClassificationService; +import pro.taskana.SummaryService; import pro.taskana.TaskService; import pro.taskana.TaskanaEngine; import pro.taskana.WorkbasketService; @@ -26,6 +27,7 @@ import pro.taskana.model.mappings.ClassificationMapper; import pro.taskana.model.mappings.DistributionTargetMapper; import pro.taskana.model.mappings.ObjectReferenceMapper; import pro.taskana.model.mappings.QueryMapper; +import pro.taskana.model.mappings.SummaryMapper; import pro.taskana.model.mappings.TaskMapper; import pro.taskana.model.mappings.WorkbasketAccessMapper; import pro.taskana.model.mappings.WorkbasketMapper; @@ -68,6 +70,13 @@ public class TaskanaEngineImpl implements TaskanaEngine { return workbasketServiceImpl; } + @Override + public SummaryService getSummaryService() { + SqlSession session = this.sessionManager; + SummaryServiceImpl summaryServiceImpl = new SummaryServiceImpl(this, session.getMapper(SummaryMapper.class)); + return summaryServiceImpl; + } + @Override public ClassificationService getClassificationService() { SqlSession session = this.sessionManager; @@ -216,6 +225,7 @@ public class TaskanaEngineImpl implements TaskanaEngine { configuration.addMapper(WorkbasketAccessMapper.class); configuration.addMapper(ObjectReferenceMapper.class); configuration.addMapper(QueryMapper.class); + configuration.addMapper(SummaryMapper.class); configuration.getTypeHandlerRegistry().register(MapTypeHandler.class); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration); SqlSessionManager sessionManager = SqlSessionManager.newInstance(sessionFactory); diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/TaskSummary.java b/lib/taskana-core/src/main/java/pro/taskana/model/TaskSummary.java new file mode 100644 index 000000000..c94915ef5 --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/model/TaskSummary.java @@ -0,0 +1,129 @@ +package pro.taskana.model; + +/** + * Entity which contains the most important + * informations about a Task. + */ +public class TaskSummary { + + private String taskId; + private String taskName; + private String workbasketId; + private String workbasketName; + private String classificationId; + private String classificationName; + + public String getTaskId() { + return taskId; + } + public void setTaskId(String taskId) { + this.taskId = taskId; + } + public String getTaskName() { + return taskName; + } + public void setTaskName(String taskName) { + this.taskName = taskName; + } + public String getWorkbasketId() { + return workbasketId; + } + public void setWorkbasketId(String workbasketId) { + this.workbasketId = workbasketId; + } + public String getWorkbasketName() { + return workbasketName; + } + public void setWorkbasketName(String workbasketName) { + this.workbasketName = workbasketName; + } + public String getClassificationId() { + return classificationId; + } + public void setClassificationId(String classificationId) { + this.classificationId = classificationId; + } + public String getClassificationName() { + return classificationName; + } + public void setClassificationName(String classificationName) { + this.classificationName = classificationName; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((classificationId == null) ? 0 : classificationId.hashCode()); + result = prime * result + ((classificationName == null) ? 0 : classificationName.hashCode()); + result = prime * result + ((taskId == null) ? 0 : taskId.hashCode()); + result = prime * result + ((taskName == null) ? 0 : taskName.hashCode()); + result = prime * result + ((workbasketId == null) ? 0 : workbasketId.hashCode()); + result = prime * result + ((workbasketName == null) ? 0 : workbasketName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + TaskSummary other = (TaskSummary) obj; + if (classificationId == null) { + if (other.classificationId != null) { + return false; + } + } else if (!classificationId.equals(other.classificationId)) { + return false; + } + if (classificationName == null) { + if (other.classificationName != null) { + return false; + } + } else if (!classificationName.equals(other.classificationName)) { + return false; + } + if (taskId == null) { + if (other.taskId != null) { + return false; + } + } else if (!taskId.equals(other.taskId)) { + return false; + } + if (taskName == null) { + if (other.taskName != null) { + return false; + } + } else if (!taskName.equals(other.taskName)) { + return false; + } + if (workbasketId == null) { + if (other.workbasketId != null) { + return false; + } + } else if (!workbasketId.equals(other.workbasketId)) { + return false; + } + if (workbasketName == null) { + if (other.workbasketName != null) { + return false; + } + } else if (!workbasketName.equals(other.workbasketName)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "TaskSummary [taskId=" + taskId + ", taskName=" + taskName + ", workbasketId=" + workbasketId + + ", workbasketName=" + workbasketName + ", classificationId=" + classificationId + + ", classificationName=" + classificationName + "]"; + } +} diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/SummaryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/SummaryMapper.java new file mode 100644 index 000000000..3627bb7d1 --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/SummaryMapper.java @@ -0,0 +1,32 @@ +package pro.taskana.model.mappings; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import pro.taskana.model.TaskSummary; + +/** + * This interface is the myBatis mapping of short summaries. + */ +public interface SummaryMapper { + + @Select("SELECT TASK.ID AS taskId, TASK.NAME AS taskName, TASK.WORKBASKETID AS workId, TASK.CLASSIFICATION_ID AS classificationId, " + + "WORKBASKET.NAME AS workName, CLASSIFICATION.NAME AS classificationName " + + "FROM TASK " + + "LEFT JOIN WORKBASKET ON WORKBASKET.ID = TASK.WORKBASKETID " + + "LEFT JOIN CLASSIFICATION ON CLASSIFICATION.ID = TASK.CLASSIFICATION_ID " + + "WHERE TASK.WORKBASKETID = #{workbasketId}") + @Results({ + @Result(property = "taskId", column = "taskId"), + @Result(property = "taskName", column = "taskName"), + @Result(property = "workbasketId", column = "workId"), + @Result(property = "workbasketName", column = "workName"), + @Result(property = "classificationId", column = "classificationId"), + @Result(property = "classificationName", column = "classificationName") + }) + List findTasksummariesByWorkbasketId(@Param("workbasketId") String workbasketId); +} diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/SummaryServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/SummaryServiceImplTest.java new file mode 100644 index 000000000..7b76c1ce2 --- /dev/null +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/SummaryServiceImplTest.java @@ -0,0 +1,100 @@ +package pro.taskana.impl; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.ibatis.session.SqlSession; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import pro.taskana.model.TaskSummary; +import pro.taskana.model.mappings.SummaryMapper; + +/** + * Testing the {@link SummaryServiceImpl} component. + * Mocks are initialized before each Method by @Runner-Annotation. + */ +@RunWith(MockitoJUnitRunner.class) +public class SummaryServiceImplTest { + + @InjectMocks + private SummaryServiceImpl cut; + + @Mock + private SummaryMapper summaryMapperMock; + + @Mock + private TaskanaEngineImpl taskanaEngineImplMock; + + @Mock + private SqlSession sqlSessionMock; + + @Test + public void testGetTaskSummariesByWorkbasketIdWithInternalException() { + // given - set behaviour and expected result + String workbasketId = "1"; + List expectedResultList = new ArrayList<>(); + doNothing().when(taskanaEngineImplMock).openConnection(); + doThrow(new IllegalArgumentException("Invalid ID: " + workbasketId)).when(summaryMapperMock).findTasksummariesByWorkbasketId(workbasketId); + doNothing().when(taskanaEngineImplMock).returnConnection(); + + // when - make the call + List actualResultList = cut.getTaskSummariesByWorkbasketId(workbasketId); + + // then - verify external communications and assert result + verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(summaryMapperMock, times(1)).findTasksummariesByWorkbasketId(workbasketId); + verify(taskanaEngineImplMock, times(1)).returnConnection(); + verifyNoMoreInteractions(summaryMapperMock, taskanaEngineImplMock, sqlSessionMock); + assertThat(actualResultList, equalTo(expectedResultList)); + } + + @Test + public void testGetTaskSummariesByWorkbasketIdGettingResults() { + String workbasketId = "1"; + List expectedResultList = Arrays.asList(new TaskSummary(), new TaskSummary()); + doNothing().when(taskanaEngineImplMock).openConnection(); + doNothing().when(taskanaEngineImplMock).returnConnection(); + doReturn(expectedResultList).when(summaryMapperMock).findTasksummariesByWorkbasketId(workbasketId); + + List actualResultList = cut.getTaskSummariesByWorkbasketId(workbasketId); + + verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(summaryMapperMock, times(1)).findTasksummariesByWorkbasketId(workbasketId); + verify(taskanaEngineImplMock, times(1)).returnConnection(); + verifyNoMoreInteractions(summaryMapperMock, taskanaEngineImplMock, sqlSessionMock); + assertThat(actualResultList, equalTo(expectedResultList)); + assertThat(actualResultList.size(), equalTo(expectedResultList.size())); + } + + @Test + public void testGetTaskSummariesByWorkbasketIdGettingNull() { + String workbasketId = "1"; + List expectedResultList = new ArrayList<>(); + doNothing().when(taskanaEngineImplMock).openConnection(); + doNothing().when(taskanaEngineImplMock).returnConnection(); + doReturn(null).when(summaryMapperMock).findTasksummariesByWorkbasketId(workbasketId); + + List actualResultList = cut.getTaskSummariesByWorkbasketId(workbasketId); + + verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(summaryMapperMock, times(1)).findTasksummariesByWorkbasketId(workbasketId); + verify(taskanaEngineImplMock, times(1)).returnConnection(); + verifyNoMoreInteractions(summaryMapperMock, taskanaEngineImplMock, sqlSessionMock); + assertThat(actualResultList, equalTo(expectedResultList)); + assertThat(actualResultList.size(), equalTo(expectedResultList.size())); + } +} diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/SummaryServiceImplIntAutoCommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/SummaryServiceImplIntAutoCommitTest.java new file mode 100644 index 000000000..bb18f2211 --- /dev/null +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/SummaryServiceImplIntAutoCommitTest.java @@ -0,0 +1,137 @@ +package pro.taskana.impl.integration; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.io.FileNotFoundException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.security.auth.login.LoginException; +import javax.sql.DataSource; + +import org.h2.store.fs.FileUtils; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import pro.taskana.TaskanaEngine; +import pro.taskana.TaskanaEngine.ConnectionManagementMode; +import pro.taskana.configuration.TaskanaEngineConfiguration; +import pro.taskana.impl.ClassificationServiceImpl; +import pro.taskana.impl.SummaryServiceImpl; +import pro.taskana.impl.TaskServiceImpl; +import pro.taskana.impl.TaskanaEngineImpl; +import pro.taskana.impl.WorkbasketServiceImpl; +import pro.taskana.impl.configuration.DBCleaner; +import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; +import pro.taskana.model.Classification; +import pro.taskana.model.Task; +import pro.taskana.model.TaskSummary; +import pro.taskana.model.Workbasket; + +/** + * Testing {@link SummaryServiceImpl} with real DB-Connection and + * real results. + */ +public class SummaryServiceImplIntAutoCommitTest { + + private DataSource dataSource; + private TaskanaEngineConfiguration taskanaEngineConfiguration; + private TaskanaEngine taskanaEngine; + private TaskanaEngineImpl taskanaEngineImpl; + private WorkbasketServiceImpl workbasketServiceImpl; + private TaskServiceImpl taskServiceImpl; + private ClassificationServiceImpl classificationServiceImpl; + private SummaryServiceImpl summaryServiceImp; + private Task dummyTask; + private Classification dummyClassification; + private Workbasket dummyWorkbasket; + + @BeforeClass + public static void resetDb() throws SQLException { + DataSource ds = TaskanaEngineConfigurationTest.getDataSource(); + DBCleaner cleaner = new DBCleaner(); + cleaner.clearDb(ds, true); + } + + @Before + public void setup() throws FileNotFoundException, SQLException, LoginException { + dataSource = TaskanaEngineConfigurationTest.getDataSource(); + taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, false); + taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); + taskanaEngineImpl = (TaskanaEngineImpl) taskanaEngine; + taskanaEngineImpl.setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); + + workbasketServiceImpl = (WorkbasketServiceImpl) taskanaEngine.getWorkbasketService(); + taskServiceImpl = (TaskServiceImpl) taskanaEngine.getTaskService(); + classificationServiceImpl = (ClassificationServiceImpl) taskanaEngine.getClassificationService(); + summaryServiceImp = (SummaryServiceImpl) taskanaEngine.getSummaryService(); + + DBCleaner cleaner = new DBCleaner(); + cleaner.clearDb(dataSource, false); + } + + @Test + public void shouldReturnTaskSummaryListWithValues() throws Exception { + + generateDummyData(); + + List expectedTaskSumamries = new ArrayList<>(); + TaskSummary taskSummary = new TaskSummary(); + taskSummary.setTaskId(dummyTask.getId()); + taskSummary.setTaskName(dummyTask.getName()); + taskSummary.setWorkbasketId(dummyWorkbasket.getId()); + taskSummary.setWorkbasketName(dummyWorkbasket.getName()); + taskSummary.setClassificationId(dummyClassification.getId()); + taskSummary.setClassificationName(dummyClassification.getName()); + expectedTaskSumamries.add(taskSummary); + + List actualTaskSumamryResult = summaryServiceImp.getTaskSummariesByWorkbasketId(dummyWorkbasket.getId()); + + assertThat(actualTaskSumamryResult, equalTo(expectedTaskSumamries)); + assertThat(actualTaskSumamryResult.size(), equalTo(expectedTaskSumamries.size())); + } + + @Test + public void shouldReturnEmptyTaskSummaryListByNullParameter() { + List expectedTaskSumamries = new ArrayList<>(); + List actualTaskSumamryResult = summaryServiceImp.getTaskSummariesByWorkbasketId(null); + assertThat(actualTaskSumamryResult, equalTo(expectedTaskSumamries)); + assertThat(actualTaskSumamryResult.size(), equalTo(expectedTaskSumamries.size())); + } + + @Test + public void shouldReturnEmptyTaskSummaryListByNoResultFound() { + List expectedTaskSumamries = new ArrayList<>(); + List actualTaskSumamryResult = summaryServiceImp.getTaskSummariesByWorkbasketId("123"); + assertThat(actualTaskSumamryResult, equalTo(expectedTaskSumamries)); + assertThat(actualTaskSumamryResult.size(), equalTo(expectedTaskSumamries.size())); + } + + private void generateDummyData() throws Exception { + dummyWorkbasket = new Workbasket(); + dummyWorkbasket.setId("1"); + dummyWorkbasket.setName("Dummy-Basket"); + dummyWorkbasket = workbasketServiceImpl.createWorkbasket(dummyWorkbasket); + + dummyClassification = new Classification(); + dummyClassification.setId("1"); + dummyClassification.setName("Dummy-Classification"); + classificationServiceImpl.addClassification(dummyClassification); + + dummyTask = new Task(); + dummyTask.setId("1"); + dummyTask.setName("Dummy-Task"); + dummyTask.setClassification(dummyClassification); + dummyTask.setWorkbasketId(dummyWorkbasket.getId()); + dummyTask = taskServiceImpl.create(dummyTask); + } + + @AfterClass + public static void cleanUpClass() { + FileUtils.deleteRecursive("~/data", true); + } +} diff --git a/rest/src/main/java/pro/taskana/rest/RestApplication.java b/rest/src/main/java/pro/taskana/rest/RestApplication.java index 72082f85f..6f17d9319 100644 --- a/rest/src/main/java/pro/taskana/rest/RestApplication.java +++ b/rest/src/main/java/pro/taskana/rest/RestApplication.java @@ -12,6 +12,7 @@ import org.springframework.context.annotation.Scope; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.SpringHandlerInstantiator; import pro.taskana.ClassificationService; +import pro.taskana.SummaryService; import pro.taskana.TaskService; import pro.taskana.TaskanaEngine; import pro.taskana.WorkbasketService; @@ -46,6 +47,11 @@ public class RestApplication { public WorkbasketService getWorkbasketService() throws Exception { return getTaskanaEngine().getWorkbasketService(); } + + @Bean + public SummaryService getSummaryService() throws Exception { + return getTaskanaEngine().getSummaryService(); + } @Bean @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) diff --git a/rest/src/main/java/pro/taskana/rest/SummaryController.java b/rest/src/main/java/pro/taskana/rest/SummaryController.java new file mode 100644 index 000000000..967dc8f9e --- /dev/null +++ b/rest/src/main/java/pro/taskana/rest/SummaryController.java @@ -0,0 +1,38 @@ +package pro.taskana.rest; + +import java.util.Collections; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import pro.taskana.SummaryService; +import pro.taskana.model.TaskSummary; + +@RestController +@RequestMapping(path = "/v1/summary", produces = { MediaType.APPLICATION_JSON_VALUE }) +public class SummaryController { + + @Autowired + private SummaryService summaryService; + + @RequestMapping(value = "/{workbasketId}/tasks", method = RequestMethod.GET) + public ResponseEntity> getTasksummariesByWorkbasketId(@PathVariable(value="workbasketId") String workbasketId) { + List taskSummaries = null; + try { + taskSummaries = summaryService.getTaskSummariesByWorkbasketId(workbasketId); + return ResponseEntity.status(HttpStatus.OK).body(taskSummaries); + } catch(Exception ex) { + if (taskSummaries == null) { + taskSummaries = Collections.emptyList(); + } + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } +} diff --git a/rest/src/main/java/pro/taskana/rest/WorkbasketController.java b/rest/src/main/java/pro/taskana/rest/WorkbasketController.java index 9eaa05a6b..fe5500d6e 100644 --- a/rest/src/main/java/pro/taskana/rest/WorkbasketController.java +++ b/rest/src/main/java/pro/taskana/rest/WorkbasketController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; + import pro.taskana.WorkbasketService; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.WorkbasketNotFoundException; @@ -29,7 +30,7 @@ public class WorkbasketController { @Autowired private WorkbasketService workbasketService; - + @GetMapping public List getWorkbaskets(@RequestParam MultiValueMap params) { if (params.containsKey("requiredPermission")) { diff --git a/rest/src/main/resources/sql/sample-data/task.sql b/rest/src/main/resources/sql/sample-data/task.sql index 62fe1d90c..c1ef36074 100644 --- a/rest/src/main/resources/sql/sample-data/task.sql +++ b/rest/src/main/resources/sql/sample-data/task.sql @@ -2,8 +2,8 @@ INSERT INTO TASK VALUES('1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, C INSERT INTO TASK VALUES('2', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task2', 'Lorem ipsum dolor sit amet. ', 1, 'READY', '2', '1', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); INSERT INTO TASK VALUES('3', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task3', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', '3', '1', 'Stefan', '3', true, false, null, null, null, null, null, null, null, null, null, null, null); INSERT INTO TASK VALUES('4', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task4', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', '4', '1', 'Frank', '1', false, true, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO TASK VALUES('5', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task5', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', '11', '1', 'Stefan', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO TASK VALUES('6', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', '12', '1', 'Frank', '3', false, false, null, null, null, null, null, null, null, null, null, null, null); +INSERT INTO TASK VALUES('5', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task5', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', '15', '1', 'Stefan', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); +INSERT INTO TASK VALUES('6', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', '16', '1', 'Frank', '3', false, false, null, null, null, null, null, null, null, null, null, null, null); INSERT INTO TASK VALUES('7', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task7', 'Lorem ipsum dolor sit amet.', 1, 'READY', '13', '2', 'Stefan', '1', false, false, null, null, null, null, null, null, null, null, null, null, null); INSERT INTO TASK VALUES('8', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task8', 'Lorem ipsum dolor sit amet. ', 1, 'READY', '14', '2', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); @@ -12,5 +12,5 @@ INSERT INTO TASK VALUES('10', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURREN INSERT INTO TASK VALUES('11', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task11', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', '3', '2', 'Stefan', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); INSERT INTO TASK VALUES('12', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', '4', '2', 'Frank', '3', false, false, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO TASK VALUES('13', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa turpis, pellentesque ut libero sit aet, malesuada suscipit dolor. Sed volutpat euismod felis sit amet molestie. Fusce ornare purus dui. ', 1, 'READY', '11', '2', 'Frank', '1', false, false, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO TASK VALUES('14', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis vulputate nibh ut malesuada. Etiam ac dictum tellus, nec cursus nunc. Curabitur velit eros, feugiat volutpat laoreet vitae, cursus eu dui. Nulla ut purus sem. Vivamus aliquet odio vitae erat cursus, vitae mattis urna mollis. Nam quam tellus, auctor id volutpat congue, viverra vitae ante. Duis nisi dolor, elementum et mattis at, maximus id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eu condimentum risus. Praesent libero velit, facilisis sit amet maximus non, scelerisque ullamcorper leo. Ut sit amet iaculis eros. Mauris sagittis nibh lacus, at facilisis magna suscipit at. Aliquam finibus tempor odio id commodo. Vivamus aliquam, justo id porta imperdiet, mi.', 1, 'READY', '12', '1', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); +INSERT INTO TASK VALUES('13', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa turpis, pellentesque ut libero sit aet, malesuada suscipit dolor. Sed volutpat euismod felis sit amet molestie. Fusce ornare purus dui. ', 1, 'READY', '13', '2', 'Frank', '1', false, false, null, null, null, null, null, null, null, null, null, null, null); +INSERT INTO TASK VALUES('14', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis vulputate nibh ut malesuada. Etiam ac dictum tellus, nec cursus nunc. Curabitur velit eros, feugiat volutpat laoreet vitae, cursus eu dui. Nulla ut purus sem. Vivamus aliquet odio vitae erat cursus, vitae mattis urna mollis. Nam quam tellus, auctor id volutpat congue, viverra vitae ante. Duis nisi dolor, elementum et mattis at, maximus id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eu condimentum risus. Praesent libero velit, facilisis sit amet maximus non, scelerisque ullamcorper leo. Ut sit amet iaculis eros. Mauris sagittis nibh lacus, at facilisis magna suscipit at. Aliquam finibus tempor odio id commodo. Vivamus aliquam, justo id porta imperdiet, mi.', 1, 'READY', '14', '1', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null);