fdcf6b206cedcbad1435e5e78afdfd39eac3873a
[aai/sparky-be.git] / src / main / java / org / onap / aai / sparky / search / filters / FilterProcessor.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23 package org.onap.aai.sparky.search.filters;
24
25 import java.util.ArrayList;
26 import java.util.List;
27
28 import javax.json.JsonObject;
29
30 import org.apache.camel.Exchange;
31 import org.apache.camel.component.restlet.RestletConstants;
32 import org.onap.aai.cl.api.Logger;
33 import org.onap.aai.cl.eelf.LoggerFactory;
34 import org.onap.aai.sparky.logging.AaiUiMsgs;
35 import org.onap.aai.sparky.search.filters.FilteredSearchHelper;
36 import org.onap.aai.sparky.search.filters.entity.UiFilterEntity;
37 import org.onap.aai.sparky.search.filters.entity.UiFiltersEntity;
38 import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants;
39 import org.restlet.Request;
40 import org.restlet.Response;
41 import org.restlet.data.MediaType;
42 import org.restlet.data.Status;
43
44 import com.fasterxml.jackson.databind.JsonNode;
45 import com.fasterxml.jackson.databind.ObjectMapper;
46
47 public class FilterProcessor {
48
49   private static final Logger LOG = LoggerFactory.getInstance().getLogger(FilterProcessor.class);
50
51   private ObjectMapper mapper;
52   private FilteredSearchHelper filteredSearchHelper;
53
54   public FilterProcessor() {
55     this.mapper = new ObjectMapper();
56   }
57
58   public FilterProcessor(FilteredSearchHelper filteredSearchHelper) {
59     this.mapper = new ObjectMapper();
60     this.filteredSearchHelper = filteredSearchHelper;
61   }
62
63   public ObjectMapper getMapper() {
64     return mapper;
65   }
66
67   public FilteredSearchHelper getFilteredSearchHelper() {
68     return filteredSearchHelper;
69   }
70
71   public void setFilteredSearchHelper(FilteredSearchHelper filteredSearchHelper) {
72     this.filteredSearchHelper = filteredSearchHelper;
73   }
74
75   public void getFiltersWithValues(Exchange exchange) {
76     Response response =
77         exchange.getIn().getHeader(RestletConstants.RESTLET_RESPONSE, Response.class);
78
79     Request request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class);
80
81     /*
82      * Disables automatic Apache Camel Restlet component logging which prints out an undesirable log
83      * entry which includes client (e.g. browser) information
84      */
85     request.setLoggable(false);
86
87     UiFiltersEntity viewFiltersList = null;
88     boolean wasErrorDuringFilterDiscovery = false;
89
90     try {
91       String payload = exchange.getIn().getBody(String.class);
92
93       if (payload == null || payload.isEmpty()) {
94         /* Don't throw back an error, just return an empty set */
95         LOG.error(AaiUiMsgs.SEARCH_SERVLET_ERROR, "Request Payload is empty");
96         wasErrorDuringFilterDiscovery = true;
97       } else {
98         String viewName = mapper.readValue(payload, JsonNode.class)
99             .get(TierSupportUiConstants.UI_FILTER_VIEW_NAME_PARAMETER).asText();
100
101         if (viewName == null || viewName.isEmpty()) {
102           wasErrorDuringFilterDiscovery = true;
103         } else {
104           viewFiltersList = filteredSearchHelper.doFilterDiscovery(viewName);
105         }
106       }
107     } catch (Exception exc) {
108       LOG.error(AaiUiMsgs.ERROR_GENERIC,
109           "FilterProcessor failed to get filter list due to error = " + exc.getMessage());
110       wasErrorDuringFilterDiscovery = true;
111     }
112
113     boolean wasErrorDuringValueSearch = false;
114     if (!wasErrorDuringFilterDiscovery) {
115       try {
116         if (!viewFiltersList.getFilters().isEmpty()) {
117           List<String> filterIds = new ArrayList<String>();
118
119           for (UiFilterEntity filterEntity : viewFiltersList.getFilters()) {
120             filterIds.add(filterEntity.getFilterId());
121           }
122
123           UiFiltersEntity responseFiltersList = filteredSearchHelper.doFilterEnumeration(filterIds);
124
125           JsonObject finalResponse = UiFiltersEntityConverter
126               .convertUiFiltersEntityToUnifiedFilterResponse(responseFiltersList);
127
128           response.setStatus(Status.SUCCESS_OK);
129           response.setEntity(finalResponse.toString(), MediaType.APPLICATION_JSON);
130           exchange.getOut().setBody(response);
131         } else {
132           wasErrorDuringValueSearch = true;
133         }
134       } catch (Exception exc) {
135         LOG.error(AaiUiMsgs.ERROR_GENERIC,
136             "FilterProcessor failed to generate valid unifiedFilterRequest response due to error, "
137                 + exc.getMessage());
138         response.setStatus(Status.SERVER_ERROR_INTERNAL);
139       }
140     }
141
142     // In the case of an error we want to respond with a valid empty response
143     if (wasErrorDuringFilterDiscovery || wasErrorDuringValueSearch) {
144       response.setStatus(Status.SUCCESS_OK);
145       response.setEntity(UiFiltersEntityConverter.generateEmptyResponse().toString(),
146           MediaType.APPLICATION_JSON);
147       exchange.getOut().setBody(response);
148     }
149   }
150
151 }