All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.keycloak.guides.maven.Options Maven / Gradle / Ivy

There is a newer version: 26.1.0
Show newest version
package org.keycloak.guides.maven;

import static org.aesh.readline.terminal.Key.r;
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR;
import static org.keycloak.quarkus.runtime.configuration.Configuration.toDashCase;
import static org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider.NS_KEYCLOAK_PREFIX;

import org.apache.commons.lang3.ArrayUtils;
import org.keycloak.config.ConfigSupportLevel;
import org.keycloak.config.DeprecatedMetadata;
import org.keycloak.config.OptionCategory;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.ProviderManager;
import org.keycloak.provider.Spi;
import org.keycloak.quarkus.runtime.Providers;
import org.keycloak.quarkus.runtime.configuration.Configuration;
import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMappers;
import org.keycloak.utils.StringUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class Options {

    private final Map> options;
    private final Map>> providerOptions = new LinkedHashMap<>();

    public Options() {
        this.options = new EnumMap<>(OptionCategory.class);
        PropertyMappers.getMappers().stream()
                .filter(m -> !m.isHidden())
                .filter(propertyMapper -> Objects.nonNull(propertyMapper.getDescription()))
                .map(m -> new Option(m.getFrom(),
                        m.getCategory(),
                        m.isBuildTime(),
                        null,
                        m.getDescription(),
                        m.getDefaultValue().map(Object::toString).orElse(null),
                        m.getExpectedValues(),
                        m.isStrictExpectedValues(),
                        m.getEnabledWhen().orElse(""),
                        m.getDeprecatedMetadata().orElse(null)))
                .forEach(o -> options.computeIfAbsent(o.category, k -> new TreeSet<>(Comparator.comparing(Option::getKey))).add(o));

        ProviderManager providerManager = Providers.getProviderManager(Thread.currentThread().getContextClassLoader());

        options.values()
                .stream()
                .flatMap(Collection::stream)
                .forEach(option -> option.description = option.description.replaceAll("'([^ ]*)'", "`$1`"));

        for (Spi loadSpi : providerManager.loadSpis().stream().sorted(Comparator.comparing(Spi::getName)).toList()) {
            for (ProviderFactory providerFactory : providerManager.load(loadSpi).stream().sorted(Comparator.comparing(ProviderFactory::getId)).toList()) {
                List configMetadata = providerFactory.getConfigMetadata();

                if (configMetadata == null) {
                    continue;
                }

                String optionPrefix = NS_KEYCLOAK_PREFIX + String.join(OPTION_PART_SEPARATOR, ArrayUtils.insert(0, new String[] {loadSpi.getName(), providerFactory.getId()}, "spi"));
                List

* f.e. when we specify {@code includedOptions="hostname"}, we should provide also {@code deniedCategories="hostname_v2"} * In that case, we will use the option from the old hostname provider * * @return denied categories, otherwise an empty set */ public Set getDeniedCategories(String deniedCategories) { return Optional.ofNullable(deniedCategories) .filter(StringUtil::isNotBlank) .map(f -> f.split(" ")) .map(Arrays::asList) .map(f -> f.stream() .map(g -> { try { return OptionCategory.valueOf(g.toUpperCase()); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("You have specified wrong category name in the 'deniedCategories' property", e); } }) .collect(Collectors.toSet())) .orElseGet(Collections::emptySet); } public List





© 2015 - 2025 Weber Informatics LLC | Privacy Policy