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

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

There is a newer version: 0.2.7.3
Show newest version
package kr.jm.metric.config;

import kr.jm.utils.exception.JMExceptionManager;
import kr.jm.utils.helper.JMJson;
import kr.jm.utils.helper.JMLog;
import kr.jm.utils.helper.JMOptional;
import kr.jm.utils.helper.JMResources;

import java.util.*;
import java.util.stream.Stream;

public abstract class AbstractListConfigManager
        extends AbstractConfigManager {

    protected Map configMap;

    public AbstractListConfigManager() {
        this.configMap = new HashMap<>();
    }

    public AbstractListConfigManager(String configFilename) {
        this();
        loadConfig(configFilename);
    }

    public AbstractListConfigManager(List configList) {
        this();
        loadConfig(configList.stream());
    }

    public AbstractListConfigManager(C... configs) {
        this();
        loadConfig(Arrays.stream(configs));
    }

    public AbstractListConfigManager loadConfig(String configFilePath) {
        return loadConfig(
                buildConfigStream(buildConfigMapList(configFilePath)));
    }

    private AbstractListConfigManager loadConfig(Stream configStream) {
        configStream.forEach(this::insertConfig);
        return this;
    }

    public AbstractListConfigManager insertConfigList(List configList) {
        return loadConfig(configList.stream());
    }

    public AbstractListConfigManager insertConfigMapList(
            List> configMapList) {
        return loadConfig(buildConfigStream(configMapList));
    }

    private Stream buildConfigStream(
            List> configMapList) {
        return configMapList.stream().map(this::transform)
                .filter(Objects::nonNull);
    }

    public C transform(Map configMap) {
        try {
            return getConfigTypeStringAsOpt(configMap)
                    .map(this::extractConfigClass)
                    .map(configClass -> ConfigInterface
                            .transformConfig(configMap, configClass))
                    .orElseGet(() -> JMExceptionManager
                            .handleExceptionAndReturnNull(log,
                                    JMExceptionManager.newRunTimeException(
                                            "Config Error Occur !!!"),
                                    "transformToConfig", configMap));
        } catch (Exception e) {
            return JMExceptionManager
                    .handleExceptionAndReturnNull(log, e, "mutate",
                            this.configMap);
        }
    }

    public AbstractListConfigManager insertConfig(C inputConfig) {
        this.configMap.put(extractConfigId(inputConfig), inputConfig);
        JMLog.info(log, "insertOutputConfig", inputConfig);
        return this;
    }

    protected abstract Class extractConfigClass(String configTypeString);

    protected Optional getConfigTypeStringAsOpt(
            Map configMap) {
        return JMOptional.getOptional(configMap, getConfigTypeKey())
                .map(Object::toString);
    }

    protected abstract String getConfigTypeKey();

    protected abstract String extractConfigId(C inputConfig);

    private List> buildConfigMapList(
            String jmMetricConfigUrl) {
        try {
            return ConfigObjectMapper.readValue(JMOptional.getOptional(
                    JMResources.getStringWithFilePathOrClasspath(
                            jmMetricConfigUrl))
                            .orElseThrow(NullPointerException::new),
                    JMJson.MAP_LIST_TYPE_REFERENCE);
        } catch (Exception e) {
            return JMExceptionManager.handleExceptionAndReturn(log, e,
                    "buildConfigMapList", Collections::emptyList,
                    jmMetricConfigUrl);
        }
    }

    public Map getConfigMap() {
        return Collections.unmodifiableMap(this.configMap);
    }

    public C getConfig(String configId) {
        return this.configMap.get(configId);
    }

    public C removeConfig(String configId) {
        return this.configMap.remove(configId);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy