From 44ec49b020565c14e708ff8c855a477009c90beb Mon Sep 17 00:00:00 2001 From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com> Date: Thu, 9 Jan 2025 10:40:05 +0100 Subject: [PATCH] OZG-6303 Replace XdomeaPropertiesValidator There can be only one configurationPropertiesValidator, so there could be conflicts if validation of xdomea-properties was done by XdomeaPropertiesValidator. It's not a problem, if XdomaProperties implements Validator itself (see ConfigurationPropertiesBindingPostProcessor). --- .../archive/export/ExportConfiguration.java | 6 -- .../archive/export/XdomeaProperties.java | 45 ++++++++++++- .../export/XdomeaPropertiesValidator.java | 67 ------------------- ...torTest.java => XdomeaPropertiesTest.java} | 10 +-- .../XdomeaPropertiesValidatorITCase.java | 40 ----------- 5 files changed, 45 insertions(+), 123 deletions(-) delete mode 100644 archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaPropertiesValidator.java rename archive-manager-server/src/test/java/de/ozgcloud/archive/export/{XdomeaPropertiesValidatorTest.java => XdomeaPropertiesTest.java} (95%) delete mode 100644 archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorITCase.java diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportConfiguration.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportConfiguration.java index 41a334b..9e14461 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportConfiguration.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportConfiguration.java @@ -29,7 +29,6 @@ import java.util.Map; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.oxm.jaxb.Jaxb2Marshaller; -import org.springframework.validation.Validator; import jakarta.xml.bind.Marshaller; import lombok.RequiredArgsConstructor; @@ -44,11 +43,6 @@ class ExportConfiguration { private final XdomeaNamespacePrefixMapper prefixMapper; - @Bean - static Validator configurationPropertiesValidator() { - return new XdomeaPropertiesValidator(); - } - @Bean Jaxb2Marshaller marshaller() { var marshaller = new Jaxb2Marshaller(); diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaProperties.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaProperties.java index 49832ad..3116a59 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaProperties.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaProperties.java @@ -23,10 +23,14 @@ */ package de.ozgcloud.archive.export; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import org.springframework.validation.annotation.Validated; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; +import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -35,15 +39,50 @@ import lombok.Setter; @Configuration @ConfigurationProperties("ozgcloud.xdomea") -@Validated @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor -public class XdomeaProperties { +public class XdomeaProperties implements Validator { + + private static final String PROP_BEHOERDENSCHLUESSEL_URI = "behoerdenschluesselUri"; + private static final String PROP_BEHOERDENSCHLUESSEL_VERSION = "behoerdenschluesselVersion"; private String behoerdenschluessel; private String behoerdenschluesselUri; private String behoerdenschluesselVersion; + + @Override + public boolean supports(Class<?> clazz) { + return XdomeaProperties.class.isAssignableFrom(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + var properties = (XdomeaProperties) target; + validateBehoerdenschluesselProperties(errors, properties); + } + + private void validateBehoerdenschluesselProperties(Errors errors, XdomeaProperties properties) { + if (StringUtils.isNotBlank(properties.getBehoerdenschluessel())) { + validateNotBlank(PROP_BEHOERDENSCHLUESSEL_URI, properties, errors); + validateNotBlank(PROP_BEHOERDENSCHLUESSEL_VERSION, properties, errors); + } + } + + private void validateNotBlank(String propertyName, XdomeaProperties properties, Errors errors) { + getPropertyValue(propertyName, properties); + if (StringUtils.isBlank(getPropertyValue(propertyName, properties))) { + errors.rejectValue(propertyName, String.format("ozgcloud.xdomea.%s.empty", propertyName), String.format("%s must be set", propertyName)); + } + } + + private static String getPropertyValue(String fieldName, XdomeaProperties properties) { + try { + return BeanUtils.getSimpleProperty(properties, fieldName); + } catch (Exception e) { + throw new TechnicalException("Property does not exist", e); + } + } } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaPropertiesValidator.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaPropertiesValidator.java deleted file mode 100644 index 4f4cda4..0000000 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/XdomeaPropertiesValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2024 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.archive.export; - -import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.validation.Errors; -import org.springframework.validation.Validator; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -public class XdomeaPropertiesValidator implements Validator { - - @Override - public boolean supports(Class<?> clazz) { - return XdomeaProperties.class.isAssignableFrom(clazz); - } - - @Override - public void validate(Object target, Errors errors) { - var properties = (XdomeaProperties) target; - validateBehoerdenschluesselProperties(errors, properties); - } - - private void validateBehoerdenschluesselProperties(Errors errors, XdomeaProperties properties) { - if (StringUtils.isNotBlank(properties.getBehoerdenschluessel())) { - validateNotBlank("behoerdenschluesselUri", properties, errors); - validateNotBlank("behoerdenschluesselVersion", properties, errors); - } - } - - private void validateNotBlank(String propertyName, XdomeaProperties properties, Errors errors) { - getPropertyValue(propertyName, properties); - if (StringUtils.isBlank(getPropertyValue(propertyName, properties))) { - errors.rejectValue(propertyName, String.format("ozgcloud.xdomea.%s.empty", propertyName), String.format("%s must be set", propertyName)); - } - } - - private static String getPropertyValue(String fieldName, XdomeaProperties properties) { - try { - return BeanUtils.getSimpleProperty(properties, fieldName); - } catch (Exception e) { - throw new TechnicalException("Property does not exist", e); - } - } -} diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesTest.java similarity index 95% rename from archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorTest.java rename to archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesTest.java index e5c9b72..c0e945e 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesTest.java @@ -29,20 +29,16 @@ 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.Spy; import org.springframework.validation.Errors; -class XdomeaPropertiesValidatorTest { - - @Spy - private XdomeaPropertiesValidator validator; +class XdomeaPropertiesTest { @Nested class TestSupports { @Test void shouldSupportXdomeaProperties() { - var supports = validator.supports(XdomeaProperties.class); + var supports = XdomeaPropertiesTestFactory.create().supports(XdomeaProperties.class); assertThat(supports).isTrue(); } @@ -155,7 +151,7 @@ class XdomeaPropertiesValidatorTest { } private Errors validate(XdomeaProperties properties) { - return validator.validateObject(properties); + return properties.validateObject(properties); } } } diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorITCase.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorITCase.java deleted file mode 100644 index 0ef292e..0000000 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/XdomeaPropertiesValidatorITCase.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2024 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.archive.export; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.springframework.context.ApplicationContext; - -import de.ozgcloud.common.test.ITCase; - -@ITCase -class XdomeaPropertiesValidatorITCase { - - @Test - void shouldExistInApplicationContext(ApplicationContext context) { - assertThat(context.getBean("configurationPropertiesValidator")).isNotNull().isInstanceOf(XdomeaPropertiesValidator.class); - } -} -- GitLab