blob: cfa72813a2401236e2266b3637c491fd4612d3dd [file] [log] [blame]
# Copyright 2019-present Infosys Limited     
# SPDX-License-Identifier: Apache-2.0
import re
import os
from template import Template
from xlUtils import xlUtils,wb
msgFactoryData = {}
msgFactoryData['msgList'] = []
msgDataTypeData = {}
msgDataTypeData['msgTypeList'] = []
msgDataTypeData['msgList'] = []
class GenerateMsgClass():
def __init__( self ):
self.msgParser()
def msgParser(self):
sheet = wb['Message Modeling']
state = ''
ieDetailList = []
ieList = []
currentMessage = ''
msgValue = 0
msgData = {}
for i in range(1,sheet.max_row+1):
cell_value_B = xlUtils.getCellValue(sheet,i,'B')
mMsgDefinitionStart = re.search('Message Definition Start:(\w+):(\d+)',str(cell_value_B))
mMsgDefinitionEnd = re.search('Message Definition End:(\w+)',str(cell_value_B))
mResponseMsg = re.search('ResponseMessage',str(cell_value_B))
mGrouped = re.search('Grouped',str(cell_value_B))
if mMsgDefinitionStart:
state = 'StartDetected'
currentMessage = mMsgDefinitionStart.group(1)
msgValue = mMsgDefinitionStart.group(2)
if mMsgDefinitionEnd:
ieList = []
ieDetailList = []
state = 'EndDetected'
GenerateMsgClass.templateIes(msgData,currentMessage)
GenerateMsgClass.generateMsgFactory(msgData,currentMessage)
GenerateMsgClass.generateMsgDataType(msgData,currentMessage)
GenerateMsgClass.prepareMsgMakeFile()
elif state == 'StartDetected':
msgData['msgDetails'] = {}
msgData['msgDetails'][currentMessage] = {}
msgData['msgDetails'][currentMessage]['msgValue'] = msgValue
msgData['msgDetails'][currentMessage]['msgDataType'] = currentMessage + 'MsgData'
msgData['msgDetails'][currentMessage]['msgCategory'] = "RequestMessage"
if mResponseMsg:
msgData['msgDetails'][currentMessage]['msgCategory'] = "ResponseMessage"
elif mGrouped:
state = 'IeListStart'
elif state == 'IeListStart':
if xlUtils.getCellValue(sheet,i,'D') != None:
ieDescription = xlUtils.getCellValue(sheet,i,'D')
presence = xlUtils.getCellValue(sheet,i,'E')
grouped = xlUtils.getCellValue(sheet,i,'B')
cardinality = xlUtils.getCellValue(sheet,i,'C')
instance = xlUtils.getCellValue(sheet,i,'H')
msgData['ieDetails'] = {}
msgData['ieDetails'][ieDescription] = {}
msgData['ieDetails'][ieDescription]['ieDescription'] = ieDescription
msgData['ieDetails'][ieDescription]['presence'] = presence
msgData['ieDetails'][ieDescription]['grouped'] = grouped
msgData['ieDetails'][ieDescription]['cardinality'] = cardinality
msgData['ieDetails'][ieDescription]['instance'] = instance
if msgData['ieDetails'][ieDescription]['cardinality'] is None:
msgData['ieDetails'][ieDescription]['cardinality'] = 1
ieTypeDescription = xlUtils.getCellValue(sheet,i,'G')
msgData['ieDetails'][ieDescription]['ieTypeDescription'] = ieTypeDescription
ieVarName = xlUtils.getVarNameFromString(ieDescription,0)
ieTypeName = xlUtils.getVarNameFromString(ieTypeDescription,1)
ieVarName = ieVarName.replace('/','')
msgData['ieDetails'][ieDescription]['ieGroupTypeName'] = ''
if msgData['ieDetails'][ieDescription]['grouped'] == 'Yes':
msgData['ieDetails'][ieDescription]['ieGroupTypeName'] = ieVarName + 'In' + currentMessage
msgData['ieDetails'][ieDescription]['ieVarName'] = ieVarName
msgData['ieDetails'][ieDescription]['ieTypeName'] = ieTypeName
if ieVarName!="privateExtension":
ieDetailList.append(msgData['ieDetails'])
ieList.append(ieVarName)
msgData['ieList'] = ieList
msgData['ieDetails'] = ieDetailList
return msgData
def templateIes(msgData,currentMessage):
templateData = dict()
ieListTemplate = []
ieTypeTemplate = []
ieTypeDetailList = []
ieTypeList = []
templateData['fileName'] = currentMessage[0].lower()+currentMessage[1:] + 'Msg'
templateData['msgClassName'] = currentMessage[0].upper()+currentMessage[1:] + 'Msg'
templateData['classNameUC'] = templateData['fileName'].upper()
templateData['msgCategory'] = msgData['msgDetails'][currentMessage]['msgCategory']
for ieDetail in msgData['ieDetails']:
for key,value in ieDetail.items():
for ie in msgData['ieList']:
ieInfo = {}
ieTypeInfo = {}
if value['ieVarName'] == ie:
ieInfo['ieName'] = value['ieVarName']
ieInfo['ieVarName'] = value['ieVarName']
ieInfo['ieType'] = value['ieTypeName']
ieInfo['ieFileName'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] + 'Ie'
ieInfo['ieLocalVar'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:]
ieInfo['iePresence'] = value['presence']
ieInfo['ieCardinality'] = value['cardinality']
ieInfo['instance'] = value['instance']
ieInfo['grouped'] = value['grouped']
ieInfo['grpIeInstClassName'] = value['ieGroupTypeName']
if ieInfo['grouped']=='Yes':
ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:]
ieInfo['grpIeInstFileName'] = value['ieGroupTypeName']
ieType = ieInfo['ieType']
ieTypeInfo['ieName'] = value['ieVarName']
ieTypeInfo['ieVarName'] = value['ieVarName']
ieTypeInfo['ieType'] = value['ieTypeName']
ieTypeInfo['ieFileName'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] + 'Ie'
ieTypeInfo['ieLocalVar'] = value['ieTypeName'].capitalize()
ieTypeInfo['iePresence'] = value['presence']
ieTypeInfo['ieCardinality'] = value['cardinality']
ieTypeInfo['instance'] = value['instance']
ieTypeInfo['grouped'] = value['grouped']
ieTypeInfo['grpIeInstClassName'] = value['ieGroupTypeName']
if ieTypeInfo['grouped']=='Yes':
ieTypeInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:]
ieTypeInfo['grpIeInstFileName'] = value['ieGroupTypeName'].capitalize()
ieListTemplate.append(ieInfo)
templateData['ieList'] = ieListTemplate
if ieInfo['ieType'] not in ieTypeList:
ieTypeList.append(ieInfo['ieType'])
templateData['ieTypeList'] = ieTypeList
ieTypeTemplate = []
ieTypeTemplate.append(ieTypeInfo)
templateData['ieTypeDetails'] = {}
templateData['ieTypeDetails'][ieType] = ieTypeTemplate
ieTypeDetailList.append(templateData['ieTypeDetails'])
templateData['ieTypeDetails'] = ieTypeDetailList
outputDir = '../../src/gtpV2Codec/msgClasses'
ttFileNameCpp = 'tts/msgtemplate.cpp.tt'
ttFileNameH = 'tts/msgtemplate.h.tt'
xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
objectFile = 'msgClasses/' +templateData['fileName'] + '.o'
sourceFile = 'msgClasses/' + templateData['fileName'] + '.cpp'
xlUtils.addToMakeSo('gtpV2Stack.so',objectFile,sourceFile)
def generateMsgFactory(msgData,currentMessage):
msgInfo = {}
msgInfo['className'] = currentMessage + 'Msg'
msgInfo['msgFileName'] = currentMessage[0].lower()+currentMessage[1:] + 'Msg'
msgInfo['dataMember'] = currentMessage[0].lower()+currentMessage[1:] + 'StackData'
if msgInfo not in msgFactoryData['msgList']:
msgFactoryData['msgList'].append(msgInfo)
outputDirCpp = 'msgClasses/'
GenerateMsgClass.msgfactoryStacktemplate(msgFactoryData)
xlUtils.addToMakeSo('gtpV2Stack.so',outputDirCpp+'gtpV2MsgFactory.o',outputDirCpp+'gtpV2MsgFactory.cpp')
xlUtils.addToMakeSo('gtpV2Stack.so','gtpV2Stack.o','gtpV2Stack.cpp')
def msgfactoryStacktemplate(msgFactoryData):
ttFileNamefactoryCpp = 'tts/msgfactorytemplate.cpp.tt'
outputDir = '../../src/gtpV2Codec/msgClasses'
msgFactoryData['fileName'] = 'gtpV2MsgFactory'
ttFileNamefactoryH = 'tts/msgfactorytemplate.h.tt'
xlUtils.templateProcess(msgFactoryData,ttFileNamefactoryCpp,ttFileNamefactoryH,outputDir,outputDir)
ttFileNameStackCpp = 'tts/stacktemplate.cpp.tt'
outputDir = '../../src/gtpV2Codec/'
msgFactoryData['fileName'] = 'gtpV2Stack'
ttFileNameStackH = 'tts/stacktemplate.h.tt'
xlUtils.templateProcess(msgFactoryData,ttFileNameStackCpp,ttFileNameStackH,outputDir,outputDir)
def prepareMsgMakeFile():
outputDir = 'msgClasses/manual/'
xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'gtpV2Message.o', outputDir+'gtpV2Message.cpp')
def generateMsgDataType(msgData,currentMessage):
msginfo = {}
msgTypeInfo={}
msginfo['msgDataName'] = currentMessage + 'MsgData'
msginfo['ieDetails']=[]
msgTypeInfo['msgDataType']=currentMessage + 'MsgType'
msgTypeInfo['msgValue']=msgData['msgDetails'][currentMessage]['msgValue']
if msgTypeInfo not in msgDataTypeData['msgTypeList']:
msgDataTypeData['msgTypeList'].append(msgTypeInfo)
for ieDetail in msgData['ieDetails']:
for key,value in ieDetail.items():
for ie in msgData['ieList']:
ieInfo = {}
if value['ieVarName'] == ie:
ieInfo['ieName'] = value['ieVarName']
ieInfo['ieVarName'] = value['ieVarName']
ieInfo['ieType'] = value['ieTypeName']
ieInfo['iePresence'] = value['presence']
ieInfo['ieCardinality'] = value['cardinality']
ieInfo['grouped'] = value['grouped']
ieInfo['grpIeInstClassName'] = value['ieGroupTypeName']
if ieInfo['grouped']=='Yes':
ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:]
ieInfo['grpIeInstFileName'] = value['ieGroupTypeName']
if ieInfo not in msginfo['ieDetails']:
msginfo['ieDetails'].append(ieInfo)
if msginfo not in msgDataTypeData['msgList']:
msgDataTypeData['msgList'].append(msginfo)
template = Template()
ttFileNamefactoryH = 'tts/msgDataTypetemplate.h.tt'
outputDir = '../../src/gtpV2Codec/msgClasses'
if not os.path.exists(outputDir):
os.makedirs(outputDir)
outputFileName = 'gtpV2MsgDataTypes.h'
template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
template.process(ttFileNamefactoryH, {'tempdata' : msgDataTypeData})
GenerateMsgClass()