From 2074ab2e8b4416126542c09205d3ca6646ed6718 Mon Sep 17 00:00:00 2001 From: vempo Date: Sun, 28 Oct 2018 14:45:46 +0200 Subject: Removed support of dynamic configuration Configuration framework will not poll configuration for changes, and will not notify client code of them. Also minor cleanup, added unit tests. Change-Id: I428b23f7acb13c6610390f46aae6e011d6b0ee80 Issue-ID: SDC-1867 Signed-off-by: vempo --- .../onap-configuration-management-api/pom.xml | 8 + .../java/org/onap/config/api/Configuration.java | 51 --- .../config/api/ConfigurationChangeListener.java | 29 -- .../org/onap/config/api/ConfigurationManager.java | 4 - .../org/onap/config/api/DynamicConfiguration.java | 104 ------ .../org/onap/config/api/ConfigurationTest.java | 72 ++++ .../java/org/onap/config/ConfigurationUtils.java | 22 +- .../src/main/java/org/onap/config/Constants.java | 2 +- .../onap/config/impl/AggregateConfiguration.java | 12 - .../org/onap/config/impl/CliConfigurationImpl.java | 161 +-------- .../config/impl/ConfigurationChangeNotifier.java | 393 --------------------- .../org/onap/config/impl/ConfigurationImpl.java | 59 +--- .../onap/config/impl/ConfigurationRepository.java | 36 +- .../org/onap/config/type/ConfigurationUpdate.java | 45 --- .../src/main/resources/config-system.properties | 3 +- .../LoadOrderConfiguration/config.properties | 1 - .../UnregisterNotification/config-NS.properties | 13 - .../resources/UnregisterNotification/config.json | 12 - .../UnregisterNotification/config.properties | 3 - .../resources/UnregisterNotification/config.xml | 18 - .../resources/UnregisterNotification/config.yaml | 9 - .../src/test/resources/XMLConfiguration/config.xml | 1 - .../test/resources/YAMLConfiguration/config.yaml | 1 - .../src/test/resources/config-system.properties | 3 +- .../resources/fallback/config-fallback.properties | 1 - .../resources/java-properties/config.properties | 1 - .../resources/multitenancy/config-at.properties | 1 - .../resources/multitenancy/config-tf.properties | 1 - .../resources/multitenancy/config-vf.properties | 1 - .../test/resources/multitenancy/config.properties | 1 - 30 files changed, 107 insertions(+), 961 deletions(-) delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationChangeListener.java delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/DynamicConfiguration.java create mode 100644 common/onap-common-configuration-management/onap-configuration-management-api/src/test/java/org/onap/config/api/ConfigurationTest.java delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationChangeNotifier.java delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/type/ConfigurationUpdate.java delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config-NS.properties delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.json delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.properties delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.xml delete mode 100644 common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.yaml diff --git a/common/onap-common-configuration-management/onap-configuration-management-api/pom.xml b/common/onap-common-configuration-management/onap-configuration-management-api/pom.xml index 08be65ab3e..e402be2700 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-api/pom.xml +++ b/common/onap-common-configuration-management/onap-configuration-management-api/pom.xml @@ -13,4 +13,12 @@ 1.3.1-SNAPSHOT + + + junit + junit + test + + + diff --git a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/Configuration.java b/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/Configuration.java index 3232d49277..d5b5a10bcf 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/Configuration.java +++ b/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/Configuration.java @@ -161,35 +161,6 @@ public interface Configuration { return get(tenantId, namespace, null, clazz, Hint.EXTERNAL_LOOKUP); } - default DynamicConfiguration getDynamicConfiguration(String key, Class clazz, T defaultValue) { - return getDynamicConfiguration(null, key, clazz, defaultValue); - } - - default DynamicConfiguration getDynamicConfiguration(String namespace, String key, Class clazz, - T defaultValue) { - return getDynamicConfiguration(TENANT.get(), namespace, key, clazz, defaultValue); - } - - default DynamicConfiguration getDynamicConfiguration(String tenant, String namespace, String key, - Class clazz, T defaultValue) { - return DynamicConfiguration.getDynamicConfiguration(tenant, namespace, key, clazz, defaultValue, this); - } - - default DynamicConfiguration> getDynamicConfigurationValues(String key, Class clazz, - T defaultValue) { - return getDynamicConfigurationValues(null, key, clazz, defaultValue); - } - - default DynamicConfiguration> getDynamicConfigurationValues(String namespace, String key, - Class clazz, T defaultValue) { - return getDynamicConfigurationValues(TENANT.get(), namespace, key, clazz, defaultValue); - } - - default DynamicConfiguration> getDynamicConfigurationValues(String tenant, String namespace, String key, - Class clazz, T defaultValue) { - return DynamicConfiguration.getDynConfiguration(tenant, namespace, key, clazz, defaultValue, this); - } - default List getAsStringValues(String key) { return getAsStringValues(null, key); } @@ -294,28 +265,6 @@ public interface Configuration { return tempArray == null ? Collections.emptyList() : Arrays.asList(tempArray); } - default void addConfigurationChangeListener(String key, ConfigurationChangeListener myself) { - addConfigurationChangeListener(null, key, myself); - } - - default void addConfigurationChangeListener(String namespace, String key, ConfigurationChangeListener myself) { - addConfigurationChangeListener(TENANT.get(), namespace, key, myself); - } - - void addConfigurationChangeListener(String tenant, String namespace, String key, - ConfigurationChangeListener myself); - - default void removeConfigurationChangeListener(String key, ConfigurationChangeListener myself) { - removeConfigurationChangeListener(null, key, myself); - } - - default void removeConfigurationChangeListener(String namespace, String key, ConfigurationChangeListener myself) { - removeConfigurationChangeListener(TENANT.get(), namespace, key, myself); - } - - void removeConfigurationChangeListener(String tenant, String namespace, String key, - ConfigurationChangeListener myself); - default Map populateMap(String key, Class clazz) { return populateMap(null, key, clazz); } diff --git a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationChangeListener.java b/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationChangeListener.java deleted file mode 100644 index dddd751383..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationChangeListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © 2016-2018 European Support Limited - * - * Licensed 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.onap.config.api; - -public interface ConfigurationChangeListener { - - default void notify(String tenantId, String component, String key, Object oldValue, Object newValue) { - } - - default void notify(String component, String key, Object oldValue, Object newValue) { - } - - default void notify(String key, Object oldValue, Object newValue) { - } -} diff --git a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationManager.java b/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationManager.java index d91fdb15f4..0bb33595e5 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationManager.java +++ b/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/ConfigurationManager.java @@ -38,12 +38,8 @@ public interface ConfigurationManager extends Configuration { String getConfigurationValue(Map queryData); - void updateConfigurationValue(Map updateData); - Map listConfiguration(Map query); - boolean updateConfigurationValues(String tenant, String namespace, Map configKeyValueStore); - Collection getTenants(); Collection getNamespaces(); diff --git a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/DynamicConfiguration.java b/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/DynamicConfiguration.java deleted file mode 100644 index c2973a493f..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-api/src/main/java/org/onap/config/api/DynamicConfiguration.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright © 2016-2018 European Support Limited - * - * Licensed 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.onap.config.api; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -public class DynamicConfiguration { - - private String tenant; - - private String namespace; - - private String key; - - private Configuration configuration; - - private Class clazz; - - private T defaultValue; - - public static DynamicConfiguration> getDynConfiguration(String tenant, String namespace, String key, - Class clazz, K defaultValue, Configuration configuration) { - if (clazz.isPrimitive()) { - throw new RuntimeException("Only Wrapper classes like Integer, Long, Double, " - + "Boolean etc including String are supported."); - } - return getDynamicConfiguration(tenant, namespace, key, getArrayClass(clazz), - Collections.singletonList(defaultValue), configuration); - } - - public static DynamicConfiguration getDynamicConfiguration(String tenant, String namespace, String key, - Class clazz, T defaultValue, Configuration configuration) { - DynamicConfiguration dynamicConfiguration = new DynamicConfiguration<>(); - dynamicConfiguration.tenant = tenant; - dynamicConfiguration.namespace = namespace; - dynamicConfiguration.key = key; - dynamicConfiguration.clazz = clazz; - dynamicConfiguration.defaultValue = defaultValue; - dynamicConfiguration.configuration = configuration; - return dynamicConfiguration; - } - - public static Class getArrayClass(Class clazz) { - Class arrayClass = null; - switch (clazz.getName()) { - case "java.lang.Byte": - arrayClass = Byte[].class; - break; - case "java.lang.Short": - arrayClass = Short[].class; - break; - case "java.lang.Integer": - arrayClass = Integer[].class; - break; - case "java.lang.Long": - arrayClass = Long[].class; - break; - case "java.lang.Float": - arrayClass = Float[].class; - break; - case "java.lang.Double": - arrayClass = Double[].class; - break; - case "java.lang.Boolean": - arrayClass = Boolean[].class; - break; - case "java.lang.Character": - arrayClass = Character[].class; - break; - case "java.lang.String": - arrayClass = String[].class; - break; - default: - } - return arrayClass; - } - - public T get() { - Object toReturn = configuration.get(tenant, namespace, key, clazz, Hint.LATEST_LOOKUP, Hint.EXTERNAL_LOOKUP, - Hint.NODE_SPECIFIC); - if (toReturn != null && toReturn.getClass().isArray()) { - toReturn = Arrays.asList((Object[]) toReturn); - } - return toReturn == null ? defaultValue : (T) toReturn; - } - -} diff --git a/common/onap-common-configuration-management/onap-configuration-management-api/src/test/java/org/onap/config/api/ConfigurationTest.java b/common/onap-common-configuration-management/onap-configuration-management-api/src/test/java/org/onap/config/api/ConfigurationTest.java new file mode 100644 index 0000000000..9945a938d3 --- /dev/null +++ b/common/onap-common-configuration-management/onap-configuration-management-api/src/test/java/org/onap/config/api/ConfigurationTest.java @@ -0,0 +1,72 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed 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.onap.config.api; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author evitaliy + * @since 28 Oct 2018 + */ +public class ConfigurationTest { + + @After + public void cleanUp() { + Configuration.TENANT.remove(); + } + + @Test + public void tenantRetrievedWhenPreviouslySet() { + final String tenantId = "abc"; + Configuration.setTenantId(tenantId); + Assert.assertEquals(tenantId, Configuration.TENANT.get()); + } + + @Test + public void tenantEmptyWhenNeverSet() { + Assert.assertNull(Configuration.TENANT.get()); + } + + @Test + public void tenantNullWhenNullSet() { + Configuration.setTenantId("xyz"); + Configuration.setTenantId(null); + Assert.assertNull(Configuration.TENANT.get()); + } + + @Test + public void tenantNullWhenEmptySet() { + Configuration.setTenantId("xyz"); + Configuration.setTenantId(""); + Assert.assertNull(Configuration.TENANT.get()); + } + + @Test + public void tenantDoesNotPropagateToAnotherThread() throws ExecutionException, InterruptedException { + final String currentTenant = "xyz"; + Configuration.setTenantId(currentTenant); + CompletableFuture result = new CompletableFuture<>(); + Thread otherThread = new Thread(() -> result.complete(Configuration.TENANT.get())); + otherThread.start(); + Assert.assertNull("Tenant in the other thread expected to be null", result.get()); + Assert.assertEquals(currentTenant, Configuration.TENANT.get()); + } +} \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java index 528941b923..dcdf17a992 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java @@ -48,10 +48,8 @@ import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedTransferQueue; -import java.util.concurrent.ThreadFactory; import java.util.concurrent.TransferQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -102,14 +100,7 @@ public class ConfigurationUtils { } private ConfigurationUtils() { - } - - public static ThreadFactory getThreadFactory() { - return r1 -> { - Thread thread = Executors.privilegedThreadFactory().newThread(r1); - thread.setDaemon(true); - return thread; - }; + // prevent instantiation } public static Collection getAllFiles(File file, boolean recursive, boolean onlyDirectory) { @@ -303,8 +294,9 @@ public class ConfigurationUtils { } public static boolean isWrapperClass(Class clazz) { - return clazz == String.class || clazz == Boolean.class || clazz == Character.class - || Number.class.isAssignableFrom(clazz); + return clazz == String.class || clazz == Boolean.class || clazz == Character.class || Number.class + .isAssignableFrom( + clazz); } public static Class getArrayClass(Class clazz) { @@ -324,8 +316,8 @@ public class ConfigurationUtils { return builder; } - private static ReloadingFileBasedConfigurationBuilder - getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(ConfigurationType configType) { + private static ReloadingFileBasedConfigurationBuilder getFileBasedConfigurationReloadingFileBasedConfigurationBuilder( + ConfigurationType configType) { ReloadingFileBasedConfigurationBuilder builder; switch (configType) { @@ -569,7 +561,7 @@ public class ConfigurationUtils { stack.push(element); } String toReturn = stack.pop(); - return stack.pop() + Constants.KEY_ELEMENTS_DELIMETER + toReturn; + return stack.pop() + Constants.KEY_ELEMENTS_DELIMITER + toReturn; } public static String getNamespace(File file) { diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/Constants.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/Constants.java index 290a7a5a4b..97963c4c4e 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/Constants.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/Constants.java @@ -21,7 +21,7 @@ public class Constants { public static final String DEFAULT_TENANT = "GLOBAL"; public static final String DEFAULT_NAMESPACE = "COMMON"; public static final String DB_NAMESPACE = "SYSTEM"; - public static final String KEY_ELEMENTS_DELIMETER = "-"; + public static final String KEY_ELEMENTS_DELIMITER = "-"; public static final String TENANT_NAMESPACE_SEPARATOR = ":"; public static final String NAMESPACE_KEY = "_config.namespace"; public static final String MODE_KEY = "_config.mergeStrategy"; diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java index 80fbaf8fd0..32a1902151 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java @@ -40,18 +40,6 @@ public final class AggregateConfiguration { private final Map mergeConfig = new HashMap<>(); private final Map overrideConfig = new LinkedHashMap<>(); - public AggregateConfiguration() { - - try { - Class clazz = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName()); - if (!clazz.getCanonicalName().equals(ConfigurationImpl.class.getCanonicalName())) { - throw new RuntimeException("Illegal access."); - } - } catch (ClassNotFoundException cfe) { - throw new RuntimeException("Class not found while loading change notifier"); - } - } - public void addConfig(File file) throws Exception { addConfig(file.getAbsolutePath().toUpperCase(), ConfigurationUtils.getMergeStrategy(file), ConfigurationUtils.getConfigurationBuilder(file, false).getConfiguration()); diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java index 7f753fd1fd..77d0c11c9f 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java @@ -16,17 +16,13 @@ package org.onap.config.impl; -import static org.onap.config.Constants.DB_NAMESPACE; import static org.onap.config.Constants.DEFAULT_NAMESPACE; import static org.onap.config.Constants.DEFAULT_TENANT; -import static org.onap.config.Constants.KEY_ELEMENTS_DELIMETER; import static org.onap.config.Constants.LOAD_ORDER_KEY; import static org.onap.config.Constants.MBEAN_NAME; import static org.onap.config.Constants.MODE_KEY; import static org.onap.config.Constants.NAMESPACE_KEY; -import java.io.File; -import java.io.PrintWriter; import java.lang.management.ManagementFactory; import java.lang.reflect.Method; import java.util.ArrayList; @@ -39,22 +35,12 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.management.MBeanServer; -import javax.management.MBeanServerDelegate; -import javax.management.MBeanServerNotification; -import javax.management.Notification; import javax.management.ObjectName; import javax.management.StandardMBean; -import org.apache.commons.configuration2.CombinedConfiguration; -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.configuration2.Configuration; -import org.apache.commons.configuration2.FileBasedConfiguration; -import org.apache.commons.configuration2.PropertiesConfiguration; import org.onap.config.ConfigurationUtils; -import org.onap.config.Constants; import org.onap.config.api.ConfigurationManager; import org.onap.config.api.Hint; import org.onap.config.type.ConfigurationQuery; -import org.onap.config.type.ConfigurationUpdate; public final class CliConfigurationImpl extends ConfigurationImpl implements ConfigurationManager { @@ -65,27 +51,6 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con mbs.unregisterMBean(name); } mbs.registerMBean(new StandardMBean(this, ConfigurationManager.class), name); - mbs.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME, - (notification, handback) -> handleNotification(notification), null, null); - } - - public void handleNotification(Notification notification) { - if (notification instanceof MBeanServerNotification) { - MBeanServerNotification mbs = (MBeanServerNotification) notification; - if (MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) { - try { - String mbean = ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DB_NAMESPACE) - .getString("shutdown.mbean"); - if (mbs.getMBeanName().equals(mbean == null ? new ObjectName(MBEAN_NAME) : new ObjectName(mbean))) { - changeNotifier.shutdown(); - } - } catch (Exception exception) { - //do nothing. - } - } else if (MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) { - mbs.getMBeanName(); - } - } } public String getConfigurationValue(Map input) { @@ -116,7 +81,9 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con } private Object getInput(Map input) { + Object toReturn = null; + try { toReturn = Class.forName(input.get("ImplClass").toString()).newInstance(); Method[] methods = toReturn.getClass().getMethods(); @@ -132,111 +99,6 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con return toReturn; } - public void updateConfigurationValue(Map input) { - updateConfigurationValue((ConfigurationUpdate) getInput(input)); - } - - private void updateConfigurationValue(ConfigurationUpdate updateData) { - - try { - if (!ConfigurationRepository.lookup().isValidTenant(updateData.getTenant())) { - throw new RuntimeException("Invalid tenantId."); - } - if (!ConfigurationRepository.lookup().isValidNamespace(updateData.getNamespace())) { - throw new RuntimeException("Invalid Namespace."); - } - } catch (NullPointerException e1) { - e1.printStackTrace(); - } - - try { - boolean keyPresent = isKeyExists(updateData.getTenant(), updateData.getNamespace(), updateData.getKey()); - if (keyPresent) { - boolean isUpdated = false; - Object[] paramArray = - new Object[] {updateData.getTenant() + KEY_ELEMENTS_DELIMETER + updateData.getNamespace(), - System.currentTimeMillis(), updateData.getKey(), getConfigurationValue(updateData), - updateData.getValue()}; - Configuration config = ConfigurationRepository.lookup() - .getConfigurationFor(updateData.getTenant(), updateData.getNamespace()); - if (config instanceof AgglomerateConfiguration || config instanceof CombinedConfiguration) { - CompositeConfiguration cc = new CompositeConfiguration(); - cc.addConfiguration(config); - config = cc; - } - CompositeConfiguration configuration = (CompositeConfiguration) config; - int overrideIndex = -1; - for (int i = 0; i < configuration.getNumberOfConfigurations(); i++) { - if (!updateData.isNodeOverride() && ( - configuration.getConfiguration(i) instanceof AgglomerateConfiguration - || configuration.getConfiguration(i) instanceof CombinedConfiguration)) { - configuration.getConfiguration(i).setProperty(updateData.getKey(), updateData.getValue()); - isUpdated = true; - break; - } else if (updateData.isNodeOverride() && configuration.getConfiguration( - i) instanceof FileBasedConfiguration) { - configuration.getConfiguration(i).setProperty(updateData.getKey(), updateData.getValue()); - isUpdated = true; - overrideIndex = i; - break; - } - } - if (!isUpdated) { - if (updateData.isNodeOverride()) { - PropertiesConfiguration pc = new PropertiesConfiguration(); - pc.setProperty(NAMESPACE_KEY, - updateData.getTenant() + Constants.TENANT_NAMESPACE_SEPARATOR - + updateData.getNamespace()); - pc.setProperty(MODE_KEY, "OVERRIDE"); - pc.setProperty(updateData.getKey(), updateData.getValue()); - String nodeConfigLocation = System.getProperty("node.config.location"); - if (nodeConfigLocation != null && nodeConfigLocation.trim().length() > 0) { - File file = new File(nodeConfigLocation, - updateData.getTenant() + File.separator + updateData.getNamespace() + File.separator - + "config.properties"); - file.getParentFile().mkdirs(); - PrintWriter out = new PrintWriter(file); - pc.write(out); - out.close(); - ConfigurationRepository.lookup().populateOverrideConfiguration( - updateData.getTenant() + KEY_ELEMENTS_DELIMETER + updateData.getNamespace(), file); - } - } else { - configuration.getConfiguration(0).setProperty(updateData.getKey(), updateData.getValue()); - } - } - if (updateData.isNodeOverride()) { - ConfigurationRepository.lookup().refreshOverrideConfigurationFor( - updateData.getTenant() + KEY_ELEMENTS_DELIMETER + updateData.getNamespace(), overrideIndex); - } - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - private boolean isKeyExists(String tenant, String namespace, String key) { - boolean keyExist = false; - try { - keyExist = ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace).containsKey(key); - if (!keyExist && !DEFAULT_TENANT.equals(tenant)) { - keyExist = ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, namespace) - .containsKey(key); - } - if (!keyExist && !DEFAULT_NAMESPACE.equals(namespace)) { - keyExist = ConfigurationRepository.lookup().getConfigurationFor(tenant, DEFAULT_NAMESPACE) - .containsKey(key); - } - if (!keyExist && !DEFAULT_TENANT.equals(tenant) && !DEFAULT_NAMESPACE.equals(namespace)) { - keyExist = ConfigurationRepository.lookup().getConfigurationFor(DEFAULT_TENANT, DEFAULT_NAMESPACE) - .containsKey(key); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - return keyExist; - } - public Map listConfiguration(Map input) { return listConfiguration((ConfigurationQuery) getInput(input)); } @@ -256,6 +118,7 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con } private ArrayList getInMemoryKeys(String tenant, String namespace) { + ArrayList keys = new ArrayList<>(); try { @@ -273,24 +136,6 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con return keys; } - @Override - public boolean updateConfigurationValues(String tenant, String namespace, Map configKeyValueStore) { - boolean valueToReturn = true; - for (String s : (Iterable) configKeyValueStore.keySet()) { - try { - String key = s; - ConfigurationUpdate updateData = new ConfigurationUpdate(); - updateData.tenant(tenant).namespace(namespace).key(key); - updateData.value(configKeyValueStore.get(key).toString()); - updateConfigurationValue(updateData); - } catch (Exception exception) { - exception.printStackTrace(); - valueToReturn = false; - } - } - return valueToReturn; - } - @Override public Collection getTenants() { return ConfigurationRepository.lookup().getTenants(); diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationChangeNotifier.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationChangeNotifier.java deleted file mode 100644 index cd6481f97b..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationChangeNotifier.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright © 2016-2018 European Support Limited - * - * Licensed 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.onap.config.impl; - -import java.io.File; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.lang.reflect.Method; -import java.nio.file.ClosedWatchServiceException; -import java.nio.file.FileSystems; -import java.nio.file.Path; -import java.nio.file.StandardWatchEventKinds; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.Vector; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import javax.management.JMX; -import javax.management.MBeanServerConnection; -import javax.management.ObjectName; -import org.onap.config.ConfigurationUtils; -import org.onap.config.Constants; -import org.onap.config.api.ConfigurationChangeListener; -import org.onap.config.api.ConfigurationManager; -import org.onap.config.api.Hint; - - -public final class ConfigurationChangeNotifier { - - static { - if (!Thread.currentThread().getStackTrace()[2].getClassName().equals(ConfigurationImpl.class.getName())) { - throw new RuntimeException("Illegal access."); - } - } - - private final HashMap> store = new HashMap<>(); - private final ScheduledExecutorService executor = - Executors.newScheduledThreadPool(5, ConfigurationUtils.getThreadFactory()); - private final ExecutorService notificationExecutor = - Executors.newCachedThreadPool(ConfigurationUtils.getThreadFactory()); - private final Map watchServiceCollection = Collections.synchronizedMap(new HashMap<>()); - - public ConfigurationChangeNotifier(Map inMemoryConfig) { - executor.scheduleWithFixedDelay(() -> this.pollFilesystemAndUpdateConfigurationIfRequired(inMemoryConfig, - System.getProperty("config.location"), false), 1, 1, TimeUnit.MILLISECONDS); - executor.scheduleWithFixedDelay(() -> this.pollFilesystemAndUpdateConfigurationIfRequired(inMemoryConfig, - System.getProperty("tenant.config.location"), true), 1, 1, TimeUnit.MILLISECONDS); - executor.scheduleWithFixedDelay(() -> this.pollFilesystemAndUpdateNodeSpecificConfigurationIfRequired( - System.getProperty("node.config.location")), 1, 1, TimeUnit.MILLISECONDS); - } - - public void pollFilesystemAndUpdateConfigurationIfRequired(Map inMemoryConfig, - String location, boolean isTenantLocation) { - try { - Set paths = watchForChange(location); - if (paths != null) { - for (Path path : paths) { - File file = path.toAbsolutePath().toFile(); - String repositoryKey = null; - if (ConfigurationUtils.isConfig(file) && file.isFile()) { - if (isTenantLocation) { - Collection tenantsRoot = - ConfigurationUtils.getAllFiles(new File(location), false, true); - for (File tenantRoot : tenantsRoot) { - if (file.getAbsolutePath().startsWith(tenantRoot.getAbsolutePath())) { - repositoryKey = ConfigurationUtils.getConfigurationRepositoryKey( - (tenantRoot.getName() + Constants.TENANT_NAMESPACE_SEPARATOR - + ConfigurationUtils.getNamespace(file)) - .split(Constants.TENANT_NAMESPACE_SEPARATOR)); - } - } - } else { - repositoryKey = ConfigurationUtils.getConfigurationRepositoryKey(file); - } - AggregateConfiguration config = inMemoryConfig.get(repositoryKey); - if (config != null) { - LinkedHashMap origConfig = ConfigurationUtils.toMap(config.getFinalConfiguration()); - config.addConfig(file); - LinkedHashMap latestConfig = ConfigurationUtils.toMap(config.getFinalConfiguration()); - Map map = ConfigurationUtils.diff(origConfig, latestConfig); - String[] tenantNamespaceArray = repositoryKey.split(Constants.KEY_ELEMENTS_DELIMETER); - updateConfigurationValues(tenantNamespaceArray[0], tenantNamespaceArray[1], map); - } - } else { - for (String configKey : inMemoryConfig.keySet()) { - repositoryKey = configKey; - AggregateConfiguration config = inMemoryConfig.get(repositoryKey); - if (config.containsConfig(file)) { - LinkedHashMap origConfig = ConfigurationUtils.toMap(config.getFinalConfiguration()); - config.removeConfig(file); - LinkedHashMap latestConfig = ConfigurationUtils.toMap(config.getFinalConfiguration()); - Map map = ConfigurationUtils.diff(origConfig, latestConfig); - String[] tenantNamespaceArray = repositoryKey.split(Constants.KEY_ELEMENTS_DELIMETER); - updateConfigurationValues(tenantNamespaceArray[0], tenantNamespaceArray[1], map); - } - } - } - } - } - } catch (ClosedWatchServiceException exception) { - // do nothing. - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void pollFilesystemAndUpdateNodeSpecificConfigurationIfRequired(String location) { - try { - Set paths = watchForChange(location); - if (paths != null) { - for (Path path : paths) { - File file = path.toAbsolutePath().toFile(); - - if (ConfigurationUtils.isConfig(file)) { - String repositoryKey = ConfigurationUtils.getConfigurationRepositoryKey(file); - ConfigurationRepository.lookup().populateOverrideConfiguration(repositoryKey, file); - } else { - ConfigurationRepository.lookup().removeOverrideConfiguration(file); - } - } - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - private Set watchForChange(String location) throws Exception { - if (location == null || location.trim().length() == 0) { - return Collections.emptySet(); - } - File file = new File(location); - if (!file.exists()) { - return Collections.emptySet(); - } - Path path = file.toPath(); - Set toReturn = new HashSet<>(); - try (final WatchService watchService = FileSystems.getDefault().newWatchService()) { - watchServiceCollection.put(location, watchService); - path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE, - StandardWatchEventKinds.ENTRY_DELETE); - for (File dir : ConfigurationUtils.getAllFiles(file, true, true)) { - dir.toPath().register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, - StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE); - } - while (true) { - final WatchKey wk = watchService.take(); - Thread.sleep(ConfigurationRepository.lookup() - .getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE) - .getLong("event.fetch.delay")); - for (WatchEvent event : wk.pollEvents()) { - Object context = event.context(); - if (context instanceof Path) { - File newFile = new File(((Path) wk.watchable()).toFile(), context.toString()); - if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { - if (newFile.isDirectory()) { - newFile.toPath().register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, - StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE); - continue; - } - } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { - if (newFile.isDirectory()) { - continue; - } - } - toReturn.add(newFile.toPath()); - } - } - if (toReturn.isEmpty()) { - continue; - } - break; - } - } - return toReturn; - } - - private void updateConfigurationValues(String tenant, String namespace, Map map) throws Exception { - MBeanServerConnection mbsc = ManagementFactory.getPlatformMBeanServer(); - ObjectName mbeanName = new ObjectName(Constants.MBEAN_NAME); - ConfigurationManager conf = JMX.newMBeanProxy(mbsc, mbeanName, ConfigurationManager.class, true); - conf.updateConfigurationValues(tenant, namespace, map); - } - - public void shutdown() { - for (WatchService watch : watchServiceCollection.values()) { - try { - watch.close(); - } catch (IOException exception) { - //do nothing - } - } - executor.shutdownNow(); - } - - public void notifyChangesTowards(String tenant, String component, String key, ConfigurationChangeListener myself) - throws Exception { - List notificationList = store.get(tenant + Constants.KEY_ELEMENTS_DELIMETER + component); - if (notificationList == null) { - notificationList = Collections.synchronizedList(new ArrayList<>()); - store.put(tenant + Constants.KEY_ELEMENTS_DELIMETER + component, notificationList); - executor.scheduleWithFixedDelay( - () -> triggerScanning(tenant + Constants.KEY_ELEMENTS_DELIMETER + component), 1, 30000, - TimeUnit.MILLISECONDS); - } - notificationList.add(new NotificationData(tenant, component, key, myself)); - } - - private void triggerScanning(String key) { - if (store.get(key) != null) { - notificationExecutor.submit(() -> scanForChanges(key)); - } else { - throw new IllegalArgumentException("Notification service for " + key + " is suspended."); - } - } - - private void scanForChanges(String key) { - List list = store.get(key); - if (list != null) { - list.stream().filter(NotificationData::isChanged) - .forEach(notificationData -> notificationExecutor.submit(() -> sendNotification(notificationData))); - } - } - - private void sendNotification(NotificationData notificationData) { - try { - notificationData.dispatchNotification(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void stopNotificationTowards(String tenant, String component, String key, ConfigurationChangeListener myself) - throws Exception { - List notificationList = store.get(tenant + Constants.KEY_ELEMENTS_DELIMETER + component); - if (notificationList != null) { - boolean removed = notificationList.remove(new NotificationData(tenant, component, key, myself)); - if (removed && notificationList.isEmpty()) { - store.remove(tenant + Constants.KEY_ELEMENTS_DELIMETER + component); - } - } - - } - - static class NotificationData { - - final String tenant; - - final String namespace; - - final String key; - - final ConfigurationChangeListener myself; - - Object currentValue; - - boolean isArray; - - public NotificationData(String tenant, String component, String key, ConfigurationChangeListener myself) - throws Exception { - this.tenant = tenant; - this.namespace = component; - this.key = key; - this.myself = myself; - if (!ConfigurationRepository.lookup().getConfigurationFor(tenant, component).containsKey(key)) { - throw new RuntimeException("Key[" + key + "] not found."); - } - isArray = ConfigurationUtils.isArray(tenant, component, key, Hint.DEFAULT.value()); - if (isArray) { - currentValue = ConfigurationManager.lookup().getAsStringValues(tenant, component, key); - } else { - currentValue = ConfigurationManager.lookup().getAsString(tenant, component, key); - } - } - - @Override - public int hashCode() { - return Objects.hash(tenant, namespace, key, myself, currentValue, isArray); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof NotificationData)) { - return false; - } - NotificationData nd = (NotificationData) obj; - return Objects.equals(tenant, nd.tenant) && Objects.equals(namespace, nd.namespace) && Objects.equals(key, - nd.key) && Objects.equals(myself, nd.myself) && Objects.equals(currentValue, nd.currentValue) - // it's either String or List - && isArray == nd.isArray; - } - - public boolean isChanged() { - Object latestValue; - try { - if (isArray) { - latestValue = ConfigurationManager.lookup().getAsStringValues(tenant, namespace, key); - } else { - latestValue = ConfigurationManager.lookup().getAsString(tenant, namespace, key); - } - if (!isArray) { - return !currentValue.equals(latestValue); - } else { - Collection oldCollection = (Collection) currentValue; - Collection newCollection = (Collection) latestValue; - for (String val : oldCollection) { - if (!newCollection.remove(val)) { - return true; - } - } - return !newCollection.isEmpty(); - } - } catch (Exception exception) { - return false; - } - } - - public void dispatchNotification() throws Exception { - Method method = null; - Vector parameters = null; - try { - Object latestValue; - if (isArray) { - latestValue = ConfigurationManager.lookup().getAsStringValues(tenant, namespace, key); - } else { - latestValue = ConfigurationManager.lookup().getAsString(tenant, namespace, key); - } - Method[] methods = myself.getClass().getDeclaredMethods(); - if (methods != null && methods.length > 0) { - method = methods[0]; - int paramCount = method.getParameterCount(); - parameters = new Vector<>(); - if (paramCount > 4) { - if (tenant.equals(Constants.DEFAULT_TENANT)) { - parameters.add(null); - } else { - parameters.add(tenant); - } - } - if (paramCount > 3) { - if (namespace.equals(Constants.DEFAULT_NAMESPACE)) { - parameters.add(null); - } else { - parameters.add(namespace); - } - } - parameters.add(key); - parameters.add(currentValue); - parameters.add(latestValue); - method.setAccessible(true); - } - } catch (Exception exception) { - exception.printStackTrace(); - } finally { - isArray = ConfigurationUtils.isArray(tenant, namespace, key, Hint.DEFAULT.value()); - if (isArray) { - currentValue = ConfigurationManager.lookup().getAsStringValues(tenant, namespace, key); - } else { - currentValue = ConfigurationManager.lookup().getAsString(tenant, namespace, key); - } - if (method != null && parameters != null) { - method.invoke(myself, parameters.toArray()); - } - } - } - } -} diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java index 58720fc76d..af5ae04104 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java @@ -34,7 +34,6 @@ import org.onap.config.ConfigurationUtils; import org.onap.config.Constants; import org.onap.config.NonConfigResource; import org.onap.config.api.Config; -import org.onap.config.api.ConfigurationChangeListener; import org.onap.config.api.Hint; public class ConfigurationImpl implements org.onap.config.api.Configuration { @@ -44,8 +43,6 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { private static boolean instantiated = false; - ConfigurationChangeNotifier changeNotifier; - public ConfigurationImpl() throws Exception { if (instantiated || !CliConfigurationImpl.class.isAssignableFrom(this.getClass())) { throw new RuntimeException("Illegal access to configuration."); @@ -126,15 +123,14 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } } instantiated = true; - changeNotifier = new ConfigurationChangeNotifier(moduleConfigStore); } private void populateFinalConfigurationIncrementally(Map configs) { - if (configs.get(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMETER + Constants.DB_NAMESPACE) != null) { + if (configs.get(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE) != null) { ConfigurationRepository.lookup().populateConfiguration( - Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMETER + Constants.DB_NAMESPACE, - configs.remove(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMETER + Constants.DB_NAMESPACE) + Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE, + configs.remove(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE) .getFinalConfiguration()); } @@ -188,43 +184,6 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } } - @Override - public void addConfigurationChangeListener(String tenant, String namespace, String key, - ConfigurationChangeListener myself) { - tenant = ConfigurationRepository.lookup().isValidTenant(tenant) ? tenant.toUpperCase() - : Constants.DEFAULT_TENANT; - namespace = ConfigurationRepository.lookup().isValidNamespace(namespace) ? namespace.toUpperCase() - : Constants.DEFAULT_NAMESPACE; - if (key == null || key.trim().length() == 0) { - throw new IllegalArgumentException(KEY_CANNOT_BE_NULL); - } - if (myself == null) { - throw new IllegalArgumentException("ConfigurationChangeListener instance is null."); - } - try { - changeNotifier.notifyChangesTowards(tenant, namespace, key, myself); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - @Override - public void removeConfigurationChangeListener(String tenant, String namespace, String key, - ConfigurationChangeListener myself) { - tenant = ConfigurationRepository.lookup().isValidTenant(tenant) ? tenant.toUpperCase() - : Constants.DEFAULT_TENANT; - namespace = ConfigurationRepository.lookup().isValidNamespace(namespace) ? namespace.toUpperCase() - : Constants.DEFAULT_NAMESPACE; - if (key == null || key.trim().length() == 0) { - throw new IllegalArgumentException(KEY_CANNOT_BE_NULL); - } - try { - changeNotifier.stopNotificationTowards(tenant, namespace, key, myself); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - @Override public Map populateMap(String tenantId, String namespace, String key, Class clazz) { if (tenantId == null || tenantId.trim().length() == 0) { @@ -574,16 +533,4 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } return collection; } - - public void shutdown() { - if (changeNotifier != null) { - try { - changeNotifier.shutdown(); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - } - - } diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java index 276dbe2805..132043d5b5 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java @@ -19,9 +19,7 @@ package org.onap.config.impl; import java.io.File; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; @@ -38,16 +36,7 @@ import org.onap.config.Constants; public final class ConfigurationRepository { - private static final ConfigurationRepository repo; - - private static final Set validCallers = Collections.unmodifiableSet(new HashSet<>( - Arrays.asList(ConfigurationChangeNotifier.NotificationData.class.getName(), - ConfigurationUtils.class.getName(), CliConfigurationImpl.class.getName(), - ConfigurationChangeNotifier.class.getName(), ConfigurationImpl.class.getName()))); - - static { - repo = new ConfigurationRepository(); - } + private static final ConfigurationRepository repo = new ConfigurationRepository(); private final Set tenants = new HashSet<>(); private final Set namespaces = new HashSet<>(); @@ -65,18 +54,12 @@ public final class ConfigurationRepository { }; private ConfigurationRepository() { - if (repo != null) { - throw new RuntimeException("Illegal access to configuration."); - } tenants.add(Constants.DEFAULT_TENANT); namespaces.add(Constants.DEFAULT_NAMESPACE); } public static ConfigurationRepository lookup() { - if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) { - return repo; - } - return null; + return repo; } public Set getTenants() { @@ -98,22 +81,22 @@ public final class ConfigurationRepository { public Configuration getConfigurationFor(String tenant, String namespace) throws Exception { ConfigurationHolder config; - String module = tenant + Constants.KEY_ELEMENTS_DELIMETER + namespace; + String module = tenant + Constants.KEY_ELEMENTS_DELIMITER + namespace; config = store.get(module); if (config == null) { config = new ConfigurationHolder(new BasicConfigurationBuilder<>(AgglomerateConfiguration.class)); store.put(module, config); } - return config.getConfiguration(tenant + Constants.KEY_ELEMENTS_DELIMETER + namespace); + return config.getConfiguration(tenant + Constants.KEY_ELEMENTS_DELIMITER + namespace); } public void populateConfiguration(String key, Configuration builder) { store.put(key, new ConfigurationHolder(builder)); - populateTenantsNamespace(key, false); + populateTenantsNamespace(key); } - private void populateTenantsNamespace(String key, boolean sourcedFromDb) { - String[] array = key.split(Constants.KEY_ELEMENTS_DELIMETER); + private void populateTenantsNamespace(String key) { + String[] array = key.split(Constants.KEY_ELEMENTS_DELIMITER); if (!array[1].equalsIgnoreCase(Constants.DB_NAMESPACE)) { tenants.add(array[0]); namespaces.add(array[1]); @@ -127,7 +110,7 @@ public final class ConfigurationRepository { store.put(key, holder); } holder.addOverrideConfiguration(file.getAbsolutePath(), ConfigurationUtils.getConfigurationBuilder(file, true)); - populateTenantsNamespace(key, true); + populateTenantsNamespace(key); } public void refreshOverrideConfigurationFor(String key, int index) { @@ -207,6 +190,7 @@ public final class ConfigurationRepository { } public Configuration getConfiguration(String namespace) throws Exception { + if (config == null) { config = builder.getConfiguration(); lastConfigurationBuildTime = new Timestamp(System.currentTimeMillis()); @@ -216,9 +200,11 @@ public final class ConfigurationRepository { .getInt("config.refresh.interval")) { lastConfigurationBuildTime = new Timestamp(System.currentTimeMillis()); } + if (composite == null && overrideConfiguration.size() != 0) { composite = getEffectiveConfiguration(config, overrideConfiguration.values()); } + return overrideConfiguration.size() == 0 ? config : composite; } } diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/type/ConfigurationUpdate.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/type/ConfigurationUpdate.java deleted file mode 100644 index f14b4ec3a6..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/type/ConfigurationUpdate.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2016-2018 European Support Limited - * - * Licensed 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.onap.config.type; - -public class ConfigurationUpdate extends ConfigurationQuery { - - private String value; - private boolean nodeOverride; - - public ConfigurationUpdate value(String val) { - value = val; - return this; - } - - public ConfigurationUpdate nodeOverride(boolean val) { - nodeOverride = val; - return this; - } - - public String getValue() { - if (value != null && value.split(",").length > 1 && !value.matches("^\\[.*\\]$")) { - return "[" + value + "]"; - } - return value; - } - - public boolean isNodeOverride() { - return nodeOverride; - } - -} diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/resources/config-system.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/resources/config-system.properties index f8222a3e0c..785b0f94cc 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/resources/config-system.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/resources/config-system.properties @@ -1,3 +1,2 @@ config.size.max=100 -config.refresh.interval=30000 -event.fetch.delay=5000 \ No newline at end of file +config.refresh.interval=30000 \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/LoadOrderConfiguration/config.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/LoadOrderConfiguration/config.properties index abab7891ca..bcc44a7ddd 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/LoadOrderConfiguration/config.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/LoadOrderConfiguration/config.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=14 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.supportedEncryption=MD5 diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config-NS.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config-NS.properties deleted file mode 100644 index 87e98be115..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config-NS.properties +++ /dev/null @@ -1,13 +0,0 @@ -artifact.name.maxlength=14 -artifact.extension=pdf, zip, xml -artifact.supportedEncryption=Base64 -artifact.supportedEncryption=MD5 -artifact.name.allowedChar=a-zA-Z -artifact.name.allowedchar=a-zA-Z -artifact.status=deleted -artifact.status=Deleted -artifact.persistLocation=/opt/spool, ${sys:user.home}/asdc -artifact.jsonSchema=@GeneratorsList.json -artifact.xmlSchema=@${env:PATH}/myschema.json -artifact.consumerAPPC=${artifact.consumer} -_config.namespace=UnregisterNotification \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.json b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.json deleted file mode 100644 index 998bba0e34..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "artifact": { - "name": { - "minlength": "6" - }, - "extension": "pdf,tgz,xls" - }, - "_config": { - "mergeStrategy": "union", - "namespace": "UnregisterNotification" - } -} \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.properties deleted file mode 100644 index 4daad19dcc..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.properties +++ /dev/null @@ -1,3 +0,0 @@ -maxCachedBufferSize=1024 -artifact.maxsize=1024 -artifact.name.maxlength=28 \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.xml b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.xml deleted file mode 100644 index 7f929af1bd..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - 28 - - gz,tgz - Base64 - deleted - - true - - - <_config> - UnregisterNotification - merge - - \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.yaml b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.yaml deleted file mode 100644 index 1deb37ac7a..0000000000 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/UnregisterNotification/config.yaml +++ /dev/null @@ -1,9 +0,0 @@ - - artifact: - name: - allowedChar: "a-zA-Z_0-9" - encoded: true - consumer: "appc,catalog" - _config: - mergeStrategy: "override" - namespace: "UnregisterNotification" \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/XMLConfiguration/config.xml b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/XMLConfiguration/config.xml index 10c7c20620..d1441ef0a9 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/XMLConfiguration/config.xml +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/XMLConfiguration/config.xml @@ -6,7 +6,6 @@ a-zA-Z a-zA-Z - pdf zip,xml diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/YAMLConfiguration/config.yaml b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/YAMLConfiguration/config.yaml index f483f36734..b28066c78a 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/YAMLConfiguration/config.yaml +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/YAMLConfiguration/config.yaml @@ -3,7 +3,6 @@ artifact: maxlength: 14 allowedChar: "a-zA-Z" allowedchar: "a-zA-Z" - #maxsize: "" extension: - pdf diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/config-system.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/config-system.properties index f8222a3e0c..785b0f94cc 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/config-system.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/config-system.properties @@ -1,3 +1,2 @@ config.size.max=100 -config.refresh.interval=30000 -event.fetch.delay=5000 \ No newline at end of file +config.refresh.interval=30000 \ No newline at end of file diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/fallback/config-fallback.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/fallback/config-fallback.properties index 0cd81fd212..803403ee82 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/fallback/config-fallback.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/fallback/config-fallback.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=14 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.supportedEncryption=MD5 diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/java-properties/config.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/java-properties/config.properties index 7d6c84b2e9..2f0b132de9 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/java-properties/config.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/java-properties/config.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=14 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.supportedEncryption=MD5 diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-at.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-at.properties index 0c484a640b..6cc0cfbc19 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-at.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-at.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=20 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.name.allowedChar=a-zA-Z diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-tf.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-tf.properties index d39e688f4c..9abab7446d 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-tf.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-tf.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=30 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.name.allowedChar=a-zA-Z diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-vf.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-vf.properties index 3fc228ed16..3ac9aeda84 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-vf.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config-vf.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=24 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.name.allowedChar=a-zA-Z diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config.properties b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config.properties index cafafccb0a..db64ba7b66 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config.properties +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/resources/multitenancy/config.properties @@ -1,5 +1,4 @@ artifact.name.maxlength=14 -#artifact.maxsize= artifact.extension=pdf, zip, xml artifact.supportedEncryption=Base64 artifact.name.allowedChar=a-zA-Z -- cgit 1.2.3-korg