2 * ========================LICENSE_START=================================
5 * Copyright (C) 2019 Nordix Foundation
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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===================================
21 package org.oransc.policyagent.configuration;
23 import java.util.Collection;
24 import java.util.HashMap;
26 import java.util.Optional;
27 import java.util.Vector;
29 import javax.validation.constraints.NotEmpty;
30 import javax.validation.constraints.NotNull;
32 import org.oransc.policyagent.exceptions.ServiceException;
33 import org.springframework.beans.factory.annotation.Autowired;
34 import org.springframework.boot.context.properties.ConfigurationProperties;
35 import org.springframework.boot.context.properties.EnableConfigurationProperties;
37 @EnableConfigurationProperties
38 @ConfigurationProperties("app")
39 public class ApplicationConfig {
41 private String filepath;
43 private Collection<Observer> observers = new Vector<>();
44 private Map<String, RicConfig> ricConfigs = new HashMap<>();
47 public ApplicationConfig() {
50 public String getLocalConfigurationFilePath() {
54 public synchronized void setFilepath(String filepath) {
55 this.filepath = filepath;
58 public synchronized Collection<RicConfig> getRicConfigs() {
59 return this.ricConfigs.values();
62 public synchronized Optional<RicConfig> lookupRicConfigForManagedElement(String managedElementId) {
63 for (RicConfig ricConfig : getRicConfigs()) {
64 if (ricConfig.managedElementIds().contains(managedElementId)) {
65 return Optional.of(ricConfig);
68 return Optional.empty();
71 public RicConfig getRic(String ricName) throws ServiceException {
72 for (RicConfig ricConfig : getRicConfigs()) {
73 if (ricConfig.name().equals(ricName)) {
77 throw new ServiceException("Could not find ric: " + ricName);
80 public static enum RicConfigUpdate {
81 ADDED, CHANGED, REMOVED
84 public interface Observer {
85 void onRicConfigUpdate(RicConfig ric, RicConfigUpdate event);
88 public void addObserver(Observer o) {
89 this.observers.add(o);
92 private class Notification {
94 final RicConfigUpdate event;
96 Notification(RicConfig ric, RicConfigUpdate event) {
102 public void setConfiguration(@NotNull Collection<RicConfig> ricConfigs) {
103 Collection<Notification> notifications = new Vector<>();
104 synchronized (this) {
105 Map<String, RicConfig> newRicConfigs = new HashMap<>();
106 for (RicConfig newConfig : ricConfigs) {
107 RicConfig oldConfig = this.ricConfigs.get(newConfig.name());
108 if (oldConfig == null) {
109 newRicConfigs.put(newConfig.name(), newConfig);
110 notifications.add(new Notification(newConfig, RicConfigUpdate.ADDED));
111 this.ricConfigs.remove(newConfig.name());
112 } else if (!newConfig.equals(newConfig)) {
113 notifications.add(new Notification(newConfig, RicConfigUpdate.CHANGED));
114 newRicConfigs.put(newConfig.name(), newConfig);
115 this.ricConfigs.remove(newConfig.name());
117 newRicConfigs.put(oldConfig.name(), oldConfig);
120 for (RicConfig deletedConfig : this.ricConfigs.values()) {
121 notifications.add(new Notification(deletedConfig, RicConfigUpdate.REMOVED));
123 this.ricConfigs = newRicConfigs;
125 notifyObservers(notifications);
128 private void notifyObservers(Collection<Notification> notifications) {
129 for (Observer observer : this.observers) {
130 for (Notification notif : notifications) {
131 observer.onRicConfigUpdate(notif.ric, notif.event);