Removed JMX, other unused code from configuration
[sdc.git] / common / onap-common-configuration-management / onap-configuration-management-core / src / main / java / org / onap / config / impl / ConfigurationRepository.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.onap.config.impl;
18
19 import java.io.File;
20 import java.sql.Timestamp;
21 import java.util.Collection;
22 import java.util.Collections;
23 import java.util.HashSet;
24 import java.util.LinkedHashMap;
25 import java.util.Map;
26 import java.util.Set;
27 import org.apache.commons.configuration2.CombinedConfiguration;
28 import org.apache.commons.configuration2.CompositeConfiguration;
29 import org.apache.commons.configuration2.Configuration;
30 import org.apache.commons.configuration2.FileBasedConfiguration;
31 import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
32 import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
33 import org.onap.config.ConfigurationUtils;
34 import org.onap.config.Constants;
35
36 public final class ConfigurationRepository {
37
38     private static final ConfigurationRepository repo = new ConfigurationRepository();
39
40     private final Set<String> tenants = Collections.synchronizedSet(new HashSet<>());
41
42     private final Set<String> namespaces = Collections.synchronizedSet(new HashSet<>());
43
44     private final Map<String, ConfigurationHolder> store = Collections.synchronizedMap(
45
46             new LinkedHashMap<String, ConfigurationHolder>(16, 0.75f, true) {
47
48                 @Override
49                 protected boolean removeEldestEntry(Map.Entry eldest) {
50                     try {
51                         return size() > getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE)
52                                                 .getInt("config.size.max");
53                     } catch (Exception exception) {
54                         return false;
55                     }
56                 }
57             });
58
59
60     private ConfigurationRepository() {
61         tenants.add(Constants.DEFAULT_TENANT);
62         namespaces.add(Constants.DEFAULT_NAMESPACE);
63     }
64
65     public static ConfigurationRepository lookup() {
66         return repo;
67     }
68
69     public Set<String> getTenants() {
70         return tenants;
71     }
72
73     public Set<String> getNamespaces() {
74         return namespaces;
75     }
76
77
78     public boolean isValidTenant(String tenant) {
79         return tenant != null && tenants.contains(tenant.toUpperCase());
80     }
81
82     public boolean isValidNamespace(String namespace) {
83         return namespace != null && namespaces.contains(namespace.toUpperCase());
84     }
85
86     public Configuration getConfigurationFor(String tenant, String namespace) throws Exception {
87         String module = tenant + Constants.KEY_ELEMENTS_DELIMITER + namespace;
88         ConfigurationHolder config = store.get(module);
89         return config.getConfiguration(tenant + Constants.KEY_ELEMENTS_DELIMITER + namespace);
90     }
91
92     public void populateConfiguration(String key, Configuration builder) {
93         store.put(key, new ConfigurationHolder(builder));
94         populateTenantsNamespace(key);
95     }
96
97     private void populateTenantsNamespace(String key) {
98         String[] array = key.split(Constants.KEY_ELEMENTS_DELIMITER);
99         if (!array[1].equalsIgnoreCase(Constants.DB_NAMESPACE)) {
100             tenants.add(array[0]);
101             namespaces.add(array[1]);
102         }
103     }
104
105     public void populateOverrideConfiguration(String key, File file) {
106
107         ConfigurationHolder holder = store.get(key);
108
109         if (holder == null) {
110             holder = new ConfigurationHolder(new CombinedConfiguration());
111             store.put(key, holder);
112         }
113
114         holder.addOverrideConfiguration(file.getAbsolutePath(), ConfigurationUtils.getConfigurationBuilder(file));
115         populateTenantsNamespace(key);
116     }
117
118     private class ConfigurationHolder {
119
120         private final Map<String, FileBasedConfigurationBuilder<FileBasedConfiguration>> overrideConfiguration =
121                 new LinkedHashMap<>();
122         BasicConfigurationBuilder<Configuration> builder;
123         Timestamp lastConfigurationBuildTime;
124         Configuration config;
125         Configuration composite;
126
127         public ConfigurationHolder(BasicConfigurationBuilder builder) {
128             this.builder = builder;
129         }
130
131         public ConfigurationHolder(Configuration builder) {
132             this.config = builder;
133         }
134
135         public void addOverrideConfiguration(String path, BasicConfigurationBuilder<FileBasedConfiguration> builder) {
136             overrideConfiguration.put(path.toUpperCase(), (FileBasedConfigurationBuilder) builder);
137             getEffectiveConfiguration(config, overrideConfiguration.values());
138         }
139
140         private Configuration getEffectiveConfiguration(Configuration configuration,
141                 Collection<FileBasedConfigurationBuilder<FileBasedConfiguration>> list) {
142             try {
143                 CompositeConfiguration cc = new CompositeConfiguration();
144                 for (FileBasedConfigurationBuilder<FileBasedConfiguration> b : list) {
145                     cc.addConfiguration(b.getConfiguration());
146                 }
147                 cc.addConfiguration(configuration);
148                 composite = cc;
149                 return composite;
150             } catch (Exception exception) {
151                 return null;
152             }
153         }
154
155         public Configuration getConfiguration(String namespace) throws Exception {
156
157             if (config == null) {
158                 config = builder.getConfiguration();
159                 lastConfigurationBuildTime = new Timestamp(System.currentTimeMillis());
160             } else if (lastConfigurationBuildTime != null
161                                && System.currentTimeMillis() - lastConfigurationBuildTime.getTime()
162                                           > getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE)
163                                                     .getInt("config.refresh.interval")) {
164                 lastConfigurationBuildTime = new Timestamp(System.currentTimeMillis());
165             }
166
167             if (composite == null && overrideConfiguration.size() != 0) {
168                 composite = getEffectiveConfiguration(config, overrideConfiguration.values());
169             }
170
171             return overrideConfiguration.size() == 0 ? config : composite;
172         }
173     }
174 }