AbstractModuleConfig.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 com.powsybl.commons.PowsyblException;
import com.powsybl.commons.exceptions.UncheckedClassNotFoundException;

import java.nio.file.Path;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Provides implementation for methods of {@link ModuleConfig}.
 * Implementations can focus on implementing the core getOptional* methods.
 *
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
public abstract class AbstractModuleConfig implements ModuleConfig {

    private static PowsyblException createPropertyNotSetException(String name) {
        return new PowsyblException("Property " + name + " is not set");
    }

    @Override
    public String getStringProperty(String name) {
        return getOptionalStringProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public String getStringProperty(String name, String defaultValue) {
        return getOptionalStringProperty(name).orElse(defaultValue);
    }

    @Override
    public List<String> getStringListProperty(String name) {
        return getOptionalStringListProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public List<String> getStringListProperty(String name, List<String> defaultValue) {
        return getOptionalStringListProperty(name).orElse(defaultValue);
    }

    @Override
    public <E extends Enum<E>> Optional<E> getOptionalEnumProperty(String name, Class<E> clazz) {
        return getOptionalStringProperty(name).map(s -> Enum.valueOf(clazz, s));
    }

    @Override
    public <E extends Enum<E>> E getEnumProperty(String name, Class<E> clazz) {
        return getOptionalEnumProperty(name, clazz).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public <E extends Enum<E>> E getEnumProperty(String name, Class<E> clazz, E defaultValue) {
        return getOptionalEnumProperty(name, clazz).orElse(defaultValue);
    }

    @Override
    public <E extends Enum<E>> Optional<Set<E>> getOptionalEnumSetProperty(String name, Class<E> clazz) {
        return getOptionalStringListProperty(name).flatMap(strings -> Optional.of(strings.stream()
                                                                              .map(s -> Enum.valueOf(clazz, s))
                                                                              .collect(Collectors.toSet())));
    }

    @Override
    public <E extends Enum<E>> Set<E> getEnumSetProperty(String name, Class<E> clazz) {
        return getOptionalEnumSetProperty(name, clazz).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public <E extends Enum<E>> Set<E> getEnumSetProperty(String name, Class<E> clazz, Set<E> defaultValue) {
        return getOptionalEnumSetProperty(name, clazz).orElse(defaultValue);
    }

    @Override
    public int getIntProperty(String name) {
        return getOptionalIntProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public int getIntProperty(String name, int defaultValue) {
        return getOptionalIntProperty(name).orElse(defaultValue);
    }

    @Override
    public long getLongProperty(String name) {
        return getOptionalLongProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public long getLongProperty(String name, long defaultValue) {
        return getOptionalLongProperty(name).orElse(defaultValue);
    }

    @Override
    public float getFloatProperty(String name) {
        return getOptionalFloatProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public float getFloatProperty(String name, float defaultValue) {
        return getOptionalFloatProperty(name).orElse(defaultValue);
    }

    @Override
    public double getDoubleProperty(String name) {
        return getOptionalDoubleProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public double getDoubleProperty(String name, double defaultValue) {
        return getOptionalDoubleProperty(name).orElse(defaultValue);
    }

    @Override
    public boolean getBooleanProperty(String name) {
        return getOptionalBooleanProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public boolean getBooleanProperty(String name, boolean defaultValue) {
        return getOptionalBooleanProperty(name).orElse(defaultValue);
    }

    @Override
    public Path getPathProperty(String name) {
        return getOptionalPathProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public Path getPathProperty(String name, Path defaultValue) {
        return getOptionalPathProperty(name).orElse(defaultValue);
    }

    @Override
    public List<Path> getPathListProperty(String name) {
        return getOptionalPathListProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public <T> Optional<Class<? extends T>> getOptionalClassProperty(String name, Class<T> subClass) {
        return getOptionalStringProperty(name).map(s -> {
            try {
                return Class.forName(s).asSubclass(subClass);
            } catch (ClassNotFoundException e) {
                throw new UncheckedClassNotFoundException(e);
            }
        });
    }

    @Override
    public <T> Class<? extends T> getClassProperty(String name, Class<T> subClass) {
        return getOptionalClassProperty(name, subClass).orElseThrow(() -> createPropertyNotSetException(name));
    }

    @Override
    public <T> Class<? extends T> getClassProperty(String name, Class<T> subClass, Class<? extends T> defaultValue) {
        return getOptionalClassProperty(name, subClass).orElse(defaultValue);
    }

    @Override
    public ZonedDateTime getDateTimeProperty(String name) {
        return getOptionalDateTimeProperty(name).orElseThrow(() -> createPropertyNotSetException(name));
    }
}