Allow wild cards in supported type filter
[policy/models.git] / models-pdp / src / main / java / org / onap / policy / models / pdp / concepts / PdpGroupFilter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 Nordix Foundation.
4  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.models.pdp.concepts;
23
24 import java.util.List;
25 import java.util.stream.Collectors;
26
27 import lombok.Builder;
28 import lombok.Data;
29 import lombok.NonNull;
30
31 import org.apache.commons.lang3.ObjectUtils;
32 import org.onap.policy.models.base.PfObjectFilter;
33 import org.onap.policy.models.pdp.enums.PdpState;
34 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
35 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
36
37 /**
38  * Filter class for searches for {@link PdpGroup} instances. If any fields are null, they are ignored.
39  *
40  * @author Liam Fallon (liam.fallon@est.tech)
41  */
42 @Builder
43 @Data
44 public class PdpGroupFilter implements PfObjectFilter<PdpGroup> {
45     // Name to find
46     private String name;
47
48     // State to find
49     private PdpState groupState;
50
51     // PDP type to find
52     private String pdpType;
53
54     // Set regular expressions on fields to match policy type names and versions
55     private List<ToscaPolicyTypeIdentifier> policyTypeList;
56
57     // If set, only PDP groups where policy types are matched exactly are returned
58     @Builder.Default
59     private boolean matchPolicyTypesExactly = false;
60
61     // Set regular expressions on fields to match policy names and versions
62     private List<ToscaPolicyIdentifier> policyList;
63
64     // If set, only PDP groups where policies are matched exactly are returned
65     @Builder.Default
66     private boolean matchPoliciesExactly = false;
67
68     // If set, only PDP groups with PDPs in this state are returned
69     private PdpState pdpState;
70
71     @Override
72     public List<PdpGroup> filter(@NonNull final List<PdpGroup> originalList) {
73
74         // @formatter:off
75         return originalList.stream()
76                 .filter(p -> filterString(p.getName(), name))
77                 .filter(p -> groupState == null || ObjectUtils.compare(p.getPdpGroupState(), groupState) == 0)
78                 .filter(p -> filterOnPdpType(p, pdpType))
79                 .filter(p -> filterOnPolicyTypeList(p, policyTypeList, matchPolicyTypesExactly))
80                 .filter(p -> filterOnPolicyList(p, policyList, matchPoliciesExactly))
81                 .filter(p -> filterOnPdpState(p, pdpState))
82                 .collect(Collectors.toList());
83         // @formatter:on
84     }
85
86     /**
87      * Filter PDP groups on PDP type.
88      *
89      * @param pdpGroup the PDP group to check
90      * @param pdpType the PDP type to check for
91      * @return true if the filter should let this PDP group through
92      */
93     private boolean filterOnPdpType(final PdpGroup pdpGroup, final String pdpType) {
94         if (pdpType == null) {
95             return true;
96         }
97
98         for (PdpSubGroup pdpSubGroup : pdpGroup.getPdpSubgroups()) {
99             if (pdpSubGroup.getPdpType().equals(pdpType)) {
100                 return true;
101             }
102         }
103
104         return false;
105     }
106
107     /**
108      * Filter PDP groups on policy type.
109      *
110      * @param pdpGroup the PDP group to check
111      * @param typeFilter the policy type regular expressions to check for
112      * @param matchPolicyTypesExactly if true, only PDP groups where policy types are matched exactly are returned
113      * @return true if the filter should let this PDP group through
114      */
115     private boolean filterOnPolicyTypeList(final PdpGroup pdpGroup, final List<ToscaPolicyTypeIdentifier> typeFilter,
116             final boolean matchPolicyTypesExactly) {
117         if (typeFilter == null) {
118             return true;
119         }
120
121         for (PdpSubGroup pdpSubGroup : pdpGroup.getPdpSubgroups()) {
122             if (matchPolicyTypesExactly && areListsIdentical(pdpSubGroup.getSupportedPolicyTypes(), typeFilter)) {
123                 return true;
124             } else if (!matchPolicyTypesExactly
125                     && findSupportedPolicyType(pdpSubGroup.getSupportedPolicyTypes(), typeFilter)) {
126                 return true;
127             }
128         }
129
130         return false;
131
132     }
133
134     /**
135      * Find a single supported type.
136      *
137      * @param supportedPolicyTypes supported types
138      * @param typeFilter the list of types, one of which we wish to find supported by
139      *        the list we are searching
140      * @return true if one element of the elements to find is supported by an element on
141      *         the list we searched
142      */
143     private boolean findSupportedPolicyType(List<ToscaPolicyTypeIdentifier> supportedPolicyTypes,
144                     List<ToscaPolicyTypeIdentifier> typeFilter) {
145         for (ToscaPolicyTypeIdentifier supportedPolicyType : supportedPolicyTypes) {
146             String supName = supportedPolicyType.getName();
147             if (supName.endsWith(".*")) {
148                 String substr = supName.substring(0, supName.length() - 1);
149                 if (typeFilter.stream().anyMatch(type -> type.getName().startsWith(substr))) {
150                     return true;
151                 }
152             } else if (typeFilter.contains(supportedPolicyType)) {
153                 return true;
154             }
155         }
156
157         return false;
158     }
159
160     /**
161      * Filter PDP groups on policy.
162      *
163      * @param pdpGroup the PDP group to check
164      * @param policyFilter the policy regular expressions to check for
165      * @param matchPoliciesExactly if true, only PDP groups where ps are matched exactly are returned
166      * @return true if the filter should let this PDP group through
167      */
168     private boolean filterOnPolicyList(final PdpGroup pdpGroup, final List<ToscaPolicyIdentifier> policyFilter,
169             final boolean matchPoliciesExactly) {
170         if (policyFilter == null) {
171             return true;
172         }
173
174         for (PdpSubGroup pdpSubGroup : pdpGroup.getPdpSubgroups()) {
175             if (matchPoliciesExactly && areListsIdentical(pdpSubGroup.getPolicies(), policyFilter)) {
176                 return true;
177             } else if (!matchPoliciesExactly && findSingleElement(pdpSubGroup.getPolicies(), policyFilter)) {
178                 return true;
179             }
180         }
181
182         return false;
183     }
184
185     /**
186      * Filter PDP groups on PDP state.
187      *
188      * @param pdpGroup the PDP group to check
189      * @param policyFilter the policy regular expressions to check for
190      * @return true if the filter should let this PDP group through
191      */
192     private boolean filterOnPdpState(final PdpGroup pdpGroup, final PdpState pdpState) {
193         if (pdpState == null) {
194             return true;
195         }
196
197         for (PdpSubGroup pdpSubGroup : pdpGroup.getPdpSubgroups()) {
198             for (Pdp pdp : pdpSubGroup.getPdpInstances()) {
199                 if (pdpState.equals(pdp.getPdpState())) {
200                     return true;
201                 }
202             }
203         }
204
205         return false;
206     }
207
208     /**
209      * Check if two lists have identical content.
210      *
211      * @param leftList the left list
212      * @param rightList the right list
213      * @return true if the lists are identical
214      */
215     private <T> boolean areListsIdentical(final List<T> leftList, List<T> rightList) {
216         return leftList.equals(rightList);
217     }
218
219     /**
220      * Find a single element of a list in a list.
221      *
222      * @param listToSearch the list in which we are searching for elements
223      * @param listOfElementsToFind the list of elements, one of which we wish to find on the list we are searching
224      * @return true if one element of the elements to find is found on the list we searched
225      */
226     private <T> boolean findSingleElement(final List<T> listToSearch, List<T> listOfElementsToFind) {
227         for (Object elementToFind : listOfElementsToFind) {
228             if (listToSearch.contains(elementToFind)) {
229                 return true;
230             }
231         }
232
233         return false;
234     }
235 }