/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 gobblin.broker; import com.google.common.base.Joiner; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import gobblin.broker.iface.ScopeType; import gobblin.broker.iface.ScopedConfigView; import gobblin.broker.iface.SharedResourceKey; import gobblin.util.ConfigUtils; import javax.annotation.Nullable; import lombok.Data; /** * An implementation of {@link ScopedConfigView} that knows how to extract relevant subconfiguration from an input * {@link Config}. */ @Data public class KeyedScopedConfigViewImpl<S extends ScopeType<S>, K extends SharedResourceKey> implements ScopedConfigView<S, K> { private static final Joiner JOINER = Joiner.on("."); @Nullable private final S scope; private final K key; private final String factoryName; private final Config fullConfig; public Config getFactorySpecificConfig() { return this.fullConfig; } public Config getScopedConfig() { if (this.scope == null) { return ConfigFactory.empty(); } return ConfigUtils.getConfigOrEmpty(this.fullConfig, this.scope.name()); } public Config getKeyedConfig() { if (this.key == null) { return ConfigFactory.empty(); } String key = this.key.toConfigurationKey(); if (key == null) { return ConfigFactory.empty(); } return ConfigUtils.getConfigOrEmpty(this.fullConfig, this.key.toConfigurationKey()); } public Config getKeyedScopedConfig() { if (this.scope == null || this.key.toConfigurationKey() == null) { return ConfigFactory.empty(); } return ConfigUtils.getConfigOrEmpty(this.fullConfig, chainConfigKeys(this.scope.name(), this.key.toConfigurationKey())); } @Override public Config getConfig() { return getKeyedScopedConfig().withFallback(getKeyedConfig()).withFallback(getScopedConfig()).withFallback(getFactorySpecificConfig()); } @Override public ScopedConfigView<S, K> getScopedView(S scopeType) { return new KeyedScopedConfigViewImpl<>(scopeType, this.key, this.factoryName, this.fullConfig); } private static String chainConfigKeys(String... keys) { return JOINER.join(keys); } }