From 26b296f2bab57c88af68569fa3c113db77c7af3e Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 21 Feb 2025 14:20:33 +0100 Subject: [PATCH 01/19] OZG-3936 add LinkedResourceProcessor --- .../alfa/common/LinkedResourceProcessor.java | 95 ++++ .../common/user/UserManagerUrlProvider.java | 6 +- .../common/LinkedResourceProcessorITCase.java | 107 +++++ .../common/LinkedResourceProcessorTest.java | 428 ++++++++++++++++++ 4 files changed, 633 insertions(+), 3 deletions(-) create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java new file mode 100644 index 0000000000..e8bd48da57 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java @@ -0,0 +1,95 @@ +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.Objects; +import java.util.Optional; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; +import org.springframework.hateoas.server.RepresentationModelProcessor; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Component +@RequiredArgsConstructor +public class LinkedResourceProcessor implements RepresentationModelProcessor<EntityModel<?>> { + + private final UserManagerUrlProvider userManagerUrlProvider; + + @Override + public EntityModel<?> process(EntityModel<?> model) { + addLinkByLinkedResourceAnnotationIfMissing(model); + addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + return model; + } + + void addLinkByLinkedResourceAnnotationIfMissing(EntityModel<?> model) { + getFields(LinkedResource.class, model.getContent()) + .filter(field -> shouldAddLink(model, field)) + .forEach(field -> addLinkForLinkedResourceField(model, field)); + } + + void addLinkForLinkedResourceField(EntityModel<?> model, Field field) { + getEntityFieldValue(model.getContent(), field).map(Object::toString).filter(StringUtils::isNotBlank) + .ifPresent(val -> model + .add(WebMvcLinkBuilder.linkTo(field.getAnnotation(LinkedResource.class).controllerClass()).slash(val) + .withRel(trimIdSuffix(field.getName())))); + } + + void addLinkByLinkedUserProfileResourceAnnotationIfMissing(EntityModel<?> resource) { + getFields(LinkedUserProfileResource.class, resource.getContent()) + .filter(field -> shouldAddLink(resource, field)) + .forEach(field -> addLinkForLinkedUserProfileResourceField(resource, field)); + } + + Stream<Field> getFields(Class<? extends Annotation> annotationClass, Object content) { + if (Objects.isNull(content)) { + return Stream.empty(); + } + return Arrays.stream(content.getClass().getDeclaredFields()) + .filter(field -> field.isAnnotationPresent(annotationClass)); + } + + boolean shouldAddLink(EntityModel<?> resource, Field field) { + return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) || resource.hasLink(trimIdSuffix(field.getName()))); + } + + void addLinkForLinkedUserProfileResourceField(EntityModel<?> model, Field field) { + getEntityFieldValue(model.getContent(), field).map(Object::toString).filter(StringUtils::isNotBlank) + .ifPresent(value -> addUserProfileLink(model, field, value)); + } + + private void addUserProfileLink(EntityModel<?> model, Field field, String value) { + Optional.ofNullable(userManagerUrlProvider.getUserProfileTemplate()).filter(StringUtils::isNotBlank) + .ifPresent(template -> model.add(Link.of(template.formatted(value)).withRel(trimIdSuffix(field.getName())))); + } + + private Optional<Object> getEntityFieldValue(Object content, Field field) { + try { + field.setAccessible(true); + Optional<Object> value = Optional.ofNullable(field.get(content)); + field.setAccessible(false); + return value; + } catch (IllegalArgumentException | IllegalAccessException e) { + LOG.warn("Cannot access field value of LinkedResource field.", e); + } + return Optional.empty(); + } + + private String trimIdSuffix(String fieldName) { + if (fieldName.endsWith("Id")) { + return fieldName.substring(0, fieldName.indexOf("Id")); + } + return fieldName; + } +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/UserManagerUrlProvider.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/UserManagerUrlProvider.java index 8777af4d29..819a7beb37 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/UserManagerUrlProvider.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/UserManagerUrlProvider.java @@ -27,21 +27,21 @@ import java.util.Optional; import java.util.function.Predicate; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.util.UriComponentsBuilder; import de.ozgcloud.alfa.postfach.PostfachMail; +import lombok.RequiredArgsConstructor; @Service +@RequiredArgsConstructor public class UserManagerUrlProvider { public static final String SYSTEM_USER_IDENTIFIER = "system"; public static final Predicate<PostfachMail> SENT_BY_CLIENT_USER = postfachNachricht -> Optional.ofNullable(postfachNachricht.getCreatedBy()) .map(createdBy -> !createdBy.toString().startsWith(SYSTEM_USER_IDENTIFIER)).orElse(false); - @Autowired - private UserManagerProperties userManagerProperties; + private final UserManagerProperties userManagerProperties; /** only for building links */ public String getUserProfileTemplate() { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java new file mode 100644 index 0000000000..894a5c1243 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java @@ -0,0 +1,107 @@ +package de.ozgcloud.alfa.common; + +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.EntityModel; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import org.springframework.test.web.servlet.assertj.MvcTestResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.WebApplicationContext; + +import de.ozgcloud.common.test.ITCase; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.SneakyThrows; + +@ITCase +class LinkedResourceProcessorITCase { + + @Autowired + private WebApplicationContext wac; + private MockMvcTester mockMvc; + + @BeforeEach + void setup() { + this.mockMvc = MockMvcTester.from(this.wac); + } + + @Test + @SneakyThrows + void shouldHaveAddLinkByLinkedResource() { + var result = doRequest(); + + result.assertThat().bodyJson().extractingPath("$._links.id.href") + .isEqualTo("http://localhost" + TestIdController.PATH + "/" + TestEntityTestFactory.ID); + } + + @Test + @SneakyThrows + void shouldHaveUserProfileLink() { + var result = doRequest(); + + result.assertThat().bodyJson().extractingPath("$._links.user.href") + .isEqualTo("https://localhost/api/userProfiles/" + TestEntityTestFactory.USER); + } + + private MvcTestResult doRequest() { + return mockMvc.get().uri(TestEntityController.PATH).exchange(); + } + + @Builder + @Getter + @EqualsAndHashCode + static class TestEntity { + + @LinkedResource(controllerClass = TestIdController.class) + private String id; + + private String foo; + + @LinkedUserProfileResource + private String user; + } + + @RequestMapping(TestEntityController.PATH) + @RestController + static class TestEntityController { + + static final String PATH = "/api/entity"; + + @GetMapping + public EntityModel<TestEntity> getTestEntity() { + return EntityModel.of(TestEntityTestFactory.create()); + } + } + + @RequestMapping(TestIdController.PATH) + static class TestIdController { + + static final String PATH = "/api/test"; + + static final String USER_REL = "user"; + static final String ID_REL = "id"; + + } + + static class TestEntityTestFactory { + + static final String USER = UUID.randomUUID().toString(); + static final String ID = UUID.randomUUID().toString(); + + public static TestEntity create() { + return createBuilder().build(); + } + + public static TestEntity.TestEntityBuilder createBuilder() { + return TestEntity.builder() + .id(ID) + .user(USER); + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java new file mode 100644 index 0000000000..c7953a7048 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -0,0 +1,428 @@ +package de.ozgcloud.alfa.common; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeEach; +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.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.SneakyThrows; + +class LinkedResourceProcessorTest { + + @Spy + @InjectMocks + private LinkedResourceProcessor processor; + + @Mock + private UserManagerUrlProvider userManagerUrlProvider; + + @Nested + class TestProcess { + + private final TestEntity entity = TestEntityTestFactory.create(); + private final EntityModel<TestEntity> model = EntityModel.of(entity); + + @BeforeEach + void mock() { + doNothing().when(processor).addLinkByLinkedResourceAnnotationIfMissing(any()); + doNothing().when(processor).addLinkByLinkedUserProfileResourceAnnotationIfMissing(any()); + } + + @Test + void shouldReturnSameEntityModel() { + var result = processor.process(model); + + assertThat(result).isSameAs(model); + } + + @Test + void shouldCallAddLinkByLinkedResourceAnnotationIfMissing() { + processor.process(model); + + verify(processor).addLinkByLinkedResourceAnnotationIfMissing(model); + } + + @Test + void shouldCallAddLinkByLinkedUserProfileResourceAnnotationIfMissing() { + processor.process(model); + + verify(processor).addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + } + } + + @Nested + class TestAddLinkByLinkedResourceAnnotationIfMissing { + + private final TestEntity entity = TestEntityTestFactory.create(); + private final EntityModel<TestEntity> model = EntityModel.of(entity); + + @Mock + private Field field; + + @BeforeEach + void mock() { + doReturn(Stream.of(field)).when(processor).getFields(any(), any()); + } + + @Test + void shouldGetFieldsWithLinkedResourceAnnotation() { + doReturn(false).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedResourceAnnotationIfMissing(model); + + verify(processor).getFields(LinkedResource.class, entity); + } + + @Test + void shouldCallShouldAddLink() { + doReturn(false).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedResourceAnnotationIfMissing(model); + + verify(processor).shouldAddLink(model, field); + } + + @Test + void shouldCallAddLinkForLinkedResourceField() { + doReturn(true).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedResourceAnnotationIfMissing(model); + + verify(processor).addLinkForLinkedResourceField(model, field); + } + + @Test + void shouldNotCallAddLinkForLinkedResourceField() { + doReturn(false).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedResourceAnnotationIfMissing(model); + + verify(processor, never()).addLinkForLinkedResourceField(any(), any()); + } + } + + @Nested + class TestAddLinkByLinkedUserProfileResourceAnnotationIfMissing { + + private final TestEntity entity = TestEntityTestFactory.create(); + private final EntityModel<TestEntity> model = EntityModel.of(entity); + + @Mock + private Field field; + + @BeforeEach + void mock() { + doReturn(Stream.of(field)).when(processor).getFields(any(), any()); + } + + @Test + void shouldGetFieldsWithLinkedUserProfileResourceAnnotation() { + doReturn(false).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + + verify(processor).getFields(LinkedUserProfileResource.class, entity); + } + + @Test + void shouldCallShouldAddLink() { + doReturn(false).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + + verify(processor).shouldAddLink(model, field); + } + + @Test + void shouldCallAddLinkForLinkedUserProfileResourceField() { + doReturn(true).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + + verify(processor).addLinkForLinkedUserProfileResourceField(model, field); + } + + @Test + void shouldNotCallAddLinkForLinkedUserProfileResourceField() { + doReturn(false).when(processor).shouldAddLink(any(), any()); + + processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + + verify(processor, never()).addLinkForLinkedUserProfileResourceField(any(), any()); + } + } + + @Nested + class TestGetFields { + + @Test + void shouldReturnEmptyStreamIfContentIsNull() { + var result = processor.getFields(LinkedResource.class, null); + + assertThat(result).isEmpty(); + } + + @Test + void shouldReturnAllFieldsWithLinkedResourceAnnotation() { + var entity = TestEntityTestFactory.create(); + var expectedFields = List.of(getField("linkedResource"), getField("testId")); + + var result = processor.getFields(LinkedResource.class, entity); + + assertThat(result).containsExactlyInAnyOrderElementsOf(expectedFields); + } + + @Test + void shouldReturnAllFieldsWithLinkedUserProfileResource() { + var entity = TestEntityTestFactory.create(); + var expectedFields = List.of(getField("user"), getField("differentUserId")); + + var result = processor.getFields(LinkedUserProfileResource.class, entity); + + assertThat(result).containsExactlyInAnyOrderElementsOf(expectedFields); + } + + @SneakyThrows + private Field getField(String fieldName) { + return TestEntity.class.getDeclaredField(fieldName); + } + } + + @Nested + class TestShouldAddLink { + + private final TestEntity entity = TestEntityTestFactory.create(); + private final EntityModel<TestEntity> model = EntityModel.of(entity); + + @Test + void shouldReturnFalseIfFieldIsArray() { + var field = getField("arrayField"); + + var result = processor.shouldAddLink(model, field); + + assertThat(result).isFalse(); + } + + @Test + void shouldReturnFalseIfFieldIsCollection() { + var field = getField("collectionField"); + + var result = processor.shouldAddLink(model, field); + + assertThat(result).isFalse(); + } + + @Test + void shouldReturnFalseIfFieldHasLink() { + var field = getField("linkedResource"); + model.add(Link.of(LoremIpsum.getInstance().getUrl()).withRel(TestIdController.LINKED_RESOURCE_REL)); + + var result = processor.shouldAddLink(model, field); + + assertThat(result).isFalse(); + } + + @Test + void shouldReturnTrueOtherwise() { + var fieldsToBuildLinksFor = Arrays.stream(TestEntity.class.getDeclaredFields()) + .filter(field -> !(field.getName().equals("collectionField") || field.getName().equals("arrayField"))); + + var result = fieldsToBuildLinksFor.map(field -> processor.shouldAddLink(model, field)); + + assertThat(result).isNotEmpty().allMatch(value -> value.equals(true)); + } + + @SneakyThrows + private Field getField(String fieldName) { + return TestEntity.class.getDeclaredField(fieldName); + } + } + + @Nested + class TestAddLinkForLinkedResourceField { + + @Test + void shouldAddLinkOfLinkedResource() { + var model = EntityModel.of(TestEntityTestFactory.create()); + var field = getField("linkedResource"); + + processor.addLinkForLinkedResourceField(model, field); + + assertThat(model.getLink(TestIdController.LINKED_RESOURCE_REL).get().getHref()) + .isEqualTo(TestIdController.PATH + "/" + TestEntityTestFactory.LINKED_RESOURCE); + } + + @Test + void shouldTrimIdSuffix() { + var model = EntityModel.of(TestEntityTestFactory.create()); + var field = getField("testId"); + + processor.addLinkForLinkedResourceField(model, field); + + assertThat(model.getLink(TestIdController.ID_REL).get().getHref()) + .isEqualTo(TestIdController.PATH + "/" + TestEntityTestFactory.ID); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldNotAddLinkIfFieldValueIsNullOrBlank(String linkedResourceValue) { + var model = EntityModel.of(TestEntityTestFactory.createBuilder().linkedResource(linkedResourceValue).build()); + var field = getField("linkedResource"); + + processor.addLinkForLinkedResourceField(model, field); + + assertThat(model.getLink(TestIdController.LINKED_RESOURCE_REL)).isEmpty(); + } + + @SneakyThrows + private Field getField(String fieldName) { + return TestEntity.class.getDeclaredField(fieldName); + } + } + + @Nested + class TestAddLinkForLinkedUserProfileResourceField { + + private final String userProfileTemplate = LoremIpsum.getInstance().getUrl() + "/%s"; + + @Test + void shouldGetUserProfileTemplate() { + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(userProfileTemplate); + var field = getField("user"); + + processor.addLinkForLinkedUserProfileResourceField(EntityModel.of(TestEntityTestFactory.create()), field); + + verify(userManagerUrlProvider).getUserProfileTemplate(); + } + + @Test + void shouldAddLinkOfLinkedUserProfileResource() { + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(userProfileTemplate); + var model = EntityModel.of(TestEntityTestFactory.create()); + var field = getField("user"); + + processor.addLinkForLinkedUserProfileResourceField(model, field); + + assertThat(model.getLink(TestIdController.USER_REL).get().getHref()) + .isEqualTo(userProfileTemplate.formatted(TestEntityTestFactory.USER)); + } + + @Test + void shouldTrimIdSuffix() { + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(userProfileTemplate); + var model = EntityModel.of(TestEntityTestFactory.create()); + var field = getField("differentUserId"); + + processor.addLinkForLinkedUserProfileResourceField(model, field); + + assertThat(model.getLink(TestIdController.DIFFERENT_USER_REL).get().getHref()) + .isEqualTo(userProfileTemplate.formatted(TestEntityTestFactory.DIFFERENT_USER_ID)); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldNotAddLinkIfFieldValueIsNullOrBlank(String userValue) { + var model = EntityModel.of(TestEntityTestFactory.createBuilder().user(userValue).build()); + var field = getField("user"); + + processor.addLinkForLinkedUserProfileResourceField(model, field); + + assertThat(model.getLink(TestIdController.USER_REL)).isEmpty(); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldNotAddLinkIfUserManagerUrlIsNullOrBlank(String userManagerUrl) { + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(userManagerUrl); + var model = EntityModel.of(TestEntityTestFactory.create()); + var field = getField("user"); + + processor.addLinkForLinkedUserProfileResourceField(model, field); + + assertThat(model.getLink(TestIdController.USER_REL)).isEmpty(); + } + + @SneakyThrows + private Field getField(String fieldName) { + return TestEntity.class.getDeclaredField(fieldName); + } + } + + @Builder + @Getter + @EqualsAndHashCode + static class TestEntity { + + @LinkedResource(controllerClass = TestIdController.class) + private String linkedResource; + @LinkedResource(controllerClass = TestIdController.class) + private String testId; + + private String foo; + private Collection<String> collectionField; + private String[] arrayField; + + @LinkedUserProfileResource + private String user; + + @LinkedUserProfileResource + private String differentUserId; + } + + @RequestMapping(TestIdController.PATH) + static class TestIdController { + + static final String PATH = "/api/test"; + + static final String USER_REL = "user"; + static final String DIFFERENT_USER_REL = "differentUser"; + static final String ID_REL = "test"; + static final String LINKED_RESOURCE_REL = "linkedResource"; + + } + + static class TestEntityTestFactory { + + static final String USER = UUID.randomUUID().toString(); + static final String DIFFERENT_USER_ID = UUID.randomUUID().toString(); + static final String ID = UUID.randomUUID().toString(); + static final String LINKED_RESOURCE = UUID.randomUUID().toString(); + + public static TestEntity create() { + return createBuilder().build(); + } + + public static TestEntity.TestEntityBuilder createBuilder() { + return TestEntity.builder() + .testId(ID) + .linkedResource(LINKED_RESOURCE) + .user(USER) + .differentUserId(DIFFERENT_USER_ID) + .foo("bar"); + } + } +} -- GitLab From 2a403a5775ea908c2ecf91b518e43d34e441dd5f Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 21 Feb 2025 17:05:42 +0100 Subject: [PATCH 02/19] OZG-3936 remove setting of UserProfileLink in ModelBuilder, avoid using ModelBuilder --- .../AktenzeichenModelProcessor.java | 15 +++--- .../alfa/bescheid/BescheidModelAssembler.java | 32 ++++++------- .../bescheid/BescheidVorgangProcessor.java | 26 +++++------ .../alfa/bescheid/DocumentModelAssembler.java | 6 +-- .../alfa/common/LinkedResourceProcessor.java | 20 ++++---- .../de/ozgcloud/alfa/common/ModelBuilder.java | 15 ------ .../alfa/export/ExportVorgangProcessor.java | 16 +++---- .../WiedervorlageModelAssembler.java | 38 +++++++-------- .../AktenzeichenModelProcessorTest.java | 8 +--- .../bescheid/BescheidModelAssemblerTest.java | 14 ++++-- .../BescheidVorgangProcessorTest.java | 41 +++++++---------- .../bescheid/DocumentModelAssemblerTest.java | 8 +++- .../CollaborationVorgangProcessorTest.java | 12 ++--- .../common/LinkedResourceProcessorTest.java | 2 +- .../alfa/common/ModelBuilderTest.java | 46 ------------------- .../export/ExportVorgangProcessorTest.java | 10 ---- .../historie/HistorieModelAssemblerTest.java | 17 ++++--- .../KommentarModelAssemblerTest.java | 17 +++---- ...LoeschAnforderungCommandProcessorTest.java | 7 --- .../LoeschAnforderungModelAssemblerTest.java | 9 ---- ...LoeschAnforderungVorgangProcessorTest.java | 4 -- .../vorgang/VorgangModelAssemblerTest.java | 16 ------- .../VorgangWithEingangProcessorTest.java | 24 ---------- ...organgWithEingangCommandProcessorTest.java | 16 ------- .../WiedervorlageModelAssemblerTest.java | 17 +------ 25 files changed, 128 insertions(+), 308 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessor.java index aa7ce0231e..7f76702862 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessor.java @@ -33,7 +33,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.command.CommandController; import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -43,9 +42,11 @@ public class AktenzeichenModelProcessor implements RepresentationModelProcessor< static final LinkRelation REL_SET_AKTENZEICHEN = LinkRelation.of("set_aktenzeichen"); - static final List<Vorgang.VorgangStatus> SET_AKTENZEICHEN_STATUSES = List.of(Vorgang.VorgangStatus.ANGENOMMEN, Vorgang.VorgangStatus.IN_BEARBEITUNG); + static final List<Vorgang.VorgangStatus> SET_AKTENZEICHEN_STATUSES = List.of(Vorgang.VorgangStatus.ANGENOMMEN, + Vorgang.VorgangStatus.IN_BEARBEITUNG); - private static final Predicate<VorgangWithEingang> IS_SET_AKTENZEICHEN_ALLOWED = vorgang -> SET_AKTENZEICHEN_STATUSES.contains(vorgang.getStatus()); + private static final Predicate<VorgangWithEingang> IS_SET_AKTENZEICHEN_ALLOWED = vorgang -> SET_AKTENZEICHEN_STATUSES + .contains(vorgang.getStatus()); @Override public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) { @@ -54,11 +55,9 @@ public class AktenzeichenModelProcessor implements RepresentationModelProcessor< if (vorgang == null) { return model; } + model.addIf(IS_SET_AKTENZEICHEN_ALLOWED.test(vorgang), () -> linkTo(methodOn(CommandController.CommandByRelationController.class) + .createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), null)).withRel(REL_SET_AKTENZEICHEN)); - return ModelBuilder.fromModel(model) - .ifMatch(IS_SET_AKTENZEICHEN_ALLOWED) - .addLink(linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), - null)).withRel(REL_SET_AKTENZEICHEN)) - .buildModel(); + return model; } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java index f02c1ae859..723a74e134 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java @@ -26,6 +26,7 @@ package de.ozgcloud.alfa.bescheid; import static java.util.Optional.*; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; +import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -37,7 +38,6 @@ import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.bescheid.BescheidController.BescheidByVorgangController; -import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; @@ -88,22 +88,20 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc methodOn(BescheidCommandController.class).createCommand(vorgangWithEingang.getId(), bescheid.getId(), bescheid.getVersion(), null)); - return ModelBuilder.fromEntity(bescheid) - .addLink(selfLink.withSelfRel()) - .addLink(deleteLink.withRel(REL_DELETE)) - .addLink(selfLink.withSelfRel()) - .addLink(uploadBescheidFileLink.withRel(REL_UPLOAD_BESCHEID_FILE)) - .addLink(uploadAttachmentLink.withRel(REL_UPLOAD_ATTACHMENT)) - .ifMatch(HAS_ATTACHMENTS) - .addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) - .addLink(createCommandLink.withRel(REL_UPDATE)) - .ifMatch(() -> canCreateBescheidDocumentAutomatically(vorgangWithEingang)) - .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT)) - .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT_FROM_FILE)) - .ifMatch(() -> canSendMessageToAntragsteller(vorgangWithEingang)) - .addLink(bescheidenUndSendenLink.withRel(REL_BESCHEIDEN_UND_SENDEN)) - .addLink(createCommandLink.withRel(REL_BESCHEIDEN)) - .buildModel(); + return EntityModel.of(bescheid) + .add(List.of(selfLink.withSelfRel(), + deleteLink.withRel(REL_DELETE), + uploadBescheidFileLink.withRel(REL_UPLOAD_BESCHEID_FILE), + uploadAttachmentLink.withRel(REL_UPLOAD_ATTACHMENT), + createCommandLink.withRel(REL_BESCHEIDEN), + createCommandLink.withRel(REL_UPDATE), + createCommandLink.withRel(REL_CREATE_DOCUMENT_FROM_FILE))) + .addIf(HAS_ATTACHMENTS.test(bescheid), + () -> attachmentsLink.withRel(REL_ATTACHMENTS)) + .addIf(canCreateBescheidDocumentAutomatically(vorgangWithEingang), + () -> createCommandLink.withRel(REL_CREATE_DOCUMENT)) + .addIf(canSendMessageToAntragsteller(vorgangWithEingang), + () -> bescheidenUndSendenLink.withRel(REL_BESCHEIDEN_UND_SENDEN)); } @Override diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java index d9cab224fa..1af6b1ed3f 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java @@ -26,7 +26,6 @@ package de.ozgcloud.alfa.bescheid; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.Objects; -import java.util.function.BooleanSupplier; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.LinkRelation; @@ -35,7 +34,6 @@ import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.bescheid.BescheidController.BescheidByVorgangController; -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.UserRole; @@ -60,14 +58,14 @@ class BescheidVorgangProcessor implements RepresentationModelProcessor<EntityMod if (Objects.isNull(vorgang) || currentUserService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)) { return model; } - return ModelBuilder.fromModel(model) - .ifMatch(isRetrievingDraftAllowed(vorgang)) - .addLink(getDraftLink(vorgang.getId()).withRel(REL_DRAFT)) - .ifMatch(isCreatingDraftAllowed(vorgang)) - .addLink(getCreateBescheidDraftLink(vorgang.getId(), vorgang.getVersion()).withRel(REL_CREATE_DRAFT)) - .ifMatch(() -> existsBescheid(vorgang.getId())) - .addLink(getBescheideLink(vorgang.getId()).withRel(REL_BESCHEIDE)) - .buildModel(); + model + .addIf(isRetrievingDraftAllowed(vorgang), + () -> getDraftLink(vorgang.getId()).withRel(REL_DRAFT)) + .addIf(isCreatingDraftAllowed(vorgang), + () -> getCreateBescheidDraftLink(vorgang.getId(), vorgang.getVersion()).withRel(REL_CREATE_DRAFT)) + .addIf(existsBescheid(vorgang.getId()), + () -> getBescheideLink(vorgang.getId()).withRel(REL_BESCHEIDE)); + return model; } private WebMvcLinkBuilder getDraftLink(String vorgangId) { @@ -86,12 +84,12 @@ class BescheidVorgangProcessor implements RepresentationModelProcessor<EntityMod return linkTo(methodOn(BescheidByVorgangController.class).getAll(vorgangId)); } - BooleanSupplier isRetrievingDraftAllowed(Vorgang vorgang) { - return () -> isVorgangInBearbeitung(vorgang) && draftExists(vorgang); + boolean isRetrievingDraftAllowed(Vorgang vorgang) { + return isVorgangInBearbeitung(vorgang) && draftExists(vorgang); } - BooleanSupplier isCreatingDraftAllowed(Vorgang vorgang) { - return () -> isVorgangInBearbeitung(vorgang) && !draftExists(vorgang); + boolean isCreatingDraftAllowed(Vorgang vorgang) { + return isVorgangInBearbeitung(vorgang) && !draftExists(vorgang); } boolean isVorgangInBearbeitung(Vorgang vorgang) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/DocumentModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/DocumentModelAssembler.java index cef3f165bc..5d01a2a663 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/DocumentModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/DocumentModelAssembler.java @@ -29,7 +29,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.ModelBuilder; import lombok.RequiredArgsConstructor; @Component @@ -42,8 +41,7 @@ class DocumentModelAssembler implements RepresentationModelAssembler<Document, E public EntityModel<Document> toModel(Document document) { var selfLink = linkTo(methodOn(DocumentController.class).getDocument(document.getId())); - return ModelBuilder.fromEntity(document) - .addLink(selfLink.withSelfRel()) - .buildModel(); + return EntityModel.of(document) + .add(selfLink.withSelfRel()); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java index e8bd48da57..ff6dc3cd92 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java @@ -22,37 +22,37 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @Component @RequiredArgsConstructor -public class LinkedResourceProcessor implements RepresentationModelProcessor<EntityModel<?>> { +public class LinkedResourceProcessor<T> implements RepresentationModelProcessor<EntityModel<T>> { private final UserManagerUrlProvider userManagerUrlProvider; @Override - public EntityModel<?> process(EntityModel<?> model) { + public EntityModel<T> process(EntityModel<T> model) { addLinkByLinkedResourceAnnotationIfMissing(model); addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); return model; } - void addLinkByLinkedResourceAnnotationIfMissing(EntityModel<?> model) { + void addLinkByLinkedResourceAnnotationIfMissing(EntityModel<T> model) { getFields(LinkedResource.class, model.getContent()) .filter(field -> shouldAddLink(model, field)) .forEach(field -> addLinkForLinkedResourceField(model, field)); } - void addLinkForLinkedResourceField(EntityModel<?> model, Field field) { + void addLinkForLinkedResourceField(EntityModel<T> model, Field field) { getEntityFieldValue(model.getContent(), field).map(Object::toString).filter(StringUtils::isNotBlank) .ifPresent(val -> model .add(WebMvcLinkBuilder.linkTo(field.getAnnotation(LinkedResource.class).controllerClass()).slash(val) .withRel(trimIdSuffix(field.getName())))); } - void addLinkByLinkedUserProfileResourceAnnotationIfMissing(EntityModel<?> resource) { + void addLinkByLinkedUserProfileResourceAnnotationIfMissing(EntityModel<T> resource) { getFields(LinkedUserProfileResource.class, resource.getContent()) .filter(field -> shouldAddLink(resource, field)) .forEach(field -> addLinkForLinkedUserProfileResourceField(resource, field)); } - Stream<Field> getFields(Class<? extends Annotation> annotationClass, Object content) { + Stream<Field> getFields(Class<? extends Annotation> annotationClass, T content) { if (Objects.isNull(content)) { return Stream.empty(); } @@ -60,21 +60,21 @@ public class LinkedResourceProcessor implements RepresentationModelProcessor<Ent .filter(field -> field.isAnnotationPresent(annotationClass)); } - boolean shouldAddLink(EntityModel<?> resource, Field field) { + boolean shouldAddLink(EntityModel<T> resource, Field field) { return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) || resource.hasLink(trimIdSuffix(field.getName()))); } - void addLinkForLinkedUserProfileResourceField(EntityModel<?> model, Field field) { + void addLinkForLinkedUserProfileResourceField(EntityModel<T> model, Field field) { getEntityFieldValue(model.getContent(), field).map(Object::toString).filter(StringUtils::isNotBlank) .ifPresent(value -> addUserProfileLink(model, field, value)); } - private void addUserProfileLink(EntityModel<?> model, Field field, String value) { + private void addUserProfileLink(EntityModel<T> model, Field field, String value) { Optional.ofNullable(userManagerUrlProvider.getUserProfileTemplate()).filter(StringUtils::isNotBlank) .ifPresent(template -> model.add(Link.of(template.formatted(value)).withRel(trimIdSuffix(field.getName())))); } - private Optional<Object> getEntityFieldValue(Object content, Field field) { + private Optional<Object> getEntityFieldValue(T content, Field field) { try { field.setAccessible(true); Optional<Object> value = Optional.ofNullable(field.get(content)); 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 index 79ec76f5f0..f4b0b7a57d 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/ModelBuilder.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/ModelBuilder.java @@ -122,7 +122,6 @@ public class ModelBuilder<T> { buildedModel = buildedModel.add(filteredLinks); addLinkByLinkedResourceAnnotationIfMissing(buildedModel); - addLinkByLinkedUserProfileResourceAnnotationIfMissing(buildedModel); return applyMapper(buildedModel); } @@ -148,20 +147,6 @@ public class ModelBuilder<T> { .withRel(sanitizeName(field.getName())))); } - private void addLinkByLinkedUserProfileResourceAnnotationIfMissing(EntityModel<T> resource) { - getFields(LinkedUserProfileResource.class).stream() - .filter(field -> shouldAddLink(resource, field)) - .forEach(field -> handleLinkedUserProfileResourceField(resource, field)); - } - - private void handleLinkedUserProfileResourceField(EntityModel<T> resource, Field field) { - getEntityFieldValue(field).ifPresent(val -> { - if (UserProfileUrlProvider.isConfigured()) { - resource.add(Link.of(UserProfileUrlProvider.getUrl(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()))); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java index 33e5c38b35..2cd81ac753 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java @@ -33,7 +33,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.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangController; @@ -59,14 +58,13 @@ class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel if (Objects.isNull(vorgang)) { return model; } - - return ModelBuilder.fromModel(model) - .ifMatch(IS_VORGANG_ABGESCHLOSSEN.and(vorgangController::isEditable)) - .addLink(linkTo(methodOn(ExportVorgangController.class).exportVorgang(vorgang.getId())).withRel(REL_EXPORT)) - .ifMatch(IS_VORGANG_ABGESCHLOSSEN.and(isDmsEnabled()).and(vorgangController::isEditable)) - .addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), - null)).withRel(REL_ARCHIVE)) - .buildModel(); + model + .addIf(IS_VORGANG_ABGESCHLOSSEN.and(vorgangController::isEditable).test(vorgang), + () -> linkTo(methodOn(ExportVorgangController.class).exportVorgang(vorgang.getId())).withRel(REL_EXPORT)) + .addIf(IS_VORGANG_ABGESCHLOSSEN.and(isDmsEnabled()).and(vorgangController::isEditable).test(vorgang), + () -> linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), + null)).withRel(REL_ARCHIVE)); + return model; } private Predicate<VorgangWithEingang> isDmsEnabled() { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java index 2a94ca0fcd..a058e87ad7 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java @@ -28,21 +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.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController; import de.ozgcloud.alfa.wiedervorlage.WiedervorlageController.AttachmentsByWiedervorlageController; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wiedervorlage, EntityModel<Wiedervorlage>> { static final String REL_EDIT = "edit"; @@ -59,8 +58,7 @@ class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wieder public static final String WIEDERVORLAGE_ATTACHMENT_PATH = "wiedervorlageAttachment"; public static final String FILE_PATH = "file"; - @Autowired - private VorgangController vorgangController; + private final VorgangController vorgangController; @Override public EntityModel<Wiedervorlage> toModel(Wiedervorlage wiedervorlage) { @@ -73,26 +71,24 @@ class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wieder var commandLink = linkTo( methodOn(WiedervorlageCommandController.class).updateWiedervorlage(null, wiedervorlage.getId(), wiedervorlage.getVersion())); - return ModelBuilder.fromEntity(wiedervorlage).addLink(selfLink.withSelfRel()) - .ifMatch(() -> vorgangController.isEditable(vorgang)) - .addLink(commandLink.withRel(REL_EDIT)) - .ifMatch(ALLOW_ERLEDIGEN).addLink(commandLink.withRel(REL_ERLEDIGEN)) - .ifMatch(ALLOW_WIEDEREROEFFNEN).addLink(commandLink.withRel(REL_WIEDEREROEFFNEN)) - .ifMatch(HAS_ATTACHMENTS) - .addLink(linkTo(methodOn(AttachmentsByWiedervorlageController.class).getAttachments(wiedervorlage.getId())).withRel(REL_ATTACHMENTS)) - .buildModel(); + return EntityModel.of(wiedervorlage) + .add(selfLink.withSelfRel()) + .addIf(vorgangController.isEditable(vorgang), () -> commandLink.withRel(REL_EDIT)) + .addIf(ALLOW_ERLEDIGEN.test(wiedervorlage), () -> commandLink.withRel(REL_ERLEDIGEN)) + .addIf(ALLOW_WIEDEREROEFFNEN.test(wiedervorlage), () -> commandLink.withRel(REL_WIEDEREROEFFNEN)) + .addIf(HAS_ATTACHMENTS.test(wiedervorlage), + () -> linkTo(methodOn(AttachmentsByWiedervorlageController.class).getAttachments(wiedervorlage.getId())) + .withRel(REL_ATTACHMENTS)); } public CollectionModel<EntityModel<Wiedervorlage>> toCollectionModel(Stream<Wiedervorlage> entities, String vorgangId) { var vorgang = vorgangController.getVorgang(vorgangId); - - return CollectionModelBuilder.fromEntities(entities.map(wiedervorlage -> buildModel(wiedervorlage, vorgang))) - .addLink(linkTo(WiedervorlageController.class).withSelfRel()) - .ifMatch(wiedervorlagenModel -> vorgangController.isEditable(vorgang)) - .addLink(linkTo(methodOn(WiedervorlageCommandByVorgangController.class).createWiedervorlage(null, vorgangId)) - .withRel(REL_CREATE)) - .addLink(linkTo(BinaryFileController.class).slash(vorgangId).slash(WIEDERVORLAGE_ATTACHMENT_PATH).slash(FILE_PATH) + return CollectionModel.of(entities.map(wiedervorlage -> buildModel(wiedervorlage, vorgang)).toList()) + .add(linkTo(WiedervorlageController.class).withSelfRel()) + .add(linkTo(BinaryFileController.class).slash(vorgangId).slash(WIEDERVORLAGE_ATTACHMENT_PATH).slash(FILE_PATH) .withRel(REL_UPLOAD_FILE)) - .buildModel(); + .addIf(vorgangController.isEditable(vorgang), + () -> linkTo(methodOn(WiedervorlageCommandByVorgangController.class).createWiedervorlage(null, vorgangId)) + .withRel(REL_CREATE)); } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java index 98c3b71d19..6c0447d5e0 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.aktenzeichen; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -65,8 +64,6 @@ class AktenzeichenModelProcessorTest { @ParameterizedTest @EnumSource(names = { "ANGENOMMEN", "IN_BEARBEITUNG" }, mode = EnumSource.Mode.EXCLUDE) void shouldNotCreateSetAktenzeichenLink(Vorgang.VorgangStatus vorgangStatus) { - initUserProfileUrlProvider(urlProvider); - var model = processor.process(buildModelWithVorgangStatus(vorgangStatus)); assertThat(model.getLink(AktenzeichenModelProcessor.REL_SET_AKTENZEICHEN)).isEmpty(); @@ -75,15 +72,12 @@ class AktenzeichenModelProcessorTest { @ParameterizedTest @EnumSource(names = { "ANGENOMMEN", "IN_BEARBEITUNG" }) void shouldCreateSetAktenzeichenLink(Vorgang.VorgangStatus vorgangStatus) { - initUserProfileUrlProvider(urlProvider); - var model = processor.process(buildModelWithVorgangStatus(vorgangStatus)); assertThat(model.getLink(AktenzeichenModelProcessor.REL_SET_AKTENZEICHEN)).isPresent().get() .extracting(Link::getHref) .isEqualTo(UriTemplate.of(CommandController.CommandByRelationController.COMMAND_BY_RELATION_PATH) - .expand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString() - ); + .expand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString()); } } 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 8c207f58d0..65a005968b 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.ModelBuilder; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.postfach.PostfachMailController; @@ -67,6 +67,9 @@ class BescheidModelAssemblerTest { @InjectMocks private BescheidModelAssembler assembler; + @InjectMocks + private LinkedResourceProcessor linkedResourceProcessor; + @Mock private BescheidService bescheidService; @@ -213,7 +216,9 @@ class BescheidModelAssemblerTest { @Test void shouldNotHaveBescheidenUndSendenLinkOnVorgangWithoutServiceKonto() { - var vorgang = vorgangWithEingang.builder().header(VorgangHeadTestFactory.createBuilder().serviceKonto(null).build()).build(); + var vorgang = VorgangWithEingangTestFactory.createBuilder() + .header(VorgangHeadTestFactory.createBuilder().serviceKonto(null).build()) + .build(); when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang); when(postfachMailController.isPostfachConfigured()).thenReturn(true); @@ -256,8 +261,9 @@ class BescheidModelAssemblerTest { return callToModel(bescheid); } + @SuppressWarnings("unchecked") private EntityModel<Bescheid> callToModel(Bescheid bescheid) { - return assembler.toModel(bescheid); + return (EntityModel<Bescheid>) linkedResourceProcessor.process(assembler.toModel(bescheid)); } } @@ -276,7 +282,7 @@ class BescheidModelAssemblerTest { @Test void shouldHaveEntityModel() { - var entityModel = ModelBuilder.fromEntity(bescheid).buildModel(); + var entityModel = EntityModel.of(bescheid); doReturn(entityModel).when(assembler).toModel(bescheid); var collectionModel = callMethod(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java index 162e1cd996..5c9580a350 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java @@ -23,13 +23,11 @@ */ package de.ozgcloud.alfa.bescheid; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Optional; -import java.util.function.BooleanSupplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -44,7 +42,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; 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.Vorgang; @@ -87,7 +84,6 @@ class BescheidVorgangProcessorTest { @Test void shouldCallExistsBescheid() { - initUserProfileUrlProvider(new UserProfileUrlProvider()); doReturn(true).when(processor).existsBescheid(anyString()); callProcess(); @@ -98,11 +94,6 @@ class BescheidVorgangProcessorTest { @Nested class TestLinks { - @BeforeEach - void init() { - initUserProfileUrlProvider(new UserProfileUrlProvider()); - } - @Test void shouldNotHaveLinkToDraft() { givenRetrievingDraftIsAllowed(false); @@ -185,11 +176,11 @@ class BescheidVorgangProcessorTest { } private void givenRetrievingDraftIsAllowed(boolean shouldBeAdded) { - doReturn((BooleanSupplier) () -> shouldBeAdded).when(processor).isRetrievingDraftAllowed(vorgang); + doReturn(shouldBeAdded).when(processor).isRetrievingDraftAllowed(vorgang); } private void givenCreatingDraftIsAllowed(boolean shouldBeAdded) { - doReturn((BooleanSupplier) () -> shouldBeAdded).when(processor).isCreatingDraftAllowed(vorgang); + doReturn(shouldBeAdded).when(processor).isCreatingDraftAllowed(vorgang); } } @@ -230,18 +221,18 @@ class BescheidVorgangProcessorTest { givenVorgangInBearbeitung(true); givenDraftExists(true); - var booleanSupplier = callMethod(); + var result = callMethod(); - assertThat(booleanSupplier.getAsBoolean()).isTrue(); + assertThat(result).isTrue(); } @Test void shouldReturnFalseIfVorgangNotInBearbeitung() { givenVorgangInBearbeitung(false); - var booleanSupplier = callMethod(); + var result = callMethod(); - assertThat(booleanSupplier.getAsBoolean()).isFalse(); + assertThat(result).isFalse(); } @Test @@ -249,12 +240,12 @@ class BescheidVorgangProcessorTest { givenVorgangInBearbeitung(true); givenDraftExists(false); - var booleanSupplier = callMethod(); + var result = callMethod(); - assertThat(booleanSupplier.getAsBoolean()).isFalse(); + assertThat(result).isFalse(); } - private BooleanSupplier callMethod() { + private boolean callMethod() { return processor.isRetrievingDraftAllowed(vorgang); } } @@ -267,18 +258,18 @@ class BescheidVorgangProcessorTest { givenVorgangInBearbeitung(true); givenDraftExists(false); - var booleanSupplier = callMethod(); + var result = callMethod(); - assertThat(booleanSupplier.getAsBoolean()).isTrue(); + assertThat(result).isTrue(); } @Test void shouldReturnFalseIfVorgangNotInBearbeitung() { givenVorgangInBearbeitung(false); - var booleanSupplier = callMethod(); + var result = callMethod(); - assertThat(booleanSupplier.getAsBoolean()).isFalse(); + assertThat(result).isFalse(); } @Test @@ -286,12 +277,12 @@ class BescheidVorgangProcessorTest { givenVorgangInBearbeitung(true); givenDraftExists(true); - var booleanSupplier = callMethod(); + var result = callMethod(); - assertThat(booleanSupplier.getAsBoolean()).isFalse(); + assertThat(result).isFalse(); } - private BooleanSupplier callMethod() { + private boolean callMethod() { return processor.isCreatingDraftAllowed(vorgang); } } 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 b867db73a6..559725a50c 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,15 +28,20 @@ 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; + class DocumentModelAssemblerTest { @Spy private DocumentModelAssembler assembler; + @InjectMocks + private LinkedResourceProcessor linkedResourceProcessor; @Nested class TestToModel { @@ -59,8 +64,9 @@ class DocumentModelAssemblerTest { .isEqualTo("/api/binaryFiles/" + DocumentTestFactory.FILE_ID); } + @SuppressWarnings("unchecked") private EntityModel<Document> callToModel() { - return assembler.toModel(document); + return (EntityModel<Document>) linkedResourceProcessor.process(assembler.toModel(document)); } } } 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 4a64401a17..e275742843 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 @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.collaboration; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -94,11 +93,6 @@ class CollaborationVorgangProcessorTest { @Nested class OnNonNullVorgangAndOnVerwaltungUserRole { - @BeforeEach - void prepareBuilder() { - initUserProfileUrlProvider(urlProvider); - } - @BeforeEach void mockUserService() { when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true); @@ -113,10 +107,10 @@ class CollaborationVorgangProcessorTest { } @Test - void shouldHaveTwoLinks() { + void shouldHaveOneLink() { var model = callProcessor(); - assertThat(model.getLinks()).hasSize(2); + assertThat(model.getLinks()).hasSize(1); } @Test @@ -148,7 +142,7 @@ class CollaborationVorgangProcessorTest { void shouldHaveFourLinks() { var model = callProcessor(); - assertThat(model.getLinks()).hasSize(4); + assertThat(model.getLinks()).hasSize(3); } @Test diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java index c7953a7048..8262128113 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -35,7 +35,7 @@ class LinkedResourceProcessorTest { @Spy @InjectMocks - private LinkedResourceProcessor processor; + private LinkedResourceProcessor<TestEntity> processor; @Mock private UserManagerUrlProvider userManagerUrlProvider; 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 index 8b32ab1744..0c53bc9e49 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/ModelBuilderTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/ModelBuilderTest.java @@ -24,11 +24,9 @@ package de.ozgcloud.alfa.common; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; import java.util.UUID; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -47,11 +45,6 @@ class ModelBuilderTest { @Nested class TestAddLinkByAnnotationIfMissing { - private static final String USER_MANAGER_URL = "http://localhost"; - private static final String USER_MANAGER_PROFILE_TEMPLATE = "/api/profile/%s"; - - private UserProfileUrlProvider provider = new UserProfileUrlProvider(); - @Mock private ApplicationContext context; @Mock @@ -59,15 +52,6 @@ class ModelBuilderTest { private TestEntity entity = TestEntityTestFactory.create(); - @BeforeEach - void mockEnvironment() { - when(env.getProperty(UserProfileUrlProvider.URL_ROOT_KEY)).thenReturn(USER_MANAGER_URL); - when(env.getProperty(UserProfileUrlProvider.USER_PROFILES_TEMPLATE_KEY)).thenReturn(USER_MANAGER_PROFILE_TEMPLATE); - when(context.getEnvironment()).thenReturn(env); - - provider.setApplicationContext(context); - } - @Test void shouldHaveAddLinkByLinkedResource() { var model = ModelBuilder.fromEntity(entity).buildModel(); @@ -75,14 +59,6 @@ class ModelBuilderTest { assertThat(model.getLink(TestController.FILE_REL).get().getHref()).isEqualTo(TestController.PATH + "/" + TestEntityTestFactory.FILE); } - @Test - void shouldHaveAddLinkByLinkedUserProfileResource() { - var model = ModelBuilder.fromEntity(entity).buildModel(); - - assertThat(model.getLink(TestController.USER_REL).get().getHref()) - .isEqualTo(String.format(USER_MANAGER_URL + USER_MANAGER_PROFILE_TEMPLATE, TestEntityTestFactory.USER)); - } - @ParameterizedTest @NullAndEmptySource void shouldNotAddLinkByLinkedRessourceIfFieldValueIsNotSet(String fileId) { @@ -96,36 +72,14 @@ class ModelBuilderTest { @Nested class TestNotAddLinkByAnnotationIfNotConfigured { - private UserProfileUrlProvider provider = new UserProfileUrlProvider(); - - @Mock - private ApplicationContext context; - @Mock - private Environment env; - private TestEntity entity = TestEntityTestFactory.create(); - @BeforeEach - void mockEnvironment() { - when(env.getProperty(UserProfileUrlProvider.URL_ROOT_KEY)).thenReturn(null); - when(context.getEnvironment()).thenReturn(env); - - provider.setApplicationContext(context); - } - @Test void shouldHaveAddLinkByLinkedResource() { var model = ModelBuilder.fromEntity(entity).buildModel(); assertThat(model.getLink(TestController.FILE_REL).get().getHref()).isEqualTo(TestController.PATH + "/" + TestEntityTestFactory.FILE); } - - @Test - void shouldNotHaveLinkAddByLinkedUserProfileAnnotation() { - var model = ModelBuilder.fromEntity(entity).buildModel(); - - assertThat(model.getLink(TestController.USER_REL)).isNotPresent(); - } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java index 756653dc95..d522973a92 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java @@ -23,11 +23,9 @@ */ package de.ozgcloud.alfa.export; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -39,7 +37,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.UriTemplate; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangController; @@ -56,16 +53,9 @@ class ExportVorgangProcessorTest { @Mock private VorgangController vorgangController; - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @Nested class TestProcess { - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - @DisplayName("Export link") @Nested class TestExportLink { 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 76c9affa1e..441e90c039 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,7 +39,8 @@ import org.springframework.hateoas.Link; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; @@ -56,12 +57,8 @@ class HistorieModelAssemblerTest { private static final String COMMAND_SINGLE_PATH = "/api/histories/" + CommandTestFactory.ID; - private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @Test void shouldHaveSelfLink() { - initUserProfileUrlProvider(urlProvider); - var model = modelAssembler.toModel(CommandTestFactory.create()); assertThat(model.getLink(IanaLinkRelations.SELF)).isPresent().get().extracting(Link::getHref).isEqualTo(COMMAND_SINGLE_PATH); @@ -124,11 +121,17 @@ class HistorieModelAssemblerTest { @DisplayName("createdBy Link") @Nested class TestCreatedByLink { + + @InjectMocks + private LinkedResourceProcessor<Command> linkedResourceProcessor; + @Mock + private UserManagerUrlProvider userManagerUrlProvider; + @Test void shouldExistingAtUser() { - initUserProfileUrlProvider(urlProvider); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); - var model = modelAssembler.toModel(CommandTestFactory.create()); + var model = linkedResourceProcessor.process(modelAssembler.toModel(CommandTestFactory.create())); 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 882b6eab5e..91c487f0fc 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,8 +41,10 @@ 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.UserProfileUrlProvider; import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -97,6 +99,11 @@ class KommentarModelAssemblerTest { private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + @InjectMocks + private LinkedResourceProcessor<Kommentar> linkedResourceProcessor; + @Mock + private UserManagerUrlProvider userManagerUrlProvider; + @Test void shouldHaveSelfLink() { var link = buildModel().getLink(IanaLinkRelations.SELF); @@ -126,10 +133,9 @@ class KommentarModelAssemblerTest { @Test void shouldHaveCreatedByLink() { - UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - initUserProfileUrlProvider(urlProvider); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); - var model = buildModel(); + var model = linkedResourceProcessor.process(buildModel()); assertThat(model.getLink(REL_CREATED_BY)).isPresent().get().extracting(Link::getHref) .isEqualTo(USER_MANAGER_URL + KommentarTestFactory.CREATED_BY); @@ -170,7 +176,6 @@ class KommentarModelAssemblerTest { @Test void shouldBuildModel() { - initUserProfileUrlProvider(urlProvider); var kommentar = KommentarTestFactory.create(); var vorgang = VorgangWithEingangTestFactory.create(); when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang); @@ -182,8 +187,6 @@ class KommentarModelAssemblerTest { @Test void shouldLoadVorgang() { - initUserProfileUrlProvider(urlProvider); - modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), VorgangHeaderTestFactory.ID); verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID); @@ -191,7 +194,6 @@ class KommentarModelAssemblerTest { @Test void shouldHaveCreateKommentarLink() { - initUserProfileUrlProvider(urlProvider); when(vorgangController.isEditable(vorgang)).thenReturn(true); var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), @@ -206,7 +208,6 @@ class KommentarModelAssemblerTest { @Test void shouldNotHaveCreateKommentarLink() { - initUserProfileUrlProvider(urlProvider); when(vorgangController.isEditable(vorgang)).thenReturn(false); var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), 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 e2024c879a..384aadb5cd 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 @@ -42,8 +42,6 @@ import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; -import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemTestFactory; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandOrder; @@ -63,11 +61,6 @@ class LoeschAnforderungCommandProcessorTest { @Nested class TestProcess { - @BeforeEach - void mock() { - UserProfileUrlProviderTestFactory.initUserProfileUrlProvider(new UserProfileUrlProvider()); - } - @DisplayName("on revokeable") @Nested class TestRevokeableCommand { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssemblerTest.java index c6bedb3645..3d45e974f0 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungModelAssemblerTest.java @@ -23,12 +23,10 @@ */ package de.ozgcloud.alfa.loeschanforderung; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -39,8 +37,6 @@ import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.web.util.UriTemplate; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; - class LoeschAnforderungModelAssemblerTest { @InjectMocks @@ -48,11 +44,6 @@ class LoeschAnforderungModelAssemblerTest { @Mock private LoeschAnforderungService loeschAnforderungService; - @BeforeEach - void init() { - initUserProfileUrlProvider(new UserProfileUrlProvider()); - } - @Nested @DisplayName("Build resource") class TestToModel { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java index a8ddd9361c..b332d2f57b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.loeschanforderung; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -43,7 +42,6 @@ import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemTestFactory; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; @@ -76,8 +74,6 @@ class LoeschAnforderungVorgangProcessorTest { @BeforeEach void mock() { - initUserProfileUrlProvider(new UserProfileUrlProvider()); - when(loeschAnforderungService.findLoeschAnforderung(VorgangHeaderTestFactory.ID)).thenReturn( Optional.of(VorgangAttachedItemTestFactory.create())); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java index 94ae793fbb..7b9dee67de 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.vorgang; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -33,7 +32,6 @@ import java.util.Optional; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -44,7 +42,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserRole; @@ -60,19 +57,12 @@ class VorgangModelAssemblerTest { @Mock private VorgangService vorgangService; - private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - private static final int PAGE_SIZE = 100; @DisplayName("To collectionModel") @Nested class TestCollectionModel { - @BeforeEach - void prepareBuilder() { - initUserProfileUrlProvider(urlProvider); - } - @DisplayName("init model") @Nested class TestInitModel { @@ -317,14 +307,8 @@ class VorgangModelAssemblerTest { @Nested class TestLinksOnModel { - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - @BeforeEach - void beforeEach() { - initUserProfileUrlProvider(urlProvider); - } - @Test void shouldHaveSelfLink() { var link = toModel().getLink(IanaLinkRelations.SELF_VALUE); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java index 987b09227e..865bf45b36 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProcessorTest.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.vorgang; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -42,7 +41,6 @@ import org.springframework.hateoas.LinkRelation; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriTemplate; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.postfach.PostfachMailController; @@ -60,17 +58,10 @@ class VorgangWithEingangProcessorTest { @Mock private VorgangProcessorProperties vorgangProcessorProperties; - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @DisplayName("Attachments") @Nested class TestAttachments { - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - @DisplayName("link") @Nested class TestLink { @@ -132,11 +123,6 @@ class VorgangWithEingangProcessorTest { @Nested class TestRepresentationsLink { - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - private static final String PATH = "/api/vorgang/" + VorgangHeaderTestFactory.ID + "/representations"; private final LinkRelation linkRel = VorgangWithEingangProcessor.REL_REPRESENTATIONS; @@ -214,11 +200,6 @@ class VorgangWithEingangProcessorTest { @Nested class TestSearchUserProfileLink { - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - @DisplayName("on configured for search user profile") @Nested class TestIsConfigured { @@ -287,11 +268,6 @@ class VorgangWithEingangProcessorTest { private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private final EntityModel<VorgangWithEingang> vorgangEntityModel = EntityModel.of(vorgang); - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - @DisplayName("on matching configuration") @Nested class TestOnMatchingConfiguration { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessorTest.java index 37b3d3ad54..b99f8ab6a4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProcessorTest.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.vorgang.command; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -44,7 +43,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkRelation; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; @@ -70,12 +68,8 @@ class VorgangWithEingangCommandProcessorTest { private VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private EntityModel<VorgangWithEingang> vorgangEntityModel = EntityModel.of(vorgang); - private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @Test void shouldReturnEntityModel() { - initUserProfileUrlProvider(urlProvider); - var result = processor.process(vorgangEntityModel); assertThat(result).isNotNull(); @@ -155,11 +149,6 @@ class VorgangWithEingangCommandProcessorTest { private final LinkRelation linkRel = VorgangWithEingangCommandProcessor.REL_VORGANG_FORWARD; - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - @Test void shouldNotBePresent() { doReturn(false).when(processor).isForwardingAllowed(any()); @@ -186,11 +175,6 @@ class VorgangWithEingangCommandProcessorTest { @Nested class TestPendingCommandsLink { - @BeforeEach - void init() { - initUserProfileUrlProvider(urlProvider); - } - @Test void shouldExists() { when(commandController.existsPendingCommands(any())).thenReturn(true); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java index 01cbb98f06..196c4aff1b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java @@ -24,7 +24,6 @@ package de.ozgcloud.alfa.wiedervorlage; import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Collections; @@ -36,13 +35,10 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.server.EntityLinks; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.file.OzgFileTestFactory; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -51,7 +47,7 @@ import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; class WiedervorlageModelAssemblerTest { - private final String PATH = WiedervorlageController.WIEDERVORLAGE_PATH + "/"; + private static final String PATH = WiedervorlageController.WIEDERVORLAGE_PATH + "/"; @Spy @InjectMocks @@ -62,17 +58,6 @@ class WiedervorlageModelAssemblerTest { @Mock private VorgangController vorgangController; - private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - - @BeforeEach - void initTest() { - var context = mock(ApplicationContext.class); - var environment = mock(Environment.class); - when(environment.getProperty(anyString())).thenReturn("test/"); - when(context.getEnvironment()).thenReturn(environment); - urlProvider.setApplicationContext(context); - } - @Nested class TestToModel { -- GitLab From 83450009dde0fbe0d1ae9ce58376e9e3752676ce Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 21 Feb 2025 16:30:37 +0100 Subject: [PATCH 03/19] OZG-3936 OZG-7793 Remove UserManagerUrlProvider from serializer --- .../LinkedUserProfileResourceSerializer.java | 29 +++-- ...edUserProfileResourceSerializerITCase.java | 88 +++++++++++++ ...nkedUserProfileResourceSerializerTest.java | 121 +++++++++++------- 3 files changed, 180 insertions(+), 58 deletions(-) create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index ed0f0ee293..59520565f0 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -29,6 +29,7 @@ import java.util.Collection; import org.apache.commons.lang3.reflect.ConstructorUtils; import org.springframework.hateoas.Link; +import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; @@ -36,29 +37,37 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; -@NoArgsConstructor +@Component +@RequiredArgsConstructor public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { + private final UserManagerUrlProvider userManagerUrlProvider; + private LinkedUserProfileResource annotation; - private LinkedUserProfileResourceSerializer(LinkedUserProfileResource annotation) { - this.annotation = annotation; + private static LinkedUserProfileResourceSerializer createContectualSerializer(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { + var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider); + serializer.annotation = annotation; + return serializer; } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { - return new LinkedUserProfileResourceSerializer(property.getAnnotation(LinkedUserProfileResource.class)); + return LinkedUserProfileResourceSerializer.createContectualSerializer(userManagerUrlProvider, property.getAnnotation(LinkedUserProfileResource.class)); } String buildLink(Object id) { - if (UserProfileUrlProvider.isConfigured()) { - return Link.of(UserProfileUrlProvider.getUrl(getExtractor().extractId(id))).getHref(); - } else { - return id.toString(); - } + return userManagerUrlProvider.isConfiguredForUserProfile() ? + Link.of(buildUserProfileUri(id.toString())).getHref() : + String.valueOf(id); + } + + private String buildUserProfileUri(String id) { + return String.format(userManagerUrlProvider.getUserProfileTemplate(), getExtractor().extractId(id)); } IdExtractor<Object> getExtractor() { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java new file mode 100644 index 0000000000..2879f2297d --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java @@ -0,0 +1,88 @@ +/* + * 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 static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; +import de.ozgcloud.common.test.ITCase; + +@ITCase +class LinkedUserProfileResourceSerializerITCase { + + @MockitoBean + private UserManagerUrlProvider userManagerUrlProvider; + + @Autowired + private ObjectMapper objectMapper; + + @Nested + class TestSerialization { + + private final LinkedUserProfileResourceTestObject testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); + + @Nested + class OnIsUrlConfigured { + + private static final String HTTP_LOCALHOST = "http://localhost/"; + private static final String API_TEMPLATE = "api/profile/%s"; + private static final String API_PATH = "api/profile/"; + + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(HTTP_LOCALHOST + API_TEMPLATE); + } + + @Test + void shouldSerializeToUrl() throws JsonProcessingException { + var serialized = objectMapper.writeValueAsString(testObj); + + assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); + } + } + + @Nested + class OnUrlIsNotConfigured { + + @Test + void shouldSerializeToId() throws JsonProcessingException { + var serialized = objectMapper.writeValueAsString(testObj); + + assertThat(serialized).isEqualTo("{\"id\":\"" + UserProfileTestFactory.ID.toString() + "\"}"); + } + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java index 6a7ebb175d..05aefe6e1c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java @@ -1,71 +1,96 @@ -/* - * 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 static org.mockito.Mockito.*; -import org.junit.jupiter.api.DisplayName; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; import org.mockito.Mock; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.mockito.Spy; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; class LinkedUserProfileResourceSerializerTest { - @DisplayName("Test the json serilization of linked user profile resource annotations") - @Nested - class TestSerialization { - private static final String HTTP_LOCALHOST = "http://localhost/"; - private static final String API_TEMPLATE = "api/profile/%s"; - private static final String API_PATH = "api/profile/"; - private UserProfileUrlProvider provider = new UserProfileUrlProvider(); + @Spy + @InjectMocks + private LinkedUserProfileResourceSerializer serializer; + @Mock + private UserManagerUrlProvider userManagerUrlProvider; - @Mock - private ApplicationContext context; - @Mock - private Environment env; + private static final String USER_PROFILE_URL_TEMPLATE = "DummyUserProfileUrlTemplate/%s"; + + @Nested + class TestBuildLink { @Test - void shouldSerialize() throws JsonProcessingException { - when(env.getProperty(UserProfileUrlProvider.URL_ROOT_KEY)).thenReturn(HTTP_LOCALHOST); - when(env.getProperty(UserProfileUrlProvider.USER_PROFILES_TEMPLATE_KEY)).thenReturn(API_TEMPLATE); - when(context.getEnvironment()).thenReturn(env); - provider.setApplicationContext(context); + void shouldCheckIfUrlIsConfigured() { + buildLink(); + + verify(userManagerUrlProvider).isConfiguredForUserProfile(); + } + + @Nested + class OnUrlIsConfigured { + + private static final String EXTRACTED_ID = UUID.randomUUID().toString(); + + @Mock + private IdExtractor<Object> extractor; - var testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(USER_PROFILE_URL_TEMPLATE); + doReturn(extractor).when(serializer).getExtractor(); + when(extractor.extractId(any())).thenReturn(EXTRACTED_ID); + } - String serialized = new ObjectMapper().writeValueAsString(testObj); + @Test + void shouldCallProvider() { + buildLink(); - assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); + verify(userManagerUrlProvider).getUserProfileTemplate(); + } + + @Test + void shouldExtractId() { + buildLink(); + + verify(extractor).extractId(UserProfileTestFactory.ID.toString()); + } + + @Test + void shouldReturnLink() { + var link = buildLink(); + + assertThat(link).isEqualTo("DummyUserProfileUrlTemplate/" + EXTRACTED_ID); + } + } + + @Nested + class OnUriIsNotConfigured { + + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(false); + } + + @Test + void shouldReturnStringValueOfId() { + var link = buildLink(); + + assertThat(link).isEqualTo(UserProfileTestFactory.ID.toString()); + } } + private String buildLink() { + return serializer.buildLink(UserProfileTestFactory.ID); + } } } -- GitLab From 71a2a8ba71d06b4f404872b4f83bdf1fa83ab0aa Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Mon, 24 Feb 2025 13:47:03 +0100 Subject: [PATCH 04/19] OZG-3936 OZG-7793 Refactor tests --- .../LinkedUserProfileResourceSerializer.java | 32 ++-- ...edUserProfileResourceSerializerITCase.java | 48 ++---- ...nkedUserProfileResourceSerializerTest.java | 159 +++++++++++++----- 3 files changed, 150 insertions(+), 89 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index 59520565f0..582ad419b2 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -49,7 +49,7 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> private LinkedUserProfileResource annotation; - private static LinkedUserProfileResourceSerializer createContectualSerializer(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { + static LinkedUserProfileResourceSerializer createForAnnotatedField(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider); serializer.annotation = annotation; return serializer; @@ -57,10 +57,21 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { - return LinkedUserProfileResourceSerializer.createContectualSerializer(userManagerUrlProvider, property.getAnnotation(LinkedUserProfileResource.class)); + return LinkedUserProfileResourceSerializer.createForAnnotatedField(userManagerUrlProvider, property.getAnnotation(LinkedUserProfileResource.class)); } - String buildLink(Object id) { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value instanceof Collection) { + gen.writeStartArray(); + ((Collection<?>) value).forEach(val -> writeObject(gen, buildLink(val))); + gen.writeEndArray(); + } else { + writeObject(gen, buildLink(value)); + } + } + + private String buildLink(Object id) { return userManagerUrlProvider.isConfiguredForUserProfile() ? Link.of(buildUserProfileUri(id.toString())).getHref() : String.valueOf(id); @@ -70,7 +81,7 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> return String.format(userManagerUrlProvider.getUserProfileTemplate(), getExtractor().extractId(id)); } - IdExtractor<Object> getExtractor() { + private IdExtractor<Object> getExtractor() { try { return ConstructorUtils.invokeConstructor(annotation.extractor()); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) { @@ -78,18 +89,7 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> } } - @Override - public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - if (value instanceof Collection) { - gen.writeStartArray(); - ((Collection<?>) value).forEach(val -> writeObject(gen, buildLink(val))); - gen.writeEndArray(); - } else { - writeObject(gen, buildLink(value)); - } - } - - void writeObject(JsonGenerator gen, Object value) { + private void writeObject(JsonGenerator gen, Object value) { try { gen.writeObject(value); } catch (IOException e) { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java index 2879f2297d..ca3058226b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java @@ -27,7 +27,6 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.bean.override.mockito.MockitoBean; @@ -42,47 +41,28 @@ import de.ozgcloud.common.test.ITCase; @ITCase class LinkedUserProfileResourceSerializerITCase { + private static final String HTTP_LOCALHOST = "http://localhost/"; + private static final String API_TEMPLATE = "api/profile/%s"; + private static final String API_PATH = "api/profile/"; + @MockitoBean private UserManagerUrlProvider userManagerUrlProvider; @Autowired private ObjectMapper objectMapper; - @Nested - class TestSerialization { - - private final LinkedUserProfileResourceTestObject testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); - - @Nested - class OnIsUrlConfigured { - - private static final String HTTP_LOCALHOST = "http://localhost/"; - private static final String API_TEMPLATE = "api/profile/%s"; - private static final String API_PATH = "api/profile/"; - - @BeforeEach - void init() { - when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); - when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(HTTP_LOCALHOST + API_TEMPLATE); - } - - @Test - void shouldSerializeToUrl() throws JsonProcessingException { - var serialized = objectMapper.writeValueAsString(testObj); - - assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); - } - } + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(HTTP_LOCALHOST + API_TEMPLATE); + } - @Nested - class OnUrlIsNotConfigured { + @Test + void shouldSerialize() throws JsonProcessingException { + var testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); - @Test - void shouldSerializeToId() throws JsonProcessingException { - var serialized = objectMapper.writeValueAsString(testObj); + var serialized = objectMapper.writeValueAsString(testObj); - assertThat(serialized).isEqualTo("{\"id\":\"" + UserProfileTestFactory.ID.toString() + "\"}"); - } - } + assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java index 05aefe6e1c..31f1031218 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java @@ -3,73 +3,107 @@ package de.ozgcloud.alfa.common; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.util.List; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Spy; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; + +import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; -import de.ozgcloud.alfa.common.user.UserProfileTestFactory; +import lombok.SneakyThrows; class LinkedUserProfileResourceSerializerTest { - @Spy - @InjectMocks - private LinkedUserProfileResourceSerializer serializer; + private static final LinkedUserProfileResource ANNOTATION = getAnnotation(); + @Mock private UserManagerUrlProvider userManagerUrlProvider; - private static final String USER_PROFILE_URL_TEMPLATE = "DummyUserProfileUrlTemplate/%s"; + private LinkedUserProfileResourceSerializer serializer; + + @BeforeEach + void init() { + serializer = LinkedUserProfileResourceSerializer.createForAnnotatedField(userManagerUrlProvider, ANNOTATION); + } @Nested - class TestBuildLink { + class TestSerialize { - @Test - void shouldCheckIfUrlIsConfigured() { - buildLink(); + private static final UserId USER_ID = UserId.from(UUID.randomUUID()); + private static final UserId USER_ID_2 = UserId.from(UUID.randomUUID()); - verify(userManagerUrlProvider).isConfiguredForUserProfile(); - } + @Mock + private JsonGenerator generator; + @Mock + private SerializerProvider serializerProvider; + @Captor + private ArgumentCaptor<Object> writtenObjectCaptor; @Nested class OnUrlIsConfigured { - private static final String EXTRACTED_ID = UUID.randomUUID().toString(); - - @Mock - private IdExtractor<Object> extractor; + private static final String HTTP_LOCALHOST = "http://localhost/"; + private static final String API_TEMPLATE = "api/profile/%s"; + private static final String API_PATH = "api/profile/"; @BeforeEach void init() { when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); - when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(USER_PROFILE_URL_TEMPLATE); - doReturn(extractor).when(serializer).getExtractor(); - when(extractor.extractId(any())).thenReturn(EXTRACTED_ID); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(HTTP_LOCALHOST + API_TEMPLATE); } - @Test - void shouldCallProvider() { - buildLink(); + @Nested + class OnSingularValue { + + @SneakyThrows + @Test + void shouldSerializeToUrl() { + serializeSingleValue(); - verify(userManagerUrlProvider).getUserProfileTemplate(); + verify(generator).writeObject(writtenObjectCaptor.capture()); + assertThat(writtenObjectCaptor.getValue()).isEqualTo(expectedUrl(USER_ID)); + } } - @Test - void shouldExtractId() { - buildLink(); + @Nested + class OnCollection { - verify(extractor).extractId(UserProfileTestFactory.ID.toString()); - } + @SneakyThrows + @Test + void shouldWriteStartArray() { + serializeCollection(); + + verify(generator).writeStartArray(); + } + + @SneakyThrows + @Test + void shouldSerializeToUrls() { + serializeCollection(); + + verify(generator, times(2)).writeObject(writtenObjectCaptor.capture()); + assertThat(writtenObjectCaptor.getAllValues()).containsExactly(expectedUrl(USER_ID), expectedUrl(USER_ID_2)); + } + + @SneakyThrows + @Test + void shouldWriteEndArray() { + serializeCollection(); - @Test - void shouldReturnLink() { - var link = buildLink(); + verify(generator).writeEndArray(); + } + } - assertThat(link).isEqualTo("DummyUserProfileUrlTemplate/" + EXTRACTED_ID); + private String expectedUrl(UserId id) { + return HTTP_LOCALHOST + API_PATH + id.toString(); } } @@ -81,16 +115,63 @@ class LinkedUserProfileResourceSerializerTest { when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(false); } - @Test - void shouldReturnStringValueOfId() { - var link = buildLink(); + @Nested + class OnSingularValue { + + @SneakyThrows + @Test + void shouldSerializeToString() { + serializeSingleValue(); + + verify(generator).writeObject(writtenObjectCaptor.capture()); + assertThat(writtenObjectCaptor.getValue()).isEqualTo(USER_ID.toString()); + } + } + + @Nested + class OnCollection { + + @SneakyThrows + @Test + void shouldWriteStartArray() { + serializeCollection(); + + verify(generator).writeStartArray(); + } - assertThat(link).isEqualTo(UserProfileTestFactory.ID.toString()); + @SneakyThrows + @Test + void shouldSerializeToUrls() { + serializeCollection(); + + verify(generator, times(2)).writeObject(writtenObjectCaptor.capture()); + assertThat(writtenObjectCaptor.getAllValues()).containsExactly(USER_ID.toString(), USER_ID_2.toString()); + } + + @SneakyThrows + @Test + void shouldWriteEndArray() { + serializeCollection(); + + verify(generator).writeEndArray(); + } } } - private String buildLink() { - return serializer.buildLink(UserProfileTestFactory.ID); + @SneakyThrows + private void serializeSingleValue() { + serializer.serialize(USER_ID, generator, serializerProvider); } + + @SneakyThrows + private void serializeCollection() { + serializer.serialize(List.of(USER_ID, USER_ID_2), generator, serializerProvider); + } + } + + @SneakyThrows + private static LinkedUserProfileResource getAnnotation() { + var idField = LinkedUserProfileResourceTestObject.class.getDeclaredField("id"); + return idField.getDeclaredAnnotation(LinkedUserProfileResource.class); } } -- GitLab From a63a6cec094393d600999aae6287a00944cf470f Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Mon, 24 Feb 2025 14:58:37 +0100 Subject: [PATCH 05/19] OZG-3936 remove ModelBuilder --- .../de/ozgcloud/alfa/RootModelAssembler.java | 39 ++- .../de/ozgcloud/alfa/RootViewLinkHandler.java | 76 +++-- .../CollaborationModelAssembler.java | 7 +- .../CollaborationVorgangProcessor.java | 12 +- .../FachstelleModelAssembler.java | 7 +- ...anisationsEinheitHeaderModelAssembler.java | 7 +- .../OrganisationsEinheitModelAssembler.java | 7 +- .../de/ozgcloud/alfa/common/ModelBuilder.java | 264 ------------------ .../binaryfile/BinaryFileModelAssembler.java | 8 +- .../common/command/CommandModelAssembler.java | 16 +- .../forwarding/ForwardingModelAssembler.java | 22 +- .../alfa/hint/HintModelAssembler.java | 4 +- .../alfa/hint/HintRootResourceProcessor.java | 13 +- .../alfa/historie/HistorieModelAssembler.java | 16 +- .../kommentar/KommentarModelAssembler.java | 16 +- .../LoeschAnforderungCommandProcessor.java | 26 +- .../LoeschAnforderungModelAssembler.java | 22 +- .../LoeschAnforderungVorgangProcessor.java | 16 +- .../postfach/PostfachMailModelAssembler.java | 30 +- .../alfa/vorgang/VorgangModelAssembler.java | 13 +- .../vorgang/VorgangWithEingangProcessor.java | 36 +-- .../VorgangWithEingangCommandProcessor.java | 23 +- .../alfa/RootViewLinkHandlerTest.java | 189 ++++++------- .../bescheid/BescheidModelAssemblerTest.java | 8 +- .../bescheid/DocumentModelAssemblerTest.java | 8 +- .../CollaborationModelAssemblerTest.java | 8 +- .../CollaborationVorgangProcessorTest.java | 3 - .../alfa/common/LinkedResourceTestUtils.java | 16 ++ .../alfa/common/ModelBuilderTest.java | 120 -------- .../BinaryFileModelAssemblerTest.java | 2 +- .../historie/HistorieModelAssemblerTest.java | 8 +- .../KommentarModelAssemblerTest.java | 8 +- ...LoeschAnforderungCommandProcessorTest.java | 2 +- 33 files changed, 299 insertions(+), 753 deletions(-) delete mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/common/ModelBuilder.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java delete mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/ModelBuilderTest.java 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 e62dd86b34..d671559197 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 80f77f5181..a8af53edb7 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 cdcc60be02..88f9295005 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 b1c4dd3da3..2f75114f05 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 0b3a22989f..9bc6f742c0 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 35bc52e641..a77ae2c76a 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 ad3ee72f30..1d699dcc74 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 f4b0b7a57d..0000000000 --- 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 1f9e534523..bd287a72d9 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 31f4bce83e..94f0209dfd 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 fdb6df92dd..b43d53909e 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 f7639f549b..ebb2b04267 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 651e14ef63..27e8c9a4e2 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 a88d362dfe..1e6a320543 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 ed4c3a5342..3ed9abdfc3 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 a184358703..d915e95235 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 d2b91d808a..735ad323fc 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 5281c14004..c37a359c0d 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 8de875f0fa..d857ac77a0 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 47c76b1574..800829cb55 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 a5014ff3e7..e6b7fc7599 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 2c2453560d..34de66b875 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 c626a7ad29..fb0c2b9228 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 65a005968b..446bf2d7d5 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 559725a50c..29f78b4071 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 3f4db27529..7878bfea35 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 e275742843..271ce3f758 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 0000000000..819e2d402a --- /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 0c53bc9e49..0000000000 --- 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 5696644059..edfbc4ca3b 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 441e90c039..4122969ffb 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 91c487f0fc..f942663264 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 384aadb5cd..e108bfe27f 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; -- GitLab From bbdb28bb11b970221c62134cef8112a6aa7e3139 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Mon, 24 Feb 2025 15:05:16 +0100 Subject: [PATCH 06/19] OZG-3936 remove CollectionModelBuilder --- .../CollaborationModelAssembler.java | 9 +- .../alfa/common/CollectionModelBuilder.java | 94 ----------- .../kommentar/KommentarModelAssembler.java | 14 +- .../common/CollectionModelBuilderTest.java | 149 ------------------ .../KommentarModelAssemblerTest.java | 2 - 5 files changed, 9 insertions(+), 259 deletions(-) delete mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/common/CollectionModelBuilder.java delete mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/CollectionModelBuilderTest.java 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 88f9295005..703c1e5fab 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 @@ -35,7 +35,6 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; -import de.ozgcloud.alfa.common.CollectionModelBuilder; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -62,11 +61,9 @@ class CollaborationModelAssembler implements RepresentationModelAssembler<Collab var selfLink = linkTo(methodOn(CollaborationByVorgangController.class).getAllByVorgangId(vorgangId)).withSelfRel(); - return CollectionModelBuilder.fromEntities(entityModels) - .addLink(selfLink) - .ifMatch(() -> entityModels.isEmpty() && vorgangController.isEditable(vorgang)) - .addLink(() -> buildCreateCollaborationRequestLink(vorgang)) - .buildModel(); + return CollectionModel.of(entityModels) + .add(selfLink) + .addIf(entityModels.isEmpty() && vorgangController.isEditable(vorgang), () -> buildCreateCollaborationRequestLink(vorgang)); } Link buildCreateCollaborationRequestLink(VorgangWithEingang vorgang) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/CollectionModelBuilder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/CollectionModelBuilder.java deleted file mode 100644 index 01ceb2d404..0000000000 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/CollectionModelBuilder.java +++ /dev/null @@ -1,94 +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.util.LinkedList; -import java.util.List; -import java.util.function.BooleanSupplier; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import org.springframework.hateoas.CollectionModel; -import org.springframework.hateoas.Link; - -import lombok.RequiredArgsConstructor; - -public class CollectionModelBuilder<T> { - - private final Iterable<T> entities; - - private final List<Link> links = new LinkedList<>(); - - private CollectionModelBuilder(Iterable<T> entities) { - this.entities = entities; - } - - public static <T> CollectionModelBuilder<T> fromEntities(Iterable<T> entities) { - return new CollectionModelBuilder<>(entities); - } - - public static <T> CollectionModelBuilder<T> fromEntities(Stream<T> entities) { - return new CollectionModelBuilder<>(entities.toList()); - } - - public CollectionModelBuilder<T> addLink(Link link) { - links.add(link); - return this; - } - - public ConditionalLinkAdder ifMatch(BooleanSupplier guard) { - return new ConditionalLinkAdder(guard.getAsBoolean()); - } - - public ConditionalLinkAdder ifMatch(Predicate<? super Iterable<T>> predicate) { - return new ConditionalLinkAdder(predicate.test(entities)); - } - - public CollectionModel<T> buildModel() { - var builtModel = CollectionModel.of(entities); - builtModel.add(links); - return builtModel; - } - - @RequiredArgsConstructor - public class ConditionalLinkAdder { - - public final boolean conditionFulfilled; - - public CollectionModelBuilder<T> addLink(Link link) { - if (conditionFulfilled) { - links.add(link); - } - return CollectionModelBuilder.this; - } - - public CollectionModelBuilder<T> addLink(Supplier<Link> linkSupplier) { - if (conditionFulfilled) { - links.add(linkSupplier.get()); - } - return CollectionModelBuilder.this; - } - } -} \ No newline at end of file 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 3ed9abdfc3..ba9d6df0ae 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 @@ -33,7 +33,6 @@ 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.binaryfile.BinaryFileController; import de.ozgcloud.alfa.kommentar.KommentarCommandController.KommentarCommandByVorgangController; import de.ozgcloud.alfa.vorgang.VorgangController; @@ -72,12 +71,11 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, public CollectionModel<EntityModel<Kommentar>> toCollectionModel(Stream<Kommentar> entities, String vorgangId) { var vorgang = vorgangController.getVorgang(vorgangId); - return CollectionModelBuilder.fromEntities(entities.map(kommentar -> buildModel(kommentar, vorgang))) - .addLink(linkTo(KommentarController.class).withSelfRel()) - .addLink(linkTo(BinaryFileController.class).slash(vorgangId).slash("kommentarAttachment").slash("file").withRel(REL_UPLOAD_FILE)) - .ifMatch(() -> vorgangController.isEditable(vorgang)) - .addLink(linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId)) - .withRel(REL_CREATE)) - .buildModel(); + return CollectionModel.of(entities.map(kommentar -> buildModel(kommentar, vorgang)).toList()) + .add(linkTo(KommentarController.class).withSelfRel()) + .add(linkTo(BinaryFileController.class).slash(vorgangId).slash("kommentarAttachment").slash("file").withRel(REL_UPLOAD_FILE)) + .addIf(vorgangController.isEditable(vorgang), + () -> linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId)) + .withRel(REL_CREATE)); } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/CollectionModelBuilderTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/CollectionModelBuilderTest.java deleted file mode 100644 index 53e3d279b9..0000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/CollectionModelBuilderTest.java +++ /dev/null @@ -1,149 +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 static org.mockito.Mockito.*; - -import java.util.List; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.springframework.hateoas.Link; - -import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; -import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage; -import de.ozgcloud.alfa.wiedervorlage.WiedervorlageTestFactory; - -class CollectionModelBuilderTest { - - private final String HREF = "http://test"; - private final String REL = "rel"; - - @Nested - class TestBuildModel { - - @Test - void shouldBuildModel() { - var vorgang = VorgangHeaderTestFactory.create(); - - var model = CollectionModelBuilder.fromEntities(List.of(vorgang)).buildModel(); - - assertThat(model.getContent()).hasSize(1).first().usingRecursiveComparison().isEqualTo(vorgang); - } - } - - @Nested - class TestAddLink { - - @Test - void shouldAddLink() { - var model = CollectionModelBuilder.fromEntities(List.of()).addLink(Link.of(HREF, REL)).buildModel(); - - assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL); - } - } - - @Nested - class TestIfMatch { - - @Nested - class TestWithBooleanSupplier { - - @Test - void shouldAddLink() { - var model = CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> true).addLink(Link.of(HREF, REL)).buildModel(); - - assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL); - } - - @Test - void shouldNotAddLink() { - var model = CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> false).addLink(Link.of(HREF, REL)).buildModel(); - - assertThat(model.getLinks()).isEmpty(); - } - } - - @Nested - class TestWithPredicate { - - private final Stream<Wiedervorlage> wiedervorlageStream = Stream.of(WiedervorlageTestFactory.create()); - - @Test - void shouldAddLink() { - var model = CollectionModelBuilder.fromEntities(wiedervorlageStream) - .ifMatch(wiedervorlagen -> true) - .addLink(Link.of(HREF, REL)) - .buildModel(); - - assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL); - } - - @Test - void shouldNotAddLink() { - var model = CollectionModelBuilder.fromEntities(wiedervorlageStream) - .ifMatch(wiedervorlagen -> false) - .addLink(Link.of(HREF, REL)) - .buildModel(); - - assertThat(model.getLinks()).isEmpty(); - } - } - - @Nested - class TestWithLinkSupplier { - - @Mock - private Supplier<Link> linkSupplier; - - @Test - void shouldAddLink() { - when(linkSupplier.get()).thenReturn(Link.of(HREF, REL)); - - var model = CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> true).addLink(linkSupplier).buildModel(); - - assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL); - } - - @Test - void shouldNotCallLinkSupplier() { - CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> false).addLink(linkSupplier).buildModel(); - - verify(linkSupplier, never()).get(); - } - - @Test - void shouldNotAddLink() { - var model = CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> false).addLink(linkSupplier).buildModel(); - - assertThat(model.getLinks()).isEmpty(); - } - } - } - -} \ No newline at end of file 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 f942663264..db7c591bad 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 @@ -42,7 +42,6 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.server.EntityLinks; 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; import de.ozgcloud.alfa.vorgang.VorgangController; @@ -164,7 +163,6 @@ class KommentarModelAssemblerTest { @Nested class TestLinksOnCollectionModel { - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); @BeforeEach -- GitLab From f679f39a04d401490ce30b58d30957b351b8d835 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Mon, 24 Feb 2025 15:29:29 +0100 Subject: [PATCH 07/19] OZG-3936 remove UserProfileUrlProvider --- .../alfa/common/UserProfileUrlProvider.java | 74 ------------------- .../alfa/vorgang/VorgangController.java | 18 ++--- .../AktenzeichenModelProcessorTest.java | 3 - .../UserProfileUrlProviderTestFactory.java | 45 ----------- .../command/CommandModelAssemblerTest.java | 12 --- .../historie/HistorieModelAssemblerTest.java | 4 +- .../KommentarModelAssemblerTest.java | 9 +-- .../LoeschAnforderungControllerTest.java | 4 - .../alfa/vorgang/VorgangControllerTest.java | 11 --- 9 files changed, 15 insertions(+), 165 deletions(-) delete mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/common/UserProfileUrlProvider.java delete mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/UserProfileUrlProviderTestFactory.java diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/UserProfileUrlProvider.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/UserProfileUrlProvider.java deleted file mode 100644 index 100dd420eb..0000000000 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/UserProfileUrlProvider.java +++ /dev/null @@ -1,74 +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.util.Objects; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -import com.google.common.base.Preconditions; - -@Component -public class UserProfileUrlProvider implements ApplicationContextAware { - // TODO auf javax.validation umstellen - private static final String ERROR_MESSAGE = "Key %s missing, please add it to the application.yml"; - // TODO applicationContext darf nicht static abgelegt werden - es sollte möglich - // sein, dass eine andere Konfiguration in der jvm läuft. - private static ApplicationContext applicationContext; - static final String URL_ROOT_KEY = "ozgcloud.user-manager.url"; - static final String USER_PROFILES_TEMPLATE_KEY = "ozgcloud.user-manager.profile-template"; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - UserProfileUrlProvider.setSpringContext(applicationContext); - } - - private static void setSpringContext(ApplicationContext context) { - applicationContext = context; - } - - public static boolean isConfigured() { - return Objects.nonNull(applicationContext.getEnvironment().getProperty(URL_ROOT_KEY)) - && Objects.nonNull(applicationContext.getEnvironment().getProperty(USER_PROFILES_TEMPLATE_KEY)); - } - - public static String getUrl(Object val) { - // TODO Abhängingkeit zu com.google.common ausbauen - Preconditions.checkNotNull(applicationContext, "ApplicationContext not initialized"); - - // TODO parameter lieber injezieren und validation verwenden - var rootUrl = applicationContext.getEnvironment().getProperty(URL_ROOT_KEY); - Preconditions.checkNotNull(rootUrl, ERROR_MESSAGE, URL_ROOT_KEY); - - var template = applicationContext.getEnvironment().getProperty(USER_PROFILES_TEMPLATE_KEY); - Preconditions.checkNotNull(template, ERROR_MESSAGE, USER_PROFILES_TEMPLATE_KEY); - - // TODO UriComponent Builder verwenden - var profilesUrl = rootUrl + template; - return String.format(profilesUrl, val); - } -} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java index 3b6facda1b..865d83fb59 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java @@ -25,8 +25,9 @@ package de.ozgcloud.alfa.vorgang; import java.util.Optional; +import jakarta.servlet.http.HttpServletResponse; + import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.RepresentationModel; import org.springframework.http.HttpStatus; @@ -44,10 +45,11 @@ import de.ozgcloud.alfa.common.clientattribute.ClientAttributeService; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.statistic.StatisticController; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; -import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; @RestController @RequestMapping(VorgangController.PATH) +@RequiredArgsConstructor public class VorgangController { static final String PATH = "/api/vorgangs"; // NOSONAR @@ -62,16 +64,12 @@ public class VorgangController { public static final String PARAM_NEXT_WIEDERVORLAGE_FRIST_EXISTS = "exists"; public static final String PARAM_NACHRICHTEN_UNGELESENE = "ungelesene"; - @Autowired - private VorgangService vorgangService; - @Autowired - private VorgangModelAssembler modelAssembler; + private final VorgangService vorgangService; + private final VorgangModelAssembler modelAssembler; - @Autowired - private ClientAttributeService clientAttributeService; + private final ClientAttributeService clientAttributeService; - @Autowired - private StatisticController statisticController; + private final StatisticController statisticController; @GetMapping(params = { PARAM_PAGE, PARAM_LIMIT }) public RepresentationModel<EntityModel<EnhancedVorgang>> getAll(@RequestParam int page, @RequestParam Integer limit) { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java index 6c0447d5e0..db2df608d4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/aktenzeichen/AktenzeichenModelProcessorTest.java @@ -36,7 +36,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.UriTemplate; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -45,8 +44,6 @@ import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; class AktenzeichenModelProcessorTest { - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @InjectMocks private AktenzeichenModelProcessor processor; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/UserProfileUrlProviderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/UserProfileUrlProviderTestFactory.java deleted file mode 100644 index 9498db2b67..0000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/UserProfileUrlProviderTestFactory.java +++ /dev/null @@ -1,45 +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.mockito.Mockito.*; - -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; - -public class UserProfileUrlProviderTestFactory { - public static final String ROOT_URL = "https://localhost"; - public static final String USER_PROFILES_API_PATH = "/api/userProfiles/"; - public static final String OZGCLOUD_USER_MANAGER_PROFILE_TEMPLATE = "ozgcloud.user-manager.profile-template"; - public static final String OZGCLOUD_USER_MANAGER_URL = "ozgcloud.user-manager.url"; - - public static void initUserProfileUrlProvider(UserProfileUrlProvider urlProvider) { - ApplicationContext context = mock(ApplicationContext.class); - Environment environment = mock(Environment.class); - when(environment.getProperty(OZGCLOUD_USER_MANAGER_URL)).thenReturn(ROOT_URL); - when(environment.getProperty(OZGCLOUD_USER_MANAGER_PROFILE_TEMPLATE)).thenReturn(USER_PROFILES_API_PATH + "%s"); - when(context.getEnvironment()).thenReturn(environment); - urlProvider.setApplicationContext(context); - } -} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java index 01567b0ff4..cdc84e3c2b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java @@ -27,9 +27,7 @@ import static de.ozgcloud.alfa.common.command.CommandModelAssembler.*; import static de.ozgcloud.alfa.common.command.CommandTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -38,13 +36,10 @@ import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource.Mode; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; class CommandModelAssemblerTest { @@ -54,13 +49,6 @@ class CommandModelAssemblerTest { @InjectMocks private CommandModelAssembler modelAssembler; - @BeforeEach - void init() { - var applicationContext = mock(ApplicationContext.class); - lenient().when(applicationContext.getEnvironment()).thenReturn(mock(Environment.class)); - new UserProfileUrlProvider().setApplicationContext(applicationContext); - } - @Test void shouldHaveSelfLink() { var model = modelAssembler.toModel(CommandTestFactory.create()); 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 4122969ffb..cd840fb170 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 @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.historie; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -121,6 +120,9 @@ class HistorieModelAssemblerTest { @Nested class TestCreatedByLink { + private static final String ROOT_URL = LoremIpsum.getInstance().getUrl(); + private static final String USER_PROFILES_API_PATH = "/api/user-profiles/"; + @Mock private UserManagerUrlProvider userManagerUrlProvider; 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 db7c591bad..61309f2595 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 @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.kommentar; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -41,8 +40,9 @@ import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.hateoas.server.EntityLinks; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.alfa.common.LinkedResourceTestUtils; -import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -53,8 +53,7 @@ class KommentarModelAssemblerTest { 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; + private static final String USER_MANAGER_URL = LoremIpsum.getInstance().getUrl(); @Spy @InjectMocks @@ -130,7 +129,7 @@ class KommentarModelAssemblerTest { @Test void shouldHaveCreatedByLink() { - when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(USER_MANAGER_URL + "%s"); var model = LinkedResourceTestUtils.processUserProfileResource(buildModel(), userManagerUrlProvider); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungControllerTest.java index a1d67f14c2..b1a466fa64 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungControllerTest.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.loeschanforderung; -import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -38,7 +37,6 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.errorhandling.ExceptionController; import de.ozgcloud.alfa.common.errorhandling.ProblemDetailMapper; import lombok.SneakyThrows; @@ -91,8 +89,6 @@ class LoeschAnforderungControllerTest { @Test void shouldReturn200() throws Exception { - initUserProfileUrlProvider(new UserProfileUrlProvider()); - var response = doRequest(); response.andExpect(status().isOk()); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java index 77a63407f2..609ea5ccf1 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java @@ -42,8 +42,6 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; import org.springframework.hateoas.EntityModel; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -52,7 +50,6 @@ import org.springframework.test.web.servlet.assertj.MockMvcTester.MockMvcRequest import org.springframework.test.web.servlet.assertj.MvcTestResultAssert; import org.springframework.web.util.UriComponentsBuilder; -import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.clientattribute.ClientAttributeService; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; @@ -814,18 +811,10 @@ class VorgangControllerTest { @Nested class TestVorgangWithEingang { - private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); - @BeforeEach void initTest() { when(vorgangService.findVorgangWithEingang(any())).thenReturn(VorgangWithEingangTestFactory.create()); when(modelAssembler.toModel(any())).then(i -> EntityModel.of(i.getArgument(0))); - - ApplicationContext context = mock(ApplicationContext.class); - Environment environment = mock(Environment.class); - when(environment.getProperty(anyString())).thenReturn("test/"); - when(context.getEnvironment()).thenReturn(environment); - urlProvider.setApplicationContext(context); } @Test -- GitLab From d1dc4f0f46aff0e0b55470017a7deafab107ed56 Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Mon, 24 Feb 2025 15:45:15 +0100 Subject: [PATCH 08/19] OZG-3936 OZG-7793 Fix unit tests --- .../LinkedUserProfileResourceSerializer.java | 18 ++++++++++++++---- ...inkedUserProfileResourceSerializerTest.java | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index 582ad419b2..c5d25a7dc0 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -37,19 +37,28 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import de.ozgcloud.alfa.common.user.UserManagerProperties; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; @Component -@RequiredArgsConstructor public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { private final UserManagerUrlProvider userManagerUrlProvider; private LinkedUserProfileResource annotation; - static LinkedUserProfileResourceSerializer createForAnnotatedField(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { + // for usage outside of Spring + private LinkedUserProfileResourceSerializer() { + this.userManagerUrlProvider = new UserManagerUrlProvider(new UserManagerProperties()); + } + + public LinkedUserProfileResourceSerializer(UserManagerUrlProvider userManagerUrlProvider) { + this.userManagerUrlProvider = userManagerUrlProvider; + } + + static LinkedUserProfileResourceSerializer createForAnnotatedField(UserManagerUrlProvider userManagerUrlProvider, + LinkedUserProfileResource annotation) { var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider); serializer.annotation = annotation; return serializer; @@ -57,7 +66,8 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { - return LinkedUserProfileResourceSerializer.createForAnnotatedField(userManagerUrlProvider, property.getAnnotation(LinkedUserProfileResource.class)); + return LinkedUserProfileResourceSerializer.createForAnnotatedField(userManagerUrlProvider, + property.getAnnotation(LinkedUserProfileResource.class)); } @Override diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java index 31f1031218..683ce44762 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java @@ -14,10 +14,12 @@ import org.mockito.Captor; import org.mockito.Mock; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import lombok.SneakyThrows; class LinkedUserProfileResourceSerializerTest { @@ -158,6 +160,20 @@ class LinkedUserProfileResourceSerializerTest { } } + @Nested + class OnCreatedImplicitlyByObjectMapper { + + @SneakyThrows + @Test + void shouldSerializeToString() { + var objectMapper = new ObjectMapper(); + + var serialized = objectMapper.writeValueAsString(new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID)); + + assertThat(serialized).isEqualTo("{\"id\":\"" + UserProfileTestFactory.ID.toString() + "\"}"); + } + } + @SneakyThrows private void serializeSingleValue() { serializer.serialize(USER_ID, generator, serializerProvider); -- GitLab From eac0f4df94b934ee606d57a59a45af2fca554fed Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Tue, 25 Feb 2025 09:05:29 +0100 Subject: [PATCH 09/19] OZG-3936 process linked resources in collection models --- .../LinkedResourceCollectionProcessor.java | 23 +++++ ...nkedResourceCollectionProcessorITCase.java | 46 ++++++++++ ...LinkedResourceCollectionProcessorTest.java | 44 ++++++++++ .../common/LinkedResourceProcessorITCase.java | 69 +-------------- .../common/LinkedResourceProcessorTest.java | 60 ------------- .../de/ozgcloud/alfa/common/TestEntity.java | 87 +++++++++++++++++++ 6 files changed, 204 insertions(+), 125 deletions(-) create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java new file mode 100644 index 0000000000..84b28c84e7 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java @@ -0,0 +1,23 @@ +package de.ozgcloud.alfa.common; + +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.server.RepresentationModelProcessor; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Component +@RequiredArgsConstructor +public class LinkedResourceCollectionProcessor<T> implements RepresentationModelProcessor<CollectionModel<EntityModel<T>>> { + + private final LinkedResourceProcessor<T> elementProcessor; + + @Override + public CollectionModel<EntityModel<T>> process(CollectionModel<EntityModel<T>> model) { + model.getContent().forEach(elementProcessor::process); + return model; + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java new file mode 100644 index 0000000000..da59cd2da2 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java @@ -0,0 +1,46 @@ +package de.ozgcloud.alfa.common; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import org.springframework.test.web.servlet.assertj.MvcTestResult; +import org.springframework.web.context.WebApplicationContext; + +import de.ozgcloud.common.test.ITCase; +import lombok.SneakyThrows; + +@ITCase +class LinkedResourceCollectionProcessorITCase { + + @Autowired + private WebApplicationContext context; + private MockMvcTester mockMvc; + + @BeforeEach + void setup() { + this.mockMvc = MockMvcTester.from(this.context); + } + + @Test + @SneakyThrows + void shouldHaveAddLinkByLinkedResource() { + var result = doRequest(); + + result.assertThat().bodyJson().extractingPath("$._embedded.testEntityList[0]._links.linkedResource.href") + .isEqualTo("http://localhost" + TestIdController.PATH + "/" + TestEntityTestFactory.LINKED_RESOURCE); + } + + @Test + @SneakyThrows + void shouldHaveUserProfileLink() { + var result = doRequest(); + + result.assertThat().bodyJson().extractingPath("$._embedded.testEntityList[0]._links.user.href") + .isEqualTo("https://localhost/api/userProfiles/" + TestEntityTestFactory.USER); + } + + private MvcTestResult doRequest() { + return mockMvc.get().uri(TestEntityController.PATH + TestEntityController.GET_ALL).exchange(); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java new file mode 100644 index 0000000000..0335276c6a --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java @@ -0,0 +1,44 @@ +package de.ozgcloud.alfa.common; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.List; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; + +class LinkedResourceCollectionProcessorTest { + + @InjectMocks + private LinkedResourceCollectionProcessor<TestEntity> processor; + @Mock + private LinkedResourceProcessor<TestEntity> elementProcessor; + + @Nested + class TestProcess { + + @Test + void shouldReturnSameCollectionModel() { + var collectionModel = CollectionModel.of(List.of(EntityModel.of(TestEntityTestFactory.create()))); + + var result = processor.process(collectionModel); + + assertThat(collectionModel).isSameAs(result); + } + + @Test + void shouldCallLinkedResourceprocessor() { + var entityModel = EntityModel.of(TestEntityTestFactory.create()); + var collectionModel = CollectionModel.of(List.of(entityModel)); + + processor.process(collectionModel); + + verify(elementProcessor).process(entityModel); + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java index 894a5c1243..e765af8f16 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java @@ -1,34 +1,25 @@ package de.ozgcloud.alfa.common; -import java.util.UUID; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.EntityModel; import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.test.web.servlet.assertj.MvcTestResult; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; import de.ozgcloud.common.test.ITCase; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; import lombok.SneakyThrows; @ITCase class LinkedResourceProcessorITCase { @Autowired - private WebApplicationContext wac; + private WebApplicationContext context; private MockMvcTester mockMvc; @BeforeEach void setup() { - this.mockMvc = MockMvcTester.from(this.wac); + this.mockMvc = MockMvcTester.from(this.context); } @Test @@ -36,8 +27,8 @@ class LinkedResourceProcessorITCase { void shouldHaveAddLinkByLinkedResource() { var result = doRequest(); - result.assertThat().bodyJson().extractingPath("$._links.id.href") - .isEqualTo("http://localhost" + TestIdController.PATH + "/" + TestEntityTestFactory.ID); + result.assertThat().bodyJson().extractingPath("$._links.linkedResource.href") + .isEqualTo("http://localhost" + TestIdController.PATH + "/" + TestEntityTestFactory.LINKED_RESOURCE); } @Test @@ -52,56 +43,4 @@ class LinkedResourceProcessorITCase { private MvcTestResult doRequest() { return mockMvc.get().uri(TestEntityController.PATH).exchange(); } - - @Builder - @Getter - @EqualsAndHashCode - static class TestEntity { - - @LinkedResource(controllerClass = TestIdController.class) - private String id; - - private String foo; - - @LinkedUserProfileResource - private String user; - } - - @RequestMapping(TestEntityController.PATH) - @RestController - static class TestEntityController { - - static final String PATH = "/api/entity"; - - @GetMapping - public EntityModel<TestEntity> getTestEntity() { - return EntityModel.of(TestEntityTestFactory.create()); - } - } - - @RequestMapping(TestIdController.PATH) - static class TestIdController { - - static final String PATH = "/api/test"; - - static final String USER_REL = "user"; - static final String ID_REL = "id"; - - } - - static class TestEntityTestFactory { - - static final String USER = UUID.randomUUID().toString(); - static final String ID = UUID.randomUUID().toString(); - - public static TestEntity create() { - return createBuilder().build(); - } - - public static TestEntity.TestEntityBuilder createBuilder() { - return TestEntity.builder() - .id(ID) - .user(USER); - } - } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java index 8262128113..c97c4f96fe 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -6,9 +6,7 @@ import static org.mockito.Mockito.*; import java.lang.reflect.Field; import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.UUID; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; @@ -21,14 +19,10 @@ import org.mockito.Mock; import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import org.springframework.web.bind.annotation.RequestMapping; import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; import lombok.SneakyThrows; class LinkedResourceProcessorTest { @@ -371,58 +365,4 @@ class LinkedResourceProcessorTest { return TestEntity.class.getDeclaredField(fieldName); } } - - @Builder - @Getter - @EqualsAndHashCode - static class TestEntity { - - @LinkedResource(controllerClass = TestIdController.class) - private String linkedResource; - @LinkedResource(controllerClass = TestIdController.class) - private String testId; - - private String foo; - private Collection<String> collectionField; - private String[] arrayField; - - @LinkedUserProfileResource - private String user; - - @LinkedUserProfileResource - private String differentUserId; - } - - @RequestMapping(TestIdController.PATH) - static class TestIdController { - - static final String PATH = "/api/test"; - - static final String USER_REL = "user"; - static final String DIFFERENT_USER_REL = "differentUser"; - static final String ID_REL = "test"; - static final String LINKED_RESOURCE_REL = "linkedResource"; - - } - - static class TestEntityTestFactory { - - static final String USER = UUID.randomUUID().toString(); - static final String DIFFERENT_USER_ID = UUID.randomUUID().toString(); - static final String ID = UUID.randomUUID().toString(); - static final String LINKED_RESOURCE = UUID.randomUUID().toString(); - - public static TestEntity create() { - return createBuilder().build(); - } - - public static TestEntity.TestEntityBuilder createBuilder() { - return TestEntity.builder() - .testId(ID) - .linkedResource(LINKED_RESOURCE) - .user(USER) - .differentUserId(DIFFERENT_USER_ID) - .foo("bar"); - } - } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java new file mode 100644 index 0000000000..8416ecbcde --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java @@ -0,0 +1,87 @@ +package de.ozgcloud.alfa.common; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Builder +@Getter +@EqualsAndHashCode +class TestEntity { + + @LinkedResource(controllerClass = TestIdController.class) + private String linkedResource; + @LinkedResource(controllerClass = TestIdController.class) + private String testId; + + private String foo; + private Collection<String> collectionField; + private String[] arrayField; + + @LinkedUserProfileResource + private String user; + + @LinkedUserProfileResource + private String differentUserId; +} + +@RequestMapping(TestEntityController.PATH) +@RestController +class TestEntityController { + + static final String PATH = "/api/entity"; + static final String GET_ALL = "/all"; + + @GetMapping + public EntityModel<TestEntity> getTestEntity() { + return EntityModel.of(TestEntityTestFactory.create()); + } + + @GetMapping(GET_ALL) + public CollectionModel<EntityModel<TestEntity>> getAll() { + return CollectionModel.of(List.of(EntityModel.of(TestEntityTestFactory.create()))); + } +} + +@RequestMapping(TestIdController.PATH) +class TestIdController { + + static final String PATH = "/api/test"; + + static final String USER_REL = "user"; + static final String DIFFERENT_USER_REL = "differentUser"; + static final String ID_REL = "test"; + static final String LINKED_RESOURCE_REL = "linkedResource"; + +} + +class TestEntityTestFactory { + + static final String USER = UUID.randomUUID().toString(); + static final String DIFFERENT_USER_ID = UUID.randomUUID().toString(); + static final String ID = UUID.randomUUID().toString(); + static final String LINKED_RESOURCE = UUID.randomUUID().toString(); + + public static TestEntity create() { + return createBuilder().build(); + } + + public static TestEntity.TestEntityBuilder createBuilder() { + return TestEntity.builder() + .testId(ID) + .linkedResource(LINKED_RESOURCE) + .user(USER) + .differentUserId(DIFFERENT_USER_ID) + .foo("bar"); + } +} -- GitLab From d817a33d9fcd7cba0f21d6a7c594192be8f0f3d9 Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 25 Feb 2025 09:21:05 +0100 Subject: [PATCH 10/19] OZG-3936 OZG-7793 Autowire instead of constructor injection --- .../alfa/common/LinkedUserProfileResourceSerializer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index c5d25a7dc0..b067021ed7 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -28,6 +28,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Collection; import org.apache.commons.lang3.reflect.ConstructorUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -44,16 +45,18 @@ import de.ozgcloud.common.errorhandling.TechnicalException; @Component public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { + // need to autowire, because Spring calls the constructor without parameters + @Autowired private final UserManagerUrlProvider userManagerUrlProvider; private LinkedUserProfileResource annotation; // for usage outside of Spring private LinkedUserProfileResourceSerializer() { - this.userManagerUrlProvider = new UserManagerUrlProvider(new UserManagerProperties()); + this(new UserManagerUrlProvider(new UserManagerProperties())); } - public LinkedUserProfileResourceSerializer(UserManagerUrlProvider userManagerUrlProvider) { + private LinkedUserProfileResourceSerializer(UserManagerUrlProvider userManagerUrlProvider) { this.userManagerUrlProvider = userManagerUrlProvider; } -- GitLab From 47ab2175fae20819d3c3aa5e41b161d76cd1fc07 Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 25 Feb 2025 09:28:09 +0100 Subject: [PATCH 11/19] OZG-3936 OZG-7793 Use Autowired on constructor --- .../alfa/common/LinkedUserProfileResourceSerializer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index b067021ed7..285b74549e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -45,8 +45,6 @@ import de.ozgcloud.common.errorhandling.TechnicalException; @Component public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { - // need to autowire, because Spring calls the constructor without parameters - @Autowired private final UserManagerUrlProvider userManagerUrlProvider; private LinkedUserProfileResource annotation; @@ -56,7 +54,8 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> this(new UserManagerUrlProvider(new UserManagerProperties())); } - private LinkedUserProfileResourceSerializer(UserManagerUrlProvider userManagerUrlProvider) { + @Autowired + public LinkedUserProfileResourceSerializer(UserManagerUrlProvider userManagerUrlProvider) { this.userManagerUrlProvider = userManagerUrlProvider; } -- GitLab From 76b61cb02016b1302d71dfe8defcfbbeea3331f4 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Tue, 25 Feb 2025 11:03:01 +0100 Subject: [PATCH 12/19] OZG-3936 fix HalModel building --- .../postfach/PostfachMailModelAssembler.java | 4 +- .../alfa/vorgang/VorgangModelAssembler.java | 4 +- .../PostfachMailModelAssemblerTest.java | 21 ++++++- .../vorgang/VorgangModelAssemblerTest.java | 59 +++++++++++++++++++ 4 files changed, 84 insertions(+), 4 deletions(-) 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 d857ac77a0..d1f3b17742 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,6 +39,7 @@ import org.springframework.hateoas.mediatype.hal.HalModelBuilder; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -78,6 +79,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac private final UserManagerUrlProvider userManagerUrlProvider; private final VorgangController vorgangController; + private final LinkedResourceProcessor<PostfachMail> linkedResourceProcessor; public RepresentationModel<EntityModel<PostfachSettings>> toCollectionModel(Stream<PostfachMail> postfachMails, VorgangWithEingang vorgang, PostfachSettings postfachSettings) { @@ -95,7 +97,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac return HalModelBuilder .halModelOf(postfachSettings) .link(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withSelfRel()) - .embed(postfachMails.map(this::toModel)) + .embed(postfachMails.map(this::toModel).map(linkedResourceProcessor::process)) .build(); } 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 800829cb55..205bd81da8 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,6 +37,7 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; import org.springframework.web.util.UriComponentsBuilder; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; @@ -57,6 +58,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent private final CurrentUserService userService; private final VorgangService vorgangService; + private final LinkedResourceProcessor<Vorgang> linkedResourceProcessor; public RepresentationModel<EntityModel<EnhancedVorgang>> toCollectionModel(Stream<VorgangHeader> entities, VorgaengeHeaderResponse response, FindVorgaengeHeaderRequestCriteria requestCriteria, Statistic statistic) { @@ -71,7 +73,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent RepresentationModel<EntityModel<EnhancedVorgang>> initModel(Stream<VorgangHeader> entities, Statistic statistic) { return HalModelBuilder.halModelOf(EnhancedVorgang.builder().statistic(statistic).build()) .link(linkTo(VorgangController.class).withSelfRel()) - .embed(entities.map(this::toModel).toList()) + .embed(entities.map(this::toModel).map(linkedResourceProcessor::process)) .build(); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java index 5c8e287405..091797403a 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java @@ -48,6 +48,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -69,6 +70,8 @@ class PostfachMailModelAssemblerTest { private UserManagerUrlProvider userManagerUrlProvider; @Mock private VorgangController vorgangController; + @Mock + private LinkedResourceProcessor<PostfachMail> linkedResourceProcessor; @Nested class TestToModel { @@ -352,6 +355,14 @@ class PostfachMailModelAssemblerTest { private final Stream<PostfachMail> mails = Stream.of(postfachMail); private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private final PostfachSettings postfachSettings = PostfachSettingsTestFactory.create(); + private final EntityModel<PostfachMail> entityModel = EntityModel.of(postfachMail); + private final EntityModel<PostfachMail> processedEntityModel = EntityModel.of(postfachMail, Link.of("dummy")); + + @BeforeEach + void mock() { + doReturn(entityModel).when(modelAssembler).toModel(any()); + when(linkedResourceProcessor.process(entityModel)).thenReturn(processedEntityModel); + } @Test void shouldHavePostfachAsContent() { @@ -376,15 +387,21 @@ class PostfachMailModelAssemblerTest { verify(modelAssembler).toModel(postfachMail); } + @Test + void shouldCallLinkedResourceProcessor() { + callModelAssembler(); + + verify(linkedResourceProcessor).process(entityModel); + } + @Test @SneakyThrows void shouldContainPostfachMails() { var objectMapper = new ObjectMapper().registerModules(new JavaTimeModule(), new Jdk8Module()); - doReturn(EntityModel.of(postfachMail)).when(modelAssembler).toModel(postfachMail); var model = callModelAssembler(); - assertThat(objectMapper.writeValueAsString(model)).contains(objectMapper.writeValueAsString(EntityModel.of(postfachMail))); + assertThat(objectMapper.writeValueAsString(model)).contains(objectMapper.writeValueAsString(processedEntityModel)); } private RepresentationModel<EntityModel<PostfachSettings>> callModelAssembler() { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java index 7b9dee67de..7daaae7e46 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java @@ -24,6 +24,7 @@ package de.ozgcloud.alfa.vorgang; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Collections; @@ -32,6 +33,7 @@ import java.util.Optional; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -42,10 +44,17 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserRole; +import de.ozgcloud.alfa.statistic.Statistic; import de.ozgcloud.alfa.statistic.StatisticTestFactory; +import lombok.SneakyThrows; class VorgangModelAssemblerTest { @@ -56,6 +65,8 @@ class VorgangModelAssemblerTest { private CurrentUserService userService; @Mock private VorgangService vorgangService; + @Mock + private LinkedResourceProcessor<Vorgang> linkedResourceProcessor; private static final int PAGE_SIZE = 100; @@ -172,6 +183,54 @@ class VorgangModelAssemblerTest { } } + @Nested + class TestInitModel { + + private static final Link DUMMY_LINK = Link.of("dummy"); + private final VorgangHeader vorgangHeader = VorgangHeaderTestFactory.create(); + private final Stream<VorgangHeader> entities = Stream.of(vorgangHeader); + private final Statistic statistic = StatisticTestFactory.create(); + private final EntityModel<Vorgang> entityModel = EntityModel.of(vorgangHeader); + private final EntityModel<Vorgang> processedEntityModel = EntityModel.of(vorgangHeader, DUMMY_LINK); + + @BeforeEach + void mock() { + doReturn(entityModel).when(modelAssembler).toModel(any()); + when(linkedResourceProcessor.process(any())).thenReturn(processedEntityModel); + } + + @Test + void shouldHaveSelfLink() { + var model = modelAssembler.initModel(entities, statistic); + + assertThat(model.getLink(IanaLinkRelations.SELF_VALUE)).get().extracting(Link::getHref).isEqualTo(VorgangController.PATH); + } + + @Test + void shouldCallToModel() { + modelAssembler.initModel(entities, statistic); + + verify(modelAssembler).toModel(vorgangHeader); + } + + @Test + void shouldCallLinkedResourceProcessor() { + modelAssembler.initModel(entities, statistic); + + verify(linkedResourceProcessor).process(entityModel); + } + + @Test + @SneakyThrows + void shouldContainProcessedEntity() { + var mapper = new ObjectMapper().registerModules(new JavaTimeModule(), new Jdk8Module()); + + var model = mapper.writeValueAsString(modelAssembler.initModel(entities, statistic)); + + assertThat(model).contains(mapper.writeValueAsString(processedEntityModel)); + } + } + @DisplayName("Build page link") @Nested class TestBuildPageLink { -- GitLab From a3bd71279639a5de50d96e858cb9ae66b4cf1dfc Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Tue, 25 Feb 2025 16:51:38 +0100 Subject: [PATCH 13/19] OZG-3936 add missing licence header --- .../LinkedResourceCollectionProcessor.java | 23 +++++++++++++++++++ .../alfa/common/LinkedResourceProcessor.java | 23 +++++++++++++++++++ .../LinkedUserProfileResourceSerializer.java | 12 +++------- ...nkedResourceCollectionProcessorITCase.java | 23 +++++++++++++++++++ ...LinkedResourceCollectionProcessorTest.java | 23 +++++++++++++++++++ .../common/LinkedResourceProcessorITCase.java | 23 +++++++++++++++++++ .../common/LinkedResourceProcessorTest.java | 23 +++++++++++++++++++ .../alfa/common/LinkedResourceTestUtils.java | 23 +++++++++++++++++++ ...edUserProfileResourceSerializerITCase.java | 5 ++-- ...nkedUserProfileResourceSerializerTest.java | 23 +++++++++++++++++++ .../de/ozgcloud/alfa/common/TestEntity.java | 23 +++++++++++++++++++ 11 files changed, 212 insertions(+), 12 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java index 84b28c84e7..8a3e623017 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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 org.springframework.hateoas.CollectionModel; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java index ff6dc3cd92..dbde196bf7 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index 285b74549e..1437cce143 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -41,12 +41,13 @@ import com.fasterxml.jackson.databind.ser.ContextualSerializer; import de.ozgcloud.alfa.common.user.UserManagerProperties; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.common.errorhandling.TechnicalException; +import lombok.RequiredArgsConstructor; @Component +@RequiredArgsConstructor(onConstructor_ = { @Autowired }) public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { private final UserManagerUrlProvider userManagerUrlProvider; - private LinkedUserProfileResource annotation; // for usage outside of Spring @@ -54,11 +55,6 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> this(new UserManagerUrlProvider(new UserManagerProperties())); } - @Autowired - public LinkedUserProfileResourceSerializer(UserManagerUrlProvider userManagerUrlProvider) { - this.userManagerUrlProvider = userManagerUrlProvider; - } - static LinkedUserProfileResourceSerializer createForAnnotatedField(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider); @@ -84,9 +80,7 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> } private String buildLink(Object id) { - return userManagerUrlProvider.isConfiguredForUserProfile() ? - Link.of(buildUserProfileUri(id.toString())).getHref() : - String.valueOf(id); + return userManagerUrlProvider.isConfiguredForUserProfile() ? Link.of(buildUserProfileUri(id.toString())).getHref() : String.valueOf(id); } private String buildUserProfileUri(String id) { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java index da59cd2da2..d3dfb408c2 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorITCase.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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 org.junit.jupiter.api.BeforeEach; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java index 0335276c6a..9759da29d1 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java index e765af8f16..0f6e259e27 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorITCase.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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 org.junit.jupiter.api.BeforeEach; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java index c97c4f96fe..4924829cbb 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.*; 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 index 819e2d402a..2091e594d1 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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 org.springframework.hateoas.EntityModel; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java index ca3058226b..9da33f6544 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java @@ -35,7 +35,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; -import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.common.test.ITCase; @ITCase @@ -59,10 +58,10 @@ class LinkedUserProfileResourceSerializerITCase { @Test void shouldSerialize() throws JsonProcessingException { - var testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); + var testObj = TestEntityTestFactory.create(); var serialized = objectMapper.writeValueAsString(testObj); - assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); + assertThat(serialized).contains("\"user\":\"" + HTTP_LOCALHOST + API_PATH + TestEntityTestFactory.USER + "\""); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java index 683ce44762..7c4ad67db9 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java index 8416ecbcde..0a643d5c98 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.util.Collection; -- GitLab From f2c8c2f8a293e0346f42926a3ba7968abc23d067 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Tue, 25 Feb 2025 16:58:13 +0100 Subject: [PATCH 14/19] OZG-3936 use UserId in TestEntity --- .../de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java | 3 ++- .../src/test/java/de/ozgcloud/alfa/common/TestEntity.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java index 4924829cbb..9fda7bde37 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -45,6 +45,7 @@ import org.springframework.hateoas.Link; import com.thedeanda.lorem.LoremIpsum; +import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import lombok.SneakyThrows; @@ -363,7 +364,7 @@ class LinkedResourceProcessorTest { @ParameterizedTest @NullAndEmptySource void shouldNotAddLinkIfFieldValueIsNullOrBlank(String userValue) { - var model = EntityModel.of(TestEntityTestFactory.createBuilder().user(userValue).build()); + var model = EntityModel.of(TestEntityTestFactory.createBuilder().user(UserId.from(userValue)).build()); var field = getField("user"); processor.addLinkForLinkedUserProfileResourceField(model, field); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java index 0a643d5c98..7e44ba5b2f 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/TestEntity.java @@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import de.ozgcloud.alfa.common.user.UserId; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -52,7 +53,7 @@ class TestEntity { private String[] arrayField; @LinkedUserProfileResource - private String user; + private UserId user; @LinkedUserProfileResource private String differentUserId; @@ -103,7 +104,7 @@ class TestEntityTestFactory { return TestEntity.builder() .testId(ID) .linkedResource(LINKED_RESOURCE) - .user(USER) + .user(UserId.from(USER)) .differentUserId(DIFFERENT_USER_ID) .foo("bar"); } -- GitLab From 4e3adf24aabd646b1d2d266b8bf35c0c5a40cb54 Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 25 Feb 2025 17:14:55 +0100 Subject: [PATCH 15/19] OZG-3936 OZG-7793 Small changes after CR --- .../LinkedUserProfileResourceSerializer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index 1437cce143..eeecf38a5a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -50,11 +50,17 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> private final UserManagerUrlProvider userManagerUrlProvider; private LinkedUserProfileResource annotation; - // for usage outside of Spring + // ObjectMapper uses this, if called outside of Spring, so dependency injection does not work private LinkedUserProfileResourceSerializer() { this(new UserManagerUrlProvider(new UserManagerProperties())); } + @Override + public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { + return LinkedUserProfileResourceSerializer.createForAnnotatedField(userManagerUrlProvider, + property.getAnnotation(LinkedUserProfileResource.class)); + } + static LinkedUserProfileResourceSerializer createForAnnotatedField(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider); @@ -62,12 +68,6 @@ public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> return serializer; } - @Override - public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { - return LinkedUserProfileResourceSerializer.createForAnnotatedField(userManagerUrlProvider, - property.getAnnotation(LinkedUserProfileResource.class)); - } - @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value instanceof Collection) { -- GitLab From 0b063d57d43540bda9c455c4cc0c48bd36550db3 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Wed, 26 Feb 2025 08:47:48 +0100 Subject: [PATCH 16/19] OZG-3936 apply code review comments --- .../alfa/common/LinkedResourceProcessor.java | 24 +++++---- .../alfa/RootViewLinkHandlerTest.java | 37 ------------- .../CollaborationVorgangProcessorTest.java | 2 +- ...LinkedResourceCollectionProcessorTest.java | 2 +- .../common/LinkedResourceProcessorTest.java | 52 +++++++++---------- ...edUserProfileResourceSerializerITCase.java | 5 +- 6 files changed, 44 insertions(+), 78 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java index dbde196bf7..a39073c1c3 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java @@ -51,13 +51,13 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< @Override public EntityModel<T> process(EntityModel<T> model) { - addLinkByLinkedResourceAnnotationIfMissing(model); - addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + addResourceLinksIfMissing(model); + addUserProfileLinksIfMissing(model); return model; } - void addLinkByLinkedResourceAnnotationIfMissing(EntityModel<T> model) { - getFields(LinkedResource.class, model.getContent()) + void addResourceLinksIfMissing(EntityModel<T> model) { + getAnnotatedFields(LinkedResource.class, model.getContent()) .filter(field -> shouldAddLink(model, field)) .forEach(field -> addLinkForLinkedResourceField(model, field)); } @@ -66,16 +66,16 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< getEntityFieldValue(model.getContent(), field).map(Object::toString).filter(StringUtils::isNotBlank) .ifPresent(val -> model .add(WebMvcLinkBuilder.linkTo(field.getAnnotation(LinkedResource.class).controllerClass()).slash(val) - .withRel(trimIdSuffix(field.getName())))); + .withRel(getResourceName(field)))); } - void addLinkByLinkedUserProfileResourceAnnotationIfMissing(EntityModel<T> resource) { - getFields(LinkedUserProfileResource.class, resource.getContent()) + void addUserProfileLinksIfMissing(EntityModel<T> resource) { + getAnnotatedFields(LinkedUserProfileResource.class, resource.getContent()) .filter(field -> shouldAddLink(resource, field)) .forEach(field -> addLinkForLinkedUserProfileResourceField(resource, field)); } - Stream<Field> getFields(Class<? extends Annotation> annotationClass, T content) { + Stream<Field> getAnnotatedFields(Class<? extends Annotation> annotationClass, T content) { if (Objects.isNull(content)) { return Stream.empty(); } @@ -84,7 +84,8 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< } boolean shouldAddLink(EntityModel<T> resource, Field field) { - return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) || resource.hasLink(trimIdSuffix(field.getName()))); + return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) + || resource.hasLink(getResourceName(field))); } void addLinkForLinkedUserProfileResourceField(EntityModel<T> model, Field field) { @@ -94,7 +95,7 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< private void addUserProfileLink(EntityModel<T> model, Field field, String value) { Optional.ofNullable(userManagerUrlProvider.getUserProfileTemplate()).filter(StringUtils::isNotBlank) - .ifPresent(template -> model.add(Link.of(template.formatted(value)).withRel(trimIdSuffix(field.getName())))); + .ifPresent(template -> model.add(Link.of(template.formatted(value)).withRel(getResourceName(field)))); } private Optional<Object> getEntityFieldValue(T content, Field field) { @@ -109,7 +110,8 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< return Optional.empty(); } - private String trimIdSuffix(String fieldName) { + private String getResourceName(Field field) { + var fieldName = field.getName(); if (fieldName.endsWith("Id")) { return fieldName.substring(0, fieldName.indexOf("Id")); } 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 fb0c2b9228..6f0e2b6558 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java @@ -706,41 +706,4 @@ class RootViewLinkHandlerTest { } } - - // @DisplayName("Test user assistance documentation link") - // @Nested - // class TestDocumentationLink { - // - // private static final String DOCUMENTATION_URL = "http://alfa-docs"; - // - // @Test - // void shouldNotHaveLinkForUndefinedUrl() { - // var link = viewLinkHandler.toModel(root); - // - // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)).isEmpty(); - // } - // - // @Test - // void shouldHaveLinkForDefinedUrl() { - // ReflectionTestUtils.setField(viewLinkHandler, "documentationUrl", - // DOCUMENTATION_URL); - // - // var link = viewLinkHandler.toModel(root); - // - // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)) - // .isPresent() - // .map(Link::getHref) - // .hasValue(DOCUMENTATION_URL); - // } - // - // @Test - // void shouldNotHaveLinkForEmptyStringUrl() { - // ReflectionTestUtils.setField(viewLinkHandler, "documentationUrl", ""); - // - // var link = viewLinkHandler.toModel(root); - // - // assertThat(link.getLink(RootViewLinkHandler.REL_DOCUMENTATIONS)).isEmpty(); - // } - // - // } } 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 271ce3f758..97079a883a 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 @@ -136,7 +136,7 @@ class CollaborationVorgangProcessorTest { } @Test - void shouldHaveFourLinks() { + void shouldHaveThreeLinks() { var model = callProcessor(); assertThat(model.getLinks()).hasSize(3); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java index 9759da29d1..d08e2a160e 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceCollectionProcessorTest.java @@ -55,7 +55,7 @@ class LinkedResourceCollectionProcessorTest { } @Test - void shouldCallLinkedResourceprocessor() { + void shouldCallLinkedResourceProcessor() { var entityModel = EntityModel.of(TestEntityTestFactory.create()); var collectionModel = CollectionModel.of(List.of(entityModel)); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java index 9fda7bde37..b0a5df5337 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -66,8 +66,8 @@ class LinkedResourceProcessorTest { @BeforeEach void mock() { - doNothing().when(processor).addLinkByLinkedResourceAnnotationIfMissing(any()); - doNothing().when(processor).addLinkByLinkedUserProfileResourceAnnotationIfMissing(any()); + doNothing().when(processor).addResourceLinksIfMissing(any()); + doNothing().when(processor).addUserProfileLinksIfMissing(any()); } @Test @@ -78,22 +78,22 @@ class LinkedResourceProcessorTest { } @Test - void shouldCallAddLinkByLinkedResourceAnnotationIfMissing() { + void shouldCallAddResourceLinksIfMissing() { processor.process(model); - verify(processor).addLinkByLinkedResourceAnnotationIfMissing(model); + verify(processor).addResourceLinksIfMissing(model); } @Test - void shouldCallAddLinkByLinkedUserProfileResourceAnnotationIfMissing() { + void shouldCallAddUserProfileLinksIfMissing() { processor.process(model); - verify(processor).addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + verify(processor).addUserProfileLinksIfMissing(model); } } @Nested - class TestAddLinkByLinkedResourceAnnotationIfMissing { + class TestAddResourceLinksIfMissing { private final TestEntity entity = TestEntityTestFactory.create(); private final EntityModel<TestEntity> model = EntityModel.of(entity); @@ -103,23 +103,23 @@ class LinkedResourceProcessorTest { @BeforeEach void mock() { - doReturn(Stream.of(field)).when(processor).getFields(any(), any()); + doReturn(Stream.of(field)).when(processor).getAnnotatedFields(any(), any()); } @Test - void shouldGetFieldsWithLinkedResourceAnnotation() { + void shouldGetAnnotatedFieldsWithLinkedResourceAnnotation() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedResourceAnnotationIfMissing(model); + processor.addResourceLinksIfMissing(model); - verify(processor).getFields(LinkedResource.class, entity); + verify(processor).getAnnotatedFields(LinkedResource.class, entity); } @Test void shouldCallShouldAddLink() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedResourceAnnotationIfMissing(model); + processor.addResourceLinksIfMissing(model); verify(processor).shouldAddLink(model, field); } @@ -128,7 +128,7 @@ class LinkedResourceProcessorTest { void shouldCallAddLinkForLinkedResourceField() { doReturn(true).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedResourceAnnotationIfMissing(model); + processor.addResourceLinksIfMissing(model); verify(processor).addLinkForLinkedResourceField(model, field); } @@ -137,14 +137,14 @@ class LinkedResourceProcessorTest { void shouldNotCallAddLinkForLinkedResourceField() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedResourceAnnotationIfMissing(model); + processor.addResourceLinksIfMissing(model); verify(processor, never()).addLinkForLinkedResourceField(any(), any()); } } @Nested - class TestAddLinkByLinkedUserProfileResourceAnnotationIfMissing { + class TestAddUserProfileLinksIfMissing { private final TestEntity entity = TestEntityTestFactory.create(); private final EntityModel<TestEntity> model = EntityModel.of(entity); @@ -154,23 +154,23 @@ class LinkedResourceProcessorTest { @BeforeEach void mock() { - doReturn(Stream.of(field)).when(processor).getFields(any(), any()); + doReturn(Stream.of(field)).when(processor).getAnnotatedFields(any(), any()); } @Test - void shouldGetFieldsWithLinkedUserProfileResourceAnnotation() { + void shouldGetAnnotatedFieldsWithLinkedUserProfileResourceAnnotation() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + processor.addUserProfileLinksIfMissing(model); - verify(processor).getFields(LinkedUserProfileResource.class, entity); + verify(processor).getAnnotatedFields(LinkedUserProfileResource.class, entity); } @Test void shouldCallShouldAddLink() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + processor.addUserProfileLinksIfMissing(model); verify(processor).shouldAddLink(model, field); } @@ -179,7 +179,7 @@ class LinkedResourceProcessorTest { void shouldCallAddLinkForLinkedUserProfileResourceField() { doReturn(true).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + processor.addUserProfileLinksIfMissing(model); verify(processor).addLinkForLinkedUserProfileResourceField(model, field); } @@ -188,18 +188,18 @@ class LinkedResourceProcessorTest { void shouldNotCallAddLinkForLinkedUserProfileResourceField() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addLinkByLinkedUserProfileResourceAnnotationIfMissing(model); + processor.addUserProfileLinksIfMissing(model); verify(processor, never()).addLinkForLinkedUserProfileResourceField(any(), any()); } } @Nested - class TestGetFields { + class TestGetAnnotatedFields { @Test void shouldReturnEmptyStreamIfContentIsNull() { - var result = processor.getFields(LinkedResource.class, null); + var result = processor.getAnnotatedFields(LinkedResource.class, null); assertThat(result).isEmpty(); } @@ -209,7 +209,7 @@ class LinkedResourceProcessorTest { var entity = TestEntityTestFactory.create(); var expectedFields = List.of(getField("linkedResource"), getField("testId")); - var result = processor.getFields(LinkedResource.class, entity); + var result = processor.getAnnotatedFields(LinkedResource.class, entity); assertThat(result).containsExactlyInAnyOrderElementsOf(expectedFields); } @@ -219,7 +219,7 @@ class LinkedResourceProcessorTest { var entity = TestEntityTestFactory.create(); var expectedFields = List.of(getField("user"), getField("differentUserId")); - var result = processor.getFields(LinkedUserProfileResource.class, entity); + var result = processor.getAnnotatedFields(LinkedUserProfileResource.class, entity); assertThat(result).containsExactlyInAnyOrderElementsOf(expectedFields); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java index 9da33f6544..ca3058226b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java @@ -35,6 +35,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.common.test.ITCase; @ITCase @@ -58,10 +59,10 @@ class LinkedUserProfileResourceSerializerITCase { @Test void shouldSerialize() throws JsonProcessingException { - var testObj = TestEntityTestFactory.create(); + var testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); var serialized = objectMapper.writeValueAsString(testObj); - assertThat(serialized).contains("\"user\":\"" + HTTP_LOCALHOST + API_PATH + TestEntityTestFactory.USER + "\""); + assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); } } -- GitLab From a32aa1f846fd373f1cdc43a07da89a076a35e673 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Wed, 26 Feb 2025 10:01:46 +0100 Subject: [PATCH 17/19] OZG-3936 move tests for linked resources to own test classes --- .../bescheid/BescheidLinkedResourceTest.java | 40 ++++++++++++ .../bescheid/BescheidModelAssemblerTest.java | 19 +----- .../bescheid/DocumentLinkedResourceTest.java | 41 ++++++++++++ .../bescheid/DocumentModelAssemblerTest.java | 13 +--- .../CollaborationLinkedResourceTest.java | 39 ++++++++++++ .../CollaborationModelAssemblerTest.java | 19 ------ .../alfa/common/LinkedResourceTestUtils.java | 39 ------------ .../command/CommandLinkedResourceTest.java | 62 +++++++++++++++++++ .../historie/HistorieModelAssemblerTest.java | 46 -------------- .../KommentarLinkedResourceTest.java | 40 ++++++++++++ .../KommentarModelAssemblerTest.java | 15 ----- 11 files changed, 224 insertions(+), 149 deletions(-) create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java delete mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java new file mode 100644 index 0000000000..eeb73065eb --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java @@ -0,0 +1,40 @@ +package de.ozgcloud.alfa.bescheid; + +import static org.assertj.core.api.Assertions.*; + +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.InjectMocks; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; + +class BescheidLinkedResourceTest { + + @InjectMocks + private LinkedResourceProcessor<Bescheid> processor; + + @Nested + class TestEntityModelProcessing { + private static final String REL_BESCHEID_DOCUMENT = "bescheidDocument"; + + @Test + void shouldHaveBescheidDocumentLink() { + var model = processor.process(EntityModel.of(BescheidTestFactory.create())); + + assertThat(model.getLink(REL_BESCHEID_DOCUMENT)).isPresent().get().extracting(Link::getHref) + .isEqualTo(String.format("%s/%s", DocumentController.PATH, BescheidTestFactory.BESCHEID_DOCUMENT)); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldNotHaveBescheidDocumentLinkIfNoDocumentAvailable(String documentId) { + var model = processor.process(EntityModel.of(BescheidTestFactory.createBuilder().bescheidDocument(documentId).build())); + + assertThat(model.getLink(REL_BESCHEID_DOCUMENT)).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 446bf2d7d5..bab353051a 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,6 @@ import org.springframework.hateoas.Link; import org.springframework.web.util.UriTemplate; import de.ozgcloud.alfa.bescheid.BescheidController.BescheidByVorgangController; -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; @@ -175,22 +174,6 @@ class BescheidModelAssemblerTest { .isEqualTo(createCommandLink()); } - @ParameterizedTest - @NullAndEmptySource - void shouldNotHaveBescheidDocumentLinkIfNoDocumentAvailable(String documentId) { - var model = callToModel(BescheidTestFactory.createBuilder().bescheidDocument(documentId).build()); - - assertThat(model.getLink(REL_BESCHEID_DOCUMENT)).isEmpty(); - } - - @Test - void shouldHaveBescheidDocumentLink() { - var model = callToModel(); - - assertThat(model.getLink(REL_BESCHEID_DOCUMENT)).isPresent().get().extracting(Link::getHref) - .isEqualTo(String.format("%s/%s", DocumentController.PATH, BescheidTestFactory.BESCHEID_DOCUMENT)); - } - @Test void shouldHaveBescheidenUndSendenLink() { when(postfachMailController.isPostfachConfigured()).thenReturn(true); @@ -259,7 +242,7 @@ class BescheidModelAssemblerTest { } private EntityModel<Bescheid> callToModel(Bescheid bescheid) { - return LinkedResourceTestUtils.processLinkedResource(assembler.toModel(bescheid)); + return assembler.toModel(bescheid); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java new file mode 100644 index 0000000000..6223ee6e22 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java @@ -0,0 +1,41 @@ +package de.ozgcloud.alfa.bescheid; + +import static org.assertj.core.api.Assertions.*; + +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.InjectMocks; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.binaryfile.FileId; + +class DocumentLinkedResourceTest { + + @InjectMocks + private LinkedResourceProcessor<Document> processor; + + @Nested + class TestEntityModelProcessing { + static final String REL_FILE = "file"; + + @Test + void shouldHaveFileIdLink() { + var model = processor.process(EntityModel.of(DocumentTestFactory.create())); + + assertThat(model.getLink(REL_FILE)).isPresent().get().extracting(Link::getHref) + .isEqualTo("/api/binaryFiles/" + DocumentTestFactory.FILE_ID); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldNotHaveFileIdLinkIfNoFileAvailable(String fileId) { + var model = processor.process(EntityModel.of(DocumentTestFactory.createBuilder().fileId(FileId.from(fileId)).build())); + + assertThat(model.getLink(REL_FILE)).isEmpty(); + } + } +} 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 29f78b4071..debf5521d2 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 @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.bescheid; -import static de.ozgcloud.alfa.bescheid.DocumentModelAssembler.*; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Nested; @@ -33,8 +32,6 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.LinkedResourceTestUtils; - class DocumentModelAssemblerTest { @Spy @@ -53,16 +50,8 @@ class DocumentModelAssemblerTest { .isEqualTo(DocumentController.PATH + "/" + DocumentTestFactory.ID); } - @Test - void shouldHaveFileIdLink() { - var model = callToModel(); - - assertThat(model.getLink(REL_FILE)).isPresent().get().extracting(Link::getHref) - .isEqualTo("/api/binaryFiles/" + DocumentTestFactory.FILE_ID); - } - private EntityModel<Document> callToModel() { - return LinkedResourceTestUtils.processLinkedResource(assembler.toModel(document)); + return assembler.toModel(document); } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java new file mode 100644 index 0000000000..7c7349d96a --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java @@ -0,0 +1,39 @@ +package de.ozgcloud.alfa.collaboration; + +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.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; + +class CollaborationLinkedResourceTest { + + @InjectMocks + private LinkedResourceProcessor<Collaboration> processor; + + @Nested + class TestEntityModelProcessing { + private static final String REL_ZUSTAENDIGE_STELLE = "zustaendigeStelle"; + + @Test + void shouldHaveLinkToOrganisationsEinheit() { + var entityModel = processor.process(EntityModel.of(OrganisationsEinheitCollaborationTestFactory.create())); + + assertThat(entityModel.getLink(REL_ZUSTAENDIGE_STELLE)).get().extracting(Link::getHref) + .isEqualTo(OrganisationsEinheitController.PATH + "/" + OrganisationsEinheitTestFactory.ID); + } + + @Test + void shouldHaveLinkToFachstelle() { + var entityModel = processor.process(EntityModel.of(FachstelleCollaborationTestFactory.create())); + + assertThat(entityModel.getLink(REL_ZUSTAENDIGE_STELLE)).get().extracting(Link::getHref) + .isEqualTo(FachstelleController.PATH + "/" + FachstelleTestFactory.ID); + } + + } +} 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 7878bfea35..3818b59854 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,6 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.UriTemplate; import de.ozgcloud.alfa.collaboration.CollaborationController.CollaborationByVorgangController; -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; @@ -60,8 +59,6 @@ class CollaborationModelAssemblerTest { @Nested class TestToModel { - private static final String REL_ZUSTAENDIGE_STELLE = "zustaendigeStelle"; - @Nested class OnOrganisationsEinheitCollaboration { @@ -74,14 +71,6 @@ class CollaborationModelAssemblerTest { assertThat(entityModel.getContent()).isEqualTo(collaboration); } - @Test - void shouldHaveLinkToOrganisationsEinheit() { - var entityModel = LinkedResourceTestUtils.processLinkedResource(callAssembler()); - - assertThat(entityModel.getLink(REL_ZUSTAENDIGE_STELLE)).get().extracting(Link::getHref) - .isEqualTo(OrganisationsEinheitController.PATH + "/" + OrganisationsEinheitTestFactory.ID); - } - private EntityModel<Collaboration> callAssembler() { return assembler.toModel(collaboration); } @@ -99,14 +88,6 @@ class CollaborationModelAssemblerTest { assertThat(entityModel.getContent()).isEqualTo(collaboration); } - @Test - void shouldHaveLinkToFachstelle() { - var entityModel = LinkedResourceTestUtils.processLinkedResource(callAssembler()); - - assertThat(entityModel.getLink(REL_ZUSTAENDIGE_STELLE)).get().extracting(Link::getHref) - .isEqualTo(FachstelleController.PATH + "/" + FachstelleTestFactory.ID); - } - private EntityModel<Collaboration> callAssembler() { return assembler.toModel(collaboration); } 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 deleted file mode 100644 index 2091e594d1..0000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceTestUtils.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2025 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 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/command/CommandLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java new file mode 100644 index 0000000000..f8274e4d9c --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java @@ -0,0 +1,62 @@ +package de.ozgcloud.alfa.common.command; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.user.UserId; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; + +class CommandLinkedResourceTest { + + @InjectMocks + private LinkedResourceProcessor<Command> processor; + @Mock + private UserManagerUrlProvider userManagerUrlProvider; + + @Nested + class TestEntityModelProcessing { + private static final String CREATED_BY = "createdBy"; + private static final String ROOT_URL = LoremIpsum.getInstance().getUrl(); + private static final String USER_PROFILES_API_PATH = "/api/user-profiles/"; + + @Test + void shouldHaveCreatedByLink() { + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); + + var model = processor.process(EntityModel.of(CommandTestFactory.create())); + + assertThat(model.getLink(CREATED_BY)).isPresent().get().extracting(Link::getHref) + .isEqualTo(ROOT_URL + USER_PROFILES_API_PATH + UserProfileTestFactory.ID); + } + + @Test + void shouldNotHaveCreatedByLinkForSystemUser() { + var systemUser = UserId.from("system-" + LoremIpsum.getInstance().getWords(1)); + var commandBySystemUser = CommandTestFactory.createBuilder() + .createdBy(systemUser) + .build(); + + var model = processor.process(EntityModel.of(commandBySystemUser)); + + assertThat(model.getLink(CREATED_BY)).isNotPresent(); + } + + @Test + void shouldNotHaveCreatedByLinkOnNullValue() { + var model = processor.process(EntityModel.of(CommandTestFactory.createBuilder().createdBy(null).build())); + + assertThat(model.getLink(CREATED_BY)).isNotPresent(); + } + } +} 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 cd840fb170..4274b00e92 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 @@ -36,18 +36,12 @@ import org.mockito.Mock; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import com.thedeanda.lorem.LoremIpsum; - -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; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; class HistorieModelAssemblerTest { - private static final String CREATED_BY = "createdBy"; - @InjectMocks private HistorieModelAssembler modelAssembler; @Mock @@ -116,44 +110,4 @@ class HistorieModelAssemblerTest { } } - @DisplayName("createdBy Link") - @Nested - class TestCreatedByLink { - - private static final String ROOT_URL = LoremIpsum.getInstance().getUrl(); - private static final String USER_PROFILES_API_PATH = "/api/user-profiles/"; - - @Mock - private UserManagerUrlProvider userManagerUrlProvider; - - @Test - void shouldExistingAtUser() { - when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(ROOT_URL + USER_PROFILES_API_PATH + "%s"); - - 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); - } - - @Test - void shouldNotExistForSystemUser() { - var systemUser = UserId.from("system-" + LoremIpsum.getInstance().getWords(1)); - var commandBySystemUser = CommandTestFactory.createBuilder() - .createdBy(systemUser) - .build(); - - var model = modelAssembler.toModel(commandBySystemUser); - - assertThat(model.getLink(CREATED_BY)).isNotPresent(); - } - - @Test - void shouldNotBePresentOnNullValue() { - var model = modelAssembler.toModel(CommandTestFactory.createBuilder().createdBy(null).build()); - - assertThat(model.getLink(CREATED_BY)).isNotPresent(); - } - } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java new file mode 100644 index 0000000000..9cf8101707 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java @@ -0,0 +1,40 @@ +package de.ozgcloud.alfa.kommentar; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; + +class KommentarLinkedResourceTest { + + @InjectMocks + private LinkedResourceProcessor<Kommentar> processor; + @Mock + private UserManagerUrlProvider userManagerUrlProvider; + + @Nested + class TestEntityModelProcessing { + private static final String REL_CREATED_BY = "createdBy"; + private static final String USER_MANAGER_URL = LoremIpsum.getInstance().getUrl(); + + @Test + void shouldHaveCreatedByLink() { + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(USER_MANAGER_URL + "%s"); + + var model = processor.process(EntityModel.of(KommentarTestFactory.create())); + + 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/kommentar/KommentarModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java index 61309f2595..7ddb61920d 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 @@ -40,9 +40,6 @@ import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.hateoas.server.EntityLinks; -import com.thedeanda.lorem.LoremIpsum; - -import de.ozgcloud.alfa.common.LinkedResourceTestUtils; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -52,8 +49,6 @@ import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; class KommentarModelAssemblerTest { private static final String PATH = KommentarController.KOMMENTAR_PATH + "/"; - private static final String REL_CREATED_BY = "createdBy"; - private static final String USER_MANAGER_URL = LoremIpsum.getInstance().getUrl(); @Spy @InjectMocks @@ -127,16 +122,6 @@ class KommentarModelAssemblerTest { assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isEmpty(); } - @Test - void shouldHaveCreatedByLink() { - when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(USER_MANAGER_URL + "%s"); - - var model = LinkedResourceTestUtils.processUserProfileResource(buildModel(), userManagerUrlProvider); - - assertThat(model.getLink(REL_CREATED_BY)).isPresent().get().extracting(Link::getHref) - .isEqualTo(USER_MANAGER_URL + KommentarTestFactory.CREATED_BY); - } - @Test void shouldHaveAttachmentsLink() { var kommentar = KommentarTestFactory.create(); -- GitLab From f382fbbb466d3c7a5e5632df089748cd41d9b86f Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Wed, 26 Feb 2025 10:06:35 +0100 Subject: [PATCH 18/19] OZG-3936 rename methods and variables --- .../alfa/common/LinkedResourceProcessor.java | 18 +++++------ .../common/LinkedResourceProcessorTest.java | 32 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java index a39073c1c3..67cb22c470 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedResourceProcessor.java @@ -51,12 +51,12 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< @Override public EntityModel<T> process(EntityModel<T> model) { - addResourceLinksIfMissing(model); - addUserProfileLinksIfMissing(model); + addResourceLinks(model); + addUserProfileLinks(model); return model; } - void addResourceLinksIfMissing(EntityModel<T> model) { + void addResourceLinks(EntityModel<T> model) { getAnnotatedFields(LinkedResource.class, model.getContent()) .filter(field -> shouldAddLink(model, field)) .forEach(field -> addLinkForLinkedResourceField(model, field)); @@ -69,10 +69,10 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< .withRel(getResourceName(field)))); } - void addUserProfileLinksIfMissing(EntityModel<T> resource) { - getAnnotatedFields(LinkedUserProfileResource.class, resource.getContent()) - .filter(field -> shouldAddLink(resource, field)) - .forEach(field -> addLinkForLinkedUserProfileResourceField(resource, field)); + void addUserProfileLinks(EntityModel<T> model) { + getAnnotatedFields(LinkedUserProfileResource.class, model.getContent()) + .filter(field -> shouldAddLink(model, field)) + .forEach(field -> addLinkForLinkedUserProfileResourceField(model, field)); } Stream<Field> getAnnotatedFields(Class<? extends Annotation> annotationClass, T content) { @@ -83,9 +83,9 @@ public class LinkedResourceProcessor<T> implements RepresentationModelProcessor< .filter(field -> field.isAnnotationPresent(annotationClass)); } - boolean shouldAddLink(EntityModel<T> resource, Field field) { + boolean shouldAddLink(EntityModel<T> model, Field field) { return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) - || resource.hasLink(getResourceName(field))); + || model.hasLink(getResourceName(field))); } void addLinkForLinkedUserProfileResourceField(EntityModel<T> model, Field field) { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java index b0a5df5337..b640df8181 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedResourceProcessorTest.java @@ -66,8 +66,8 @@ class LinkedResourceProcessorTest { @BeforeEach void mock() { - doNothing().when(processor).addResourceLinksIfMissing(any()); - doNothing().when(processor).addUserProfileLinksIfMissing(any()); + doNothing().when(processor).addResourceLinks(any()); + doNothing().when(processor).addUserProfileLinks(any()); } @Test @@ -78,22 +78,22 @@ class LinkedResourceProcessorTest { } @Test - void shouldCallAddResourceLinksIfMissing() { + void shouldCallAddResourceLinks() { processor.process(model); - verify(processor).addResourceLinksIfMissing(model); + verify(processor).addResourceLinks(model); } @Test - void shouldCallAddUserProfileLinksIfMissing() { + void shouldCallAddUserProfileLinks() { processor.process(model); - verify(processor).addUserProfileLinksIfMissing(model); + verify(processor).addUserProfileLinks(model); } } @Nested - class TestAddResourceLinksIfMissing { + class TestAddResourceLinks { private final TestEntity entity = TestEntityTestFactory.create(); private final EntityModel<TestEntity> model = EntityModel.of(entity); @@ -110,7 +110,7 @@ class LinkedResourceProcessorTest { void shouldGetAnnotatedFieldsWithLinkedResourceAnnotation() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addResourceLinksIfMissing(model); + processor.addResourceLinks(model); verify(processor).getAnnotatedFields(LinkedResource.class, entity); } @@ -119,7 +119,7 @@ class LinkedResourceProcessorTest { void shouldCallShouldAddLink() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addResourceLinksIfMissing(model); + processor.addResourceLinks(model); verify(processor).shouldAddLink(model, field); } @@ -128,7 +128,7 @@ class LinkedResourceProcessorTest { void shouldCallAddLinkForLinkedResourceField() { doReturn(true).when(processor).shouldAddLink(any(), any()); - processor.addResourceLinksIfMissing(model); + processor.addResourceLinks(model); verify(processor).addLinkForLinkedResourceField(model, field); } @@ -137,14 +137,14 @@ class LinkedResourceProcessorTest { void shouldNotCallAddLinkForLinkedResourceField() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addResourceLinksIfMissing(model); + processor.addResourceLinks(model); verify(processor, never()).addLinkForLinkedResourceField(any(), any()); } } @Nested - class TestAddUserProfileLinksIfMissing { + class TestAddUserProfileLinks { private final TestEntity entity = TestEntityTestFactory.create(); private final EntityModel<TestEntity> model = EntityModel.of(entity); @@ -161,7 +161,7 @@ class LinkedResourceProcessorTest { void shouldGetAnnotatedFieldsWithLinkedUserProfileResourceAnnotation() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addUserProfileLinksIfMissing(model); + processor.addUserProfileLinks(model); verify(processor).getAnnotatedFields(LinkedUserProfileResource.class, entity); } @@ -170,7 +170,7 @@ class LinkedResourceProcessorTest { void shouldCallShouldAddLink() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addUserProfileLinksIfMissing(model); + processor.addUserProfileLinks(model); verify(processor).shouldAddLink(model, field); } @@ -179,7 +179,7 @@ class LinkedResourceProcessorTest { void shouldCallAddLinkForLinkedUserProfileResourceField() { doReturn(true).when(processor).shouldAddLink(any(), any()); - processor.addUserProfileLinksIfMissing(model); + processor.addUserProfileLinks(model); verify(processor).addLinkForLinkedUserProfileResourceField(model, field); } @@ -188,7 +188,7 @@ class LinkedResourceProcessorTest { void shouldNotCallAddLinkForLinkedUserProfileResourceField() { doReturn(false).when(processor).shouldAddLink(any(), any()); - processor.addUserProfileLinksIfMissing(model); + processor.addUserProfileLinks(model); verify(processor, never()).addLinkForLinkedUserProfileResourceField(any(), any()); } -- GitLab From 7c426774d5a3e1da05927141edc13f07600c8536 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Wed, 26 Feb 2025 10:24:04 +0100 Subject: [PATCH 19/19] OZG-3936 add missing license header --- .../java/de/ozgcloud/alfa/RootProperties.java | 23 +++++++++++++++++++ .../VorgangAttachedItemHistorieProcessor.java | 23 +++++++++++++++++++ .../alfa/common/command/EmptyCommandBody.java | 23 +++++++++++++++++++ .../ozgcloud/alfa/export/DmsProperties.java | 23 +++++++++++++++++++ ...ForwardingVorgangWithEingangProcessor.java | 23 +++++++++++++++++++ .../kommentar/KommentarHistorieProcessor.java | 23 +++++++++++++++++++ .../LoeschAnforderungHistorieProcessor.java | 23 +++++++++++++++++++ .../PostfachNachrichtHistorieProcessor.java | 23 +++++++++++++++++++ .../WiedervorlageHistorieProcessor.java | 23 +++++++++++++++++++ .../bescheid/BescheidLinkedResourceTest.java | 23 +++++++++++++++++++ .../bescheid/DocumentLinkedResourceTest.java | 23 +++++++++++++++++++ .../CollaborationLinkedResourceTest.java | 23 +++++++++++++++++++ ...gangAttachedItemHistorieProcessorTest.java | 23 +++++++++++++++++++ .../command/CommandLinkedResourceTest.java | 23 +++++++++++++++++++ ...ardingVorgangWithEingangProcessorTest.java | 23 +++++++++++++++++++ .../KommentarHistorieProcessorTest.java | 23 +++++++++++++++++++ .../KommentarLinkedResourceTest.java | 23 +++++++++++++++++++ ...oeschAnforderungHistorieProcessorTest.java | 23 +++++++++++++++++++ ...ostfachNachrichtHistorieProcessorTest.java | 23 +++++++++++++++++++ .../alfa/vorgang/GrpcLockTestFactory.java | 23 +++++++++++++++++++ .../vorgang/GrpcVorgangHeadTestFactory.java | 23 +++++++++++++++++++ .../WiedervorlageHistorieProcessorTest.java | 23 +++++++++++++++++++ 22 files changed, 506 insertions(+) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootProperties.java index d339fc0032..ed16ff445e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootProperties.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessor.java index ecbd3482e0..821f844c30 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.attacheditem; import java.util.function.Predicate; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java index 3095c1084d..6249105613 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.command; class EmptyCommandBody implements CommandBody { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java index 9ec65379fa..1cbfa1c950 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.export; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java index 60a3c43ef0..714dc343d3 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.forwarding; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessor.java index 06eda92258..5f41da514d 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.kommentar; import java.util.Optional; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessor.java index 45ecd8907c..0554a87af8 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.loeschanforderung; import java.util.HashSet; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessor.java index 6af60c857e..0f090911a1 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.postfach; import java.util.Map; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessor.java index 352b53f047..2953cad663 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessor.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.wiedervorlage; import java.util.Map; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java index eeb73065eb..f4a7748f7c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidLinkedResourceTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.bescheid; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java index 6223ee6e22..16e41bbc0f 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/DocumentLinkedResourceTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.bescheid; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java index 7c7349d96a..694b60344b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationLinkedResourceTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.collaboration; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessorTest.java index f53d75a581..9d6fd0b4c4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/attacheditem/VorgangAttachedItemHistorieProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.attacheditem; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java index f8274e4d9c..3c58a4efce 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandLinkedResourceTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.command; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java index 15be150ccf..e1da1b36f7 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.forwarding; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessorTest.java index c67a8dfc3b..97c538ba2f 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarHistorieProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.kommentar; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java index 9cf8101707..06b1efabed 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarLinkedResourceTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.kommentar; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessorTest.java index 17ec36a7d5..d2ba1f87f6 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungHistorieProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.loeschanforderung; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessorTest.java index 300249da59..668aa45f6d 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtHistorieProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.postfach; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java index b8f28d9853..6aaa83ef92 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.vorgang; import de.ozgcloud.vorgang.vorgang.GrpcLock; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java index b11ce836e7..ad8e6e25cd 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.vorgang; import de.ozgcloud.vorgang.vorgang.GrpcVorgangHead; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessorTest.java index 78662dc0cd..d5c25ca60d 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageHistorieProcessorTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2025 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.wiedervorlage; import static org.assertj.core.api.Assertions.*; -- GitLab