package at.gv.egiz.moazs.preprocess; import at.gv.zustellung.app2mzs.xsd.ConfigType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.AbstractEnvironment; import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.MutablePropertySources; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.StreamSupport; import static at.gv.zustellung.app2mzs.xsd.ConfigType.configTypeBuilder; import static at.gv.zustellung.app2mzs.xsd.ServerType.serverTypeBuilder; import static java.util.stream.Collectors.toMap; @Component public class ConfigProfileGenerator { @Autowired private Environment env; private final String profilePrefix = "delivery-request-configuration-profiles."; private final String tnvzRequestKey = "perform-query-person-request"; private final String msgUrlKey = "msg.url"; public Map generate() { MutablePropertySources propSrcs = ((AbstractEnvironment) env).getPropertySources(); Map> groupedKeys = StreamSupport.stream(propSrcs.spliterator(), false) .filter(ps -> ps instanceof EnumerablePropertySource) .map(ps -> ((EnumerablePropertySource) ps).getPropertyNames()) .flatMap(Arrays::stream) .filter(propName -> propName.startsWith(profilePrefix)) .map(name -> name.substring(name.indexOf(".") + 1)) .collect( Collectors.groupingBy( this::keepPrefix, Collectors.mapping( this::removePrefix, Collectors.toSet()))); return groupedKeys.entrySet().stream() .collect(toMap(Entry::getKey, this::createConfig)); } private String keepPrefix(String name) { return name.substring(0, name.indexOf(".")); } private String removePrefix(String name) { return name.substring(name.indexOf(".") + 1); } private ConfigType createConfig(Entry> entry) { var profile = entry.getKey(); var values = new HashMap(); entry.getValue().stream() .forEach(key -> { var assembledKey = profilePrefix + "." + profile + "." + key; var value = env.getProperty(assembledKey); values.put(key, value); }); var server = serverTypeBuilder() .withZUSEUrlID(values.get(msgUrlKey)) .build(); Boolean performQueryPersonRequest = values.get(tnvzRequestKey) == null ? null : Boolean.getBoolean(values.get(tnvzRequestKey)); return configTypeBuilder() .withPerformQueryPersonRequest(performQueryPersonRequest) .withServer(server) .build(); } }