2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 2019-2020 Nordix Foundation.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.gui.editors.apex.rest.handling;
24 import com.google.gson.Gson;
25 import com.google.gson.GsonBuilder;
26 import com.google.gson.JsonObject;
27 import java.util.ArrayList;
28 import java.util.List;
29 import org.onap.policy.apex.model.basicmodel.concepts.AxKey;
30 import org.onap.policy.apex.model.basicmodel.concepts.AxKeyInfo;
31 import org.onap.policy.apex.model.modelapi.ApexApiResult;
32 import org.onap.policy.apex.model.modelapi.ApexApiResult.Result;
33 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
34 import org.onap.policy.gui.editors.apex.rest.handling.bean.BeanModel;
35 import org.slf4j.ext.XLogger;
36 import org.slf4j.ext.XLoggerFactory;
39 * This class handles commands on Apex models.
41 public class ModelHandler implements RestCommandHandler {
43 // Get a reference to the logger
44 private static final XLogger LOGGER = XLoggerFactory.getXLogger(ModelHandler.class);
46 // Recurring string constants
47 private static final String OK = ": OK";
48 private static final String NOT_OK = ": Not OK";
49 private static final String KEY = "key";
50 private static final String NAME = "name";
51 private static final String VERSION = "version";
52 private static final String UUID = "uuid";
53 private static final String DESCRIPTION = "description";
54 private static final String POLICY_KEY = "policyKey";
55 private static final String APEX_KEY_INFO = "apexKeyInfo";
61 public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType,
62 final RestCommand command) {
63 if (!RestCommandType.MODEL.equals(commandType)) {
64 return getUnsupportedCommandResultMessage(session, commandType, command);
69 return analyse(session);
71 return validate(session);
73 return getModelKey(session);
75 return listModel(session);
77 return downloadModel(session);
79 return deleteModel(session);
81 return getUnsupportedCommandResultMessage(session, commandType, command);
89 public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType,
90 final RestCommand command, final String jsonString) {
91 if (!RestCommandType.MODEL.equals(commandType)) {
92 return getUnsupportedCommandResultMessage(session, commandType, command);
97 return loadFromString(session, jsonString);
99 return createModel(session, jsonString);
101 return updateModel(session, jsonString);
103 return getUnsupportedCommandResultMessage(session, commandType, command);
111 public ApexApiResult executeRestCommand(final RestSession session, final RestCommandType commandType,
112 final RestCommand command, final String name, final String version) {
113 return getUnsupportedCommandResultMessage(session, commandType, command);
117 * Load the model from a JSON string for this session.
119 * @param session the Apex model editing session
120 * @param jsonString the JSON string to be parsed. The returned value(s) will be
121 * similar to {@link AxPolicyModel}, with merged
122 * {@linkplain AxKeyInfo} for the root object.
123 * @return an ApexAPIResult object. If successful then
124 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
125 * can be retrieved using {@link ApexApiResult#getMessages()}
127 private ApexApiResult loadFromString(final RestSession session, final String jsonString) {
128 LOGGER.entry(jsonString);
132 ApexApiResult result = session.getApexModelEdited().loadFromString(jsonString);
134 session.finishSession(result.isOk());
136 LOGGER.exit("Model/Load" + (result != null && result.isOk() ? OK : NOT_OK));
141 * Analyse the model and return analysis results. If successful the analysis
142 * results will be available in the messages in the result.
144 * @param session the Apex model editing session
145 * @return an ApexAPIResult object. If successful then
146 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
147 * can be retrieved using {@link ApexApiResult#getMessages()}
149 private ApexApiResult analyse(final RestSession session) {
152 ApexApiResult result = session.getApexModel().analyse();
154 LOGGER.exit("Model/Analyse" + (result != null && result.isOk() ? OK : NOT_OK));
159 * Validate the model and return validation results. If successful the
160 * validation results will be available in the messages in the result.
162 * @param session the Apex model editing session
163 * @return an ApexAPIResult object. If successful then
164 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
165 * can be retrieved using {@link ApexApiResult#getMessages()}
167 private ApexApiResult validate(final RestSession session) {
170 ApexApiResult result = session.getApexModel().validate();
172 LOGGER.exit("Model/Validate" + (result != null && result.isOk() ? OK : NOT_OK));
177 * Creates the new model model for this session.
179 * @param session the Apex model editing session
180 * @param jsonString the JSON string to be parsed containing the new model. See
181 * {@linkplain BeanModel}
182 * @return an ApexAPIResult object. If successful then
183 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
184 * can be retrieved using {@link ApexApiResult#getMessages()}
186 private ApexApiResult createModel(final RestSession session, final String jsonString) {
187 LOGGER.entry(jsonString);
189 final BeanModel jsonbean = RestUtils.getJsonParameters(jsonString, BeanModel.class);
193 ApexApiResult result = session.getApexModelEdited().createModel(jsonbean.getName(), jsonbean.getVersion(),
194 jsonbean.getUuid(), jsonbean.getDescription());
196 session.finishSession(result.isOk());
198 LOGGER.exit("Model/Create" + (result != null && result.isOk() ? OK : NOT_OK));
203 * Update the model for this session.
205 * @param session the Apex model editing session
206 * @param jsonString the JSON string to be parsed containing the updated model.
207 * See {@linkplain BeanModel}
208 * @return an ApexAPIResult object. If successful then
209 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
210 * can be retrieved using {@link ApexApiResult#getMessages()}
212 private ApexApiResult updateModel(final RestSession session, final String jsonString) {
213 LOGGER.entry(jsonString);
215 final BeanModel jsonbean = RestUtils.getJsonParameters(jsonString, BeanModel.class);
219 ApexApiResult result = session.getApexModelEdited().updateModel(jsonbean.getName(), jsonbean.getVersion(),
220 jsonbean.getUuid(), jsonbean.getDescription());
222 session.finishSession(result.isOk());
224 LOGGER.exit("Model/Update" + (result != null && result.isOk() ? OK : NOT_OK));
229 * Gets the key for the model for this session. If successful the model key will
230 * be available in the first message in the result. See {@linkplain AxKey}
232 * @param session the Apex model editing session
233 * @return an ApexAPIResult object. If successful then
234 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
235 * can be retrieved using {@link ApexApiResult#getMessages()}
237 private ApexApiResult getModelKey(final RestSession session) {
240 ApexApiResult result = session.getApexModel().getModelKey();
242 LOGGER.exit("Model/GetKey" + (result != null && result.isOk() ? OK : NOT_OK));
247 * Retrieve the model for this session. If successful the model will be
248 * available in the first message in the result. The returned value will be
249 * similar to a {@link AxPolicyModel}, with merged {@linkplain AxKeyInfo} for
252 * @param session the Apex model editing session
253 * @return an ApexAPIResult object. If successful then
254 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
255 * can be retrieved using {@link ApexApiResult#getMessages()}
257 private ApexApiResult listModel(final RestSession session) {
260 ApexApiResult result = session.getApexModel().listModel();
262 result = addKeyInfo2Messages(session, result);
264 LOGGER.exit("Model/Get" + (result != null && result.isOk() ? OK : NOT_OK));
269 * Download the model for this session as a String.
271 * @param session the Apex model editing session
272 * @return the model represented as a JSON string. See
273 * {@linkplain AxPolicyModel}
275 private ApexApiResult downloadModel(final RestSession session) {
278 ApexApiResult result = session.getApexModel().listModel();
280 LOGGER.exit("Model/Download" + (result != null && result.isOk() ? OK : NOT_OK));
285 * Delete the model for this session.
287 * @param session the Apex model editing session
288 * @return an ApexAPIResult object. If successful then
289 * {@link ApexApiResult#isOk()} will return true. Any messages/errors
290 * can be retrieved using {@link ApexApiResult#getMessages()}
292 private ApexApiResult deleteModel(final RestSession session) {
297 ApexApiResult result = session.getApexModel().deleteModel();
299 session.finishSession(result.isOk());
301 LOGGER.exit("Model/Delete" + (result != null && result.isOk() ? OK : NOT_OK));
306 * The json strings representing the objects listed, stored in
307 * result.messages[], does not contain the AxKeyInformation for that object.
308 * This utility method retrieves the AxKeyInfo for each object and adds it to
309 * the json for the object.
311 * @param session the Apex model editing session
312 * @param incomingResult The list result, containing JSON representations of
313 * objects stored in its "messages" array
314 * @return The list result, containing JSON augmented representations of objects
315 * stored in its "messages" array
317 private ApexApiResult addKeyInfo2Messages(final RestSession session, final ApexApiResult incomingResult) {
318 final ApexApiResult result = new ApexApiResult(incomingResult.getResult());
319 result.setMessages(incomingResult.getMessages());
321 final List<String> messages = incomingResult.getMessages();
322 final List<String> augmentedMessages = new ArrayList<>(messages.size());
324 for (final String message : messages) {
325 augmentedMessages.add(addKeyInfo2Message(session, message));
327 result.setMessages(augmentedMessages);
329 if (messages.size() != augmentedMessages.size()) {
330 result.setResult(Result.OTHER_ERROR);
331 result.addMessage("Failed to add KeyInfo to all results. Results are not complete");
338 * Augment a message with key information.
340 * @param session the Apex model editing session
341 * @param message The message to augment
342 * @return the augmented message
344 private String addKeyInfo2Message(final RestSession session, final String message) {
345 final Gson gson = new GsonBuilder().serializeNulls().enableComplexMapKeySerialization().create();
347 JsonObject jsonObject = gson.fromJson(message, JsonObject.class);
348 if (jsonObject == null) {
352 String name = readFieldFromJsonObject(jsonObject, NAME, null);
353 String version = readFieldFromJsonObject(jsonObject, VERSION, null);
355 if (name == null && version == null) {
356 JsonObject newJsonObject = getSubJsonObject(jsonObject);
358 if (newJsonObject != null) {
359 jsonObject = newJsonObject;
360 name = readFieldFromJsonObject(jsonObject, NAME, name);
361 version = readFieldFromJsonObject(jsonObject, VERSION, version);
365 if (name == null || version == null || !setUuidAndDescription(session, jsonObject, name, version)) {
366 jsonObject.addProperty(UUID, (String) null);
367 jsonObject.addProperty(DESCRIPTION, (String) null);
370 return gson.toJson(jsonObject);
374 * Get an embedded JSON object for the given JSON object.
376 * @param jsonObject the input JSON object
377 * @return the embedded JSON object
379 private JsonObject getSubJsonObject(JsonObject jsonObject) {
380 if (jsonObject.entrySet() != null && !jsonObject.entrySet().isEmpty()) {
381 return (JsonObject) jsonObject.entrySet().iterator().next().getValue();
388 * Condition a field so its key information can be looked up.
390 * @param jsonObject the object to query
391 * @param fieldTag the tag of the field to condition
392 * @param value the default value of the field to condition
393 * @return field read from the json
395 private String readFieldFromJsonObject(final JsonObject jsonObject, final String fieldTag, final String value) {
396 String lookedupValue = value;
398 if (jsonObject != null && jsonObject.get(KEY) != null && jsonObject.get(KEY).isJsonObject()
399 && jsonObject.getAsJsonObject(KEY).get(fieldTag) != null) {
400 lookedupValue = jsonObject.getAsJsonObject(KEY).get(fieldTag).getAsString();
401 } else if (jsonObject != null && jsonObject.get(POLICY_KEY) != null && jsonObject.get(POLICY_KEY).isJsonObject()
402 && jsonObject.getAsJsonObject(POLICY_KEY).get(fieldTag) != null) {
403 lookedupValue = jsonObject.getAsJsonObject(POLICY_KEY).get(fieldTag).getAsString();
405 return lookedupValue;
409 * Look up the UUID and description in the key information for a concept.
411 * @param session the Apex editor session
412 * @param jsonObject the JSON object to place the fields in
413 * @param name the concept name to look up
414 * @param version the concept version to look up
416 private boolean setUuidAndDescription(final RestSession session, JsonObject jsonObject, String name,
418 // Look up the key information for the name and version
419 JsonObject keyInfoJsonObject = lookupKeyInfo(session, name, version);
420 if (keyInfoJsonObject == null || keyInfoJsonObject.get(APEX_KEY_INFO) != null) {
424 if (keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get("UUID") != null) {
425 jsonObject.addProperty(UUID,
426 keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get("UUID").getAsString());
428 jsonObject.addProperty(UUID, (String) null);
431 if (keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get(DESCRIPTION) != null) {
432 jsonObject.addProperty(DESCRIPTION,
433 keyInfoJsonObject.get(APEX_KEY_INFO).getAsJsonObject().get(DESCRIPTION).getAsString());
435 jsonObject.addProperty(DESCRIPTION, (String) null);
442 * Look up the key information for the given concept name and value.
444 * @param session the Apex editor session
445 * @param name the concept name to look up
446 * @param version the concept version to look up
447 * @return a JSON version of the concept key information
449 private JsonObject lookupKeyInfo(final RestSession session, final String name, final String version) {
450 final ApexApiResult keyInfoResult = session.getApexModel().listKeyInformation(name, version);
451 final List<String> keyInfoMessages = keyInfoResult.getMessages();
453 if (keyInfoResult.isNok() || keyInfoMessages == null || keyInfoMessages.isEmpty()) {
457 final Gson gson = new GsonBuilder().serializeNulls().enableComplexMapKeySerialization().create();
458 final String keyInfoJson = keyInfoMessages.get(0);
459 return gson.fromJson(keyInfoJson, JsonObject.class);