/*-
* ============LICENSE_START=======================================================
* OPENECOMP - MSO
* ================================================================================
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================
*/
package com.att.bpm.scripts;
import org.openecomp.mso.bpmn.core.WorkflowException
import java.text.SimpleDateFormat
import org.camunda.bpm.engine.delegate.BpmnError
import org.camunda.bpm.engine.runtime.Execution
import org.apache.commons.codec.binary.Base64;
// SDNC Adapter Request/Response processing
public class SDNCAdapter extends AbstractServiceTaskProcessor {
def Prefix="SDNCA_"
ExceptionUtil exceptionUtil = new ExceptionUtil()
// Script Task: Process SDNC Workflow Request
// Params: Workflow Execution
// Assume: Received SDNCAdapterWorkflowRequest is in variable 'sdncAdapterWorkflowRequest'
// Put created SDNCAdapterRequest in variable 'sdncAdapterRequest'
public void preProcessRequest (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
try{
utils.log("DEBUG", "=========== Begin PreProcess SDNCAdapterRequestScript ===========", isDebugEnabled)
utils.log("DEBUG", "Incoming sdncAdapterWorkflowRequest:\n" + execution.getVariable("sdncAdapterWorkflowRequest"), isDebugEnabled)
// Initialize some variables used throughout the flow
execution.setVariable("prefix", Prefix)
execution.setVariable("sdncAdapterResponse", "")
execution.setVariable("asynchronousResponseTimeout", false)
execution.setVariable("continueListening", false)
execution.setVariable("SDNCA_SuccessIndicator", false)
// Authorization Info
String basicAuthValue = execution.getVariable("URN_mso_adapters_po_auth")
utils.log("DEBUG", "Obtained BasicAuth userid password for sdnc adapter:" + basicAuthValue, isDebugEnabled)
try {
def encodedString = utils.getBasicAuth(basicAuthValue, execution.getVariable("URN_mso_msoKey"))
execution.setVariable("BasicAuthHeaderValue",encodedString)
} catch (IOException ex) {
utils.log("ERROR", "Unable to encode username password string")
}
// TODO Use variables instead of passing xml request - Huh?
// Get original RequestHeader
def sdncwfreq= execution.getVariable("sdncAdapterWorkflowRequest")
def requestHeader = utils.getNodeXml(sdncwfreq, "RequestHeader")
requestHeader = requestHeader.replace("\n", "")
utils.log("DEBUG", "RequestHeader:\n" + requestHeader, isDebugEnabled)
// Set Callback URL to use from URN Mapping or jBoss Property
def origCallbackUrl = utils.getNodeText(requestHeader, "CallbackUrl")
def callbackUrlToUse = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
MsoUtils msoUtil = new MsoUtils()
def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")
if((useQualifiedHostName!=null) && (useQualifiedHostName.equals("true"))){
callbackUrlToUse = msoUtil.getQualifiedHostNameForCallback(callbackUrlToUse)
}
utils.log("DEBUG", "Callback URL to use:\n" + callbackUrlToUse, isDebugEnabled)
requestHeader = requestHeader.replace(origCallbackUrl, callbackUrlToUse)
// Get parameters from request header
def sdnca_svcInstanceId = utils.getNodeText1(requestHeader, "SvcInstanceId") // optional
utils.log("DEBUG", "SvcInstanceId: " + sdnca_svcInstanceId, isDebugEnabled)
def sdnca_msoAction = utils.getNodeText1(requestHeader, "MsoAction") // optional
utils.log("DEBUG", "MsoAction: " + sdnca_msoAction, isDebugEnabled)
def sdnca_svcAction = utils.getNodeText(requestHeader, "SvcAction")
utils.log("DEBUG", "SvcAction: " + sdnca_svcAction, isDebugEnabled)
def sdnca_svcOperation = utils.getNodeText(requestHeader, "SvcOperation")
utils.log("DEBUG", "SvcOperation: " + sdnca_svcOperation, isDebugEnabled)
def sdncRequestData = utils.getChildNodes(sdncwfreq, "SDNCRequestData")
sdncRequestData = sdncRequestData.replace("\n", "")
sdncRequestData = sdncRequestData.replaceAll('tag0:', '').replaceAll(':tag0', '')
utils.log("DEBUG", "SDNCRequestData:\n" + sdncRequestData, isDebugEnabled)
def sdnca_serviceType = ""
if (utils.nodeExists(sdncwfreq, "service-type")) {
sdnca_serviceType = utils.getNodeText(sdncwfreq, "service-type")
}
utils.log("DEBUG", "service-type: " + sdnca_serviceType, isDebugEnabled)
def serviceConfigActivate = false
def source = ''
execution.setVariable("serviceConfigActivate", serviceConfigActivate)
utils.log("DEBUG", "serviceConfigActivate: " + serviceConfigActivate, isDebugEnabled)
execution.setVariable("source", source)
utils.log("DEBUG", "source: " + source, isDebugEnabled)
//calling process should pass a generated uuid if sending multiple sdnc requests
def requestId = utils.getNodeText(requestHeader, "RequestId")
execution.setVariable(Prefix + "requestId", requestId)
// Prepare SDNC Request to the SDNC Adapter
String sdncAdapterRequest = """
${requestId}"""
if (sdnca_svcInstanceId != null) {
sdncAdapterRequest += """
${sdnca_svcInstanceId}"""
}
sdncAdapterRequest += """
${sdnca_svcAction}
${sdnca_svcOperation}
${callbackUrlToUse}"""
if (sdnca_msoAction != null) {
sdncAdapterRequest += """
${sdnca_msoAction}"""
}
sdncAdapterRequest += """
${sdncRequestData}"""
utils.logAudit("Outgoing SDNCAdapterRequest:\n" + sdncAdapterRequest)
execution.setVariable("sdncAdapterRequest", sdncAdapterRequest)
utils.log("DEBUG", execution.getVariable("sdncAdapterRequest"), isDebugEnabled)
utils.log("DEBUG", execution.getVariable("URN_mso_adapters_sdnc_endpoint"), isDebugEnabled)
}catch(Exception e){
utils.log("DEBUG", 'Internal Error occured during PreProcess Method: ' + e, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PreProcess Method') // TODO: what message and error code?
}
utils.log("DEBUG","=========== End pre Process SDNCRequestScript ===========", isDebugEnabled)
}
public void postProcessResponse (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
try{
utils.log("DEBUG","=========== Begin POSTProcess SDNCAdapter ===========", isDebugEnabled)
utils.log("DEBUG","Incoming sdncAdapterCallbackRequest:\n" + execution.getVariable("sdncAdapterCallbackRequest"), isDebugEnabled)
// Check the sdnccallback request and get the responsecode
def sdnccallbackreq = execution.getVariable("sdncAdapterCallbackRequest")
def callbackRequestData = ""
def callbackHeader = ""
if(sdnccallbackreq != null){
callbackHeader = utils.getNodeXml(sdnccallbackreq, "CallbackHeader")
callbackRequestData = utils.getNodeXml(sdnccallbackreq, "RequestData")
callbackHeader = callbackHeader.replace("\n", "")
utils.log("DEBUG","SDNCCallbackHeader is:\n" + callbackHeader, isDebugEnabled)
callbackRequestData = callbackRequestData.replace("\n", "")
utils.log("DEBUG","DECODED SDNCCallback RequestData is:\n" + callbackRequestData, isDebugEnabled)
String sdncAdapterWorkflowResponse ="""
${callbackHeader}
${callbackRequestData}
"""
utils.log("DEBUG","Outgoing sdncAdapterWorkflowResponse:\n" + sdncAdapterWorkflowResponse, isDebugEnabled)
sdncAdapterWorkflowResponse = utils.formatXml(sdncAdapterWorkflowResponse)
execution.setVariable("sdncAdapterResponse", sdncAdapterWorkflowResponse)
// TODO: Should deprecate use of processKey+Response variable for the response. Will use "WorkflowResponse" instead
execution.setVariable("WorkflowResponse", sdncAdapterWorkflowResponse)
// Check final indicator to determine if we are to continue listening or not
def String enhancedCallbackRequestData = callbackRequestData.replaceAll("&", "&")
enhancedCallbackRequestData = enhancedCallbackRequestData.replaceAll("<", "<")
enhancedCallbackRequestData = enhancedCallbackRequestData.replaceAll(">", ">")
// replace the data with '&' (ex: subscriber-name= 'FOUR SEASONS HEATING & COOLING'
enhancedCallbackRequestData = enhancedCallbackRequestData.replace("&", "&")
utils.log("DEBUG","EnhancedCallbackRequestData:\n" + enhancedCallbackRequestData, isDebugEnabled)
execution.setVariable("enhancedCallbackRequestData", enhancedCallbackRequestData)
def continueListening = false
if (utils.nodeExists(enhancedCallbackRequestData, "ack-final-indicator")) {
if (utils.getNodeText(enhancedCallbackRequestData, "ack-final-indicator") == 'N') {
continueListening = true
}
}
execution.setVariable("continueListening", continueListening)
utils.log("DEBUG", "Continue Listening: " + continueListening, isDebugEnabled)
}else{
// Timed out waiting for asynchronous message, build error response
exceptionUtil.buildWorkflowException(execution, 500, "SDNC Callback Timeout Error")
execution.setVariable("asynchronousResponseTimeout", true)
utils.log("DEBUG", "Timed out waiting for asynchronous message", isDebugEnabled)
}
}catch(Exception e){
utils.log("DEBUG", 'Internal Error occured during PostProcess Method: ' + e, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PostProcess Method') // TODO: what message and error code?
}
utils.log("DEBUG","=========== End POSTProcess SDNCAdapter ===========", isDebugEnabled)
}
public void callbackResponsecheck(Execution execution){
def sdnccallbackreq=execution.getVariable("sdncAdapterCallbackRequest")
if (sdnccallbackreq==null){
execution.setVariable("callbackResponseReceived",false);
}else{
execution.setVariable("callbackResponseReceived",true);
}
}
public void resetCallbackRequest(Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
utils.log("DEBUG","=========== Begin Reset Callback Info SDNCAdapter ===========", isDebugEnabled)
// Clear sdncAdapterCallbackRequest variable
execution.removeVariable("sdncAdapterCallbackRequest")
// Determine and set SDNC Timeout Value
def enhancedCallbackRequestData = execution.getVariable("enhancedCallbackRequestData")
def interim = false
if (enhancedCallbackRequestData != null) {
if (utils.nodeExists(enhancedCallbackRequestData, "ack-final-indicator")) {
if (utils.getNodeText(enhancedCallbackRequestData, "ack-final-indicator") == 'N') {
interim = true
}
}
}
def timeoutValue = execution.getVariable("URN_mso_sdnc_timeout")
def sdncAdapterWorkflowRequest = execution.getVariable("sdncAdapterWorkflowRequest")
if (interim && utils.nodeExists(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours")) {
timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "InterimSDNCTimeOutValueInHours") + "H"
} else if (utils.nodeExists(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes")) {
timeoutValue = "PT" + utils.getNodeText(sdncAdapterWorkflowRequest, "SDNCTimeOutValueInMinutes") + "M"
}
execution.setVariable("sdncTimeoutValue", timeoutValue)
utils.log("DEBUG", "Setting SDNC Timeout Value to " + timeoutValue, isDebugEnabled)
utils.log("DEBUG","=========== End Reset Callback Info SDNCAdapter ===========", isDebugEnabled)
}
public void prepareCSIMessage(Execution execution) {
}
public void prepareDBMessage(Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
utils.log("DEBUG","=========== Begin Prepare DB Message SDNCAdapter ===========", isDebugEnabled)
// Create DB Message
def dbRequestId = execution.getVariable("att-mso-request-id")
String dbUpdateInterimStageCompletion = """
${dbRequestId}
1
BPEL
"""
execution.setVariable("dbUpdateInterimStageCompletion", dbUpdateInterimStageCompletion)
utils.log("DEBUG","DB UpdateInterimStageCompletion:\n" + dbUpdateInterimStageCompletion, isDebugEnabled)
utils.log("DEBUG","=========== End Prepare DB Message SDNCAdapter ===========", isDebugEnabled)
}
public void prepareCCDMessage(Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
utils.log("DEBUG","=========== Begin Prepare CCD Message SDNCAdapter ===========", isDebugEnabled)
try {
def sdncwfreq= execution.getVariable("sdncAdapterWorkflowRequest")
def sdncRequestData = utils.getNodeXml(sdncwfreq, "SDNCRequestData", false)
def ccdNotificationUrl = utils.getNodeText(sdncRequestData, 'notification-url')
execution.setVariable('ccd-notification-url', ccdNotificationUrl)
utils.log("DEBUG", 'ccd-notification-url: ' + ccdNotificationUrl, isDebugEnabled)
def requestId = utils.getNodeText(sdncRequestData, 'request-id')
def requestAction = utils.getNodeText(sdncRequestData, 'request-action')
String payload ="""
${requestId}
${requestAction}
CCD
N
request-stage
DataStagingComplete
"""
payload = utils.formatXml(payload)
execution.setVariable('ccd-notification-payload', payload)
utils.log("DEBUG", 'ccd-notification-payload:\n' + payload, isDebugEnabled)
} catch (BpmnError e) {
throw e;
} catch (Exception e) {
logError('Caught exception in prepareCCDMessage', e)
exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error') // TODO: what message and error code?
}
utils.log("DEBUG","=========== End Prepare CCD Message SDNCAdapter ===========", isDebugEnabled)
}
public String generateCurrentTimeInUtc(){
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
final String utcTime = sdf.format(new Date());
return utcTime;
}
public void toggleSuccessIndicator(Execution execution){
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("SDNCA_SuccessIndicator", true)
utils.log("DEBUG","Setting SDNCA Success Indicator to True", isDebugEnabled)
}
public void assignError(Execution execution){
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
utils.log("DEBUG","=========== Started Assign Error ===========", isDebugEnabled)
WorkflowException wf = execution.getVariable("WorkflowException")
if(wf == null){
exceptionUtil.buildWorkflowException(execution, 5000, "SDNCAdapter Encountered an Internal Error") // TODO: Not sure what message and error code we want here.....
}else{
execution.setVariable("WorkflowException", wf)
}
utils.log("DEBUG","Outgoing WorkflowException is: " + execution.getVariable("WorkflowException"), isDebugEnabled)
utils.log("DEBUG","=========== End Assign Error ===========", isDebugEnabled)
}
}