Unit/SONAR/Checkstyle in ONAP-REST
[policy/engine.git] / ONAP-PAP-REST / src / main / java / org / onap / policy / pap / xacml / rest / controller / OptimizationDictionaryController.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP-PAP-REST
4  * ================================================================================
5  * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.pap.xacml.rest.controller;
22
23 import com.fasterxml.jackson.databind.DeserializationFeature;
24 import com.fasterxml.jackson.databind.JsonNode;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import com.google.gson.Gson;
27
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.HashMap;
32 import java.util.LinkedHashMap;
33 import java.util.List;
34 import java.util.Set;
35
36 import javax.servlet.http.HttpServletRequest;
37 import javax.servlet.http.HttpServletResponse;
38
39 import org.apache.commons.lang.StringUtils;
40 import org.json.JSONObject;
41 import org.onap.policy.pap.xacml.rest.XACMLPapServlet;
42 import org.onap.policy.pap.xacml.rest.util.DictionaryUtils;
43 import org.onap.policy.rest.dao.CommonClassDao;
44 import org.onap.policy.rest.jpa.OptimizationModels;
45 import org.onap.policy.rest.jpa.UserInfo;
46 import org.onap.policy.rest.util.MsAttributeObject;
47 import org.onap.policy.rest.util.MsModelUtils;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.http.MediaType;
50 import org.springframework.stereotype.Controller;
51 import org.springframework.web.bind.annotation.RequestMapping;
52 import org.springframework.web.bind.annotation.RequestMethod;
53 import org.springframework.web.servlet.ModelAndView;
54
55 @Controller
56 public class OptimizationDictionaryController {
57     private static CommonClassDao commonClassDao;
58
59     private static String operation = "operation";
60     private LinkedHashMap<String, MsAttributeObject> classMap;
61     private static String dictionaryFields = "dictionaryFields";
62     private static String duplicateResponseString = "Duplicate";
63     private static String optimizationModelsDictionaryDatas = "optimizationModelsDictionaryDatas";
64     private static String modelName = "modelName";
65     private static String optimizationModelsDictionaryData = "optimizationModelsDictionaryData";
66     private static String description = "description";
67     private static String version = "version";
68     private static String classMapData = "classMap";
69     private static final String UPDATE = "update";
70
71     public OptimizationDictionaryController() {
72         super();
73     }
74
75     private DictionaryUtils getDictionaryUtilsInstance() {
76         return DictionaryUtils.getDictionaryUtils();
77     }
78
79     @Autowired
80     public OptimizationDictionaryController(CommonClassDao commonClassDao) {
81         setCommonClassDao(commonClassDao);
82     }
83
84     public static void setCommonClassDao(CommonClassDao commonClassDao) {
85         OptimizationDictionaryController.commonClassDao = commonClassDao;
86     }
87
88     MsModelUtils utils = new MsModelUtils(XACMLPapServlet.getMsOnapName(), XACMLPapServlet.getMsPolicyName());
89
90     private OptimizationModels newModel;
91
92     @RequestMapping(
93             value = {"/get_OptimizationModelsData"},
94             method = {RequestMethod.GET},
95             produces = MediaType.APPLICATION_JSON_VALUE)
96     public void getOptimizationModelsDictionaryEntityData(HttpServletResponse response) {
97         DictionaryUtils dUtils = getDictionaryUtilsInstance();
98         dUtils.getData(response, optimizationModelsDictionaryDatas, OptimizationModels.class);
99     }
100
101     @RequestMapping(
102             value = {"/get_OptimizationModelsDataByName"},
103             method = {RequestMethod.GET},
104             produces = MediaType.APPLICATION_JSON_VALUE)
105     public void getOptimizationModelsDictionaryByNameEntityData(HttpServletResponse response) {
106         DictionaryUtils dUtils = getDictionaryUtilsInstance();
107         dUtils.getDataByEntity(response, optimizationModelsDictionaryDatas, modelName, OptimizationModels.class);
108     }
109
110     @RequestMapping(value = {"/oof_dictionary/save_model"}, method = {RequestMethod.POST})
111     public ModelAndView saveOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response)
112             throws IOException {
113         DictionaryUtils dUtils = getDictionaryUtilsInstance();
114         try {
115             this.newModel = new OptimizationModels();
116             boolean fromAPI = dUtils.isRequestFromAPI(request);
117             ObjectMapper mapper = new ObjectMapper();
118             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
119             JsonNode root = mapper.readTree(request.getReader());
120             OptimizationModels optimizationModels = new OptimizationModels();
121             String userId = null;
122
123             String dataOrderInfo = null;
124             if (root.has("dataOrderInfo")) {
125                 dataOrderInfo = root.get("dataOrderInfo").toString();
126             }
127
128             if (root.has("modelType")) {
129                 JsonNode dataType = root.get("modelType");
130                 String modelType = dataType.toString();
131                 if (modelType.contains("yml")) {
132                     if (root.has(optimizationModelsDictionaryData)) {
133                         if (root.get(optimizationModelsDictionaryData).has(description)) {
134                             optimizationModels.setDescription(root.get(optimizationModelsDictionaryData)
135                                     .get(description).asText().replace("\"", ""));
136                         }
137                         if (root.get(optimizationModelsDictionaryData).has(modelName)) {
138                             optimizationModels.setModelName(root.get(optimizationModelsDictionaryData).get(modelName)
139                                     .asText().replace("\"", ""));
140                             this.newModel.setModelName(optimizationModels.getModelName());
141                         }
142                         if (root.get(optimizationModelsDictionaryData).has(version)) {
143                             optimizationModels.setVersion(
144                                     root.get(optimizationModelsDictionaryData).get(version).asText().replace("\"", ""));
145                             this.newModel.setVersion(optimizationModels.getVersion());
146                         }
147                     }
148
149                     classMap = new LinkedHashMap<>();
150                     JsonNode data = root.get(classMapData);
151                     ObjectMapper mapper1 = new ObjectMapper();
152                     String data1 = data.toString().substring(1, data.toString().length() - 1);
153                     data1 = data1.replace("\\", "");
154                     data1 = data1.replace("\"{", "{");
155                     data1 = data1.replace("}\"", "}");
156                     JSONObject jsonObject = new JSONObject(data1);
157                     Set<String> keys = jsonObject.keySet();
158                     for (String key : keys) {
159                         String value = jsonObject.get(key).toString();
160                         MsAttributeObject msAttributeObject = mapper1.readValue(value, MsAttributeObject.class);
161                         classMap.put(key, msAttributeObject);
162                     }
163
164                     userId = root.get("userid").textValue();
165                     MsAttributeObject mainClass = classMap.get(this.newModel.getModelName());
166                     this.newModel.setDependency("[]");
167                     String value = new Gson().toJson(mainClass.getSubClass());
168                     this.newModel.setSubattributes(value);
169                     String attributes = mainClass.getAttribute().toString().replace("{", "").replace("}", "");
170                     int equalsIndexForAttributes = attributes.indexOf('=');
171                     String atttributesAfterFirstEquals =
172                             attributes.substring(equalsIndexForAttributes + 1, attributes.length() - 1);
173                     this.newModel.setAttributes(atttributesAfterFirstEquals);
174                     String refAttributes = mainClass.getRefAttribute().toString().replace("{", "").replace("}", "");
175                     int equalsIndex = refAttributes.indexOf('=');
176                     String refAttributesAfterFirstEquals =
177                             refAttributes.substring(equalsIndex + 1, refAttributes.length() - 1);
178                     this.newModel.setRefattributes(refAttributesAfterFirstEquals);
179                     this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", ""));
180                     this.newModel
181                             .setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
182
183                 } else {
184                     if (fromAPI) {
185                         optimizationModels =
186                                 mapper.readValue(root.get(dictionaryFields).toString(), OptimizationModels.class);
187                         userId = "API";
188                     } else {
189                         if (root.has(optimizationModelsDictionaryData)) {
190                             if (root.get(optimizationModelsDictionaryData).has(description)) {
191                                 optimizationModels.setDescription(root.get(optimizationModelsDictionaryData)
192                                         .get(description).asText().replace("\"", ""));
193                             }
194                             if (root.get(optimizationModelsDictionaryData).has(modelName)) {
195                                 optimizationModels.setModelName(root.get(optimizationModelsDictionaryData)
196                                         .get(modelName).asText().replace("\"", ""));
197                                 this.newModel.setModelName(optimizationModels.getModelName());
198                             }
199                             if (root.get(optimizationModelsDictionaryData).has(version)) {
200                                 optimizationModels.setVersion(root.get(optimizationModelsDictionaryData).get(version)
201                                         .asText().replace("\"", ""));
202                                 this.newModel.setVersion(optimizationModels.getVersion());
203                             }
204                         }
205                         if (root.has(classMapData)) {
206                             classMap = new LinkedHashMap<>();
207                             JsonNode data = root.get(classMapData);
208                             ObjectMapper mapper1 = new ObjectMapper();
209                             String data1 = data.toString().substring(1, data.toString().length() - 1);
210                             data1 = data1.replace("\\", "");
211                             JSONObject jsonObject = new JSONObject(data1);
212                             Set<String> keys = jsonObject.keySet();
213                             for (String key : keys) {
214                                 String value = jsonObject.get(key).toString();
215                                 MsAttributeObject msAttributeObject = mapper1.readValue(value, MsAttributeObject.class);
216                                 classMap.put(key, msAttributeObject);
217                             }
218                         }
219                         userId = root.get("userid").textValue();
220                         addValuesToNewModel(classMap);
221                     }
222                 }
223             }
224             optimizationModels.setAttributes(this.newModel.getAttributes());
225             optimizationModels.setRefattributes(this.newModel.getRefattributes());
226             optimizationModels.setDependency(this.newModel.getDependency());
227             optimizationModels.setModelName(this.newModel.getModelName());
228             optimizationModels.setSubattributes(this.newModel.getSubattributes());
229             optimizationModels.setVersion(this.newModel.getVersion());
230             optimizationModels.setEnumValues(this.newModel.getEnumValues());
231             optimizationModels.setAnnotation(this.newModel.getAnnotation());
232
233             if (dataOrderInfo != null) {
234                 optimizationModels.setDataOrderInfo(dataOrderInfo);
235             }
236
237             String checkName = optimizationModels.getModelName() + ":" + optimizationModels.getVersion();
238             List<Object> duplicateData =
239                     commonClassDao.checkDuplicateEntry(checkName, "modelName:version", OptimizationModels.class);
240             boolean duplicateflag = false;
241             if (duplicateData != null && !duplicateData.isEmpty()) {
242                 OptimizationModels data = (OptimizationModels) duplicateData.get(0);
243                 if (request.getParameter(operation) != null && UPDATE.equals(request.getParameter(operation))) {
244                     optimizationModels.setId(data.getId());
245                 } else if ((request.getParameter(operation) != null && !UPDATE.equals(request.getParameter(operation)))
246                         || (request.getParameter(operation) == null && (data.getId() != optimizationModels.getId()))) {
247                     duplicateflag = true;
248                 }
249             }
250             UserInfo userInfo = dUtils.getUserInfo(userId);
251
252             String responseString = null;
253             if (!duplicateflag) {
254                 optimizationModels.setUserCreatedBy(userInfo);
255                 if (optimizationModels.getId() == 0) {
256                     commonClassDao.save(optimizationModels);
257                 } else {
258                     commonClassDao.update(optimizationModels);
259                 }
260                 responseString = mapper.writeValueAsString(commonClassDao.getData(OptimizationModels.class));
261             } else {
262                 responseString = duplicateResponseString;
263             }
264             if (fromAPI) {
265                 return dUtils.getResultForApi(responseString);
266             } else {
267                 dUtils.setResponseData(response, optimizationModelsDictionaryDatas, responseString);
268             }
269         } catch (Exception e) {
270             dUtils.setErrorResponseData(response, e);
271         }
272         return null;
273     }
274
275     @RequestMapping(value = {"/oof_dictionary/remove_model"}, method = {RequestMethod.POST})
276     public void removeOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response)
277             throws IOException {
278         DictionaryUtils dUtils = getDictionaryUtilsInstance();
279         dUtils.removeData(request, response, optimizationModelsDictionaryDatas, OptimizationModels.class);
280     }
281
282     private void addValuesToNewModel(HashMap<String, MsAttributeObject> classMap) {
283         // Loop through the classmap and pull out the required info for the new file.
284         String subAttribute = null;
285
286         MsAttributeObject mainClass = classMap.get(this.newModel.getModelName());
287
288         if (mainClass != null) {
289             String dependTemp = StringUtils.replaceEach(mainClass.getDependency(), new String[] {"[", "]", " "},
290                     new String[] {"", "", ""});
291             ArrayList<String> dependency = new ArrayList<>(Arrays.asList(dependTemp.split(",")));
292             dependency = getFullDependencyList(dependency);
293             for (String element : dependency) {
294                 MsAttributeObject temp = classMap.get(element);
295                 if (temp != null) {
296                     mainClass.addAllRefAttribute(temp.getRefAttribute());
297                     mainClass.addAllAttribute(temp.getAttribute());
298                 }
299             }
300             subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
301         } else {
302             subAttribute = "{}";
303             this.newModel.setDependency("");
304         }
305
306         if (mainClass != null && mainClass.getDependency() == null) {
307             mainClass.setDependency("");
308         }
309         if (mainClass != null) {
310             this.newModel.setDependency(mainClass.getDependency());
311             this.newModel.setSubattributes(subAttribute);
312             this.newModel.setAttributes(mainClass.getAttribute().toString().replace("{", "").replace("}", ""));
313             this.newModel.setRefattributes(mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""));
314             this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", ""));
315             this.newModel.setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
316         }
317     }
318
319     private ArrayList<String> getFullDependencyList(ArrayList<String> dependency) {
320         ArrayList<String> returnList = new ArrayList<>();
321         ArrayList<String> workingList;
322         returnList.addAll(dependency);
323         for (String element : dependency) {
324             if (classMap.containsKey(element)) {
325                 MsAttributeObject value = classMap.get(element);
326                 String rawValue =
327                         StringUtils.replaceEach(value.getDependency(), new String[] {"[", "]"}, new String[] {"", ""});
328                 workingList = new ArrayList<>(Arrays.asList(rawValue.split(",")));
329                 for (String depend : workingList) {
330                     if (!returnList.contains(depend) && !depend.isEmpty()) {
331                         returnList.add(depend.trim());
332                     }
333                 }
334             }
335         }
336
337         return returnList;
338     }
339
340 }