Skip to content

Package: AbstractKapuaSetting

AbstractKapuaSetting

nameinstructionbranchcomplexitylinemethod
AbstractKapuaSetting(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
createCompositeSource(String)
M: 49 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 15 C: 0
0%
M: 1 C: 0
0%
lambda$loadConfigResources$0(File, String)
M: 8 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
loadConfigResource(CompositeConfiguration, String)
M: 30 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 8 C: 0
0%
M: 1 C: 0
0%
loadConfigResources(CompositeConfiguration, String)
M: 96 C: 0
0%
M: 14 C: 0
0%
M: 8 C: 0
0%
M: 16 C: 0
0%
M: 1 C: 0
0%
static {...}
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2016, 2022 Eurotech and/or its affiliates and others
3: *
4: * This program and the accompanying materials are made
5: * available under the terms of the Eclipse Public License 2.0
6: * which is available at https://www.eclipse.org/legal/epl-2.0/
7: *
8: * SPDX-License-Identifier: EPL-2.0
9: *
10: * Contributors:
11: * Eurotech - initial API and implementation
12: * Red Hat Inc
13: *******************************************************************************/
14: package org.eclipse.kapua.commons.setting;
15:
16: import org.apache.commons.configuration.CompositeConfiguration;
17: import org.apache.commons.configuration.ConfigurationException;
18: import org.apache.commons.configuration.DataConfiguration;
19: import org.apache.commons.configuration.EnvironmentConfiguration;
20: import org.apache.commons.configuration.PropertiesConfiguration;
21: import org.apache.commons.configuration.SystemConfiguration;
22: import org.eclipse.kapua.commons.util.KapuaFileUtils;
23: import org.slf4j.Logger;
24: import org.slf4j.LoggerFactory;
25:
26: import java.io.File;
27: import java.net.URL;
28:
29: /**
30: * Setting reference abstract implementation.
31: *
32: * @param <K> Setting key type
33: * @since 1.0.0
34: */
35: public abstract class AbstractKapuaSetting<K extends SettingKey> extends AbstractBaseKapuaSetting<K> {
36:
37: private static final Logger LOG = LoggerFactory.getLogger(AbstractKapuaSetting.class);
38:
39: private static final String EXTERNAL_CONFIG_URL_PARAM = "kapua.config.url";
40: private static final String EXTERNAL_CONFIG_DIR_PARAM = "kapua.config.dir";
41:
42: /**
43: * Constructor.
44: *
45: * @param configResourceName
46: * @since 1.0.0
47: */
48: protected AbstractKapuaSetting(String configResourceName) {
49: super(createCompositeSource(configResourceName));
50: }
51:
52: private static DataConfiguration createCompositeSource(String configResourceName) throws ExceptionInInitializerError {
53: CompositeConfiguration compositeConfig = new EnvFriendlyConfiguration();
54: compositeConfig.addConfiguration(new SystemConfiguration());
55: compositeConfig.addConfiguration(new EnvironmentConfiguration());
56:
57: try {
58: // External configuration file loading
59: String externalConfigResourceUrl = System.getProperty(EXTERNAL_CONFIG_URL_PARAM);
60:• if (externalConfigResourceUrl != null) {
61: loadConfigResource(compositeConfig, externalConfigResourceUrl);
62: }
63:
64: // External configuration directory loading
65: String externalConfigResourceDir = System.getProperty(EXTERNAL_CONFIG_DIR_PARAM);
66:• if (externalConfigResourceDir != null) {
67: loadConfigResources(compositeConfig, externalConfigResourceDir);
68: }
69:
70: // Default configuration file loading
71: loadConfigResource(compositeConfig, configResourceName);
72: } catch (Exception e) {
73: LOG.error("Error loading PropertiesConfiguration", e);
74: throw new ExceptionInInitializerError(e);
75: }
76:
77: return new DataConfiguration(compositeConfig);
78: }
79:
80: /**
81: * Search the configuration resources in the given directory name and loads them into the given {@link CompositeConfiguration} parameter.<br>
82: * If the given directory name refer to a file or a not existing directory an error will be thrown.
83: * If the directory exists and it is empty, no error will be thrown.
84: * Note that this can only work with local files.
85: *
86: * @param compositeConfig The {@link CompositeConfiguration} where load the resources.
87: * @param configResourceDirName The directory path to scan.
88: * @throws KapuaSettingException When directory is not found, or loading them causes an exception.
89: * @see #loadConfigResource(CompositeConfiguration, String)
90: * @since 1.0.0
91: */
92: private static void loadConfigResources(CompositeConfiguration compositeConfig, String configResourceDirName) throws KapuaSettingException {
93:
94:• if (!configResourceDirName.endsWith("/")) {
95: configResourceDirName = configResourceDirName.concat("/");
96: }
97:
98: File configsDir = new File(configResourceDirName);
99:• if (configsDir.exists() || configsDir.isDirectory()) {
100: // Exclude hidden files
101:• String[] configFileNames = configsDir.list((dir, name) -> !name.startsWith("."));
102:
103:• if (configFileNames != null && configFileNames.length > 0) {
104:• for (String configFileName : configFileNames) {
105:
106: String fileFullPath = String.join("", "file://", configResourceDirName, configFileName);
107:
108: // Ignore files that aren't named '*.properties'
109:• if (fileFullPath.endsWith(".properties")) {
110: loadConfigResource(compositeConfig, fileFullPath);
111: } else {
112: LOG.warn("Ignored file: '{}'", fileFullPath);
113: }
114: }
115: } else {
116: LOG.warn("Empty config directory: '{}'", configResourceDirName);
117: }
118: } else {
119: LOG.error("Unable to locate directory: '{}'", configResourceDirName);
120: throw new KapuaSettingException(KapuaSettingErrorCodes.RESOURCE_NOT_FOUND, null, configResourceDirName);
121: }
122: }
123:
124: /**
125: * Search the configuration resource name and loads it into the given {@link CompositeConfiguration} parameter.<br>
126: * It can handle resources on the class path and file in the file system (prefixed by 'file://')
127: * or file over HTTP/HTTPS (prefixed by 'http://'|'https://')
128: *
129: * @param compositeConfig The {@link CompositeConfiguration} where load the given resource.
130: * @param configResourceName The resource name to search and load.
131: * @throws KapuaSettingException When error occurs while loading setting resource.
132: * @since 1.0.0
133: */
134: private static void loadConfigResource(CompositeConfiguration compositeConfig, String configResourceName) throws KapuaSettingException {
135:
136: URL configUrl = null;
137: try {
138: configUrl = KapuaFileUtils.getAsURL(configResourceName);
139:
140: compositeConfig.addConfiguration(new PropertiesConfiguration(configUrl));
141: LOG.debug("Loaded configuration resource: '{}'", configResourceName);
142: } catch (ConfigurationException ce) {
143: throw new KapuaSettingException(KapuaSettingErrorCodes.INVALID_RESOURCE_FILE, ce, configUrl);
144: }
145: }
146: }