Adding back-end support for UI filters
[aai/sparky-be.git] / src / main / java / org / onap / aai / sparky / search / filters / UiFiltersEntityConverter.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.List;
26
27 import javax.json.Json;
28 import javax.json.JsonArray;
29 import javax.json.JsonArrayBuilder;
30 import javax.json.JsonObject;
31 import javax.json.JsonObjectBuilder;
32
33 import org.onap.aai.sparky.search.filters.config.UiFilterOptionsValuesConfig;
34 import org.onap.aai.sparky.search.filters.entity.UiFilterEntity;
35 import org.onap.aai.sparky.search.filters.entity.UiFilterValueEntity;
36 import org.onap.aai.sparky.search.filters.entity.UiFiltersEntity;
37
38 public class UiFiltersEntityConverter {
39   
40   private static final String KEY_TYPE = "type";
41   private static final String KEY_MULTISELECT = "multiSelect";
42   private static final String KEY_WATERMARK = "watermark";
43   private static final String KEY_CONTROLS = "controls";
44   private static final String KEY_LABEL = "label";
45   private static final String KEY_FILTERS = "filters";
46   private static final String KEY_DECODE = "decode";
47   private static final String KEY_CODE = "code";
48   private static final String KEY_DEFAULT_VALUE = "defaultValue";
49   
50   /**
51    * Converts a UiFiltersEntity into a JSON object to satisfy a new (as of 23 Oct 2017)
52    * filter library being used in the FE.
53    * 
54    * @param entityToConvert - The UiFiltersEntity to be converted into a JSON response.
55    * @return A JsonObject representing the passed in UiFiltersEntity.
56    */
57   public static JsonObject convertUiFiltersEntityToUnifiedFilterResponse(UiFiltersEntity entityToConvert) {
58     JsonObjectBuilder filterBuilder = Json.createObjectBuilder();
59     
60     if(entityToConvert != null) {
61       List<UiFilterEntity> filterEntities = entityToConvert.getFilters();
62       if(filterEntities != null) {
63         for(UiFilterEntity entity : filterEntities) {
64           filterBuilder.add(entity.getFilterId(), generateFilterObject(entity));
65         }
66       }
67     }
68     
69     JsonObjectBuilder finalObject = Json.createObjectBuilder();
70     finalObject.add(KEY_FILTERS, filterBuilder.build());
71     return finalObject.build();
72   }
73   
74   /**
75    * Generates the core body of the a single filter within the JSON body.
76    * 
77    * @param entity - The filter entity (loaded from config and populated from data store).
78    * @return A JsonObject representing the core data of a filter.
79    */
80   private static JsonObject generateFilterObject(UiFilterEntity entity) {
81     JsonObjectBuilder filterBuilder = Json.createObjectBuilder();
82     
83     filterBuilder.add(KEY_LABEL, entity.getDisplayName());
84     filterBuilder.add(KEY_CONTROLS, generateControlObject(entity, entity.getFilterValueList()));
85     
86     return filterBuilder.build();
87   }
88   
89   /**
90    * Generates the "controls" object within the filter JSON.
91    * 
92    * @param filterEntity - The filter entity on which this filter will be based.
93    * @param filterValues - The list of values associated with the filter
94    *  from data store queries. 
95    * @return A JsonObject representing the "controls" object of the filter JSON.
96    */
97   private static JsonObject generateControlObject(UiFilterEntity filterEntity, List<UiFilterValueEntity> filterValues) {
98     JsonObjectBuilder controls = Json.createObjectBuilder();
99     JsonObjectBuilder subControl = Json.createObjectBuilder();
100   
101     subControl.add(KEY_TYPE, filterEntity.getDataType());
102     subControl.add(KEY_MULTISELECT, filterEntity.getMultiSelect());
103     subControl.add(KEY_WATERMARK, filterEntity.getWatermark());
104     
105     if(filterEntity.getDefaultValue() != null && !filterEntity.getDefaultValue().getCode().isEmpty() && !filterEntity.getDefaultValue().getDecode().isEmpty()) {
106       JsonObjectBuilder defaultValueBuilder = Json.createObjectBuilder();
107       
108       defaultValueBuilder.add(KEY_DECODE, filterEntity.getDefaultValue().getDecode());
109       defaultValueBuilder.add(KEY_CODE, filterEntity.getDefaultValue().getCode());
110       
111       subControl.add(KEY_DEFAULT_VALUE, defaultValueBuilder.build());
112     }
113     
114     if(filterEntity.getOptionsValues() == null || filterEntity.getOptionsValues().isEmpty()) {
115       subControl.add(filterEntity.getOptionsType(), generateOptionsObject(filterValues));
116     } else {
117       subControl.add(filterEntity.getOptionsType(), generateOptionsValuesObject(filterEntity.getOptionsValues()));
118     }
119     
120     controls.add(filterEntity.getFilterName(), subControl.build());
121     
122     return controls.build();
123   }
124   
125   /**
126    * Creates a JsonArray representing the list of options for a filter.
127    * Similar to function generateOptionsObject, except using different arguments.
128    * 
129    * @param optionsValues - Values that are loaded from config.
130    * @return JsonArray of options for a filter.
131    */
132   private static JsonArray generateOptionsValuesObject(List<UiFilterOptionsValuesConfig> optionsValues) {
133     JsonArrayBuilder optionsBuilder = Json.createArrayBuilder();
134     
135     if(optionsValues != null && !optionsValues.isEmpty()) {
136       for(UiFilterOptionsValuesConfig optionValue : optionsValues) {
137         JsonObjectBuilder option = Json.createObjectBuilder();
138         
139         option.add(KEY_DECODE, optionValue.getDecode());
140         option.add(KEY_CODE, optionValue.getCode());
141         
142         optionsBuilder.add(option.build());
143       }
144     }
145     
146     return optionsBuilder.build();
147   }
148   
149   /**
150    * Creates a JsonArray representing the list of options for a filter.
151    * 
152    * @param filterValues - The list of values associates with a filter (likely from a data store query).
153    * @return JsonArray of options for a filter.
154    */
155   private static JsonArray generateOptionsObject(List<UiFilterValueEntity> filterValues) {
156     JsonArrayBuilder optionsBuilder = Json.createArrayBuilder();
157     
158     if(filterValues != null && !filterValues.isEmpty()) {
159       for(UiFilterValueEntity valueEntity : filterValues) {
160         JsonObjectBuilder option = Json.createObjectBuilder();
161         
162         option.add(KEY_DECODE, valueEntity.getDisplayName());
163         option.add(KEY_CODE, valueEntity.getFilterValue());
164         
165         optionsBuilder.add(option.build());
166       }
167     }
168     
169     return optionsBuilder.build();
170   }
171   
172   public static JsonObject generateEmptyResponse() {
173     JsonObjectBuilder filterBuilder = Json.createObjectBuilder();
174     JsonObjectBuilder finalObject = Json.createObjectBuilder();
175     finalObject.add(KEY_FILTERS, filterBuilder.build());
176     return finalObject.build();
177   }
178 }