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

kr.jm.metric.config.RunningConfigManager Maven / Gradle / Ivy

package kr.jm.metric.config;

import kr.jm.metric.config.input.InputConfigManager;
import kr.jm.metric.config.mutator.MutatorConfigManager;
import kr.jm.metric.config.output.OutputConfigManager;
import kr.jm.utils.exception.JMExceptionManager;
import kr.jm.utils.helper.JMOptional;
import kr.jm.utils.helper.JMResources;
import lombok.Getter;
import lombok.ToString;

import java.util.Arrays;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;

@Getter
@ToString
public class RunningConfigManager extends AbstractConfigManager {

    private BindingConfig bindingConfig;

    public RunningConfigManager(String runningConfigFilename,
            InputConfigManager inputConfigManager,
            MutatorConfigManager mutatorConfigManager,
            OutputConfigManager outputConfigManager) {
        Optional.ofNullable(transformRunningConfig(runningConfigFilename))
                .ifPresent(
                        runningConfig -> init(runningConfig, inputConfigManager,
                                mutatorConfigManager, outputConfigManager));
    }

    private void init(RunningConfig runningConfig,
            InputConfigManager inputConfigManager,
            MutatorConfigManager mutatorConfigManager,
            OutputConfigManager outputConfigManager) {
        this.bindingConfig = runningConfig.getBinding();
        addConfigList(inputConfigManager, runningConfig.getInputs(), "inputId");
        addConfigList(mutatorConfigManager, runningConfig.getMutators(),
                "mutatorId");
        addConfigList(outputConfigManager, runningConfig.getOutputs(),
                "outputId");
    }

    private  void addConfigList(
            AbstractListConfigManager listConfigManager,
            Map[] configMaps, String idKey) {
        JMOptional.getOptional(configMaps).stream().flatMap(Arrays::stream)
                .map(map -> buildCombinedConfig(listConfigManager,
                        map.get(idKey).toString(), map))
                .forEach(listConfigManager::insertConfig);
    }


    private RunningConfig transformRunningConfig(String jmMetricConfigUrl) {
        try {
            return ConfigObjectMapper.readValue(
                    JMResources.getStringAsOptWithFilePath(jmMetricConfigUrl)
                            .orElseThrow(NullPointerException::new),
                    RunningConfig.class);
        } catch (Exception e) {
            return JMExceptionManager.handleExceptionAndReturnNull(log, e,
                    "transformRunningConfig", jmMetricConfigUrl);
        }
    }

    private  C buildCombinedConfig(
            AbstractListConfigManager configManager, String configId,
            Map configMap) {
        try {
            return configManager.transform(JMOptional.getOptional(configId)
                    .map(configManager::getConfig)
                    .map(ConfigInterface::extractConfigMap)
                    .map(oldConfigMap -> buildCombinedConfigMap(oldConfigMap,
                            configMap)).orElse(configMap));
        } catch (Exception e) {
            throw JMExceptionManager.handleExceptionAndReturnRuntimeEx(log, e,
                    "buildCombinedConfig", configManager, configMap);
        }
    }

    private Map buildCombinedConfigMap(
            Map oldConfigMap,
            Map newConfigMap) {
        newConfigMap.entrySet().stream()
                .filter(entry -> Objects.nonNull(entry.getValue())).forEach(
                entry -> oldConfigMap.put(entry.getKey(),
                        buildCombinedValue(oldConfigMap.get(entry.getKey()),
                                entry.getValue())));
        return oldConfigMap;
    }

    private Object buildCombinedValue(Object oldValue, Object newValue) {
        return Objects.nonNull(oldValue) &&
                oldValue instanceof Map ? buildCombinedConfigMap(
                (Map) oldValue,
                (Map) newValue) : newValue;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy