diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java index 77030317a..cba58493d 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java @@ -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 { - @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; } diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java index 825dcc968..2e598a17e 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java @@ -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 { - @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 { - @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) diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java index 33034efa6..4feccef22 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java @@ -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( diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/TaskResourceAssemberTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/TaskResourceAssemberTest.java index 858af9702..ac7c8d067 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/TaskResourceAssemberTest.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/TaskResourceAssemberTest.java @@ -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 customAttributes, List 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 attachments, List resources) { + private void testEqualityAttachements( + List attachments, List 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()); + } } diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java index 58283b25b..9d1f11311 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java @@ -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);