1 package org.onap.vid.aai;
3 import org.apache.commons.lang3.StringUtils;
4 import org.codehaus.jackson.JsonNode;
5 import org.springframework.stereotype.Component;
7 import java.util.Optional;
10 public class AaiResponseTranslator {
12 public PortMirroringConfigData extractPortMirroringConfigData(AaiResponse<JsonNode> aaiResponse) {
13 return extractErrorResponseIfHttpError(aaiResponse).orElseGet(() -> extractPortMirroringConfigData(aaiResponse.getT()));
16 public PortMirroringConfigData extractPortMirroringConfigData(JsonNode cloudRegionAndSourceFromConfigurationResponse) {
17 final JsonNode payload = cloudRegionAndSourceFromConfigurationResponse;
18 if (payload == null) {
19 return new PortMirroringConfigDataError("Response payload is null", null);
22 final JsonNode results = payload.path("results");
23 if (results.isMissingNode()) {
24 return new PortMirroringConfigDataError("Root node 'results' is missing", payload.toString());
27 for (JsonNode resultNode : results) {
28 final JsonNode nodeType = resultNode.path("node-type");
29 if (nodeType.isTextual() && "cloud-region".equals(nodeType.getTextValue())) {
30 return getPortMirroringConfigData(payload, resultNode);
33 return new PortMirroringConfigDataError("Root node 'results' has no node where 'node-TYPE' is 'cloud-region'", payload.toString());
36 private PortMirroringConfigData getPortMirroringConfigData(JsonNode payload, JsonNode resultNode) {
37 final JsonNode properties = resultNode.path("properties");
38 if (properties.isMissingNode()) {
39 final String message = "The node-type 'cloud-region' does not contain a 'properties' node";
40 return new PortMirroringConfigDataError(message, payload.toString());
43 final JsonNode cloudRegionIdNode = properties.path("cloud-region-id");
44 if (cloudRegionIdNode.isMissingNode()) {
45 return new PortMirroringConfigDataError("The node-type 'cloud-region' does not contain the property 'cloud-region-id'", payload.toString());
47 if (!cloudRegionIdNode.isTextual()) {
48 return new PortMirroringConfigDataError("The node-type 'cloud-region' contains a non-textual value for the property 'cloud-region-id'", payload.toString());
51 final String cloudRegionId = cloudRegionIdNode.asText();
52 if (StringUtils.isBlank(cloudRegionId)) {
53 return new PortMirroringConfigDataError("Node 'properties.cloud-region-id' of node-type 'cloud-region' is blank", payload.toString());
56 return new PortMirroringConfigDataOk(cloudRegionId);
59 private Optional<PortMirroringConfigData> extractErrorResponseIfHttpError(AaiResponse aaiResponse) {
60 if (aaiResponse.getHttpCode() != org.springframework.http.HttpStatus.OK.value()) {
61 final String errorMessage = aaiResponse.getErrorMessage();
62 return Optional.of(new PortMirroringConfigDataError(
63 "Got " + aaiResponse.getHttpCode() + " from aai",
64 errorMessage != null ? errorMessage : null)
67 return Optional.empty();
71 public abstract static class PortMirroringConfigData {
74 public static class PortMirroringConfigDataOk extends PortMirroringConfigData {
75 private final String cloudRegionId;
77 public PortMirroringConfigDataOk(String cloudRegionId) {
78 this.cloudRegionId = cloudRegionId;
81 public String getCloudRegionId() {
86 public static class PortMirroringConfigDataError extends PortMirroringConfigData {
87 private final String errorDescription;
88 private final String rawAaiResponse;
90 public PortMirroringConfigDataError(String errorDescription, String rawAaiResponse) {
91 this.errorDescription = errorDescription;
92 this.rawAaiResponse = rawAaiResponse;
95 public String getErrorDescription() {
96 return errorDescription;
99 public String getRawAaiResponse() {
100 return rawAaiResponse;