2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.nearric.simulator.service;
24 import java.io.FileInputStream;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.io.ObjectInputStream;
28 import java.io.ObjectOutputStream;
29 import java.lang.reflect.InvocationTargetException;
30 import java.util.HashMap;
31 import java.util.Iterator;
32 import java.util.List;
35 import javax.servlet.http.HttpServletRequest;
37 import org.apache.commons.beanutils.BeanUtils;
38 import org.onap.nearric.simulator.model.PolicyType;
39 import org.onap.nearric.simulator.model.PolicyInstance;
40 import org.oransc.ric.a1med.api.model.PolicyTypeSchema;
41 import org.oransc.ric.a1med.api.model.InlineResponse200;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 import org.springframework.beans.factory.annotation.Autowired;
46 import org.springframework.http.HttpStatus;
47 import org.springframework.http.ResponseEntity;
48 import org.springframework.stereotype.Service;
50 import com.fasterxml.jackson.core.JsonParseException;
51 import com.fasterxml.jackson.core.JsonParser;
52 import com.fasterxml.jackson.databind.JsonNode;
53 import com.fasterxml.jackson.databind.ObjectMapper;
54 import com.github.fge.jackson.JsonLoader;
55 import com.github.fge.jsonschema.core.exceptions.ProcessingException;
56 import com.github.fge.jsonschema.core.report.ProcessingMessage;
57 import com.github.fge.jsonschema.core.report.ProcessingReport;
58 import com.github.fge.jsonschema.main.JsonSchema;
59 import com.github.fge.jsonschema.main.JsonSchemaFactory;
61 import com.fasterxml.jackson.databind.ObjectMapper;
64 * This class provides the service implementation of all the A1 operation
66 * @author lathishbabu.ganesan@est.tech
71 public class A1PApiServiceImpl { // implements A1PApiService {
73 private static final Logger log = LoggerFactory.getLogger(A1PApiServiceImpl.class);
75 private HashMap<String, PolicyType> policyTypes = new HashMap<String, PolicyType>();
77 private ObjectMapper objectMapper = null;
79 private HttpServletRequest request = null;
81 public boolean validateSchema(String jsonData, String jsonSchema) {
82 ProcessingReport report = null;
83 boolean result = false;
85 System.out.println("Applying schema: @<@<" + jsonSchema + ">@>@ to data: #<#<" + jsonData + ">#>#");
86 JsonNode schemaNode = JsonLoader.fromString(jsonSchema);
87 JsonNode data = JsonLoader.fromString(jsonData);
88 JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
89 JsonSchema schema = factory.getJsonSchema(schemaNode);
90 report = schema.validate(data);
91 } catch (JsonParseException jpex) {
92 System.out.println("Error. Something went wrong trying to parse json data: #<#<" + jsonData
93 + ">#># or json schema: @<@<" + jsonSchema + ">@>@. Are the double quotes included? "
95 // jpex.printStackTrace();
96 } catch (ProcessingException pex) {
97 System.out.println("Error. Something went wrong trying to process json data: #<#<" + jsonData
98 + ">#># with json schema: @<@<" + jsonSchema + ">@>@ " + pex.getMessage());
99 // pex.printStackTrace();
100 } catch (IOException e) {
101 System.out.println("Error. Something went wrong trying to read json data: #<#<" + jsonData
102 + ">#># or json schema: @<@<" + jsonSchema + ">@>@");
103 // e.printStackTrace();
105 if (report != null) {
106 Iterator<ProcessingMessage> iter = report.iterator();
107 while (iter.hasNext()) {
108 ProcessingMessage pm = iter.next();
109 System.out.println("Processing Message: " + pm.getMessage());
111 result = report.isSuccess();
113 System.out.println(" Result=" + result);
117 public A1PApiServiceImpl() {
120 public void set(ObjectMapper objectMapper, HttpServletRequest request) {
121 this.objectMapper = objectMapper;
122 this.request = request;
126 public ResponseEntity<Void> createReplaceType(Integer policyTypeId, PolicyTypeSchema body) {
128 System.out.println("createReplaceType - policyTypeId: " + policyTypeId);
129 System.out.println("createReplaceType - body: " + body);
131 String accept = request.getHeader("Accept");
133 if (body != null && body.getName() != null) {
134 if (body.getPolicyTypeId().intValue() != policyTypeId.intValue()) {
135 System.out.println("createReplaceType - policytype mismatch between request and body");
136 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
139 if (policyTypes.containsKey(policyTypeId.toString())) {
140 System.out.println("createReplaceType - policytype already exists");
141 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
144 PolicyType policyType = new PolicyType(policyTypeId, body);
145 policyTypes.put(policyTypeId.toString(), policyType);
147 System.out.println("createReplaceType - created ok");
148 return new ResponseEntity<Void>(HttpStatus.CREATED);
152 public ResponseEntity<Void> deleteType(Integer policyTypeId) {
154 System.out.println("deleteType - policyTypeId: " + policyTypeId);
156 String accept = request.getHeader("Accept");
158 PolicyType policyType = policyTypes.get(policyTypeId.toString());
160 if (policyType == null) {
161 System.out.println("deleteType - policytype does not exists");
162 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
165 if (policyType.getNumberInstances() > 0) {
166 System.out.println("deleteType - cannot delete, instances exists");
167 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
169 policyTypes.remove(policyTypeId.toString());
171 System.out.println("deleteType - deleted ok");
172 return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
175 public ResponseEntity<Void> deleteInstance(Integer policyTypeId, String policyInstanceId) {
177 System.out.println("deleteInstance - policyTypeId: " + policyTypeId);
178 System.out.println("deleteInstance - policyInstanceId: " + policyInstanceId);
180 PolicyType policyType = policyTypes.get(policyTypeId.toString());
182 if (policyType == null) {
183 System.out.println("deleteType - policytype does not exists");
184 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
186 PolicyInstance policyInstance = policyType.getInstance(policyInstanceId);
187 if (policyInstance == null) {
188 System.out.println("deleteType - instance does not exists");
189 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
191 policyType.delete(policyInstanceId);
193 System.out.println("deleteInstance - deleted ok");
194 return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
198 public ResponseEntity<PolicyTypeSchema> getPolicyTypeSchema(Integer policyTypeId) {
199 System.out.println("getPolicyTypeSchema - policyTypeId: " + policyTypeId);
200 String accept = request.getHeader("Accept");
201 if (accept != null && accept.contains("application/json")) {
204 PolicyType policyType = policyTypes.get(policyTypeId.toString());
206 if (policyType == null) {
207 System.out.println("getPolicyTypeSchema - policytype does not exists");
208 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.NOT_FOUND);
212 PolicyTypeSchema schema = policyType.getSchema();
213 String createSchema = "{}";
215 // Convert Map to JSON
216 json = objectMapper.writeValueAsString(schema);
218 System.out.println("getPolicyTypeSchema - schema: " + json);
220 createSchema = objectMapper.writeValueAsString(schema.getCreateSchema());
221 System.out.println("getPolicyTypeSchema - createSchema: " + createSchema);
222 } catch (Exception e) {
224 System.out.println("getPolicyTypeSchema - schema corrupt");
225 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.INTERNAL_SERVER_ERROR);
227 res = "{\n \"name\" : \"" + schema.getName() + "\",\n \"description\" : \"" + schema.getDescription()
228 + "\",\n \"create_schema\" : " + createSchema + ",\n \"policy_type_id\" : "
229 + schema.getPolicyTypeId().intValue() + "\n}";
230 System.out.println("getPolicyTypeSchema - json schema: " + res);
231 objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
232 return new ResponseEntity<PolicyTypeSchema>(objectMapper.readValue(res, PolicyTypeSchema.class),
233 HttpStatus.ACCEPTED);
234 } catch (Exception e) {
237 .println("getPolicyTypeSchema - Couldn't serialize response for content type application/json");
238 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.INTERNAL_SERVER_ERROR);
241 System.out.println("getPolicyTypeSchema - not implemented");
242 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.NOT_IMPLEMENTED);
245 public ResponseEntity<List<Integer>> getAllTypes() {
246 System.out.println("getAllTypes");
247 String accept = request.getHeader("Accept");
248 if (accept != null && accept.contains("application/json")) {
250 Set<String> types = policyTypes.keySet();
252 for (Iterator<String> iterator = types.iterator(); iterator.hasNext();) {
253 String tid = (String) iterator.next();
254 if (res.length() > 0) {
259 return new ResponseEntity<List<Integer>>(objectMapper.readValue("[" + res + "]", List.class),
260 HttpStatus.ACCEPTED);
261 } catch (IOException e) {
263 System.out.println("getAllTypes - Couldn't serialize response for content type application/json");
264 return new ResponseEntity<List<Integer>>(HttpStatus.INTERNAL_SERVER_ERROR);
267 System.out.println("getAllTypes - not implemented");
268 return new ResponseEntity<List<Integer>>(HttpStatus.NOT_IMPLEMENTED);
271 public ResponseEntity<Void> createReplaceInstance(Integer policyTypeId, String policyInstanceId, Object body) {
272 System.out.println("createReplaceInstance - policyTypeId:" + policyTypeId);
273 System.out.println("createReplaceInstance - policyInstanceId:" + policyInstanceId);
274 System.out.println("createReplaceInstance - body:" + body);
275 System.out.println("createReplaceInstance - bodyclass:" + body.getClass().toString());
277 String accept = request.getHeader("Accept");
279 PolicyType policyType = policyTypes.get(policyTypeId.toString());
281 if (policyType == null) {
282 System.out.println("createReplaceInstance - policytype does not exists");
283 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
286 // Create json string from schema
287 String createSchema = null;
289 PolicyTypeSchema schema = policyType.getSchema();
290 // Convert Map to JSON
291 String json = objectMapper.writeValueAsString(schema);
293 System.out.println("createReplaceInstance - schema - json: " + json);
294 createSchema = objectMapper.writeValueAsString(schema.getCreateSchema());
295 System.out.println("createReplaceInstance - createSchema - string: " + createSchema);
296 } catch (Exception e) {
298 System.out.println("createReplaceInstance - schema corrupt");
299 return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
302 // Create json string from instance
303 String jsonInstance = null;
305 System.out.println("createReplaceInstance - raw: " + body);
306 // Convert Map to JSON
307 jsonInstance = objectMapper.writeValueAsString(body);
309 System.out.println("createReplaceInstance - instance: " + jsonInstance);
311 } catch (Exception e) {
313 System.out.println("createReplaceInstance - instancce corrupt");
314 return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
317 if (!validateSchema(jsonInstance, createSchema)) {
318 System.out.println("createReplaceInstance - schema validation failed");
319 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
321 PolicyInstance policyInstance = new PolicyInstance(policyInstanceId, body);
322 policyType.createReplaceInstance(policyInstanceId, policyInstance);
324 System.out.println("createReplaceInstance - created/replaced ok");
325 return new ResponseEntity<Void>(HttpStatus.CREATED);
329 public ResponseEntity<List<String>> getAllInstanceForType(Integer policyTypeId) {
330 System.out.println("getAllInstanceForType - policyTypeId:" + policyTypeId);
332 String accept = request.getHeader("Accept");
333 if (accept != null && accept.contains("application/json")) {
335 PolicyType policyType = policyTypes.get(policyTypeId.toString());
336 if (policyType == null) {
337 System.out.println("getAllInstanceForType - policytype does not exists");
338 return new ResponseEntity<List<String>>(HttpStatus.NOT_FOUND);
340 Set<String> instances = policyType.getInstances();
342 for (Iterator iterator = instances.iterator(); iterator.hasNext();) {
343 String iid = (String) iterator.next();
344 iid = "\"" + iid + "\"";
345 if (res.length() > 0) {
350 System.out.println("getAllInstanceForType - " + res);
351 return new ResponseEntity<List<String>>(objectMapper.readValue("[" + res + "]", List.class),
352 HttpStatus.ACCEPTED);
353 } catch (IOException e) {
356 "getAllInstanceForType - Couldn't serialize response for content type application/json");
357 return new ResponseEntity<List<String>>(HttpStatus.INTERNAL_SERVER_ERROR);
360 System.out.println("getAllInstanceForType - not implemented");
361 return new ResponseEntity<List<String>>(HttpStatus.NOT_IMPLEMENTED);
365 public ResponseEntity<Object> getPolicyInstance(Integer policyTypeId, String policyInstanceId) {
366 System.out.println("getPolicyInstance - policyTypeId:" + policyTypeId);
367 System.out.println("getPolicyInstance - policyInstanceId:" + policyInstanceId);
369 String accept = request.getHeader("Accept");
370 if (accept != null && accept.contains("application/json")) {
372 PolicyType policyType = policyTypes.get(policyTypeId.toString());
373 if (policyType == null) {
374 System.out.println("getPolicyInstance - policytype does not exists");
375 return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
377 PolicyInstance policyInstance = policyType.getInstance(policyInstanceId);
378 if (policyInstance == null) {
379 System.out.println("getPolicyInstance - policyinstance does not exists");
380 return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
385 System.out.println("getPolicyInstance - rawschema: " + policyInstance.getJson());
386 // Convert Map to JSON
387 json = objectMapper.writeValueAsString(policyInstance.getJson());
389 System.out.println("getPolicyInstance - schema: " + json);
391 } catch (Exception e) {
393 System.out.println("getPolicyInstance - schema corrupt");
394 return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
397 return new ResponseEntity<Object>(objectMapper.readValue(json, Object.class), HttpStatus.ACCEPTED);
398 } catch (IOException e) {
400 System.out.println("getPolicyInstance - policyinstance corrupt");
401 return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
405 return new ResponseEntity<Object>(HttpStatus.NOT_IMPLEMENTED);
408 public ResponseEntity<List<InlineResponse200>> getStatus(Integer policyTypeId, String policyInstanceId) {
409 System.out.println("getStatus - policyTypeId:" + policyTypeId);
410 System.out.println("getStatus - policyInstanceId:" + policyInstanceId);
412 String accept = request.getHeader("Accept");
413 if (accept != null && accept.contains("application/json")) {
415 PolicyType policyType = policyTypes.get(policyTypeId.toString());
416 if (policyType == null) {
417 System.out.println("getStatus - policytype does not exists");
418 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_FOUND);
420 PolicyInstance policyInstance = policyType.getInstance(policyInstanceId);
421 if (policyInstance == null) {
422 System.out.println("getStatus - policyinstance does not exists");
423 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_FOUND);
427 return new ResponseEntity<List<InlineResponse200>>(
428 objectMapper.readValue("[ {\n \"handler_id\" : \"X-APP-1\",\n \"status\" : \"enforced\"\n} ]",
430 HttpStatus.ACCEPTED);
431 } catch (IOException e) {
433 System.out.println("getStatus - Couldn't serialize response for content type application/json");
434 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.INTERNAL_SERVER_ERROR);
438 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_IMPLEMENTED);