24308851f283e621bbd6762cbc04eea8397ba4c1
[ccsdk/sli/adaptors.git] / saltstack-adapter / saltstack-adapter-provider / src / main / java / org / onap / ccsdk / sli / adaptors / saltstack / impl / SaltstackAdapterPropertiesProviderImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * onap
4  * ================================================================================
5  * Copyright (C) 2016 - 2017 ONAP
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.ccsdk.sli.adaptors.saltstack.impl;
22
23 import java.io.File;
24 import java.io.FileInputStream;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.util.Optional;
28 import java.util.Properties;
29 import java.util.Vector;
30 import org.onap.ccsdk.sli.adaptors.saltstack.SaltstackAdapterPropertiesProvider;
31 import org.onap.ccsdk.sli.core.sli.ConfigurationException;
32 import org.onap.ccsdk.sli.core.utils.JREFileResolver;
33 import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver;
34 import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver;
35 import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver;
36 import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 /**
41  * Responsible for determining the properties file to use and instantiating the
42  * <code>SqlResource</code> Service. The priority for properties file
43  * resolution is as follows:
44  *
45  * <ol>
46  * <li>A directory identified by the system environment variable
47  * <code>SDNC_CONFIG_DIR</code></li>
48  * <li>The default directory <code>DEFAULT_DBLIB_PROP_DIR</code></li>
49  * <li>A directory identified by the JRE argument
50  * <code>sql-resource.properties</code></li>
51  * <li>A <code>sql-resource.properties</code> file located in the karaf root
52  * directory</li>
53  * </ol>
54  */
55 public class SaltstackAdapterPropertiesProviderImpl implements SaltstackAdapterPropertiesProvider {
56
57     private static final Logger LOG = LoggerFactory.getLogger(SaltstackAdapterPropertiesProviderImpl.class);
58
59     /**
60      * The name of the properties file for database configuration
61      */
62     private static final String SALTSTACKADAPTER_PROP_FILE_NAME = "saltstack-adapter.properties";
63
64     /**
65      * A prioritized list of strategies for resolving sql-resource properties files.
66      */
67     private Vector<PropertiesFileResolver> saltstackAdapterPropertiesFileResolvers = new Vector<>();
68
69     /**
70      * The configuration properties for the db connection.
71      */
72     private Properties properties;
73
74     /**
75      * Set up the prioritized list of strategies for resolving dblib properties
76      * files.
77      */
78     public SaltstackAdapterPropertiesProviderImpl() {
79         saltstackAdapterPropertiesFileResolvers
80                 .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable"));
81         saltstackAdapterPropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory"));
82
83         saltstackAdapterPropertiesFileResolvers.add(
84                 new JREFileResolver("Using property file (3) from JRE argument", SaltstackAdapterPropertiesProviderImpl.class));
85         saltstackAdapterPropertiesFileResolvers.add(new KarafRootFileResolver("Using property file (4) from karaf root", this));
86
87         // determines properties file as according to the priority described in the
88         // class header comment
89         final File propertiesFile = determinePropertiesFile(this);
90         if (propertiesFile != null) {
91             try (FileInputStream fileInputStream = new FileInputStream(propertiesFile)) {
92                 properties = new Properties();
93                 properties.load(fileInputStream);
94             } catch (final IOException e) {
95                 LOG.error("Failed to load properties for file: {}", propertiesFile.toString(),
96                         new ConfigurationException("Failed to load properties for file: " + propertiesFile.toString(),
97                                 e));
98             }
99         } else {
100             // Try to read properties as resource
101
102             InputStream propStr = getClass().getResourceAsStream("/" + SALTSTACKADAPTER_PROP_FILE_NAME);
103             if (propStr != null) {
104                 properties = new Properties();
105                 try {
106                     properties.load(propStr);
107                     propStr.close();
108                 } catch (IOException e) {
109                     properties = null;
110                 }
111             }
112
113         }
114
115         if (properties == null) {
116             reportFailure("Missing configuration properties resource(3)", new ConfigurationException(
117                     "Missing configuration properties resource(3): " + SALTSTACKADAPTER_PROP_FILE_NAME));
118
119             LOG.info("Defaulting org.onap.appc.adapter.saltstack.clientType to NONE");
120
121             properties = new Properties();
122             properties.setProperty("org.onap.appc.adapter.saltstack.clientType", "NONE");
123         }
124     }
125
126     /**
127      * Extract svclogic config properties.
128      *
129      * @return the svclogic config properties
130      */
131     public Properties getProperties() {
132         return properties;
133     }
134
135     /**
136      * Reports the method chosen for properties resolution to the
137      * <code>Logger</code>.
138      *
139      * @param message
140      *            Some user friendly message
141      * @param fileOptional
142      *            The file location of the chosen properties file
143      * @return the file location of the chosen properties file
144      */
145     private static File reportSuccess(final String message, final Optional<File> fileOptional) {
146         if (fileOptional.isPresent()) {
147             final File file = fileOptional.get();
148             LOG.info("{} {}", message, file.getPath());
149             return file;
150         }
151         return null;
152     }
153
154     /**
155      * Reports fatal errors. This is the case in which no properties file could be
156      * found.
157      *
158      * @param message
159      *            An appropriate fatal error message
160      * @param configurationException
161      *            An exception describing what went wrong during resolution
162      */
163     private static void reportFailure(final String message, final ConfigurationException configurationException) {
164
165         LOG.error("{}", message, configurationException);
166     }
167
168     /**
169      * Determines the sql-resource properties file to use based on the following priority:
170      * <ol>
171      * <li>A directory identified by the system environment variable
172      * <code>SDNC_CONFIG_DIR</code></li>
173      * <li>The default directory <code>DEFAULT_DBLIB_PROP_DIR</code></li>
174      * <li>A directory identified by the JRE argument
175      * <code>sql-resource.properties</code></li>
176      * <li>A <code>sql-resource.properties</code> file located in the karaf root
177      * directory</li>
178      * </ol>
179      */
180     File determinePropertiesFile(final SaltstackAdapterPropertiesProviderImpl resourceProvider) {
181
182         for (final PropertiesFileResolver sliPropertiesFileResolver : saltstackAdapterPropertiesFileResolvers) {
183             final Optional<File> fileOptional = sliPropertiesFileResolver.resolveFile(SALTSTACKADAPTER_PROP_FILE_NAME);
184             if (fileOptional.isPresent()) {
185                 return reportSuccess(sliPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional);
186             }
187         }
188
189         return null;
190     }
191 }