Skip to content

Commit ad8aabb

Browse files
MLenglholgerhagen
authored andcommitted
TSK-137: Get all attachments of a Task.
1 parent 98658ac commit ad8aabb

File tree

14 files changed

+259
-139
lines changed

14 files changed

+259
-139
lines changed

lib/taskana-cdi-example/src/main/java/pro/taskana/ExampleBootstrap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void init(@Observes @Initialized(ApplicationScoped.class) Object init)
4242
taskanaEjb.getTaskService().claim(task.getId());
4343
System.out.println(
4444
"---------------------------> Task claimed: "
45-
+ taskanaEjb.getTaskService().getTaskById(task.getId()).getOwner());
45+
+ taskanaEjb.getTaskService().getTask(task.getId()).getOwner());
4646
taskanaEjb.getTaskService().completeTask(task.getId());
4747
System.out.println("---------------------------> Task completed");
4848
}

lib/taskana-core/src/main/java/pro/taskana/TaskService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ Task createTask(Task taskToCreate)
118118
* @throws TaskNotFoundException
119119
* thrown of the {@link Task} with taskId is not found
120120
*/
121-
Task getTaskById(String taskId) throws TaskNotFoundException;
121+
Task getTask(String taskId) throws TaskNotFoundException;
122122

123123
/**
124124
* Transfer a task to another work basket. The transfer sets the transferred flag and resets the read flag.

lib/taskana-core/src/main/java/pro/taskana/impl/AttachmentImpl.java

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package pro.taskana.impl;
22

33
import java.sql.Timestamp;
4+
import java.util.Collections;
45
import java.util.Map;
56

67
import pro.taskana.Attachment;
@@ -20,12 +21,16 @@ public class AttachmentImpl implements Attachment {
2021
private Timestamp modified;
2122
private Classification classification;
2223
private ObjectReference objectReference;
24+
private String porCompany;
25+
private String porSystem;
26+
private String porSystemInstance;
27+
private String porType;
28+
private String porValue;
2329
private String channel;
2430
private Timestamp received;
25-
private Map<String, Object> customAttributes;
31+
private Map<String, Object> customAttributes = Collections.emptyMap();;
2632

2733
AttachmentImpl() {
28-
2934
}
3035

3136
@Override
@@ -114,6 +119,46 @@ public void setCustomAttributes(Map<String, Object> customAttributes) {
114119
this.customAttributes = customAttributes;
115120
}
116121

122+
public String getPorCompany() {
123+
return porCompany;
124+
}
125+
126+
public void setPorCompany(String porCompany) {
127+
this.porCompany = porCompany;
128+
}
129+
130+
public String getPorSystem() {
131+
return porSystem;
132+
}
133+
134+
public void setPorSystem(String porSystem) {
135+
this.porSystem = porSystem;
136+
}
137+
138+
public String getPorSystemInstance() {
139+
return porSystemInstance;
140+
}
141+
142+
public void setPorSystemInstance(String porSystemInstance) {
143+
this.porSystemInstance = porSystemInstance;
144+
}
145+
146+
public String getPorType() {
147+
return porType;
148+
}
149+
150+
public void setPorType(String porType) {
151+
this.porType = porType;
152+
}
153+
154+
public String getPorValue() {
155+
return porValue;
156+
}
157+
158+
public void setPorValue(String porValue) {
159+
this.porValue = porValue;
160+
}
161+
117162
@Override
118163
public String toString() {
119164
StringBuilder builder = new StringBuilder();
@@ -127,6 +172,16 @@ public String toString() {
127172
builder.append(modified);
128173
builder.append(", classification=");
129174
builder.append(classification);
175+
builder.append(", porCompany=");
176+
builder.append(porCompany);
177+
builder.append(", porSystem=");
178+
builder.append(porSystem);
179+
builder.append(", porSystemInstance=");
180+
builder.append(porSystemInstance);
181+
builder.append(", porType=");
182+
builder.append(porType);
183+
builder.append(", porValue=");
184+
builder.append(porValue);
130185
builder.append(", objectReference=");
131186
builder.append(objectReference);
132187
builder.append(", channel=");

lib/taskana-core/src/main/java/pro/taskana/impl/TaskServiceImpl.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public Task claim(String taskId, boolean forceClaim)
8282
TaskImpl task = null;
8383
try {
8484
taskanaEngineImpl.openConnection();
85-
task = (TaskImpl) getTaskById(taskId);
85+
task = (TaskImpl) getTask(taskId);
8686
TaskState state = task.getState();
8787
if (state == TaskState.COMPLETED) {
8888
LOGGER.warn("Method claim() found that task {} is already completed. Throwing InvalidStateException",
@@ -123,7 +123,7 @@ public Task completeTask(String taskId, boolean isForced)
123123
TaskImpl task = null;
124124
try {
125125
taskanaEngineImpl.openConnection();
126-
task = (TaskImpl) this.getTaskById(taskId);
126+
task = (TaskImpl) this.getTask(taskId);
127127
// check pre-conditions for non-forced invocation
128128
if (!isForced) {
129129
if (task.getClaimed() == null || task.getState() != TaskState.CLAIMED) {
@@ -191,14 +191,17 @@ public Task createTask(Task taskToCreate)
191191
}
192192

193193
@Override
194-
public Task getTaskById(String id) throws TaskNotFoundException {
194+
public Task getTask(String id) throws TaskNotFoundException {
195195
LOGGER.debug("entry to getTaskById(id = {})", id);
196196
Task result = null;
197197
try {
198198
taskanaEngineImpl.openConnection();
199199
result = taskMapper.findById(id);
200200
if (result != null) {
201201
setPrimaryObjRef((TaskImpl) result);
202+
List<Attachment> attachments = setAttachmentObjRef(
203+
attachmentMapper.findAttachmentsByTaskId(result.getId()));
204+
((TaskImpl) result).setAttachments(attachments);
202205
return result;
203206
} else {
204207
LOGGER.warn("Method getTaskById() didn't find task with id {}. Throwing TaskNotFoundException", id);
@@ -217,7 +220,7 @@ public Task transfer(String taskId, String destinationWorkbasketKey)
217220
Task result = null;
218221
try {
219222
taskanaEngineImpl.openConnection();
220-
TaskImpl task = (TaskImpl) getTaskById(taskId);
223+
TaskImpl task = (TaskImpl) getTask(taskId);
221224

222225
// transfer requires TRANSFER in source and APPEND on destination workbasket
223226
workbasketService.checkAuthorization(destinationWorkbasketKey, WorkbasketAuthorization.APPEND);
@@ -238,7 +241,7 @@ public Task transfer(String taskId, String destinationWorkbasketKey)
238241
task.setModified(Timestamp.valueOf(LocalDateTime.now()));
239242
taskMapper.update(task);
240243

241-
result = getTaskById(taskId);
244+
result = getTask(taskId);
242245
LOGGER.debug("Method transfer() transferred Task '{}' to destination workbasket {}", taskId,
243246
destinationWorkbasketKey);
244247
return result;
@@ -254,11 +257,11 @@ public Task setTaskRead(String taskId, boolean isRead) throws TaskNotFoundExcept
254257
Task result = null;
255258
try {
256259
taskanaEngineImpl.openConnection();
257-
TaskImpl task = (TaskImpl) getTaskById(taskId);
260+
TaskImpl task = (TaskImpl) getTask(taskId);
258261
task.setRead(true);
259262
task.setModified(Timestamp.valueOf(LocalDateTime.now()));
260263
taskMapper.update(task);
261-
result = getTaskById(taskId);
264+
result = getTask(taskId);
262265
LOGGER.debug("Method setTaskRead() set read property of Task '{}' to {} ", result, isRead);
263266
return result;
264267
} finally {
@@ -307,7 +310,7 @@ public Task updateTask(Task task)
307310
TaskImpl oldTaskImpl = null;
308311
try {
309312
taskanaEngineImpl.openConnection();
310-
oldTaskImpl = (TaskImpl) getTaskById(newTaskImpl.getId());
313+
oldTaskImpl = (TaskImpl) getTask(newTaskImpl.getId());
311314
standardUpdateActions(oldTaskImpl, newTaskImpl);
312315

313316
taskMapper.update(newTaskImpl);
@@ -431,6 +434,23 @@ static void setPrimaryObjRef(TaskImpl task) {
431434
task.setPrimaryObjRef(objRef);
432435
}
433436

437+
private List<Attachment> setAttachmentObjRef(List<AttachmentImpl> attachments) {
438+
List<Attachment> results = new ArrayList<>();
439+
if (attachments != null && !attachments.isEmpty()) {
440+
for (AttachmentImpl attachment : attachments) {
441+
ObjectReference objRef = new ObjectReference();
442+
objRef.setCompany(attachment.getPorCompany());
443+
objRef.setSystem(attachment.getPorSystem());
444+
objRef.setSystemInstance(attachment.getPorSystemInstance());
445+
objRef.setType(attachment.getPorType());
446+
objRef.setValue(attachment.getPorValue());
447+
attachment.setObjectReference(objRef);
448+
results.add(attachment);
449+
}
450+
}
451+
return results;
452+
}
453+
434454
private void validateObjectReference(ObjectReference objRef, String objRefType, String objName)
435455
throws InvalidArgumentException {
436456
// check that all values in the ObjectReference are set correctly
@@ -465,7 +485,6 @@ private void validateAttachments(TaskImpl task) throws InvalidArgumentException
465485
throw new InvalidArgumentException("Classification of attachment " + attachment + " must not be null");
466486
}
467487
}
468-
469488
}
470489

471490
private void standardUpdateActions(TaskImpl oldTaskImpl, TaskImpl newTaskImpl)
Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,51 @@
11
package pro.taskana.model.mappings;
22

3+
import java.util.List;
4+
import java.util.Map;
5+
36
import org.apache.ibatis.annotations.Insert;
7+
import org.apache.ibatis.annotations.One;
48
import org.apache.ibatis.annotations.Param;
9+
import org.apache.ibatis.annotations.Result;
10+
import org.apache.ibatis.annotations.Results;
11+
import org.apache.ibatis.annotations.Select;
12+
import org.apache.ibatis.type.JdbcType;
513

14+
import pro.taskana.Classification;
615
import pro.taskana.impl.AttachmentImpl;
16+
import pro.taskana.impl.persistence.MapTypeHandler;
717

818
/**
919
* This class is the mybatis mapping of Attachment.
1020
*/
1121
public interface AttachmentMapper {
1222

13-
@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) "
23+
String CLASSIFICATION_FINDBYID = "pro.taskana.model.mappings.ClassificationMapper.findById";
24+
25+
@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) "
1426
+ "VALUES (#{att.id}, #{att.taskId}, #{att.created}, #{att.modified}, #{att.classification.key}, #{att.objectReference.company}, #{att.objectReference.system}, #{att.objectReference.systemInstance}, "
1527
+ " #{att.objectReference.type}, #{att.objectReference.value}, #{att.channel}, #{att.received}, #{att.customAttributes,jdbcType=BLOB,javaType=java.util.Map,typeHandler=pro.taskana.impl.persistence.MapTypeHandler} )")
1628
void insert(@Param("att") AttachmentImpl att);
1729

