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);