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 | |
| 7 | import os |
| 8 | from template import Template |
| 9 | |
| 10 | |
| 11 | from xlUtils import xlUtils,wb |
| 12 | msgFactoryData = {} |
| 13 | msgFactoryData['msgList'] = [] |
| 14 | msgDataTypeData = {} |
| 15 | msgDataTypeData['msgTypeList'] = [] |
| 16 | msgDataTypeData['msgList'] = [] |
| 17 | class GenerateMsgClass(): |
| 18 | def __init__( self ): |
| 19 | self.msgParser() |
| 20 | |
| 21 | def msgParser(self): |
| 22 | |
| 23 | sheet = wb['Message Modeling'] |
| 24 | state = '' |
| 25 | ieDetailList = [] |
| 26 | ieList = [] |
| 27 | |
| 28 | currentMessage = '' |
| 29 | msgValue = 0 |
| 30 | msgData = {} |
| 31 | |
| 32 | |
| 33 | for i in range(1,sheet.max_row+1): |
| 34 | |
| 35 | cell_value_B = xlUtils.getCellValue(sheet,i,'B') |
| 36 | |
| 37 | mMsgDefinitionStart = re.search('Message Definition Start:(\w+):(\d+)',str(cell_value_B)) |
| 38 | mMsgDefinitionEnd = re.search('Message Definition End:(\w+)',str(cell_value_B)) |
| 39 | mResponseMsg = re.search('ResponseMessage',str(cell_value_B)) |
| 40 | mGrouped = re.search('Grouped',str(cell_value_B)) |
| 41 | |
| 42 | |
| 43 | if mMsgDefinitionStart: |
| 44 | |
| 45 | |
| 46 | state = 'StartDetected' |
| 47 | currentMessage = mMsgDefinitionStart.group(1) |
| 48 | msgValue = mMsgDefinitionStart.group(2) |
| 49 | |
| 50 | |
| 51 | if mMsgDefinitionEnd: |
| 52 | |
| 53 | ieList = [] |
| 54 | ieDetailList = [] |
| 55 | state = 'EndDetected' |
| 56 | |
| 57 | GenerateMsgClass.templateIes(msgData,currentMessage) |
| 58 | GenerateMsgClass.generateMsgFactory(msgData,currentMessage) |
| 59 | GenerateMsgClass.generateMsgDataType(msgData,currentMessage) |
| 60 | GenerateMsgClass.prepareMsgMakeFile() |
| 61 | |
| 62 | elif state == 'StartDetected': |
| 63 | |
| 64 | msgData['msgDetails'] = {} |
| 65 | msgData['msgDetails'][currentMessage] = {} |
| 66 | msgData['msgDetails'][currentMessage]['msgValue'] = msgValue |
| 67 | msgData['msgDetails'][currentMessage]['msgDataType'] = currentMessage + 'MsgData' |
| 68 | msgData['msgDetails'][currentMessage]['msgCategory'] = "RequestMessage" |
| 69 | if mResponseMsg: |
| 70 | |
| 71 | msgData['msgDetails'][currentMessage]['msgCategory'] = "ResponseMessage" |
| 72 | elif mGrouped: |
| 73 | state = 'IeListStart' |
| 74 | |
| 75 | |
| 76 | |
| 77 | elif state == 'IeListStart': |
| 78 | |
| 79 | if xlUtils.getCellValue(sheet,i,'D') != None: |
| 80 | |
| 81 | ieDescription = xlUtils.getCellValue(sheet,i,'D') |
| 82 | presence = xlUtils.getCellValue(sheet,i,'E') |
| 83 | grouped = xlUtils.getCellValue(sheet,i,'B') |
| 84 | cardinality = xlUtils.getCellValue(sheet,i,'C') |
| 85 | instance = xlUtils.getCellValue(sheet,i,'H') |
| 86 | msgData['ieDetails'] = {} |
| 87 | msgData['ieDetails'][ieDescription] = {} |
| 88 | msgData['ieDetails'][ieDescription]['ieDescription'] = ieDescription |
| 89 | msgData['ieDetails'][ieDescription]['presence'] = presence |
| 90 | msgData['ieDetails'][ieDescription]['grouped'] = grouped |
| 91 | msgData['ieDetails'][ieDescription]['cardinality'] = cardinality |
| 92 | msgData['ieDetails'][ieDescription]['instance'] = instance |
| 93 | |
| 94 | if msgData['ieDetails'][ieDescription]['cardinality'] is None: |
| 95 | msgData['ieDetails'][ieDescription]['cardinality'] = 1 |
| 96 | ieTypeDescription = xlUtils.getCellValue(sheet,i,'G') |
| 97 | msgData['ieDetails'][ieDescription]['ieTypeDescription'] = ieTypeDescription |
| 98 | |
| 99 | ieVarName = xlUtils.getVarNameFromString(ieDescription,0) |
| 100 | ieTypeName = xlUtils.getVarNameFromString(ieTypeDescription,1) |
| 101 | ieVarName = ieVarName.replace('/','') |
| 102 | |
| 103 | msgData['ieDetails'][ieDescription]['ieGroupTypeName'] = '' |
| 104 | if msgData['ieDetails'][ieDescription]['grouped'] == 'Yes': |
| 105 | msgData['ieDetails'][ieDescription]['ieGroupTypeName'] = ieVarName + 'In' + currentMessage |
| 106 | msgData['ieDetails'][ieDescription]['ieVarName'] = ieVarName |
| 107 | msgData['ieDetails'][ieDescription]['ieTypeName'] = ieTypeName |
| 108 | |
| 109 | if ieVarName!="privateExtension": |
| 110 | ieDetailList.append(msgData['ieDetails']) |
| 111 | |
| 112 | ieList.append(ieVarName) |
| 113 | msgData['ieList'] = ieList |
| 114 | msgData['ieDetails'] = ieDetailList |
| 115 | |
| 116 | return msgData |
| 117 | |
| 118 | |
| 119 | def templateIes(msgData,currentMessage): |
| 120 | templateData = dict() |
| 121 | ieListTemplate = [] |
| 122 | ieTypeTemplate = [] |
| 123 | ieTypeDetailList = [] |
| 124 | ieTypeList = [] |
| 125 | templateData['fileName'] = currentMessage[0].lower()+currentMessage[1:] + 'Msg' |
| 126 | templateData['msgClassName'] = currentMessage[0].upper()+currentMessage[1:] + 'Msg' |
| 127 | templateData['classNameUC'] = templateData['fileName'].upper() |
| 128 | templateData['msgCategory'] = msgData['msgDetails'][currentMessage]['msgCategory'] |
| 129 | |
| 130 | for ieDetail in msgData['ieDetails']: |
| 131 | for key,value in ieDetail.items(): |
| 132 | for ie in msgData['ieList']: |
| 133 | ieInfo = {} |
| 134 | ieTypeInfo = {} |
| 135 | if value['ieVarName'] == ie: |
| 136 | |
| 137 | ieInfo['ieName'] = value['ieVarName'] |
| 138 | ieInfo['ieVarName'] = value['ieVarName'] |
| 139 | ieInfo['ieType'] = value['ieTypeName'] |
| 140 | ieInfo['ieFileName'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] + 'Ie' |
| 141 | ieInfo['ieLocalVar'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] |
| 142 | ieInfo['iePresence'] = value['presence'] |
| 143 | ieInfo['ieCardinality'] = value['cardinality'] |
| 144 | ieInfo['instance'] = value['instance'] |
| 145 | ieInfo['grouped'] = value['grouped'] |
| 146 | ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'] |
| 147 | if ieInfo['grouped']=='Yes': |
| 148 | ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:] |
| 149 | ieInfo['grpIeInstFileName'] = value['ieGroupTypeName'] |
| 150 | |
| 151 | ieType = ieInfo['ieType'] |
| 152 | ieTypeInfo['ieName'] = value['ieVarName'] |
| 153 | ieTypeInfo['ieVarName'] = value['ieVarName'] |
| 154 | ieTypeInfo['ieType'] = value['ieTypeName'] |
| 155 | ieTypeInfo['ieFileName'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] + 'Ie' |
| 156 | ieTypeInfo['ieLocalVar'] = value['ieTypeName'].capitalize() |
| 157 | ieTypeInfo['iePresence'] = value['presence'] |
| 158 | ieTypeInfo['ieCardinality'] = value['cardinality'] |
| 159 | ieTypeInfo['instance'] = value['instance'] |
| 160 | ieTypeInfo['grouped'] = value['grouped'] |
| 161 | ieTypeInfo['grpIeInstClassName'] = value['ieGroupTypeName'] |
| 162 | if ieTypeInfo['grouped']=='Yes': |
| 163 | ieTypeInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:] |
| 164 | ieTypeInfo['grpIeInstFileName'] = value['ieGroupTypeName'].capitalize() |
| 165 | |
| 166 | |
| 167 | ieListTemplate.append(ieInfo) |
| 168 | templateData['ieList'] = ieListTemplate |
| 169 | |
| 170 | if ieInfo['ieType'] not in ieTypeList: |
| 171 | ieTypeList.append(ieInfo['ieType']) |
| 172 | templateData['ieTypeList'] = ieTypeList |
| 173 | |
| 174 | ieTypeTemplate = [] |
| 175 | ieTypeTemplate.append(ieTypeInfo) |
| 176 | templateData['ieTypeDetails'] = {} |
| 177 | templateData['ieTypeDetails'][ieType] = ieTypeTemplate |
| 178 | |
| 179 | ieTypeDetailList.append(templateData['ieTypeDetails']) |
| 180 | templateData['ieTypeDetails'] = ieTypeDetailList |
| 181 | |
| 182 | outputDir = '../../src/gtpV2Codec/msgClasses' |
| 183 | ttFileNameCpp = 'tts/msgtemplate.cpp.tt' |
| 184 | ttFileNameH = 'tts/msgtemplate.h.tt' |
| 185 | xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir) |
| 186 | |
| 187 | objectFile = 'msgClasses/' +templateData['fileName'] + '.o' |
| 188 | sourceFile = 'msgClasses/' + templateData['fileName'] + '.cpp' |
| 189 | xlUtils.addToMakeSo('gtpV2Stack.so',objectFile,sourceFile) |
| 190 | |
| 191 | def generateMsgFactory(msgData,currentMessage): |
| 192 | msgInfo = {} |
| 193 | |
| 194 | msgInfo['className'] = currentMessage + 'Msg' |
| 195 | msgInfo['msgFileName'] = currentMessage[0].lower()+currentMessage[1:] + 'Msg' |
| 196 | msgInfo['dataMember'] = currentMessage[0].lower()+currentMessage[1:] + 'StackData' |
| 197 | if msgInfo not in msgFactoryData['msgList']: |
| 198 | msgFactoryData['msgList'].append(msgInfo) |
| 199 | outputDirCpp = 'msgClasses/' |
| 200 | GenerateMsgClass.msgfactoryStacktemplate(msgFactoryData) |
| 201 | xlUtils.addToMakeSo('gtpV2Stack.so',outputDirCpp+'gtpV2MsgFactory.o',outputDirCpp+'gtpV2MsgFactory.cpp') |
| 202 | xlUtils.addToMakeSo('gtpV2Stack.so','gtpV2Stack.o','gtpV2Stack.cpp') |
| 203 | |
| 204 | def msgfactoryStacktemplate(msgFactoryData): |
| 205 | |
| 206 | ttFileNamefactoryCpp = 'tts/msgfactorytemplate.cpp.tt' |
| 207 | outputDir = '../../src/gtpV2Codec/msgClasses' |
| 208 | msgFactoryData['fileName'] = 'gtpV2MsgFactory' |
| 209 | ttFileNamefactoryH = 'tts/msgfactorytemplate.h.tt' |
| 210 | xlUtils.templateProcess(msgFactoryData,ttFileNamefactoryCpp,ttFileNamefactoryH,outputDir,outputDir) |
| 211 | |
| 212 | ttFileNameStackCpp = 'tts/stacktemplate.cpp.tt' |
| 213 | outputDir = '../../src/gtpV2Codec/' |
| 214 | msgFactoryData['fileName'] = 'gtpV2Stack' |
| 215 | ttFileNameStackH = 'tts/stacktemplate.h.tt' |
| 216 | |
| 217 | xlUtils.templateProcess(msgFactoryData,ttFileNameStackCpp,ttFileNameStackH,outputDir,outputDir) |
| 218 | |
| 219 | |
| 220 | |
| 221 | def prepareMsgMakeFile(): |
| 222 | outputDir = 'msgClasses/manual/' |
| 223 | xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'gtpV2Message.o', outputDir+'gtpV2Message.cpp') |
| 224 | def generateMsgDataType(msgData,currentMessage): |
| 225 | msginfo = {} |
| 226 | msgTypeInfo={} |
| 227 | msginfo['msgDataName'] = currentMessage + 'MsgData' |
| 228 | msginfo['ieDetails']=[] |
| 229 | msgTypeInfo['msgDataType']=currentMessage + 'MsgType' |
| 230 | msgTypeInfo['msgValue']=msgData['msgDetails'][currentMessage]['msgValue'] |
| 231 | |
| 232 | if msgTypeInfo not in msgDataTypeData['msgTypeList']: |
| 233 | msgDataTypeData['msgTypeList'].append(msgTypeInfo) |
| 234 | |
| 235 | for ieDetail in msgData['ieDetails']: |
| 236 | for key,value in ieDetail.items(): |
| 237 | for ie in msgData['ieList']: |
| 238 | ieInfo = {} |
| 239 | |
| 240 | if value['ieVarName'] == ie: |
| 241 | ieInfo['ieName'] = value['ieVarName'] |
| 242 | ieInfo['ieVarName'] = value['ieVarName'] |
| 243 | ieInfo['ieType'] = value['ieTypeName'] |
| 244 | ieInfo['iePresence'] = value['presence'] |
| 245 | ieInfo['ieCardinality'] = value['cardinality'] |
| 246 | ieInfo['grouped'] = value['grouped'] |
| 247 | ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'] |
| 248 | if ieInfo['grouped']=='Yes': |
| 249 | ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:] |
| 250 | ieInfo['grpIeInstFileName'] = value['ieGroupTypeName'] |
| 251 | if ieInfo not in msginfo['ieDetails']: |
| 252 | msginfo['ieDetails'].append(ieInfo) |
| 253 | if msginfo not in msgDataTypeData['msgList']: |
| 254 | msgDataTypeData['msgList'].append(msginfo) |
| 255 | |
| 256 | template = Template() |
| 257 | ttFileNamefactoryH = 'tts/msgDataTypetemplate.h.tt' |
| 258 | outputDir = '../../src/gtpV2Codec/msgClasses' |
| 259 | |
| 260 | if not os.path.exists(outputDir): |
| 261 | os.makedirs(outputDir) |
| 262 | outputFileName = 'gtpV2MsgDataTypes.h' |
| 263 | template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir}) |
| 264 | template.process(ttFileNamefactoryH, {'tempdata' : msgDataTypeData}) |
| 265 | |
| 266 | |
| 267 | GenerateMsgClass() |