Convert tabs to space in ONAP PAP REST1
[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 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 package org.onap.policy.pap.xacml.rest.controller;
21
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.HashMap;
26 import java.util.LinkedHashMap;
27 import java.util.List;
28 import java.util.Set;
29
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32
33 import org.apache.commons.lang.StringUtils;
34 import org.json.JSONObject;
35 import org.onap.policy.pap.xacml.rest.XACMLPapServlet;
36 import org.onap.policy.pap.xacml.rest.util.DictionaryUtils;
37 import org.onap.policy.rest.dao.CommonClassDao;
38 import org.onap.policy.rest.jpa.OptimizationModels;
39 import org.onap.policy.rest.jpa.UserInfo;
40 import org.onap.policy.rest.util.MSAttributeObject;
41 import org.onap.policy.rest.util.MSModelUtils;
42 import org.springframework.beans.factory.annotation.Autowired;
43 import org.springframework.http.MediaType;
44 import org.springframework.stereotype.Controller;
45 import org.springframework.web.bind.annotation.RequestMapping;
46 import org.springframework.web.bind.annotation.RequestMethod;
47 import org.springframework.web.servlet.ModelAndView;
48
49 import com.fasterxml.jackson.databind.DeserializationFeature;
50 import com.fasterxml.jackson.databind.JsonNode;
51 import com.fasterxml.jackson.databind.ObjectMapper;
52 import com.google.gson.Gson;
53
54 @Controller
55 public class OptimizationDictionaryController {
56     private static CommonClassDao commonClassDao;
57
58     private static String operation = "operation";
59     private LinkedHashMap<String,MSAttributeObject > classMap;
60     private static String dictionaryFields ="dictionaryFields";
61     private static String duplicateResponseString = "Duplicate";
62     private static String optimizationModelsDictionaryDatas = "optimizationModelsDictionaryDatas";
63     private static String modelName = "modelName";
64     private static String optimizationModelsDictionaryData = "optimizationModelsDictionaryData";
65     private static String description = "description";
66     private static String version = "version";
67     private static String classMapData = "classMap";
68     private static final String UPDATE = "update";
69
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     public static void setCommonClassDao(CommonClassDao commonClassDao) {
84         OptimizationDictionaryController.commonClassDao = commonClassDao;
85     }
86
87     MSModelUtils utils = new MSModelUtils(XACMLPapServlet.getMsOnapName(), XACMLPapServlet.getMsPolicyName());
88
89     private OptimizationModels newModel;
90
91     @RequestMapping(value={"/get_OptimizationModelsData"}, method={RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
92     public void getOptimizationModelsDictionaryEntityData(HttpServletResponse response){
93         DictionaryUtils dUtils = getDictionaryUtilsInstance();
94         dUtils.getData(response, optimizationModelsDictionaryDatas, OptimizationModels.class);
95     }
96
97     @RequestMapping(value={"/get_OptimizationModelsDataByName"}, method={RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
98     public void getOptimizationModelsDictionaryByNameEntityData(HttpServletResponse response){
99         DictionaryUtils dUtils = getDictionaryUtilsInstance();
100         dUtils.getDataByEntity(response, optimizationModelsDictionaryDatas, modelName, OptimizationModels.class);
101     }
102
103     @RequestMapping(value={"/oof_dictionary/save_model"}, method={RequestMethod.POST})
104     public ModelAndView saveOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response) throws IOException{
105         DictionaryUtils dUtils = getDictionaryUtilsInstance();
106         try {
107             this.newModel = new OptimizationModels();
108             boolean fromAPI = dUtils.isRequestFromAPI(request);
109             ObjectMapper mapper = new ObjectMapper();
110             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
111             JsonNode root = mapper.readTree(request.getReader());
112             OptimizationModels optimizationModels = new OptimizationModels();
113             String userId = null;
114
115             String dataOrderInfo = null;
116             if(root.has("dataOrderInfo")){
117                 dataOrderInfo = root.get("dataOrderInfo").toString();
118             }
119
120             if(root.has("modelType")){
121                 JsonNode dataType = root.get("modelType");
122                 String modelType= dataType.toString();
123                 if(modelType.contains("yml")){
124                     if (root.has(optimizationModelsDictionaryData)){
125                         if (root.get(optimizationModelsDictionaryData).has(description)){
126                             optimizationModels.setDescription(root.get(optimizationModelsDictionaryData).get(description).asText().replace("\"", ""));
127                         }
128                         if (root.get(optimizationModelsDictionaryData).has(modelName)){
129                             optimizationModels.setModelName(root.get(optimizationModelsDictionaryData).get(modelName).asText().replace("\"", ""));
130                             this.newModel.setModelName(optimizationModels.getModelName());
131                         }
132                         if (root.get(optimizationModelsDictionaryData).has(version)){
133                             optimizationModels.setVersion(root.get(optimizationModelsDictionaryData).get(version).asText().replace("\"", ""));
134                             this.newModel.setVersion(optimizationModels.getVersion());
135                         }
136                     }
137
138                     classMap = new LinkedHashMap<>();
139                     JsonNode data = root.get(classMapData);
140                     ObjectMapper mapper1 = new ObjectMapper();
141                     String data1 = data.toString().substring(1, data.toString().length()-1);
142                     data1 = data1.replace("\\", "");
143                     data1=data1.replace("\"{","{");
144                     data1=data1.replace("}\"","}");
145                     JSONObject jsonObject = new JSONObject(data1);
146                     Set<String> keys = jsonObject.keySet();
147                     for(String key : keys){
148                         String value = jsonObject.get(key).toString();
149                         MSAttributeObject msAttributeObject = mapper1.readValue(value, MSAttributeObject.class);
150                         classMap.put(key, msAttributeObject);
151                     }
152
153                     userId = root.get("userid").textValue();
154                     MSAttributeObject mainClass = classMap.get(this.newModel.getModelName());
155                     this.newModel.setDependency("[]");
156                     String value = new Gson().toJson(mainClass.getSubClass());
157                     this.newModel.setSubattributes(value);
158                     String attributes= mainClass.getAttribute().toString().replace("{", "").replace("}", "");
159                     int equalsIndexForAttributes= attributes.indexOf('=');
160                     String atttributesAfterFirstEquals= attributes.substring(equalsIndexForAttributes+1, attributes.length()-1);
161                     this.newModel.setAttributes(atttributesAfterFirstEquals);
162                     String refAttributes= mainClass.getRefAttribute().toString().replace("{", "").replace("}", "");
163                     int equalsIndex= refAttributes.indexOf('=');
164                     String refAttributesAfterFirstEquals= refAttributes.substring(equalsIndex+1, refAttributes.length()-1);
165                     this.newModel.setRefattributes(refAttributesAfterFirstEquals);
166                     this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", ""));
167                     this.newModel.setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
168
169                 }else{
170                     if (fromAPI) {
171                         optimizationModels = mapper.readValue(root.get(dictionaryFields).toString(), OptimizationModels.class);
172                         userId = "API";
173                     } else {
174                         if (root.has(optimizationModelsDictionaryData)){
175                             if (root.get(optimizationModelsDictionaryData).has(description)){
176                                 optimizationModels.setDescription(root.get(optimizationModelsDictionaryData).get(description).asText().replace("\"", ""));
177                             }
178                             if (root.get(optimizationModelsDictionaryData).has(modelName)){
179                                 optimizationModels.setModelName(root.get(optimizationModelsDictionaryData).get(modelName).asText().replace("\"", ""));
180                                 this.newModel.setModelName(optimizationModels.getModelName());
181                             }
182                             if (root.get(optimizationModelsDictionaryData).has(version)){
183                                 optimizationModels.setVersion(root.get(optimizationModelsDictionaryData).get(version).asText().replace("\"", ""));
184                                 this.newModel.setVersion(optimizationModels.getVersion());
185                             }
186                         }
187                         if(root.has(classMapData)){
188                             classMap = new LinkedHashMap<>();
189                             JsonNode data = root.get(classMapData);
190                             ObjectMapper mapper1 = new ObjectMapper();
191                             String data1 = data.toString().substring(1, data.toString().length()-1);
192                             data1 = data1.replace("\\", "");
193                             JSONObject jsonObject = new JSONObject(data1);
194                             Set<String> keys = jsonObject.keySet();
195                             for(String key : keys){
196                                 String value = jsonObject.get(key).toString();
197                                 MSAttributeObject msAttributeObject = mapper1.readValue(value, MSAttributeObject.class);
198                                 classMap.put(key, msAttributeObject);
199                             }
200                         }
201                         userId = root.get("userid").textValue();
202                         addValuesToNewModel(classMap);
203                     }
204                 }
205             }
206             optimizationModels.setAttributes(this.newModel.getAttributes());
207             optimizationModels.setRefattributes(this.newModel.getRefattributes());
208             optimizationModels.setDependency(this.newModel.getDependency());
209             optimizationModels.setModelName(this.newModel.getModelName());
210             optimizationModels.setSubattributes(this.newModel.getSubattributes());
211             optimizationModels.setVersion(this.newModel.getVersion());
212             optimizationModels.setEnumValues(this.newModel.getEnumValues());
213             optimizationModels.setAnnotation(this.newModel.getAnnotation());
214
215             if(dataOrderInfo != null){
216                 optimizationModels.setDataOrderInfo(dataOrderInfo);
217             }
218
219             String checkName = optimizationModels.getModelName() + ":" + optimizationModels.getVersion();
220             List<Object> duplicateData =  commonClassDao.checkDuplicateEntry(checkName, "modelName:version", OptimizationModels.class);
221             boolean duplicateflag = false;
222             if(duplicateData!=null && !duplicateData.isEmpty()){
223                 OptimizationModels data = (OptimizationModels) duplicateData.get(0);
224                 if(request.getParameter(operation) != null && UPDATE.equals(request.getParameter(operation))){
225                     optimizationModels.setId(data.getId());
226                 }else if((request.getParameter(operation) != null && !UPDATE.equals(request.getParameter(operation))) ||
227                         (request.getParameter(operation) == null && (data.getId() != optimizationModels.getId()))){
228                     duplicateflag = true;
229                 }
230             }
231             UserInfo userInfo = dUtils.getUserInfo(userId);
232
233             String responseString = null;
234             if(!duplicateflag){
235                 optimizationModels.setUserCreatedBy(userInfo);
236                 if(optimizationModels.getId() == 0){
237                     commonClassDao.save(optimizationModels);
238                 }else{
239                     commonClassDao.update(optimizationModels);
240                 }
241                 responseString = mapper.writeValueAsString(commonClassDao.getData(OptimizationModels.class));
242             }else{
243                 responseString = duplicateResponseString;
244             }
245             if(fromAPI){
246                 return dUtils.getResultForApi(responseString);
247             }else{
248                 dUtils.setResponseData(response, optimizationModelsDictionaryDatas, responseString);
249             }
250         }catch (Exception e){
251             dUtils.setErrorResponseData(response, e);
252         }
253         return null;
254     }
255
256     @RequestMapping(value={"/oof_dictionary/remove_model"}, method={RequestMethod.POST})
257     public void removeOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response) throws IOException {
258         DictionaryUtils dUtils = getDictionaryUtilsInstance();
259         dUtils.removeData(request, response, optimizationModelsDictionaryDatas, OptimizationModels.class);
260     }
261
262     private void addValuesToNewModel(HashMap<String,MSAttributeObject > classMap) {
263         //Loop  through the classmap and pull out the required info for the new file.
264         String subAttribute = null;
265
266         MSAttributeObject mainClass = classMap.get(this.newModel.getModelName());
267
268         if (mainClass !=null){
269             String dependTemp = StringUtils.replaceEach(mainClass.getDependency(), new String[]{"[", "]", " "}, new String[]{"", "", ""});
270             ArrayList<String> dependency = new ArrayList<>(Arrays.asList(dependTemp.split(",")));
271             dependency = getFullDependencyList(dependency);
272             for (String element : dependency){
273                 MSAttributeObject temp = classMap.get(element);
274                 if (temp!=null){
275                     mainClass.addAllRefAttribute(temp.getRefAttribute());
276                     mainClass.addAllAttribute(temp.getAttribute());
277                 }
278             }
279             subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
280         }else{
281             subAttribute = "{}";
282             this.newModel.setDependency("");
283         }
284
285         if (mainClass != null && mainClass.getDependency()==null){
286             mainClass.setDependency("");
287         }
288         if(mainClass != null){
289             this.newModel.setDependency(mainClass.getDependency());
290             this.newModel.setSubattributes(subAttribute);
291             this.newModel.setAttributes(mainClass.getAttribute().toString().replace("{", "").replace("}", ""));
292             this.newModel.setRefattributes(mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""));
293             this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", ""));
294             this.newModel.setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
295         }
296     }
297
298     private ArrayList<String> getFullDependencyList(ArrayList<String> dependency) {
299         ArrayList<String> returnList = new ArrayList<>();
300         ArrayList<String> workingList;
301         returnList.addAll(dependency);
302         for (String element : dependency ){
303             if (classMap.containsKey(element)){
304                 MSAttributeObject value = classMap.get(element);
305                 String rawValue = StringUtils.replaceEach(value.getDependency(), new String[]{"[", "]"}, new String[]{"", ""});
306                 workingList = new ArrayList<>(Arrays.asList(rawValue.split(",")));
307                 for(String depend : workingList){
308                     if (!returnList.contains(depend) && !depend.isEmpty()){
309                         returnList.add(depend.trim());
310                     }
311                 }
312             }
313         }
314
315         return returnList;
316     }
317
318 }