# /usr/bin/env python
'''
Created on 07-Jan-2013
Copyright 2013 Open Networking Foundation (ONF)

Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>

@author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.


'''

import xmldict
import re

class xmlparser:

    def __init__( self ):
        self.default = ''

    def parse( self, fileName ):
        '''
         This will parse the params or topo or cfg file and return content in the file as Dictionary
        '''
        self.fileName = fileName
        matchFileName = re.match( r'(.*)\.(params|topo|cfg)', self.fileName, re.M | re.I )
        if matchFileName:
            xml = open( fileName ).read()
            try:
                parsedInfo = xmldict.xml_to_dict( xml )
                return parsedInfo
            except StandardError as e:
                print "Error parsing file " + fileName + ": " + e.message
        else:
            print "File name is not correct"

    def parseParams( self, paramsPath ):
        '''
         It will take the params file path and will return the params dictionary
        '''
        paramsPath = re.sub( "\.", "/", paramsPath )
        paramsPath = re.sub( "tests|examples", "", paramsPath )
        params = self.parse( main.tests_path + paramsPath + ".params" )
        paramsAsString = str( params )
        return eval( paramsAsString )

    def parseTopology( self, topologyPath ):
        '''
          It will take topology file path and will return topology dictionary
        '''
        topologyPath = re.sub( "\.", "/", topologyPath )
        topologyPath = re.sub( "tests|examples", "", topologyPath )
        topology = self.parse( main.tests_path + topologyPath + ".topo" )
        topoAsString = str( topology )
        return eval( topoAsString )

