2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 package org.onap.policy.pap.xacml.rest.controller;
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;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
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;
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;
55 public class OptimizationDictionaryController {
56 private static CommonClassDao commonClassDao;
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";
71 public OptimizationDictionaryController(){
75 private DictionaryUtils getDictionaryUtilsInstance(){
76 return DictionaryUtils.getDictionaryUtils();
80 public OptimizationDictionaryController(CommonClassDao commonClassDao){
81 setCommonClassDao(commonClassDao);
83 public static void setCommonClassDao(CommonClassDao commonClassDao) {
84 OptimizationDictionaryController.commonClassDao = commonClassDao;
87 MSModelUtils utils = new MSModelUtils(XACMLPapServlet.getMsOnapName(), XACMLPapServlet.getMsPolicyName());
89 private OptimizationModels newModel;
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);
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);
103 @RequestMapping(value={"/oof_dictionary/save_model"}, method={RequestMethod.POST})
104 public ModelAndView saveOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response) throws IOException{
105 DictionaryUtils dUtils = getDictionaryUtilsInstance();
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;
115 String dataOrderInfo = null;
116 if(root.has("dataOrderInfo")){
117 dataOrderInfo = root.get("dataOrderInfo").toString();
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("\"", ""));
128 if (root.get(optimizationModelsDictionaryData).has(modelName)){
129 optimizationModels.setModelName(root.get(optimizationModelsDictionaryData).get(modelName).asText().replace("\"", ""));
130 this.newModel.setModelName(optimizationModels.getModelName());
132 if (root.get(optimizationModelsDictionaryData).has(version)){
133 optimizationModels.setVersion(root.get(optimizationModelsDictionaryData).get(version).asText().replace("\"", ""));
134 this.newModel.setVersion(optimizationModels.getVersion());
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);
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("}", ""));
171 optimizationModels = mapper.readValue(root.get(dictionaryFields).toString(), OptimizationModels.class);
174 if (root.has(optimizationModelsDictionaryData)){
175 if (root.get(optimizationModelsDictionaryData).has(description)){
176 optimizationModels.setDescription(root.get(optimizationModelsDictionaryData).get(description).asText().replace("\"", ""));
178 if (root.get(optimizationModelsDictionaryData).has(modelName)){
179 optimizationModels.setModelName(root.get(optimizationModelsDictionaryData).get(modelName).asText().replace("\"", ""));
180 this.newModel.setModelName(optimizationModels.getModelName());
182 if (root.get(optimizationModelsDictionaryData).has(version)){
183 optimizationModels.setVersion(root.get(optimizationModelsDictionaryData).get(version).asText().replace("\"", ""));
184 this.newModel.setVersion(optimizationModels.getVersion());
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);
201 userId = root.get("userid").textValue();
202 addValuesToNewModel(classMap);
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());
215 if(dataOrderInfo != null){
216 optimizationModels.setDataOrderInfo(dataOrderInfo);
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;
231 UserInfo userInfo = dUtils.getUserInfo(userId);
233 String responseString = null;
235 optimizationModels.setUserCreatedBy(userInfo);
236 if(optimizationModels.getId() == 0){
237 commonClassDao.save(optimizationModels);
239 commonClassDao.update(optimizationModels);
241 responseString = mapper.writeValueAsString(commonClassDao.getData(OptimizationModels.class));
243 responseString = duplicateResponseString;
246 return dUtils.getResultForApi(responseString);
248 dUtils.setResponseData(response, optimizationModelsDictionaryDatas, responseString);
250 }catch (Exception e){
251 dUtils.setErrorResponseData(response, e);
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);
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;
266 MSAttributeObject mainClass = classMap.get(this.newModel.getModelName());
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);
275 mainClass.addAllRefAttribute(temp.getRefAttribute());
276 mainClass.addAllAttribute(temp.getAttribute());
279 subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
282 this.newModel.setDependency("");
285 if (mainClass != null && mainClass.getDependency()==null){
286 mainClass.setDependency("");
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("}", ""));
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());