30+
@Select("SELECT ID, TASK_ID, CREATED, MODIFIED, CLASSIFICATION_KEY, REF_COMPANY, REF_SYSTEM, REF_INSTANCE, REF_TYPE, REF_VALUE, CHANNEL, RECEIVED, CUSTOM_ATTRIBUTES "
31+
+ "FROM ATTACHMENT "
32+
+ "WHERE TASK_ID = #{taskId}")
33+
@Results(value = {
34+
@Result(property = "id", column = "ID"),
35+
@Result(property = "taskId", column = "TASK_ID"),
36+
@Result(property = "created", column = "CREATED"),
37+
@Result(property = "modified", column = "MODIFIED"),
38+
@Result(property = "classification", column = "CLASSIFICATION_KEY", javaType = Classification.class,
39+
one = @One(select = CLASSIFICATION_FINDBYID)),
40+
@Result(property = "porCompany", column = "REF_COMPANY"),
41+
@Result(property = "porSystem", column = "REF_SYSTEM"),
42+
@Result(property = "porSystemInstance", column = "REF_INSTANCE"),
43+
@Result(property = "porType", column = "REF_TYPE"),
44+
@Result(property = "porValue", column = "REF_VALUE"),
45+
@Result(property = "channel", column = "CHANNEL"),
46+
@Result(property = "received", column = "RECEIVED"),
47+
@Result(property = "customAttributes", column = "CUSTOM_ATTRIBUTES", jdbcType = JdbcType.BLOB,
48+
javaType = Map.class, typeHandler = MapTypeHandler.class),
49+
})
50+
List<AttachmentImpl> findAttachmentsByTaskId(@Param("taskId") String taskId);
1851
}

lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
public interface QueryMapper {
2424

2525
String OBJECTREFERENCEMAPPER_FINDBYID = "pro.taskana.model.mappings.ObjectReferenceMapper.findById";
26-
String CLASSIFICATION_FINDBYIDANDDOMAIN = "pro.taskana.model.mappings.ClassificationMapper.findByKeyAndDomain";
26+
String CLASSIFICATION_FINDBYKEYANDDOMAIN = "pro.taskana.model.mappings.ClassificationMapper.findByKeyAndDomain";
2727
String CLASSIFICATION_FINDBYID = "pro.taskana.model.mappings.ClassificationMapper.findById";
2828

2929
@Select("<script>SELECT t.ID, t.CREATED, t.CLAIMED, t.COMPLETED, t.MODIFIED, t.PLANNED, t.DUE, t.NAME, t.DESCRIPTION, t.PRIORITY, t.STATE, t.CLASSIFICATION_KEY, t.WORKBASKET_KEY, t.OWNER, t.POR_COMPANY, t.POR_SYSTEM, t.POR_INSTANCE, t.POR_TYPE, t.POR_VALUE, t.IS_READ, t.IS_TRANSFERRED, t.CUSTOM_1, t.CUSTOM_2, t.CUSTOM_3, t.CUSTOM_4, t.CUSTOM_5, t.CUSTOM_6, t.CUSTOM_7, t.CUSTOM_8, t.CUSTOM_9, t.CUSTOM_10 "

lib/taskana-core/src/main/java/pro/taskana/model/mappings/TaskMapper.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ public interface TaskMapper {
7171
@Result(property = "custom7", column = "CUSTOM_7"),
7272
@Result(property = "custom8", column = "CUSTOM_8"),
7373
@Result(property = "custom9", column = "CUSTOM_9"),
74-
@Result(property = "custom10", column = "CUSTOM_10")})
75-
74+
@Result(property = "custom10", column = "CUSTOM_10")
75+
})
7676
TaskImpl findById(@Param("id") String id);
7777

