Merge "Policy Installation documentation"
[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 }