From 6959228c5c557df0204a2902807b35d90063b600 Mon Sep 17 00:00:00 2001 From: Christof Rabensteiner Date: Wed, 15 May 2019 14:55:09 +0200 Subject: Handle Config Related Edge Cases in Augmenter & ProfileGenerator ConfigProfileGenerator: - Cancel startup if default Config profile is incomplete. - Add property flag 'verify-completeness-of-default-delivery-request-configuration', which allows admin to disable completeness check. In that case, just log a warning if the default profile is incomplete. Augmenter: - Ensure that after merging the config is complete (or throw an exception otherwise). - Refactor: Move ConfigProfileValidator from ConfigProfileGenerator to dedicated "ConfigProfileValidator" class; Reason: Augmenter needs to check completness of at-runtime-compiled configuration. - Refactor: Rewrote code for better readability. Others - NPE Fix in ConfigProfileMerger: If FallbackConfigProfile/Server is empty, use PrimaryProfile/Server. --- .../moazs/preprocess/ConfigProfileGenerator.java | 48 ++++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'src/main/java/at/gv/egiz/moazs/preprocess/ConfigProfileGenerator.java') diff --git a/src/main/java/at/gv/egiz/moazs/preprocess/ConfigProfileGenerator.java b/src/main/java/at/gv/egiz/moazs/preprocess/ConfigProfileGenerator.java index 21d97fc..1d79eb8 100644 --- a/src/main/java/at/gv/egiz/moazs/preprocess/ConfigProfileGenerator.java +++ b/src/main/java/at/gv/egiz/moazs/preprocess/ConfigProfileGenerator.java @@ -1,9 +1,10 @@ package at.gv.egiz.moazs.preprocess; +import at.gv.egiz.moazs.MoaZSException; import at.gv.zustellung.app2mzs.xsd.ConfigType; -import org.springframework.beans.factory.annotation.Autowired; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.env.*; -import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.HashMap; @@ -18,20 +19,37 @@ import static at.gv.zustellung.app2mzs.xsd.ServerType.serverTypeBuilder; import static java.util.stream.Collectors.*; import static java.util.stream.Collectors.toMap; -@Component public class ConfigProfileGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(ConfigProfileGenerator.class); private static final String PROFILE_PREFIX = "delivery-request-configuration-profiles."; private static final String TNVZ_REQUEST_KEY = "perform-query-person-request"; private static final String MSG_URL_KEY = "msg.url"; + private static final String DEFAULT_CONFIG_KEY = "default"; + + private final boolean verifyCompletenessOfDefaultConfiguration; + + private static final String PROFILE_NOT_COMPLETE_WARNING_MESSAGE = "The default values for a incoming " + + "mzs:DeliveryRequest/Config element could not be extracted from configuration because some values were " + + "missing."; + + private static final String PROFILE_NOT_COMPLETE_ERROR_MESSAGE = PROFILE_NOT_COMPLETE_WARNING_MESSAGE + " " + + "Please verify that all default values are present (e.g. through application.{properties,yaml} " + + "or System parameters). Otherwise, deactivate 'verify-completeness-of-default-delivery-request-configuration' " + + "to continue operation without completing the default config profile. This means that " + + "mzs:DeliveryRequest/Config needs to be configured completely *for each delivery request* in order to guarantee " + + "availability."; private final ConfigurableEnvironment env; private final ConfigProfileMerger merger; + private final ConfigProfileValidator validator; - @Autowired - public ConfigProfileGenerator(ConfigurableEnvironment env, ConfigProfileMerger merger) { + public ConfigProfileGenerator(ConfigurableEnvironment env, ConfigProfileMerger merger, + boolean verifyCompletenessOfDefaultConfiguration, ConfigProfileValidator validator) { this.env = env; this.merger = merger; + this.verifyCompletenessOfDefaultConfiguration = verifyCompletenessOfDefaultConfiguration; + this.validator = validator; } public Map generate() { @@ -39,14 +57,27 @@ public class ConfigProfileGenerator { var groupedKeys = getStreamOfPropertyKeysFromEnv() .filter(this::isConfigurationProfileProperty) .map(this::removePrefix) + .filter(this::hasPrefix) .collect(groupingBy(this::keepPrefix, mapping(this::removePrefix, toSet()))); var profiles = groupedKeys.entrySet().stream() .collect(toMap(Entry::getKey, this::createConfigFromEnv)); - var defaultProfile = profiles.get("default"); + var defaultProfile = profiles.get(DEFAULT_CONFIG_KEY); - return mergeProfiles(profiles, defaultProfile); + if (!validator.isComplete(defaultProfile)) { + if (verifyCompletenessOfDefaultConfiguration) + throw MoaZSException.moaZSException(PROFILE_NOT_COMPLETE_ERROR_MESSAGE); + else { + LOGGER.warn(PROFILE_NOT_COMPLETE_WARNING_MESSAGE); + } + } + + return defaultProfile == null ? profiles : mergeProfiles(profiles, defaultProfile); + } + + private boolean hasPrefix(String name) { + return name.indexOf('.') != -1; } // @author pedorro @@ -99,6 +130,8 @@ public class ConfigProfileGenerator { .build(); } + + private Map mergeProfiles(Map profiles, ConfigType defaultProfile) { return profiles.entrySet().stream() .collect(toUnmodifiableMap( @@ -106,5 +139,4 @@ public class ConfigProfileGenerator { e -> merger.merge(e.getValue(), defaultProfile))); } - } -- cgit v1.2.3