1 package org.onap.vid.aai.model;
4 import com.google.common.collect.ImmutableList;
5 import org.onap.vid.aai.AaiResponse;
7 import java.util.LinkedList;
9 import java.util.Optional;
10 import java.util.function.Predicate;
11 import java.util.stream.Collectors;
13 public class PortDetailsTranslator {
15 public static class PortDetailsOk implements PortDetails {
17 private final String interfaceId;
18 private final String interfaceName;
19 private final boolean isPortMirrored;
21 public PortDetailsOk(String interfaceId, String interfaceName, boolean isPortMirrored) {
22 this.interfaceId = interfaceId;
23 this.interfaceName = interfaceName;
24 this.isPortMirrored = isPortMirrored;
27 public String getInterfaceId() {
31 public String getInterfaceName() {
35 public boolean getIsPortMirrored() {
36 return isPortMirrored;
40 public interface PortDetails {
43 public static class PortDetailsError implements PortDetails {
44 private final String errorDescription;
45 private final String rawAaiResponse;
47 public PortDetailsError(String errorDescription, String rawAaiResponse) {
48 this.errorDescription = errorDescription;
49 this.rawAaiResponse = rawAaiResponse;
52 public String getErrorDescription() {
53 return errorDescription;
56 public String getRawAaiResponse() {
57 return rawAaiResponse;
61 public static PortDetails extractPortDetailsFromProperties(Properties properties, String rawPayload) {
62 List<String> errorDescriptions = new LinkedList<>();
63 describeIfNullOrEmpty("interface-id", properties.getInterfaceId(), errorDescriptions);
64 describeIfNullOrEmpty("interface-name", properties.getInterfaceName(), errorDescriptions);
65 describeIfNullOrEmpty("is-port-mirrored", properties.getIsPortMirrored(), errorDescriptions);
67 if (errorDescriptions.isEmpty()) {
68 return new PortDetailsOk(properties.getInterfaceId(), properties.getInterfaceName(), properties.getIsPortMirrored());
70 return new PortDetailsError(String.join(" ", errorDescriptions), rawPayload);
74 private static void describeIfNullOrEmpty(String name, Object value, List<String> errorDescriptions) {
76 errorDescriptions.add("Value of '" + name + "' is missing.");
77 } else if (value.toString().isEmpty()) {
78 errorDescriptions.add("Value of '" + name + "' is empty.");
82 private static Optional<List<PortDetails>> extractErrorResponseIfHttpError(AaiResponse aaiResponse, String rawPayload) {
83 if (aaiResponse.getHttpCode() != org.springframework.http.HttpStatus.OK.value()) {
84 final String errorMessage = aaiResponse.getErrorMessage();
85 return Optional.of(ImmutableList.of(new PortDetailsError(
86 "Got " + aaiResponse.getHttpCode() + " from aai",
87 errorMessage != null ? errorMessage : rawPayload)
90 return Optional.empty();
94 public List<PortDetails> extractPortDetailsInternal(CustomQuerySimpleResult aaiGetPortsResponse, String rawPayload) {
95 List<SimpleResult> filteredResult = getFilteredPortList(aaiGetPortsResponse.getResults());
97 return filteredResult.stream()
98 .map(SimpleResult::getProperties)
99 .map(p -> extractPortDetailsFromProperties(p, rawPayload))
100 .collect(Collectors.toList());
103 public List<SimpleResult> getFilteredPortList(List<SimpleResult> results) {
104 final String LINTERFACE = "l-interface";
106 final Predicate<SimpleResult> ifIsPort = (SimpleResult r) -> LINTERFACE.equals(r.getNodeType());
107 Predicate<SimpleResult> ifIsSource = getIsSourcePredicate();
109 return results.stream()
112 .collect(Collectors.toList());
115 private Predicate<SimpleResult> getIsSourcePredicate() {
116 final String PORT_LABEL = "org.onap.relationships.inventory.Source";
117 return (SimpleResult r) -> r.getRelatedTo().stream()
118 .anyMatch(relatedTo -> PORT_LABEL.equalsIgnoreCase(relatedTo.getRelationshipLabel()));
121 public List<PortDetails> extractPortDetails(AaiResponse<CustomQuerySimpleResult> aaiGetPortsResponse, String rawPayload) {
122 return extractErrorResponseIfHttpError(aaiGetPortsResponse, rawPayload).orElseGet(() -> extractPortDetailsInternal(aaiGetPortsResponse.getT(), rawPayload));