TSK-1014: Fixed hateoas links

This commit is contained in:
Mustapha Zorgati 2020-01-07 21:15:47 +01:00 committed by Holger Hagen
parent c1d74b2126
commit 1a77810fc2
6 changed files with 161 additions and 23 deletions

View File

@ -1,6 +1,7 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.time.Instant;
import org.springframework.beans.BeanUtils;
@ -10,6 +11,8 @@ import org.springframework.stereotype.Component;
import pro.taskana.Classification;
import pro.taskana.ClassificationService;
import pro.taskana.exceptions.ClassificationNotFoundException;
import pro.taskana.exceptions.SystemException;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.ClassificationController;
@ -21,16 +24,23 @@ import pro.taskana.rest.ClassificationController;
public class ClassificationResourceAssembler
extends ResourceAssemblerSupport<Classification, ClassificationResource> {
@Autowired ClassificationService classificationService;
final ClassificationService classificationService;
public ClassificationResourceAssembler() {
@Autowired
public ClassificationResourceAssembler(ClassificationService classificationService) {
super(ClassificationController.class, ClassificationResource.class);
this.classificationService = classificationService;
}
public ClassificationResource toResource(Classification classification) {
ClassificationResource resource = new ClassificationResource(classification);
resource.add(
linkTo(ClassificationController.class).slash(classification.getId()).withSelfRel());
try {
resource.add(
linkTo(methodOn(ClassificationController.class).getClassification(classification.getId()))
.withSelfRel());
} catch (ClassificationNotFoundException e) {
throw new SystemException("caught unexpected Exception.", e.getCause());
}
return resource;
}

View File

@ -1,6 +1,7 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.time.Instant;
import java.util.Objects;
@ -21,16 +22,25 @@ import pro.taskana.rest.TaskController;
@Component
public class TaskResourceAssembler extends ResourceAssemblerSupport<Task, TaskResource> {
@Autowired private TaskService taskService;
private final TaskService taskService;
@Autowired private ClassificationSummaryResourceAssembler classificationAssembler;
private final ClassificationSummaryResourceAssembler classificationAssembler;
@Autowired private WorkbasketSummaryResourceAssembler workbasketAssembler;
private final WorkbasketSummaryResourceAssembler workbasketAssembler;
@Autowired private AttachmentResourceAssembler attachmentAssembler;
private final AttachmentResourceAssembler attachmentAssembler;
public TaskResourceAssembler() {
@Autowired
public TaskResourceAssembler(
TaskService taskService,
ClassificationSummaryResourceAssembler classificationAssembler,
WorkbasketSummaryResourceAssembler workbasketAssembler,
AttachmentResourceAssembler attachmentAssembler) {
super(TaskController.class, TaskResource.class);
this.taskService = taskService;
this.classificationAssembler = classificationAssembler;
this.workbasketAssembler = workbasketAssembler;
this.attachmentAssembler = attachmentAssembler;
}
@Override
@ -38,8 +48,8 @@ public class TaskResourceAssembler extends ResourceAssemblerSupport<Task, TaskRe
TaskResource resource;
try {
resource = new TaskResource(task);
resource.add(linkTo(TaskController.class).slash(task.getId()).withSelfRel());
} catch (InvalidArgumentException e) {
resource.add(linkTo(methodOn(TaskController.class).getTask(task.getId())).withSelfRel());
} catch (Exception e) {
throw new SystemException("caught unexpected Exception.", e.getCause());
}
return resource;

View File

@ -6,11 +6,15 @@ import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.time.Instant;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketService;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.SystemException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.WorkbasketController;
@ -20,14 +24,24 @@ import pro.taskana.rest.WorkbasketController;
* versa.
*/
@Component
public class WorkbasketResourceAssembler {
public class WorkbasketResourceAssembler
extends ResourceAssemblerSupport<Workbasket, WorkbasketResource> {
@Autowired private WorkbasketService workbasketService;
private final WorkbasketService workbasketService;
public WorkbasketResource toResource(Workbasket wb)
throws NotAuthorizedException, WorkbasketNotFoundException {
WorkbasketResource resource = new WorkbasketResource(wb);
return addLinks(resource, wb);
@Autowired
public WorkbasketResourceAssembler(WorkbasketService workbasketService) {
super(WorkbasketController.class, WorkbasketResource.class);
this.workbasketService = workbasketService;
}
public WorkbasketResource toResource(Workbasket wb) {
try {
WorkbasketResource resource = new WorkbasketResource(wb);
return addLinks(resource, wb);
} catch (Exception e) {
throw new SystemException("caught unexpected Exception.", e.getCause());
}
}
public Workbasket toModel(WorkbasketResource wbResource) {
@ -46,7 +60,7 @@ public class WorkbasketResourceAssembler {
}
private WorkbasketResource addLinks(WorkbasketResource resource, Workbasket wb)
throws NotAuthorizedException, WorkbasketNotFoundException {
throws NotAuthorizedException, WorkbasketNotFoundException, InvalidArgumentException {
resource.add(
linkTo(methodOn(WorkbasketController.class).getWorkbasket(wb.getId())).withSelfRel());
resource.add(
@ -55,7 +69,9 @@ public class WorkbasketResourceAssembler {
resource.add(
linkTo(methodOn(WorkbasketController.class).getWorkbasketAccessItems(wb.getId()))
.withRel("accessItems"));
resource.add(linkTo(WorkbasketController.class).withRel("allWorkbaskets"));
resource.add(
linkTo(methodOn(WorkbasketController.class).getWorkbaskets(new LinkedMultiValueMap<>()))
.withRel("allWorkbaskets"));
resource.add(
linkTo(
methodOn(WorkbasketController.class)

View File

@ -9,6 +9,7 @@ import pro.taskana.Classification;
import pro.taskana.ClassificationService;
import pro.taskana.TaskanaSpringBootTest;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.Mapping;
/** Test for {@link ClassificationResourceAssembler}. */
@TaskanaSpringBootTest
@ -47,6 +48,7 @@ class ClassificationAssemblerTest {
classificationResourceAssembler.toResource(classification);
// then
testEquality(classification, classificationResource);
testLinks(classificationResource);
}
@Test
@ -87,6 +89,13 @@ class ClassificationAssemblerTest {
testEquality(classification, classificationResource);
}
private void testLinks(ClassificationResource resource) {
Assert.assertEquals(1, resource.getLinks().size());
Assert.assertEquals(
Mapping.URL_CLASSIFICATIONS_ID.replaceAll("\\{.*}", resource.getClassificationId()),
resource.getLink("self").getHref());
}
private void testEquality(
Classification classification, ClassificationResource classificationResource) {
Assert.assertEquals(

View File

@ -1,5 +1,6 @@
package pro.taskana.rest.resource;
import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@ -8,18 +9,27 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import pro.taskana.Attachment;
import pro.taskana.Classification;
import pro.taskana.ClassificationService;
import pro.taskana.ObjectReference;
import pro.taskana.Task;
import pro.taskana.TaskService;
import pro.taskana.TaskState;
import pro.taskana.TaskanaSpringBootTest;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketService;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.impl.AttachmentImpl;
import pro.taskana.impl.TaskImpl;
import pro.taskana.rest.Mapping;
/** Test for {@link TaskResourceAssembler}. */
@TaskanaSpringBootTest
class TaskResourceAssemberTest {
@Autowired TaskService taskService;
@Autowired WorkbasketService workbasketService;
@Autowired ClassificationService classificationService;
@Autowired TaskResourceAssembler taskResourceAssembler;
@Test
@ -85,6 +95,65 @@ class TaskResourceAssemberTest {
testEquality(task, resource);
}
@Test
void testModelToResource() throws InvalidArgumentException {
// given
ObjectReference primaryObjRef = new ObjectReference();
primaryObjRef.setId("abc");
Workbasket workbasket = workbasketService.newWorkbasket("key", "domain");
Classification classification =
classificationService.newClassification("ckey", "cdomain", "MANUAL");
AttachmentImpl attachment = (AttachmentImpl) taskService.newAttachment();
attachment.setClassificationSummary(classification.asSummary());
attachment.setId("attachmentId");
TaskImpl task = (TaskImpl) taskService.newTask();
task.setId("taskId");
task.setExternalId("externalId");
task.setCreated(Instant.parse("2019-09-13T08:44:17.588Z"));
task.setClaimed(Instant.parse("2019-09-13T08:44:17.588Z"));
task.setCompleted(Instant.parse("2019-09-13T08:44:17.588Z"));
task.setModified(Instant.parse("2019-09-13T08:44:17.588Z"));
task.setPlanned(Instant.parse("2019-09-13T08:44:17.588Z"));
task.setDue(Instant.parse("2019-09-13T08:44:17.588Z"));
task.setName("name");
task.setCreator("creator");
task.setDescription("desc");
task.setNote("note");
task.setPriority(123);
task.setState(TaskState.READY);
task.setClassificationSummary(classification);
task.setWorkbasketSummary(workbasket.asSummary());
task.setBusinessProcessId("businessProcessId");
task.setParentBusinessProcessId("parentBusinessProcessId");
task.setOwner("owner");
task.setPrimaryObjRef(primaryObjRef);
task.setRead(true);
task.setTransferred(true);
task.setCustomAttributes(Collections.singletonMap("abc", "def"));
task.setCallbackInfo(Collections.singletonMap("ghi", "jkl"));
task.setAttachments(Collections.singletonList(attachment));
task.setCustom1("custom1");
task.setCustom2("custom2");
task.setCustom3("custom3");
task.setCustom4("custom4");
task.setCustom5("custom5");
task.setCustom6("custom6");
task.setCustom7("custom7");
task.setCustom8("custom8");
task.setCustom9("custom9");
task.setCustom10("custom10");
task.setCustom11("custom11");
task.setCustom12("custom12");
task.setCustom13("custom13");
task.setCustom14("custom14");
task.setCustom15("custom15");
// when
TaskResource resource = taskResourceAssembler.toResource(task);
// then
testEquality(task, resource);
testLinks(resource);
}
void testEquality(Task task, TaskResource resource) throws InvalidArgumentException {
Assert.assertEquals(task.getId(), resource.getTaskId());
Assert.assertEquals(task.getExternalId(), resource.getExternalId());
@ -139,7 +208,7 @@ class TaskResourceAssemberTest {
Assert.assertEquals(task.getCustomAttribute("16"), resource.getCustom16());
}
void testEquality(
private void testEquality(
Map<String, String> customAttributes, List<TaskResource.CustomAttribute> resourceAttributes) {
Assert.assertEquals(customAttributes.size(), resourceAttributes.size());
resourceAttributes.forEach(
@ -147,7 +216,8 @@ class TaskResourceAssemberTest {
Assert.assertEquals(customAttributes.get(attribute.getKey()), attribute.getValue()));
}
void testEqualityAttachements(List<Attachment> attachments, List<AttachmentResource> resources) {
private void testEqualityAttachements(
List<Attachment> attachments, List<AttachmentResource> resources) {
Assert.assertEquals(attachments.size(), resources.size());
for (int i = 0; i < resources.size(); i++) {
AttachmentResource resource = resources.get(i);
@ -156,4 +226,11 @@ class TaskResourceAssemberTest {
Assert.assertEquals(attachment.getId(), resource.getAttachmentId());
}
}
private void testLinks(TaskResource resource) {
Assert.assertEquals(1, resource.getLinks().size());
Assert.assertEquals(
Mapping.URL_TASKS_ID.replaceAll("\\{.*}", resource.getTaskId()),
resource.getLink("self").getHref());
}
}

View File

@ -12,6 +12,7 @@ import pro.taskana.WorkbasketType;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.Mapping;
/** Test for {@link WorkbasketResourceAssembler}. */
@TaskanaSpringBootTest
@ -40,9 +41,10 @@ class WorkbasketResourceAssemblerTest {
((WorkbasketImpl) workbasket).setCreated(Instant.parse("2010-01-01T12:00:00Z"));
((WorkbasketImpl) workbasket).setModified(Instant.parse("2010-01-01T12:00:00Z"));
// when
WorkbasketResource workbasketResource = workbasketResourceAssembler.toResource(workbasket);
WorkbasketResource resource = workbasketResourceAssembler.toResource(workbasket);
// then
testEquality(workbasket, workbasketResource);
testEquality(workbasket, resource);
verifyLinks(resource);
}
@Test
@ -98,6 +100,20 @@ class WorkbasketResourceAssemblerTest {
testEquality(workbasket, workbasketResource);
}
private void verifyLinks(WorkbasketResource workbasket) {
Assert.assertEquals(5, workbasket.getLinks().size());
Assert.assertEquals(
Mapping.URL_WORKBASKET_ID.replaceAll("\\{.*}", workbasket.getWorkbasketId()),
workbasket.getLink("self").getHref());
Assert.assertEquals(
Mapping.URL_WORKBASKET_ID_DISTRIBUTION.replaceAll("\\{.*}", workbasket.getWorkbasketId()),
workbasket.getLink("distributionTargets").getHref());
Assert.assertEquals(Mapping.URL_WORKBASKET, workbasket.getLink("allWorkbaskets").getHref());
Assert.assertEquals(
Mapping.URL_WORKBASKET_DISTRIBUTION_ID.replaceAll("\\{.*}", workbasket.getWorkbasketId()),
workbasket.getLink("removeDistributionTargets").getHref());
}
private void testEquality(Workbasket workbasket, WorkbasketResource workbasketResource) {
Assert.assertEquals(workbasket.getId(), workbasketResource.workbasketId);
Assert.assertEquals(workbasket.getKey(), workbasketResource.key);