78-
@Results({@Result(column = "DUE_DATE", property = "due"),
78+
@Results({ @Result(column = "DUE_DATE", property = "due"),
7979
@Result(column = "WORKBASKET_KEY", property = "workbasketKey"),
80-
@Result(column = "counter", property = "taskCounter")})
80+
@Result(column = "counter", property = "taskCounter") })
8181
List<DueWorkbasketCounter> getTaskCountByWorkbasketIdAndDaysInPastAndState(@Param("fromDate") Date fromDate,
8282
@Param("status") List<TaskState> states);
8383

@@ -131,8 +131,7 @@ List<DueWorkbasketCounter> getTaskCountByWorkbasketIdAndDaysInPastAndState(@Para
131131
@Result(property = "custom7", column = "CUSTOM_7"),
132132
@Result(property = "custom8", column = "CUSTOM_8"),
133133
@Result(property = "custom9", column = "CUSTOM_9"),
134-
@Result(property = "custom10", column = "CUSTOM_10")})
135-
134+
@Result(property = "custom10", column = "CUSTOM_10") })
136135
List<TaskImpl> findTasksByWorkbasketIdAndState(@Param("workbasketKey") String workbasketKey,
137136
@Param("taskState") TaskState taskState);
138137

@@ -151,5 +150,4 @@ List<TaskImpl> findTasksByWorkbasketIdAndState(@Param("workbasketKey") String wo
151150
@Result(property = "classificationName", column = "classificationName")
152151
})
153152
List<TaskSummary> findTaskSummariesByWorkbasketKey(@Param("workbasketKey") String workbasketKey);
154-
155153
}

