001// Generated by delombok at Sun Jul 30 17:21:56 UTC 2023
002package de.cuioss.test.jsf.util;
003
004import static java.util.Objects.requireNonNull;
005import java.util.ArrayList;
006import java.util.Collection;
007import java.util.List;
008import java.util.Set;
009import de.cuioss.test.jsf.config.ApplicationConfigurator;
010import de.cuioss.test.jsf.config.BeanConfigurator;
011import de.cuioss.test.jsf.config.ComponentConfigurator;
012import de.cuioss.test.jsf.config.JsfTestConfiguration;
013import de.cuioss.test.jsf.config.JsfTestContextConfigurator;
014import de.cuioss.test.jsf.config.RequestConfigurator;
015import de.cuioss.test.jsf.config.decorator.ApplicationConfigDecorator;
016import de.cuioss.test.jsf.config.decorator.BeanConfigDecorator;
017import de.cuioss.test.jsf.config.decorator.ComponentConfigDecorator;
018import de.cuioss.test.jsf.config.decorator.RequestConfigDecorator;
019import de.cuioss.test.valueobjects.objects.impl.DefaultInstantiator;
020import de.cuioss.tools.collect.CollectionBuilder;
021import de.cuioss.tools.reflect.MoreReflection;
022// owolff: lombok generated
023/**
024 * Helper class providing some utility methods for handling configuration.
025 *
026 * @author Oliver Wolff
027 */
028@SuppressWarnings("squid:S1118")
029public final class ConfigurationHelper {
030    /**
031     * Checks the given type for the annotation {@link JsfTestConfiguration} and and
032     * puts all found in the immutable {@link Set} to be returned
033     *
034     * @param annotated the class that may or may not provide the annotations, must
035     *                  not be null
036     * @return immutable {@link Set} of found {@link JsfTestConfiguration} elements.
037     */
038    public static Set<JsfTestConfiguration> extractJsfTestConfiguration(final Class<?> annotated) {
039        requireNonNull(annotated);
040        final var builder = new CollectionBuilder<JsfTestConfiguration>();
041        MoreReflection.extractAllAnnotations(annotated, JsfTestConfiguration.class).forEach(builder::add);
042        return builder.toImmutableSet();
043    }
044
045    /**
046     * Instantiates the given {@link ComponentConfigurator} and calls them with the
047     * given {@link ComponentConfigDecorator}. In case the given testClass instance
048     * also implements {@link ComponentConfigurator} the corresponding method will
049     * be called <em>after</em> the others
050     *
051     * @param testClass      the actual instance of test, must not be null
052     * @param registry       to be passed the the individual instances of
053     *                       {@link ComponentConfigurator}, must not be null
054     * @param configurations the previously extracted annotations, must not be null
055     *                       but may be empty.
056     */
057    public static void configureComponents(final Object testClass, final ComponentConfigDecorator registry, final Collection<JsfTestConfiguration> configurations) {
058        requireNonNull(testClass);
059        requireNonNull(registry);
060        requireNonNull(configurations);
061        final List<ComponentConfigurator> instances = getAssignableContextConfigurators(configurations, ComponentConfigurator.class);
062        if (testClass instanceof ComponentConfigurator) {
063            instances.add((ComponentConfigurator) testClass);
064        }
065        instances.forEach(instance -> instance.configureComponents(registry));
066    }
067
068    /**
069     * Instantiates the given {@link BeanConfigurator} and calls them with the given
070     * {@link BeanConfigDecorator}. In case the given testClass instance also
071     * implements {@link BeanConfigurator} the corresponding method will be called
072     * <em>after</em> the others
073     *
074     * @param testClass      the actual instance of test, must not be null
075     * @param registry       to be passed the the individual instances of
076     *                       {@link BeanConfigurator}, must not be null
077     * @param configurations the previously extracted annotations, must not be null
078     *                       but may be empty.
079     */
080    public static void configureManagedBeans(final Object testClass, final BeanConfigDecorator registry, final Collection<JsfTestConfiguration> configurations) {
081        requireNonNull(testClass);
082        requireNonNull(registry);
083        requireNonNull(configurations);
084        final List<BeanConfigurator> instances = getAssignableContextConfigurators(configurations, BeanConfigurator.class);
085        if (testClass instanceof BeanConfigurator) {
086            instances.add((BeanConfigurator) testClass);
087        }
088        instances.forEach(instance -> instance.configureBeans(registry));
089    }
090
091    /**
092     * Instantiates the given {@link ApplicationConfigurator} and calls them with
093     * the given {@link ApplicationConfigDecorator}. In case the given testClass
094     * instance also implements {@link ApplicationConfigurator} the corresponding
095     * method will be called <em>after</em> the others
096     *
097     * @param testClass      the actual instance of test, must not be null
098     * @param registry       to be passed the the individual instances of
099     *                       {@link ApplicationConfigurator}, must not be null
100     * @param configurations the previously extracted annotations, must not be null
101     *                       but may be empty.
102     */
103    public static void configureApplication(final Object testClass, final ApplicationConfigDecorator registry, final Collection<JsfTestConfiguration> configurations) {
104        requireNonNull(testClass);
105        requireNonNull(registry);
106        requireNonNull(configurations);
107        final List<ApplicationConfigurator> instances = getAssignableContextConfigurators(configurations, ApplicationConfigurator.class);
108        if (testClass instanceof ApplicationConfigurator) {
109            instances.add((ApplicationConfigurator) testClass);
110        }
111        instances.forEach(instance -> instance.configureApplication(registry));
112    }
113
114    /**
115     * Instantiates the given {@link RequestConfigurator} and calls them with the
116     * given {@link RequestConfigDecorator}. In case the given testClass instance
117     * also implements {@link RequestConfigurator} the corresponding method will be
118     * called <em>after</em> the others
119     *
120     * @param testClass      the actual instance of test, must not be null
121     * @param registry       to be passed the the individual instances of
122     *                       {@link RequestConfigurator}, must not be null
123     * @param configurations the previously extracted annotations, must not be null
124     *                       but may be empty.
125     */
126    public static void configureRequestConfig(final Object testClass, final RequestConfigDecorator registry, final Collection<JsfTestConfiguration> configurations) {
127        requireNonNull(testClass);
128        requireNonNull(registry);
129        requireNonNull(configurations);
130        final List<RequestConfigurator> instances = getAssignableContextConfigurators(configurations, RequestConfigurator.class);
131        if (testClass instanceof RequestConfigurator) {
132            instances.add((RequestConfigurator) testClass);
133        }
134        instances.forEach(instance -> instance.configureRequest(registry));
135    }
136
137    /**
138     * @param configurations all configurators
139     * @param configurator   class to check if assignable
140     * @param <T>            target type
141     * @return list of {@link JsfTestContextConfigurator} with target type
142     */
143    @SuppressWarnings("unchecked")
144    private static <T extends JsfTestContextConfigurator> List<T> getAssignableContextConfigurators(final Collection<JsfTestConfiguration> configurations, final Class<T> configurator) {
145        final List<T> instances = new ArrayList<>();
146        for (final JsfTestConfiguration config : configurations) {
147            for (final Class<? extends JsfTestContextConfigurator> type : config.value()) {
148                if (configurator.isAssignableFrom(type)) {
149                    instances.add((T) new DefaultInstantiator<>(type).newInstance());
150                }
151            }
152        }
153        return instances;
154    }
155
156    @java.lang.SuppressWarnings("all")
157    @lombok.Generated
158    private ConfigurationHelper() {
159    }
160}