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;
23 import java.io.IOException;
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.List;
29 import javax.servlet.http.HttpServletRequest;
31 import org.onap.nearric.simulator.model.PolicyInstance;
32 import org.onap.nearric.simulator.model.PolicyType;
33 import org.oransc.ric.a1med.api.model.InlineResponse200;
34 import org.oransc.ric.a1med.api.model.PolicyTypeSchema;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.springframework.http.HttpStatus;
38 import org.springframework.http.ResponseEntity;
39 import org.springframework.stereotype.Service;
41 import com.fasterxml.jackson.core.JsonParseException;
42 import com.fasterxml.jackson.core.JsonParser;
43 import com.fasterxml.jackson.databind.JsonNode;
44 import com.fasterxml.jackson.databind.ObjectMapper;
45 import com.github.fge.jackson.JsonLoader;
46 import com.github.fge.jsonschema.core.exceptions.ProcessingException;
47 import com.github.fge.jsonschema.core.report.ProcessingMessage;
48 import com.github.fge.jsonschema.core.report.ProcessingReport;
49 import com.github.fge.jsonschema.main.JsonSchema;
50 import com.github.fge.jsonschema.main.JsonSchemaFactory;
53 * This class provides the service implementation of all the A1 operation
55 * @author lathishbabu.ganesan@est.tech
60 public class A1PApiServiceImpl {
62 private static final Logger log = LoggerFactory.getLogger(A1PApiServiceImpl.class);
64 private HashMap<String, PolicyType> policyTypes = new HashMap<String, PolicyType>();
66 private ObjectMapper objectMapper = null;
68 private HttpServletRequest request = null;
70 public boolean validateSchema(String jsonData, String jsonSchema) {
71 ProcessingReport report = null;
72 boolean result = false;
74 log.info("Applying schema: @<@<" + jsonSchema + ">@>@ to data: #<#<" + jsonData + ">#>#");
75 JsonNode schemaNode = JsonLoader.fromString(jsonSchema);
76 JsonNode data = JsonLoader.fromString(jsonData);
77 JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
78 JsonSchema schema = factory.getJsonSchema(schemaNode);
79 report = schema.validate(data);
80 } catch (JsonParseException jpex) {
81 log.info("Error. Something went wrong trying to parse json data: #<#<" + jsonData
82 + ">#># or json schema: @<@<" + jsonSchema + ">@>@. Are the double quotes included? "
84 } catch (ProcessingException pex) {
85 log.info("Error. Something went wrong trying to process json data: #<#<" + jsonData
86 + ">#># with json schema: @<@<" + jsonSchema + ">@>@ " + pex.getMessage());
87 } catch (IOException e) {
88 log.info("Error. Something went wrong trying to read json data: #<#<" + jsonData
89 + ">#># or json schema: @<@<" + jsonSchema + ">@>@");
92 Iterator<ProcessingMessage> iter = report.iterator();
93 while (iter.hasNext()) {
94 ProcessingMessage pm = iter.next();
95 log.info("Processing Message: " + pm.getMessage());
97 result = report.isSuccess();
99 log.info("Result=" + result);
103 public A1PApiServiceImpl() {
106 public void set(ObjectMapper objectMapper, HttpServletRequest request) {
107 this.objectMapper = objectMapper;
108 this.request = request;
111 public void reset() {
112 log.info("Resetting db");
116 public ResponseEntity<Void> createReplaceType(Integer policyTypeId, PolicyTypeSchema policyTypeSchema) {
117 log.info("createReplaceType - policyTypeId: " + policyTypeId);
118 log.info("createReplaceType - policyTypeSchema: " + policyTypeSchema);
120 if (policyTypeId == null || policyTypeSchema == null || policyTypeSchema.getName() == null) {
121 log.info("createReplaceType - bad parameters");
122 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
125 if (policyTypeSchema.getPolicyTypeId().intValue() != policyTypeId.intValue()) {
126 log.info("createReplaceType - policytype id mismatch between request and policyTypeSchema");
127 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
130 if (policyTypes.containsKey(policyTypeId.toString())) {
131 log.info("createReplaceType - policytype already exists");
132 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
135 PolicyType policyType = new PolicyType(policyTypeId, policyTypeSchema);
136 policyTypes.put(policyTypeId.toString(), policyType);
137 log.info("createReplaceType - created ok");
139 return new ResponseEntity<Void>(HttpStatus.CREATED);
142 public ResponseEntity<Void> deleteType(Integer policyTypeId) {
143 log.info("deleteType - policyTypeId: " + policyTypeId);
145 if (policyTypeId == null) {
146 log.info("deleteType - bad parameter");
147 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
150 PolicyType policyType = policyTypes.get(policyTypeId.toString());
152 if (policyType == null) {
153 log.info("deleteType - policytype does not exists");
154 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
157 if (policyType.getNumberInstances() > 0) {
158 log.info("deleteType - cannot delete, instances exists");
159 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
161 policyTypes.remove(policyTypeId.toString());
163 log.info("deleteType - deleted ok");
164 return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
167 public ResponseEntity<Void> deleteInstance(Integer policyTypeId, String policyInstanceId) {
169 log.info("deleteInstance - policyTypeId: " + policyTypeId);
170 log.info("deleteInstance - policyInstanceId: " + policyInstanceId);
172 if (policyTypeId == null || policyInstanceId == null) {
173 log.info("deleteInstance - bad parameters");
174 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
177 PolicyType policyType = policyTypes.get(policyTypeId.toString());
179 if (policyType == null) {
180 log.info("deleteType - policytype does not exists");
181 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
183 PolicyInstance policyInstance = policyType.getInstance(policyInstanceId);
184 if (policyInstance == null) {
185 log.info("deleteType - instance does not exists");
186 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
188 policyType.delete(policyInstanceId);
190 log.info("deleteInstance - deleted ok");
191 return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
195 public ResponseEntity<PolicyTypeSchema> getPolicyTypeSchema(Integer policyTypeId) {
196 log.info("getPolicyTypeSchema - policyTypeId: " + policyTypeId);
198 if (policyTypeId == null) {
199 log.info("getPolicyTypeSchema - bad parameter");
200 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.NOT_FOUND);
203 String accept = request.getHeader("Accept");
204 if (accept != null && accept.contains("application/json")) {
207 PolicyType policyType = policyTypes.get(policyTypeId.toString());
209 if (policyType == null) {
210 log.info("getPolicyTypeSchema - policytype does not exists");
211 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.NOT_FOUND);
215 PolicyTypeSchema schema = policyType.getSchema();
216 String createSchema = "{}";
218 // Convert Map to JSON
219 json = objectMapper.writeValueAsString(schema);
221 log.info("getPolicyTypeSchema - schema: " + json);
223 createSchema = objectMapper.writeValueAsString(schema.getCreateSchema());
224 log.info("getPolicyTypeSchema - createSchema: " + createSchema);
225 } catch (Exception e) {
227 log.info("getPolicyTypeSchema - schema corrupt");
228 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.INTERNAL_SERVER_ERROR);
230 res = "{\n \"name\" : \"" + schema.getName() + "\",\n \"description\" : \"" + schema.getDescription()
231 + "\",\n \"create_schema\" : " + createSchema + ",\n \"policy_type_id\" : "
232 + schema.getPolicyTypeId().intValue() + "\n}";
233 log.info("getPolicyTypeSchema - json schema: " + res);
234 return new ResponseEntity<PolicyTypeSchema>(objectMapper.readValue(res, PolicyTypeSchema.class),
236 } catch (Exception e) {
238 log.info("getPolicyTypeSchema - Couldn't serialize response for content type application/json");
239 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.INTERNAL_SERVER_ERROR);
242 log.info("getPolicyTypeSchema - not implemented");
243 return new ResponseEntity<PolicyTypeSchema>(HttpStatus.NOT_IMPLEMENTED);
246 public ResponseEntity<List<Integer>> getAllTypes() {
247 log.info("getAllTypes");
249 String accept = request.getHeader("Accept");
250 if (accept != null && accept.contains("application/json")) {
252 Set<String> types = policyTypes.keySet();
254 for (Iterator<String> iterator = types.iterator(); iterator.hasNext();) {
255 String tid = (String) iterator.next();
256 if (res.length() > 0) {
261 return new ResponseEntity<List<Integer>>(objectMapper.readValue("[" + res + "]", List.class),
263 } catch (IOException e) {
265 log.info("getAllTypes - Couldn't serialize response for content type application/json");
266 return new ResponseEntity<List<Integer>>(HttpStatus.INTERNAL_SERVER_ERROR);
269 log.info("getAllTypes - not implemented");
270 return new ResponseEntity<List<Integer>>(HttpStatus.NOT_IMPLEMENTED);
273 public ResponseEntity<Void> createReplaceInstance(Integer policyTypeId, String policyInstanceId, Object body) {
274 log.info("createReplaceInstance - policyTypeId:" + policyTypeId);
275 log.info("createReplaceInstance - policyInstanceId:" + policyInstanceId);
276 log.info("createReplaceInstance - body:" + body);
278 if (policyTypeId == null || policyInstanceId == null || body == null) {
279 log.info("createReplaceInstance - bad parameter");
280 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
283 log.info("createReplaceInstance - bodyclass:" + body.getClass().toString());
285 PolicyType policyType = policyTypes.get(policyTypeId.toString());
287 if (policyType == null) {
288 log.info("createReplaceInstance - policytype does not exists");
289 return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
292 // Create json string from schema
293 String createSchema = null;
295 PolicyTypeSchema schema = policyType.getSchema();
296 // Convert Map to JSON
297 String json = objectMapper.writeValueAsString(schema);
299 log.info("createReplaceInstance - schema - json: " + json);
300 createSchema = objectMapper.writeValueAsString(schema.getCreateSchema());
301 log.info("createReplaceInstance - createSchema - string: " + createSchema);
302 } catch (Exception e) {
304 log.info("createReplaceInstance - schema corrupt");
305 return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
308 // Create json string from instance
309 String jsonInstance = null;
311 log.info("createReplaceInstance - raw: " + body);
312 // Convert Map to JSON
313 jsonInstance = objectMapper.writeValueAsString(body);
315 log.info("createReplaceInstance - instance: " + jsonInstance);
317 } catch (Exception e) {
319 log.info("createReplaceInstance - instancce corrupt");
320 return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
323 if (!validateSchema(jsonInstance, createSchema)) {
324 log.info("createReplaceInstance - schema validation failed");
325 return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
327 PolicyInstance policyInstance = new PolicyInstance(policyInstanceId, body);
328 policyType.createReplaceInstance(policyInstanceId, policyInstance);
330 log.info("createReplaceInstance - created/replaced ok");
331 return new ResponseEntity<Void>(HttpStatus.CREATED);
335 public ResponseEntity<List<String>> getAllInstanceForType(Integer policyTypeId) {
336 log.info("getAllInstanceForType - policyTypeId:" + policyTypeId);
338 if (policyTypeId == null) {
339 log.info("getAllInstanceForType - bad parameter");
340 return new ResponseEntity<List<String>>(HttpStatus.NOT_FOUND);
343 String accept = request.getHeader("Accept");
344 if (accept != null && accept.contains("application/json")) {
346 PolicyType policyType = policyTypes.get(policyTypeId.toString());
347 if (policyType == null) {
348 log.info("getAllInstanceForType - policytype does not exists");
349 return new ResponseEntity<List<String>>(HttpStatus.NOT_FOUND);
351 Set<String> instances = policyType.getInstances();
353 for (Iterator iterator = instances.iterator(); iterator.hasNext();) {
354 String iid = (String) iterator.next();
355 iid = "\"" + iid + "\"";
356 if (res.length() > 0) {
361 log.info("getAllInstanceForType - " + res);
362 return new ResponseEntity<List<String>>(objectMapper.readValue("[" + res + "]", List.class),
364 } catch (IOException e) {
366 log.info("getAllInstanceForType - Couldn't serialize response for content type application/json");
367 return new ResponseEntity<List<String>>(HttpStatus.INTERNAL_SERVER_ERROR);
370 log.info("getAllInstanceForType - not implemented");
371 return new ResponseEntity<List<String>>(HttpStatus.NOT_IMPLEMENTED);
375 public ResponseEntity<Object> getPolicyInstance(Integer policyTypeId, String policyInstanceId) {
376 log.info("getPolicyInstance - policyTypeId:" + policyTypeId);
377 log.info("getPolicyInstance - policyInstanceId:" + policyInstanceId);
379 if (policyTypeId == null || policyInstanceId == null) {
380 log.info("getPolicyInstance - bad parameter");
381 return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
384 String accept = request.getHeader("Accept");
385 if (accept != null && accept.contains("application/json")) {
387 PolicyType policyType = policyTypes.get(policyTypeId.toString());
388 if (policyType == null) {
389 log.info("getPolicyInstance - policytype does not exists");
390 return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
392 PolicyInstance policyInstance = policyType.getInstance(policyInstanceId);
393 if (policyInstance == null) {
394 log.info("getPolicyInstance - policyinstance does not exists");
395 return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
400 log.info("getPolicyInstance - rawschema: " + policyInstance.getJson());
401 // Convert Map to JSON
402 json = objectMapper.writeValueAsString(policyInstance.getJson());
404 log.info("getPolicyInstance - schema: " + json);
406 } catch (Exception e) {
408 log.info("getPolicyInstance - schema corrupt");
409 return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
412 return new ResponseEntity<Object>(objectMapper.readValue(json, Object.class), HttpStatus.OK);
413 } catch (IOException e) {
415 log.info("getPolicyInstance - policyinstance corrupt");
416 return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
420 return new ResponseEntity<Object>(HttpStatus.NOT_IMPLEMENTED);
423 public ResponseEntity<List<InlineResponse200>> getStatus(Integer policyTypeId, String policyInstanceId) {
424 log.info("getStatus - policyTypeId:" + policyTypeId);
425 log.info("getStatus - policyInstanceId:" + policyInstanceId);
427 if (policyTypeId == null || policyInstanceId == null) {
428 log.info("getStatus - bad parameters");
429 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_FOUND);
432 String accept = request.getHeader("Accept");
433 if (accept != null && accept.contains("application/json")) {
435 PolicyType policyType = policyTypes.get(policyTypeId.toString());
436 if (policyType == null) {
437 log.info("getStatus - policytype does not exists");
438 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_FOUND);
440 PolicyInstance policyInstance = policyType.getInstance(policyInstanceId);
441 if (policyInstance == null) {
442 log.info("getStatus - policyinstance does not exists");
443 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_FOUND);
446 return new ResponseEntity<List<InlineResponse200>>(
447 objectMapper.readValue("[ {\n \"handler_id\" : \"NearRTRIC-1\",\n \"status\" : \"enforced\"\n} ]",
450 } catch (IOException e) {
452 log.info("getStatus - Couldn't serialize response for content type application/json");
453 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.INTERNAL_SERVER_ERROR);
457 return new ResponseEntity<List<InlineResponse200>>(HttpStatus.NOT_IMPLEMENTED);