From ad8aabb5de64df30008a20f0e0f8de280ec30466 Mon Sep 17 00:00:00 2001 From: Marcel Lengl <52546181+LenglBoy@users.noreply.github.com> Date: Wed, 10 Jan 2018 10:36:09 +0100 Subject: [PATCH] TSK-137: Get all attachments of a Task. --- .../java/pro/taskana/ExampleBootstrap.java | 2 +- .../main/java/pro/taskana/TaskService.java | 2 +- .../java/pro/taskana/impl/AttachmentImpl.java | 59 +++++- .../pro/taskana/impl/TaskServiceImpl.java | 37 +++- .../model/mappings/AttachmentMapper.java | 39 +++- .../taskana/model/mappings/QueryMapper.java | 2 +- .../taskana/model/mappings/TaskMapper.java | 12 +- .../acceptance/task/CreateTaskAccTest.java | 39 ++-- .../acceptance/task/UpdateTaskAccTest.java | 8 +- .../pro/taskana/impl/TaskServiceImplTest.java | 180 ++++++++++-------- .../TaskServiceImplIntAutocommitTest.java | 8 +- .../TaskServiceImplIntExplicitTest.java | 6 +- .../java/pro/taskana/ExampleBootstrap.java | 2 +- .../java/pro/taskana/rest/TaskController.java | 6 +- 14 files changed, 261 insertions(+), 141 deletions(-) diff --git a/lib/taskana-cdi-example/src/main/java/pro/taskana/ExampleBootstrap.java b/lib/taskana-cdi-example/src/main/java/pro/taskana/ExampleBootstrap.java index fadda9345..7480ea2eb 100644 --- a/lib/taskana-cdi-example/src/main/java/pro/taskana/ExampleBootstrap.java +++ b/lib/taskana-cdi-example/src/main/java/pro/taskana/ExampleBootstrap.java @@ -42,7 +42,7 @@ public class ExampleBootstrap { taskanaEjb.getTaskService().claim(task.getId()); System.out.println( "---------------------------> Task claimed: " - + taskanaEjb.getTaskService().getTaskById(task.getId()).getOwner()); + + taskanaEjb.getTaskService().getTask(task.getId()).getOwner()); taskanaEjb.getTaskService().completeTask(task.getId()); System.out.println("---------------------------> Task completed"); } 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 9eefe2f01..04544bf25 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskService.java @@ -118,7 +118,7 @@ public interface TaskService { * @throws TaskNotFoundException * thrown of the {@link Task} with taskId is not found */ - Task getTaskById(String taskId) throws TaskNotFoundException; + Task getTask(String taskId) throws TaskNotFoundException; /** * Transfer a task to another work basket. The transfer sets the transferred flag and resets the read flag. diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/AttachmentImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/AttachmentImpl.java index f7953c8cd..a58c5b257 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/AttachmentImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/AttachmentImpl.java @@ -1,6 +1,7 @@ package pro.taskana.impl; import java.sql.Timestamp; +import java.util.Collections; import java.util.Map; import pro.taskana.Attachment; @@ -20,12 +21,16 @@ public class AttachmentImpl implements Attachment { private Timestamp modified; private Classification classification; private ObjectReference objectReference; + private String porCompany; + private String porSystem; + private String porSystemInstance; + private String porType; + private String porValue; private String channel; private Timestamp received; - private Map customAttributes; + private Map customAttributes = Collections.emptyMap();; AttachmentImpl() { - } @Override @@ -114,6 +119,46 @@ public class AttachmentImpl implements Attachment { this.customAttributes = customAttributes; } + public String getPorCompany() { + return porCompany; + } + + public void setPorCompany(String porCompany) { + this.porCompany = porCompany; + } + + public String getPorSystem() { + return porSystem; + } + + public void setPorSystem(String porSystem) { + this.porSystem = porSystem; + } + + public String getPorSystemInstance() { + return porSystemInstance; + } + + public void setPorSystemInstance(String porSystemInstance) { + this.porSystemInstance = porSystemInstance; + } + + public String getPorType() { + return porType; + } + + public void setPorType(String porType) { + this.porType = porType; + } + + public String getPorValue() { + return porValue; + } + + public void setPorValue(String porValue) { + this.porValue = porValue; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); @@ -127,6 +172,16 @@ public class AttachmentImpl implements Attachment { builder.append(modified); builder.append(", classification="); builder.append(classification); + builder.append(", porCompany="); + builder.append(porCompany); + builder.append(", porSystem="); + builder.append(porSystem); + builder.append(", porSystemInstance="); + builder.append(porSystemInstance); + builder.append(", porType="); + builder.append(porType); + builder.append(", porValue="); + builder.append(porValue); builder.append(", objectReference="); builder.append(objectReference); builder.append(", channel="); 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 3a4a3b313..6816b4439 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 @@ -82,7 +82,7 @@ public class TaskServiceImpl implements TaskService { TaskImpl task = null; try { taskanaEngineImpl.openConnection(); - task = (TaskImpl) getTaskById(taskId); + task = (TaskImpl) getTask(taskId); TaskState state = task.getState(); if (state == TaskState.COMPLETED) { LOGGER.warn("Method claim() found that task {} is already completed. Throwing InvalidStateException", @@ -123,7 +123,7 @@ public class TaskServiceImpl implements TaskService { TaskImpl task = null; try { taskanaEngineImpl.openConnection(); - task = (TaskImpl) this.getTaskById(taskId); + task = (TaskImpl) this.getTask(taskId); // check pre-conditions for non-forced invocation if (!isForced) { if (task.getClaimed() == null || task.getState() != TaskState.CLAIMED) { @@ -191,7 +191,7 @@ public class TaskServiceImpl implements TaskService { } @Override - public Task getTaskById(String id) throws TaskNotFoundException { + public Task getTask(String id) throws TaskNotFoundException { LOGGER.debug("entry to getTaskById(id = {})", id); Task result = null; try { @@ -199,6 +199,9 @@ public class TaskServiceImpl implements TaskService { result = taskMapper.findById(id); if (result != null) { setPrimaryObjRef((TaskImpl) result); + List attachments = setAttachmentObjRef( + attachmentMapper.findAttachmentsByTaskId(result.getId())); + ((TaskImpl) result).setAttachments(attachments); return result; } else { LOGGER.warn("Method getTaskById() didn't find task with id {}. Throwing TaskNotFoundException", id); @@ -217,7 +220,7 @@ public class TaskServiceImpl implements TaskService { Task result = null; try { taskanaEngineImpl.openConnection(); - TaskImpl task = (TaskImpl) getTaskById(taskId); + TaskImpl task = (TaskImpl) getTask(taskId); // transfer requires TRANSFER in source and APPEND on destination workbasket workbasketService.checkAuthorization(destinationWorkbasketKey, WorkbasketAuthorization.APPEND); @@ -238,7 +241,7 @@ public class TaskServiceImpl implements TaskService { task.setModified(Timestamp.valueOf(LocalDateTime.now())); taskMapper.update(task); - result = getTaskById(taskId); + result = getTask(taskId); LOGGER.debug("Method transfer() transferred Task '{}' to destination workbasket {}", taskId, destinationWorkbasketKey); return result; @@ -254,11 +257,11 @@ public class TaskServiceImpl implements TaskService { Task result = null; try { taskanaEngineImpl.openConnection(); - TaskImpl task = (TaskImpl) getTaskById(taskId); + TaskImpl task = (TaskImpl) getTask(taskId); task.setRead(true); task.setModified(Timestamp.valueOf(LocalDateTime.now())); taskMapper.update(task); - result = getTaskById(taskId); + result = getTask(taskId); LOGGER.debug("Method setTaskRead() set read property of Task '{}' to {} ", result, isRead); return result; } finally { @@ -307,7 +310,7 @@ public class TaskServiceImpl implements TaskService { TaskImpl oldTaskImpl = null; try { taskanaEngineImpl.openConnection(); - oldTaskImpl = (TaskImpl) getTaskById(newTaskImpl.getId()); + oldTaskImpl = (TaskImpl) getTask(newTaskImpl.getId()); standardUpdateActions(oldTaskImpl, newTaskImpl); taskMapper.update(newTaskImpl); @@ -431,6 +434,23 @@ public class TaskServiceImpl implements TaskService { task.setPrimaryObjRef(objRef); } + private List setAttachmentObjRef(List attachments) { + List results = new ArrayList<>(); + if (attachments != null && !attachments.isEmpty()) { + for (AttachmentImpl attachment : attachments) { + ObjectReference objRef = new ObjectReference(); + objRef.setCompany(attachment.getPorCompany()); + objRef.setSystem(attachment.getPorSystem()); + objRef.setSystemInstance(attachment.getPorSystemInstance()); + objRef.setType(attachment.getPorType()); + objRef.setValue(attachment.getPorValue()); + attachment.setObjectReference(objRef); + results.add(attachment); + } + } + return results; + } + private void validateObjectReference(ObjectReference objRef, String objRefType, String objName) throws InvalidArgumentException { // check that all values in the ObjectReference are set correctly @@ -465,7 +485,6 @@ public class TaskServiceImpl implements TaskService { throw new InvalidArgumentException("Classification of attachment " + attachment + " must not be null"); } } - } private void standardUpdateActions(TaskImpl oldTaskImpl, TaskImpl newTaskImpl) diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/AttachmentMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/AttachmentMapper.java index d34c1b2fe..1695df301 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/AttachmentMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/AttachmentMapper.java @@ -1,18 +1,51 @@ package pro.taskana.model.mappings; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; +import java.util.List; +import java.util.Map; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.One; +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 org.apache.ibatis.type.JdbcType; + +import pro.taskana.Classification; import pro.taskana.impl.AttachmentImpl; +import pro.taskana.impl.persistence.MapTypeHandler; /** * This class is the mybatis mapping of Attachment. */ public interface AttachmentMapper { - @Insert("INSERT INTO ATTACHMENT (ID, TASK_ID, CREATED, MODIFIED, CLASSIFICATION_KEY, REF_COMPANY, REF_SYSTEM, REF_INSTANCE, REF_TYPE, REF_VALUE, CHANNEL, RECEIVED, CUSTOM_ATTRIBUTES) " + String CLASSIFICATION_FINDBYID = "pro.taskana.model.mappings.ClassificationMapper.findById"; + + @Insert("INSERT INTO ATTACHMENT (ID, TASK_ID, CREATED, MODIFIED, CLASSIFICATION_KEY, REF_COMPANY, REF_SYSTEM, REF_INSTANCE, REF_TYPE, REF_VALUE, CHANNEL, RECEIVED, CUSTOM_ATTRIBUTES) " + "VALUES (#{att.id}, #{att.taskId}, #{att.created}, #{att.modified}, #{att.classification.key}, #{att.objectReference.company}, #{att.objectReference.system}, #{att.objectReference.systemInstance}, " + " #{att.objectReference.type}, #{att.objectReference.value}, #{att.channel}, #{att.received}, #{att.customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=pro.taskana.impl.persistence.MapTypeHandler} )") void insert(@Param("att") AttachmentImpl att); + @Select("SELECT ID, TASK_ID, CREATED, MODIFIED, CLASSIFICATION_KEY, REF_COMPANY, REF_SYSTEM, REF_INSTANCE, REF_TYPE, REF_VALUE, CHANNEL, RECEIVED, CUSTOM_ATTRIBUTES " + + "FROM ATTACHMENT " + + "WHERE TASK_ID = #{taskId}") + @Results(value = { + @Result(property = "id", column = "ID"), + @Result(property = "taskId", column = "TASK_ID"), + @Result(property = "created", column = "CREATED"), + @Result(property = "modified", column = "MODIFIED"), + @Result(property = "classification", column = "CLASSIFICATION_KEY", javaType = Classification.class, + one = @One(select = CLASSIFICATION_FINDBYID)), + @Result(property = "porCompany", column = "REF_COMPANY"), + @Result(property = "porSystem", column = "REF_SYSTEM"), + @Result(property = "porSystemInstance", column = "REF_INSTANCE"), + @Result(property = "porType", column = "REF_TYPE"), + @Result(property = "porValue", column = "REF_VALUE"), + @Result(property = "channel", column = "CHANNEL"), + @Result(property = "received", column = "RECEIVED"), + @Result(property = "customAttributes", column = "CUSTOM_ATTRIBUTES", jdbcType = JdbcType.BLOB, + javaType = Map.class, typeHandler = MapTypeHandler.class), + }) + List findAttachmentsByTaskId(@Param("taskId") String taskId); } diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java index f614715a9..41011e453 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java @@ -23,7 +23,7 @@ import pro.taskana.model.ObjectReference; public interface QueryMapper { String OBJECTREFERENCEMAPPER_FINDBYID = "pro.taskana.model.mappings.ObjectReferenceMapper.findById"; - String CLASSIFICATION_FINDBYIDANDDOMAIN = "pro.taskana.model.mappings.ClassificationMapper.findByKeyAndDomain"; + String CLASSIFICATION_FINDBYKEYANDDOMAIN = "pro.taskana.model.mappings.ClassificationMapper.findByKeyAndDomain"; String CLASSIFICATION_FINDBYID = "pro.taskana.model.mappings.ClassificationMapper.findById"; @Select("