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.Properties;
27 import java.util.Vector;
29 import javax.validation.constraints.NotEmpty;
30 import javax.validation.constraints.NotNull;
34 import org.oransc.policyagent.exceptions.ServiceException;
35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.boot.context.properties.ConfigurationProperties;
37 import org.springframework.boot.context.properties.EnableConfigurationProperties;
39 @EnableConfigurationProperties
40 @ConfigurationProperties("app")
41 public class ApplicationConfig {
43 private String filepath;
45 private Collection<Observer> observers = new Vector<>();
46 private Map<String, RicConfig> ricConfigs = new HashMap<>();
48 private Properties dmaapPublisherConfig;
50 private Properties dmaapConsumerConfig;
53 public ApplicationConfig() {
56 public String getLocalConfigurationFilePath() {
61 * Do not remove, used by framework!
63 public synchronized void setFilepath(String filepath) {
64 this.filepath = filepath;
67 public synchronized Collection<RicConfig> getRicConfigs() {
68 return this.ricConfigs.values();
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, Properties dmaapPublisherConfig,
103 Properties dmaapConsumerConfig) {
104 Collection<Notification> notifications = new Vector<>();
105 synchronized (this) {
106 Map<String, RicConfig> newRicConfigs = new HashMap<>();
107 for (RicConfig newConfig : ricConfigs) {
108 RicConfig oldConfig = this.ricConfigs.get(newConfig.name());
109 if (oldConfig == null) {
110 newRicConfigs.put(newConfig.name(), newConfig);
111 notifications.add(new Notification(newConfig, RicConfigUpdate.ADDED));
112 this.ricConfigs.remove(newConfig.name());
113 } else if (!newConfig.equals(newConfig)) {
114 notifications.add(new Notification(newConfig, RicConfigUpdate.CHANGED));
115 newRicConfigs.put(newConfig.name(), newConfig);
116 this.ricConfigs.remove(newConfig.name());
118 newRicConfigs.put(oldConfig.name(), oldConfig);
121 for (RicConfig deletedConfig : this.ricConfigs.values()) {
122 notifications.add(new Notification(deletedConfig, RicConfigUpdate.REMOVED));
124 this.ricConfigs = newRicConfigs;
126 notifyObservers(notifications);
128 this.dmaapPublisherConfig = dmaapPublisherConfig;
129 this.dmaapConsumerConfig = dmaapConsumerConfig;
132 private void notifyObservers(Collection<Notification> notifications) {
133 for (Observer observer : this.observers) {
134 for (Notification notif : notifications) {
135 observer.onRicConfigUpdate(notif.ric, notif.event);