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