MpConfigDump.java

package io.extact.rms.platform.debug;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import org.eclipse.microprofile.config.Config;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.Initialized;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j;

/**
 * Dump out Config at startup.
 * Filter the output by setting configdump.filters as below.
 * <pre>
 * configdump:
 *   filter-enable: true
 *   filters:
 *     - filter: server
 *     - filter: security
 * </pre>
 */
@ApplicationScoped
@Slf4j(topic = "ConfigDump")
public class MpConfigDump {

    private Config config;

    @Inject
    public MpConfigDump(Config config) {
        this.config = config;
    }
    void onInialized(@Observes @Initialized(ApplicationScoped.class) Object event) {

        if (!log.isDebugEnabled()) {
            return;
        }

        List<String> filters = new ArrayList<>();
        if (config.getOptionalValue("configdump.filter-enable", Boolean.class).orElse(false)) {
            filters = StreamSupport.stream(config.getPropertyNames().spliterator(), false)
                    .filter(s -> s.startsWith("configdump.filters"))
                    .map(s -> config.getValue(s, String.class))
                    .toList();
        }

        Predicate<String> containsKeyword = new ContainsKeyworkWithForwardMatch(filters);
        String configDump = StreamSupport.stream(config.getPropertyNames().spliterator(), false)
            .filter(containsKeyword)
            .map(name -> name + "=" + config.getOptionalValue(name, String.class).orElse(""))
            .sorted()
            .collect(Collectors.joining(System.lineSeparator()));

        log.debug(System.lineSeparator() + configDump);
    }

    static class ContainsKeyworkWithForwardMatch implements Predicate<String> {

        private List<String> filters;
        ContainsKeyworkWithForwardMatch(List<String> filters) {
            this.filters = filters;
        }

        @Override
        public boolean test(String name) {
            return filters.isEmpty() || filters.stream().anyMatch(name::startsWith);
        }
    }
}