package at.gv.egiz.moazs; import at.gv.zustellung.app2mzs.xsd.ConfigType; import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType; import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType.DeliveryRequestTypeBuilder; import at.gv.zustellung.app2mzs.xsd.ServerType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import static at.gv.egiz.moazs.util.NullCoalesce.coalesce; import static at.gv.zustellung.app2mzs.xsd.ConfigType.configTypeBuilder; import static at.gv.zustellung.app2mzs.xsd.ServerType.*; @Component public class DeliveryRequestAugmenter { private final ConfigType defaultMzsConfig; @Autowired public DeliveryRequestAugmenter(ConfigType defaultMzsConfig) { this.defaultMzsConfig = defaultMzsConfig; } /** * Augments an incoming {@code request} by filling gaps with config- or default parameters. * * @param request * @return augmented request */ public DeliveryRequestType augment(DeliveryRequestType request) { var config = merge(request.getConfig(), defaultMzsConfig); return new DeliveryRequestTypeBuilder(request) .withConfig(config) .build(); } private ConfigType merge(ConfigType primary, ConfigType fallback) { var builder = configTypeBuilder(fallback); if(primary != null) { if(primary.getServer() != null) { builder.withServer(merge(primary.getServer(), fallback.getServer())); } if(primary.isPerformQueryPersonRequest() != null) { builder.withPerformQueryPersonRequest(primary.isPerformQueryPersonRequest()); } } return builder.build(); } private ServerType merge(ServerType primary, ServerType fallback) { var builder = serverTypeBuilder(fallback); if (primary.getX509() != null) builder.withX509 (primary.getX509() ); if (primary.getZUSEUrlID() != null) builder.withZUSEUrlID(primary.getZUSEUrlID()); return builder.build(); } }