blob: f98765962ca85c093e9d1270ef3ef3e17ca52fa7 [file] [log] [blame]
/*
* 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 org.apache.dubbo.common.config;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.context.ModuleExt;
import org.apache.dubbo.common.extension.DisableInject;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.config.AbstractConfig;
import org.apache.dubbo.rpc.model.ModuleModel;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
public class ModuleEnvironment extends Environment implements ModuleExt {
// delegate
private static final Logger logger = LoggerFactory.getLogger(ModuleEnvironment.class);
public static final String NAME = "moduleEnvironment";
private AtomicBoolean initialized = new AtomicBoolean(false);
private final ModuleModel moduleModel;
private Environment applicationDelegate;
private OrderedPropertiesConfiguration orderedPropertiesConfiguration;
private CompositeConfiguration dynamicGlobalConfiguration;
private DynamicConfiguration dynamicConfiguration;
public ModuleEnvironment(ModuleModel moduleModel) {
super(moduleModel);
this.moduleModel = moduleModel;
this.applicationDelegate = moduleModel.getApplicationModel().getModelEnvironment();
}
@Override
public void initialize() throws IllegalStateException {
if (initialized.compareAndSet(false, true)) {
this.orderedPropertiesConfiguration = new OrderedPropertiesConfiguration(moduleModel);
}
}
@Override
public Configuration getPrefixedConfiguration(AbstractConfig config, String prefix) {
CompositeConfiguration compositeConfiguration = new CompositeConfiguration();
compositeConfiguration.addConfiguration(applicationDelegate.getPrefixedConfiguration(config, prefix));
compositeConfiguration.addConfiguration(orderedPropertiesConfiguration);
return new PrefixedConfiguration(compositeConfiguration, prefix);
}
@Override
public CompositeConfiguration getConfiguration() {
if (globalConfiguration == null) {
CompositeConfiguration configuration = new CompositeConfiguration();
configuration.addConfiguration(applicationDelegate.getConfiguration());
configuration.addConfiguration(orderedPropertiesConfiguration);
globalConfiguration = configuration;
}
return globalConfiguration;
}
@Override
public List<Map<String, String>> getConfigurationMaps(AbstractConfig config, String prefix) {
List<Map<String, String>> maps = applicationDelegate.getConfigurationMaps(config, prefix);
maps.add(orderedPropertiesConfiguration.getProperties());
return maps;
}
@Override
public Configuration getDynamicGlobalConfiguration() {
if (dynamicConfiguration == null) {
return applicationDelegate.getDynamicGlobalConfiguration();
}
if (dynamicGlobalConfiguration == null) {
if (dynamicConfiguration == null) {
if (logger.isWarnEnabled()) {
logger.warn("dynamicConfiguration is null , return globalConfiguration.");
}
return getConfiguration();
}
dynamicGlobalConfiguration = new CompositeConfiguration();
dynamicGlobalConfiguration.addConfiguration(dynamicConfiguration);
dynamicGlobalConfiguration.addConfiguration(getConfiguration());
}
return dynamicGlobalConfiguration;
}
@Override
public Optional<DynamicConfiguration> getDynamicConfiguration() {
if (dynamicConfiguration == null) {
return applicationDelegate.getDynamicConfiguration();
}
return Optional.ofNullable(dynamicConfiguration);
}
@Override
@DisableInject
public void setDynamicConfiguration(DynamicConfiguration dynamicConfiguration) {
this.dynamicConfiguration = dynamicConfiguration;
}
@Override
public void destroy() throws IllegalStateException {
super.destroy();
this.orderedPropertiesConfiguration = null;
this.globalConfiguration = null;
this.dynamicGlobalConfiguration = null;
this.dynamicConfiguration = null;
}
@Override
@DisableInject
public void setLocalMigrationRule(String localMigrationRule) {
applicationDelegate.setLocalMigrationRule(localMigrationRule);
}
@Override
@DisableInject
public void setExternalConfigMap(Map<String, String> externalConfiguration) {
applicationDelegate.setExternalConfigMap(externalConfiguration);
}
@Override
@DisableInject
public void setAppExternalConfigMap(Map<String, String> appExternalConfiguration) {
applicationDelegate.setAppExternalConfigMap(appExternalConfiguration);
}
@Override
@DisableInject
public void setAppConfigMap(Map<String, String> appConfiguration) {
applicationDelegate.setAppConfigMap(appConfiguration);
}
@Override
public Map<String, String> getExternalConfigMap() {
return applicationDelegate.getExternalConfigMap();
}
@Override
public Map<String, String> getAppExternalConfigMap() {
return applicationDelegate.getAppExternalConfigMap();
}
@Override
public Map<String, String> getAppConfigMap() {
return applicationDelegate.getAppConfigMap();
}
@Override
public void updateExternalConfigMap(Map<String, String> externalMap) {
applicationDelegate.updateExternalConfigMap(externalMap);
}
@Override
public void updateAppExternalConfigMap(Map<String, String> externalMap) {
applicationDelegate.updateAppExternalConfigMap(externalMap);
}
@Override
public void updateAppConfigMap(Map<String, String> map) {
applicationDelegate.updateAppConfigMap(map);
}
@Override
public PropertiesConfiguration getPropertiesConfiguration() {
return applicationDelegate.getPropertiesConfiguration();
}
@Override
public SystemConfiguration getSystemConfiguration() {
return applicationDelegate.getSystemConfiguration();
}
@Override
public EnvironmentConfiguration getEnvironmentConfiguration() {
return applicationDelegate.getEnvironmentConfiguration();
}
@Override
public InmemoryConfiguration getExternalConfiguration() {
return applicationDelegate.getExternalConfiguration();
}
@Override
public InmemoryConfiguration getAppExternalConfiguration() {
return applicationDelegate.getAppExternalConfiguration();
}
@Override
public InmemoryConfiguration getAppConfiguration() {
return applicationDelegate.getAppConfiguration();
}
@Override
public String getLocalMigrationRule() {
return applicationDelegate.getLocalMigrationRule();
}
@Override
public void refreshClassLoaders() {
orderedPropertiesConfiguration.refresh();
applicationDelegate.refreshClassLoaders();
this.globalConfiguration = null;
this.globalConfigurationMaps = null;
this.dynamicGlobalConfiguration = null;
}
}