MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/scripts/GtpV2StackCodeGen/msgCodeGen.py b/scripts/GtpV2StackCodeGen/msgCodeGen.py
new file mode 100644
index 0000000..cfa7281
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/msgCodeGen.py
@@ -0,0 +1,267 @@
+# 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()
\ No newline at end of file