2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 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;
25 import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
26 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
27 import org.onap.policy.apex.model.modelapi.ApexApiResult;
28 import org.onap.policy.apex.model.modelapi.ApexApiResult.Result;
29 import org.onap.policy.apex.model.modelapi.ApexModel;
30 import org.onap.policy.apex.model.modelapi.ApexModelFactory;
31 import org.onap.policy.common.utils.coder.CoderException;
32 import org.onap.policy.common.utils.coder.StandardCoder;
33 import org.onap.policy.common.utils.coder.StandardYamlCoder;
34 import org.onap.policy.common.utils.resources.ResourceUtils;
35 import org.onap.policy.gui.editors.apex.rest.handling.plugin.upload.PolicyUploadHandler;
36 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
37 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
38 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
39 import org.onap.policy.models.tosca.utils.ToscaUtils;
42 * This class represents an ongoing editor session in the Apex editor and holds the information for the session.
45 public class RestSession {
46 // The default TOSCA wrapper for an APEX policy
47 private static final String APEX_TOSCA_POLICY_TEMPLATE = "templates/ApexToscaPolicyTemplate.yaml";
49 // Recurring string constants
50 private static final String ENGINE_SERVICE_PARAMETERS = "engineServiceParameters";
51 private static final String POLICY_TYPE_IMPL = "policy_type_impl";
53 // The ID of the session
54 private int sessionId;
56 // The TOSCA Service Template of the session
57 private ToscaServiceTemplate toscaServiceTemplate;
59 // The Apex policy model of the session
60 private ApexModel apexModel;
62 // The Apex policy model being edited
63 private ApexModel apexModelEdited;
66 * Constructor, create the session.
68 * @param sessionId the session ID of the session
69 * @throws ApexRuntimeException when the APEX TOSCA template file cannot be loaded
71 public RestSession(final int sessionId) {
72 this.sessionId = sessionId;
75 this.toscaServiceTemplate = new StandardYamlCoder()
76 .decode(ResourceUtils.getResourceAsString(APEX_TOSCA_POLICY_TEMPLATE), ToscaServiceTemplate.class);
77 } catch (CoderException e) {
78 throw new ApexRuntimeException("could not load default APEX TOSCA template " + APEX_TOSCA_POLICY_TEMPLATE,
82 this.apexModel = new ApexModelFactory().createApexModel(null, true);
86 * Load the policy model from a TOSCA Service Template.
88 * @param toscaServiceTemplateString The TOSCA service template string
89 * @return the result of the lading operation
91 public ApexApiResult loadFromString(final String toscaServiceTemplateString) {
93 if (toscaServiceTemplateString.startsWith("{")) {
94 toscaServiceTemplate = new StandardCoder().decode(toscaServiceTemplateString,
95 ToscaServiceTemplate.class);
97 toscaServiceTemplate = new StandardYamlCoder().decode(toscaServiceTemplateString,
98 ToscaServiceTemplate.class);
100 } catch (Exception e) {
101 return new ApexApiResult(Result.FAILED, "incoming model is not a TOSCA Service template", e);
104 if (!ToscaUtils.doPoliciesExist(new JpaToscaServiceTemplate(toscaServiceTemplate))) {
105 return new ApexApiResult(Result.FAILED, "no policies found on incoming TOSCA service template");
108 @SuppressWarnings("unchecked")
109 Map<String, Object> apexEngineServiceParameterMap = (Map<String, Object>) toscaServiceTemplate
110 .getToscaTopologyTemplate().getPoliciesAsMap().values().iterator().next().getProperties()
111 .get(ENGINE_SERVICE_PARAMETERS);
113 String apexModelString;
115 apexModelString = new StandardCoder().encode(apexEngineServiceParameterMap.get(POLICY_TYPE_IMPL));
116 } catch (CoderException e) {
117 return new ApexApiResult(Result.FAILED, "APEX model not found TOSCA Service template", e);
120 return apexModelEdited.loadFromString(apexModelString);
124 * Commence making changes to the Apex model.
126 * @return the result of the edit commencement operation
128 public synchronized ApexApiResult editModel() {
129 if (apexModelEdited != null) {
130 return new ApexApiResult(Result.FAILED, "model is already being edited");
133 apexModelEdited = apexModel.clone();
134 return new ApexApiResult();
138 * Commit the changes to the Apex model.
140 * @return the result of the commit operation
142 public synchronized ApexApiResult commitChanges() {
143 if (apexModelEdited == null) {
144 return new ApexApiResult(Result.FAILED, "model is not being edited");
147 apexModel = apexModelEdited;
148 apexModelEdited = null;
149 return new ApexApiResult();
153 * Discard the changes to the Apex model.
155 * @return the result of the discard operation
157 public synchronized ApexApiResult discardChanges() {
158 if (apexModelEdited == null) {
159 return new ApexApiResult(Result.FAILED, "model is not being edited");
162 apexModelEdited = null;
163 return new ApexApiResult();
167 * Download the apex model as a TOSCA service template YAML string.
169 * @return the apex model as a TOSCA service template YAML string
171 public ApexApiResult downloadModel() {
172 ApexModel apexModelToDownload = (apexModelEdited == null ? apexModel : apexModelEdited);
174 ToscaPolicy ap = toscaServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().values().iterator().next();
176 @SuppressWarnings("unchecked")
177 Map<String, Object> apexEngineServiceParameterMap = (Map<String, Object>) ap.getProperties()
178 .get(ENGINE_SERVICE_PARAMETERS);
180 Object decoded = null;
182 decoded = new StandardCoder().decode(apexModelToDownload.listModel().getMessage(), Object.class);
183 } catch (Exception e) {
184 return new ApexApiResult(Result.FAILED, "insertion of APEX model into TOSCA Service template failed", e);
187 apexEngineServiceParameterMap.put(POLICY_TYPE_IMPL, decoded);
189 ApexApiResult result = new ApexApiResult();
191 result.addMessage(new StandardYamlCoder().encode(toscaServiceTemplate));
192 } catch (CoderException e) {
193 return new ApexApiResult(Result.FAILED, "encoding of TOSCA Service template into YAML failed", e);
200 * Upload the apex model as a TOSCA service template YAML string to the configured URL.
202 * @return a result indicating if the upload was successful or not
204 public ApexApiResult uploadModel() {
205 // Get the model in TOSCA format
206 ApexApiResult result = downloadModel();
207 if (result.isNok()) {
211 ApexModel apexModelBeingUploaded = (apexModelEdited == null ? apexModel : apexModelEdited);
213 AxArtifactKey policyModelKey = apexModelBeingUploaded.getPolicyModel().getKey();
215 String policyModelUUid = apexModelBeingUploaded.getPolicyModel().getKeyInformation().get(policyModelKey)
216 .getUuid().toString();
217 return new PolicyUploadHandler().doUpload(result.getMessage(), policyModelKey, policyModelUUid);
221 * Finish a session by committing or discarding the changes.
223 * @param commitFlag if true, commit changes otherwise discard them
225 public void finishSession(boolean commitFlag) {
234 * Get the session ID of the session.
236 * @return the sessionId
238 public int getSessionId() {
243 * Get the Apex model of the session.
245 * @return the apexModel
247 public ApexModel getApexModel() {
252 * Get the edited Apex model of the session.
254 * @return the apexModel
256 public ApexModel getApexModelEdited() {
257 return apexModelEdited;