1710 Rebase - Second Attempt
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / openecomp / mso / bpmn / common / scripts / SDNCAdapter.groovy
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * OPENECOMP - MSO\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
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \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
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.common.scripts;\r
22 \r
23 import java.text.SimpleDateFormat\r
24 \r
25 import org.camunda.bpm.engine.runtime.Execution\r
26 import org.openecomp.mso.bpmn.core.WorkflowException\r
27 \r
28 \r
29 // SDNC Adapter Request/Response processing\r
30 \r
31 public class SDNCAdapter extends AbstractServiceTaskProcessor {\r
32 \r
33         def Prefix="SDNCA_"\r
34         ExceptionUtil exceptionUtil = new ExceptionUtil()\r
35 \r
36         // Script Task: Process SDNC Workflow Request\r
37         // Params:      Workflow Execution\r
38         // Assume:      Received SDNCAdapterWorkflowRequest is in variable 'sdncAdapterWorkflowRequest'\r
39         //                      Put created SDNCAdapterRequest in variable 'sdncAdapterRequest'\r
40         public void preProcessRequest (Execution execution) {\r
41                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
42                 try{\r
43 \r
44                         utils.log("DEBUG", "=========== Begin PreProcess SDNCAdapterRequestScript  ===========", isDebugEnabled)\r
45                         utils.log("DEBUG", "Incoming sdncAdapterWorkflowRequest:\n" + execution.getVariable("sdncAdapterWorkflowRequest"), isDebugEnabled)\r
46 \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
54                         \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
58                         try {\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
63                         }\r
64 \r
65                         // TODO Use variables instead of passing xml request - Huh?\r
66 \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
72 \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
80                         }\r
81                         utils.log("DEBUG", "Callback URL to use:\n" + callbackUrlToUse, isDebugEnabled)\r
82                         requestHeader = requestHeader.replace(origCallbackUrl, callbackUrlToUse)\r
83 \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
100                         }\r
101                         utils.log("DEBUG", "service-type: " + sdnca_serviceType, isDebugEnabled)\r
102                         def serviceConfigActivate = false\r
103                         def source = ''\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
108                                 }\r
109                         }\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
114 \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
118 \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
122                         <SOAP-ENV:Body>\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
126 \r
127                         if (sdnca_svcInstanceId != null) {\r
128                                 sdncAdapterRequest += """\r
129                         <sdncadapter:SvcInstanceId>${sdnca_svcInstanceId}</sdncadapter:SvcInstanceId>"""\r
130                         }\r
131 \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
136 \r
137                         if (sdnca_msoAction != null) {\r
138                                 sdncAdapterRequest += """\r
139                         <sdncadapter:MsoAction>${sdnca_msoAction}</sdncadapter:MsoAction>"""\r
140                         }\r
141 \r
142                         sdncAdapterRequest += """\r
143                         </sdncadapter:RequestHeader>\r
144                         <sdncadaptersc:RequestData>${sdncRequestData}</sdncadaptersc:RequestData></aetgt:SDNCAdapterRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>"""\r
145 \r
146                         utils.logAudit("Outgoing SDNCAdapterRequest:\n" + sdncAdapterRequest)\r
147                         execution.setVariable("sdncAdapterRequest", sdncAdapterRequest)\r
148 \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
154                 }\r
155                 utils.log("DEBUG","=========== End pre Process SDNCRequestScript ===========", isDebugEnabled)\r
156         }\r
157 \r
158         public void postProcessResponse (Execution execution) {\r
159 \r
160                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
161                 try{\r
162                         utils.log("DEBUG","=========== Begin POSTProcess SDNCAdapter ===========", isDebugEnabled)\r
163                         utils.log("DEBUG","Incoming sdncAdapterCallbackRequest:\n" + execution.getVariable("sdncAdapterCallbackRequest"), isDebugEnabled)\r
164 \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
170                         \r
171                         if(sdnccallbackreq != null){\r
172                                 callbackHeader = utils.getNodeXml(sdnccallbackreq, "CallbackHeader")\r
173                                 callbackRequestData = utils.getNodeXml(sdnccallbackreq, "RequestData")\r
174 \r
175                                 callbackHeader = callbackHeader.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "")\r
176                                 utils.log("DEBUG","SDNCCallbackHeader is:\n" + callbackHeader, isDebugEnabled)\r
177 \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
180 \r
181                                 String sdncAdapterWorkflowResponse ="""\r
182                                                 <sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.openecomp/mso/workflow/schema/v1">\r
183                                                 <sdncadapterworkflow:response-data>\r
184                                                 ${callbackHeader}\r
185                                                 ${callbackRequestData}\r
186                                                 </sdncadapterworkflow:response-data>\r
187                                                 </sdncadapterworkflow:SDNCAdapterWorkflowResponse>"""\r
188 \r
189 \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
196 \r
197                                 // Check final indicator to determine if we are to continue listening or not\r
198                                 def String enhancedCallbackRequestData = callbackRequestData.replaceAll("&amp;", "&")\r
199                                 enhancedCallbackRequestData = enhancedCallbackRequestData.replaceAll("&lt;", "<")\r
200                                 enhancedCallbackRequestData = enhancedCallbackRequestData.replaceAll("&gt;", ">")\r
201                                 // replace the data with '&' (ex: subscriber-name= 'FOUR SEASONS HEATING & COOLING'\r
202                                 enhancedCallbackRequestData = enhancedCallbackRequestData.replace("&", "&amp;")\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
209                                         }\r
210                                 }\r
211                                 execution.setVariable("continueListening", continueListening)\r
212                                 utils.log("DEBUG", "Continue Listening: " + continueListening, isDebugEnabled)\r
213                                 execution.setVariable("asynchronousResponseTimeout", false)\r
214                         }else{\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
219                         }\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
223                 }\r
224                 utils.log("DEBUG","=========== End POSTProcess SDNCAdapter ===========", isDebugEnabled)\r
225         }\r
226 \r
227         public void callbackResponsecheck(Execution execution){\r
228 \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
233                 }else{\r
234                         execution.setVariable("callbackResponseReceived",true);\r
235                 }\r
236         }\r
237 \r
238         public void resetCallbackRequest(Execution execution) {\r
239 \r
240                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
241 \r
242                 utils.log("DEBUG","=========== Begin Reset Callback Info SDNCAdapter ===========", isDebugEnabled)\r
243 \r
244                 // Clear sdncAdapterCallbackRequest variable\r
245                 execution.removeVariable("sdncAdapterCallbackRequest")\r
246 \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
254                                         interim = true\r
255                                 }\r
256                         }\r
257                 }\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
264                 }\r
265                 execution.setVariable("sdncTimeoutValue", timeoutValue)\r
266                 utils.log("DEBUG", "Setting SDNC Timeout Value to " + timeoutValue, isDebugEnabled)\r
267 \r
268                 utils.log("DEBUG","=========== End Reset Callback Info SDNCAdapter ===========", isDebugEnabled)\r
269         }\r
270 \r
271 \r
272         public void prepareDBMessage(Execution execution) {\r
273 \r
274                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
275 \r
276                 utils.log("DEBUG","=========== Begin Prepare DB Message SDNCAdapter ===========", isDebugEnabled)\r
277 \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
282                                 <SOAP-ENV:Body>\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
288                                 </SOAP-ENV:Body>\r
289                         </SOAP-ENV:Envelope>\r
290                         """\r
291 \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
296         }\r
297 \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
302                 return utcTime;\r
303         }\r
304 \r
305         public void toggleSuccessIndicator(Execution 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
309         }\r
310 \r
311         public void assignError(Execution 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
315                 if(wf == null){\r
316                         exceptionUtil.buildWorkflowException(execution, 5000, "SDNCAdapter Encountered an Internal Error") // TODO: Not sure what message and error code we want here.....\r
317                 }else{\r
318                         execution.setVariable("WorkflowException", wf)\r
319                 }\r
320 \r
321                 utils.log("DEBUG","Outgoing WorkflowException is: " + execution.getVariable("WorkflowException"), isDebugEnabled)\r
322                 utils.log("DEBUG","=========== End Assign Error ===========", isDebugEnabled)\r
323         }\r
324         \r
325         public void setTimeout(Execution 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
330                 \r
331                 utils.log("DEBUG", "Timed out branch sleeping for one second to give success branch a chance to complete if running", isDebugEnabled)\r
332                 Thread.sleep(1000)\r
333                 utils.log("DEBUG","=========== End SetTimeout ===========", isDebugEnabled)\r
334         }\r
335 }\r