lib/taskana-core/src/test/java/acceptance/task/CreateTaskAccTest.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import pro.taskana.exceptions.InvalidWorkbasketException;
2020
import pro.taskana.exceptions.NotAuthorizedException;
2121
import pro.taskana.exceptions.TaskAlreadyExistException;
22+
import pro.taskana.exceptions.TaskNotFoundException;
2223
import pro.taskana.exceptions.WorkbasketNotFoundException;
2324
import pro.taskana.model.TaskState;
2425
import pro.taskana.security.JAASRunner;
@@ -72,7 +73,7 @@ public void testCreateSimpleManualTask()
7273
@Test
7374
public void testCreateExternalTaskWithAttachment()
7475
throws SQLException, NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
75-
WorkbasketNotFoundException, TaskAlreadyExistException, InvalidWorkbasketException {
76+
WorkbasketNotFoundException, TaskAlreadyExistException, InvalidWorkbasketException, TaskNotFoundException {
7677

7778
TaskService taskService = taskanaEngine.getTaskService();
7879
Task newTask = taskService.newTask();
@@ -87,15 +88,16 @@ public void testCreateExternalTaskWithAttachment()
8788

8889
assertNotNull(createdTask.getId());
8990

90-
// rename getTaskById to getTask
91-
// Task readTask = taskService.getTask(createdTask.getId());
91+
Task readTask = taskService.getTask(createdTask.getId());
9292

93-
// assertNotNull(readTask);
94-
// assertNotNull(readTask.getAttachments());
95-
// assertEquals(1, readTask.getAttachments().size());
96-
// assertNotNull(readTask.getAttachments().get(0).getCreated());
97-
// assertNotNull(readTask.getAttachments().get(0).getModified());
98-
// assertEquals(readTask.getAttachments().get(0).getCreated(), readTask.getAttachments().get(0).getModified());
93+
assertNotNull(readTask);
94+
assertNotNull(readTask.getAttachments());
95+
assertEquals(1, readTask.getAttachments().size());
96+
assertNotNull(readTask.getAttachments().get(0).getCreated());
97+
assertNotNull(readTask.getAttachments().get(0).getModified());
98+
assertEquals(readTask.getAttachments().get(0).getCreated(), readTask.getAttachments().get(0).getModified());
99+
// assertNotNull(readTask.getAttachments().get(0).getClassification());
100+
assertNotNull(readTask.getAttachments().get(0).getObjectReference());
99101
}
100102

101103
@WithAccessId(
@@ -104,7 +106,7 @@ public void testCreateExternalTaskWithAttachment()
104106
@Test
105107
public void testCreateExternalTaskWithMultipleAttachments()
106108
throws SQLException, NotAuthorizedException, InvalidArgumentException, ClassificationNotFoundException,
107-
WorkbasketNotFoundException, TaskAlreadyExistException, InvalidWorkbasketException {
109+
WorkbasketNotFoundException, TaskAlreadyExistException, InvalidWorkbasketException, TaskNotFoundException {
108110

109111
TaskService taskService = taskanaEngine.getTaskService();
110112
Task newTask = taskService.newTask();
@@ -123,15 +125,16 @@ public void testCreateExternalTaskWithMultipleAttachments()
123125

124126
assertNotNull(createdTask.getId());
125127

126-
// rename getTaskById to getTask
127-
// Task readTask = taskService.getTask(createdTask.getId());
128+
Task readTask = taskService.getTask(createdTask.getId());
128129

129-
// assertNotNull(readTask);
130-
// assertNotNull(readTask.getAttachments());
131-
// assertEquals(2, readTask.getAttachments().size());
132-
// assertNotNull(readTask.getAttachments().get(1).getCreated());
133-
// assertNotNull(readTask.getAttachments().get(1).getModified());
134-
// assertEquals(readTask.getAttachments().get(0).getCreated(), readTask.getAttachments().get(1).getModified());
130+
assertNotNull(readTask);
131+
assertNotNull(readTask.getAttachments());
132+
assertEquals(2, readTask.getAttachments().size());
133+
assertNotNull(readTask.getAttachments().get(1).getCreated());
134+
assertNotNull(readTask.getAttachments().get(1).getModified());
135+
assertEquals(readTask.getAttachments().get(0).getCreated(), readTask.getAttachments().get(1).getModified());
136+
// assertNotNull(readTask.getAttachments().get(0).getClassification());
137+
assertNotNull(readTask.getAttachments().get(0).getObjectReference());
135138
}
136139

137140
@WithAccessId(

0 commit comments

Comments
 (0)