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 reactor.core.publisher.Mono;
+import reactor.core.publisher.Flux;
@EnableConfigurationProperties
@ConfigurationProperties("app")
public class ApplicationConfig {
- private static final Logger logger = LoggerFactory.getLogger(ApplicationConfig.class);
-
- @Value("#{systemEnvironment}")
- Properties systemEnvironment;
-
@NotEmpty
private String filepath;
- private Vector<RicConfig> ricConfigs;
+ private Map<String, RicConfig> ricConfigs = new HashMap<>();
+ @Getter
+ private Properties dmaapPublisherConfig;
+ @Getter
+ private Properties dmaapConsumerConfig;
- @Autowired
- public ApplicationConfig() {
+ private Map<String, ControllerConfig> controllerConfigs = new HashMap<>();
+
+ public String getLocalConfigurationFilePath() {
+ return this.filepath;
}
+ /*
+ * Do not remove, used by framework!
+ */
public synchronized void setFilepath(String filepath) {
this.filepath = filepath;
}
- public Vector<RicConfig> getRicConfigs() {
- return this.ricConfigs;
+ public synchronized Collection<RicConfig> getRicConfigs() {
+ return this.ricConfigs.values();
}
- public Optional<RicConfig> lookupRicConfigForManagedElement(String managedElementId) {
- for (RicConfig ricConfig : getRicConfigs()) {
- if (ricConfig.managedElementIds().contains(managedElementId)) {
- return Optional.of(ricConfig);
- }
+ public synchronized ControllerConfig getControllerConfig(String name) throws ServiceException {
+ ControllerConfig controllerConfig = this.controllerConfigs.get(name);
+ if (controllerConfig == null) {
+ throw new ServiceException("Could not find controller config: " + name);
}
- return Optional.empty();
+ return controllerConfig;
}
- public RicConfig getRic(String ricName) throws ServiceException {
- for (RicConfig ricConfig : getRicConfigs()) {
- if (ricConfig.name().equals(ricName)) {
- return ricConfig;
- }
+ public synchronized RicConfig getRic(String ricName) throws ServiceException {
+ RicConfig ricConfig = this.ricConfigs.get(ricName);
+ if (ricConfig == null) {
+ throw new ServiceException("Could not find ric configuration: " + ricName);
}
- throw new ServiceException("Could not find ric: " + ricName);
+ return ricConfig;
}
- public void initialize() {
- loadConfigurationFromFile(this.filepath);
- }
+ public static class RicConfigUpdate {
+ public enum Type {
+ ADDED, CHANGED, REMOVED
+ }
- Mono<Environment.Variables> getEnvironment(Properties systemEnvironment) {
- return Environment.readEnvironmentVariables(systemEnvironment);
- }
+ @Getter
+ private final RicConfig ricConfig;
+ @Getter
+ private final Type type;
- /**
- * Reads the configuration from file.
- */
- protected void loadConfigurationFromFile(String filepath) {
- 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");
- }
- 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);
+ RicConfigUpdate(RicConfig ric, Type event) {
+ this.ricConfig = ric;
+ this.type = event;
}
}
- JsonElement getJsonElement(JsonParser parser, InputStream inputStream) {
- return parser.parse(new InputStreamReader(inputStream));
- }
+ public synchronized Flux<RicConfigUpdate> setConfiguration(
+ ApplicationConfigParser.ConfigParserResult parserResult) {
+
+ Collection<RicConfigUpdate> modifications = new ArrayList<>();
+ this.dmaapPublisherConfig = parserResult.dmaapPublisherConfig();
+ this.dmaapConsumerConfig = parserResult.dmaapConsumerConfig();
+ this.controllerConfigs = parserResult.controllerConfigs();
+
+ Map<String, RicConfig> newRicConfigs = new HashMap<>();
+ for (RicConfig newConfig : parserResult.ricConfigs()) {
+ RicConfig oldConfig = this.ricConfigs.get(newConfig.name());
+ this.ricConfigs.remove(newConfig.name());
+ if (oldConfig == null) {
+ newRicConfigs.put(newConfig.name(), newConfig);
+ modifications.add(new RicConfigUpdate(newConfig, RicConfigUpdate.Type.ADDED));
+ } else if (!newConfig.equals(oldConfig)) {
+ modifications.add(new RicConfigUpdate(newConfig, RicConfigUpdate.Type.CHANGED));
+ newRicConfigs.put(newConfig.name(), newConfig);
+ } else {
+ newRicConfigs.put(oldConfig.name(), oldConfig);
+ }
+ }
+ for (RicConfig deletedConfig : this.ricConfigs.values()) {
+ modifications.add(new RicConfigUpdate(deletedConfig, RicConfigUpdate.Type.REMOVED));
+ }
+ this.ricConfigs = newRicConfigs;
- InputStream createInputStream(@NotNull String filepath) throws IOException {
- return new BufferedInputStream(new FileInputStream(filepath));
+ return Flux.fromIterable(modifications);
}
-
}