Merge branch 'master' of https://github.com/Taskana/taskana into TSK-43
This commit is contained in:
commit
6f0deb7882
|
@ -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<TaskSummary> getTaskSummariesByWorkbasketId(String workbasketId);
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
package pro.taskana;
|
package pro.taskana;
|
||||||
|
|
||||||
import pro.taskana.TaskanaEngine.ConnectionManagementMode;
|
|
||||||
import pro.taskana.configuration.TaskanaEngineConfiguration;
|
import pro.taskana.configuration.TaskanaEngineConfiguration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,6 +25,13 @@ public interface TaskanaEngine {
|
||||||
*/
|
*/
|
||||||
ClassificationService getClassificationService();
|
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.
|
* The Taskana configuration.
|
||||||
* @return the TaskanaConfiguration
|
* @return the TaskanaConfiguration
|
||||||
|
|
|
@ -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<TaskSummary> getTaskSummariesByWorkbasketId(String workbasketId) {
|
||||||
|
List<TaskSummary> 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import pro.taskana.ClassificationService;
|
import pro.taskana.ClassificationService;
|
||||||
|
import pro.taskana.SummaryService;
|
||||||
import pro.taskana.TaskService;
|
import pro.taskana.TaskService;
|
||||||
import pro.taskana.TaskanaEngine;
|
import pro.taskana.TaskanaEngine;
|
||||||
import pro.taskana.WorkbasketService;
|
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.DistributionTargetMapper;
|
||||||
import pro.taskana.model.mappings.ObjectReferenceMapper;
|
import pro.taskana.model.mappings.ObjectReferenceMapper;
|
||||||
import pro.taskana.model.mappings.QueryMapper;
|
import pro.taskana.model.mappings.QueryMapper;
|
||||||
|
import pro.taskana.model.mappings.SummaryMapper;
|
||||||
import pro.taskana.model.mappings.TaskMapper;
|
import pro.taskana.model.mappings.TaskMapper;
|
||||||
import pro.taskana.model.mappings.WorkbasketAccessMapper;
|
import pro.taskana.model.mappings.WorkbasketAccessMapper;
|
||||||
import pro.taskana.model.mappings.WorkbasketMapper;
|
import pro.taskana.model.mappings.WorkbasketMapper;
|
||||||
|
@ -68,6 +70,13 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
||||||
return workbasketServiceImpl;
|
return workbasketServiceImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SummaryService getSummaryService() {
|
||||||
|
SqlSession session = this.sessionManager;
|
||||||
|
SummaryServiceImpl summaryServiceImpl = new SummaryServiceImpl(this, session.getMapper(SummaryMapper.class));
|
||||||
|
return summaryServiceImpl;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ClassificationService getClassificationService() {
|
public ClassificationService getClassificationService() {
|
||||||
SqlSession session = this.sessionManager;
|
SqlSession session = this.sessionManager;
|
||||||
|
@ -216,6 +225,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
||||||
configuration.addMapper(WorkbasketAccessMapper.class);
|
configuration.addMapper(WorkbasketAccessMapper.class);
|
||||||
configuration.addMapper(ObjectReferenceMapper.class);
|
configuration.addMapper(ObjectReferenceMapper.class);
|
||||||
configuration.addMapper(QueryMapper.class);
|
configuration.addMapper(QueryMapper.class);
|
||||||
|
configuration.addMapper(SummaryMapper.class);
|
||||||
configuration.getTypeHandlerRegistry().register(MapTypeHandler.class);
|
configuration.getTypeHandlerRegistry().register(MapTypeHandler.class);
|
||||||
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration);
|
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration);
|
||||||
SqlSessionManager sessionManager = SqlSessionManager.newInstance(sessionFactory);
|
SqlSessionManager sessionManager = SqlSessionManager.newInstance(sessionFactory);
|
||||||
|
|
|
@ -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 + "]";
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<TaskSummary> findTasksummariesByWorkbasketId(@Param("workbasketId") String workbasketId);
|
||||||
|
}
|
|
@ -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<TaskSummary> 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<TaskSummary> 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<TaskSummary> expectedResultList = Arrays.asList(new TaskSummary(), new TaskSummary());
|
||||||
|
doNothing().when(taskanaEngineImplMock).openConnection();
|
||||||
|
doNothing().when(taskanaEngineImplMock).returnConnection();
|
||||||
|
doReturn(expectedResultList).when(summaryMapperMock).findTasksummariesByWorkbasketId(workbasketId);
|
||||||
|
|
||||||
|
List<TaskSummary> 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<TaskSummary> expectedResultList = new ArrayList<>();
|
||||||
|
doNothing().when(taskanaEngineImplMock).openConnection();
|
||||||
|
doNothing().when(taskanaEngineImplMock).returnConnection();
|
||||||
|
doReturn(null).when(summaryMapperMock).findTasksummariesByWorkbasketId(workbasketId);
|
||||||
|
|
||||||
|
List<TaskSummary> 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()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<TaskSummary> 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<TaskSummary> actualTaskSumamryResult = summaryServiceImp.getTaskSummariesByWorkbasketId(dummyWorkbasket.getId());
|
||||||
|
|
||||||
|
assertThat(actualTaskSumamryResult, equalTo(expectedTaskSumamries));
|
||||||
|
assertThat(actualTaskSumamryResult.size(), equalTo(expectedTaskSumamries.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldReturnEmptyTaskSummaryListByNullParameter() {
|
||||||
|
List<TaskSummary> expectedTaskSumamries = new ArrayList<>();
|
||||||
|
List<TaskSummary> actualTaskSumamryResult = summaryServiceImp.getTaskSummariesByWorkbasketId(null);
|
||||||
|
assertThat(actualTaskSumamryResult, equalTo(expectedTaskSumamries));
|
||||||
|
assertThat(actualTaskSumamryResult.size(), equalTo(expectedTaskSumamries.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldReturnEmptyTaskSummaryListByNoResultFound() {
|
||||||
|
List<TaskSummary> expectedTaskSumamries = new ArrayList<>();
|
||||||
|
List<TaskSummary> 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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ import org.springframework.context.annotation.Scope;
|
||||||
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
|
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
|
||||||
import org.springframework.http.converter.json.SpringHandlerInstantiator;
|
import org.springframework.http.converter.json.SpringHandlerInstantiator;
|
||||||
import pro.taskana.ClassificationService;
|
import pro.taskana.ClassificationService;
|
||||||
|
import pro.taskana.SummaryService;
|
||||||
import pro.taskana.TaskService;
|
import pro.taskana.TaskService;
|
||||||
import pro.taskana.TaskanaEngine;
|
import pro.taskana.TaskanaEngine;
|
||||||
import pro.taskana.WorkbasketService;
|
import pro.taskana.WorkbasketService;
|
||||||
|
@ -46,6 +47,11 @@ public class RestApplication {
|
||||||
public WorkbasketService getWorkbasketService() throws Exception {
|
public WorkbasketService getWorkbasketService() throws Exception {
|
||||||
return getTaskanaEngine().getWorkbasketService();
|
return getTaskanaEngine().getWorkbasketService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SummaryService getSummaryService() throws Exception {
|
||||||
|
return getTaskanaEngine().getSummaryService();
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
|
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
|
||||||
|
|
|
@ -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<List<TaskSummary>> getTasksummariesByWorkbasketId(@PathVariable(value="workbasketId") String workbasketId) {
|
||||||
|
List<TaskSummary> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import pro.taskana.WorkbasketService;
|
import pro.taskana.WorkbasketService;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.exceptions.WorkbasketNotFoundException;
|
import pro.taskana.exceptions.WorkbasketNotFoundException;
|
||||||
|
@ -29,7 +30,7 @@ public class WorkbasketController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private WorkbasketService workbasketService;
|
private WorkbasketService workbasketService;
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public List<Workbasket> getWorkbaskets(@RequestParam MultiValueMap<String, String> params) {
|
public List<Workbasket> getWorkbaskets(@RequestParam MultiValueMap<String, String> params) {
|
||||||
if (params.containsKey("requiredPermission")) {
|
if (params.containsKey("requiredPermission")) {
|
||||||
|
|
|
@ -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', 'BPI2', 'PBPI2', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null);
|
INSERT INTO TASK VALUES('2', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task2', 'Lorem ipsum dolor sit amet. ', 1, 'READY', '2', '1', 'BPI2', 'PBPI2', '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', 'BPI3', 'PBPI3', 'Stefan', '3', true, 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', 'BPI3', 'PBPI3', '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', 'BPI4', 'PBPI4', 'Frank', '1', false, true, 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', 'BPI4', 'PBPI4', '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', 'BPI5', 'PBPI5', 'Stefan', '2', 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', 'BPI5', 'PBPI5', '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', 'BPI6', 'PBPI6', 'Frank', '3', 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', 'BPI6', 'PBPI6', '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', 'BPI7', 'PBPI7', 'Stefan', '1', 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', 'BPI7', 'PBPI7', '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', 'BPI8', 'PBPI8', 'Frank', '2', 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', 'BPI8', 'PBPI8', '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', 'BPI11', 'PBPI11', 'Stefan', '2', false, false, null, null, null, null, null, null, null, null, null, null, null);
|
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', 'BPI11', 'PBPI11', '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', 'BPI12', 'PBPI12', 'Frank', '3', 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', 'BPI12', 'PBPI12', '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', 'BPI13', 'PBPI13', 'Frank', '1', 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', 'BPI13', 'PBPI13', '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', 'BPI14', 'PBPI14', 'Frank', '2', 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', 'BPI14', 'PBPI14', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null);
|
||||||
|
|
Loading…
Reference in New Issue