import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
+
import javax.validation.constraints.NotNull;
-import lombok.Getter;
+
+import org.immutables.gson.Gson;
+import org.immutables.value.Value;
import org.onap.dmaap.mr.test.clients.ProtocolTypeConstants;
import org.oransc.policyagent.exceptions.ServiceException;
import org.springframework.http.MediaType;
+/**
+ * Parser for the Json representing of the component configuration.
+ */
public class ApplicationConfigParser {
private static final String CONFIG = "config";
+ private static final String CONTROLLER = "controller";
+
+ @Value.Immutable
+ @Gson.TypeAdapters
+ public interface ConfigParserResult {
+ List<RicConfig> ricConfigs();
+
+ Properties dmaapPublisherConfig();
+
+ Properties dmaapConsumerConfig();
- @Getter
- private List<RicConfig> ricConfigs;
- @Getter
- private Properties dmaapPublisherConfig = new Properties();
- @Getter
- private Properties dmaapConsumerConfig = new Properties();
+ Map<String, ControllerConfig> controllerConfigs();
+ }
+
+ public ConfigParserResult parse(JsonObject root) throws ServiceException {
+
+ Properties dmaapPublisherConfig = new Properties();
+ Properties dmaapConsumerConfig = new Properties();
- public void parse(JsonObject root) throws ServiceException {
JsonObject agentConfigJson = root.getAsJsonObject(CONFIG);
- ricConfigs = parseRics(agentConfigJson);
+ List<RicConfig> ricConfigs = parseRics(agentConfigJson);
+ Map<String, ControllerConfig> controllerConfigs = parseControllerConfigs(agentConfigJson);
JsonObject json = agentConfigJson.getAsJsonObject("streams_publishes");
if (json != null) {
- this.dmaapPublisherConfig = parseDmaapConfig(json);
+ dmaapPublisherConfig = parseDmaapConfig(json);
}
json = agentConfigJson.getAsJsonObject("streams_subscribes");
if (json != null) {
- this.dmaapConsumerConfig = parseDmaapConfig(json);
+ dmaapConsumerConfig = parseDmaapConfig(json);
+ }
+
+ checkConfigurationConsistency(ricConfigs, controllerConfigs);
+
+ return ImmutableConfigParserResult.builder() //
+ .dmaapConsumerConfig(dmaapConsumerConfig) //
+ .dmaapPublisherConfig(dmaapPublisherConfig) //
+ .ricConfigs(ricConfigs) //
+ .controllerConfigs(controllerConfigs) //
+ .build();
+ }
+
+ private void checkConfigurationConsistency(List<RicConfig> ricConfigs,
+ Map<String, ControllerConfig> controllerConfigs) throws ServiceException {
+ Set<String> ricUrls = new HashSet<>();
+ Set<String> ricNames = new HashSet<>();
+ for (RicConfig ric : ricConfigs) {
+ if (!ricUrls.add(ric.baseUrl())) {
+ throw new ServiceException("Configuration error, more than one RIC URL: " + ric.baseUrl());
+ }
+ if (!ricNames.add(ric.name())) {
+ throw new ServiceException("Configuration error, more than one RIC with name: " + ric.name());
+ }
+ if (!ric.controllerName().isEmpty() && controllerConfigs.get(ric.controllerName()) == null) {
+ throw new ServiceException(
+ "Configuration error, controller configuration not found: " + ric.controllerName());
+ }
+
}
}
List<RicConfig> result = new ArrayList<>();
for (JsonElement ricElem : getAsJsonArray(config, "ric")) {
JsonObject ricAsJson = ricElem.getAsJsonObject();
+ JsonElement controllerNameElement = ricAsJson.get(CONTROLLER);
ImmutableRicConfig ricConfig = ImmutableRicConfig.builder() //
.name(ricAsJson.get("name").getAsString()) //
.baseUrl(ricAsJson.get("baseUrl").getAsString()) //
.managedElementIds(parseManagedElementIds(ricAsJson.get("managedElementIds").getAsJsonArray())) //
+ .controllerName(controllerNameElement != null ? controllerNameElement.getAsString() : "") //
.build();
result.add(ricConfig);
}
return result;
}
+ Map<String, ControllerConfig> parseControllerConfigs(JsonObject config) throws ServiceException {
+ if (config.get(CONTROLLER) == null) {
+ return new HashMap<>();
+ }
+ Map<String, ControllerConfig> result = new HashMap<>();
+ for (JsonElement element : getAsJsonArray(config, CONTROLLER)) {
+ JsonObject controllerAsJson = element.getAsJsonObject();
+ ImmutableControllerConfig controllerConfig = ImmutableControllerConfig.builder() //
+ .name(controllerAsJson.get("name").getAsString()) //
+ .baseUrl(controllerAsJson.get("baseUrl").getAsString()) //
+ .password(controllerAsJson.get("password").getAsString()) //
+ .userName(controllerAsJson.get("userName").getAsString()) // )
+ .build();
+
+ if (result.put(controllerConfig.name(), controllerConfig) != null) {
+ throw new ServiceException(
+ "Configuration error, more than one controller with name: " + controllerConfig.name());
+ }
+ }
+ return result;
+ }
+
private List<String> parseManagedElementIds(JsonArray asJsonObject) {
Iterator<JsonElement> iterator = asJsonObject.iterator();
List<String> managedElementIds = new ArrayList<>();
} catch (MalformedURLException e) {
throw new ServiceException("Could not parse the URL", e);
}
-
}
private static @NotNull String getAsString(JsonObject obj, String memberName) throws ServiceException {