diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml index 7ff1a14aaee0e525c35a2bb8e9c5c74f98fc862d..7313f258ef0803ee3ae1735ae058a9b396738a54 100644 --- a/goofy-server/pom.xml +++ b/goofy-server/pom.xml @@ -73,6 +73,10 @@ <artifactId>junit-jupiter-params</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.thedeanda</groupId> + <artifactId>lorem</artifactId> + </dependency> </dependencies> <build> diff --git a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java index a7a5c7b756b5d2cfb643fd6c3119e72c37e87a84..9ddcce81c00976e8f6fff9cb34953b56e8d60f28 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java @@ -31,7 +31,7 @@ public class RootController { public EntityModel<RootResource> getRootResource(HttpServletRequest request) { return ResourceBuilder.fromEntity(new RootResource())// .addLink(linkTo(RootController.class).withSelfRel()) // - .addLink(linkTo(methodOn(VorgangController.class).getAllByPage(1)).withRel(REL_VORGAENGE))// + .addLink(linkTo(methodOn(VorgangController.class).getAllByPage(0)).withRel(REL_VORGAENGE))// .buildResource(); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangController.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangController.java index f3fcd6312a65997c5edf806bae6a7c1a7be049c9..06b940a2e0e54caf9638065d4e580dd6b934ef1b 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangController.java @@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.thedeanda.lorem.LoremIpsum; + @RestController @RequestMapping("api/vorgangs") @ExposesResourceFor(Vorgang.class) @@ -27,8 +29,11 @@ public class VorgangController { @PostConstruct private void initDummyList() { for (int i = 0; i < 1000; i++) { - vorgangList.add(Vorgang.builder().name("Vorgang Nr. " + (i + 1)).status("Offen") - .initialDate(LocalDateTime.now()).build()); + vorgangList.add(Vorgang.builder()// + .name(String.valueOf(i) + ": " + LoremIpsum.getInstance().getWords(10))// + .status("VorgangStatus")// + .initialDate(LocalDateTime.now())// + .build()); } } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangResourceAssembler.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangResourceAssembler.java index 5d425bb7bae30a445d94e03f36fe855dc5d996c8..fc5858de4a1578c311719d2553c2cc87eebbbebc 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangResourceAssembler.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangResourceAssembler.java @@ -16,8 +16,10 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; import de.itvsh.goofy.common.ResourceBuilder; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Builder.Default; +import lombok.Getter; @Component public class VorgangResourceAssembler implements RepresentationModelAssembler<Vorgang, EntityModel<Vorgang>> { @@ -25,8 +27,6 @@ public class VorgangResourceAssembler implements RepresentationModelAssembler<Vo private final String REL_NEXT = "next"; private final String REL_PREVIOUS = "previous"; - int sizePerPage = 20; - @Autowired private EntityLinks entityLinks; @@ -43,26 +43,21 @@ public class VorgangResourceAssembler implements RepresentationModelAssembler<Vo } public CollectionModel<EntityModel<Vorgang>> toPagedCollectionModel(LinkedList<Vorgang> entities, int page) { - int start = page == 1 ? page : page + sizePerPage; - int end = start + sizePerPage; - - List<Vorgang> subList = entities.subList(start - 1, end - 1); - CollectionModel<EntityModel<Vorgang>> entityModelCollection = CollectionModel - .of(subList.stream().map(this::toModel).collect(Collectors.toList())); - - addPaginationLinks(entityModelCollection, CollectionEntityModelPage.builder()// + CollectionEntityPageModel model = CollectionEntityPageModel.builder()// + .sizePerPage(50)// .entityList(entities)// - .numberOfCurrentPage(page)// - .build()); + .currentPage(page)// + .build(); - return entityModelCollection; + return getPagedCollection(model); } + @Getter + @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder(toBuilder = true) - private static class CollectionEntityModelPage { - @Default - int sizePerPage = 22; - int numberOfCurrentPage; + private static class CollectionEntityPageModel { + int sizePerPage; + int currentPage; LinkedList<Vorgang> entityList; private long getTotalPages() { @@ -70,27 +65,73 @@ public class VorgangResourceAssembler implements RepresentationModelAssembler<Vo } private boolean hasNext() { - return numberOfCurrentPage < getTotalPages() ? true : false; + return currentPage < getTotalPages() ? true : false; } private boolean hasPrevious() { - return numberOfCurrentPage > 1; + return currentPage > 1; + } + } + + private CollectionModel<EntityModel<Vorgang>> getPagedCollection(CollectionEntityPageModel model) { + int startIndex = getStartIndex(model); + int endIndex = getEndIndex(model, startIndex); + + CollectionModel<EntityModel<Vorgang>> entityModelCollection = CollectionModel + .of(getSubList(model, startIndex, endIndex).stream()// + .map(this::toModel)// + .collect(Collectors.toList())); + + addPaginationLinks(entityModelCollection, model); + + return entityModelCollection; + } + + private int getStartIndex(CollectionEntityPageModel model) { + int startIndex = 0; + if (model.getCurrentPage() == 1) { + startIndex = model.getCurrentPage() + model.getSizePerPage() - 1; + } + if (model.getCurrentPage() > 1) { + startIndex = model.currentPage * model.getSizePerPage() - 1; + } + return startIndex; + } + + private int getEndIndex(CollectionEntityPageModel model, int startIndex) { + int endIndex = model.sizePerPage; + if (model.getCurrentPage() == 1) { + endIndex = startIndex + model.getSizePerPage() - 1; + } + if (model.getCurrentPage() > 1) { + endIndex = startIndex + model.getSizePerPage() - 1; + } + return endIndex; + } + + private List<Vorgang> getSubList(CollectionEntityPageModel model, int startIndex, int endIndex) { + List<Vorgang> subList = null; + if (endIndex < model.entityList.size()) { + subList = model.entityList.subList(startIndex, endIndex); + } else { + subList = model.entityList.subList(startIndex, model.entityList.size()); } + return subList; } private CollectionModel<EntityModel<Vorgang>> addPaginationLinks( - CollectionModel<EntityModel<Vorgang>> modelCollection, CollectionEntityModelPage entityModelPage) { + CollectionModel<EntityModel<Vorgang>> modelCollection, CollectionEntityPageModel entityModelPage) { VorgangController linkBuilder = methodOn(VorgangController.class); - modelCollection.add(linkTo(linkBuilder.getAllByPage(entityModelPage.numberOfCurrentPage)).withSelfRel()); + modelCollection.add(linkTo(linkBuilder.getAllByPage(entityModelPage.currentPage)).withSelfRel()); if (entityModelPage.hasNext()) { modelCollection.add(// - linkTo(linkBuilder.getAllByPage(entityModelPage.numberOfCurrentPage + 1)).withRel(REL_NEXT)); + linkTo(linkBuilder.getAllByPage(entityModelPage.currentPage + 1)).withRel(REL_NEXT)); } if (entityModelPage.hasPrevious()) { modelCollection.add(// - linkTo(linkBuilder.getAllByPage(entityModelPage.numberOfCurrentPage - 1)).withRel(REL_PREVIOUS)); + linkTo(linkBuilder.getAllByPage(entityModelPage.currentPage - 1)).withRel(REL_PREVIOUS)); } return modelCollection; } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..d1f18dbda58bdfc2542b58c8b783e4a5d0d063ac --- /dev/null +++ b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangTestFactory.java @@ -0,0 +1,26 @@ +package de.itvsh.goofy.vorgang; + +import java.time.LocalDateTime; +import java.util.UUID; + +import com.thedeanda.lorem.LoremIpsum; + +public class VorgangTestFactory { + + private static final String ID = UUID.randomUUID().toString(); + private static String NAME = LoremIpsum.getInstance().getWords(10); + private static String STATUS = "VorgangsStatus"; + private static LocalDateTime INITIAL_DATE = LocalDateTime.now(); + + public static Vorgang create() { + return createBuilder().build(); + } + + public static Vorgang.VorgangBuilder createBuilder() { + return Vorgang.builder()// + .id(ID)// + .name(NAME)// + .status(STATUS)// + .initialDate(INITIAL_DATE); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 09fa00e33bb296c2e88cdb577dcde3473c937063..aa1f6c3d86b19f30dfb51f1d037b116b7be58dc8 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ <java.version>15</java.version> <spring.boot.version>2.4.0</spring.boot.version> + <lorem.version>2.1</lorem.version> <!-- plugins --> <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> @@ -39,6 +40,12 @@ <type>pom</type> <scope>import</scope> </dependency> + <dependency> + <groupId>com.thedeanda</groupId> + <artifactId>lorem</artifactId> + <version>${lorem.version}</version> + <!-- <scope>test</scope> --> + </dependency> </dependencies> </dependencyManagement>