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

org.xbib.helianthus.common.util.AbstractOptions Maven / Gradle / Ivy

package org.xbib.helianthus.common.util;

import static java.util.Objects.requireNonNull;

import java.util.Collection;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
 * A set of configuration options and their respective values.
 *
 * @see AbstractOption
 * @see AbstractOptionValue
 */
public abstract class AbstractOptions {

    protected Map, AbstractOptionValue, Object>> valueMap;

    @SuppressWarnings("varargs")
    @SafeVarargs
    protected > AbstractOptions(Function valueFilter, T... values) {
        requireNonNull(valueFilter, "valueFilter");
        requireNonNull(values, "values");
        valueMap = new IdentityHashMap<>();
        putAll(valueFilter, Stream.of(values));
    }

    protected > AbstractOptions(Function valueFilter,
                                                                    Iterable values) {
        requireNonNull(valueFilter, "valueFilter");
        requireNonNull(values, "values");
        valueMap = new IdentityHashMap<>();
        putAll(valueFilter, StreamSupport.stream(values.spliterator(), false));
    }

    @SuppressWarnings("varargs")
    @SafeVarargs
    protected > AbstractOptions(Function valueFilter,
                                                                    AbstractOptions baseOptions, T... values) {
        requireNonNull(baseOptions, "baseOptions");
        requireNonNull(valueFilter, "valueFilter");
        requireNonNull(values, "values");
        valueMap = new IdentityHashMap<>(baseOptions.valueMap);
        putAll(valueFilter, Stream.of(values));
    }

    protected > AbstractOptions(Function valueFilter,
                                                                    AbstractOptions baseOptions,
                                                                    Iterable values) {
        requireNonNull(baseOptions, "baseOptions");
        requireNonNull(valueFilter, "valueFilter");
        requireNonNull(values, "values");
        valueMap = new IdentityHashMap<>(baseOptions.valueMap);
        putAll(valueFilter, StreamSupport.stream(values.spliterator(), false));
    }

    protected > AbstractOptions(AbstractOptions baseOptions,
                                                                    AbstractOptions options) {
        requireNonNull(baseOptions, "baseOptions");
        requireNonNull(options, "options");
        valueMap = new IdentityHashMap<>(baseOptions.valueMap);
        valueMap.putAll(options.valueMap);
    }

    static String toString(Collection values) {
        return "OptionValues{" + values + '}';
    }

    @SuppressWarnings("unchecked")
    private > void putAll(Function valueFilter, Stream values) {
        values.map(valueFilter)
                .forEach(v -> valueMap.put((AbstractOption) v.option(),
                        (AbstractOptionValue, Object>) v));
    }

    @SuppressWarnings("unchecked")
    protected , V> Optional get0(AbstractOption option) {
        @SuppressWarnings("rawtypes")
        AbstractOptionValue optionValue =
                (AbstractOptionValue) (AbstractOptionValue) valueMap.get(option);
        return optionValue == null ? Optional.empty() : Optional.of(optionValue.value());
    }

    @SuppressWarnings("unchecked")
    protected , V> V getOrElse0(O option, V defaultValue) {
        return get0(option).orElse(defaultValue);
    }

    @SuppressWarnings("unchecked")
    protected  Map asMap0() {
        return Collections.unmodifiableMap((Map) valueMap);
    }

    @Override
    public String toString() {
        return toString(asMap0().values());
    }
}