2 * ============LICENSE_START=======================================================
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
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=========================================================
21 package org.onap.policy.pap.xacml.rest.controller;
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;
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;
36 import javax.servlet.http.HttpServletRequest;
37 import javax.servlet.http.HttpServletResponse;
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;
56 public class OptimizationDictionaryController {
57 private static CommonClassDao commonClassDao;
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";
71 public OptimizationDictionaryController() {
75 private DictionaryUtils getDictionaryUtilsInstance() {
76 return DictionaryUtils.getDictionaryUtils();
80 public OptimizationDictionaryController(CommonClassDao commonClassDao) {
81 setCommonClassDao(commonClassDao);
84 public static void setCommonClassDao(CommonClassDao commonClassDao) {
85 OptimizationDictionaryController.commonClassDao = commonClassDao;
88 MSModelUtils utils = new MSModelUtils(XACMLPapServlet.getMsOnapName(), XACMLPapServlet.getMsPolicyName());
90 private OptimizationModels newModel;
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);
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);
110 @RequestMapping(value = {"/oof_dictionary/save_model"}, method = {RequestMethod.POST})
111 public ModelAndView saveOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response)
113 DictionaryUtils dUtils = getDictionaryUtilsInstance();
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;
123 String dataOrderInfo = null;
124 if (root.has("dataOrderInfo")) {
125 dataOrderInfo = root.get("dataOrderInfo").toString();
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("\"", ""));
137 if (root.get(optimizationModelsDictionaryData).has(modelName)) {
138 optimizationModels.setModelName(root.get(optimizationModelsDictionaryData).get(modelName)
139 .asText().replace("\"", ""));
140 this.newModel.setModelName(optimizationModels.getModelName());
142 if (root.get(optimizationModelsDictionaryData).has(version)) {
143 optimizationModels.setVersion(
144 root.get(optimizationModelsDictionaryData).get(version).asText().replace("\"", ""));
145 this.newModel.setVersion(optimizationModels.getVersion());
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);
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("}", ""));
181 .setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
186 mapper.readValue(root.get(dictionaryFields).toString(), OptimizationModels.class);
189 if (root.has(optimizationModelsDictionaryData)) {
190 if (root.get(optimizationModelsDictionaryData).has(description)) {
191 optimizationModels.setDescription(root.get(optimizationModelsDictionaryData)
192 .get(description).asText().replace("\"", ""));
194 if (root.get(optimizationModelsDictionaryData).has(modelName)) {
195 optimizationModels.setModelName(root.get(optimizationModelsDictionaryData)
196 .get(modelName).asText().replace("\"", ""));
197 this.newModel.setModelName(optimizationModels.getModelName());
199 if (root.get(optimizationModelsDictionaryData).has(version)) {
200 optimizationModels.setVersion(root.get(optimizationModelsDictionaryData).get(version)
201 .asText().replace("\"", ""));
202 this.newModel.setVersion(optimizationModels.getVersion());
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);
219 userId = root.get("userid").textValue();
220 addValuesToNewModel(classMap);
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());
233 if (dataOrderInfo != null) {
234 optimizationModels.setDataOrderInfo(dataOrderInfo);
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;
250 UserInfo userInfo = dUtils.getUserInfo(userId);
252 String responseString = null;
253 if (!duplicateflag) {
254 optimizationModels.setUserCreatedBy(userInfo);
255 if (optimizationModels.getId() == 0) {
256 commonClassDao.save(optimizationModels);
258 commonClassDao.update(optimizationModels);
260 responseString = mapper.writeValueAsString(commonClassDao.getData(OptimizationModels.class));
262 responseString = duplicateResponseString;
265 return dUtils.getResultForApi(responseString);
267 dUtils.setResponseData(response, optimizationModelsDictionaryDatas, responseString);
269 } catch (Exception e) {
270 dUtils.setErrorResponseData(response, e);
275 @RequestMapping(value = {"/oof_dictionary/remove_model"}, method = {RequestMethod.POST})
276 public void removeOptimizationModelsDictionary(HttpServletRequest request, HttpServletResponse response)
278 DictionaryUtils dUtils = getDictionaryUtilsInstance();
279 dUtils.removeData(request, response, optimizationModelsDictionaryDatas, OptimizationModels.class);
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;
286 MSAttributeObject mainClass = classMap.get(this.newModel.getModelName());
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);
296 mainClass.addAllRefAttribute(temp.getRefAttribute());
297 mainClass.addAllAttribute(temp.getAttribute());
300 subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
303 this.newModel.setDependency("");
306 if (mainClass != null && mainClass.getDependency() == null) {
307 mainClass.setDependency("");
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("}", ""));
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);
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());