1 package org.onap.config.impl;
3 import static org.onap.config.Constants.DB_NAMESPACE;
4 import static org.onap.config.Constants.DEFAULT_NAMESPACE;
5 import static org.onap.config.Constants.DEFAULT_TENANT;
6 import static org.onap.config.Constants.KEY_ELEMENTS_DELEMETER;
7 import static org.onap.config.Constants.LOAD_ORDER_KEY;
8 import static org.onap.config.Constants.MBEAN_NAME;
9 import static org.onap.config.Constants.MODE_KEY;
10 import static org.onap.config.Constants.NAMESPACE_KEY;
13 import java.io.PrintWriter;
14 import java.lang.management.ManagementFactory;
15 import java.lang.reflect.Method;
16 import java.util.ArrayList;
17 import java.util.Arrays;
18 import java.util.Collection;
19 import java.util.HashMap;
20 import java.util.HashSet;
21 import java.util.Iterator;
24 import javax.management.MBeanServer;
25 import javax.management.MBeanServerDelegate;
26 import javax.management.MBeanServerNotification;
27 import javax.management.Notification;
28 import javax.management.ObjectName;
29 import javax.management.StandardMBean;
30 import org.apache.commons.configuration2.CombinedConfiguration;
31 import org.apache.commons.configuration2.CompositeConfiguration;
32 import org.apache.commons.configuration2.Configuration;
33 import org.apache.commons.configuration2.FileBasedConfiguration;
34 import org.apache.commons.configuration2.PropertiesConfiguration;
35 import org.onap.config.ConfigurationUtils;
36 import org.onap.config.Constants;
37 import org.onap.config.api.ConfigurationManager;
38 import org.onap.config.api.Hint;
39 import org.onap.config.type.ConfigurationQuery;
40 import org.onap.config.type.ConfigurationUpdate;
43 * The type Cli configuration.
45 public final class CliConfigurationImpl extends ConfigurationImpl implements ConfigurationManager {
48 * Instantiates a new Cli configuration.
50 * @throws Exception the exception
52 public CliConfigurationImpl() throws Exception {
53 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
54 ObjectName name = new ObjectName(MBEAN_NAME);
55 if (mbs.isRegistered(name)) {
56 mbs.unregisterMBean(name);
58 mbs.registerMBean(new StandardMBean(this, ConfigurationManager.class), name);
59 mbs.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME,
60 (notification, handback) -> handleNotification(notification), null,
66 * Handle notification.
68 * @param notification the notification
70 public void handleNotification(Notification notification) {
71 if (notification instanceof MBeanServerNotification) {
72 MBeanServerNotification mbs = (MBeanServerNotification) notification;
73 if (MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) {
76 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE)
77 .getString("shutdown.mbean");
78 if (mbs.getMBeanName()
79 .equals(mbean == null ? new ObjectName(MBEAN_NAME) : new ObjectName(mbean))) {
80 changeNotifier.shutdown();
81 ConfigurationDataSource.lookup().close();
83 } catch (Exception exception) {
86 } else if (MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) {
92 public String getConfigurationValue(Map<String, Object> input) {
93 return getConfigurationValue((ConfigurationQuery) getInput(input));
96 private String getConfigurationValue(ConfigurationQuery queryData) {
98 if (queryData.isFallback()) {
99 return ConfigurationUtils.getCommaSeparatedList(
100 get(queryData.getTenant(), queryData.getNamespace(), queryData.getKey(), String[].class,
101 queryData.isLatest() ? Hint.LATEST_LOOKUP : Hint.DEFAULT,
102 queryData.isExternalLookup() ? Hint.EXTERNAL_LOOKUP : Hint.DEFAULT,
103 queryData.isNodeSpecific() ? Hint.NODE_SPECIFIC : Hint.DEFAULT));
106 getInternal(queryData.getTenant(), queryData.getNamespace(), queryData.getKey(),
107 String[].class, queryData.isLatest() ? Hint.LATEST_LOOKUP : Hint.DEFAULT,
108 queryData.isExternalLookup() ? Hint.EXTERNAL_LOOKUP : Hint.DEFAULT,
109 queryData.isNodeSpecific() ? Hint.NODE_SPECIFIC : Hint.DEFAULT);
110 return ConfigurationUtils
111 .getCommaSeparatedList(list == null ? Arrays.asList() : Arrays.asList(list));
113 } catch (Exception exception) {
114 exception.printStackTrace();
119 public void updateConfigurationValue(Map<String, Object> input) {
120 updateConfigurationValue((ConfigurationUpdate) getInput(input));
123 private void updateConfigurationValue(ConfigurationUpdate updateData) {
126 if (!ConfigurationRepository.lookup().isValidTenant(updateData.getTenant())) {
127 throw new RuntimeException("Invalid tenantId.");
129 if (!ConfigurationRepository.lookup().isValidNamespace(updateData.getNamespace())) {
130 throw new RuntimeException("Invalid Namespace.");
132 } catch (NullPointerException e1) {
133 // TODO Auto-generated catch block
134 e1.printStackTrace();
139 isKeyExists(updateData.getTenant(), updateData.getNamespace(), updateData.getKey());
141 boolean isUpdated = false;
142 Object[] paramArray = new Object[]{
143 updateData.getTenant() + KEY_ELEMENTS_DELEMETER + updateData.getNamespace(),
144 new Long(System.currentTimeMillis()), updateData.getKey(),
145 getConfigurationValue(updateData), updateData.getValue()};
146 Configuration config = ConfigurationRepository.lookup()
147 .getConfigurationFor(updateData.getTenant(), updateData.getNamespace());
148 if (config instanceof AgglomerateConfiguration || config instanceof CombinedConfiguration) {
149 CompositeConfiguration cc = new CompositeConfiguration();
150 cc.addConfiguration(config);
153 CompositeConfiguration configuration = (CompositeConfiguration) config;
154 int overrideIndex = -1;
155 for (int i = 0; i < configuration.getNumberOfConfigurations(); i++) {
156 if (!updateData.isNodeOverride()
157 && (configuration.getConfiguration(i) instanceof AgglomerateConfiguration
158 || configuration.getConfiguration(i) instanceof CombinedConfiguration)) {
159 configuration.getConfiguration(i)
160 .setProperty(updateData.getKey(), updateData.getValue());
163 } else if (updateData.isNodeOverride()
164 && configuration.getConfiguration(i) instanceof FileBasedConfiguration) {
165 configuration.getConfiguration(i)
166 .setProperty(updateData.getKey(), updateData.getValue());
173 if (updateData.isNodeOverride()) {
174 PropertiesConfiguration pc = new PropertiesConfiguration();
175 pc.setProperty(NAMESPACE_KEY,
176 updateData.getTenant() + Constants.TENANT_NAMESPACE_SAPERATOR
177 + updateData.getNamespace());
178 pc.setProperty(MODE_KEY, "OVERRIDE");
179 pc.setProperty(updateData.getKey(), updateData.getValue());
180 if (System.getProperty("node.config.location") != null
181 && System.getProperty("node.config.location").trim().length() > 0) {
182 File file = new File(System.getProperty("node.config.location"),
183 updateData.getTenant() + File.separator + updateData.getNamespace()
184 + File.separator + "config.properties");
185 file.getParentFile().mkdirs();
186 PrintWriter out = new PrintWriter(file);
189 ConfigurationRepository.lookup().populateOverrideConfigurtaion(
190 updateData.getTenant() + KEY_ELEMENTS_DELEMETER + updateData.getNamespace(),
194 configuration.getConfiguration(0)
195 .setProperty(updateData.getKey(), updateData.getValue());
198 if (!updateData.isNodeOverride()) {
199 ConfigurationUtils.executeInsertSql(
200 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE)
201 .getString("insertconfigurationchangecql"), paramArray);
203 ConfigurationRepository.lookup().refreshOverrideConfigurtaionFor(
204 updateData.getTenant() + KEY_ELEMENTS_DELEMETER + updateData.getNamespace(),
208 } catch (Exception exception) {
209 exception.printStackTrace();
213 private boolean isKeyExists(String tenant, String namespace, String key) {
214 boolean keyExist = false;
217 ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace).containsKey(key);
218 if (!keyExist && !DEFAULT_TENANT.equals(tenant)) {
219 keyExist = ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, namespace)
222 if (!keyExist && !DEFAULT_NAMESPACE.equals(namespace)) {
223 keyExist = ConfigurationRepository.lookup().getConfigurationFor(tenant, DEFAULT_NAMESPACE)
226 if (!keyExist && !DEFAULT_TENANT.equals(tenant) && !DEFAULT_NAMESPACE.equals(namespace)) {
228 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DEFAULT_NAMESPACE)
231 } catch (Exception exception) {
232 exception.printStackTrace();
237 public Map<String, String> listConfiguration(Map<String, Object> input) {
238 return listConfiguration((ConfigurationQuery) getInput(input));
241 private Map<String, String> listConfiguration(ConfigurationQuery query) {
242 Map<String, String> map = new HashMap<>();
244 Collection<String> keys = getKeys(query.getTenant(), query.getNamespace());
245 for (String key : keys) {
246 map.put(key, getConfigurationValue(query.key(key)));
248 } catch (Exception exception) {
249 exception.printStackTrace();
256 public boolean updateConfigurationValues(String tenant, String namespace,
257 Map configKeyValueStore) {
258 boolean valueToReturn = true;
259 Iterator<String> keys = configKeyValueStore.keySet().iterator();
260 while (keys.hasNext()) {
262 String key = keys.next();
263 ConfigurationUpdate updateData = new ConfigurationUpdate();
264 updateData.tenant(tenant).namespace(namespace).key(key);
265 updateData.value(configKeyValueStore.get(key).toString());
266 updateConfigurationValue(updateData);
267 } catch (Exception exception) {
268 exception.printStackTrace();
269 valueToReturn = false;
272 return valueToReturn;
275 private Object getInput(Map<String, Object> input) {
276 Object toReturn = null;
278 toReturn = Class.forName(input.get("ImplClass").toString()).newInstance();
279 Method[] methods = toReturn.getClass().getMethods();
280 for (Method method : methods) {
281 if (input.containsKey(method.getName())) {
282 method.invoke(toReturn, input.get(method.getName()));
285 } catch (Exception exception) {
286 exception.printStackTrace();
293 public Collection<String> getTenants() {
294 return ConfigurationRepository.lookup().getTenants();
298 public Collection<String> getNamespaces() {
299 return ConfigurationRepository.lookup().getNamespaces();
302 private ArrayList<String> getInMemoryKeys(String tenant, String namespace) {
303 ArrayList<String> keys = new ArrayList<>();
306 Iterator<String> iter =
307 ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace).getKeys();
308 while (iter.hasNext()) {
309 String key = iter.next();
310 if (!(key.equals(NAMESPACE_KEY) || key.equals(MODE_KEY)
311 || key.equals(LOAD_ORDER_KEY))) {
315 } catch (Exception exception) {
323 public Collection<String> getKeys(String tenant, String namespace) {
324 Set<String> keyCollection = new HashSet<>();
326 keyCollection.addAll(ConfigurationUtils.executeSelectSql(
327 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE)
328 .getString("fetchkeysql"),
329 new String[]{tenant + KEY_ELEMENTS_DELEMETER + DEFAULT_NAMESPACE}));
330 keyCollection.addAll(ConfigurationUtils.executeSelectSql(
331 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE)
332 .getString("fetchkeysql"),
333 new String[]{tenant + KEY_ELEMENTS_DELEMETER + namespace}));
334 keyCollection.addAll(ConfigurationUtils.executeSelectSql(
335 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE)
336 .getString("fetchkeysql"),
337 new String[]{DEFAULT_TENANT + KEY_ELEMENTS_DELEMETER + namespace}));
338 keyCollection.addAll(ConfigurationUtils.executeSelectSql(
339 ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE)
340 .getString("fetchkeysql"),
341 new String[]{DEFAULT_TENANT + KEY_ELEMENTS_DELEMETER + DEFAULT_NAMESPACE}));
342 } catch (Exception exception) {
343 exception.printStackTrace();
344 keyCollection.addAll(getInMemoryKeys(tenant, DEFAULT_NAMESPACE));
345 keyCollection.addAll(getInMemoryKeys(tenant, namespace));
346 keyCollection.addAll(getInMemoryKeys(DEFAULT_TENANT, namespace));
347 keyCollection.addAll(getInMemoryKeys(DEFAULT_TENANT, DEFAULT_NAMESPACE));
349 return keyCollection;