2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
6 * Modified Copyright (C) 2018 Samsung Electronics Co., Ltd.
7 * Modifications Copyright (C) 2019 Nordix Foundation.
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.pap.xacml.rest.components;
25 import com.google.gson.Gson;
27 import java.io.BufferedInputStream;
28 import java.io.BufferedOutputStream;
30 import java.io.FileOutputStream;
31 import java.io.IOException;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.Enumeration;
35 import java.util.HashMap;
36 import java.util.LinkedHashMap;
37 import java.util.List;
39 import java.util.zip.ZipEntry;
40 import java.util.zip.ZipFile;
42 import org.apache.commons.io.FileUtils;
43 import org.apache.commons.lang.StringUtils;
44 import org.onap.policy.common.logging.eelf.MessageCodes;
45 import org.onap.policy.common.logging.eelf.PolicyLogger;
46 import org.onap.policy.common.logging.flexlogger.FlexLogger;
47 import org.onap.policy.common.logging.flexlogger.Logger;
48 import org.onap.policy.pap.xacml.rest.XACMLPapServlet;
49 import org.onap.policy.pap.xacml.rest.daoimpl.CommonClassDaoImpl;
50 import org.onap.policy.rest.jpa.MicroServiceModels;
51 import org.onap.policy.rest.jpa.UserInfo;
52 import org.onap.policy.rest.util.MSAttributeObject;
53 import org.onap.policy.rest.util.MSModelUtils;
54 import org.onap.policy.rest.util.MSModelUtils.MODEL_TYPE;
56 public class CreateNewMicroServiceModel {
57 private static final Logger logger = FlexLogger.getLogger(CreateNewMicroServiceModel.class);
58 private MicroServiceModels newModel = null;
59 private HashMap<String, MSAttributeObject> classMap = new HashMap<>();
61 private MSModelUtils utils = new MSModelUtils(XACMLPapServlet.getMsOnapName(), XACMLPapServlet.getMsPolicyName());
63 public CreateNewMicroServiceModel(String fileName, String serviceName, String string, String version) {
68 * Instantiates a new creates the new micro service model.
70 * @param importFile the import file
71 * @param modelName the model name
72 * @param description the description
73 * @param version the version
74 * @param randomID the random ID
76 public CreateNewMicroServiceModel(String importFile, String modelName, String description, String version,
79 this.newModel = new MicroServiceModels();
80 this.newModel.setVersion(version);
81 this.newModel.setModelName(modelName);
82 UserInfo userInfo = new UserInfo();
83 userInfo.setUserLoginId("API");
84 this.newModel.setUserCreatedBy(userInfo);
85 String cleanUpFile = null;
87 Map<String, MSAttributeObject> tempMap = new HashMap<>();
88 // Need to delete the file
89 if (importFile.contains(".zip")) {
90 extractFolder(randomID + ".zip");
91 File directory = new File("ExtractDir" + File.separator + randomID);
92 List<File> fileList = listModelFiles(directory.toString());
93 // get all the files from a director
94 processFiles(modelName, fileList);
95 doCleanUpFiles(randomID);
97 if (importFile.contains(".yml")) {
99 processYmlModel("ExtractDir" + File.separator + randomID + ".yml", modelName);
100 cleanUpFile = "ExtractDir" + File.separator + randomID + ".yml";
103 tempMap = utils.processEpackage("ExtractDir" + File.separator + randomID + ".xmi", MODEL_TYPE.XMI);
104 classMap.putAll(tempMap);
105 cleanUpFile = "ExtractDir" + File.separator + randomID + ".xmi";
108 File deleteFile = new File(cleanUpFile);
113 private void processFiles(String modelName, List<File> fileList) {
114 Map<String, MSAttributeObject> tempMap;
115 for (File file : fileList) {
117 int indx = file.getName().lastIndexOf('.');
118 String type = file.getName().substring(indx + 1);
120 if ("yml".equalsIgnoreCase(type)) {
122 processYmlModel(file.toString(), modelName);
126 tempMap = utils.processEpackage(file.getAbsolutePath(), MODEL_TYPE.XMI);
127 classMap.putAll(tempMap);
133 private void doCleanUpFiles(String randomID) {
135 cleanUpFile = "ExtractDir" + File.separator + randomID + ".zip";
137 FileUtils.deleteDirectory(new File("ExtractDir" + File.separator + randomID));
138 FileUtils.deleteDirectory(new File(randomID));
139 File deleteFile = new File(cleanUpFile);
140 FileUtils.forceDelete(deleteFile);
141 } catch (IOException e) {
142 logger.error("Failed to unzip model file " + randomID, e);
146 private void processYmlModel(String fileName, String modelName) {
150 utils.parseTosca(fileName);
152 MSAttributeObject msAttributes = new MSAttributeObject();
153 msAttributes.setClassName(modelName);
155 LinkedHashMap<String, String> returnAttributeList = new LinkedHashMap<>();
156 returnAttributeList.put(modelName, utils.getAttributeString());
157 msAttributes.setAttribute(returnAttributeList);
159 msAttributes.setSubClass(utils.getRetmap());
161 msAttributes.setMatchingSet(utils.getMatchableValues());
163 LinkedHashMap<String, String> returnReferenceList = new LinkedHashMap<>();
165 returnReferenceList.put(modelName, utils.getReferenceAttributes());
166 msAttributes.setRefAttribute(returnReferenceList);
168 if (!PolicyDbDao.isNullOrEmpty(utils.getListConstraints())) {
169 LinkedHashMap<String, String> enumList = new LinkedHashMap<>();
170 String[] listArray = utils.getListConstraints().split("#");
171 for (String str : listArray) {
172 String[] strArr = str.split("=");
173 if (strArr.length > 1) {
174 enumList.put(strArr[0], strArr[1]);
177 msAttributes.setEnumType(enumList);
179 if (utils.getJsonRuleFormation() != null) {
180 msAttributes.setRuleFormation(utils.getJsonRuleFormation());
183 if (utils.getDataOrderInfo() != null) {
184 msAttributes.setDataOrderInfo(utils.getDataOrderInfo());
187 classMap = new LinkedHashMap<>();
188 classMap.put(modelName, msAttributes);
190 } catch (Exception e) {
191 logger.error("Failed to process yml model" + e);
196 private List<File> listModelFiles(String directoryName) {
197 File directory = new File(directoryName);
198 List<File> resultList = new ArrayList<>();
199 File[] fList = directory.listFiles();
200 for (File file : fList) {
202 resultList.add(file);
203 } else if (file.isDirectory()) {
204 resultList.addAll(listModelFiles(file.getAbsolutePath()));
210 @SuppressWarnings("rawtypes")
211 private void extractFolder(String zipFile) {
213 File file = new File(zipFile);
215 try (ZipFile zip = new ZipFile("ExtractDir" + File.separator + file)) {
217 String newPath = zipFile.substring(0, zipFile.length() - 4);
218 new File(newPath).mkdir();
219 Enumeration zipFileEntries = zip.entries();
221 // Process each entry
222 while (zipFileEntries.hasMoreElements()) {
223 // grab a zip file entry
224 ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
225 String currentEntry = entry.getName();
226 File destFile = new File("ExtractDir" + File.separator + newPath + File.separator + currentEntry);
227 File destinationParent = destFile.getParentFile();
229 destinationParent.mkdirs();
231 if (!entry.isDirectory()) {
232 BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry));
235 byte data[] = new byte[BUFFER];
236 try (FileOutputStream fos = new FileOutputStream(destFile);
237 BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) {
239 while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
240 dest.write(data, 0, currentByte);
247 if (currentEntry.endsWith(".zip")) {
248 extractFolder(destFile.getAbsolutePath());
251 } catch (IOException e) {
252 logger.error("Failed to unzip model file " + zipFile + e);
256 public Map<String, String> addValuesToNewModel(String type) {
258 Map<String, String> successMap = new HashMap<>();
259 MSAttributeObject mainClass = null;
260 List<String> dependency = null;
261 String subAttribute = null;
263 if (!classMap.containsKey(this.newModel.getModelName())) {
265 "Model Provided does not contain the service name provided in request. Unable to import new model");
266 PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, "AddValuesToNewModel",
267 "Unable to pull out required values, file missing service name provided in request");
268 successMap.put("error", "MISSING");
271 mainClass = classMap.get(this.newModel.getModelName());
273 if (".yml".equalsIgnoreCase(type)) {
275 newModel.setDependency("[]");
276 if (mainClass.getSubClass() != null) {
277 String value = new Gson().toJson(mainClass.getSubClass());
278 newModel.setSub_attributes(value);
281 if (mainClass.getAttribute() != null) {
282 String attributes = mainClass.getAttribute().toString().replace("{", "").replace("}", "");
283 int equalsIndexForAttributes = attributes.indexOf("=");
284 String atttributesAfterFirstEquals = attributes.substring(equalsIndexForAttributes + 1);
285 this.newModel.setAttributes(atttributesAfterFirstEquals);
288 if (mainClass.getRefAttribute() != null) {
289 String refAttributes = mainClass.getRefAttribute().toString().replace("{", "").replace("}", "");
290 int equalsIndex = refAttributes.indexOf("=");
291 String refAttributesAfterFirstEquals = refAttributes.substring(equalsIndex + 1);
292 this.newModel.setRef_attributes(refAttributesAfterFirstEquals);
295 if (mainClass.getEnumType() != null) {
296 this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", ""));
299 if (mainClass.getMatchingSet() != null) {
300 this.newModel.setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
302 if (mainClass.getRuleFormation() != null) {
303 this.newModel.setRuleFormation(mainClass.getRuleFormation());
306 if (mainClass.getDataOrderInfo() != null) {
307 this.newModel.setDataOrderInfo(mainClass.getDataOrderInfo());
312 String dependTemp = StringUtils.replaceEach(mainClass.getDependency(), new String[] {"[", "]", " "},
313 new String[] {"", "", ""});
314 this.newModel.setDependency(dependTemp);
315 if (this.newModel.getDependency() != null && !this.newModel.getDependency().isEmpty()) {
316 dependency = new ArrayList<String>(Arrays.asList(dependTemp.split(",")));
317 dependency = utils.getFullDependencyList(dependency, classMap);
318 if (!dependency.isEmpty()) {
319 for (String element : dependency) {
320 MSAttributeObject temp = new MSAttributeObject();
321 if (classMap.containsKey(element)) {
322 temp = classMap.get(element);
323 mainClass.addAllRefAttribute(temp.getRefAttribute());
324 mainClass.addAllAttribute(temp.getAttribute());
329 subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
331 this.newModel.setSub_attributes(subAttribute);
332 if (mainClass.getAttribute() != null && !mainClass.getAttribute().isEmpty()) {
333 this.newModel.setAttributes(mainClass.getAttribute().toString().replace("{", "").replace("}", ""));
336 if (mainClass.getRefAttribute() != null && !mainClass.getRefAttribute().isEmpty()) {
338 .setRef_attributes(mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""));
341 if (mainClass.getEnumType() != null && !mainClass.getEnumType().isEmpty()) {
342 this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", ""));
345 if (mainClass.getMatchingSet() != null && !mainClass.getMatchingSet().isEmpty()) {
346 this.newModel.setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", ""));
349 successMap.put("success", "success");
354 public Map<String, String> saveImportService() {
355 String modelName = this.newModel.getModelName();
356 String imported_by = "API";
357 String version = this.newModel.getVersion();
358 Map<String, String> successMap = new HashMap<>();
359 CommonClassDaoImpl dbConnection = new CommonClassDaoImpl();
360 List<Object> result =
361 dbConnection.getDataById(MicroServiceModels.class, "modelName:version", modelName + ":" + version);
362 if (result == null || result.isEmpty()) {
363 MicroServiceModels model = new MicroServiceModels();
364 model.setModelName(modelName);
365 model.setVersion(version);
366 model.setAttributes(this.newModel.getAttributes());
367 model.setAnnotation(this.newModel.getAnnotation());
368 model.setDependency(this.newModel.getDependency());
369 model.setDescription(this.newModel.getDescription());
370 model.setEnumValues(this.newModel.getEnumValues());
371 model.setRef_attributes(this.newModel.getRef_attributes());
372 model.setSub_attributes(this.newModel.getSub_attributes());
373 model.setDataOrderInfo(this.newModel.getDataOrderInfo());
374 model.setDecisionModel(this.newModel.isDecisionModel());
375 model.setRuleFormation(this.newModel.getRuleFormation());
376 UserInfo userInfo = new UserInfo();
377 userInfo.setUserLoginId(imported_by);
378 userInfo.setUserName(imported_by);
379 model.setUserCreatedBy(userInfo);
380 dbConnection.save(model);
381 successMap.put("success", "success");
383 successMap.put("DBError", "EXISTS");
384 logger.error("Import new service failed. Service already exists");