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

io.inugami.configuration.services.validators.ApplicationConfigValidator Maven / Gradle / Ivy

/* --------------------------------------------------------------------
 *  Inugami
 * --------------------------------------------------------------------
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see .
 */
package io.inugami.configuration.services.validators;

import io.inugami.api.exceptions.Asserts;
import io.inugami.api.exceptions.MessagesFormatter;
import io.inugami.api.processors.Config;
import io.inugami.configuration.exceptions.ConfigurationException;
import io.inugami.configuration.models.app.*;
import io.inugami.configuration.models.plugins.PropertyModel;

import java.util.ArrayList;
import java.util.List;

import static io.inugami.configuration.services.validators.ValidatorProcessor.*;

/**
 * ApplicationConfigValidator
 *
 * @author patrick_guillerm
 * @since 15 déc. 2017
 */
public class ApplicationConfigValidator implements Validator {

    // =========================================================================
    // ATTRIBUTES
    // =========================================================================
    private final ApplicationConfig appConfig;

    private final String path;

    private final ValidatorProcessor validator = new ValidatorProcessor();

    // =========================================================================
    // CONSTRUCTORS
    // =========================================================================
    public ApplicationConfigValidator(final ApplicationConfig appConfig, final String path) {
        this.appConfig = appConfig;
        this.path = path;
    }

    // =========================================================================
    // METHODS
    // =========================================================================
    @Override
    public void validate() throws ConfigurationException {
        final List conditions = new ArrayList<>();
        Asserts.assertNotNull("Application configuration is mandatory!", appConfig);
        conditions.addAll(validateRootApplicationConfiguration(appConfig));
        conditions.addAll(validateProperties(appConfig));
        conditions.addAll(validateSecurityConfigs(appConfig));

        //@formatter:off
        validator.validate(path,
                           conditions,
                           (condition, path) -> MessagesFormatter.format(condition.getMessage() + " {0}", path));
        //@formatter:on
    }

    // =========================================================================
    // VALIDATORS
    // =========================================================================

    private List validateRootApplicationConfiguration(final ApplicationConfig config) {
        final List result = new ArrayList<>();
        //@formatter:off
        result.add(condition("Application name mustn't be empty", ifPresentIsEmpty(config.getApplicationName())));
        //@formatter:on
        return result;
    }

    private List validateProperties(final ApplicationConfig conf) {
        return validate(conf.getProperties(), (data, result) -> {
            for (final PropertyModel item : data) {
                result.add(condition("Property key is mandatory", isEmpty(item.getKey())));
            }
        });
    }


    private List validateSecurityConfigs(final ApplicationConfig conf) {
        return validate(conf.getSecurity(), (data, result) -> {
            for (final SecurityConfiguration item : data) {
                result.addAll(validateSecurityItemConfig(item));
            }
        });
    }

    private List validateSecurityItemConfig(final SecurityConfiguration data) {
        final List result = new ArrayList<>();
        result.addAll(validateConfigTags(data.getConfigs()));
        result.add(condition("Security name is mandatory", isEmpty(data.getName())));

        if (!"technical".equals(data.getName())) {
            result.add(condition("Only technical provider can create users!", isNotNull(data.getUsers())));
        }

        result.addAll(validateSecurityRoles(data.getRoles()));
        result.addAll(validateSecurityUsers(data.getUsers()));

        return result;
    }

    private List validateSecurityRoles(final List roles) {
        return validate(roles, (data, result) -> {
            for (final RoleMappeurConfig item : data) {
                result.add(condition("Role name is mandatory", isEmpty(item.getName())));
                result.add(condition("Level must be higher than 0", item.getLevel() < 0));
                result.addAll(validateRoleMatchers(item.getMatchers()));
            }
        });
    }

    private List validateRoleMatchers(final List matchers) {
        return validate(matchers, (data, result) -> {
            for (final MatcherConfig item : data) {
                result.add(condition("Role matcher expression is mandatory", isEmpty(item.getExpr())));
            }
        });
    }

    private List validateSecurityUsers(final List users) {
        return validate(users, (data, result) -> {
            for (final UserConfig item : data) {
                result.addAll(validateSecurityUserItemConfig(item));
            }
        });
    }

    private List validateSecurityUserItemConfig(final UserConfig user) {
        return validate(user, (data, result) -> {
            result.add(condition("User login is mandatory", isEmpty(data.getLogin())));
            result.add(condition("User login is mandatory", isEmpty(data.getPassword())));
            if (data.getToken() != null) {
                result.add(condition("User token mustn't be empty", isEmpty(data.getToken())));
            }
            result.add(condition("User roles is mandatory!", isNull(data.getUserRoles())));
        });
    }

    private List validateConfigTags(final List configs) {
        return validate(configs, (data, result) -> {
            for (final Config config : data) {
                result.add(condition("config key is mandatory", config.getKey() == null));
            }
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy