1 package org.onap.config.impl;
3 import org.apache.commons.configuration2.CombinedConfiguration;
4 import org.apache.commons.configuration2.Configuration;
5 import org.apache.commons.configuration2.tree.MergeCombiner;
6 import org.apache.commons.configuration2.tree.OverrideCombiner;
7 import org.apache.commons.configuration2.tree.UnionCombiner;
8 import static org.onap.config.Constants.LOAD_ORDER_KEY;
9 import org.onap.config.ConfigurationUtils;
10 import org.onap.config.type.ConfigurationMode;
14 import java.util.HashMap;
18 * The type Aggregate configuration.
20 public final class AggregateConfiguration {
22 private Map<String, Configuration> rootConfig = new HashMap<>();
23 private Map<String, Configuration> unionConfig = new HashMap<>();
24 private Map<String, Configuration> mergeConfig = new HashMap<>();
25 private Map<String, Configuration> overrideConfig = new LinkedHashMap<>();
28 * Instantiates a new Aggregate configuration.
30 public AggregateConfiguration() {
32 Class clazz = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());
33 if (!clazz.getCanonicalName()
34 .equals(ConfigurationImpl.class.getCanonicalName())) {
35 throw new RuntimeException("Illegal access.");
37 } catch (ClassNotFoundException cfe) {
38 throw new RuntimeException("Class not found while loading change notifier");
42 private void addConfig(String path, ConfigurationMode configMode, Configuration config) {
43 if (configMode != null) {
46 mergeConfig.put(path, config);
49 overrideConfig.put(path, config);
52 unionConfig.put(path, config);
57 rootConfig.put(path, config);
64 * @param file the file
65 * @throws Exception the exception
67 public void addConfig(File file) throws Exception {
68 addConfig(file.getAbsolutePath().toUpperCase(), ConfigurationUtils.getMergeStrategy(file),
69 ConfigurationUtils.getConfigurationBuilder(file, false).getConfiguration());
76 * @throws Exception the exception
78 public void addConfig(URL url) throws Exception {
79 addConfig(url.getFile().toUpperCase(), ConfigurationUtils.getMergeStrategy(url),
80 ConfigurationUtils.getConfigurationBuilder(url).getConfiguration());
86 * @param file the file
88 public void removeConfig(File file) {
89 String key = file.getAbsolutePath().toUpperCase();
90 if (rootConfig.containsKey(key)) {
91 rootConfig.remove(key);
92 } else if (mergeConfig.containsKey(key)) {
93 mergeConfig.remove(key);
94 } else if (unionConfig.containsKey(key)) {
95 unionConfig.remove(key);
96 } else if (overrideConfig.containsKey(key)) {
97 overrideConfig.remove(key);
102 * Contains config boolean.
104 * @param file the file
105 * @return the boolean
107 public boolean containsConfig(File file) {
108 String key = file.getAbsolutePath().toUpperCase();
109 return rootConfig.containsKey(key) || mergeConfig.containsKey(key)
110 || unionConfig.containsKey(key) || overrideConfig.containsKey(key);
114 * Gets final configuration.
116 * @return the final configuration
118 public Configuration getFinalConfiguration() {
119 CombinedConfiguration ccRoot = new CombinedConfiguration(new MergeCombiner());
120 ArrayList<Configuration> tempList = new ArrayList<>(rootConfig.values());
121 Collections.sort(tempList, this::sortForMerge);
122 for (Configuration conf : tempList) {
123 ccRoot.addConfiguration(conf);
125 CombinedConfiguration ccMergeRoot = new CombinedConfiguration(new MergeCombiner());
126 ccMergeRoot.addConfiguration(ccRoot);
127 tempList = new ArrayList<>(mergeConfig.values());
128 Collections.sort(tempList, this::sortForMerge);
129 for (Configuration conf : tempList) {
130 ccMergeRoot.addConfiguration(conf);
132 CombinedConfiguration ccUnionRoot = new CombinedConfiguration(new UnionCombiner());
133 ccUnionRoot.addConfiguration(ccMergeRoot);
134 for (Configuration conf : unionConfig.values()) {
135 ccUnionRoot.addConfiguration(conf);
137 ArrayList<Configuration> tempOverrideConfigs = new ArrayList<>(overrideConfig.values());
138 Collections.reverse(tempOverrideConfigs);
139 Collections.sort(tempOverrideConfigs, this::sortForOverride);
140 CombinedConfiguration ccOverrideRoot = new CombinedConfiguration(new OverrideCombiner());
141 for (Configuration conf : tempOverrideConfigs) {
142 ccOverrideRoot.addConfiguration(conf);
144 ccOverrideRoot.addConfiguration(ccUnionRoot);
145 return ccOverrideRoot;
148 private int sortForOverride(Configuration conf1, Configuration conf2){
149 String order1 = conf1.getString(LOAD_ORDER_KEY);
150 String order2 = conf2.getString(LOAD_ORDER_KEY);
151 if (ConfigurationUtils.isBlank(order1) || !order1.trim().matches("\\d+")){
154 if (ConfigurationUtils.isBlank(order2) || !order2.trim().matches("\\d+")){
157 return Integer.parseInt(order2.trim())-Integer.parseInt(order1.trim());
160 private int sortForMerge(Configuration conf1, Configuration conf2){
161 String order1 = conf1.getString(LOAD_ORDER_KEY);
162 String order2 = conf2.getString(LOAD_ORDER_KEY);
163 if (ConfigurationUtils.isBlank(order1) || !order1.trim().matches("\\d+")){
166 if (ConfigurationUtils.isBlank(order2) || !order2.trim().matches("\\d+")){
169 return Integer.parseInt(order1.trim())-Integer.parseInt(order2.trim());