2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 2020-2022 Nordix Foundation.
5 * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2021 Bell Canada. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
20 * SPDX-License-Identifier: Apache-2.0
21 * ============LICENSE_END=========================================================
24 package org.onap.policy.gui.editors.apex.rest.handling;
27 import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
28 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
29 import org.onap.policy.apex.model.modelapi.ApexApiResult;
30 import org.onap.policy.apex.model.modelapi.ApexApiResult.Result;
31 import org.onap.policy.apex.model.modelapi.ApexModel;
32 import org.onap.policy.apex.model.modelapi.ApexModelFactory;
33 import org.onap.policy.common.utils.coder.CoderException;
34 import org.onap.policy.common.utils.coder.StandardCoder;
35 import org.onap.policy.common.utils.coder.StandardYamlCoder;
36 import org.onap.policy.common.utils.resources.ResourceUtils;
37 import org.onap.policy.gui.editors.apex.rest.handling.plugin.upload.PolicyUploadHandler;
38 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
39 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
40 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
41 import org.onap.policy.models.tosca.utils.ToscaUtils;
44 * This class represents an ongoing editor session in the Apex editor and holds the information for the session.
47 public class RestSession {
48 // The default TOSCA wrapper for an APEX policy
49 private static final String APEX_TOSCA_POLICY_TEMPLATE = "templates/ApexToscaPolicyTemplate.yaml";
51 // Recurring string constants
52 private static final String ENGINE_SERVICE_PARAMETERS = "engineServiceParameters";
53 private static final String POLICY_TYPE_IMPL = "policy_type_impl";
55 // The ID of the session
56 private int sessionId;
58 // The TOSCA Service Template of the session
59 private ToscaServiceTemplate toscaServiceTemplate;
61 // The Apex policy model of the session
62 private ApexModel apexModel;
64 // The Apex policy model being edited
65 private ApexModel apexModelEdited;
68 * Constructor, create the session.
70 * @param sessionId the session ID of the session
71 * @throws ApexRuntimeException when the APEX TOSCA template file cannot be loaded
73 public RestSession(final int sessionId) {
74 this.sessionId = sessionId;
77 this.toscaServiceTemplate = new StandardYamlCoder()
78 .decode(ResourceUtils.getResourceAsString(APEX_TOSCA_POLICY_TEMPLATE), ToscaServiceTemplate.class);
79 } catch (CoderException e) {
80 throw new ApexRuntimeException("could not load default APEX TOSCA template " + APEX_TOSCA_POLICY_TEMPLATE,
84 this.apexModel = new ApexModelFactory().createApexModel(null, true);
88 * Load the policy model from a TOSCA Service Template.
90 * @param toscaServiceTemplateString The TOSCA service template string
91 * @return the result of the lading operation
93 public ApexApiResult loadFromString(final String toscaServiceTemplateString) {
95 if (toscaServiceTemplateString.startsWith("{")) {
96 toscaServiceTemplate = new StandardCoder().decode(toscaServiceTemplateString,
97 ToscaServiceTemplate.class);
99 toscaServiceTemplate = new StandardYamlCoder().decode(toscaServiceTemplateString,
100 ToscaServiceTemplate.class);
102 } catch (Exception e) {
103 return new ApexApiResult(Result.FAILED, "incoming model is not a TOSCA Service template", e);
106 if (!ToscaUtils.doPoliciesExist(new JpaToscaServiceTemplate(toscaServiceTemplate))) {
107 return new ApexApiResult(Result.FAILED, "no policies found on incoming TOSCA service template");
110 @SuppressWarnings("unchecked")
111 var apexEngineServiceParameterMap = (Map<String, Object>) toscaServiceTemplate
112 .getToscaTopologyTemplate().getPoliciesAsMap().values().iterator().next().getProperties()
113 .get(ENGINE_SERVICE_PARAMETERS);
115 String apexModelString;
117 apexModelString = new StandardCoder().encode(apexEngineServiceParameterMap.get(POLICY_TYPE_IMPL));
118 } catch (CoderException e) {
119 return new ApexApiResult(Result.FAILED, "APEX model not found TOSCA Service template", e);
122 return apexModelEdited.loadFromString(apexModelString);
126 * Commence making changes to the Apex model.
128 * @return the result of the edit commencement operation
130 public synchronized ApexApiResult editModel() {
131 if (apexModelEdited != null) {
132 return new ApexApiResult(Result.FAILED, "model is already being edited");
135 apexModelEdited = apexModel.clone();
136 return new ApexApiResult();
140 * Commit the changes to the Apex model.
142 * @return the result of the commit operation
144 public synchronized ApexApiResult commitChanges() {
145 if (apexModelEdited == null) {
146 return new ApexApiResult(Result.FAILED, "model is not being edited");
149 apexModel = apexModelEdited;
150 apexModelEdited = null;
151 return new ApexApiResult();
155 * Discard the changes to the Apex model.
157 * @return the result of the discard operation
159 public synchronized ApexApiResult discardChanges() {
160 if (apexModelEdited == null) {
161 return new ApexApiResult(Result.FAILED, "model is not being edited");
164 apexModelEdited = null;
165 return new ApexApiResult();
169 * Download the apex model as a TOSCA service template YAML string.
171 * @return the apex model as a TOSCA service template YAML string
173 public ApexApiResult downloadModel() {
174 ApexModel apexModelToDownload = (apexModelEdited == null ? apexModel : apexModelEdited);
176 ToscaPolicy ap = toscaServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().values().iterator().next();
178 @SuppressWarnings("unchecked")
179 var apexEngineServiceParameterMap = (Map<String, Object>) ap.getProperties().get(ENGINE_SERVICE_PARAMETERS);
181 Object decoded = null;
183 decoded = new StandardCoder().decode(apexModelToDownload.listModel().getMessage(), Object.class);
184 } catch (Exception e) {
185 return new ApexApiResult(Result.FAILED, "insertion of APEX model into TOSCA Service template failed", e);
188 apexEngineServiceParameterMap.put(POLICY_TYPE_IMPL, decoded);
190 var result = new ApexApiResult();
192 result.addMessage(new StandardYamlCoder().encode(toscaServiceTemplate));
193 } catch (CoderException e) {
194 return new ApexApiResult(Result.FAILED, "encoding of TOSCA Service template into YAML failed", e);
201 * Upload the apex model as a TOSCA service template YAML string to the configured URL.
203 * @param userId the userId to use for upload. If blank, the commandline
204 * parameter "upload-userid" is used.
205 * @return a result indicating if the upload was successful or not
207 public ApexApiResult uploadModel(final String userId) {
208 // Get the model in TOSCA format
209 ApexApiResult result = downloadModel();
210 if (result.isNok()) {
214 ApexModel apexModelBeingUploaded = (apexModelEdited == null ? apexModel : apexModelEdited);
216 AxArtifactKey policyModelKey = apexModelBeingUploaded.getPolicyModel().getKey();
218 var policyModelUUid = apexModelBeingUploaded.getPolicyModel().getKeyInformation().get(policyModelKey)
219 .getUuid().toString();
220 return new PolicyUploadHandler().doUpload(result.getMessage(), policyModelKey, policyModelUUid, userId);
224 * Finish a session by committing or discarding the changes.
226 * @param commitFlag if true, commit changes otherwise discard them
228 public void finishSession(boolean commitFlag) {
237 * Get the session ID of the session.
239 * @return the sessionId
241 public int getSessionId() {
246 * Get the Apex model of the session.
248 * @return the apexModel
250 public ApexModel getApexModel() {
255 * Get the edited Apex model of the session.
257 * @return the apexModel
259 public ApexModel getApexModelEdited() {
260 return apexModelEdited;