/*- * ============LICENSE_START======================================================= * ONAP-PAP-REST * ================================================================================ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.policy.pap.xacml.rest.components; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.commons.io.FileUtils; import org.onap.policy.common.logging.eelf.MessageCodes; import org.onap.policy.common.logging.eelf.PolicyLogger; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.pap.xacml.rest.XACMLPapServlet; import org.onap.policy.pap.xacml.rest.daoimpl.CommonClassDaoImpl; import org.onap.policy.rest.jpa.OptimizationModels; import org.onap.policy.rest.jpa.UserInfo; import org.onap.policy.rest.util.MSAttributeObject; import org.onap.policy.rest.util.MSModelUtils; import org.onap.policy.rest.util.MSModelUtils.MODEL_TYPE; import com.google.gson.Gson; public class CreateNewOptimizationModel { private static final Logger logger = FlexLogger.getLogger(CreateNewOptimizationModel.class); private OptimizationModels newModel = null; private HashMap classMap = new HashMap<>(); private static final String EXTRACTDIR = "ExtractDir"; private static final String SUCCESS = "success"; MSModelUtils utils = new MSModelUtils(XACMLPapServlet.getMsOnapName(), XACMLPapServlet.getMsPolicyName()); public CreateNewOptimizationModel() { super(); } public CreateNewOptimizationModel(String importFile, String modelName, String description, String version, String randomID) { this.newModel = new OptimizationModels(); this.newModel.setVersion(version); this.newModel.setModelName(modelName); this.newModel.setDescription(description); UserInfo userInfo = new UserInfo(); userInfo.setUserLoginId("API"); this.newModel.setUserCreatedBy(userInfo); String cleanUpFile = null; Map tempMap = new HashMap<>(); //Need to delete the file if (importFile.contains(".zip")){ extractFolder(randomID + ".zip"); File directory = new File(EXTRACTDIR + File.separator + randomID); List fileList = listModelFiles(directory.toString()); //get all the files from a director for (File file : fileList){ if (file.isFile()){ processYmlModel(file.toString(), modelName); } } cleanUpFile = EXTRACTDIR + File.separator + randomID + ".zip"; try { FileUtils.deleteDirectory(new File(EXTRACTDIR + File.separator + randomID)); FileUtils.deleteDirectory(new File(randomID)); File deleteFile = new File(cleanUpFile); FileUtils.forceDelete(deleteFile); } catch (IOException e) { logger.error("Failed to unzip model file " + randomID, e); } }else { if(importFile.contains(".yml")){ processYmlModel(EXTRACTDIR + File.separator + randomID+".yml", modelName); cleanUpFile = EXTRACTDIR + File.separator + randomID+".yml"; }else{ tempMap = utils.processEpackage(EXTRACTDIR + File.separator + randomID+".xmi", MODEL_TYPE.XMI); classMap.putAll(tempMap); cleanUpFile = EXTRACTDIR + File.separator + randomID+".xmi"; } File deleteFile = new File(cleanUpFile); deleteFile.delete(); } } private void processYmlModel(String fileName, String modelName){ try { utils.parseTosca(fileName); MSAttributeObject msAttributes= new MSAttributeObject(); msAttributes.setClassName(modelName); LinkedHashMap returnAttributeList =new LinkedHashMap<>(); returnAttributeList.put(modelName, utils.getAttributeString()); msAttributes.setAttribute(returnAttributeList); msAttributes.setSubClass(utils.getRetmap()); msAttributes.setMatchingSet(utils.getMatchableValues()); LinkedHashMap returnReferenceList =new LinkedHashMap<>(); returnReferenceList.put(modelName, utils.getReferenceAttributes()); msAttributes.setRefAttribute(returnReferenceList); if(!"".equals(utils.getListConstraints())){ LinkedHashMap enumList =new LinkedHashMap<>(); String[] listArray=utils.getListConstraints().split("#"); for(String str:listArray){ String[] strArr= str.split("="); if(strArr.length>1){ enumList.put(strArr[0], strArr[1]); } } msAttributes.setEnumType(enumList); } classMap=new LinkedHashMap<>(); classMap.put(modelName, msAttributes); } catch (Exception e) { logger.error("Failed to process yml model" + e); } } private List listModelFiles(String directoryName) { File directory = new File(directoryName); List resultList = new ArrayList<>(); File[] fList = directory.listFiles(); for (File file : fList) { if (file.isFile()) { resultList.add(file); } else if (file.isDirectory()) { resultList.addAll(listModelFiles(file.getAbsolutePath())); } } return resultList; } @SuppressWarnings("rawtypes") private void extractFolder(String zipFile) { int buffer = 2048; File file = new File(zipFile); try(ZipFile zip = new ZipFile(EXTRACTDIR + File.separator +file);){ String newPath = zipFile.substring(0, zipFile.length() - 4); new File(newPath).mkdir(); Enumeration zipFileEntries = zip.entries(); // Process each entry while (zipFileEntries.hasMoreElements()){ // grab a zip file entry ZipEntry entry = (ZipEntry) zipFileEntries.nextElement(); String currentEntry = entry.getName(); File destFile = new File(EXTRACTDIR + File.separator + newPath + File.separator + currentEntry); File destinationParent = destFile.getParentFile(); destinationParent.mkdirs(); if (!entry.isDirectory()){ int currentByte; byte[] data = new byte[buffer]; try(FileOutputStream fos = new FileOutputStream(destFile); BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry)); BufferedOutputStream dest = new BufferedOutputStream(fos, buffer)) { while ((currentByte = is.read(data, 0, buffer)) != -1) { dest.write(data, 0, currentByte); } dest.flush(); } } if (currentEntry.endsWith(".zip")){ extractFolder(destFile.getAbsolutePath()); } } } catch (IOException e) { logger.error("Failed to unzip model file " + zipFile + e); } } public Map addValuesToNewModel() { Map successMap = new HashMap<>(); MSAttributeObject mainClass; if (!classMap.containsKey(this.newModel.getModelName())){ logger.error("Model Provided does not contain the service name provided in request. Unable to import new model"); PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, "AddValuesToNewModel", "Unable to pull out required values, file missing service name provided in request"); successMap.put("error", "MISSING"); return successMap; } mainClass = classMap.get(this.newModel.getModelName()); newModel.setDependency("[]"); if(mainClass.getSubClass() != null){ String value = new Gson().toJson(mainClass.getSubClass()); newModel.setSubattributes(value); } if(mainClass.getAttribute() != null){ String attributes= mainClass.getAttribute().toString().replace("{", "").replace("}", ""); int equalsIndexForAttributes= attributes.indexOf('='); String atttributesAfterFirstEquals= attributes.substring(equalsIndexForAttributes+1); this.newModel.setAttributes(atttributesAfterFirstEquals); } if(mainClass.getRefAttribute() != null){ String refAttributes= mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""); int equalsIndex= refAttributes.indexOf('='); String refAttributesAfterFirstEquals= refAttributes.substring(equalsIndex+1); this.newModel.setRefattributes(refAttributesAfterFirstEquals); } if(mainClass.getEnumType() != null){ this.newModel.setEnumValues(mainClass.getEnumType().toString().replace("{", "").replace("}", "")); } if(mainClass.getMatchingSet() != null){ this.newModel.setAnnotation(mainClass.getMatchingSet().toString().replace("{", "").replace("}", "")); } successMap.put(SUCCESS, SUCCESS); return successMap; } public Map saveImportService(){ String modelName = this.newModel.getModelName(); String importedBy = "API"; String version = this.newModel.getVersion(); Map successMap = new HashMap<>(); CommonClassDaoImpl dbConnection = new CommonClassDaoImpl(); List result = dbConnection.getDataById(OptimizationModels.class, "modelName:version", modelName+":"+version); if(result.isEmpty()){ OptimizationModels model = new OptimizationModels(); model.setModelName(modelName); model.setVersion(version); model.setAttributes(this.newModel.getAttributes()); model.setAnnotation(this.newModel.getAnnotation()); model.setDependency(this.newModel.getDependency()); model.setDescription(this.newModel.getDescription()); model.setEnumValues(this.newModel.getEnumValues()); model.setRefattributes(this.newModel.getRefattributes()); model.setSubattributes(this.newModel.getSubattributes()); model.setDataOrderInfo(this.newModel.getDataOrderInfo()); UserInfo userInfo = new UserInfo(); userInfo.setUserLoginId(importedBy); userInfo.setUserName(importedBy); model.setUserCreatedBy(userInfo); dbConnection.save(model); successMap.put(SUCCESS, SUCCESS); }else{ successMap.put("DBError", "EXISTS"); logger.error("Import new service failed. Service already exists"); } return successMap; } }