Simplified startup
[nonrtric.git] / policy-agent / src / main / java / org / oransc / policyagent / configuration / ApplicationConfig.java
index 79c82a7..3b4f810 100644 (file)
 
 package org.oransc.policyagent.configuration;
 
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gson.JsonSyntaxException;
-import com.google.gson.TypeAdapterFactory;
-
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Optional;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
-import java.util.ServiceLoader;
-import java.util.Vector;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
+import lombok.Getter;
+
 import org.oransc.policyagent.exceptions.ServiceException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.stereotype.Component;
-import reactor.core.publisher.Mono;
+import reactor.core.publisher.Flux;
 
-@Component
 @EnableConfigurationProperties
 @ConfigurationProperties("app")
 public class ApplicationConfig {
-    private static final Logger logger = LoggerFactory.getLogger(ApplicationConfig.class);
+    @NotEmpty
+    private String filepath;
+
+    @NotEmpty
+    private String a1ControllerBaseUrl;
 
-    @Value("#{systemEnvironment}")
-    Properties systemEnvironment;
+    @NotEmpty
+    private String a1ControllerUsername;
 
     @NotEmpty
-    private String filepath;
+    private String a1ControllerPassword;
 
-    private Vector<RicConfig> ricConfigs;
+    private Map<String, RicConfig> ricConfigs = new HashMap<>();
+    @Getter
+    private Properties dmaapPublisherConfig;
+    @Getter
+    private Properties dmaapConsumerConfig;
 
-    @Autowired
-    public ApplicationConfig() {
+    public String getLocalConfigurationFilePath() {
+        return this.filepath;
     }
 
+    public synchronized String getA1ControllerBaseUrl() {
+        return this.a1ControllerBaseUrl;
+    }
+
+    public synchronized String getA1ControllerUsername() {
+        return this.a1ControllerUsername;
+    }
+
+    public synchronized String getA1ControllerPassword() {
+        return this.a1ControllerPassword;
+    }
+
+    /*
+     * Do not remove, used by framework!
+     */
     public synchronized void setFilepath(String filepath) {
         this.filepath = filepath;
     }
 
-    public Vector<RicConfig> getRicConfigs() {
-        return this.ricConfigs;
+    public synchronized void setA1ControllerBaseUrl(String a1ControllerBaseUrl) {
+        this.a1ControllerBaseUrl = a1ControllerBaseUrl;
     }
 
-    public Optional<RicConfig> getRicConfig(String managedElementId) {
-        for (RicConfig ricConfig : getRicConfigs()) {
-            if (ricConfig.managedElementIds().contains(managedElementId)) {
-                return Optional.of(ricConfig);
-
-            }
-        }
-        return Optional.empty();
+    public synchronized void setA1ControllerUsername(String a1ControllerUsername) {
+        this.a1ControllerUsername = a1ControllerUsername;
     }
 
-    public void initialize() {
-        loadConfigurationFromFile();
+    public synchronized void setA1ControllerPassword(String a1ControllerPassword) {
+        this.a1ControllerPassword = a1ControllerPassword;
     }
 
-    Mono<Environment.Variables> getEnvironment(Properties systemEnvironment) {
-        return Environment.readEnvironmentVariables(systemEnvironment);
+    public synchronized Collection<RicConfig> getRicConfigs() {
+        return this.ricConfigs.values();
     }
 
-    /**
-     * Reads the configuration from file.
-     */
-    void loadConfigurationFromFile() {
-        GsonBuilder gsonBuilder = new GsonBuilder();
-        ServiceLoader.load(TypeAdapterFactory.class).forEach(gsonBuilder::registerTypeAdapterFactory);
-
-        try (InputStream inputStream = createInputStream(filepath)) {
-            JsonParser parser = new JsonParser();
-            JsonObject rootObject = getJsonElement(parser, inputStream).getAsJsonObject();
-            if (rootObject == null) {
-                throw new JsonSyntaxException("Root is not a json object");
+    public RicConfig getRic(String ricName) throws ServiceException {
+        for (RicConfig ricConfig : getRicConfigs()) {
+            if (ricConfig.name().equals(ricName)) {
+                return ricConfig;
             }
-            ApplicationConfigParser appParser = new ApplicationConfigParser();
-            appParser.parse(rootObject);
-            this.ricConfigs = appParser.getRicConfigs();
-            logger.info("Local configuration file loaded: {}", filepath);
-        } catch (JsonSyntaxException | ServiceException | IOException e) {
-            logger.trace("Local configuration file not loaded: {}", filepath, e);
         }
+        throw new ServiceException("Could not find ric: " + ricName);
     }
 
-    JsonElement getJsonElement(JsonParser parser, InputStream inputStream) {
-        return parser.parse(new InputStreamReader(inputStream));
-    }
+    public static class RicConfigUpdate {
+        public enum Type {
+            ADDED, CHANGED, REMOVED
+        }
 
-    InputStream createInputStream(@NotNull String filepath) throws IOException {
-        return new BufferedInputStream(new FileInputStream(filepath));
+        @Getter
+        private final RicConfig ricConfig;
+        @Getter
+        private final Type type;
+
+        RicConfigUpdate(RicConfig ric, Type event) {
+            this.ricConfig = ric;
+            this.type = event;
+        }
     }
 
+    public synchronized Flux<RicConfigUpdate> setConfiguration(@NotNull Collection<RicConfig> ricConfigs,
+        Properties dmaapPublisherConfig, Properties dmaapConsumerConfig) {
+
+        Collection<RicConfigUpdate> modifications = new ArrayList<>();
+        this.dmaapPublisherConfig = dmaapPublisherConfig;
+        this.dmaapConsumerConfig = dmaapConsumerConfig;
+
+        Map<String, RicConfig> newRicConfigs = new HashMap<>();
+        for (RicConfig newConfig : ricConfigs) {
+            RicConfig oldConfig = this.ricConfigs.get(newConfig.name());
+            if (oldConfig == null) {
+                newRicConfigs.put(newConfig.name(), newConfig);
+                modifications.add(new RicConfigUpdate(newConfig, RicConfigUpdate.Type.ADDED));
+                this.ricConfigs.remove(newConfig.name());
+            } else if (!newConfig.equals(oldConfig)) {
+                modifications.add(new RicConfigUpdate(newConfig, RicConfigUpdate.Type.CHANGED));
+                newRicConfigs.put(newConfig.name(), newConfig);
+                this.ricConfigs.remove(newConfig.name());
+            } else {
+                newRicConfigs.put(oldConfig.name(), oldConfig);
+            }
+        }
+        for (RicConfig deletedConfig : this.ricConfigs.values()) {
+            modifications.add(new RicConfigUpdate(deletedConfig, RicConfigUpdate.Type.REMOVED));
+        }
+        this.ricConfigs = newRicConfigs;
+
+        return Flux.fromIterable(modifications);
+    }
 }