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;
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<>();
45 private Properties dmaapPublisherConfig;
46 private Properties dmaapConsumerConfig;
49 public ApplicationConfig() {
52 public String getLocalConfigurationFilePath() {
57 * Do not remove, used by framework!
59 public synchronized void setFilepath(String filepath) {
60 this.filepath = filepath;
63 public synchronized Collection<RicConfig> getRicConfigs() {
64 return this.ricConfigs.values();
67 public RicConfig getRic(String ricName) throws ServiceException {
68 for (RicConfig ricConfig : getRicConfigs()) {
69 if (ricConfig.name().equals(ricName)) {
73 throw new ServiceException("Could not find ric: " + ricName);
76 public Properties getDmaapPublisherConfig() {
77 return dmaapConsumerConfig;
80 public Properties getDmaapConsumerConfig() {
81 return dmaapConsumerConfig;
84 public static enum RicConfigUpdate {
85 ADDED, CHANGED, REMOVED
88 public interface Observer {
89 void onRicConfigUpdate(RicConfig ric, RicConfigUpdate event);
92 public void addObserver(Observer o) {
93 this.observers.add(o);
96 private class Notification {
98 final RicConfigUpdate event;
100 Notification(RicConfig ric, RicConfigUpdate event) {
106 public void setConfiguration(@NotNull Collection<RicConfig> ricConfigs, Properties dmaapPublisherConfig,
107 Properties dmaapConsumerConfig) {
108 Collection<Notification> notifications = new Vector<>();
109 synchronized (this) {
110 Map<String, RicConfig> newRicConfigs = new HashMap<>();
111 for (RicConfig newConfig : ricConfigs) {
112 RicConfig oldConfig = this.ricConfigs.get(newConfig.name());
113 if (oldConfig == null) {
114 newRicConfigs.put(newConfig.name(), newConfig);
115 notifications.add(new Notification(newConfig, RicConfigUpdate.ADDED));
116 this.ricConfigs.remove(newConfig.name());
117 } else if (!newConfig.equals(newConfig)) {
118 notifications.add(new Notification(newConfig, RicConfigUpdate.CHANGED));
119 newRicConfigs.put(newConfig.name(), newConfig);
120 this.ricConfigs.remove(newConfig.name());
122 newRicConfigs.put(oldConfig.name(), oldConfig);
125 for (RicConfig deletedConfig : this.ricConfigs.values()) {
126 notifications.add(new Notification(deletedConfig, RicConfigUpdate.REMOVED));
128 this.ricConfigs = newRicConfigs;
130 notifyObservers(notifications);
132 this.dmaapPublisherConfig = dmaapPublisherConfig;
133 this.dmaapConsumerConfig = dmaapConsumerConfig;
136 private void notifyObservers(Collection<Notification> notifications) {
137 for (Observer observer : this.observers) {
138 for (Notification notif : notifications) {
139 observer.onRicConfigUpdate(notif.ric, notif.event);