2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.bpmn.common.scripts;
22 import org.onap.so.bpmn.core.UrnPropertiesReader;
24 import java.text.SimpleDateFormat
26 import org.camunda.bpm.engine.delegate.DelegateExecution
27 import org.onap.so.bpmn.core.WorkflowException
28 import org.onap.so.logger.MessageEnum
29 import org.onap.so.logger.MsoLogger
34 // SDNC Adapter Request/Response processing
36 public class SDNCAdapter extends AbstractServiceTaskProcessor {
37 private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCAdapter.class);
41 ExceptionUtil exceptionUtil = new ExceptionUtil()
43 // Script Task: Process SDNC Workflow Request
44 // Params: Workflow DelegateExecution
45 // Assume: Received SDNCAdapterWorkflowRequest is in variable 'sdncAdapterWorkflowRequest'
46 // Put created SDNCAdapterRequest in variable 'sdncAdapterRequest'
47 public void preProcessRequest (DelegateExecution execution) {
50 msoLogger.trace("Begin PreProcess SDNCAdapterRequestScript ")
51 msoLogger.debug("Incoming sdncAdapterWorkflowRequest:\n" + execution.getVariable("sdncAdapterWorkflowRequest"))
53 // Initialize some variables used throughout the flow
54 execution.setVariable("prefix", Prefix)
55 execution.setVariable("sdncAdapterResponse", "")
56 execution.setVariable("asynchronousResponseTimeout", false)
57 execution.setVariable("continueListening", false)
58 execution.setVariable("SDNCA_SuccessIndicator", false)
59 execution.setVariable("SDNCA_InterimNotify", false)
62 String basicAuthValue = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution)
65 def encodedString = utils.getBasicAuth(basicAuthValue, UrnPropertiesReader.getVariable("mso.msoKey", execution))
66 execution.setVariable("BasicAuthHeaderValue",encodedString)
67 } catch (IOException ex) {
68 msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Unable to encode username password string", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "");
71 // TODO Use variables instead of passing xml request - Huh?
73 // Get original RequestHeader
74 def sdncwfreq= execution.getVariable("sdncAdapterWorkflowRequest")
75 def requestHeader = utils.getNodeXml(sdncwfreq, "RequestHeader")
76 requestHeader = requestHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
78 // Set Callback URL to use from URN Mapping or jBoss Property
79 def origCallbackUrl = utils.getNodeText(requestHeader, "CallbackUrl")
80 def callbackUrlToUse = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback", execution)
81 MsoUtils msoUtil = new MsoUtils()
82 def useQualifiedHostName = UrnPropertiesReader.getVariable("mso.use.qualified.host", execution)
83 if((useQualifiedHostName!=null) && (useQualifiedHostName.equals("true"))){
84 callbackUrlToUse = msoUtil.getQualifiedHostNameForCallback(callbackUrlToUse)
86 msoLogger.debug("Callback URL to use:\n" + callbackUrlToUse)
87 requestHeader = requestHeader.replace(origCallbackUrl, callbackUrlToUse)
89 // Get parameters from request header
90 def sdnca_svcInstanceId = utils.getNodeText(requestHeader, "SvcInstanceId") // optional
91 msoLogger.debug("SvcInstanceId: " + sdnca_svcInstanceId)
92 def sdnca_msoAction = utils.getNodeText(requestHeader, "MsoAction") // optional
93 msoLogger.debug("MsoAction: " + sdnca_msoAction)
94 def sdnca_svcAction = utils.getNodeText(requestHeader, "SvcAction")
95 msoLogger.debug("SvcAction: " + sdnca_svcAction)
96 def sdnca_svcOperation = utils.getNodeText(requestHeader, "SvcOperation")
97 msoLogger.debug("SvcOperation: " + sdnca_svcOperation)
98 def sdncRequestData = utils.getChildNodes(sdncwfreq, "SDNCRequestData")
99 sdncRequestData = sdncRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
100 sdncRequestData = sdncRequestData.replaceAll('tag0:', '').replaceAll(':tag0', '')
101 msoLogger.debug("SDNCRequestData:\n" + sdncRequestData)
102 def sdnca_serviceType = ""
103 if (utils.nodeExists(sdncwfreq, "service-type")) {
104 sdnca_serviceType = utils.getNodeText(sdncwfreq, "service-type")
106 msoLogger.debug("service-type: " + sdnca_serviceType)
107 def serviceConfigActivate = false
109 if ((sdnca_svcAction == 'activate') && (sdnca_svcOperation == 'service-configuration-operation') && (sdnca_serviceType == 'uCPE-VMS')) {
110 serviceConfigActivate = true
111 if (utils.nodeExists(sdncwfreq, 'source')) {
112 source = utils.getNodeText(sdncwfreq, 'source')
115 execution.setVariable("serviceConfigActivate", serviceConfigActivate)
116 msoLogger.debug("serviceConfigActivate: " + serviceConfigActivate)
117 execution.setVariable("source", source)
118 msoLogger.debug("source: " + source)
120 //calling process should pass a generated uuid if sending multiple sdnc requests
121 def requestId = utils.getNodeText(requestHeader, "RequestId")
122 execution.setVariable(Prefix + "requestId", requestId)
124 // Prepare SDNC Request to the SDNC Adapter
125 String sdncAdapterRequest = """
126 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
128 <aetgt:SDNCAdapterRequest xmlns:aetgt="http://org.onap/workflow/sdnc/adapter/schema/v1" xmlns:sdncadaptersc="http://org.onap/workflow/sdnc/adapter/schema/v1">
129 <sdncadapter:RequestHeader xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
130 <sdncadapter:RequestId>${MsoUtils.xmlEscape(requestId)}</sdncadapter:RequestId>"""
132 if (sdnca_svcInstanceId != null) {
133 sdncAdapterRequest += """
134 <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(sdnca_svcInstanceId)}</sdncadapter:SvcInstanceId>"""
135 execution.setVariable("serviceInstanceId", sdnca_svcInstanceId)
138 sdncAdapterRequest += """
139 <sdncadapter:SvcAction>${MsoUtils.xmlEscape(sdnca_svcAction)}</sdncadapter:SvcAction>
140 <sdncadapter:SvcOperation>${MsoUtils.xmlEscape(sdnca_svcOperation)}</sdncadapter:SvcOperation>
141 <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackUrlToUse)}</sdncadapter:CallbackUrl>"""
143 if (sdnca_msoAction != null) {
144 sdncAdapterRequest += """
145 <sdncadapter:MsoAction>${MsoUtils.xmlEscape(sdnca_msoAction)}</sdncadapter:MsoAction>"""
148 sdncAdapterRequest += """
149 </sdncadapter:RequestHeader>
150 <sdncadaptersc:RequestData>
152 </sdncadaptersc:RequestData></aetgt:SDNCAdapterRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>"""
154 msoLogger.debug("Outgoing SDNCAdapterRequest:\n" + sdncAdapterRequest)
155 execution.setVariable("sdncAdapterRequest", sdncAdapterRequest)
157 msoLogger.debug(UrnPropertiesReader.getVariable("mso.adapters.sdnc.endpoint", execution))
159 msoLogger.debug('Internal Error occured during PreProcess Method: ', e)
160 exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PreProcess Method') // TODO: what message and error code?
162 msoLogger.trace("End pre Process SDNCRequestScript ")
165 public void postProcessResponse (DelegateExecution execution) {
168 msoLogger.trace("Begin POSTProcess SDNCAdapter ")
169 msoLogger.trace("Incoming sdncAdapterCallbackRequest:\n" + execution.getVariable("sdncAdapterCallbackRequest"))
171 // Check the sdnccallback request and get the responsecode
172 def sdnccallbackreq = execution.getVariable("sdncAdapterCallbackRequest")
173 def callbackRequestData = ""
174 def callbackHeader = ""
176 if(sdnccallbackreq != null){
177 callbackHeader = utils.getNodeXml(sdnccallbackreq, "CallbackHeader")
178 callbackRequestData = utils.getNodeXml(sdnccallbackreq, "RequestData")
180 callbackHeader = callbackHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
182 callbackRequestData = callbackRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
184 msoLogger.trace("EnhancedCallbackRequestData:\n" + callbackRequestData)
185 execution.setVariable("enhancedCallbackRequestData", callbackRequestData)
187 String sdncAdapterWorkflowResponse ="""
188 <sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
189 <sdncadapterworkflow:response-data>
191 ${callbackRequestData}
192 </sdncadapterworkflow:response-data>
193 </sdncadapterworkflow:SDNCAdapterWorkflowResponse>"""
196 sdncAdapterWorkflowResponse = utils.formatXml(sdncAdapterWorkflowResponse)
197 execution.setVariable("sdncAdapterResponse", sdncAdapterWorkflowResponse)
198 // TODO: Should deprecate use of processKey+Response variable for the response. Will use "WorkflowResponse" instead
199 execution.setVariable("WorkflowResponse", sdncAdapterWorkflowResponse)
201 // Check final indicator to determine if we are to continue listening or not
202 def continueListening = false
203 if (utils.nodeExists(callbackRequestData, "ack-final-indicator")) {
204 if (utils.getNodeText(callbackRequestData, "ack-final-indicator") == 'N') {
205 continueListening = true
208 execution.setVariable("continueListening", continueListening)
209 msoLogger.debug("Continue Listening: " + continueListening)
210 execution.setVariable("asynchronousResponseTimeout", false)
212 // Timed out waiting for asynchronous message, build error response
213 exceptionUtil.buildWorkflowException(execution, 500, "SDNC Callback Timeout Error")
214 execution.setVariable("asynchronousResponseTimeout", true)
215 msoLogger.debug("Timed out waiting for asynchronous message")
218 msoLogger.debug('Internal Error occured during PostProcess Method: ' + e)
219 exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PostProcess Method') // TODO: what message and error code?
221 msoLogger.trace("End POSTProcess SDNCAdapter ")
224 public void callbackResponsecheck(DelegateExecution execution){
226 def sdnccallbackreq=execution.getVariable("sdncAdapterCallbackRequest")
227 msoLogger.debug("sdncAdapterCallbackRequest :" + sdnccallbackreq)
228 if (sdnccallbackreq==null){
229 execution.setVariable("callbackResponseReceived",false);
231 execution.setVariable("callbackResponseReceived",true);
235 public void resetCallbackRequest(DelegateExecution execution) {
237 msoLogger.trace("Begin Reset Callback Info SDNCAdapter ")
239 // Clear sdncAdapterCallbackRequest variable
240 execution.removeVariable("sdncAdapterCallbackRequest")
242 // Determine and set SDNC Timeout Value
243 def enhancedCallbackRequestData = execution.getVariable("enhancedCallbackRequestData")
244 msoLogger.debug("sdncAdapter - enhancedCallbackRequestData :" + enhancedCallbackRequestData)
246 if (enhancedCallbackRequestData != null) {
247 if (utils.nodeExists(enhancedCallbackRequestData, "ack-final-indicator")) {
248 if (utils.getNodeText(enhancedCallbackRequestData, "ack-final-indicator") == 'N') {
253 def timeoutValue = UrnPropertiesReader.getVariable("mso.adapters.sdnc.timeout", execution)
254 if(timeoutValue==null)
256 def sdncAdapterWorkflowRequest = execution.getVariable("sdncAdapterWorkflowRequest")
257 if (interim && utils.nodeExists(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours")) {
258 timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours") + "H"
259 } else if (utils.nodeExists(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes")) {
260 timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes") + "M"
262 execution.setVariable("sdncTimeoutValue", timeoutValue)
263 msoLogger.debug("Setting SDNC Timeout Value to " + timeoutValue)
265 msoLogger.trace("End Reset Callback Info SDNCAdapter ")
269 public void prepareDBMessage(DelegateExecution execution) {
271 msoLogger.trace("Begin Prepare DB Message SDNCAdapter ")
274 def dbRequestId = execution.getVariable("mso-request-id")
275 String dbUpdateInterimStageCompletion = """
276 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
278 <DBAdapter:updateInterimStageCompletion xmlns:DBAdapter="http://org.onap.so/requestsdb">
279 <requestId>${MsoUtils.xmlEscape(dbRequestId)}</requestId>
280 <interimStageCompletion>1</interimStageCompletion>
281 <lastModifiedBy>BPEL</lastModifiedBy>
282 </DBAdapter:updateInterimStageCompletion>
287 execution.setVariable("dbUpdateInterimStageCompletion", dbUpdateInterimStageCompletion)
288 msoLogger.debug("sdncAdapter - dbUpdateInterimStageCompletion :" + dbUpdateInterimStageCompletion)
289 msoLogger.debug("DB UpdateInterimStageCompletion:\n" + dbUpdateInterimStageCompletion)
290 msoLogger.trace("End Prepare DB Message SDNCAdapter ")
293 public String generateCurrentTimeInUtc(){
294 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
295 sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
296 final String utcTime = sdf.format(new Date());
300 public void toggleSuccessIndicator(DelegateExecution execution){
301 execution.setVariable("SDNCA_SuccessIndicator", true)
302 msoLogger.debug("Setting SDNCA Success Indicator to True")
305 public void assignError(DelegateExecution execution){
306 msoLogger.trace("Started Assign Error ")
307 WorkflowException wf = execution.getVariable("WorkflowException")
309 exceptionUtil.buildWorkflowException(execution, 5000, "SDNCAdapter Encountered an Internal Error") // TODO: Not sure what message and error code we want here.....
311 execution.setVariable("WorkflowException", wf)
314 msoLogger.debug("Outgoing WorkflowException is: " + execution.getVariable("WorkflowException"))
315 msoLogger.trace("End Assign Error ")
318 public void setTimeout(DelegateExecution execution){
319 msoLogger.trace("Started SetTimeout ")
320 msoLogger.debug("Timer expired, telling correlation service to stop listening")
321 execution.setVariable("asynchronousResponseTimeout", true)
323 msoLogger.debug("Timed out branch sleeping for one second to give success branch a chance to complete if running")
325 msoLogger.trace("End SetTimeout ")