StackedModuleConfig.java

/**
 * Copyright (c) 2018, RTE (http://www.rte-france.com)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.commons.config;

import java.time.ZonedDateTime;

import java.nio.file.Path;
import java.util.*;
import java.util.function.Supplier;

/**
 *
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
public class StackedModuleConfig extends AbstractModuleConfig {

    private final ModuleConfig config1;

    private final ModuleConfig config2;

    public StackedModuleConfig(ModuleConfig config1, ModuleConfig config2) {
        this.config1 = Objects.requireNonNull(config1);
        this.config2 = Objects.requireNonNull(config2);
    }

    @Override
    public boolean hasProperty(String name) {
        return config1.hasProperty(name) || config2.hasProperty(name);
    }

    @Override
    public Set<String> getPropertyNames() {
        Set<String> names = new HashSet<>(config2.getPropertyNames());
        names.addAll(config1.getPropertyNames());
        return names;
    }

    private static <T> Optional<T> or(Optional<T> o1, Supplier<Optional<T>> o2) {
        return o1.isPresent() ? o1 : o2.get();
    }

    @Override
    public Optional<String> getOptionalStringProperty(String name) {
        return or(config1.getOptionalStringProperty(name), () -> config2.getOptionalStringProperty(name));
    }

    @Override
    public Optional<List<String>> getOptionalStringListProperty(String name) {
        return or(config1.getOptionalStringListProperty(name), () -> config2.getOptionalStringListProperty(name));
    }

    @Override
    public OptionalInt getOptionalIntProperty(String name) {
        OptionalInt o = config1.getOptionalIntProperty(name);
        return o.isPresent() ? o : config2.getOptionalIntProperty(name);
    }

    @Override
    public OptionalLong getOptionalLongProperty(String name) {
        OptionalLong o = config1.getOptionalLongProperty(name);
        return o.isPresent() ? o : config2.getOptionalLongProperty(name);
    }

    @Override
    public Optional<Float> getOptionalFloatProperty(String name) {
        return or(config1.getOptionalFloatProperty(name), () -> config2.getOptionalFloatProperty(name));
    }

    @Override
    public OptionalDouble getOptionalDoubleProperty(String name) {
        OptionalDouble o = config1.getOptionalDoubleProperty(name);
        return o.isPresent() ? o : config2.getOptionalDoubleProperty(name);
    }

    @Override
    public Optional<Boolean> getOptionalBooleanProperty(String name) {
        return or(config1.getOptionalBooleanProperty(name), () -> config2.getOptionalBooleanProperty(name));
    }

    @Override
    public Optional<Path> getOptionalPathProperty(String name) {
        return or(config1.getOptionalPathProperty(name), () -> config2.getOptionalPathProperty(name));
    }

    @Override
    public Optional<List<Path>> getOptionalPathListProperty(String name) {
        return or(config1.getOptionalPathListProperty(name), () -> config2.getOptionalPathListProperty(name));
    }

    @Override
    public Optional<ZonedDateTime> getOptionalDateTimeProperty(String name) {
        return or(config1.getOptionalDateTimeProperty(name), () -> config2.getOptionalDateTimeProperty(name));
    }
}