blob: 072ccc0f4f54cac9050241e5195a484f83b05f51 [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
templateData = {}
templateData['instList']=[]
grpIeDataTypeData={}
grpIeDataTypeData['grpList']=[]
grpIeDataTypeData['grpTypeList']=[]
class GenerateGrpIeClass():
def __init__( self ):
self.groupIEParser()
def groupIEParser(self):
sheet = wb['Grouped IE Modeling']
state = ''
data = {}
grpIeData = {}
currentGrpie = ''
currentMsg = ''
currentVar = ''
currentInstance = ''
currentInstanceValue = 0
grpIeList = []
ieDetailsList = []
ieList = []
for i in range(1,sheet.max_row+1):
cell_value_B = xlUtils.getCellValue(sheet,i,'B')
mGroupedIeDefStart = re.search('Grouped IE Definition Start:(\w+):(\d+):(\w+):(\w+):Instance\[(\d+)]',str(cell_value_B))
mGroupedIeDefEnd = re.search('Grouped IE Definition End:(\w+):(\w+)',str(cell_value_B))
if mGroupedIeDefStart:
state = 'StartDetected'
currentGrpie = mGroupedIeDefStart.group(1)
currentMsg = mGroupedIeDefStart.group(4)
currentVar = mGroupedIeDefStart.group(3)
currentInstanceValue = mGroupedIeDefStart.group(5)
currentInstance = currentVar + 'In' + currentMsg
if currentGrpie not in grpIeList:
grpIeList.append(currentGrpie)
data['grpIeList'] = grpIeList
data['grpIeDetails'] = {}
data['grpIeDetails'][currentGrpie] = {}
data['grpIeDetails'][currentGrpie]['ieTypeValue'] = mGroupedIeDefStart.group(2)
data['grpIeDetails'][currentGrpie]['instList'] = []
data['grpIeDetails'][currentGrpie]['instList'].append(currentInstance)
data['grpIeDetails'][currentGrpie][currentInstance] = {}
data['grpIeDetails'][currentGrpie][currentInstance]['instance'] = currentInstanceValue
grpIeData = data['grpIeDetails'][currentGrpie][currentInstance]
grpIeData['msgName'] = currentMsg
elif mGroupedIeDefEnd:
state = 'EndDetected'
grpIeData = {}
ieList = []
grpIeList=[]
ieDetailsList = []
GenerateGrpIeClass.generateGroupedIeClasses(data)
GenerateGrpIeClass.prepareGrpIeMakeFile()
elif state == 'StartDetected':
state = 'IeListStart'
elif state == 'IeListStart':
if xlUtils.getCellValue(sheet,i,'D') != None:
ieData = {}
ieDescription = xlUtils.getCellValue(sheet,i,'D')
ieData['ieDescription'] = xlUtils.getCellValue(sheet,i,'D')
ieData['presence'] = xlUtils.getCellValue(sheet,i,'E')
ieData['grouped'] = xlUtils.getCellValue(sheet,i,'B')
ieData['cardinality'] = xlUtils.getCellValue(sheet,i,'C')
ieData['instance'] = xlUtils.getCellValue(sheet,i,'H')
if ieData['cardinality'] == None:
ieData['cardinality'] = 1
ieTypeDescription = xlUtils.getCellValue(sheet,i,'G')
ieData['ieTypeDescription'] = ieTypeDescription
ieVarName = xlUtils.getVarNameFromString(ieDescription,0)
ieTypeName = xlUtils.getVarNameFromString(ieTypeDescription,1)
if ieData['grouped'] == 'Yes':
ieData['ieGroupTypeName'] = ieVarName.capitalize() + 'In' + currentMsg
ieData['ieVarName'] = ieVarName
ieData['ieTypeName'] = ieTypeName
ieList.append(ieVarName)
grpIeData['ieList'] = ieList
grpIeData['ieDetails'] = {}
grpIeData['ieDetails'][ieVarName] = ieData
ieDetailsList.append(grpIeData['ieDetails'])
grpIeData['ieDetails'] = ieDetailsList
def generateGroupedIeClasses(data):
parsedData = data
for grpIe in parsedData['grpIeList']:
grpIeDetails = parsedData['grpIeDetails'][grpIe]
GenerateGrpIeClass.generateGroupedIeClass(grpIeDetails,grpIe)
GenerateGrpIeClass.generateGroupedIeDataType(grpIeDetails, grpIe)
def generateGroupedIeClass(grpIeDetails,grpIe):
templateData['fileName'] = grpIe[0].lower()+grpIe[1:] + 'Ie'
templateData['className'] = grpIe + 'Ie'
templateData['classNameUC'] = templateData['fileName'].upper()
fileName=templateData['fileName']
for inst in grpIeDetails['instList']:
instanceInfo = {}
instDetails = grpIeDetails[inst]
GenerateGrpIeClass.generateGroupedIeInstanceClass(instDetails, inst)
instanceInfo['className'] = inst
instanceInfo['fileName'] = inst[0].lower()+inst[1:]
instanceInfo['msgType'] = instDetails['msgName'] + 'MsgType'
instanceInfo['instance'] = instDetails['instance']
if instanceInfo not in templateData['instList']:
templateData['instList'].append(instanceInfo)
templateData[fileName]=[inst for inst in templateData['instList'] if grpIe in inst['className']]
outputDir = '../../src/gtpV2Codec/ieClasses'
ttFileNameCpp = 'tts/grpietemplate.cpp.tt'
ttFileNameH = 'tts/grpietemplate.h.tt'
xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
objectfile ='ieClasses/' + templateData['fileName'] + '.o'
sourcefile = 'ieClasses/' + templateData['fileName'] + '.cpp'
xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
def generateGroupedIeDataType(grpIeDetails, grpIe):
grpIeInfo={}
grpIeInfo['iePresenceList']=[]
grpIeTypeInfo={}
grpIeTypeInfo['grpIeTypeName']=grpIe + 'IeType'
grpIeTypeInfo['grpIeTypeValue']=grpIeDetails['ieTypeValue']
if grpIeTypeInfo not in grpIeDataTypeData['grpTypeList']:
grpIeDataTypeData['grpTypeList'].append(grpIeTypeInfo)
for inst in grpIeDetails['instList']:
instDetails = grpIeDetails[inst]
grpIeInfo={}
grpIeInfo['iePresenceList']=[]
grpIeInfo['grpIeName']= inst+'Data'
grpIeInfo['ieList']=[]
for ieDict in instDetails['ieDetails']:
for ieDetails in ieDict:
if ieDict[ieDetails]['presence']!='M':
grpIeInfo['iePresenceList'].append(ieDict[ieDetails]['ieVarName']+'IePresent')
ieInfo={}
ieInfo['ieTypeName']=ieDict[ieDetails]['ieTypeName']+'IeData'
ieInfo['ieVarName']=ieDict[ieDetails]['ieVarName']
grpIeInfo['ieList'].append(ieInfo)
if grpIeInfo not in grpIeDataTypeData['grpList']:
grpIeDataTypeData['grpList'].append(grpIeInfo)
template = Template()
ttFileNamefactoryH = 'tts/grpIeDataTypetemplate.h.tt'
outputDir = '../../src/gtpV2Codec/ieClasses/'
if not os.path.exists(outputDir):
os.makedirs(outputDir)
outputFileName = 'gtpV2GrpIeDataTypes.h'
template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
template.process(ttFileNamefactoryH, {'tempdata' : grpIeDataTypeData})
def generateGroupedIeInstanceClass(instDetails, inst):
templateInstData = {}
ieTypeList = []
ieTypeDetailsList = []
ieInfoList =[]
templateInstData['fileName'] = inst[0].lower()+inst[1:]
templateInstData['msgClassName'] = inst
templateInstData['classNameUC'] = templateInstData['fileName'].upper()
for ieEntry in instDetails['ieList']:
ieInfo = {}
ieTypeInfo = {}
ies = instDetails['ieDetails']
for x in ies:
ie = x.get(ieEntry)
if ie != None and ieEntry == ie.get('ieVarName'):
ieInfo['ieName'] = ie['ieVarName']
ieInfo['ieVarName'] = ie['ieVarName']
ieInfo['ieType'] = ie['ieTypeName']
ieInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
ieInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
ieInfo['iePresence'] = ie['presence']
ieInfo['ieCardinality'] = ie['cardinality']
ieInfo['instance'] = ie['instance']
ieInfo['grouped'] = ie['grouped']
ieType = ieInfo['ieType']
ieTypeInfo['ieName'] = ie['ieVarName']
ieTypeInfo['ieVarName'] = ie['ieVarName']
ieTypeInfo['ieType'] = ie['ieTypeName']
ieTypeInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
ieTypeInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
ieTypeInfo['iePresence'] = ie['presence']
ieTypeInfo['ieCardinality'] = ie['cardinality']
ieTypeInfo['instance'] = ie['instance']
ieTypeInfo['grouped'] = ie['grouped']
if ieInfo['ieType'] not in ieTypeList:
ieTypeList.append(ieInfo['ieType'])
templateInstData['ieTypeList'] = ieTypeList
if ieInfo not in ieInfoList:
ieInfoList.append(ieInfo)
templateInstData['ieList'] = ieInfoList
templateInstData['ieTypeDetails'] = {}
templateInstData['ieTypeDetails'][ieType] = []
if ieTypeInfo not in templateInstData['ieTypeDetails'][ieType]:
templateInstData['ieTypeDetails'][ieType].append(ieTypeInfo)
ieTypeDetailsList.append(templateInstData['ieTypeDetails'])
templateInstData['ieTypeDetails'] = ieTypeDetailsList
GenerateGrpIeClass.templateInstanceprocess(templateInstData)
outputDirCpp = 'ieClasses/'
objectfile = outputDirCpp +templateInstData['fileName'] + '.o'
sourcefile = outputDirCpp + templateInstData['fileName'] + '.cpp'
xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
def templateInstanceprocess(templateInstData):
ttFileNameInstCpp = 'tts/grpieinsttemplate.cpp.tt'
outputDir = '../../src/gtpV2Codec/ieClasses'
ttFileNameInstH = 'tts/grpieinsttemplate.h.tt'
xlUtils.templateProcess(templateInstData,ttFileNameInstCpp,ttFileNameInstH,outputDir,outputDir)
def prepareGrpIeMakeFile():
outputDirCpp = 'ieClasses/manual/'
xlUtils.addToMakeSo("gtpV2Stack.so", outputDirCpp+'gtpV2GroupedIe.o',outputDirCpp+'gtpV2GroupedIe.cpp')
GenerateGrpIeClass()