aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authorShaabanEltanany <shaaban.eltanany.ext@orange.com>2020-10-12 15:10:17 +0200
committerShaabanEltanany <shaaban.eltanany.ext@orange.com>2020-10-12 16:34:18 +0200
commitf36e67c64667080c78a1d30f5aace683391d8a14 (patch)
tree7e3a7295952161cb0f1497dbde46f6564344a6e7 /docs
parentfeaa237cda579079b40f3014634387bf493cc2da (diff)
adding inputs and outputs attributes
Issue-ID: CCSDK-2874 Signed-off-by: ShaabanEltanany <shaaban.eltanany.ext@orange.com> Change-Id: I2135575105379be9dc464245ea3a74029d541baf
Diffstat (limited to 'docs')
0 files changed, 0 insertions, 0 deletions
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/*-
 * ============LICENSE_START=======================================================
 * org.onap.dcaegen2.collectors.ves
 * ================================================================================
 * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
 * Copyright (C) 2020 Nokia. All rights reserved.
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */
package org.onap.dcae.configuration;

import static io.vavr.API.Try;
import static org.onap.dcae.common.publishing.VavrUtils.enhanceError;
import static org.onap.dcae.common.publishing.VavrUtils.f;
import static org.onap.dcae.common.publishing.VavrUtils.logError;
import static org.onap.dcae.configuration.Conversions.toList;

import io.vavr.CheckedRunnable;
import io.vavr.Tuple2;
import io.vavr.collection.Map;
import io.vavr.control.Try;
import java.io.FileNotFoundException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class ConfigFilesFacade {

    private static final Logger log = LoggerFactory.getLogger(ConfigFilesFacade.class);

    private final Path dMaaPConfigPath;
    private final Path propertiesPath;

    ConfigFilesFacade(Path propertiesPath, Path dMaaPConfigPath) {
        this.propertiesPath = propertiesPath;
        this.dMaaPConfigPath = dMaaPConfigPath;
    }

    Try<Map<String, String>> readCollectorProperties() {
        log.info(f("Reading collector properties from path: '%s'", propertiesPath));
        return Try(this::readProperties)
            .map(prop -> toList(prop.getKeys()).toMap(k -> k, k -> (String) prop.getProperty(k)))
            .mapFailure(enhanceError("Unable to read properties configuration from path '%s'", propertiesPath))
            .onFailure(logError(log))
            .peek(props -> log.info(f("Read following collector properties: '%s'", props)));
    }

    Try<JSONObject> readDMaaPConfiguration() {
        log.info(f("Reading DMaaP configuration from file: '%s'", dMaaPConfigPath));
        return readFile(dMaaPConfigPath)
            .recover(FileNotFoundException.class, __ -> "{}")
            .mapFailure(enhanceError("Unable to read DMaaP configuration from file '%s'", dMaaPConfigPath))
            .flatMap(Conversions::toJson)
            .onFailure(logError(log))
            .peek(props -> log.info(f("Read following DMaaP properties: '%s'", props)));
    }

    Try<Void> writeDMaaPConfiguration(JSONObject dMaaPConfiguration) {
        log.info(f("Writing DMaaP configuration '%s' into file '%s'", dMaaPConfiguration, dMaaPConfigPath));
        return writeFile(dMaaPConfigPath, indentConfiguration(dMaaPConfiguration.toString()))
            .mapFailure(enhanceError("Could not save new DMaaP configuration to path '%s'", dMaaPConfigPath))
            .onFailure(logError(log))
            .peek(__ -> log.info("Written successfully"));
    }


    Try<Void> writeProperties(Map<String, String> properties) {
        log.info(f("Writing properties configuration '%s' into file '%s'", properties, propertiesPath));
        return Try.run(saveProperties(properties))
            .mapFailure(enhanceError("Could not save properties to path '%s'", properties))
            .onFailure(logError(log))
            .peek(__ -> log.info("Written successfully"));
    }

    private Try<String> readFile(Path path) {
        return Try(() -> new String(Files.readAllBytes(path), StandardCharsets.UTF_8))
            .mapFailure(enhanceError("Could not read content from path: '%s'", path));
    }

    private Try<Void> writeFile(Path path, String content) {
        return Try.run(() -> Files.write(path, content.getBytes()))
            .mapFailure(enhanceError("Could not write content to path: '%s'", path));
    }

    private PropertiesConfiguration readProperties() throws ConfigurationException {
        PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration();
        propertiesConfiguration.setDelimiterParsingDisabled(true);
        propertiesConfiguration.load(propertiesPath.toFile());
        return propertiesConfiguration;
    }

    private CheckedRunnable saveProperties(Map<String, String> properties) {
        return () -> {
            PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration(propertiesPath.toFile());
            propertiesConfiguration.setEncoding(null);
            for (Tuple2<String, String> property : properties) {
                updateProperty(propertiesConfiguration, property);
            }
            propertiesConfiguration.save();
        };
    }

    private void updateProperty(PropertiesConfiguration propertiesConfiguration, Tuple2<String, String> property) {
        if (propertiesConfiguration.containsKey(property._1)) {
            propertiesConfiguration.setProperty(property._1, property._2);
        } else {
            propertiesConfiguration.addProperty(property._1, property._2);
        }
    }

    private String indentConfiguration(String configuration) {
        return new JSONObject(configuration).toString(4);
    }
}