Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / java / org / onap / vid / aai / model / PortDetailsTranslator.java
1 package org.onap.vid.aai.model;
2
3
4 import com.google.common.collect.ImmutableList;
5 import org.onap.vid.aai.AaiResponse;
6
7 import java.util.LinkedList;
8 import java.util.List;
9 import java.util.Optional;
10 import java.util.function.Predicate;
11 import java.util.stream.Collectors;
12
13 public class PortDetailsTranslator {
14
15     public static class PortDetailsOk implements PortDetails {
16
17         private final String interfaceId;
18         private final String interfaceName;
19         private final boolean isPortMirrored;
20
21         public PortDetailsOk(String interfaceId, String interfaceName, boolean isPortMirrored) {
22             this.interfaceId = interfaceId;
23             this.interfaceName = interfaceName;
24             this.isPortMirrored = isPortMirrored;
25         }
26
27         public String getInterfaceId() {
28             return interfaceId;
29         }
30
31         public String getInterfaceName() {
32             return interfaceName;
33         }
34
35         public boolean getIsPortMirrored() {
36             return isPortMirrored;
37         }
38     }
39
40     public interface PortDetails {
41     }
42
43     public static class PortDetailsError implements PortDetails {
44         private final String errorDescription;
45         private final String rawAaiResponse;
46
47         public PortDetailsError(String errorDescription, String rawAaiResponse) {
48             this.errorDescription = errorDescription;
49             this.rawAaiResponse = rawAaiResponse;
50         }
51
52         public String getErrorDescription() {
53             return errorDescription;
54         }
55
56         public String getRawAaiResponse() {
57             return rawAaiResponse;
58         }
59     }
60
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);
66
67         if (errorDescriptions.isEmpty()) {
68             return new PortDetailsOk(properties.getInterfaceId(), properties.getInterfaceName(), properties.getIsPortMirrored());
69         } else {
70             return new PortDetailsError(String.join(" ", errorDescriptions), rawPayload);
71         }
72     }
73
74     private static void describeIfNullOrEmpty(String name, Object value, List<String> errorDescriptions) {
75         if (value == null) {
76             errorDescriptions.add("Value of '" + name + "' is missing.");
77         } else if (value.toString().isEmpty()) {
78             errorDescriptions.add("Value of '" + name + "' is empty.");
79         }
80     }
81
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)
88             ));
89         } else {
90             return Optional.empty();
91         }
92     }
93
94     public List<PortDetails> extractPortDetailsInternal(CustomQuerySimpleResult aaiGetPortsResponse, String rawPayload) {
95         List<SimpleResult> filteredResult = getFilteredPortList(aaiGetPortsResponse.getResults());
96
97         return filteredResult.stream()
98                 .map(SimpleResult::getProperties)
99                 .map(p -> extractPortDetailsFromProperties(p, rawPayload))
100                 .collect(Collectors.toList());
101     }
102
103     public List<SimpleResult> getFilteredPortList(List<SimpleResult> results) {
104         final String LINTERFACE = "l-interface";
105
106         final Predicate<SimpleResult> ifIsPort = (SimpleResult r) -> LINTERFACE.equals(r.getNodeType());
107         Predicate<SimpleResult> ifIsSource = getIsSourcePredicate();
108
109         return results.stream()
110                 .filter(ifIsPort)
111                 .filter(ifIsSource)
112                 .collect(Collectors.toList());
113     }
114
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()));
119     }
120
121     public List<PortDetails> extractPortDetails(AaiResponse<CustomQuerySimpleResult> aaiGetPortsResponse, String rawPayload) {
122         return extractErrorResponseIfHttpError(aaiGetPortsResponse, rawPayload).orElseGet(() -> extractPortDetailsInternal(aaiGetPortsResponse.getT(), rawPayload));
123
124     }
125
126 }