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;
public class ApplicationConfigParser {
private static final String CONFIG = "config";
+ private static final String CONTROLLER = "controller";
@Value.Immutable
@Gson.TypeAdapters
Properties dmaapPublisherConfig();
Properties dmaapConsumerConfig();
+
+ Map<String, ControllerConfig> controllerConfigs();
}
public ConfigParserResult parse(JsonObject root) throws ServiceException {
Properties dmaapConsumerConfig = new Properties();
JsonObject agentConfigJson = root.getAsJsonObject(CONFIG);
- List<RicConfig> ricConfigs = parseRics(agentConfigJson);
+
+ if (agentConfigJson == null) {
+ throw new ServiceException("Missing root configuration \"" + CONFIG + "\" in JSON: " + root);
+ }
JsonObject json = agentConfigJson.getAsJsonObject("streams_publishes");
if (json != null) {
dmaapConsumerConfig = parseDmaapConfig(json);
}
+ List<RicConfig> ricConfigs = parseRics(agentConfigJson);
+ Map<String, ControllerConfig> controllerConfigs = parseControllerConfigs(agentConfigJson);
+ 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());
+ }
+
+ }
+
+ }
+
private List<RicConfig> parseRics(JsonObject config) throws ServiceException {
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())) //
+ .name(get(ricAsJson, "name").getAsString()) //
+ .baseUrl(get(ricAsJson, "baseUrl").getAsString()) //
+ .managedElementIds(parseManagedElementIds(get(ricAsJson, "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(get(controllerAsJson, "name").getAsString()) //
+ .baseUrl(get(controllerAsJson, "baseUrl").getAsString()) //
+ .password(get(controllerAsJson, "password").getAsString()) //
+ .userName(get(controllerAsJson, "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<>();
private static JsonElement get(JsonObject obj, String memberName) throws ServiceException {
JsonElement elem = obj.get(memberName);
if (elem == null) {
- throw new ServiceException("Could not find member: " + memberName + " in: " + obj);
+ throw new ServiceException("Could not find member: '" + memberName + "' in: " + obj);
}
return elem;
}
dmaapProps.put("group", path.consumerGroup);
dmaapProps.put("id", path.consumerId);
dmaapProps.put("TransportType", ProtocolTypeConstants.HTTPNOAUTH.toString());
- dmaapProps.put("timeout", 15000);
- dmaapProps.put("limit", 100);
+ dmaapProps.put("timeout", "15000");
+ dmaapProps.put("limit", "100");
dmaapProps.put("maxBatchSize", "10");
dmaapProps.put("maxAgeMs", "10000");
dmaapProps.put("compress", true);
} catch (MalformedURLException e) {
throw new ServiceException("Could not parse the URL", e);
}
-
}
private static @NotNull String getAsString(JsonObject obj, String memberName) throws ServiceException {