# /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 Exception 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" )
        topology = self.parse( main.tests_path + topologyPath + ".topo" )
        topoAsString = str( topology )
        return eval( topoAsString )
