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/DeliveryRequestAugmenter.java | 52 ++++++++++++++++------ 1 file changed, 38 insertions(+), 14 deletions(-) (limited to 'src/main/java/at/gv/egiz/moazs/preprocess/DeliveryRequestAugmenter.java') diff --git a/src/main/java/at/gv/egiz/moazs/preprocess/DeliveryRequestAugmenter.java b/src/main/java/at/gv/egiz/moazs/preprocess/DeliveryRequestAugmenter.java index 7211f6d..0b49347 100644 --- a/src/main/java/at/gv/egiz/moazs/preprocess/DeliveryRequestAugmenter.java +++ b/src/main/java/at/gv/egiz/moazs/preprocess/DeliveryRequestAugmenter.java @@ -2,24 +2,33 @@ package at.gv.egiz.moazs.preprocess; import at.gv.zustellung.app2mzs.xsd.ConfigType; import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType; -import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType.DeliveryRequestTypeBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Map; -import static at.gv.egiz.moazs.util.NullCoalesce.coalesce; +import static at.gv.egiz.moazs.MoaZSException.moaZSException; +import static at.gv.zustellung.app2mzs.xsd.DeliveryRequestType.deliveryRequestTypeBuilder; @Component public class DeliveryRequestAugmenter { private final ConfigProfileMerger merger; private final Map configs; + private final ConfigProfileValidator validator; + + private static final String INCOMPLETE_CONFIG_ERROR_MESSAGE = "Could not find a profile for " + + "the delivery request configuration, and the configuration attached to mzs:DeliveryRequest is incomplete."; + private static final String INCOMPLETE_MERGED_CONFIG_ERROR_MESSAGE = "I merged parameters from " + + "mzs:DeliveryRequest/Config with parameters from config profile with ProfileId='%s', but the " + + "configuration is incomplete."; @Autowired - public DeliveryRequestAugmenter(Map deliveryRequestConfigs, ConfigProfileMerger merger) { + public DeliveryRequestAugmenter(Map deliveryRequestConfigs, ConfigProfileMerger merger, + ConfigProfileValidator validator) { this.configs = deliveryRequestConfigs; this.merger = merger; + this.validator = validator; } /** @@ -31,25 +40,40 @@ public class DeliveryRequestAugmenter { public DeliveryRequestType augment(DeliveryRequestType request) { var requestConfig = request.getConfig(); + var profileId = determineProfileIdFrom(requestConfig); + var fallbackConfig = configs.get(profileId); - var fallbackConfig = determineProfileFromProfileId(requestConfig); + if (fallbackConfig == null) { - var config = merger.merge(requestConfig, fallbackConfig); + if (validator.isComplete(requestConfig)) + return request; + else + throw moaZSException(INCOMPLETE_CONFIG_ERROR_MESSAGE); - return new DeliveryRequestTypeBuilder(request) - .withConfig(config) - .build(); - } + } else { - private ConfigType determineProfileFromProfileId(ConfigType requestConfig) { + var mergedConfig = merger.merge(requestConfig, fallbackConfig); - if (requestConfig == null || requestConfig.getProfileID() == null) { - return configs.get("default"); + if (validator.isComplete(mergedConfig)) { + return deliveryRequestTypeBuilder(request) + .withConfig(mergedConfig) + .build(); + } else { + throw moaZSException(INCOMPLETE_MERGED_CONFIG_ERROR_MESSAGE, profileId); + } } + } - var id = requestConfig.getProfileID(); + private String determineProfileIdFrom(ConfigType requestConfig) { + return (requestConfig == null + || requestConfig.getProfileID() == null + || isProfileMissing(requestConfig.getProfileID())) + ? "default" + : requestConfig.getProfileID(); + } - return coalesce(configs.get(id), configs.get("default")).get(); + private boolean isProfileMissing(String id) { + return !configs.containsKey(id); } } -- cgit v1.2.3