anjana_sreekumar@infosys.com | 991c206 | 2020-01-08 11:42:57 +0530 | [diff] [blame^] | 1 | # Copyright 2019-present Infosys Limited |
| 2 | # SPDX-License-Identifier: Apache-2.0 |
| 3 | |
| 4 | |
| 5 | import re |
| 6 | import os |
| 7 | |
| 8 | from template import Template |
| 9 | from xlUtils import xlUtils,wb |
| 10 | templateData = {} |
| 11 | templateData['instList']=[] |
| 12 | grpIeDataTypeData={} |
| 13 | grpIeDataTypeData['grpList']=[] |
| 14 | grpIeDataTypeData['grpTypeList']=[] |
| 15 | class GenerateGrpIeClass(): |
| 16 | def __init__( self ): |
| 17 | |
| 18 | self.groupIEParser() |
| 19 | |
| 20 | def groupIEParser(self): |
| 21 | |
| 22 | |
| 23 | sheet = wb['Grouped IE Modeling'] |
| 24 | state = '' |
| 25 | |
| 26 | data = {} |
| 27 | grpIeData = {} |
| 28 | currentGrpie = '' |
| 29 | currentMsg = '' |
| 30 | currentVar = '' |
| 31 | currentInstance = '' |
| 32 | currentInstanceValue = 0 |
| 33 | grpIeList = [] |
| 34 | ieDetailsList = [] |
| 35 | ieList = [] |
| 36 | |
| 37 | for i in range(1,sheet.max_row+1): |
| 38 | |
| 39 | cell_value_B = xlUtils.getCellValue(sheet,i,'B') |
| 40 | |
| 41 | mGroupedIeDefStart = re.search('Grouped IE Definition Start:(\w+):(\d+):(\w+):(\w+):Instance\[(\d+)]',str(cell_value_B)) |
| 42 | mGroupedIeDefEnd = re.search('Grouped IE Definition End:(\w+):(\w+)',str(cell_value_B)) |
| 43 | |
| 44 | if mGroupedIeDefStart: |
| 45 | |
| 46 | state = 'StartDetected' |
| 47 | currentGrpie = mGroupedIeDefStart.group(1) |
| 48 | currentMsg = mGroupedIeDefStart.group(4) |
| 49 | currentVar = mGroupedIeDefStart.group(3) |
| 50 | currentInstanceValue = mGroupedIeDefStart.group(5) |
| 51 | currentInstance = currentVar + 'In' + currentMsg |
| 52 | |
| 53 | if currentGrpie not in grpIeList: |
| 54 | grpIeList.append(currentGrpie) |
| 55 | data['grpIeList'] = grpIeList |
| 56 | data['grpIeDetails'] = {} |
| 57 | data['grpIeDetails'][currentGrpie] = {} |
| 58 | data['grpIeDetails'][currentGrpie]['ieTypeValue'] = mGroupedIeDefStart.group(2) |
| 59 | data['grpIeDetails'][currentGrpie]['instList'] = [] |
| 60 | data['grpIeDetails'][currentGrpie]['instList'].append(currentInstance) |
| 61 | data['grpIeDetails'][currentGrpie][currentInstance] = {} |
| 62 | data['grpIeDetails'][currentGrpie][currentInstance]['instance'] = currentInstanceValue |
| 63 | grpIeData = data['grpIeDetails'][currentGrpie][currentInstance] |
| 64 | grpIeData['msgName'] = currentMsg |
| 65 | |
| 66 | elif mGroupedIeDefEnd: |
| 67 | state = 'EndDetected' |
| 68 | grpIeData = {} |
| 69 | ieList = [] |
| 70 | grpIeList=[] |
| 71 | ieDetailsList = [] |
| 72 | |
| 73 | GenerateGrpIeClass.generateGroupedIeClasses(data) |
| 74 | GenerateGrpIeClass.prepareGrpIeMakeFile() |
| 75 | |
| 76 | |
| 77 | elif state == 'StartDetected': |
| 78 | state = 'IeListStart' |
| 79 | |
| 80 | elif state == 'IeListStart': |
| 81 | |
| 82 | if xlUtils.getCellValue(sheet,i,'D') != None: |
| 83 | ieData = {} |
| 84 | ieDescription = xlUtils.getCellValue(sheet,i,'D') |
| 85 | ieData['ieDescription'] = xlUtils.getCellValue(sheet,i,'D') |
| 86 | ieData['presence'] = xlUtils.getCellValue(sheet,i,'E') |
| 87 | ieData['grouped'] = xlUtils.getCellValue(sheet,i,'B') |
| 88 | ieData['cardinality'] = xlUtils.getCellValue(sheet,i,'C') |
| 89 | ieData['instance'] = xlUtils.getCellValue(sheet,i,'H') |
| 90 | |
| 91 | if ieData['cardinality'] == None: |
| 92 | ieData['cardinality'] = 1 |
| 93 | ieTypeDescription = xlUtils.getCellValue(sheet,i,'G') |
| 94 | ieData['ieTypeDescription'] = ieTypeDescription |
| 95 | |
| 96 | ieVarName = xlUtils.getVarNameFromString(ieDescription,0) |
| 97 | |
| 98 | ieTypeName = xlUtils.getVarNameFromString(ieTypeDescription,1) |
| 99 | |
| 100 | if ieData['grouped'] == 'Yes': |
| 101 | ieData['ieGroupTypeName'] = ieVarName.capitalize() + 'In' + currentMsg |
| 102 | |
| 103 | ieData['ieVarName'] = ieVarName |
| 104 | ieData['ieTypeName'] = ieTypeName |
| 105 | |
| 106 | |
| 107 | ieList.append(ieVarName) |
| 108 | grpIeData['ieList'] = ieList |
| 109 | grpIeData['ieDetails'] = {} |
| 110 | grpIeData['ieDetails'][ieVarName] = ieData |
| 111 | ieDetailsList.append(grpIeData['ieDetails']) |
| 112 | grpIeData['ieDetails'] = ieDetailsList |
| 113 | |
| 114 | |
| 115 | def generateGroupedIeClasses(data): |
| 116 | parsedData = data |
| 117 | |
| 118 | for grpIe in parsedData['grpIeList']: |
| 119 | |
| 120 | grpIeDetails = parsedData['grpIeDetails'][grpIe] |
| 121 | |
| 122 | GenerateGrpIeClass.generateGroupedIeClass(grpIeDetails,grpIe) |
| 123 | GenerateGrpIeClass.generateGroupedIeDataType(grpIeDetails, grpIe) |
| 124 | def generateGroupedIeClass(grpIeDetails,grpIe): |
| 125 | |
| 126 | templateData['fileName'] = grpIe[0].lower()+grpIe[1:] + 'Ie' |
| 127 | templateData['className'] = grpIe + 'Ie' |
| 128 | templateData['classNameUC'] = templateData['fileName'].upper() |
| 129 | fileName=templateData['fileName'] |
| 130 | |
| 131 | for inst in grpIeDetails['instList']: |
| 132 | instanceInfo = {} |
| 133 | instDetails = grpIeDetails[inst] |
| 134 | GenerateGrpIeClass.generateGroupedIeInstanceClass(instDetails, inst) |
| 135 | |
| 136 | instanceInfo['className'] = inst |
| 137 | instanceInfo['fileName'] = inst[0].lower()+inst[1:] |
| 138 | instanceInfo['msgType'] = instDetails['msgName'] + 'MsgType' |
| 139 | instanceInfo['instance'] = instDetails['instance'] |
| 140 | |
| 141 | if instanceInfo not in templateData['instList']: |
| 142 | templateData['instList'].append(instanceInfo) |
| 143 | |
| 144 | templateData[fileName]=[inst for inst in templateData['instList'] if grpIe in inst['className']] |
| 145 | |
| 146 | outputDir = '../../src/gtpV2Codec/ieClasses' |
| 147 | ttFileNameCpp = 'tts/grpietemplate.cpp.tt' |
| 148 | ttFileNameH = 'tts/grpietemplate.h.tt' |
| 149 | xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir) |
| 150 | |
| 151 | objectfile ='ieClasses/' + templateData['fileName'] + '.o' |
| 152 | sourcefile = 'ieClasses/' + templateData['fileName'] + '.cpp' |
| 153 | xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile) |
| 154 | |
| 155 | def generateGroupedIeDataType(grpIeDetails, grpIe): |
| 156 | grpIeInfo={} |
| 157 | |
| 158 | grpIeInfo['iePresenceList']=[] |
| 159 | grpIeTypeInfo={} |
| 160 | grpIeTypeInfo['grpIeTypeName']=grpIe + 'IeType' |
| 161 | grpIeTypeInfo['grpIeTypeValue']=grpIeDetails['ieTypeValue'] |
| 162 | if grpIeTypeInfo not in grpIeDataTypeData['grpTypeList']: |
| 163 | grpIeDataTypeData['grpTypeList'].append(grpIeTypeInfo) |
| 164 | |
| 165 | for inst in grpIeDetails['instList']: |
| 166 | |
| 167 | instDetails = grpIeDetails[inst] |
| 168 | grpIeInfo={} |
| 169 | grpIeInfo['iePresenceList']=[] |
| 170 | grpIeInfo['grpIeName']= inst+'Data' |
| 171 | grpIeInfo['ieList']=[] |
| 172 | for ieDict in instDetails['ieDetails']: |
| 173 | for ieDetails in ieDict: |
| 174 | if ieDict[ieDetails]['presence']!='M': |
| 175 | grpIeInfo['iePresenceList'].append(ieDict[ieDetails]['ieVarName']+'IePresent') |
| 176 | ieInfo={} |
| 177 | ieInfo['ieTypeName']=ieDict[ieDetails]['ieTypeName']+'IeData' |
| 178 | ieInfo['ieVarName']=ieDict[ieDetails]['ieVarName'] |
| 179 | grpIeInfo['ieList'].append(ieInfo) |
| 180 | |
| 181 | if grpIeInfo not in grpIeDataTypeData['grpList']: |
| 182 | grpIeDataTypeData['grpList'].append(grpIeInfo) |
| 183 | template = Template() |
| 184 | ttFileNamefactoryH = 'tts/grpIeDataTypetemplate.h.tt' |
| 185 | outputDir = '../../src/gtpV2Codec/ieClasses/' |
| 186 | |
| 187 | if not os.path.exists(outputDir): |
| 188 | os.makedirs(outputDir) |
| 189 | outputFileName = 'gtpV2GrpIeDataTypes.h' |
| 190 | template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir}) |
| 191 | template.process(ttFileNamefactoryH, {'tempdata' : grpIeDataTypeData}) |
| 192 | |
| 193 | def generateGroupedIeInstanceClass(instDetails, inst): |
| 194 | templateInstData = {} |
| 195 | ieTypeList = [] |
| 196 | ieTypeDetailsList = [] |
| 197 | |
| 198 | ieInfoList =[] |
| 199 | |
| 200 | templateInstData['fileName'] = inst[0].lower()+inst[1:] |
| 201 | |
| 202 | templateInstData['msgClassName'] = inst |
| 203 | templateInstData['classNameUC'] = templateInstData['fileName'].upper() |
| 204 | |
| 205 | for ieEntry in instDetails['ieList']: |
| 206 | |
| 207 | ieInfo = {} |
| 208 | ieTypeInfo = {} |
| 209 | |
| 210 | ies = instDetails['ieDetails'] |
| 211 | for x in ies: |
| 212 | |
| 213 | ie = x.get(ieEntry) |
| 214 | |
| 215 | if ie != None and ieEntry == ie.get('ieVarName'): |
| 216 | ieInfo['ieName'] = ie['ieVarName'] |
| 217 | ieInfo['ieVarName'] = ie['ieVarName'] |
| 218 | ieInfo['ieType'] = ie['ieTypeName'] |
| 219 | ieInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie' |
| 220 | ieInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] |
| 221 | ieInfo['iePresence'] = ie['presence'] |
| 222 | ieInfo['ieCardinality'] = ie['cardinality'] |
| 223 | ieInfo['instance'] = ie['instance'] |
| 224 | ieInfo['grouped'] = ie['grouped'] |
| 225 | |
| 226 | ieType = ieInfo['ieType'] |
| 227 | |
| 228 | ieTypeInfo['ieName'] = ie['ieVarName'] |
| 229 | ieTypeInfo['ieVarName'] = ie['ieVarName'] |
| 230 | ieTypeInfo['ieType'] = ie['ieTypeName'] |
| 231 | ieTypeInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie' |
| 232 | ieTypeInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] |
| 233 | ieTypeInfo['iePresence'] = ie['presence'] |
| 234 | ieTypeInfo['ieCardinality'] = ie['cardinality'] |
| 235 | ieTypeInfo['instance'] = ie['instance'] |
| 236 | ieTypeInfo['grouped'] = ie['grouped'] |
| 237 | |
| 238 | if ieInfo['ieType'] not in ieTypeList: |
| 239 | ieTypeList.append(ieInfo['ieType']) |
| 240 | templateInstData['ieTypeList'] = ieTypeList |
| 241 | |
| 242 | if ieInfo not in ieInfoList: |
| 243 | |
| 244 | ieInfoList.append(ieInfo) |
| 245 | templateInstData['ieList'] = ieInfoList |
| 246 | |
| 247 | templateInstData['ieTypeDetails'] = {} |
| 248 | templateInstData['ieTypeDetails'][ieType] = [] |
| 249 | if ieTypeInfo not in templateInstData['ieTypeDetails'][ieType]: |
| 250 | templateInstData['ieTypeDetails'][ieType].append(ieTypeInfo) |
| 251 | ieTypeDetailsList.append(templateInstData['ieTypeDetails']) |
| 252 | templateInstData['ieTypeDetails'] = ieTypeDetailsList |
| 253 | |
| 254 | GenerateGrpIeClass.templateInstanceprocess(templateInstData) |
| 255 | outputDirCpp = 'ieClasses/' |
| 256 | objectfile = outputDirCpp +templateInstData['fileName'] + '.o' |
| 257 | sourcefile = outputDirCpp + templateInstData['fileName'] + '.cpp' |
| 258 | xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile) |
| 259 | |
| 260 | def templateInstanceprocess(templateInstData): |
| 261 | |
| 262 | ttFileNameInstCpp = 'tts/grpieinsttemplate.cpp.tt' |
| 263 | outputDir = '../../src/gtpV2Codec/ieClasses' |
| 264 | ttFileNameInstH = 'tts/grpieinsttemplate.h.tt' |
| 265 | xlUtils.templateProcess(templateInstData,ttFileNameInstCpp,ttFileNameInstH,outputDir,outputDir) |
| 266 | |
| 267 | def prepareGrpIeMakeFile(): |
| 268 | outputDirCpp = 'ieClasses/manual/' |
| 269 | xlUtils.addToMakeSo("gtpV2Stack.so", outputDirCpp+'gtpV2GroupedIe.o',outputDirCpp+'gtpV2GroupedIe.cpp') |
| 270 | |
| 271 | GenerateGrpIeClass() |