Consolidate PolicyRestAdapter setup
[policy/engine.git] / ONAP-PAP-REST / src / main / java / org / onap / policy / pap / xacml / rest / service / ImportService.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP-PAP-REST
4  * ================================================================================
5  * Copyright (C) 2017-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
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
21 package org.onap.policy.pap.xacml.rest.service;
22
23 import java.io.BufferedWriter;
24 import java.io.File;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.OutputStreamWriter;
29 import java.io.Writer;
30 import java.util.HashMap;
31 import java.util.Map;
32 import java.util.UUID;
33
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpServletResponse;
36
37 import org.onap.policy.common.logging.eelf.PolicyLogger;
38 import org.onap.policy.common.logging.flexlogger.FlexLogger;
39 import org.onap.policy.common.logging.flexlogger.Logger;
40 import org.onap.policy.pap.xacml.rest.components.CreateBRMSRuleTemplate;
41 import org.onap.policy.pap.xacml.rest.components.CreateNewMicroServiceModel;
42 import org.onap.policy.pap.xacml.rest.components.CreateNewOptimizationModel;
43
44 public class ImportService {
45     private static final Logger logger = FlexLogger.getLogger(ImportService.class);
46     private static String errorMessage = "Error in reading in file from API call";
47     private static String errorMsg = "error";
48     private static String operation = "operation";
49     private static String importHeader = "import";
50     private static String service = "service";
51     private static String extractDir = "ExtractDir";
52     private static String successMessage = "success";
53     private static String invalidServiceName = "Invalid ServiceName";
54     private static final String REGEX = "[0-9a-zA-Z._ ]*";
55     private static final String MISSING = "missing";
56
57     public void doImportMicroServicePut(HttpServletRequest request, HttpServletResponse response) {
58         String importServiceCreation = request.getParameter("importService");
59         String fileName = request.getParameter("fileName");
60         String version = request.getParameter("version");
61         String serviceName = request.getParameter("serviceName");
62
63         if (serviceName == null || serviceName.isEmpty() || !serviceName.matches(REGEX)) {
64             response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
65             response.addHeader(errorMsg, MISSING);
66             response.addHeader(operation, importHeader);
67             response.addHeader(service, invalidServiceName);
68             return;
69         }
70
71         String description = request.getParameter("description");
72         Map<String, String> successMap = new HashMap<>();
73         if (("BRMSPARAM").equals(importServiceCreation)) {
74             StringBuilder builder = new StringBuilder();
75             int ch;
76             try {
77                 while ((ch = request.getInputStream().read()) != -1) {
78                     builder.append((char) ch);
79                 }
80             } catch (IOException e) {
81                 logger.error(e);
82                 PolicyLogger.error(errorMessage);
83                 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
84                 response.addHeader(errorMsg, MISSING);
85                 response.addHeader(operation, importHeader);
86                 response.addHeader(service, serviceName);
87             }
88             CreateBRMSRuleTemplate brmsRuleTemplate = new CreateBRMSRuleTemplate();
89             successMap = brmsRuleTemplate.addRule(builder.toString(), serviceName, description, "API");
90         } else if (("MICROSERVICE").equals(importServiceCreation)) {
91             CreateNewMicroServiceModel newMS = null;
92             String randomID = UUID.randomUUID().toString();
93             String type = ".xmi";
94             if (fileName != null) {
95                 File extracDir = new File(extractDir);
96                 if (!extracDir.exists()) {
97                     extracDir.mkdirs();
98                 }
99                 if (fileName.contains(".xmi") || fileName.contains(".yml")) {
100                     if (fileName.contains(".yml")) {
101                         type = ".yml";
102                     }
103                     // get the request content into a String
104                     String xmi = null;
105                     java.util.Scanner scanner;
106                     try {
107                         scanner = new java.util.Scanner(request.getInputStream());
108                         scanner.useDelimiter("\\A");
109                         xmi = scanner.hasNext() ? scanner.next() : "";
110                         scanner.close();
111                     } catch (IOException e1) {
112                         logger.error(e1);
113                         PolicyLogger.error(errorMessage);
114                         return;
115                     }
116                     PolicyLogger.info("Request from API to import new Service");
117                     try (Writer writer = new BufferedWriter(new OutputStreamWriter(
118                             new FileOutputStream(extractDir + File.separator + randomID + type), "utf-8"))) {
119                         writer.write(xmi);
120                     } catch (IOException e) {
121                         logger.error(e);
122                         PolicyLogger.error(errorMessage);
123                         return;
124                     }
125                 } else {
126                     InputStream inputStream = null;
127                     try (FileOutputStream outputStream =
128                             new FileOutputStream(extractDir + File.separator + randomID + ".zip")) {
129                         inputStream = request.getInputStream();
130                         byte[] buffer = new byte[4096];
131                         int bytesRead = -1;
132                         while ((bytesRead = inputStream.read(buffer)) != -1) {
133                             outputStream.write(buffer, 0, bytesRead);
134                         }
135                     } catch (IOException e) {
136                         PolicyLogger.error("Error in reading in Zip File from API call" + e);
137                         return;
138                     } finally {
139                         try {
140                             if (inputStream != null) {
141                                 inputStream.close();
142                             }
143                         } catch (IOException e) {
144                             PolicyLogger.error("Exception Occured while closing the input/output stream" + e);
145                         }
146                     }
147                 }
148
149                 newMS = new CreateNewMicroServiceModel(fileName, serviceName, "API", version, randomID);
150
151                 successMap = newMS.addValuesToNewModel(type);
152
153                 if (successMap.containsKey(successMessage)) {
154                     successMap.clear();
155                     successMap = newMS.saveImportService();
156                 }
157             }
158         } else if (("OPTIMIZATION").equals(importServiceCreation)) {
159             CreateNewOptimizationModel newOOF = null;
160             String randomID = UUID.randomUUID().toString();
161             if (fileName != null) {
162                 File extracDir = new File(extractDir);
163                 if (!extracDir.exists()) {
164                     extracDir.mkdirs();
165                 }
166
167                 String type = ".yml";
168
169                 // get the request content into a String
170                 String yml = null;
171                 try (java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());) {
172                     scanner.useDelimiter("\\A");
173                     yml = scanner.hasNext() ? scanner.next() : "";
174                 } catch (IOException e1) {
175                     logger.error(e1);
176                     PolicyLogger.error(errorMessage);
177                     return;
178                 }
179                 PolicyLogger.info("Request from API to import new Optimization Service Model");
180                 try (Writer writer = new BufferedWriter(new OutputStreamWriter(
181                         new FileOutputStream(extractDir + File.separator + randomID + type), "utf-8"))) {
182                     writer.write(yml);
183                 } catch (IOException e) {
184                     logger.error(e);
185                     PolicyLogger.error(errorMessage);
186                     return;
187                 }
188
189                 newOOF = new CreateNewOptimizationModel(fileName, serviceName, "API Import Service", version, randomID);
190                 successMap = newOOF.addValuesToNewModel();
191                 if (successMap.containsKey(successMessage)) {
192                     successMap.clear();
193                     successMap = newOOF.saveImportService();
194                 }
195             }
196         }
197
198         // return a response to the PAP
199         if (successMap.containsKey(successMessage)) {
200             response.setStatus(HttpServletResponse.SC_OK);
201             response.addHeader("successMapKey", successMessage);
202             response.addHeader(operation, importHeader);
203             response.addHeader(service, serviceName);
204         } else if (successMap.containsKey("DBError")) {
205             if (successMap.get("DBError").contains("EXISTS")) {
206                 response.setStatus(HttpServletResponse.SC_CONFLICT);
207                 response.addHeader(service, serviceName);
208                 response.addHeader(errorMsg, "modelExistsDB");
209             } else {
210                 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
211                 response.addHeader(errorMsg, "importDB");
212             }
213             response.addHeader(operation, importHeader);
214             response.addHeader(service, serviceName);
215         } else if (successMap.get(errorMsg).contains("MISSING")) {
216             response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
217             response.addHeader(errorMsg, MISSING);
218             response.addHeader(operation, importHeader);
219             response.addHeader(service, serviceName);
220         } else if (successMap.get(errorMsg).contains("VALIDATION")) {
221             response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
222             response.addHeader(errorMsg, "validation");
223             response.addHeader(operation, importHeader);
224             response.addHeader(service, serviceName);
225         }
226     }
227
228 }