2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.config.impl;
19 import static org.onap.config.Constants.LOAD_ORDER_KEY;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.LinkedHashMap;
28 import org.apache.commons.configuration2.CombinedConfiguration;
29 import org.apache.commons.configuration2.Configuration;
30 import org.apache.commons.configuration2.tree.MergeCombiner;
31 import org.apache.commons.configuration2.tree.OverrideCombiner;
32 import org.apache.commons.configuration2.tree.UnionCombiner;
33 import org.onap.config.ConfigurationUtils;
34 import org.onap.config.type.ConfigurationMode;
36 public final class AggregateConfiguration {
38 private final Map<String, Configuration> rootConfig = new HashMap<>();
39 private final Map<String, Configuration> unionConfig = new HashMap<>();
40 private final Map<String, Configuration> mergeConfig = new HashMap<>();
41 private final Map<String, Configuration> overrideConfig = new LinkedHashMap<>();
43 public void addConfig(File file) throws Exception {
44 addConfig(file.getAbsolutePath().toUpperCase(), ConfigurationUtils.getMergeStrategy(file),
45 ConfigurationUtils.getConfigurationBuilder(file, false).getConfiguration());
48 private void addConfig(String path, ConfigurationMode configMode, Configuration config) {
49 if (configMode != null) {
52 mergeConfig.put(path, config);
55 overrideConfig.put(path, config);
58 unionConfig.put(path, config);
63 rootConfig.put(path, config);
67 public void addConfig(URL url) throws Exception {
68 addConfig(url.getFile().toUpperCase(), ConfigurationUtils.getMergeStrategy(url),
69 ConfigurationUtils.getConfigurationBuilder(url).getConfiguration());
72 public void removeConfig(File file) {
73 String key = file.getAbsolutePath().toUpperCase();
74 if (rootConfig.containsKey(key)) {
75 rootConfig.remove(key);
76 } else if (mergeConfig.containsKey(key)) {
77 mergeConfig.remove(key);
78 } else if (unionConfig.containsKey(key)) {
79 unionConfig.remove(key);
80 } else if (overrideConfig.containsKey(key)) {
81 overrideConfig.remove(key);
85 public boolean containsConfig(File file) {
86 String key = file.getAbsolutePath().toUpperCase();
87 return rootConfig.containsKey(key) || mergeConfig.containsKey(key) || unionConfig.containsKey(key)
88 || overrideConfig.containsKey(key);
91 public Configuration getFinalConfiguration() {
92 CombinedConfiguration ccRoot = new CombinedConfiguration(new MergeCombiner());
93 ArrayList<Configuration> tempList = new ArrayList<>(rootConfig.values());
94 tempList.sort(this::sortForMerge);
95 for (Configuration conf : tempList) {
96 ccRoot.addConfiguration(conf);
98 CombinedConfiguration ccMergeRoot = new CombinedConfiguration(new MergeCombiner());
99 ccMergeRoot.addConfiguration(ccRoot);
100 tempList = new ArrayList<>(mergeConfig.values());
101 tempList.sort(this::sortForMerge);
102 for (Configuration conf : tempList) {
103 ccMergeRoot.addConfiguration(conf);
105 CombinedConfiguration ccUnionRoot = new CombinedConfiguration(new UnionCombiner());
106 ccUnionRoot.addConfiguration(ccMergeRoot);
107 for (Configuration conf : unionConfig.values()) {
108 ccUnionRoot.addConfiguration(conf);
110 ArrayList<Configuration> tempOverrideConfigs = new ArrayList<>(overrideConfig.values());
111 Collections.reverse(tempOverrideConfigs);
112 tempOverrideConfigs.sort(this::sortForOverride);
113 CombinedConfiguration ccOverrideRoot = new CombinedConfiguration(new OverrideCombiner());
114 for (Configuration conf : tempOverrideConfigs) {
115 ccOverrideRoot.addConfiguration(conf);
117 ccOverrideRoot.addConfiguration(ccUnionRoot);
118 return ccOverrideRoot;
121 private int sortForOverride(Configuration conf1, Configuration conf2) {
122 String order1 = conf1.getString(LOAD_ORDER_KEY);
123 String order2 = conf2.getString(LOAD_ORDER_KEY);
124 if (ConfigurationUtils.isBlank(order1) || !order1.trim().matches("\\d+")) {
127 if (ConfigurationUtils.isBlank(order2) || !order2.trim().matches("\\d+")) {
130 return Integer.parseInt(order2.trim()) - Integer.parseInt(order1.trim());
133 private int sortForMerge(Configuration conf1, Configuration conf2) {
134 String order1 = conf1.getString(LOAD_ORDER_KEY);
135 String order2 = conf2.getString(LOAD_ORDER_KEY);
136 if (ConfigurationUtils.isBlank(order1) || !order1.trim().matches("\\d+")) {
139 if (ConfigurationUtils.isBlank(order2) || !order2.trim().matches("\\d+")) {
142 return Integer.parseInt(order1.trim()) - Integer.parseInt(order2.trim());