From a33673b93a220d9c832ab5575ef587d1cdea6e63 Mon Sep 17 00:00:00 2001 From: BVier <26220150+BVier@users.noreply.github.com> Date: Wed, 29 Nov 2017 16:02:08 +0100 Subject: [PATCH 01/12] TSK15: Throw ClassificationNotFoundError and insert createManualTask --- .../pro/taskana/ClassificationService.java | 3 +- .../main/java/pro/taskana/TaskService.java | 25 ++- .../ClassificationNotFoundException.java | 12 ++ .../impl/ClassificationServiceImpl.java | 27 ++-- .../pro/taskana/impl/TaskServiceImpl.java | 151 ++++++++++++++---- .../impl/ClassificationServiceImplTest.java | 25 ++- .../pro/taskana/impl/TaskServiceImplTest.java | 93 +++++++---- ...ificationServiceImplIntAutoCommitTest.java | 27 ++-- ...ssificationServiceImplIntExplicitTest.java | 38 ++--- .../TaskServiceImplIntExplicitTest.java | 112 +++++++++++-- 10 files changed, 368 insertions(+), 145 deletions(-) create mode 100644 lib/taskana-core/src/main/java/pro/taskana/exceptions/ClassificationNotFoundException.java 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 da3e49c86..2e3b8cd5e 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java @@ -1,5 +1,6 @@ package pro.taskana; +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Classification; @@ -31,7 +32,7 @@ public interface ClassificationService { * @param domain * @return If exist: domain-specific classification, else default classification */ - Classification getClassification(String id, String domain); + Classification getClassification(String id, String domain) throws ClassificationNotFoundException; /** * Insert a new Classification. 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 356f5fad8..74def5cc2 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskService.java @@ -1,14 +1,14 @@ package pro.taskana; -import java.util.List; - +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.TaskNotFoundException; import pro.taskana.exceptions.WorkbasketNotFoundException; -import pro.taskana.model.DueWorkbasketCounter; -import pro.taskana.model.Task; -import pro.taskana.model.TaskState; -import pro.taskana.model.TaskStateCounter; +import pro.taskana.model.*; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; /** * The Task Service manages all operations on tasks. @@ -43,6 +43,19 @@ public interface TaskService { */ Task create(Task task) throws NotAuthorizedException, WorkbasketNotFoundException; + /** + * Create a task manually by filling the fields. + * @param workbasketId not null + * @param classificationId not null + * @param domain + * @param planned + * @param name + * @param description + * @param primaryObjectReference + * @param customAttributes + * @return + */ + Task createManualTask(String workbasketId, String classificationId, String domain, Timestamp planned, String name, String description, ObjectReference primaryObjectReference, Map customAttributes) throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException; /** * Get the details of a task. * @param taskId diff --git a/lib/taskana-core/src/main/java/pro/taskana/exceptions/ClassificationNotFoundException.java b/lib/taskana-core/src/main/java/pro/taskana/exceptions/ClassificationNotFoundException.java new file mode 100644 index 000000000..dc8317a90 --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/exceptions/ClassificationNotFoundException.java @@ -0,0 +1,12 @@ +package pro.taskana.exceptions; + +/** + * This exception will be thrown if a specific task is not in the database. + */ +@SuppressWarnings("serial") +public class ClassificationNotFoundException extends NotFoundException { + + public ClassificationNotFoundException(String id) { + super("Classification '" + id + "' not found"); + } +} 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 2292f838f..f53ae5394 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 @@ -3,6 +3,7 @@ package pro.taskana.impl; import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationService; import pro.taskana.TaskanaEngine; +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.impl.util.IdGenerator; import pro.taskana.model.Classification; @@ -80,13 +81,9 @@ public class ClassificationServiceImpl implements ClassificationService { taskanaEngineImpl.openConnection(); this.setDefaultValues(classification); - Classification oldClassification = this.getClassification(classification.getId(), classification.getDomain()); - - if (oldClassification == null) { - classification.setId(IdGenerator.generateWithPrefix(ID_PREFIX_CLASSIFICATION)); - classification.setCreated(Date.valueOf(LocalDate.now())); - classificationMapper.insert(classification); - } else { + Classification oldClassification = null; + try { + oldClassification = this.getClassification(classification.getId(), classification.getDomain()); // ! If you update an classification twice the same day, // the older version is valid from today until yesterday. @@ -98,8 +95,11 @@ public class ClassificationServiceImpl implements ClassificationService { classificationMapper.update(oldClassification); classificationMapper.insert(classification); } + } catch (ClassificationNotFoundException e) { + classification.setId(IdGenerator.generateWithPrefix(ID_PREFIX_CLASSIFICATION)); + classification.setCreated(Date.valueOf(LocalDate.now())); + classificationMapper.insert(classification); } - return; } finally { taskanaEngineImpl.returnConnection(); } @@ -142,15 +142,18 @@ public class ClassificationServiceImpl implements ClassificationService { } @Override - public Classification getClassification(String id, String domain) { + public Classification getClassification(String id, String domain) throws ClassificationNotFoundException { try { taskanaEngineImpl.openConnection(); Classification classification = classificationMapper.findByIdAndDomain(id, domain, CURRENT_CLASSIFICATIONS_VALID_UNTIL); if (classification == null) { - return classificationMapper.findByIdAndDomain(id, "", CURRENT_CLASSIFICATIONS_VALID_UNTIL); - } else { - return classification; + classification = classificationMapper.findByIdAndDomain(id, "", CURRENT_CLASSIFICATIONS_VALID_UNTIL); } + if (classification == null) { + throw new ClassificationNotFoundException(id); + } + return classification; + } finally { taskanaEngineImpl.returnConnection(); } 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 e0bb3defa..b21c538a6 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 @@ -1,30 +1,27 @@ package pro.taskana.impl; -import java.sql.Date; -import java.sql.Timestamp; -import java.time.LocalDate; -import java.time.LocalDateTime; -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.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.TaskNotFoundException; import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.impl.util.IdGenerator; -import pro.taskana.model.DueWorkbasketCounter; -import pro.taskana.model.ObjectReference; -import pro.taskana.model.Task; -import pro.taskana.model.TaskState; -import pro.taskana.model.TaskStateCounter; -import pro.taskana.model.WorkbasketAuthorization; +import pro.taskana.model.*; import pro.taskana.model.mappings.ObjectReferenceMapper; import pro.taskana.model.mappings.TaskMapper; +import java.sql.Date; +import java.sql.Timestamp; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + /** * This is the implementation of TaskService. */ @@ -100,24 +97,43 @@ public class TaskServiceImpl implements TaskService { taskanaEngineImpl.openConnection(); taskanaEngine.getWorkbasketService().checkAuthorization(task.getWorkbasketId(), WorkbasketAuthorization.APPEND); - Timestamp now = new Timestamp(System.currentTimeMillis()); - task.setId(IdGenerator.generateWithPrefix(ID_PREFIX_TASK)); - task.setState(TaskState.READY); - task.setCreated(now); - task.setModified(now); - task.setRead(false); - task.setTransferred(false); + standardSettings(task); - // insert ObjectReference if needed. - if (task.getPrimaryObjRef() != null) { - ObjectReference objectReference = this.objectReferenceMapper.findByObjectReference(task.getPrimaryObjRef()); - if (objectReference == null) { - objectReference = task.getPrimaryObjRef(); - objectReference.setId(IdGenerator.generateWithPrefix(ID_PREFIX_OBJECTR_EFERENCE)); - this.objectReferenceMapper.insert(objectReference); - } - task.setPrimaryObjRef(objectReference); + this.taskMapper.insert(task); + + LOGGER.debug("Task '{}' created.", task.getId()); + return task; + } finally { + taskanaEngineImpl.returnConnection(); + } + } + + @Override + public Task createManualTask(String workbasketId, String classificationId, String domain, Timestamp planned, String name, String description, ObjectReference primaryObjectReference, Map customAttributes) throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException { + try { + taskanaEngineImpl.openConnection(); + taskanaEngine.getWorkbasketService().checkAuthorization(workbasketId, WorkbasketAuthorization.APPEND); + + taskanaEngine.getWorkbasketService().getWorkbasket(workbasketId); + Classification classification = taskanaEngine.getClassificationService().getClassification(classificationId, domain); + + if (classification.getCategory() != "MANUAL") { + throw new NotAuthorizedException("You're not allowed to add a task manually to a '" + classification.getCategory() + "'- Classification!"); } + + Task task = new Task(); + + task.setWorkbasketId(workbasketId); + task.setClassification(classification); + task.setPlanned(planned); + task.setPrimaryObjRef(primaryObjectReference); + task.setCustomAttributes(customAttributes); + task.setName(name); + task.setDescription(description); + + this.standardSettings(task); + this.setCustomers(task); + this.taskMapper.insert(task); LOGGER.debug("Task '{}' created.", task.getId()); @@ -229,4 +245,81 @@ public class TaskServiceImpl implements TaskService { public TaskQuery createTaskQuery() { return new TaskQueryImpl(taskanaEngine); } + + private void standardSettings(Task task) { + Timestamp now = new Timestamp(System.currentTimeMillis()); + task.setId(IdGenerator.generateWithPrefix(ID_PREFIX_TASK)); + task.setState(TaskState.READY); + task.setCreated(now); + task.setModified(now); + task.setRead(false); + task.setTransferred(false); + + if (task.getPlanned() == null) { + task.setPlanned(now); + } + + // insert Classification specifications if Classification is given. + Classification classification = task.getClassification(); + if (classification != null) { + if (classification.getServiceLevel() != null) { + Duration serviceLevel = Duration.parse(task.getClassification().getServiceLevel()); + LocalDateTime due = task.getPlanned().toLocalDateTime().plus(serviceLevel); + task.setDue(Timestamp.valueOf(due)); + } + + if (task.getName() == null) { + task.setName(classification.getName()); + } + + if (task.getDescription() == null) { + task.setDescription(classification.getDescription()); + } + + if (task.getPriority() == 0) { + task.setPriority(classification.getPriority()); + } + } + + // insert ObjectReference if needed. + if (task.getPrimaryObjRef() != null) { + ObjectReference objectReference = this.objectReferenceMapper.findByObjectReference(task.getPrimaryObjRef()); + if (objectReference == null) { + objectReference = task.getPrimaryObjRef(); + objectReference.setId(IdGenerator.generateWithPrefix(ID_PREFIX_OBJECTR_EFERENCE)); + this.objectReferenceMapper.insert(objectReference); + } + task.setPrimaryObjRef(objectReference); + } + } + + private void setCustomers(Task task) { + if (task.getCustomAttributes() != null) { + for (String custom : task.getCustomAttributes().keySet()) { + if (task.getCustom1() == null) { + task.setCustom1(custom); + } else if (task.getCustom2() == null) { + task.setCustom2(custom); + } else if (task.getCustom3() == null) { + task.setCustom3(custom); + } else if (task.getCustom4() == null) { + task.setCustom4(custom); + } else if (task.getCustom5() == null) { + task.setCustom5(custom); + } else if (task.getCustom6() == null) { + task.setCustom6(custom); + } else if (task.getCustom7() == null) { + task.setCustom7(custom); + } else if (task.getCustom8() == null) { + task.setCustom8(custom); + } else if (task.getCustom9() == null) { + task.setCustom9(custom); + } else if (task.getCustom10() == null) { + task.setCustom10(custom); + } else { + break; + } + } + } + } } diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java index dcdb20aa0..5377b82a4 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java @@ -1,18 +1,5 @@ package pro.taskana.impl; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.sql.Date; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,11 +7,19 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; - +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.model.Classification; import pro.taskana.model.mappings.ClassificationMapper; +import java.sql.Date; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + /** * Unit Test for ClassificationServiceImpl. * @author EH @@ -43,7 +38,7 @@ public class ClassificationServiceImplTest { TaskanaEngineImpl taskanaEngineImpl; @Test - public void testAddClassification() { + public void testAddClassification() throws ClassificationNotFoundException { doNothing().when(classificationMapper).insert(any()); Classification classification = new Classification(); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java index 6e3a4c95c..18fdb7d3f 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java @@ -1,24 +1,5 @@ package pro.taskana.impl; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.hamcrest.core.IsNot.not; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.any; -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.sql.Date; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -27,22 +8,30 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.junit.MockitoJUnitRunner; - +import pro.taskana.ClassificationService; import pro.taskana.WorkbasketService; import pro.taskana.configuration.TaskanaEngineConfiguration; +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.TaskNotFoundException; import pro.taskana.exceptions.WorkbasketNotFoundException; -import pro.taskana.model.DueWorkbasketCounter; -import pro.taskana.model.ObjectReference; -import pro.taskana.model.Task; -import pro.taskana.model.TaskState; -import pro.taskana.model.TaskStateCounter; -import pro.taskana.model.Workbasket; -import pro.taskana.model.WorkbasketAuthorization; +import pro.taskana.model.*; import pro.taskana.model.mappings.ObjectReferenceMapper; import pro.taskana.model.mappings.TaskMapper; +import java.sql.Date; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + /** * Unit Test for TaskServiceImpl. * @author EH @@ -73,11 +62,14 @@ public class TaskServiceImplTest { @Mock private WorkbasketService workbasketServiceMock; + @Mock + private ClassificationService classificationServiceMock; @Before public void setup() { MockitoAnnotations.initMocks(this); doReturn(workbasketServiceMock).when(taskanaEngineMock).getWorkbasketService(); + doReturn(classificationServiceMock).when(taskanaEngineMock).getClassificationService(); try { Mockito.doNothing().when(workbasketServiceMock).checkAuthorization(any(), any()); } catch (NotAuthorizedException e) { @@ -179,6 +171,53 @@ public class TaskServiceImplTest { assertThat(actualTask.getPrimaryObjRef(), equalTo(expectedObjectReference)); } + @Test + public void testCreateManualTask() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException { + ObjectReference expectedObjectReference = new ObjectReference(); + expectedObjectReference.setId("1"); + expectedObjectReference.setType("DUMMY"); + + Workbasket workbasket = new Workbasket(); + Classification classification = new Classification(); + classification.setName("Name"); + classification.setCategory("MANUAL"); + + Mockito.doReturn(classification).when(classificationServiceMock).getClassification(any(), any()); + Mockito.doNothing().when(taskMapperMock).insert(any()); + Mockito.doNothing().when(objectReferenceMapperMock).insert(any()); + + Task manualTask = cut.createManualTask("workbasketId", "classification", "domain", null, null, "simply awesome task", expectedObjectReference, null); + + Task manualTask2 = cut.createManualTask("workbasketId", "classification", "domain", Timestamp.valueOf(LocalDateTime.now().minusHours(1)), "Task2", "simply awesome task", expectedObjectReference, null); + + verify(taskanaEngineImpl, times(2)).openConnection(); + verify(taskanaEngineMock, times(2 + 2)).getWorkbasketService(); + verify(taskanaEngineMock, times(2)).getClassificationService(); + verify(workbasketServiceMock, times(2)).checkAuthorization(any(), any()); + verify(workbasketServiceMock, times(2)).getWorkbasket(any()); + verify(objectReferenceMapperMock, times(2)).findByObjectReference(any()); + verify(objectReferenceMapperMock, times(2)).insert(any()); + verify(taskMapperMock, times(1)).insert(manualTask); + verify(taskMapperMock, times(1)).insert(manualTask2); + verify(taskanaEngineImpl, times(2)).returnConnection(); + verifyNoMoreInteractions(taskanaEngineConfigurationMock, taskanaEngineMock, taskanaEngineImpl, + taskMapperMock, objectReferenceMapperMock, workbasketServiceMock); + + assertNull(manualTask.getOwner()); + assertNotNull(manualTask.getCreated()); + assertNotNull(manualTask.getModified()); + assertNull(manualTask.getCompleted()); + assertNull(manualTask.getDue()); + assertThat(manualTask.getWorkbasketId(), equalTo(manualTask2.getWorkbasketId())); + assertThat(manualTask.getName(), equalTo(classification.getName())); + assertThat(manualTask.getState(), equalTo(TaskState.READY)); + assertThat(manualTask.getPrimaryObjRef(), equalTo(expectedObjectReference)); + assertThat(manualTask.getName(), not(manualTask2.getName())); + assertThat(manualTask.getPlanned(), not(manualTask2.getPlanned())); + assertThat(manualTask2.getPlanned(), not(manualTask2.getCreated())); + + } + @Test(expected = NotAuthorizedException.class) public void testCreateThrowingAuthorizedOnWorkbasket() throws NotAuthorizedException, WorkbasketNotFoundException { try { diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java index 616dd772f..10ef3b9d9 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java @@ -1,31 +1,26 @@ package pro.taskana.impl.integration; -import java.io.FileNotFoundException; -import java.sql.Date; -import java.sql.SQLException; -import java.time.LocalDate; -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.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - +import org.junit.*; import pro.taskana.ClassificationService; import pro.taskana.TaskanaEngine; import pro.taskana.TaskanaEngine.ConnectionManagementMode; import pro.taskana.configuration.TaskanaEngineConfiguration; +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.impl.TaskanaEngineImpl; import pro.taskana.impl.configuration.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.model.Classification; +import javax.security.auth.login.LoginException; +import javax.sql.DataSource; +import java.io.FileNotFoundException; +import java.sql.Date; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.List; + /** * Integration Test for ClassificationServiceImpl with connection management mode AUTOCOMMIT. * @author EH @@ -59,7 +54,7 @@ public class ClassificationServiceImplIntAutoCommitTest { } @Test - public void testInsertClassification() { + public void testInsertClassification() throws ClassificationNotFoundException { Classification classification = new Classification(); classificationService.addClassification(classification); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java index bf9e2894e..061dff863 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java @@ -1,5 +1,20 @@ package pro.taskana.impl.integration; +import org.h2.store.fs.FileUtils; +import org.junit.*; +import pro.taskana.ClassificationService; +import pro.taskana.TaskanaEngine; +import pro.taskana.TaskanaEngine.ConnectionManagementMode; +import pro.taskana.configuration.TaskanaEngineConfiguration; +import pro.taskana.exceptions.ClassificationNotFoundException; +import pro.taskana.exceptions.NotAuthorizedException; +import pro.taskana.impl.TaskanaEngineImpl; +import pro.taskana.impl.configuration.DBCleaner; +import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; +import pro.taskana.model.Classification; + +import javax.security.auth.login.LoginException; +import javax.sql.DataSource; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.Date; @@ -7,27 +22,6 @@ import java.sql.SQLException; import java.time.LocalDate; import java.util.List; -import javax.security.auth.login.LoginException; -import javax.sql.DataSource; - -import org.h2.store.fs.FileUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import pro.taskana.ClassificationService; -import pro.taskana.TaskanaEngine; -import pro.taskana.TaskanaEngine.ConnectionManagementMode; -import pro.taskana.configuration.TaskanaEngineConfiguration; -import pro.taskana.exceptions.NotAuthorizedException; -import pro.taskana.impl.TaskanaEngineImpl; -import pro.taskana.impl.configuration.DBCleaner; -import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; -import pro.taskana.model.Classification; - /** * Integration Test for ClassificationServiceImpl with connection management mode EXPLICIT. * @author BBR @@ -62,7 +56,7 @@ public class ClassificationServiceImplIntExplicitTest { } @Test - public void testInsertClassification() throws SQLException { + public void testInsertClassification() throws SQLException, ClassificationNotFoundException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); 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 292215cf2..2826c09c0 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 @@ -1,26 +1,13 @@ package pro.taskana.impl.integration; -import java.io.FileNotFoundException; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.List; - -import javax.security.auth.login.LoginException; -import javax.sql.DataSource; - import org.h2.store.fs.FileUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - +import org.junit.*; import pro.taskana.ClassificationQuery; import pro.taskana.ObjectReferenceQuery; import pro.taskana.TaskanaEngine; import pro.taskana.TaskanaEngine.ConnectionManagementMode; import pro.taskana.configuration.TaskanaEngineConfiguration; +import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.TaskNotFoundException; import pro.taskana.exceptions.WorkbasketNotFoundException; @@ -31,8 +18,18 @@ import pro.taskana.impl.TaskanaEngineImpl; import pro.taskana.impl.configuration.DBCleaner; 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.model.*; + +import javax.security.auth.login.LoginException; +import javax.sql.DataSource; +import java.io.FileNotFoundException; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Integration Test for TaskServiceImpl transactions with connection management mode EXPLICIT. @@ -126,6 +123,87 @@ public class TaskServiceImplIntExplicitTest { te.setConnection(null); } + @Test + public void testCreateManualTask() throws SQLException, NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException { + Connection connection = dataSource.getConnection(); + taskanaEngineImpl.setConnection(connection); + + Workbasket workbasket = new Workbasket(); + workbasket.setName("workbasket1"); + taskanaEngine.getWorkbasketService().createWorkbasket(workbasket); + + Classification classification = new Classification(); + classification.setDomain("domain"); + classification.setCategory("MANUAL"); + classification.setName("classification name"); + classification.setServiceLevel("P1D"); + taskanaEngine.getClassificationService().addClassification(classification); + + ObjectReference objectReference = new ObjectReference(); + objectReference.setCompany("Novatec"); + objectReference.setSystem("System"); + objectReference.setSystemInstance("2"); + objectReference.setValue("4444"); + objectReference.setType("type"); + + Task test = taskServiceImpl.createManualTask(workbasket.getId(), classification.getId(), "domain", null, "Name", null, objectReference, null); + + Assert.assertEquals(test.getPlanned(), test.getCreated()); + Assert.assertNotNull(test.getDue()); + + Timestamp tomorrow = Timestamp.valueOf(LocalDateTime.now().plusDays(1)); + Map customs = new HashMap(); + customs.put("Daimler", "Tons of money. And cars. And gold."); + customs.put("Audi", 2); + + Task test2 = taskServiceImpl.createManualTask(workbasket.getId(), classification.getId(), "domain", tomorrow, "Name2", "desc", objectReference, customs); + + Assert.assertEquals(test.getClassification().getId(), test2.getClassification().getId()); + Assert.assertTrue(test.getDue().before(test2.getDue())); + } + + @Test(expected = WorkbasketNotFoundException.class) + public void createManualTaskShouldThrowWorkbasketNotFoundException() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException, SQLException { + Connection connection = dataSource.getConnection(); + taskanaEngineImpl.setConnection(connection); + + Workbasket workbasket = new Workbasket(); + workbasket.setName("wb"); + taskanaEngine.getWorkbasketService().createWorkbasket(workbasket); + + taskServiceImpl.createManualTask("1", "classification", "domain", null, null, null, null, null); + } + + @Test(expected = ClassificationNotFoundException.class) + public void createManualTaskShouldThrowClassificationNotFoundException() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException, SQLException { + Connection connection = dataSource.getConnection(); + taskanaEngineImpl.setConnection(connection); + + Workbasket workbasket = new Workbasket(); + workbasket.setName("wb"); + taskanaEngine.getWorkbasketService().createWorkbasket(workbasket); + + Classification classification = new Classification(); + taskanaEngine.getClassificationService().addClassification(classification); + + taskServiceImpl.createManualTask(workbasket.getId(), "classification", "domain", null, null, null, null, null); + } + + @Test(expected = NotAuthorizedException.class) + public void createManualTaskShouldThrowNotAuthorizedException() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException, SQLException { + Connection connection = dataSource.getConnection(); + taskanaEngineImpl.setConnection(connection); + + Workbasket workbasket = new Workbasket(); + workbasket.setName("wb"); + taskanaEngine.getWorkbasketService().createWorkbasket(workbasket); + + Classification classification = new Classification(); + taskanaEngine.getClassificationService().addClassification(classification); + + taskServiceImpl.createManualTask(workbasket.getId(), classification.getId(), "domain", null, null, null, null, null); + } + @Test public void should_ReturnList_when_BuilderIsUsed() throws SQLException, NotAuthorizedException, WorkbasketNotFoundException { From fa231750117bbb8cabe861d2b0fcad4e32423194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Kl=C3=A4ger?= Date: Wed, 29 Nov 2017 08:55:05 +0100 Subject: [PATCH 02/12] TSK-43 Add businessProcessId and parentBusinessProcessId to Task and TaskMapper --- .../src/main/java/pro/taskana/model/Task.java | 18 ++++++++++++++++++ .../pro/taskana/model/mappings/TaskMapper.java | 8 +++++--- .../src/main/resources/sql/taskana-schema.sql | 2 ++ .../pro/taskana/impl/TaskServiceImplTest.java | 1 - 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/Task.java b/lib/taskana-core/src/main/java/pro/taskana/model/Task.java index 3db15b472..fd08e21bc 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/Task.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/Task.java @@ -22,6 +22,8 @@ public class Task { private TaskState state; private Classification classification; private String workbasketId; + private String businessProcessId; + private String parentBusinessProcessId; private String owner; private ObjectReference primaryObjRef; private boolean isRead; @@ -143,6 +145,22 @@ public class Task { this.workbasketId = workbasketId; } + public String getBusinessProcessId() { + return businessProcessId; + } + + public void setBusinessProcessId(String businessProcessId) { + this.businessProcessId = businessProcessId; + } + + public String getParentBusinessProcessId() { + return parentBusinessProcessId; + } + + public void setParentBusinessProcessId(String parentBusinessProcessId) { + this.parentBusinessProcessId = parentBusinessProcessId; + } + public String getOwner() { return owner; } diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java index e14acab81..e4ddf80c2 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java @@ -34,6 +34,8 @@ public interface TaskMapper { @Result(property = "state", column = "STATE"), @Result(property = "classification", column = "CLASSIFICATION_ID", javaType = Classification.class, one = @One(select = CLASSIFICATION_FINDBYID)), @Result(property = "workbasketId", column = "WORKBASKETID"), + @Result(property = "businessProcessId", column = "BUSINESS_PROCESS_ID"), + @Result(property = "parentBusinessProcessId", column = "PARENT_BUSINESS_PROCESS_ID"), @Result(property = "owner", column = "OWNER"), @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)), @Result(property = "isRead", column = "IS_READ"), @@ -82,12 +84,12 @@ public interface TaskMapper { @Result(column = "counter", property = "taskCounter") }) List getTaskCountByWorkbasketIdAndDaysInPastAndState(@Param("fromDate") Date fromDate, @Param("status") List states); - @Insert("INSERT INTO TASK(ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, CLASSIFICATION_ID, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, CUSTOM_5, CUSTOM_6, CUSTOM_7, CUSTOM_8, CUSTOM_9, CUSTOM_10) " - + "VALUES(#{id}, #{created}, #{claimed}, #{completed}, #{modified}, #{planned}, #{due}, #{name}, #{description}, #{priority}, #{state}, #{classification.id}, #{workbasketId}, #{owner}, #{primaryObjRef.id}, #{isRead}, #{isTransferred}, #{customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=pro.taskana.impl.persistence.MapTypeHandler}, #{custom1}, #{custom2}, #{custom3}, #{custom4}, #{custom5}, #{custom6}, #{custom7}, #{custom8}, #{custom9}, #{custom10})") + @Insert("INSERT INTO TASK(ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, CLASSIFICATION_ID, WORKBASKETID, BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, CUSTOM_5, CUSTOM_6, CUSTOM_7, CUSTOM_8, CUSTOM_9, CUSTOM_10) " + + "VALUES(#{id}, #{created}, #{claimed}, #{completed}, #{modified}, #{planned}, #{due}, #{name}, #{description}, #{priority}, #{state}, #{classification.id}, #{workbasketId}, #{businessProcessId}, #{parentBusinessProcessId}, #{owner}, #{primaryObjRef.id}, #{isRead}, #{isTransferred}, #{customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=pro.taskana.impl.persistence.MapTypeHandler}, #{custom1}, #{custom2}, #{custom3}, #{custom4}, #{custom5}, #{custom6}, #{custom7}, #{custom8}, #{custom9}, #{custom10})") @Options(keyProperty = "id", keyColumn = "ID") void insert(Task task); - @Update("UPDATE TASK SET CLAIMED = #{claimed}, COMPLETED = #{completed}, MODIFIED = #{modified}, PLANNED = #{planned}, DUE = #{due}, NAME = #{name}, DESCRIPTION = #{description}, PRIORITY = #{priority}, STATE = #{state}, CLASSIFICATION_ID = #{classification.id}, WORKBASKETID = #{workbasketId}, OWNER = #{owner}, PRIMARY_OBJ_REF_ID = #{primaryObjRef.id}, IS_READ = #{isRead}, IS_TRANSFERRED = #{isTransferred}, CUSTOM_ATTRIBUTES = #{customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=pro.taskana.impl.persistence.MapTypeHandler}, CUSTOM_1 = #{custom1}, CUSTOM_2 = #{custom2}, CUSTOM_3 = #{custom3}, CUSTOM_4 = #{custom4}, CUSTOM_5 = #{custom5}, CUSTOM_6 = #{custom6}, CUSTOM_7 = #{custom7}, CUSTOM_8 = #{custom8}, CUSTOM_9 = #{custom9}, CUSTOM_10 = #{custom10} " + @Update("UPDATE TASK SET CLAIMED = #{claimed}, COMPLETED = #{completed}, MODIFIED = #{modified}, PLANNED = #{planned}, DUE = #{due}, NAME = #{name}, DESCRIPTION = #{description}, PRIORITY = #{priority}, STATE = #{state}, CLASSIFICATION_ID = #{classification.id}, WORKBASKETID = #{workbasketId}, BUSINESS_PROCESS_ID = #{businessProcessId}, PARENT_BUSINESS_PROCESS_ID = #{parentBusinessProcessId}, OWNER = #{owner}, PRIMARY_OBJ_REF_ID = #{primaryObjRef.id}, IS_READ = #{isRead}, IS_TRANSFERRED = #{isTransferred}, CUSTOM_ATTRIBUTES = #{customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=pro.taskana.impl.persistence.MapTypeHandler}, CUSTOM_1 = #{custom1}, CUSTOM_2 = #{custom2}, CUSTOM_3 = #{custom3}, CUSTOM_4 = #{custom4}, CUSTOM_5 = #{custom5}, CUSTOM_6 = #{custom6}, CUSTOM_7 = #{custom7}, CUSTOM_8 = #{custom8}, CUSTOM_9 = #{custom9}, CUSTOM_10 = #{custom10} " + "WHERE ID = #{id}") void update(Task task); diff --git a/lib/taskana-core/src/main/resources/sql/taskana-schema.sql b/lib/taskana-core/src/main/resources/sql/taskana-schema.sql index b8d5acdd0..5fe69ac83 100644 --- a/lib/taskana-core/src/main/resources/sql/taskana-schema.sql +++ b/lib/taskana-core/src/main/resources/sql/taskana-schema.sql @@ -19,6 +19,8 @@ CREATE TABLE TASK ( STATE VARCHAR(20) NULL, CLASSIFICATION_ID CHAR(40) NULL, WORKBASKETID CHAR(40) NULL, + BUSINESS_PROCESS_ID VARCHAR(128) NULL, + PARENT_BUSINESS_PROCESS_ID VARCHAR(128) NULL, OWNER VARCHAR(255) NULL, PRIMARY_OBJ_REF_ID CHAR(40) NULL, IS_READ BOOLEAN NOT NULL, diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java index 18fdb7d3f..3230e662d 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java @@ -177,7 +177,6 @@ public class TaskServiceImplTest { expectedObjectReference.setId("1"); expectedObjectReference.setType("DUMMY"); - Workbasket workbasket = new Workbasket(); Classification classification = new Classification(); classification.setName("Name"); classification.setCategory("MANUAL"); From d820cf07fa2988d38deb43ab405cec7a796f4f3e Mon Sep 17 00:00:00 2001 From: Marcel Lengl <52546181+LenglBoy@users.noreply.github.com> Date: Wed, 29 Nov 2017 16:19:17 +0100 Subject: [PATCH 03/12] Added select statement to taskMapper, added new service-method, added it to rest-project and tested with authentification. --- .../main/java/pro/taskana/TaskService.java | 12 +++++++ .../pro/taskana/impl/TaskServiceImpl.java | 13 +++++++ .../taskana/model/mappings/TaskMapper.java | 35 +++++++++++++++++++ .../java/pro/taskana/rest/TaskController.java | 17 +++++++++ .../taskana/rest/WorkbasketController.java | 2 +- 5 files changed, 78 insertions(+), 1 deletion(-) 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 74def5cc2..2bda62b31 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskService.java @@ -110,4 +110,16 @@ public interface TaskService { */ TaskQuery createTaskQuery(); + /** + * Getting a list of all Tasks which got matching workbasketIds and states. + * + * @param workbasketId where the tasks need to be in. + * @param taskState which is required for the request, + * @return a filled/empty list of tasks with attributes which are matching given params. + * + * @throws WorkbasketNotFoundException if the workbasketId can“t be resolved to a existing workbasket. + * @throws NotAuthorizedException if the current user got no rights for reading on this workbasket. + * @throws Exception if no result can be found by @{link TaskMapper}. + */ + List getTasksByWorkbasketIdAndState(String workbasketId, TaskState taskState) throws WorkbasketNotFoundException, NotAuthorizedException, Exception; } 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 b21c538a6..26915aad4 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 @@ -1,5 +1,6 @@ package pro.taskana.impl; +import java.util.ArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pro.taskana.TaskQuery; @@ -245,6 +246,18 @@ public class TaskServiceImpl implements TaskService { public TaskQuery createTaskQuery() { return new TaskQueryImpl(taskanaEngine); } + @Override + public List getTasksByWorkbasketIdAndState(String workbasketId, TaskState taskState) throws WorkbasketNotFoundException, NotAuthorizedException, Exception { + List resultList = null; + try { + taskanaEngineImpl.openConnection(); + taskanaEngine.getWorkbasketService().checkAuthorization(workbasketId, WorkbasketAuthorization.READ); + resultList = taskMapper.findTasksByWorkbasketIdAndState(workbasketId, taskState); + } finally { + taskanaEngineImpl.returnConnection(); + } + return (resultList == null) ? new ArrayList<>() : resultList; + } private void standardSettings(Task task) { Timestamp now = new Timestamp(System.currentTimeMillis()); diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java index e4ddf80c2..8acd1adfc 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java @@ -96,4 +96,39 @@ public interface TaskMapper { @Delete("DELETE FROM TASK WHERE ID = #{id}") void delete(String id); + @Select("SELECT ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, CLASSIFICATION_ID, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, CUSTOM_5, CUSTOM_6, CUSTOM_7, CUSTOM_8, CUSTOM_9, CUSTOM_10 " + + "FROM TASK " + + "WHERE WORKBASKETID = #{workbasketId} " + + "AND STATE = #{taskState}") + @Results(value = { + @Result(property = "id", column = "ID"), + @Result(property = "created", column = "CREATED"), + @Result(property = "claimed", column = "CLAIMED"), + @Result(property = "completed", column = "COMPLETED"), + @Result(property = "modified", column = "MODIFIED"), + @Result(property = "planned", column = "PLANNED"), + @Result(property = "due", column = "DUE"), + @Result(property = "name", column = "NAME"), + @Result(property = "description", column = "DESCRIPTION"), + @Result(property = "priority", column = "PRIORITY"), + @Result(property = "state", column = "STATE"), + @Result(property = "classification", column = "CLASSIFICATION_ID", javaType = Classification.class, one = @One(select = CLASSIFICATION_FINDBYID)), + @Result(property = "workbasketId", column = "WORKBASKETID"), + @Result(property = "owner", column = "OWNER"), + @Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select = OBJECTREFERENCEMAPPER_FINDBYID)), + @Result(property = "isRead", column = "IS_READ"), + @Result(property = "isTransferred", column = "IS_TRANSFERRED"), + @Result(property = "customAttributes", column = "CUSTOM_ATTRIBUTES", jdbcType = JdbcType.BLOB, javaType = Map.class, typeHandler = MapTypeHandler.class), + @Result(property = "custom1", column = "CUSTOM_1"), + @Result(property = "custom2", column = "CUSTOM_2"), + @Result(property = "custom3", column = "CUSTOM_3"), + @Result(property = "custom4", column = "CUSTOM_4"), + @Result(property = "custom5", column = "CUSTOM_5"), + @Result(property = "custom6", column = "CUSTOM_6"), + @Result(property = "custom7", column = "CUSTOM_7"), + @Result(property = "custom8", column = "CUSTOM_8"), + @Result(property = "custom9", column = "CUSTOM_9"), + @Result(property = "custom10", column = "CUSTOM_10") + }) + List findTasksByWorkbasketIdAndState(@Param("workbasketId") String workbasketId, @Param("taskState") TaskState taskState); } diff --git a/rest/src/main/java/pro/taskana/rest/TaskController.java b/rest/src/main/java/pro/taskana/rest/TaskController.java index 1c2e61df6..ab10ad7a8 100644 --- a/rest/src/main/java/pro/taskana/rest/TaskController.java +++ b/rest/src/main/java/pro/taskana/rest/TaskController.java @@ -21,7 +21,9 @@ import org.springframework.web.bind.annotation.RestController; import pro.taskana.TaskService; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.TaskNotFoundException; +import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.model.Task; +import pro.taskana.model.TaskState; import pro.taskana.rest.query.TaskFilter; @RestController @@ -62,6 +64,21 @@ public class TaskController { } } + @RequestMapping(value = "/workbasket/{workbasketId}/state/{taskState}") + public ResponseEntity> getTasksByWorkbasketIdAndState( + @PathVariable(value = "workbasketId") String workbasketId, @PathVariable(value = "taskState") TaskState taskState) { + try { + List taskList = taskService.getTasksByWorkbasketIdAndState(workbasketId, taskState); + return ResponseEntity.status(HttpStatus.OK).body(taskList); + } catch (WorkbasketNotFoundException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } catch (NotAuthorizedException e) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + @RequestMapping(method = RequestMethod.POST, value = "/{taskId}/claim") public ResponseEntity claimTask(@PathVariable String taskId, @RequestBody String userName) { // TODO verify user diff --git a/rest/src/main/java/pro/taskana/rest/WorkbasketController.java b/rest/src/main/java/pro/taskana/rest/WorkbasketController.java index fe5500d6e..aec1af8c3 100644 --- a/rest/src/main/java/pro/taskana/rest/WorkbasketController.java +++ b/rest/src/main/java/pro/taskana/rest/WorkbasketController.java @@ -71,7 +71,7 @@ public class WorkbasketController { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } - + @RequestMapping(method = RequestMethod.POST) public ResponseEntity createWorkbasket(@RequestBody Workbasket workbasket) { Workbasket createdWorkbasket = workbasketService.createWorkbasket(workbasket); From 18c4c966e61cfa8641d6013a5f1c5f9f9e7c7dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Kl=C3=A4ger?= Date: Wed, 29 Nov 2017 08:55:05 +0100 Subject: [PATCH 04/12] TSK-43 Add businessProcessId and parentBusinessProcessId to Task and update TaskMapper as well as task.sql --- .../pro/taskana/impl/TaskServiceImpl.java | 6 ++++ .../src/main/java/pro/taskana/model/Task.java | 2 ++ .../taskana/model/mappings/TaskMapper.java | 2 +- .../pro/taskana/impl/TaskServiceImplTest.java | 2 ++ .../main/resources/sql/sample-data/task.sql | 28 +++++++++---------- 5 files changed, 25 insertions(+), 15 deletions(-) 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 26915aad4..3195f8480 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 @@ -32,6 +32,7 @@ public class TaskServiceImpl implements TaskService { private static final String ID_PREFIX_OBJECTR_EFERENCE = "ORI"; private static final String ID_PREFIX_TASK = "TKI"; + private static final String ID_PREFIX_BUSINESS_PROCESS = "BPI"; private TaskanaEngine taskanaEngine; private TaskanaEngineImpl taskanaEngineImpl; @@ -100,6 +101,11 @@ public class TaskServiceImpl implements TaskService { standardSettings(task); + // if no business process id is provided, a unique id is created. + if (task.getBusinessProcessId() == null) { + task.setBusinessProcessId(IdGenerator.generateWithPrefix(ID_PREFIX_BUSINESS_PROCESS)); + } + this.taskMapper.insert(task); LOGGER.debug("Task '{}' created.", task.getId()); diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/Task.java b/lib/taskana-core/src/main/java/pro/taskana/model/Task.java index fd08e21bc..400364842 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/Task.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/Task.java @@ -297,6 +297,8 @@ public class Task { sb.append(", state=" + state); sb.append(", classification=" + classification); sb.append(", workbasketId=" + workbasketId); + sb.append(", businessProcessId=" + businessProcessId); + sb.append(", parentBusinessProcessId=" + parentBusinessProcessId); sb.append(", owner=" + owner); sb.append(", primaryObjRef=" + primaryObjRef); sb.append(", isRead=" + isRead); diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java index 8acd1adfc..12df0b9e1 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java @@ -17,7 +17,7 @@ public interface TaskMapper { String OBJECTREFERENCEMAPPER_FINDBYID = "pro.taskana.model.mappings.ObjectReferenceMapper.findById"; String CLASSIFICATION_FINDBYID = "pro.taskana.model.mappings.ClassificationMapper.findById"; - @Select("SELECT ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, CLASSIFICATION_ID, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, CUSTOM_5, CUSTOM_6, CUSTOM_7, CUSTOM_8, CUSTOM_9, CUSTOM_10 " + @Select("SELECT ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, CLASSIFICATION_ID, WORKBASKETID, BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED, CUSTOM_ATTRIBUTES, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, CUSTOM_5, CUSTOM_6, CUSTOM_7, CUSTOM_8, CUSTOM_9, CUSTOM_10 " + "FROM TASK " + "WHERE ID = #{id}") @Results(value = { diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java index 3230e662d..9a2f8c7b1 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java @@ -223,6 +223,8 @@ public class TaskServiceImplTest { Mockito.doThrow(NotAuthorizedException.class).when(workbasketServiceMock).checkAuthorization(any(), any()); Task task = new Task(); task.setWorkbasketId("1"); + task.setBusinessProcessId("BPI1"); + task.setParentBusinessProcessId("PBPI1"); cut.create(task); } catch (Exception e) { diff --git a/rest/src/main/resources/sql/sample-data/task.sql b/rest/src/main/resources/sql/sample-data/task.sql index c1ef36074..ab9ebd2cb 100644 --- a/rest/src/main/resources/sql/sample-data/task.sql +++ b/rest/src/main/resources/sql/sample-data/task.sql @@ -1,16 +1,16 @@ -INSERT INTO TASK VALUES('1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, 'Task1', 'Lorem ipsum dolor sit amet.', 1, 'READY', '1', '1', 'Stefan', '1', true, 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', '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', '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('1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, 'Task1', 'Lorem ipsum dolor sit amet.', 1, 'READY', '1', '1', 'BPI1', 'PBPI1', 'Stefan', '1', true, 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('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', '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', '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', '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); -INSERT INTO TASK VALUES('9', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task9', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', '1', '2', 'Stefan', '3', true, false, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO TASK VALUES('10', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task10', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', '2', '2', 'Frank', '1', 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', '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('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('9', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task9', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', '1', '2', 'BPI9', 'PBPI9', 'Stefan', '3', true, false, null, null, null, null, null, null, null, null, null, null, null); +INSERT INTO TASK VALUES('10', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task10', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', '2', '2', 'BPI10', 'PBPI10', 'Frank', '1', 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('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); +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', '14', '1', 'BPI14', 'PBPI14', 'Frank', '2', false, false, null, null, null, null, null, null, null, null, null, null, null); From 650fcfde4da4c6ce23a13966f16139b459721b42 Mon Sep 17 00:00:00 2001 From: BVier <26220150+BVier@users.noreply.github.com> Date: Wed, 29 Nov 2017 16:02:08 +0100 Subject: [PATCH 05/12] TSK15: Throw ClassificationNotFoundError and insert createManualTask --- .../pro/taskana/impl/TaskServiceImpl.java | 78 +++++++++++++++++++ .../pro/taskana/impl/TaskServiceImplTest.java | 47 +++++++++++ 2 files changed, 125 insertions(+) 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 3195f8480..339316fca 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 @@ -263,6 +263,84 @@ public class TaskServiceImpl implements TaskService { taskanaEngineImpl.returnConnection(); } return (resultList == null) ? new ArrayList<>() : resultList; + } + + private void standardSettings(Task task) { + Timestamp now = new Timestamp(System.currentTimeMillis()); + task.setId(IdGenerator.generateWithPrefix(ID_PREFIX_TASK)); + task.setState(TaskState.READY); + task.setCreated(now); + task.setModified(now); + task.setRead(false); + task.setTransferred(false); + + if (task.getPlanned() == null) { + task.setPlanned(now); + } + + + // insert Classification specifications if Classification is given. + Classification classification = task.getClassification(); + if (classification != null) { + if (classification.getServiceLevel() != null) { + Duration serviceLevel = Duration.parse(task.getClassification().getServiceLevel()); + LocalDateTime due = task.getPlanned().toLocalDateTime().plus(serviceLevel); + task.setDue(Timestamp.valueOf(due)); + } + + if (task.getName() == null) { + task.setName(classification.getName()); + } + + if (task.getDescription() == null) { + task.setDescription(classification.getDescription()); + } + + if (task.getPriority() == 0) { + task.setPriority(classification.getPriority()); + } + } + + // insert ObjectReference if needed. + if (task.getPrimaryObjRef() != null) { + ObjectReference objectReference = this.objectReferenceMapper.findByObjectReference(task.getPrimaryObjRef()); + if (objectReference == null) { + objectReference = task.getPrimaryObjRef(); + objectReference.setId(IdGenerator.generateWithPrefix(ID_PREFIX_OBJECTR_EFERENCE)); + this.objectReferenceMapper.insert(objectReference); + } + task.setPrimaryObjRef(objectReference); + } + } + + private void setCustomers(Task task) { + if (task.getCustomAttributes() != null) { + for (String custom : task.getCustomAttributes().keySet()) { + if (task.getCustom1() == null) { + task.setCustom1(custom); + } else if (task.getCustom2() == null) { + task.setCustom2(custom); + } else if (task.getCustom3() == null) { + task.setCustom3(custom); + } else if (task.getCustom4() == null) { + task.setCustom4(custom); + } else if (task.getCustom5() == null) { + task.setCustom5(custom); + } else if (task.getCustom6() == null) { + task.setCustom6(custom); + } else if (task.getCustom7() == null) { + task.setCustom7(custom); + } else if (task.getCustom8() == null) { + task.setCustom8(custom); + } else if (task.getCustom9() == null) { + task.setCustom9(custom); + } else if (task.getCustom10() == null) { + task.setCustom10(custom); + } else { + break; + } + } + } } private void standardSettings(Task task) { diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java index 9a2f8c7b1..c4edda8a1 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java @@ -171,6 +171,53 @@ public class TaskServiceImplTest { assertThat(actualTask.getPrimaryObjRef(), equalTo(expectedObjectReference)); } + @Test + public void testCreateManualTask() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException { + ObjectReference expectedObjectReference = new ObjectReference(); + expectedObjectReference.setId("1"); + expectedObjectReference.setType("DUMMY"); + + Workbasket workbasket = new Workbasket(); + Classification classification = new Classification(); + classification.setName("Name"); + classification.setCategory("MANUAL"); + + Mockito.doReturn(classification).when(classificationServiceMock).getClassification(any(), any()); + Mockito.doNothing().when(taskMapperMock).insert(any()); + Mockito.doNothing().when(objectReferenceMapperMock).insert(any()); + + Task manualTask = cut.createManualTask("workbasketId", "classification", "domain", null, null, "simply awesome task", expectedObjectReference, null); + + Task manualTask2 = cut.createManualTask("workbasketId", "classification", "domain", Timestamp.valueOf(LocalDateTime.now().minusHours(1)), "Task2", "simply awesome task", expectedObjectReference, null); + + verify(taskanaEngineImpl, times(2)).openConnection(); + verify(taskanaEngineMock, times(2 + 2)).getWorkbasketService(); + verify(taskanaEngineMock, times(2)).getClassificationService(); + verify(workbasketServiceMock, times(2)).checkAuthorization(any(), any()); + verify(workbasketServiceMock, times(2)).getWorkbasket(any()); + verify(objectReferenceMapperMock, times(2)).findByObjectReference(any()); + verify(objectReferenceMapperMock, times(2)).insert(any()); + verify(taskMapperMock, times(1)).insert(manualTask); + verify(taskMapperMock, times(1)).insert(manualTask2); + verify(taskanaEngineImpl, times(2)).returnConnection(); + verifyNoMoreInteractions(taskanaEngineConfigurationMock, taskanaEngineMock, taskanaEngineImpl, + taskMapperMock, objectReferenceMapperMock, workbasketServiceMock); + + assertNull(manualTask.getOwner()); + assertNotNull(manualTask.getCreated()); + assertNotNull(manualTask.getModified()); + assertNull(manualTask.getCompleted()); + assertNull(manualTask.getDue()); + assertThat(manualTask.getWorkbasketId(), equalTo(manualTask2.getWorkbasketId())); + assertThat(manualTask.getName(), equalTo(classification.getName())); + assertThat(manualTask.getState(), equalTo(TaskState.READY)); + assertThat(manualTask.getPrimaryObjRef(), equalTo(expectedObjectReference)); + assertThat(manualTask.getName(), not(manualTask2.getName())); + assertThat(manualTask.getPlanned(), not(manualTask2.getPlanned())); + assertThat(manualTask2.getPlanned(), not(manualTask2.getCreated())); + + } + @Test public void testCreateManualTask() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException { ObjectReference expectedObjectReference = new ObjectReference(); From f753ef6767c7e5ebf47ca73462d1034932ec77aa Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Thu, 30 Nov 2017 15:39:13 +0100 Subject: [PATCH 06/12] TSK-15-fixedNotAuthorizedException-in-TaskServiceImplIntExplicitTest.testCreateManualTask --- .../main/java/pro/taskana/impl/TaskServiceImpl.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) 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 339316fca..a9cc82c05 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 @@ -33,6 +33,7 @@ public class TaskServiceImpl implements TaskService { private static final String ID_PREFIX_OBJECTR_EFERENCE = "ORI"; private static final String ID_PREFIX_TASK = "TKI"; private static final String ID_PREFIX_BUSINESS_PROCESS = "BPI"; + private static final String TYPE_MANUAL = "MANUAL"; private TaskanaEngine taskanaEngine; private TaskanaEngineImpl taskanaEngineImpl; @@ -124,7 +125,7 @@ public class TaskServiceImpl implements TaskService { taskanaEngine.getWorkbasketService().getWorkbasket(workbasketId); Classification classification = taskanaEngine.getClassificationService().getClassification(classificationId, domain); - if (classification.getCategory() != "MANUAL") { + if (!TYPE_MANUAL.equals(classification.getCategory())) { throw new NotAuthorizedException("You're not allowed to add a task manually to a '" + classification.getCategory() + "'- Classification!"); } @@ -139,7 +140,7 @@ public class TaskServiceImpl implements TaskService { task.setDescription(description); this.standardSettings(task); - this.setCustomers(task); + this.setCustomAttributes(task); this.taskMapper.insert(task); @@ -263,9 +264,9 @@ public class TaskServiceImpl implements TaskService { taskanaEngineImpl.returnConnection(); } return (resultList == null) ? new ArrayList<>() : resultList; - } - - private void standardSettings(Task task) { + } + + private void standardSettings(Task task) { Timestamp now = new Timestamp(System.currentTimeMillis()); task.setId(IdGenerator.generateWithPrefix(ID_PREFIX_TASK)); task.setState(TaskState.READY); @@ -313,7 +314,7 @@ public class TaskServiceImpl implements TaskService { } } - private void setCustomers(Task task) { + private void setCustomAttributes(Task task) { if (task.getCustomAttributes() != null) { for (String custom : task.getCustomAttributes().keySet()) { if (task.getCustom1() == null) { From 26675dcb7ac2616a9ea124b1fe2c3eca53bf7fb7 Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Thu, 30 Nov 2017 16:21:37 +0100 Subject: [PATCH 07/12] TSK-15 solve merge conflicts --- .../pro/taskana/impl/TaskServiceImpl.java | 77 ------------------- .../pro/taskana/impl/TaskServiceImplTest.java | 46 ----------- 2 files changed, 123 deletions(-) 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 a9cc82c05..302670115 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 @@ -343,81 +343,4 @@ public class TaskServiceImpl implements TaskService { } } } - - private void standardSettings(Task task) { - Timestamp now = new Timestamp(System.currentTimeMillis()); - task.setId(IdGenerator.generateWithPrefix(ID_PREFIX_TASK)); - task.setState(TaskState.READY); - task.setCreated(now); - task.setModified(now); - task.setRead(false); - task.setTransferred(false); - - if (task.getPlanned() == null) { - task.setPlanned(now); - } - - // insert Classification specifications if Classification is given. - Classification classification = task.getClassification(); - if (classification != null) { - if (classification.getServiceLevel() != null) { - Duration serviceLevel = Duration.parse(task.getClassification().getServiceLevel()); - LocalDateTime due = task.getPlanned().toLocalDateTime().plus(serviceLevel); - task.setDue(Timestamp.valueOf(due)); - } - - if (task.getName() == null) { - task.setName(classification.getName()); - } - - if (task.getDescription() == null) { - task.setDescription(classification.getDescription()); - } - - if (task.getPriority() == 0) { - task.setPriority(classification.getPriority()); - } - } - - // insert ObjectReference if needed. - if (task.getPrimaryObjRef() != null) { - ObjectReference objectReference = this.objectReferenceMapper.findByObjectReference(task.getPrimaryObjRef()); - if (objectReference == null) { - objectReference = task.getPrimaryObjRef(); - objectReference.setId(IdGenerator.generateWithPrefix(ID_PREFIX_OBJECTR_EFERENCE)); - this.objectReferenceMapper.insert(objectReference); - } - task.setPrimaryObjRef(objectReference); - } - } - - private void setCustomers(Task task) { - if (task.getCustomAttributes() != null) { - for (String custom : task.getCustomAttributes().keySet()) { - if (task.getCustom1() == null) { - task.setCustom1(custom); - } else if (task.getCustom2() == null) { - task.setCustom2(custom); - } else if (task.getCustom3() == null) { - task.setCustom3(custom); - } else if (task.getCustom4() == null) { - task.setCustom4(custom); - } else if (task.getCustom5() == null) { - task.setCustom5(custom); - } else if (task.getCustom6() == null) { - task.setCustom6(custom); - } else if (task.getCustom7() == null) { - task.setCustom7(custom); - } else if (task.getCustom8() == null) { - task.setCustom8(custom); - } else if (task.getCustom9() == null) { - task.setCustom9(custom); - } else if (task.getCustom10() == null) { - task.setCustom10(custom); - } else { - break; - } - } - } - } } diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java index c4edda8a1..a58eae246 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java @@ -218,52 +218,6 @@ public class TaskServiceImplTest { } - @Test - public void testCreateManualTask() throws NotAuthorizedException, WorkbasketNotFoundException, ClassificationNotFoundException { - ObjectReference expectedObjectReference = new ObjectReference(); - expectedObjectReference.setId("1"); - expectedObjectReference.setType("DUMMY"); - - Classification classification = new Classification(); - classification.setName("Name"); - classification.setCategory("MANUAL"); - - Mockito.doReturn(classification).when(classificationServiceMock).getClassification(any(), any()); - Mockito.doNothing().when(taskMapperMock).insert(any()); - Mockito.doNothing().when(objectReferenceMapperMock).insert(any()); - - Task manualTask = cut.createManualTask("workbasketId", "classification", "domain", null, null, "simply awesome task", expectedObjectReference, null); - - Task manualTask2 = cut.createManualTask("workbasketId", "classification", "domain", Timestamp.valueOf(LocalDateTime.now().minusHours(1)), "Task2", "simply awesome task", expectedObjectReference, null); - - verify(taskanaEngineImpl, times(2)).openConnection(); - verify(taskanaEngineMock, times(2 + 2)).getWorkbasketService(); - verify(taskanaEngineMock, times(2)).getClassificationService(); - verify(workbasketServiceMock, times(2)).checkAuthorization(any(), any()); - verify(workbasketServiceMock, times(2)).getWorkbasket(any()); - verify(objectReferenceMapperMock, times(2)).findByObjectReference(any()); - verify(objectReferenceMapperMock, times(2)).insert(any()); - verify(taskMapperMock, times(1)).insert(manualTask); - verify(taskMapperMock, times(1)).insert(manualTask2); - verify(taskanaEngineImpl, times(2)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineConfigurationMock, taskanaEngineMock, taskanaEngineImpl, - taskMapperMock, objectReferenceMapperMock, workbasketServiceMock); - - assertNull(manualTask.getOwner()); - assertNotNull(manualTask.getCreated()); - assertNotNull(manualTask.getModified()); - assertNull(manualTask.getCompleted()); - assertNull(manualTask.getDue()); - assertThat(manualTask.getWorkbasketId(), equalTo(manualTask2.getWorkbasketId())); - assertThat(manualTask.getName(), equalTo(classification.getName())); - assertThat(manualTask.getState(), equalTo(TaskState.READY)); - assertThat(manualTask.getPrimaryObjRef(), equalTo(expectedObjectReference)); - assertThat(manualTask.getName(), not(manualTask2.getName())); - assertThat(manualTask.getPlanned(), not(manualTask2.getPlanned())); - assertThat(manualTask2.getPlanned(), not(manualTask2.getCreated())); - - } - @Test(expected = NotAuthorizedException.class) public void testCreateThrowingAuthorizedOnWorkbasket() throws NotAuthorizedException, WorkbasketNotFoundException { try { From 026d6d0309725f03152b239aca4d1a148d4aa91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Kl=C3=A4ger?= Date: Wed, 29 Nov 2017 08:55:05 +0100 Subject: [PATCH 08/12] TSK-43 Add businessProcessId and parentBusinessProcessId to Task and TaskMapper --- .../src/test/java/pro/taskana/impl/TaskServiceImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java index a58eae246..9a2f8c7b1 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskServiceImplTest.java @@ -177,7 +177,6 @@ public class TaskServiceImplTest { expectedObjectReference.setId("1"); expectedObjectReference.setType("DUMMY"); - Workbasket workbasket = new Workbasket(); Classification classification = new Classification(); classification.setName("Name"); classification.setCategory("MANUAL"); From 2383d98d49797ea806e1e8421c9d16524bd55533 Mon Sep 17 00:00:00 2001 From: Marcel Lengl <52546181+LenglBoy@users.noreply.github.com> Date: Wed, 29 Nov 2017 16:19:17 +0100 Subject: [PATCH 09/12] Added select statement to taskMapper, added new service-method, added it to rest-project and tested with authentification. --- .../main/java/pro/taskana/impl/TaskServiceImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 3967b6003..a0c3b4692 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 @@ -253,6 +253,18 @@ public class TaskServiceImpl implements TaskService { public TaskQuery createTaskQuery() { return new TaskQueryImpl(taskanaEngine); } + @Override + public List getTasksByWorkbasketIdAndState(String workbasketId, TaskState taskState) throws WorkbasketNotFoundException, NotAuthorizedException, Exception { + List resultList = null; + try { + taskanaEngineImpl.openConnection(); + taskanaEngine.getWorkbasketService().checkAuthorization(workbasketId, WorkbasketAuthorization.READ); + resultList = taskMapper.findTasksByWorkbasketIdAndState(workbasketId, taskState); + } finally { + taskanaEngineImpl.returnConnection(); + } + return (resultList == null) ? new ArrayList<>() : resultList; + } @Override public List getTasksByWorkbasketIdAndState(String workbasketId, TaskState taskState) throws WorkbasketNotFoundException, NotAuthorizedException, Exception { From 4239566cf0faecc47280722e88a477dce69172eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Kl=C3=A4ger?= Date: Wed, 29 Nov 2017 08:55:05 +0100 Subject: [PATCH 10/12] TSK-43 Add businessProcessId and parentBusinessProcessId to Task and update TaskMapper as well as task.sql --- .../src/main/java/pro/taskana/impl/TaskServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) 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 a0c3b4692..b47441776 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 @@ -33,7 +33,10 @@ public class TaskServiceImpl implements TaskService { private static final String ID_PREFIX_OBJECTR_EFERENCE = "ORI"; private static final String ID_PREFIX_TASK = "TKI"; private static final String ID_PREFIX_BUSINESS_PROCESS = "BPI"; +<<<<<<< HEAD private static final String TYPE_MANUAL = "MANUAL"; +======= +>>>>>>> TSK-43 Add businessProcessId and parentBusinessProcessId to Task and private TaskanaEngine taskanaEngine; private TaskanaEngineImpl taskanaEngineImpl; From 05834034edfde8030227d910942b6e8946ef9165 Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Thu, 30 Nov 2017 15:39:13 +0100 Subject: [PATCH 11/12] TSK-15-fixedNotAuthorizedException-in-TaskServiceImplIntExplicitTest.testCreateManualTask --- .../java/pro/taskana/impl/TaskServiceImpl.java | 15 --------------- 1 file changed, 15 deletions(-) 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 b47441776..3967b6003 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 @@ -33,10 +33,7 @@ public class TaskServiceImpl implements TaskService { private static final String ID_PREFIX_OBJECTR_EFERENCE = "ORI"; private static final String ID_PREFIX_TASK = "TKI"; private static final String ID_PREFIX_BUSINESS_PROCESS = "BPI"; -<<<<<<< HEAD private static final String TYPE_MANUAL = "MANUAL"; -======= ->>>>>>> TSK-43 Add businessProcessId and parentBusinessProcessId to Task and private TaskanaEngine taskanaEngine; private TaskanaEngineImpl taskanaEngineImpl; @@ -256,18 +253,6 @@ public class TaskServiceImpl implements TaskService { public TaskQuery createTaskQuery() { return new TaskQueryImpl(taskanaEngine); } - @Override - public List getTasksByWorkbasketIdAndState(String workbasketId, TaskState taskState) throws WorkbasketNotFoundException, NotAuthorizedException, Exception { - List resultList = null; - try { - taskanaEngineImpl.openConnection(); - taskanaEngine.getWorkbasketService().checkAuthorization(workbasketId, WorkbasketAuthorization.READ); - resultList = taskMapper.findTasksByWorkbasketIdAndState(workbasketId, taskState); - } finally { - taskanaEngineImpl.returnConnection(); - } - return (resultList == null) ? new ArrayList<>() : resultList; - } @Override public List getTasksByWorkbasketIdAndState(String workbasketId, TaskState taskState) throws WorkbasketNotFoundException, NotAuthorizedException, Exception { From b864abcf0f0dd66408633c70e0843d60d5f5b9d2 Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Fri, 1 Dec 2017 09:41:25 +0100 Subject: [PATCH 12/12] move init of business process id into standardSettings --- .../src/main/java/pro/taskana/impl/TaskServiceImpl.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 3967b6003..228146459 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 @@ -102,11 +102,6 @@ public class TaskServiceImpl implements TaskService { standardSettings(task); - // if no business process id is provided, a unique id is created. - if (task.getBusinessProcessId() == null) { - task.setBusinessProcessId(IdGenerator.generateWithPrefix(ID_PREFIX_BUSINESS_PROCESS)); - } - this.taskMapper.insert(task); LOGGER.debug("Task '{}' created.", task.getId()); @@ -280,6 +275,10 @@ public class TaskServiceImpl implements TaskService { task.setPlanned(now); } + // if no business process id is provided, a unique id is created. + if (task.getBusinessProcessId() == null) { + task.setBusinessProcessId(IdGenerator.generateWithPrefix(ID_PREFIX_BUSINESS_PROCESS)); + } // insert Classification specifications if Classification is given. Classification classification = task.getClassification();