import org.oransc.policyagent.exceptions.ServiceException;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import reactor.core.publisher.Flux;
@EnableConfigurationProperties
@ConfigurationProperties("app")
@NotEmpty
private String a1ControllerPassword;
- private Collection<Observer> observers = new ArrayList<>();
private Map<String, RicConfig> ricConfigs = new HashMap<>();
@Getter
private Properties dmaapPublisherConfig;
return this.filepath;
}
- public String getA1ControllerBaseUrl() {
+ public synchronized String getA1ControllerBaseUrl() {
return this.a1ControllerBaseUrl;
}
- public String getA1ControllerUsername() {
+ public synchronized String getA1ControllerUsername() {
return this.a1ControllerUsername;
}
- public String getA1ControllerPassword() {
+ public synchronized String getA1ControllerPassword() {
return this.a1ControllerPassword;
}
throw new ServiceException("Could not find ric: " + ricName);
}
- public enum RicConfigUpdate {
- ADDED, CHANGED, REMOVED
- }
-
- public interface Observer {
- void onRicConfigUpdate(RicConfig ric, RicConfigUpdate event);
- }
-
- public void addObserver(Observer o) {
- this.observers.add(o);
- }
+ public static class RicConfigUpdate {
+ public enum Type {
+ ADDED, CHANGED, REMOVED
+ }
- private class Notification {
- final RicConfig ric;
- final RicConfigUpdate event;
+ @Getter
+ private final RicConfig ricConfig;
+ @Getter
+ private final Type type;
- Notification(RicConfig ric, RicConfigUpdate event) {
- this.ric = ric;
- this.event = event;
+ RicConfigUpdate(RicConfig ric, Type event) {
+ this.ricConfig = ric;
+ this.type = event;
}
}
- public void setConfiguration(@NotNull Collection<RicConfig> ricConfigs, Properties dmaapPublisherConfig,
- Properties dmaapConsumerConfig) {
-
- Collection<Notification> notifications = new ArrayList<>();
- synchronized (this) {
- 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);
- notifications.add(new Notification(newConfig, RicConfigUpdate.ADDED));
- this.ricConfigs.remove(newConfig.name());
- } else if (!newConfig.equals(oldConfig)) {
- notifications.add(new Notification(newConfig, RicConfigUpdate.CHANGED));
- newRicConfigs.put(newConfig.name(), newConfig);
- this.ricConfigs.remove(newConfig.name());
- } else {
- newRicConfigs.put(oldConfig.name(), oldConfig);
- }
+ 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()) {
- notifications.add(new Notification(deletedConfig, RicConfigUpdate.REMOVED));
- }
- this.ricConfigs = newRicConfigs;
}
-
- notifyObservers(notifications);
- }
-
- private void notifyObservers(Collection<Notification> notifications) {
- for (Observer observer : this.observers) {
- for (Notification notif : notifications) {
- observer.onRicConfigUpdate(notif.ric, notif.event);
- }
+ for (RicConfig deletedConfig : this.ricConfigs.values()) {
+ modifications.add(new RicConfigUpdate(deletedConfig, RicConfigUpdate.Type.REMOVED));
}
+ this.ricConfigs = newRicConfigs;
+
+ return Flux.fromIterable(modifications);
}
}