diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootModelAssembler.java index e62dd86b34e92a1292fe3ace76e4d9b2f3bcef20..d6715591975f7fdc22b2aba99bcea9e80e086b80 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootModelAssembler.java @@ -25,54 +25,51 @@ package de.ozgcloud.alfa; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.util.Optional; +import java.util.List; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.downloadtoken.DownloadTokenController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserRole; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor public class RootModelAssembler implements RepresentationModelAssembler<Root, EntityModel<Root>> { static final String REL_DOWNLOAD_TOKEN = "downloadToken"; static final String REL_CURRENT_USER = "currentUser"; static final String REL_DOCUMENTATIONS = "documentations"; - @Autowired - private RootViewLinkHandler viewLinkHandler; - @Autowired - private CurrentUserService currentUserService; - @Autowired - private UserManagerUrlProvider userManagerUrlProvider; + private final RootViewLinkHandler viewLinkHandler; + private final CurrentUserService currentUserService; + private final UserManagerUrlProvider userManagerUrlProvider; @Value("${ozgcloud.user-assistance.documentation.url:#{null}}") private String documentationUrl; @Override public EntityModel<Root> toModel(Root root) { - var modelBuilder = ModelBuilder.fromEntity(root) - .ifMatch(this::hasAnyRole).addLinks( + var model = EntityModel.of(root) + .addAllIf(hasAnyRole(), () -> List.of( linkTo(RootController.class).withSelfRel(), - linkTo(DownloadTokenController.class).withRel(REL_DOWNLOAD_TOKEN)) - .ifMatch(userManagerUrlProvider::isConfiguredForUserProfile) - .addLinkIfPresent(this::buildCurrentUserLink) - .addLink(buildUserAssistanceDocumentationUrl()); + linkTo(DownloadTokenController.class).withRel(REL_DOWNLOAD_TOKEN))) + .addAllIf(userManagerUrlProvider.isConfiguredForUserProfile(), this::buildCurrentUserLink) + .add(buildUserAssistanceDocumentationUrl()); if (hasAnyRole()) { - viewLinkHandler.addViewLinks(modelBuilder, currentUserService.findUserId()); + viewLinkHandler.addViewLinks(model, currentUserService.findUserId()); } - return modelBuilder.buildModel(); + return model; } boolean hasAnyRole() { @@ -83,12 +80,12 @@ public class RootModelAssembler implements RepresentationModelAssembler<Root, En return currentUserService.hasRole(UserRole.VERWALTUNG_USER) || currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE); } - private Optional<Link> buildCurrentUserLink() { + private List<Link> buildCurrentUserLink() { return currentUserService.findUserId().map(userId -> Link.of(String.format(userManagerUrlProvider.getUserProfileTemplate(), userId)) - .withRel(REL_CURRENT_USER)); + .withRel(REL_CURRENT_USER)).stream().toList(); } - private Optional<Link> buildUserAssistanceDocumentationUrl() { - return Optional.ofNullable(documentationUrl).filter(StringUtils::isNotBlank).map(href -> Link.of(href, REL_DOCUMENTATIONS)); + private List<Link> buildUserAssistanceDocumentationUrl() { + return Stream.of(documentationUrl).filter(StringUtils::isNotBlank).map(href -> Link.of(href, REL_DOCUMENTATIONS)).toList(); } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java index 80f77f5181edd904055c5b2c704d5d44bed5ffa2..a8af53edb791331f6beb006f0b95bd89d8758f8d 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java @@ -28,12 +28,11 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.List; import java.util.Optional; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.server.LinkBuilder; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserRole; @@ -41,8 +40,10 @@ import de.ozgcloud.alfa.system.SystemStatusService; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangController; import lombok.NonNull; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor class RootViewLinkHandler { static final String VORGAENGE_ALL_REL_TEMPLATE = "vorgaenge_%s_all"; @@ -67,23 +68,21 @@ class RootViewLinkHandler { static final int PAGE_SIZE = 100; - @Autowired - private CurrentUserService currentUserService; - @Autowired - private SystemStatusService systemStatusService; + private final CurrentUserService currentUserService; + private final SystemStatusService systemStatusService; private final List<VorgangStatus> statusList = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN); - public void addViewLinks(ModelBuilder<Root> modelBuilder, Optional<UserId> userId) { - modelBuilder.addLink(buildGetAllVorgaengeLink()); - addSearchAllVorgaengeLink(modelBuilder); + public void addViewLinks(EntityModel<Root> model, Optional<UserId> userId) { + model.add(buildGetAllVorgaengeLink()); + addSearchAllVorgaengeLink(model); if (currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)) { - addViewLinksForVerwaltungPoststelle(modelBuilder, userId); + addViewLinksForVerwaltungPoststelle(model, userId); } if (currentUserService.hasRole(UserRole.VERWALTUNG_USER)) { - addViewLinksForVerwaltungUser(modelBuilder, userId); + addViewLinksForVerwaltungUser(model, userId); } } @@ -91,9 +90,9 @@ class RootViewLinkHandler { return linkTo(methodOn(VorgangController.class).getAll(0, PAGE_SIZE)).withRel(ALL_VORGAENGE_REL); } - void addSearchAllVorgaengeLink(ModelBuilder<Root> modelBuilder) { + void addSearchAllVorgaengeLink(EntityModel<Root> model) { if (systemStatusService.isSearchServerAvailable()) { - modelBuilder.addLink(buildGetAllVorgaengeBySearchByLink()); + model.add(buildGetAllVorgaengeBySearchByLink()); } } @@ -101,34 +100,33 @@ class RootViewLinkHandler { return linkTo(methodOn(VorgangController.class).getAllBySearchBy(0, PAGE_SIZE, null)).withRel(SEARCH_ALL_REL); } - void addViewLinksForVerwaltungPoststelle(ModelBuilder<Root> modelBuilder, Optional<UserId> userId) { - userId.map(this::buildMyVorgaengeLink).ifPresent(modelBuilder::addLink); + void addViewLinksForVerwaltungPoststelle(EntityModel<Root> model, Optional<UserId> userId) { + userId.map(this::buildMyVorgaengeLink).ifPresent(model::add); if (systemStatusService.isSearchServerAvailable()) { - userId.map(this::buildSearchMyVorgaengeLink).ifPresent(modelBuilder::addLink); + userId.map(this::buildSearchMyVorgaengeLink).ifPresent(model::add); } } - void addViewLinksForVerwaltungUser(ModelBuilder<Root> modelBuilder, Optional<UserId> userId) { - addAllVorgangStatusLinks(modelBuilder); + void addViewLinksForVerwaltungUser(EntityModel<Root> model, Optional<UserId> userId) { + addAllVorgangStatusLinks(model); - modelBuilder.addLink(buildGetAllUnassignedVorgaengeLink()); - modelBuilder.addLinks(buildUnassignedVorgaengeStatusLinks()); + model.add(buildGetAllUnassignedVorgaengeLink()); + model.add(buildUnassignedVorgaengeStatusLinks()); - userId.map(this::buildMyVorgaengeLink).ifPresent(modelBuilder::addLink); - userId.map(this::buildMyVorgaengeStatusLinks).ifPresent(modelBuilder::addLinks); + userId.map(this::buildMyVorgaengeLink).ifPresent(model::add); + userId.map(this::buildMyVorgaengeStatusLinks).ifPresent(model::add); if (systemStatusService.isSearchServerAvailable()) { - userId.map(this::buildSearchMyVorgaengeLink).ifPresent(modelBuilder::addLink); - modelBuilder.addLink(buildSearchUnassignedVorgaengeLink()); + userId.map(this::buildSearchMyVorgaengeLink).ifPresent(model::add); + model.add(buildSearchUnassignedVorgaengeLink()); } - modelBuilder.addLink(buildGetAllByHasNextWiedervorlageFristLink().withRel(ALL_WIEDERVORLAGEN_REL)); - modelBuilder - .addLink(buildGetAllByAssignedToAndHasNextWiedervorlageFristLink(UserId.empty(), UNASSIGNED_WIEDERVORLAGEN_REL)); - userId.map(id -> buildGetAllByAssignedToAndHasNextWiedervorlageFristLink(id, MY_WIEDERVORLAGEN_REL)).ifPresent(modelBuilder::addLink); + model.add(buildGetAllByHasNextWiedervorlageFristLink().withRel(ALL_WIEDERVORLAGEN_REL)); + model.add(buildGetAllByAssignedToAndHasNextWiedervorlageFristLink(UserId.empty(), UNASSIGNED_WIEDERVORLAGEN_REL)); + userId.map(id -> buildGetAllByAssignedToAndHasNextWiedervorlageFristLink(id, MY_WIEDERVORLAGEN_REL)).ifPresent(model::add); - addGetByUngeleseneNachrichtenLinks(modelBuilder, userId); + addGetByUngeleseneNachrichtenLinks(model, userId); } Link buildGetAllUnassignedVorgaengeLink() { @@ -155,12 +153,12 @@ class RootViewLinkHandler { return linkTo(methodOn(VorgangController.class).getAllByAssignedToAndSearchBy(0, PAGE_SIZE, userId, null)); } - void addAllVorgangStatusLinks(ModelBuilder<Root> modelBuilder) { - addVorgangStatusLinks(modelBuilder, VORGAENGE_ALL_REL_TEMPLATE); + void addAllVorgangStatusLinks(EntityModel<Root> model) { + addVorgangStatusLinks(model, VORGAENGE_ALL_REL_TEMPLATE); } - void addVorgangStatusLinks(ModelBuilder<Root> modelBuilder, String linkRelTemplate) { - statusList.forEach(status -> modelBuilder.addLink(buildGetAllVorgaengeByStatus(status, linkRelTemplate))); + void addVorgangStatusLinks(EntityModel<Root> model, String linkRelTemplate) { + statusList.forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate))); } Link buildGetAllVorgaengeByStatus(VorgangStatus status, String linkRelTemplate) { @@ -199,21 +197,21 @@ class RootViewLinkHandler { VorgangController.PARAM_NEXT_WIEDERVORLAGE_FRIST_EXISTS)).withRel(linkRel); } - void addGetByUngeleseneNachrichtenLinks(ModelBuilder<Root> modelBuilder, Optional<UserId> userId) { - modelBuilder.addLink(buildGelAllByUngeleseneNachrichtenLink()); - modelBuilder.addLink(buildGetAllByAssignedToAndUngeleseneNachrichten(UserId.empty(), UNASSIGNED_UNGELESENE_NACHRICHTEN_REL)); - userId.map(id -> buildGetAllByAssignedToAndUngeleseneNachrichten(id, MY_UNGELESENE_NACHRICHTEN_REL)).ifPresent(modelBuilder::addLink); + void addGetByUngeleseneNachrichtenLinks(EntityModel<Root> model, Optional<UserId> userId) { + model.add(buildGelAllByUngeleseneNachrichtenLink()); + model.add(buildGetAllByAssignedToAndUngeleseneNachrichten(UserId.empty(), UNASSIGNED_UNGELESENE_NACHRICHTEN_REL)); + userId.map(id -> buildGetAllByAssignedToAndUngeleseneNachrichten(id, MY_UNGELESENE_NACHRICHTEN_REL)).ifPresent(model::add); } Link buildGelAllByUngeleseneNachrichtenLink() { return linkTo(methodOn(VorgangController.class) .getAllByUngeleseneNachrichten(0, PAGE_SIZE, VorgangController.PARAM_NACHRICHTEN_UNGELESENE)) - .withRel(ALL_UNGELESENE_NACHRICHTEN_REL); + .withRel(ALL_UNGELESENE_NACHRICHTEN_REL); } Link buildGetAllByAssignedToAndUngeleseneNachrichten(@NonNull UserId userId, String linkRel) { return linkTo(methodOn(VorgangController.class) .getAllByAssignedToAndUngeleseneNachrichten(0, PAGE_SIZE, userId, VorgangController.PARAM_NACHRICHTEN_UNGELESENE)) - .withRel(linkRel); + .withRel(linkRel); } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java index cdcc60be022212764463013dd956efa906508806..88f929500547e5791e33ff45fa4d4ba383b0a044 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java @@ -36,7 +36,6 @@ import org.springframework.stereotype.Component; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; import de.ozgcloud.alfa.common.CollectionModelBuilder; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -53,10 +52,8 @@ class CollaborationModelAssembler implements RepresentationModelAssembler<Collab @Override public EntityModel<Collaboration> toModel(Collaboration collaboration) { var selfLink = linkTo(methodOn(CollaborationController.class).getById(collaboration.getId())).withSelfRel(); - - return ModelBuilder.fromEntity(collaboration) - .addLink(selfLink) - .buildModel(); + return EntityModel.of(collaboration) + .add(selfLink); } public CollectionModel<EntityModel<Collaboration>> toCollectionModel(Stream<? extends Collaboration> entities, String vorgangId) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java index b1c4dd3da3b2f4846590bd6afb9f94ae0d9e3220..2f75114f05193871bb4c78621f119d912075065f 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java @@ -25,6 +25,7 @@ package de.ozgcloud.alfa.collaboration; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; +import java.util.List; import java.util.Objects; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -35,7 +36,6 @@ import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -60,12 +60,10 @@ class CollaborationVorgangProcessor implements RepresentationModelProcessor<Enti if (Objects.isNull(vorgang) || !currentUserService.hasRole(UserRole.VERWALTUNG_USER)) { return model; } - - return ModelBuilder.fromModel(model) - .ifMatch(() -> !collaborationService.hasCollaboration(vorgang.getId())) - .addLinks(buildSearchOrganisationsEinheitLink(), buildSearchFachstelleLink()) - .addLink(linkTo(methodOn(CollaborationByVorgangController.class).getAllByVorgangId(vorgang.getId())).withRel(REL_COLLABORATIONS)) - .buildModel(); + model.addAllIf(!collaborationService.hasCollaboration(vorgang.getId()), + () -> List.of(buildSearchOrganisationsEinheitLink(), buildSearchFachstelleLink())) + .add(linkTo(methodOn(CollaborationByVorgangController.class).getAllByVorgangId(vorgang.getId())).withRel(REL_COLLABORATIONS)); + return model; } private Link buildSearchOrganisationsEinheitLink() { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleModelAssembler.java index 0b3a22989fd57212f3e4b93c3654d199174ed15f..9bc6f742c029bf7908c9559c22bc3ee81dfa0574 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleModelAssembler.java @@ -32,17 +32,14 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; - @Component class FachstelleModelAssembler implements RepresentationModelAssembler<Fachstelle, EntityModel<Fachstelle>> { @Override public EntityModel<Fachstelle> toModel(@Nonnull Fachstelle entity) { - return ModelBuilder.fromEntity(entity) - .addLink(linkTo(FachstelleController.class).slash(entity.getId()).withSelfRel()) - .buildModel(); + return EntityModel.of(entity) + .add(linkTo(FachstelleController.class).slash(entity.getId()).withSelfRel()); } @Override diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeaderModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeaderModelAssembler.java index 35bc52e64167f4ce8de05e37bf30502947c4b43d..a77ae2c76afb27e1fe2356e9e115d0b72813d4eb 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeaderModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeaderModelAssembler.java @@ -32,17 +32,14 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; - @Component class OrganisationsEinheitHeaderModelAssembler implements RepresentationModelAssembler<OrganisationsEinheitHeader, EntityModel<OrganisationsEinheitHeader>> { @Override public EntityModel<OrganisationsEinheitHeader> toModel(@Nonnull OrganisationsEinheitHeader entity) { - return ModelBuilder.fromEntity(entity) - .addLink(linkTo(OrganisationsEinheitController.class).slash(entity.getId()).withSelfRel()) - .buildModel(); + return EntityModel.of(entity) + .add(linkTo(OrganisationsEinheitController.class).slash(entity.getId()).withSelfRel()); } @Override diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitModelAssembler.java index ad3ee72f30874e2fee0f3ed5475b64c68b083029..1d699dcc740a6e21cdfd9628f4fccb5a54bf0432 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitModelAssembler.java @@ -29,15 +29,12 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; - @Component class OrganisationsEinheitModelAssembler implements RepresentationModelAssembler<OrganisationsEinheit, EntityModel<OrganisationsEinheit>> { @Override public EntityModel<OrganisationsEinheit> toModel(OrganisationsEinheit entity) { - return ModelBuilder.fromEntity(entity) - .addLink(linkTo(OrganisationsEinheitController.class).slash(entity.getId()).withSelfRel()) - .buildModel(); + return EntityModel.of(entity) + .add(linkTo(OrganisationsEinheitController.class).slash(entity.getId()).withSelfRel()); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/ModelBuilder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/ModelBuilder.java deleted file mode 100644 index f4b0b7a57d263954cd004a252f044a759a1abeb9..0000000000000000000000000000000000000000 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/ModelBuilder.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.alfa.common; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BooleanSupplier; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; -import java.util.stream.Collectors; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.reflect.FieldUtils; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.Link; -import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; - -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class ModelBuilder<T> { - - private static final Map<Class<?>, Map<Object, List<Field>>> ANNOTATED_FIELDS_BY_ANNOTATION = new ConcurrentHashMap<>(); - - private final T entity; - private final EntityModel<T> model; - - private final List<Link> links = new LinkedList<>(); - private final List<Function<EntityModel<T>, EntityModel<T>>> mapper = new LinkedList<>(); - - private ModelBuilder(T entity) { - this.entity = entity; - this.model = null; - } - - private ModelBuilder(EntityModel<T> model) { - this.entity = null; - this.model = model; - } - - public static <T> ModelBuilder<T> fromEntity(T entity) { - return new ModelBuilder<>(entity); - } - - public static <T> ModelBuilder<T> fromModel(EntityModel<T> model) { - return new ModelBuilder<>(model); - } - - public ModelBuilder<T> addLink(Link link) { - links.add(link); - return this; - } - - public ModelBuilder<T> addLink(Optional<Link> link) { - link.ifPresent(links::add); - return this; - } - - public ModelBuilder<T> addLinks(Link... links) { - this.links.addAll(Arrays.asList(links)); - return this; - } - - public ModelBuilder<T> addLinks(Collection<Link> links) { - this.links.addAll(links); - return this; - } - - public ConditionalLinkAdder ifMatch(Predicate<T> predicate) { - return new ConditionalLinkAdder(predicate.test(Objects.isNull(entity) ? model.getContent() : entity)); - } - - public ConditionalLinkAdder ifMatch(BooleanSupplier guard) { - return new ConditionalLinkAdder(guard.getAsBoolean()); - } - - public ModelBuilder<T> map(UnaryOperator<EntityModel<T>> mapper) { - this.mapper.add(mapper); - return this; - } - - public EntityModel<T> buildModel() { - var filteredLinks = links.stream().filter(Objects::nonNull).collect(Collectors.toSet()); - - EntityModel<T> buildedModel = Objects.isNull(model) ? EntityModel.of(entity) : model; - buildedModel = buildedModel.add(filteredLinks); - - addLinkByLinkedResourceAnnotationIfMissing(buildedModel); - - return applyMapper(buildedModel); - } - - private EntityModel<T> applyMapper(EntityModel<T> resource) { - Iterator<Function<EntityModel<T>, EntityModel<T>>> i = mapper.iterator(); - EntityModel<T> result = resource; - while (i.hasNext()) { - result = i.next().apply(result); - } - return result; - } - - private void addLinkByLinkedResourceAnnotationIfMissing(EntityModel<T> resource) { - getFields(LinkedResource.class).stream() - .filter(field -> shouldAddLink(resource, field)) - .forEach(field -> handleLinkedResourceField(resource, field)); - } - - private void handleLinkedResourceField(EntityModel<T> resource, Field field) { - getEntityFieldValue(field).map(Object::toString).filter(StringUtils::isNotBlank).ifPresent(val -> resource - .add(WebMvcLinkBuilder.linkTo(field.getAnnotation(LinkedResource.class).controllerClass()).slash(val) - .withRel(sanitizeName(field.getName())))); - } - - private boolean shouldAddLink(EntityModel<T> resource, Field field) { - return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) || resource.hasLink(sanitizeName(field.getName()))); - } - - private List<Field> getFields(Class<? extends Annotation> annotationClass) { - var fields = Optional.ofNullable(ANNOTATED_FIELDS_BY_ANNOTATION.get(getEntity().getClass())) - .map(fieldsByAnnotation -> fieldsByAnnotation.get(annotationClass)) - .orElseGet(Collections::emptyList); - - if (CollectionUtils.isEmpty(fields)) { - fields = FieldUtils.getFieldsListWithAnnotation(getEntity().getClass(), annotationClass); - - updateFields(annotationClass, fields); - } - return fields; - } - - private void updateFields(Class<? extends Annotation> annotationClass, List<Field> fields) { - var annotationMap = Optional.ofNullable(ANNOTATED_FIELDS_BY_ANNOTATION.get(getEntity().getClass())).orElseGet(HashMap::new); - annotationMap.put(annotationClass, fields); - - ANNOTATED_FIELDS_BY_ANNOTATION.put(annotationClass, annotationMap); - } - - private String sanitizeName(String fieldName) { - if (fieldName.endsWith("Id")) { - return fieldName.substring(0, fieldName.indexOf("Id")); - } - return fieldName; - } - - private Optional<Object> getEntityFieldValue(Field field) { - try { - field.setAccessible(true); - Optional<Object> value = Optional.ofNullable(field.get(getEntity())); - field.setAccessible(false); - return value; - } catch (IllegalArgumentException | IllegalAccessException e) { - LOG.warn("Cannot access field value of LinkedResource field.", e); - } - return Optional.empty(); - } - - private T getEntity() { - return Optional.ofNullable(entity == null ? model.getContent() : entity) - .orElseThrow(() -> new IllegalStateException("Entity must not null for ModelBuilding")); - } - - @RequiredArgsConstructor - public class ConditionalLinkAdder { - - public final boolean conditionFulfilled; - - public ModelBuilder<T> addLink(Supplier<Link> linkSupplier) { - if (conditionFulfilled) { - addLink(linkSupplier.get()); - } - return ModelBuilder.this; - } - - public ModelBuilder<T> addLinkIfPresent(Supplier<Optional<Link>> linkSupplier) { - if (conditionFulfilled) { - addLink(linkSupplier.get()); - } - return ModelBuilder.this; - } - - public ModelBuilder<T> addLink(Function<T, Link> linkBuilder) { - if (conditionFulfilled) { - addLink(linkBuilder.apply(getEntity())); - } - return ModelBuilder.this; - } - - public ModelBuilder<T> addLink(Link link) { - if (conditionFulfilled) { - links.add(link); - } - return ModelBuilder.this; - } - - public ModelBuilder<T> addLink(Optional<Link> link) { - if (conditionFulfilled) { - link.ifPresent(links::add); - } - return ModelBuilder.this; - } - - public ModelBuilder<T> addLinks(Link... links) { - if (conditionFulfilled) { - ModelBuilder.this.links.addAll(Arrays.asList(links)); - } - return ModelBuilder.this; - } - - @SafeVarargs - public final ModelBuilder<T> addLinks(Supplier<Link>... linkSuppliers) { - if (conditionFulfilled) { - for (int i = 0; i < linkSuppliers.length; i++) { - ModelBuilder.this.links.add(linkSuppliers[i].get()); - } - } - return ModelBuilder.this; - } - - public final ModelBuilder<T> addLinks(Supplier<Collection<Link>> linksSupplier) { - if (conditionFulfilled) { - linksSupplier.get().forEach(ModelBuilder.this.links::add); - } - - return ModelBuilder.this; - } - - } -} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java index 1f9e5345231f8f619b0951c4480d12f9cc5d2b78..bd287a72d97f68f5718fd278c5c9ef044ba4fbe5 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java @@ -32,7 +32,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.file.OzgFile; @Component @@ -43,10 +42,9 @@ public class BinaryFileModelAssembler implements RepresentationModelAssembler<Oz @Override public EntityModel<OzgFile> toModel(OzgFile file) { var selfLink = linkTo(BinaryFileController.class).slash(file.getId()); - - return ModelBuilder.fromEntity(file).addLink(selfLink.withSelfRel()) - .addLink(linkTo(BinaryFileController.class).slash(file.getId()).withRel(REL_DOWNLOAD)) - .buildModel(); + return EntityModel.of(file) + .add(selfLink.withSelfRel()) + .add(linkTo(BinaryFileController.class).slash(file.getId()).withRel(REL_DOWNLOAD)); } public CollectionModel<EntityModel<OzgFile>> toCollectionModel(Stream<OzgFile> entities) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java index 31f4bce83e9fd2493493ccf8629ff74aecd11927..94f0209dfd9324b206466fe52e0ae806d26fbb16 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java @@ -39,7 +39,6 @@ import org.springframework.stereotype.Component; import de.ozgcloud.alfa.bescheid.BescheidController; import de.ozgcloud.alfa.bescheid.DocumentController; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.forwarding.ForwardingController; import de.ozgcloud.alfa.kommentar.KommentarController; import de.ozgcloud.alfa.postfach.PostfachMailController; @@ -60,15 +59,12 @@ class CommandModelAssembler implements RepresentationModelAssembler<Command, Ent @Override public EntityModel<Command> toModel(Command command) { - return ModelBuilder.fromEntity(command) - .addLink(linkTo(CommandController.class).slash(command.getId()).withSelfRel()) - .ifMatch(CommandHelper.IS_DONE.and(HAS_KNOWN_COMMAND_ORDER)) - .addLink(() -> effectedResourceLinkByOrderType(command)) - .ifMatch(CommandHelper.IS_PENDING) - .addLink(() -> linkTo(CommandController.class).slash(command.getId()).withRel(REL_UPDATE)) - .ifMatch(IS_NOT_LOESCH_ANFORDERUNG_AND_REVOKEABLE) - .addLink(() -> linkTo(methodOn(CommandController.class).revoke(command.getId(), null)).withRel(REL_REVOKE)) - .buildModel(); + return EntityModel.of(command) + .add(linkTo(CommandController.class).slash(command.getId()).withSelfRel()) + .addIf(CommandHelper.IS_DONE.and(HAS_KNOWN_COMMAND_ORDER).test(command), () -> effectedResourceLinkByOrderType(command)) + .addIf(CommandHelper.IS_PENDING.test(command), () -> linkTo(CommandController.class).slash(command.getId()).withRel(REL_UPDATE)) + .addIf(IS_NOT_LOESCH_ANFORDERUNG_AND_REVOKEABLE.test(command), + () -> linkTo(methodOn(CommandController.class).revoke(command.getId(), null)).withRel(REL_REVOKE)); } Link effectedResourceLinkByOrderType(Command entity) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingModelAssembler.java index fdb6df92dd6fa7fc692974d1e079bb8567a1bb78..b43d53909e3b9bd82ae157fa96e394ea487d2fe5 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingModelAssembler.java @@ -35,7 +35,6 @@ import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.forwarding.Forwarding.Status; @@ -60,20 +59,13 @@ class ForwardingModelAssembler implements RepresentationModelAssembler<Forwardin @Override public EntityModel<Forwarding> toModel(Forwarding entity) { var selfLink = linkTo(ForwardingController.class).slash(entity.getId()); - - return ModelBuilder.fromEntity(entity) - .addLink(linkTo(ForwardingController.class).slash(entity.getId()).withSelfRel()) - .ifMatch(IS_SENT) - .addLinks(buildMarkAsSuccessLink(entity)) - .ifMatch(IS_SENT_OR_SUCCESSFULL) - .addLinks(buildMarkAsFailLink(entity)) - .ifMatch(IS_FAILED) - .addLink(selfLink.withRel(REL_FAILED)) - .ifMatch(IS_SUCCESSFULL) - .addLink(selfLink.withRel(REL_SUCCESSFULL)) - .ifMatch(IS_SEND_ERROR) - .addLink(selfLink.withRel(REL_ERROR)) - .buildModel(); + return EntityModel.of(entity) + .add(linkTo(ForwardingController.class).slash(entity.getId()).withSelfRel()) + .addIf(IS_SENT.test(entity), () -> buildMarkAsSuccessLink(entity)) + .addIf(IS_SENT_OR_SUCCESSFULL.test(entity), () -> buildMarkAsFailLink(entity)) + .addIf(IS_FAILED.test(entity), () -> selfLink.withRel(REL_FAILED)) + .addIf(IS_SUCCESSFULL.test(entity), () -> selfLink.withRel(REL_SUCCESSFULL)) + .addIf(IS_SEND_ERROR.test(entity), () -> selfLink.withRel(REL_ERROR)); } public CollectionModel<EntityModel<Forwarding>> toCollectionModel(Stream<Forwarding> entities) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintModelAssembler.java index f7639f549bba1143a6542cc19d3bcb46d98bb0af..ebb2b04267c66642d21158dae6f542155028a5be 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintModelAssembler.java @@ -33,8 +33,6 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; - @Component class HintModelAssembler implements RepresentationModelAssembler<Hint, EntityModel<Hint>> { @@ -44,7 +42,7 @@ class HintModelAssembler implements RepresentationModelAssembler<Hint, EntityMod @Override public EntityModel<Hint> toModel(Hint hint) { - return ModelBuilder.fromEntity(hint).addLink(buildSelfLink(hint)).buildModel(); + return EntityModel.of(hint).add(buildSelfLink(hint)); } private Link buildSelfLink(Hint hint) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintRootResourceProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintRootResourceProcessor.java index 651e14ef63583ef1e8b89d61bfa0cb4de7f22ba9..27e8c9a4e214adc4213e329e5b98f76e51e76948 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintRootResourceProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/hint/HintRootResourceProcessor.java @@ -25,27 +25,24 @@ package de.ozgcloud.alfa.hint; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.Root; -import de.ozgcloud.alfa.common.ModelBuilder; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor class HintRootResourceProcessor implements RepresentationModelProcessor<EntityModel<? extends Root>> { static final String HINTS_RELATION = "hints"; - @Autowired - private HintService service; + private final HintService service; @Override public EntityModel<? extends Root> process(EntityModel<? extends Root> model) { - return ModelBuilder.fromModel(model) - .ifMatch(service::hasHints) - .addLink(linkTo(HintController.class).withRel(HINTS_RELATION)) - .buildModel(); + model.addIf(service.hasHints(), () -> linkTo(HintController.class).withRel(HINTS_RELATION)); + return model; } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieModelAssembler.java index a88d362dfe834e164d5b7f5b33396ced8ed230da..1e6a3205439e9499e0714e6353166fd83273166b 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieModelAssembler.java @@ -35,7 +35,6 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import lombok.RequiredArgsConstructor; @@ -54,11 +53,11 @@ class HistorieModelAssembler implements RepresentationModelAssembler<Command, En @Override public EntityModel<Command> toModel(Command entity) { var cleanCommand = unsetSystemUser(entity); - var modelBuilder = ModelBuilder.fromEntity(cleanCommand).addLink(linkTo(HistorieController.class).slash(cleanCommand.getId()).withSelfRel()); + var model = EntityModel.of(cleanCommand, linkTo(HistorieController.class).slash(cleanCommand.getId()).withSelfRel()); - addAssignedTo(cleanCommand, modelBuilder); + addAssignedTo(cleanCommand, model); - return modelBuilder.buildModel(); + return model; } Command unsetSystemUser(Command entity) { @@ -73,13 +72,10 @@ class HistorieModelAssembler implements RepresentationModelAssembler<Command, En return Objects.nonNull(entity.getCreatedBy()) && entity.getCreatedBy().toString().startsWith(SYSTEM_USER_PREFIX); } - private void addAssignedTo(Command entity, ModelBuilder<Command> modelBuilder) { + private void addAssignedTo(Command entity, EntityModel<Command> model) { Optional.ofNullable(entity.getBody()).map(body -> body.get(ASSIGNED_TO_BODY_FIELD)) - .ifPresent(assignedTo -> { - if (userManagerUrlProvider.isConfiguredForUserProfile()) { - modelBuilder.addLink(Link.of(String.format(userManagerUrlProvider.getUserProfileTemplate(), assignedTo), REL_ASSIGNED_TO)); - } - }); + .ifPresent(assignedTo -> model.addIf(userManagerUrlProvider.isConfiguredForUserProfile(), + () -> Link.of(String.format(userManagerUrlProvider.getUserProfileTemplate(), assignedTo), REL_ASSIGNED_TO))); } public CollectionModel<EntityModel<Command>> toCollectionModel(Stream<Command> entities) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java index ed4c3a53428540126bb1e7440fbba411d9b58753..3ed9abdfc3c5b232fe96bab5aa1f106efb3c92b6 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java @@ -28,20 +28,20 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.function.Predicate; import java.util.stream.Stream; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.common.CollectionModelBuilder; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.kommentar.KommentarCommandController.KommentarCommandByVorgangController; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, EntityModel<Kommentar>> { static final String REL_CREATE = "create-kommentar"; @@ -51,8 +51,7 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, private static final Predicate<Kommentar> HAS_ATTACHMENTS = kommentar -> !kommentar.getAttachments().isEmpty(); - @Autowired - private VorgangController vorgangController; + private final VorgangController vorgangController; @Override public EntityModel<Kommentar> toModel(Kommentar kommentar) { @@ -65,12 +64,9 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, var commandLink = linkTo(methodOn(KommentarCommandController.class).editKommentar(null, kommentar.getId(), kommentar.getVersion())); var attachmentsLink = linkTo(methodOn(KommentarController.class).getAttachments(kommentar.getId())); - return ModelBuilder.fromEntity(kommentar).addLink(selfLink.withSelfRel()) - .ifMatch(() -> vorgangController.isEditable(vorgang)) - .addLink(commandLink.withRel(REL_EDIT)) - .ifMatch(HAS_ATTACHMENTS) - .addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) - .buildModel(); + return EntityModel.of(kommentar, selfLink.withSelfRel()) + .addIf(vorgangController.isEditable(vorgang), () -> commandLink.withRel(REL_EDIT)) + .addIf(HAS_ATTACHMENTS.test(kommentar), () -> attachmentsLink.withRel(REL_ATTACHMENTS)); } public CollectionModel<EntityModel<Kommentar>> toCollectionModel(Stream<Kommentar> entities, String vorgangId) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessor.java index a1843587039f98039222b661b48b5b2918dd8c5b..d915e9523520305363c1c246fceb0ad4cc4f0b59 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessor.java @@ -26,27 +26,25 @@ package de.ozgcloud.alfa.loeschanforderung; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.Objects; -import java.util.Optional; import java.util.function.Predicate; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItem; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandHelper; import de.ozgcloud.alfa.common.command.CommandOrder; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor class LoeschAnforderungCommandProcessor implements RepresentationModelProcessor<EntityModel<Command>> { - @Autowired - private LoeschAnforderungService service; + private final LoeschAnforderungService service; static final LinkRelation REL_REVOKE = LinkRelation.of("revoke"); @@ -62,17 +60,17 @@ class LoeschAnforderungCommandProcessor implements RepresentationModelProcessor< if (Objects.isNull(command)) { return model; } - return ModelBuilder.fromModel(model) - .ifMatch(IS_LOESCHEN_ANFORDERUNG_ZURUECKNEHMEN_AND_REVOKEABLE) - .addLink(() -> linkTo(methodOn(LoeschAnforderungCommandController.class).revoke(command.getRelationId(), command.getId(), null)) - .withRel(REL_REVOKE)) - .ifMatch(IS_VORGANG_ZUM_LOESCHEN_MARKIEREN_AND_REVOKEABLE) - .addLinkIfPresent(() -> buildLink(command)) - .buildModel(); + return model + .addIf(IS_LOESCHEN_ANFORDERUNG_ZURUECKNEHMEN_AND_REVOKEABLE.test(command), + () -> linkTo(methodOn(LoeschAnforderungCommandController.class).revoke(command.getRelationId(), command.getId(), null)) + .withRel(REL_REVOKE)) + .addAllIf(IS_VORGANG_ZUM_LOESCHEN_MARKIEREN_AND_REVOKEABLE.test(command), + () -> buildLink(command)); } - Optional<Link> buildLink(Command command) { - return service.findLoeschAnforderung(command.getVorgangId()).map(loeschAnforderung -> buildLink(loeschAnforderung, command.getId())); + Iterable<Link> buildLink(Command command) { + return service.findLoeschAnforderung(command.getVorgangId()).map(loeschAnforderung -> buildLink(loeschAnforderung, command.getId())).stream() + .toList(); } Link buildLink(VorgangAttachedItem loeschAnforderung, String commandId) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssembler.java index d2b91d808a956a20483ce342da8763de668f9a97..735ad323fc220c34836bafbc007cc0ec6f94752f 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssembler.java @@ -25,32 +25,30 @@ package de.ozgcloud.alfa.loeschanforderung; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor class LoeschAnforderungModelAssembler implements RepresentationModelAssembler<LoeschAnforderung, EntityModel<LoeschAnforderung>> { static final LinkRelation REL_EXECUTE_LOESCHEN = LinkRelation.of("execute_loeschen"); static final LinkRelation REL_LOESCH_ANFORDERUNG_ZURUECKNEHMEN = LinkRelation.of("zuruecknehmen"); - @Autowired - private LoeschAnforderungService loeschAnforderungService; + private final LoeschAnforderungService loeschAnforderungService; @Override public EntityModel<LoeschAnforderung> toModel(LoeschAnforderung loeschAnforderung) { - return ModelBuilder.fromEntity(loeschAnforderung) - .addLink(linkTo(methodOn(LoeschAnforderungController.class).getLoeschanforderung(loeschAnforderung.getId())).withSelfRel()) - .ifMatch(loeschAnforderungService::isAllowedToVorgangLoeschen) - .addLink(linkTo(methodOn(LoeschAnforderungCommandController.class).createCommand(loeschAnforderung.getId(), null)).withRel( - REL_EXECUTE_LOESCHEN)) - .addLink(linkTo(methodOn(LoeschAnforderungCommandController.class).createCommand(loeschAnforderung.getId(), null)).withRel( - REL_LOESCH_ANFORDERUNG_ZURUECKNEHMEN)) - .buildModel(); + return EntityModel.of(loeschAnforderung) + .add(linkTo(methodOn(LoeschAnforderungController.class).getLoeschanforderung(loeschAnforderung.getId())).withSelfRel()) + .addIf(loeschAnforderungService.isAllowedToVorgangLoeschen(loeschAnforderung), + () -> linkTo(methodOn(LoeschAnforderungCommandController.class).createCommand(loeschAnforderung.getId(), null)).withRel( + REL_EXECUTE_LOESCHEN)) + .add(linkTo(methodOn(LoeschAnforderungCommandController.class).createCommand(loeschAnforderung.getId(), null)).withRel( + REL_LOESCH_ANFORDERUNG_ZURUECKNEHMEN)); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java index 5281c140049b6c730996d7243ae76b3e0a3ec408..c37a359c0dbc26358097580328c4b295b1eb64b4 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java @@ -27,7 +27,6 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.List; import java.util.Objects; -import java.util.Optional; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; @@ -35,7 +34,6 @@ import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItem; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; @@ -68,12 +66,9 @@ class LoeschAnforderungVorgangProcessor implements RepresentationModelProcessor< } var vorgangAttachedItem = service.findLoeschAnforderung(vorgang.getId()); - - return ModelBuilder.fromModel(model) - .ifMatch(this::isLoeschenAnfordernAllowed) - .addLink(buildLoschenAnfordernLink(vorgang)) - .addLink(buildLoschAnforderungLink(vorgangAttachedItem)) - .buildModel(); + return model + .addIf(isLoeschenAnfordernAllowed(vorgang), () -> buildLoschenAnfordernLink(vorgang)) + .addIf(vorgangAttachedItem.isPresent(), () -> buildLoschAnforderungLink(vorgangAttachedItem.get())); } boolean isLoeschenAnfordernAllowed(Vorgang vorgang) { @@ -93,8 +88,7 @@ class LoeschAnforderungVorgangProcessor implements RepresentationModelProcessor< .withRel(REL_LOESCHEN_ANFORDERN); } - private Optional<Link> buildLoschAnforderungLink(Optional<VorgangAttachedItem> vorgangAttachedItem) { - return vorgangAttachedItem.map(item -> linkTo(methodOn(LoeschAnforderungController.class).getLoeschanforderung(item.getId())) - .withRel(REL_LOESCH_ANFORDERUNG)); + private Link buildLoschAnforderungLink(VorgangAttachedItem vorgangAttachedItem) { + return linkTo(methodOn(LoeschAnforderungController.class).getLoeschanforderung(vorgangAttachedItem.getId())).withRel(REL_LOESCH_ANFORDERUNG); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java index 8de875f0fae7795526b3f0b7ec0dd996a2a38d79..d857ac77a073b629badf46eb4462265f2d8aba2e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java @@ -39,7 +39,6 @@ import org.springframework.hateoas.mediatype.hal.HalModelBuilder; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -124,21 +123,20 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac public EntityModel<PostfachMail> toModel(PostfachMail postfachMail) { var selfLink = linkTo(PostfachMailController.class).slash(postfachMail.getId()); - return ModelBuilder.fromEntity(postfachMail).addLink(selfLink.withSelfRel()) - .ifMatch(IS_UNSEND).addLink(linkTo(PostfachMailCommandController.class, postfachMail.getId()).withRel(REL_SEND)) - .ifMatch(SENT_FAILED) - .addLink(linkTo(methodOn(PostfachMailCommandController.class).createCommand(postfachMail.getId(), null)) - .withRel(REL_RESEND_POSTFACH_MAIL)) - .ifMatch(IS_UNSEND) - .addLink(linkTo(methodOn(PostfachMailCommandController.class).createCommand(postfachMail.getId(), null)) - .withRel(REL_EDIT)) - .ifMatch(HAS_ATTACHMENTS) - .addLink(linkTo(methodOn(PostfachMailController.class).findAttachments(PostfachNachrichtId.from(postfachMail.getId()))) - .withRel(REL_ATTACHMENTS)) - .ifMatch(() -> userManagerUrlProvider.isConfiguredForUserProfile() && SENT_BY_CLIENT_USER.test(postfachMail)) - .addLink(() -> Link.of(String.format(userManagerUrlProvider.getUserProfileTemplate(), postfachMail.getCreatedBy()), - REL_CREATED_BY)) - .buildModel(); + return EntityModel.of(postfachMail) + .add(selfLink.withSelfRel()) + .addIf(IS_UNSEND.test(postfachMail), + () -> linkTo(PostfachMailCommandController.class, postfachMail.getId()).withRel(REL_SEND)) + .addIf(SENT_FAILED.test(postfachMail), + () -> linkTo(methodOn(PostfachMailCommandController.class).createCommand(postfachMail.getId(), null)) + .withRel(REL_RESEND_POSTFACH_MAIL)) + .addIf(IS_UNSEND.test(postfachMail), + () -> linkTo(methodOn(PostfachMailCommandController.class).createCommand(postfachMail.getId(), null)).withRel(REL_EDIT)) + .addIf(HAS_ATTACHMENTS.test(postfachMail), + () -> linkTo(methodOn(PostfachMailController.class).findAttachments(PostfachNachrichtId.from(postfachMail.getId()))) + .withRel(REL_ATTACHMENTS)) + .addIf(userManagerUrlProvider.isConfiguredForUserProfile() && SENT_BY_CLIENT_USER.test(postfachMail), + () -> Link.of(String.format(userManagerUrlProvider.getUserProfileTemplate(), postfachMail.getCreatedBy()), REL_CREATED_BY)); } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java index 47c76b1574946937db404c0342d93411f029cc6d..800829cb556d58a3bc55d030f3b9369d95e7c3ac 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java @@ -37,7 +37,6 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; import org.springframework.web.util.UriComponentsBuilder; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; @@ -137,13 +136,11 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent vorgang.getVersion(), null)).withRel(REL_VORGANG_ASSIGN); var wiedervorlagenLink = linkTo(methodOn(WiedervorlageController.class).findByVorgang(vorgang.getId())).withRel(REL_WIEDERVORLAGEN); - return ModelBuilder.fromEntity(vorgang) - .addLink(selfLinkBuilder.withSelfRel()) - .addLink(selfLinkBuilder.withRel(REL_VORGANG_MIT_EINGANG)) - .ifMatch(() -> isAssigneable(vorgang)) - .addLink(assignLink) - .ifMatch(() -> userService.hasRole(UserRole.VERWALTUNG_USER)).addLink(wiedervorlagenLink) - .buildModel(); + return EntityModel.of(vorgang) + .add(selfLinkBuilder.withSelfRel()) + .add(selfLinkBuilder.withRel(REL_VORGANG_MIT_EINGANG)) + .addIf(isAssigneable(vorgang), () -> (assignLink)) + .addIf(userService.hasRole(UserRole.VERWALTUNG_USER), () -> wiedervorlagenLink); } boolean isAssigneable(Vorgang vorgang) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java index a5014ff3e7ac1482d61d7c3b6e3b509f744b7fae..e6b7fc75996dc58968bd33cd7dd2431cbcfca61d 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessor.java @@ -37,7 +37,6 @@ import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.attachment.AttachmentByVorgangController; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.historie.HistorieController; @@ -83,29 +82,24 @@ class VorgangWithEingangProcessor implements RepresentationModelProcessor<Entity return model; } - return ModelBuilder.fromModel(model) - .addLink(linkTo(KommentarByVorgangController.class).slash(vorgang.getId()).slash("kommentars").withRel(REL_KOMMENTARE)) - .ifMatch(HAS_ATTACHMENTS) - .addLinks(linkTo(methodOn(AttachmentByVorgangController.class).getAllByVorgang(vorgang.getId())) - .withRel(REL_ATTACHMENTS), - linkTo(methodOn(AttachmentByVorgangController.class).download(vorgang.getId())) - .withRel(REL_DOWNLOAD_ATTACHMENTS)) - .ifMatch(HAS_REPRESENTATIONS) - .addLink(linkTo(methodOn(RepresentationByVorgangController.class).getAll(vorgang.getId())) - .withRel(REL_REPRESENTATIONS)) - .ifMatch(this::isPostfachConfigured) - .addLink(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withRel(REL_POSTFACH_MAILS)) - .addLink(linkTo(methodOn(HistorieController.class).getAll(vorgang.getId())).withRel(REL_HISTORIE)) - .ifMatch(() -> userManagerUrlProvider.isConfiguredForSearchUserProfile() && hasOrganisationsEinheitId(vorgang)) - .addLink(this::buildSearchUserProfilesLink) - .ifMatch(this::isProcessable) - .addLink( + return model + .add(linkTo(KommentarByVorgangController.class).slash(vorgang.getId()).slash("kommentars").withRel(REL_KOMMENTARE)) + .addAllIf(HAS_ATTACHMENTS.test(vorgang), () -> List.of( + linkTo(methodOn(AttachmentByVorgangController.class).getAllByVorgang(vorgang.getId())).withRel(REL_ATTACHMENTS), + linkTo(methodOn(AttachmentByVorgangController.class).download(vorgang.getId())).withRel(REL_DOWNLOAD_ATTACHMENTS))) + .addIf(HAS_REPRESENTATIONS.test(vorgang), + () -> linkTo(methodOn(RepresentationByVorgangController.class).getAll(vorgang.getId())).withRel(REL_REPRESENTATIONS)) + .addIf(isPostfachConfigured(), + () -> linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withRel(REL_POSTFACH_MAILS)) + .add(linkTo(methodOn(HistorieController.class).getAll(vorgang.getId())).withRel(REL_HISTORIE)) + .addIf(userManagerUrlProvider.isConfiguredForSearchUserProfile() && hasOrganisationsEinheitId(vorgang), + () -> buildSearchUserProfilesLink(vorgang)) + .addIf(isProcessable(vorgang), () -> linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), - null)).withRel(REL_PROCESS_VORGANG)) - .buildModel(); + null)).withRel(REL_PROCESS_VORGANG)); } - private boolean isPostfachConfigured(VorgangWithEingang vorgang) { + private boolean isPostfachConfigured() { return postfachMailController.isPostfachConfigured(); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessor.java index 2c2453560d8651d92c72673e29d17f6d75ce75c3..34de66b87575d17ed2aa13ce1aa43378f4ef9576 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessor.java @@ -27,13 +27,11 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.Objects; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; @@ -41,19 +39,18 @@ import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.forwarding.ForwardingController; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor public class VorgangWithEingangCommandProcessor implements RepresentationModelProcessor<EntityModel<VorgangWithEingang>> { static final LinkRelation REL_VORGANG_FORWARD = LinkRelation.of("forward"); static final LinkRelation REL_PENDING_COMMANDS = LinkRelation.of("pending-commands"); - @Autowired - private CurrentUserService userService; - @Autowired - private ForwardingController forwardingController; - @Autowired - private CommandController commandController; + private final CurrentUserService userService; + private final ForwardingController forwardingController; + private final CommandController commandController; @Override public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) { @@ -61,14 +58,12 @@ public class VorgangWithEingangCommandProcessor implements RepresentationModelPr if (Objects.isNull(vorgang)) { return model; } - return ModelBuilder.fromModel(model) - .ifMatch(this::isForwardingAllowed) - .addLink(linkTo( + return model + .addIf(isForwardingAllowed(vorgang), () -> linkTo( methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), null)).withRel(REL_VORGANG_FORWARD)) - .ifMatch(this::existsPendingCommands) - .addLink(linkTo(methodOn(CommandController.class).getPendingCommands(true, vorgang.getId())).withRel(REL_PENDING_COMMANDS)) - .buildModel(); + .addIf(existsPendingCommands(vorgang), + () -> linkTo(methodOn(CommandController.class).getPendingCommands(true, vorgang.getId())).withRel(REL_PENDING_COMMANDS)); } boolean isForwardingAllowed(VorgangWithEingang vorgang) { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java index c626a7ad29a639313e4d30a6c07bb59ea223112f..fb0c2b92289b5de2105824e5ecd89faa0c84cea3 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java @@ -39,12 +39,12 @@ import org.junit.jupiter.params.provider.EnumSource.Mode; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkRelation; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; @@ -66,36 +66,37 @@ class RootViewLinkHandlerTest { @Nested class TestAddViewLinks { - @Mock - private Root rootResource; + private Root rootResource = RootTestFactory.create(); private Optional<UserId> emptyUserId = Optional.empty(); @Test void shouldAddVorgaengeAllLink() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinks(modelBuilder, emptyUserId); + var model = EntityModel.of(rootResource); - assertThat(modelBuilder.buildModel().getLink(RootViewLinkHandler.ALL_VORGAENGE_REL)) + viewLinkHandler.addViewLinks(model, emptyUserId); + + assertThat(model.getLink(RootViewLinkHandler.ALL_VORGAENGE_REL)) .get().extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0&limit=100"); } @Test void shouldCallAddSearchAllVorgaengeLink() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinks(modelBuilder, emptyUserId); + var model = EntityModel.of(rootResource); + + viewLinkHandler.addViewLinks(model, emptyUserId); - verify(viewLinkHandler).addSearchAllVorgaengeLink(modelBuilder); + verify(viewLinkHandler).addSearchAllVorgaengeLink(model); } @Test void shouldAddLinksForVerwaltungPoststelle() { when(currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(true); - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinks(modelBuilder, emptyUserId); + var model = EntityModel.of(rootResource); + viewLinkHandler.addViewLinks(model, emptyUserId); - verify(viewLinkHandler).addViewLinksForVerwaltungPoststelle(modelBuilder, emptyUserId); + verify(viewLinkHandler).addViewLinksForVerwaltungPoststelle(model, emptyUserId); } @Test @@ -103,21 +104,21 @@ class RootViewLinkHandlerTest { when(currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(false); when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true); - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinks(modelBuilder, emptyUserId); + var model = EntityModel.of(rootResource); + viewLinkHandler.addViewLinks(model, emptyUserId); - verify(viewLinkHandler).addViewLinksForVerwaltungUser(modelBuilder, emptyUserId); + verify(viewLinkHandler).addViewLinksForVerwaltungUser(model, emptyUserId); } @DisplayName("for " + UserRole.VERWALTUNG_POSTSTELLE) @Nested class TestVerwaltungPoststelle { - private final ModelBuilder<Root> modelBuilder = ModelBuilder.fromEntity(rootResource); + private final EntityModel<Root> model = EntityModel.of(rootResource); @Test void shouldCallBuildMyVorgaengeLink() { - viewLinkHandler.addViewLinksForVerwaltungPoststelle(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungPoststelle(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildMyVorgaengeLink(UserProfileTestFactory.ID); } @@ -134,7 +135,7 @@ class RootViewLinkHandlerTest { void shouldCallBuildSearchMyVorgaengeLink() { when(systemStatusService.isSearchServerAvailable()).thenReturn(true); - viewLinkHandler.addViewLinksForVerwaltungPoststelle(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungPoststelle(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildSearchMyVorgaengeLink(UserProfileTestFactory.ID); } @@ -148,7 +149,7 @@ class RootViewLinkHandlerTest { void shouldNotCallBuildSearchMyVorgaengeLink() { when(systemStatusService.isSearchServerAvailable()).thenReturn(false); - viewLinkHandler.addViewLinksForVerwaltungPoststelle(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungPoststelle(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler, never()).buildSearchMyVorgaengeLink(any()); } @@ -160,18 +161,18 @@ class RootViewLinkHandlerTest { @Nested class TestVerwaltungUser { - private final ModelBuilder<Root> modelBuilder = ModelBuilder.fromEntity(rootResource); + private final EntityModel<Root> model = EntityModel.of(rootResource); @Test void shouldCallAddUnassignedVorgaengeLink() { - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildGetAllUnassignedVorgaengeLink(); } @Test void shouldCallAddMyVorgaengeLink() { - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildMyVorgaengeLink(UserProfileTestFactory.ID); } @@ -188,7 +189,7 @@ class RootViewLinkHandlerTest { void shouldCallBuildSearchMyVorgaengeLink() { when(systemStatusService.isSearchServerAvailable()).thenReturn(true); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildSearchMyVorgaengeLink(UserProfileTestFactory.ID); } @@ -202,7 +203,7 @@ class RootViewLinkHandlerTest { void shouldNotCallBuildSearchMyVorgaengeLink() { when(systemStatusService.isSearchServerAvailable()).thenReturn(false); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler, never()).buildSearchMyVorgaengeLink(any()); } @@ -211,21 +212,21 @@ class RootViewLinkHandlerTest { @Test void shouldCallAddVorgangStatusLinks() { - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); - verify(viewLinkHandler).addAllVorgangStatusLinks(modelBuilder); + verify(viewLinkHandler).addAllVorgangStatusLinks(model); } @Test void shouldCallAddMyVorgaengeStatusLinks() { - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildMyVorgaengeStatusLinks(UserProfileTestFactory.ID); } @Test void shouldCallAddUnassignedVorgaengeStatusLinks() { - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildUnassignedVorgaengeStatusLinks(); } @@ -242,7 +243,7 @@ class RootViewLinkHandlerTest { void shouldCallBuildSearchUnassignedVorgaengeLink() { when(systemStatusService.isSearchServerAvailable()).thenReturn(true); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildSearchUnassignedVorgaengeLink(); } @@ -256,7 +257,7 @@ class RootViewLinkHandlerTest { void shouldNotCallBuildSearchUnassignedVorgaengeLink() { when(systemStatusService.isSearchServerAvailable()).thenReturn(false); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler, never()).buildSearchUnassignedVorgaengeLink(); } @@ -269,10 +270,10 @@ class RootViewLinkHandlerTest { @Test void shouldAddAllLink() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + var model = EntityModel.of(rootResource); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); - assertThat(modelBuilder.buildModel().getLink(RootViewLinkHandler.ALL_WIEDERVORLAGEN_REL)) + assertThat(model.getLink(RootViewLinkHandler.ALL_WIEDERVORLAGEN_REL)) .get().extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0&limit=100&nextFrist=exists"); } @@ -282,38 +283,38 @@ class RootViewLinkHandlerTest { @Test void shouldAddAssignedLinkIfExists() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + var model = EntityModel.of(rootResource); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); - assertThat(modelBuilder.buildModel().getLink(RootViewLinkHandler.MY_WIEDERVORLAGEN_REL)) + assertThat(model.getLink(RootViewLinkHandler.MY_WIEDERVORLAGEN_REL)) .get().extracting(Link::getHref) .isEqualTo("/api/vorgangs?page=0&limit=100&assignedTo=" + UserProfileTestFactory.ID + "&nextFrist=exists"); } @Test void shoulNotAddAssignedLinkIfNotExists() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.empty()); + var model = EntityModel.of(rootResource); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.empty()); - assertThat(modelBuilder.buildModel().getLink(RootViewLinkHandler.MY_WIEDERVORLAGEN_REL)).isNotPresent(); + assertThat(model.getLink(RootViewLinkHandler.MY_WIEDERVORLAGEN_REL)).isNotPresent(); } } @Test void shouldAddUnassignedLink() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + var model = EntityModel.of(rootResource); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); - assertThat(modelBuilder.buildModel().getLink(RootViewLinkHandler.UNASSIGNED_WIEDERVORLAGEN_REL)) + assertThat(model.getLink(RootViewLinkHandler.UNASSIGNED_WIEDERVORLAGEN_REL)) .get().extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0&limit=100&assignedTo=&nextFrist=exists"); } } @Test void shouldAddLinksForUngeleseneNachrichten() { - viewLinkHandler.addViewLinksForVerwaltungUser(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); - verify(viewLinkHandler).addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + verify(viewLinkHandler).addGetByUngeleseneNachrichtenLinks(model, Optional.of(UserProfileTestFactory.ID)); } } @@ -325,10 +326,10 @@ class RootViewLinkHandlerTest { void shouldBeAddedIfSearchServerIsAvailable() { when(systemStatusService.isSearchServerAvailable()).thenReturn(true); - var modelBuilder = ModelBuilder.fromEntity(rootResource); - viewLinkHandler.addSearchAllVorgaengeLink(modelBuilder); + var model = EntityModel.of(rootResource); + viewLinkHandler.addSearchAllVorgaengeLink(model); - assertThat(modelBuilder.buildModel().getLink(RootViewLinkHandler.SEARCH_ALL_REL)) + assertThat(model.getLink(RootViewLinkHandler.SEARCH_ALL_REL)) .get().extracting(Link::getHref).isEqualTo("/api/vorgangs?page=0&limit=100&searchBy={searchBy}"); } @@ -336,10 +337,10 @@ class RootViewLinkHandlerTest { void shouldNotBeAddedIfSearchServerIsUnavailable() { when(systemStatusService.isSearchServerAvailable()).thenReturn(false); - var modelBuilder = spy(ModelBuilder.fromEntity(rootResource)); - viewLinkHandler.addSearchAllVorgaengeLink(modelBuilder); + var model = spy(EntityModel.of(rootResource)); + viewLinkHandler.addSearchAllVorgaengeLink(model); - verify(modelBuilder, never()).addLink(any(Link.class)); + verify(model, never()).add(any(Link.class)); } } @@ -404,13 +405,13 @@ class RootViewLinkHandlerTest { @Nested class TestAddAllVorgangStatusLinks { - private final ModelBuilder<Root> modelBuilder = ModelBuilder.fromEntity(rootResource); + private final EntityModel<Root> model = EntityModel.of(rootResource); @Test void shouldCallAddVorgangStatusLinks() { - viewLinkHandler.addAllVorgangStatusLinks(modelBuilder); + viewLinkHandler.addAllVorgangStatusLinks(model); - verify(viewLinkHandler).addVorgangStatusLinks(modelBuilder, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE); + verify(viewLinkHandler).addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE); } } @@ -619,9 +620,8 @@ class RootViewLinkHandlerTest { @Nested class TestAddGetByUngeleseneNachrichtenLinks { - @Mock - private Root rootResource; - private final ModelBuilder<Root> modelBuilder = ModelBuilder.fromEntity(rootResource); + private Root rootResource = RootTestFactory.create(); + private final EntityModel<Root> model = EntityModel.of(rootResource); private final Link linkAllUngeleseneNachrichten = Link.of(LoremIpsum.getInstance().getUrl()); private final Link linkMyUngeleseneNachrichten = Link.of(LoremIpsum.getInstance().getUrl()); private final Link linkUnassignedUngeleseneNachrichten = Link.of(LoremIpsum.getInstance().getUrl()); @@ -635,23 +635,23 @@ class RootViewLinkHandlerTest { @Test void shouldBuildLinkForUngeleseneNachrichten() { - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildGelAllByUngeleseneNachrichtenLink(); } @Test void shouldAddLinkForUngeleseneNachrichten() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); + var model = EntityModel.of(rootResource); - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.of(UserProfileTestFactory.ID)); - assertThat(modelBuilder.buildModel().getLinks()).contains(linkAllUngeleseneNachrichten); + assertThat(model.getLinks()).contains(linkAllUngeleseneNachrichten); } @Test void shouldBuildLinkForUnassignedUngeleseneNachrichten() { - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.empty()); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.empty()); verify(viewLinkHandler).buildGetAllByAssignedToAndUngeleseneNachrichten(UserId.empty(), RootViewLinkHandler.UNASSIGNED_UNGELESENE_NACHRICHTEN_REL); @@ -659,11 +659,11 @@ class RootViewLinkHandlerTest { @Test void shouldAddLinkForUnassignedUngeleseneNachrichten() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); + var model = EntityModel.of(rootResource); - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.empty()); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.empty()); - assertThat(modelBuilder.buildModel().getLinks()).contains(linkUnassignedUngeleseneNachrichten); + assertThat(model.getLinks()).contains(linkUnassignedUngeleseneNachrichten); } @Nested @@ -677,7 +677,7 @@ class RootViewLinkHandlerTest { @Test void shouldBuildLinkForMyUngeleseneNachrichten() { - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).buildGetAllByAssignedToAndUngeleseneNachrichten(UserProfileTestFactory.ID, RootViewLinkHandler.MY_UNGELESENE_NACHRICHTEN_REL); @@ -685,11 +685,11 @@ class RootViewLinkHandlerTest { @Test void shouldAddLinkForMyUngeleseneNachrichten() { - var modelBuilder = ModelBuilder.fromEntity(rootResource); + var model = EntityModel.of(rootResource); - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.of(UserProfileTestFactory.ID)); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.of(UserProfileTestFactory.ID)); - assertThat(modelBuilder.buildModel().getLinks()).contains(linkMyUngeleseneNachrichten); + assertThat(model.getLinks()).contains(linkMyUngeleseneNachrichten); } } @@ -698,7 +698,7 @@ class RootViewLinkHandlerTest { @Test void shouldNotBuildLinkForMyUngeleseneNachrichten() { - viewLinkHandler.addGetByUngeleseneNachrichtenLinks(modelBuilder, Optional.empty()); + viewLinkHandler.addGetByUngeleseneNachrichtenLinks(model, Optional.empty()); verify(viewLinkHandler, never()).buildGetAllByAssignedToAndUngeleseneNachrichten(UserProfileTestFactory.ID, RootViewLinkHandler.MY_UNGELESENE_NACHRICHTEN_REL); @@ -707,39 +707,40 @@ class RootViewLinkHandlerTest { } - // @DisplayName("Test user assistance documentation link") - // @Nested - // class TestDocumentationLink { + // @DisplayName("Test user assistance documentation link") + // @Nested + // class TestDocumentationLink { // - // private static final String DOCUMENTATION_URL = "http://alfa-docs"; + // private static final String DOCUMENTATION_URL = "http://alfa-docs"; // - // @Test - // void shouldNotHaveLinkForUndefinedUrl() { - // var link = viewLinkHandler.toModel(root); + // @Test + // void shouldNotHaveLinkForUndefinedUrl() { + // var link = viewLinkHandler.toModel(root); // - // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)).isEmpty(); - // } + // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)).isEmpty(); + // } // - // @Test - // void shouldHaveLinkForDefinedUrl() { - // ReflectionTestUtils.setField(viewLinkHandler, "documentationUrl", DOCUMENTATION_URL); + // @Test + // void shouldHaveLinkForDefinedUrl() { + // ReflectionTestUtils.setField(viewLinkHandler, "documentationUrl", + // DOCUMENTATION_URL); // - // var link = viewLinkHandler.toModel(root); + // var link = viewLinkHandler.toModel(root); // - // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)) - // .isPresent() - // .map(Link::getHref) - // .hasValue(DOCUMENTATION_URL); - // } + // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)) + // .isPresent() + // .map(Link::getHref) + // .hasValue(DOCUMENTATION_URL); + // } // - // @Test - // void shouldNotHaveLinkForEmptyStringUrl() { - // ReflectionTestUtils.setField(viewLinkHandler, "documentationUrl", ""); + // @Test + // void shouldNotHaveLinkForEmptyStringUrl() { + // ReflectionTestUtils.setField(viewLinkHandler, "documentationUrl", ""); // - // var link = viewLinkHandler.toModel(root); + // var link = viewLinkHandler.toModel(root); // - // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)).isEmpty(); - // } + // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)).isEmpty(); + // } // - // } + // } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java index 65a005968b4a5ce3a2b3cac0883123ae1dbc928a..446bf2d7d5908164e30aa95456f9743230bbeff9 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java @@ -46,7 +46,7 @@ import org.springframework.hateoas.Link; import org.springframework.web.util.UriTemplate; import de.ozgcloud.alfa.bescheid.BescheidController.BescheidByVorgangController; -import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.LinkedResourceTestUtils; import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.postfach.PostfachMailController; @@ -67,9 +67,6 @@ class BescheidModelAssemblerTest { @InjectMocks private BescheidModelAssembler assembler; - @InjectMocks - private LinkedResourceProcessor linkedResourceProcessor; - @Mock private BescheidService bescheidService; @@ -261,9 +258,8 @@ class BescheidModelAssemblerTest { return callToModel(bescheid); } - @SuppressWarnings("unchecked") private EntityModel<Bescheid> callToModel(Bescheid bescheid) { - return (EntityModel<Bescheid>) linkedResourceProcessor.process(assembler.toModel(bescheid)); + return LinkedResourceTestUtils.processLinkedResource(assembler.toModel(bescheid)); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentModelAssemblerTest.java index 559725a50cf6c9d2ae2a4787e86492b6fc381806..29f78b4071dbc722d9c3d3e6159b0b57a1b6fa2c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentModelAssemblerTest.java @@ -28,20 +28,17 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.LinkedResourceTestUtils; class DocumentModelAssemblerTest { @Spy private DocumentModelAssembler assembler; - @InjectMocks - private LinkedResourceProcessor linkedResourceProcessor; @Nested class TestToModel { @@ -64,9 +61,8 @@ class DocumentModelAssemblerTest { .isEqualTo("/api/binaryFiles/" + DocumentTestFactory.FILE_ID); } - @SuppressWarnings("unchecked") private EntityModel<Document> callToModel() { - return (EntityModel<Document>) linkedResourceProcessor.process(assembler.toModel(document)); + return LinkedResourceTestUtils.processLinkedResource(assembler.toModel(document)); } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java index 3f4db275292b754887a4287662e537e5fba55284..7878bfea3516d09f6f7d4e26a12af9e6506c9783 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java @@ -41,7 +41,7 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.UriTemplate; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; -import de.ozgcloud.alfa.common.ModelBuilder; +import de.ozgcloud.alfa.common.LinkedResourceTestUtils; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -76,7 +76,7 @@ class CollaborationModelAssemblerTest { @Test void shouldHaveLinkToOrganisationsEinheit() { - var entityModel = callAssembler(); + var entityModel = LinkedResourceTestUtils.processLinkedResource(callAssembler()); assertThat(entityModel.getLink(REL_ZUSTAENDIGE_STELLE)).get().extracting(Link::getHref) .isEqualTo(OrganisationsEinheitController.PATH + "/" + OrganisationsEinheitTestFactory.ID); @@ -101,7 +101,7 @@ class CollaborationModelAssemblerTest { @Test void shouldHaveLinkToFachstelle() { - var entityModel = callAssembler(); + var entityModel = LinkedResourceTestUtils.processLinkedResource(callAssembler()); assertThat(entityModel.getLink(REL_ZUSTAENDIGE_STELLE)).get().extracting(Link::getHref) .isEqualTo(FachstelleController.PATH + "/" + FachstelleTestFactory.ID); @@ -143,7 +143,7 @@ class CollaborationModelAssemblerTest { @Test void shouldHaveEntityModel() { - var entityModel = ModelBuilder.fromEntity(collaboration).buildModel(); + var entityModel = EntityModel.of(collaboration); doReturn(entityModel).when(assembler).toModel(collaboration); var collectionModel = callAssembler(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java index e275742843e2a0256f9d8b4aa3fb2ae45e055c4a..271ce3f758596b7a5426c7dc4917c89f67940784 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java @@ -38,7 +38,6 @@ import org.springframework.web.util.UriComponentsBuilder; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; import de.ozgcloud.alfa.common.EntityModelTestFactory; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -57,8 +56,6 @@ class CollaborationVorgangProcessorTest { @Mock private CurrentUserService currentUserService; - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @Nested class TestProcess { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..819e2d402ab51afe04b34aa0fc452a83d50cf0f1 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java @@ -0,0 +1,16 @@ +package de.ozgcloud.alfa.common; + +import org.springframework.hateoas.EntityModel; + +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; + +public class LinkedResourceTestUtils { + + public static <T> EntityModel<T> processLinkedResource(EntityModel<T> model) { + return new LinkedResourceProcessor<T>(null).process(model); + } + + public static <T> EntityModel<T> processUserProfileResource(EntityModel<T> model, UserManagerUrlProvider userManagerUrlProvider) { + return new LinkedResourceProcessor<T>(userManagerUrlProvider).process(model); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/ModelBuilderTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/ModelBuilderTest.java deleted file mode 100644 index 0c53bc9e4909d6f95264e6e69be1d9988105a7f4..0000000000000000000000000000000000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/ModelBuilderTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.alfa.common; - -import static org.assertj.core.api.Assertions.*; - -import java.util.UUID; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.mockito.Mock; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; -import org.springframework.web.bind.annotation.RequestMapping; - -import lombok.Builder; - -class ModelBuilderTest { - - @DisplayName("Add link by annotation if missing") - @Nested - class TestAddLinkByAnnotationIfMissing { - - @Mock - private ApplicationContext context; - @Mock - private Environment env; - - private TestEntity entity = TestEntityTestFactory.create(); - - @Test - void shouldHaveAddLinkByLinkedResource() { - var model = ModelBuilder.fromEntity(entity).buildModel(); - - assertThat(model.getLink(TestController.FILE_REL).get().getHref()).isEqualTo(TestController.PATH + "/" + TestEntityTestFactory.FILE); - } - - @ParameterizedTest - @NullAndEmptySource - void shouldNotAddLinkByLinkedRessourceIfFieldValueIsNotSet(String fileId) { - var model = ModelBuilder.fromEntity(TestEntityTestFactory.createBuilder().file(fileId).build()).buildModel(); - - assertThat(model.getLink(TestController.FILE_REL)).isEmpty(); - } - } - - @DisplayName("if usermanager is not configured") - @Nested - class TestNotAddLinkByAnnotationIfNotConfigured { - - private TestEntity entity = TestEntityTestFactory.create(); - - @Test - void shouldHaveAddLinkByLinkedResource() { - var model = ModelBuilder.fromEntity(entity).buildModel(); - - assertThat(model.getLink(TestController.FILE_REL).get().getHref()).isEqualTo(TestController.PATH + "/" + TestEntityTestFactory.FILE); - } - } -} - -@Builder -class TestEntity { - - @LinkedResource(controllerClass = TestController.class) - private String file; - - @LinkedUserProfileResource - private String user; -} - -@RequestMapping(TestController.PATH) -class TestController { - - static final String PATH = "/api/test"; - - static final String USER_REL = "user"; - static final String FILE_REL = "file"; - -} - -class TestEntityTestFactory { - - static final String USER = UUID.randomUUID().toString(); - static final String FILE = UUID.randomUUID().toString(); - - public static TestEntity create() { - return createBuilder().build(); - } - - public static TestEntity.TestEntityBuilder createBuilder() { - return TestEntity.builder() - .file(FILE) - .user(USER); - } -} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssemblerTest.java index 5696644059884d034dde92770ab23f5025a25e8e..edfbc4ca3b81e05badab3893425974cc00a48ad2 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssemblerTest.java @@ -36,7 +36,7 @@ import de.ozgcloud.alfa.common.file.OzgFileTestFactory; class BinaryFileModelAssemblerTest { - @InjectMocks // NOSONAR + @InjectMocks private BinaryFileModelAssembler modelAssembler; @Nested diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/historie/HistorieModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/historie/HistorieModelAssemblerTest.java index 441e90c039efc54141b574f2aa44939f88b0aad3..4122969ffbce6e408d19fe31ec962b7f94fe886c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/historie/HistorieModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/historie/HistorieModelAssemblerTest.java @@ -39,8 +39,7 @@ import org.springframework.hateoas.Link; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.alfa.common.LinkedResourceProcessor; -import de.ozgcloud.alfa.common.command.Command; +import de.ozgcloud.alfa.common.LinkedResourceTestUtils; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; @@ -122,8 +121,6 @@ class HistorieModelAssemblerTest { @Nested class TestCreatedByLink { - @InjectMocks - private LinkedResourceProcessor<Command> linkedResourceProcessor; @Mock private UserManagerUrlProvider userManagerUrlProvider; @@ -131,7 +128,8 @@ class HistorieModelAssemblerTest { void shouldExistingAtUser() { when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); - var model = linkedResourceProcessor.process(modelAssembler.toModel(CommandTestFactory.create())); + var model = LinkedResourceTestUtils + .processUserProfileResource(modelAssembler.toModel(CommandTestFactory.create()), userManagerUrlProvider); assertThat(model.getLink(CREATED_BY)).isPresent().get().extracting(Link::getHref) .isEqualTo(ROOT_URL + USER_PROFILES_API_PATH + UserProfileTestFactory.ID); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java index 91c487f0fcd257b9deec41107d166d7d834bf9d8..f9426632645c3e5fa764a52dbae6e97c9abeecad 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java @@ -41,7 +41,7 @@ import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.hateoas.server.EntityLinks; -import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.LinkedResourceTestUtils; import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; @@ -52,7 +52,7 @@ import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; class KommentarModelAssemblerTest { - private final String PATH = KommentarController.KOMMENTAR_PATH + "/"; + private static final String PATH = KommentarController.KOMMENTAR_PATH + "/"; private static final String REL_CREATED_BY = "createdBy"; private static final String USER_MANAGER_URL = UserProfileUrlProviderTestFactory.ROOT_URL + UserProfileUrlProviderTestFactory.USER_PROFILES_API_PATH; @@ -99,8 +99,6 @@ class KommentarModelAssemblerTest { private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - @InjectMocks - private LinkedResourceProcessor<Kommentar> linkedResourceProcessor; @Mock private UserManagerUrlProvider userManagerUrlProvider; @@ -135,7 +133,7 @@ class KommentarModelAssemblerTest { void shouldHaveCreatedByLink() { when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); - var model = linkedResourceProcessor.process(buildModel()); + var model = LinkedResourceTestUtils.processUserProfileResource(buildModel(), userManagerUrlProvider); assertThat(model.getLink(REL_CREATED_BY)).isPresent().get().extracting(Link::getHref) .isEqualTo(USER_MANAGER_URL + KommentarTestFactory.CREATED_BY); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessorTest.java index 384aadb5cd9963064dc0ad42f540bd17d88b79d0..e108bfe27f65b0edda495a0f2496ef4b95a681a4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandProcessorTest.java @@ -29,10 +29,10 @@ import static org.mockito.Mockito.*; import java.util.Optional; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource.Mode;