#!/usr/bin/env python

import sys
from optparse import OptionParser
#  this requires pyxml
from _xmlplus.parsers.xmlproc import xmlapp, xmlval, utils

class CmdOpts(object):
    usage="""%prog xmlFile

    Validate DAS XML output.  Currently just validates XML against DTD."""

    def __init__(self):
        parser = OptionParser(usage=CmdOpts.usage)
        (opts, args) = parser.parse_args()
        if len(args) != 1:
            parser.error("wrong number of arguments")
        self.xmlFile = args[0]
        self.__dict__.update(opts.__dict__)

class ErrorHandler(xmlapp.ErrorHandler):
    def __init__(self, locator):
        self.locator = locator
        self.warnCnt = 0
        self.errorCnt = 0

    def __getLocation(self):
        return "%s:%d:%d" % (self.locator.get_current_sysid(),
                             self.locator.get_line(),
                             self.locator.get_column())

    def __printError(self, what, msg):
        sys.stderr.write(what + ": " + msg + ": " + self.__getLocation() + "\n")

    def warning(self, msg):
        "Handles a non-fatal error message."
        self.__printError("Warning", msg)
        self.warnCnt += 1

    def error(self, msg):
        self.__printError("Error", msg)
        self.errorCnt += 1

    def fatal(self, msg):
        "Handles a fatal error message."
        self.error(msg)
        raise utils.XMLParseException("Fatal XML parse error, stopping")

    def report(self):
        "print count and exit if warnings or errors"
        if (self.warnCnt > 0) or (self.errorCnt > 0): 
            sys.write("Errors: " + str(self.errorCnt) + " Warnings: " + str(self.warnCnt) + "\n")
            sys.exit(1)
           
        

opts = CmdOpts()
parser = xmlval.XMLValidator()
errorHandler = ErrorHandler(parser)
parser.set_error_handler(errorHandler)
parser.parse_resource(opts.xmlFile)
errorHandler.report()
