io.helidon.config.ConfigComplexImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of helidon-config Show documentation
Show all versions of helidon-config Show documentation
Configuration Core module.
/*
* Copyright (c) 2017, 2020 Oracle and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.helidon.config;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;
import io.helidon.config.spi.ConfigFilter;
import io.helidon.config.spi.ConfigNode;
/**
* Implementation of {@link Config} that represents complex (object, list) nodes.
*/
abstract class ConfigComplexImpl extends ConfigExistingImpl {
ConfigComplexImpl(Type type,
ConfigKeyImpl prefix,
ConfigKeyImpl key,
N node,
ConfigFilter filter,
ConfigFactory factory,
ConfigMapperManager mapperManager) {
super(type, prefix, key, node, filter, factory, mapperManager);
}
@Override
public ConfigValue> asList(Class type) throws ConfigMappingException {
return ConfigValues.createList(this,
config -> config.as(type),
config -> config.asList(type));
}
@Override
public ConfigValue> asList(Function mapper) throws ConfigMappingException {
return ConfigValues.createList(this,
config -> config.as(mapper),
config -> config.asList(mapper));
}
@Override
public final Stream traverse(Predicate predicate) {
return asNodeList()
.map(list -> list.stream()
.filter(predicate)
.map(node -> traverseSubNodes(node, predicate))
.reduce(Stream.empty(), Stream::concat))
.orElseThrow(MissingValueException.createSupplier(key()));
}
private Stream traverseSubNodes(Config config, Predicate predicate) {
if (config.type().isLeaf()) {
return Stream.of(config);
} else {
return config.asNodeList()
.map(list -> list.stream()
.filter(predicate)
.map(node -> traverseSubNodes(node, predicate))
.reduce(Stream.of(config), Stream::concat))
.orElseThrow(MissingValueException.createSupplier(key()));
}
}
}