2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
21 package org.openecomp.mso.bpmn.common.scripts;
\r
23 import java.text.SimpleDateFormat
\r
25 import org.camunda.bpm.engine.delegate.DelegateExecution
\r
26 import org.openecomp.mso.bpmn.core.WorkflowException
\r
29 // SDNC Adapter Request/Response processing
\r
31 public class SDNCAdapter extends AbstractServiceTaskProcessor {
\r
34 ExceptionUtil exceptionUtil = new ExceptionUtil()
\r
36 // Script Task: Process SDNC Workflow Request
\r
37 // Params: Workflow DelegateExecution
\r
38 // Assume: Received SDNCAdapterWorkflowRequest is in variable 'sdncAdapterWorkflowRequest'
\r
39 // Put created SDNCAdapterRequest in variable 'sdncAdapterRequest'
\r
40 public void preProcessRequest (DelegateExecution execution) {
\r
41 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
44 utils.log("DEBUG", "=========== Begin PreProcess SDNCAdapterRequestScript ===========", isDebugEnabled)
\r
45 utils.log("DEBUG", "Incoming sdncAdapterWorkflowRequest:\n" + execution.getVariable("sdncAdapterWorkflowRequest"), isDebugEnabled)
\r
47 // Initialize some variables used throughout the flow
\r
48 execution.setVariable("prefix", Prefix)
\r
49 execution.setVariable("sdncAdapterResponse", "")
\r
50 execution.setVariable("asynchronousResponseTimeout", false)
\r
51 execution.setVariable("continueListening", false)
\r
52 execution.setVariable("SDNCA_SuccessIndicator", false)
\r
53 execution.setVariable("SDNCA_InterimNotify", false)
\r
55 // Authorization Info
\r
56 String basicAuthValue = execution.getVariable("URN_mso_adapters_po_auth")
\r
57 utils.log("DEBUG", "Obtained BasicAuth userid password for sdnc adapter:" + basicAuthValue, isDebugEnabled)
\r
59 def encodedString = utils.getBasicAuth(basicAuthValue, execution.getVariable("URN_mso_msoKey"))
\r
60 execution.setVariable("BasicAuthHeaderValue",encodedString)
\r
61 } catch (IOException ex) {
\r
62 utils.log("ERROR", "Unable to encode username password string")
\r
65 // TODO Use variables instead of passing xml request - Huh?
\r
67 // Get original RequestHeader
\r
68 def sdncwfreq= execution.getVariable("sdncAdapterWorkflowRequest")
\r
69 def requestHeader = utils.getNodeXml(sdncwfreq, "RequestHeader")
\r
70 requestHeader = requestHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
\r
71 utils.log("DEBUG", "RequestHeader:\n" + requestHeader, isDebugEnabled)
\r
73 // Set Callback URL to use from URN Mapping or jBoss Property
\r
74 def origCallbackUrl = utils.getNodeText(requestHeader, "CallbackUrl")
\r
75 def callbackUrlToUse = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
\r
76 MsoUtils msoUtil = new MsoUtils()
\r
77 def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")
\r
78 if((useQualifiedHostName!=null) && (useQualifiedHostName.equals("true"))){
\r
79 callbackUrlToUse = msoUtil.getQualifiedHostNameForCallback(callbackUrlToUse)
\r
81 utils.log("DEBUG", "Callback URL to use:\n" + callbackUrlToUse, isDebugEnabled)
\r
82 requestHeader = requestHeader.replace(origCallbackUrl, callbackUrlToUse)
\r
84 // Get parameters from request header
\r
85 def sdnca_svcInstanceId = utils.getNodeText1(requestHeader, "SvcInstanceId") // optional
\r
86 utils.log("DEBUG", "SvcInstanceId: " + sdnca_svcInstanceId, isDebugEnabled)
\r
87 def sdnca_msoAction = utils.getNodeText1(requestHeader, "MsoAction") // optional
\r
88 utils.log("DEBUG", "MsoAction: " + sdnca_msoAction, isDebugEnabled)
\r
89 def sdnca_svcAction = utils.getNodeText(requestHeader, "SvcAction")
\r
90 utils.log("DEBUG", "SvcAction: " + sdnca_svcAction, isDebugEnabled)
\r
91 def sdnca_svcOperation = utils.getNodeText(requestHeader, "SvcOperation")
\r
92 utils.log("DEBUG", "SvcOperation: " + sdnca_svcOperation, isDebugEnabled)
\r
93 def sdncRequestData = utils.getChildNodes(sdncwfreq, "SDNCRequestData")
\r
94 sdncRequestData = sdncRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
\r
95 sdncRequestData = sdncRequestData.replaceAll('tag0:', '').replaceAll(':tag0', '')
\r
96 utils.log("DEBUG", "SDNCRequestData:\n" + sdncRequestData, isDebugEnabled)
\r
97 def sdnca_serviceType = ""
\r
98 if (utils.nodeExists(sdncwfreq, "service-type")) {
\r
99 sdnca_serviceType = utils.getNodeText(sdncwfreq, "service-type")
\r
101 utils.log("DEBUG", "service-type: " + sdnca_serviceType, isDebugEnabled)
\r
102 def serviceConfigActivate = false
\r
104 if ((sdnca_svcAction == 'activate') && (sdnca_svcOperation == 'service-configuration-operation') && (sdnca_serviceType == 'uCPE-VMS')) {
\r
105 serviceConfigActivate = true
\r
106 if (utils.nodeExists(sdncwfreq, 'source')) {
\r
107 source = utils.getNodeText(sdncwfreq, 'source')
\r
110 execution.setVariable("serviceConfigActivate", serviceConfigActivate)
\r
111 utils.log("DEBUG", "serviceConfigActivate: " + serviceConfigActivate, isDebugEnabled)
\r
112 execution.setVariable("source", source)
\r
113 utils.log("DEBUG", "source: " + source, isDebugEnabled)
\r
115 //calling process should pass a generated uuid if sending multiple sdnc requests
\r
116 def requestId = utils.getNodeText(requestHeader, "RequestId")
\r
117 execution.setVariable(Prefix + "requestId", requestId)
\r
119 // Prepare SDNC Request to the SDNC Adapter
\r
120 String sdncAdapterRequest = """
\r
121 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
\r
123 <aetgt:SDNCAdapterRequest xmlns:aetgt="http://org.openecomp/workflow/sdnc/adapter/schema/v1" xmlns:sdncadaptersc="http://org.openecomp/workflow/sdnc/adapter/schema/v1">
\r
124 <sdncadapter:RequestHeader xmlns:sdncadapter="http://org.openecomp/workflow/sdnc/adapter/schema/v1">
\r
125 <sdncadapter:RequestId>${requestId}</sdncadapter:RequestId>"""
\r
127 if (sdnca_svcInstanceId != null) {
\r
128 sdncAdapterRequest += """
\r
129 <sdncadapter:SvcInstanceId>${sdnca_svcInstanceId}</sdncadapter:SvcInstanceId>"""
\r
132 sdncAdapterRequest += """
\r
133 <sdncadapter:SvcAction>${sdnca_svcAction}</sdncadapter:SvcAction>
\r
134 <sdncadapter:SvcOperation>${sdnca_svcOperation}</sdncadapter:SvcOperation>
\r
135 <sdncadapter:CallbackUrl>${callbackUrlToUse}</sdncadapter:CallbackUrl>"""
\r
137 if (sdnca_msoAction != null) {
\r
138 sdncAdapterRequest += """
\r
139 <sdncadapter:MsoAction>${sdnca_msoAction}</sdncadapter:MsoAction>"""
\r
142 sdncAdapterRequest += """
\r
143 </sdncadapter:RequestHeader>
\r
144 <sdncadaptersc:RequestData>${sdncRequestData}</sdncadaptersc:RequestData></aetgt:SDNCAdapterRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>"""
\r
146 utils.logAudit("Outgoing SDNCAdapterRequest:\n" + sdncAdapterRequest)
\r
147 execution.setVariable("sdncAdapterRequest", sdncAdapterRequest)
\r
149 utils.log("DEBUG", execution.getVariable("sdncAdapterRequest"), isDebugEnabled)
\r
150 utils.log("DEBUG", execution.getVariable("URN_mso_adapters_sdnc_endpoint"), isDebugEnabled)
\r
151 }catch(Exception e){
\r
152 utils.log("DEBUG", 'Internal Error occured during PreProcess Method: ' + e, isDebugEnabled)
\r
153 exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PreProcess Method') // TODO: what message and error code?
\r
155 utils.log("DEBUG","=========== End pre Process SDNCRequestScript ===========", isDebugEnabled)
\r
158 public void postProcessResponse (DelegateExecution execution) {
\r
160 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
162 utils.log("DEBUG","=========== Begin POSTProcess SDNCAdapter ===========", isDebugEnabled)
\r
163 utils.log("DEBUG","Incoming sdncAdapterCallbackRequest:\n" + execution.getVariable("sdncAdapterCallbackRequest"), isDebugEnabled)
\r
165 // Check the sdnccallback request and get the responsecode
\r
166 def sdnccallbackreq = execution.getVariable("sdncAdapterCallbackRequest")
\r
167 def callbackRequestData = ""
\r
168 def callbackHeader = ""
\r
169 utils.logAudit("SDNCAdapterCallback Request :" + sdnccallbackreq)
\r
171 if(sdnccallbackreq != null){
\r
172 callbackHeader = utils.getNodeXml(sdnccallbackreq, "CallbackHeader")
\r
173 callbackRequestData = utils.getNodeXml(sdnccallbackreq, "RequestData")
\r
175 callbackHeader = callbackHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
\r
176 utils.log("DEBUG","SDNCCallbackHeader is:\n" + callbackHeader, isDebugEnabled)
\r
178 callbackRequestData = callbackRequestData.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")
\r
179 utils.log("DEBUG","DECODED SDNCCallback RequestData is:\n" + callbackRequestData, isDebugEnabled)
\r
181 String sdncAdapterWorkflowResponse ="""
\r
182 <sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.openecomp/mso/workflow/schema/v1">
\r
183 <sdncadapterworkflow:response-data>
\r
185 ${callbackRequestData}
\r
186 </sdncadapterworkflow:response-data>
\r
187 </sdncadapterworkflow:SDNCAdapterWorkflowResponse>"""
\r
190 utils.log("DEBUG","Outgoing sdncAdapterWorkflowResponse:\n" + sdncAdapterWorkflowResponse, isDebugEnabled)
\r
191 sdncAdapterWorkflowResponse = utils.formatXml(sdncAdapterWorkflowResponse)
\r
192 utils.logAudit("sdncAdapterWorkflowResponse :" + sdncAdapterWorkflowResponse)
\r
193 execution.setVariable("sdncAdapterResponse", sdncAdapterWorkflowResponse)
\r
194 // TODO: Should deprecate use of processKey+Response variable for the response. Will use "WorkflowResponse" instead
\r
195 execution.setVariable("WorkflowResponse", sdncAdapterWorkflowResponse)
\r
197 // Check final indicator to determine if we are to continue listening or not
\r
198 def String enhancedCallbackRequestData = callbackRequestData.replaceAll("&", "&")
\r
199 enhancedCallbackRequestData = enhancedCallbackRequestData.replaceAll("<", "<")
\r
200 enhancedCallbackRequestData = enhancedCallbackRequestData.replaceAll(">", ">")
\r
201 // replace the data with '&' (ex: subscriber-name= 'FOUR SEASONS HEATING & COOLING'
\r
202 enhancedCallbackRequestData = enhancedCallbackRequestData.replace("&", "&")
\r
203 utils.log("DEBUG","EnhancedCallbackRequestData:\n" + enhancedCallbackRequestData, isDebugEnabled)
\r
204 execution.setVariable("enhancedCallbackRequestData", enhancedCallbackRequestData)
\r
205 def continueListening = false
\r
206 if (utils.nodeExists(enhancedCallbackRequestData, "ack-final-indicator")) {
\r
207 if (utils.getNodeText(enhancedCallbackRequestData, "ack-final-indicator") == 'N') {
\r
208 continueListening = true
\r
211 execution.setVariable("continueListening", continueListening)
\r
212 utils.log("DEBUG", "Continue Listening: " + continueListening, isDebugEnabled)
\r
213 execution.setVariable("asynchronousResponseTimeout", false)
\r
215 // Timed out waiting for asynchronous message, build error response
\r
216 exceptionUtil.buildWorkflowException(execution, 500, "SDNC Callback Timeout Error")
\r
217 execution.setVariable("asynchronousResponseTimeout", true)
\r
218 utils.log("DEBUG", "Timed out waiting for asynchronous message", isDebugEnabled)
\r
220 }catch(Exception e){
\r
221 utils.log("DEBUG", 'Internal Error occured during PostProcess Method: ' + e, isDebugEnabled)
\r
222 exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PostProcess Method') // TODO: what message and error code?
\r
224 utils.log("DEBUG","=========== End POSTProcess SDNCAdapter ===========", isDebugEnabled)
\r
227 public void callbackResponsecheck(DelegateExecution execution){
\r
229 def sdnccallbackreq=execution.getVariable("sdncAdapterCallbackRequest")
\r
230 utils.logAudit("sdncAdapterCallbackRequest :" + sdnccallbackreq)
\r
231 if (sdnccallbackreq==null){
\r
232 execution.setVariable("callbackResponseReceived",false);
\r
234 execution.setVariable("callbackResponseReceived",true);
\r
238 public void resetCallbackRequest(DelegateExecution execution) {
\r
240 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
242 utils.log("DEBUG","=========== Begin Reset Callback Info SDNCAdapter ===========", isDebugEnabled)
\r
244 // Clear sdncAdapterCallbackRequest variable
\r
245 execution.removeVariable("sdncAdapterCallbackRequest")
\r
247 // Determine and set SDNC Timeout Value
\r
248 def enhancedCallbackRequestData = execution.getVariable("enhancedCallbackRequestData")
\r
249 utils.logAudit("sdncAdapter - enhancedCallbackRequestData :" + enhancedCallbackRequestData)
\r
250 def interim = false
\r
251 if (enhancedCallbackRequestData != null) {
\r
252 if (utils.nodeExists(enhancedCallbackRequestData, "ack-final-indicator")) {
\r
253 if (utils.getNodeText(enhancedCallbackRequestData, "ack-final-indicator") == 'N') {
\r
258 def timeoutValue = execution.getVariable("URN_mso_sdnc_timeout")
\r
259 def sdncAdapterWorkflowRequest = execution.getVariable("sdncAdapterWorkflowRequest")
\r
260 if (interim && utils.nodeExists(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours")) {
\r
261 timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours") + "H"
\r
262 } else if (utils.nodeExists(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes")) {
\r
263 timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes") + "M"
\r
265 execution.setVariable("sdncTimeoutValue", timeoutValue)
\r
266 utils.log("DEBUG", "Setting SDNC Timeout Value to " + timeoutValue, isDebugEnabled)
\r
268 utils.log("DEBUG","=========== End Reset Callback Info SDNCAdapter ===========", isDebugEnabled)
\r
272 public void prepareDBMessage(DelegateExecution execution) {
\r
274 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
276 utils.log("DEBUG","=========== Begin Prepare DB Message SDNCAdapter ===========", isDebugEnabled)
\r
278 // Create DB Message
\r
279 def dbRequestId = execution.getVariable("mso-request-id")
\r
280 String dbUpdateInterimStageCompletion = """
\r
281 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
\r
283 <DBAdapter:updateInterimStageCompletion xmlns:DBAdapter="http://org.openecomp.mso/requestsdb">
\r
284 <requestId>${dbRequestId}</requestId>
\r
285 <interimStageCompletion>1</interimStageCompletion>
\r
286 <lastModifiedBy>BPEL</lastModifiedBy>
\r
287 </DBAdapter:updateInterimStageCompletion>
\r
289 </SOAP-ENV:Envelope>
\r
292 execution.setVariable("dbUpdateInterimStageCompletion", dbUpdateInterimStageCompletion)
\r
293 utils.logAudit("sdncAdapter - dbUpdateInterimStageCompletion :" + dbUpdateInterimStageCompletion)
\r
294 utils.log("DEBUG","DB UpdateInterimStageCompletion:\n" + dbUpdateInterimStageCompletion, isDebugEnabled)
\r
295 utils.log("DEBUG","=========== End Prepare DB Message SDNCAdapter ===========", isDebugEnabled)
\r
298 public String generateCurrentTimeInUtc(){
\r
299 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
\r
300 sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
\r
301 final String utcTime = sdf.format(new Date());
\r
305 public void toggleSuccessIndicator(DelegateExecution execution){
\r
306 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
307 execution.setVariable("SDNCA_SuccessIndicator", true)
\r
308 utils.log("DEBUG","Setting SDNCA Success Indicator to True", isDebugEnabled)
\r
311 public void assignError(DelegateExecution execution){
\r
312 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
313 utils.log("DEBUG","=========== Started Assign Error ===========", isDebugEnabled)
\r
314 WorkflowException wf = execution.getVariable("WorkflowException")
\r
316 exceptionUtil.buildWorkflowException(execution, 5000, "SDNCAdapter Encountered an Internal Error") // TODO: Not sure what message and error code we want here.....
\r
318 execution.setVariable("WorkflowException", wf)
\r
321 utils.log("DEBUG","Outgoing WorkflowException is: " + execution.getVariable("WorkflowException"), isDebugEnabled)
\r
322 utils.log("DEBUG","=========== End Assign Error ===========", isDebugEnabled)
\r
325 public void setTimeout(DelegateExecution execution){
\r
326 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
\r
327 utils.log("DEBUG","=========== Started SetTimeout ===========", isDebugEnabled)
\r
328 utils.log("DEBUG", "Timer expired, telling correlation service to stop listening", isDebugEnabled)
\r
329 execution.setVariable("asynchronousResponseTimeout", true)
\r
331 utils.log("DEBUG", "Timed out branch sleeping for one second to give success branch a chance to complete if running", isDebugEnabled)
\r
333 utils.log("DEBUG","=========== End SetTimeout ===========", isDebugEnabled)
\r