minixsv/xsvalErrorHandler.py
changeset 0 b622defdfd98
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/minixsv/xsvalErrorHandler.py	Wed Jan 31 16:31:39 2007 +0100
@@ -0,0 +1,161 @@
+#
+# minixsv, Release 0.3
+# file: xsvalErrorHandler.py
+#
+# XML schema validator classes
+#
+# history:
+# 2004-09-23 rl   created
+#
+# Copyright (c) 2004 by Roland Leuthe.  All rights reserved.
+#
+# --------------------------------------------------------------------
+# The minixsv XML schema validator is
+#
+# Copyright (c) 2004 by Roland Leuthe
+#
+# By obtaining, using, and/or copying this software and/or its
+# associated documentation, you agree that you have read, understood,
+# and will comply with the following terms and conditions:
+#
+# Permission to use, copy, modify, and distribute this software and
+# its associated documentation for any purpose and without fee is
+# hereby granted, provided that the above copyright notice appears in
+# all copies, and that both that copyright notice and this permission
+# notice appear in supporting documentation, and that the name of
+# the author not be used in advertising or publicity
+# pertaining to distribution of the software without specific, written
+# prior permission.
+#
+# THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
+# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
+# ABILITY AND FITNESS.  IN NO EVENT SHALL THE AUTHOR
+# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+# OF THIS SOFTWARE.
+# --------------------------------------------------------------------
+
+import string
+import os
+
+IGNORE_WARNINGS   = 0
+PRINT_WARNINGS    = 1
+STOP_ON_WARNINGS  = 2
+
+
+########################################
+# Error-Handler class for XML schema validator
+# handles only validator errors, no parser errors!
+
+class ErrorHandler:
+
+    def __init__(self, errorLimit, warningProc, verbose):
+        self.errorLimit  = errorLimit
+        self.warningProc = warningProc
+        self.verbose     = verbose
+        
+        self.errorList = []
+        self.noOfErrors = 0
+        self.warningList = []
+
+        
+    ########################################
+    # add error to errorList (raise exception only if error limit is reached)
+
+    def addError (self, errstr, element=None, endTag=0):
+        filePath = ""
+        lineNo = 0
+        if element:
+            filePath = element.getFilePath()
+            if endTag:
+                lineNo = element.getEndLineNumber()
+            else:
+                lineNo = element.getStartLineNumber()
+        self.errorList.append ((filePath, lineNo, "ERROR", "%s" %(errstr)))
+        self.noOfErrors += 1
+        if self.noOfErrors == self.errorLimit:
+            self._raiseXsvalException ("\nError Limit reached!!")
+
+
+    ########################################
+    # add warning to warningList
+
+    def addWarning (self, warnstr, element=None):
+        filePath = ""
+        lineNo = 0
+        if element:
+            filePath = element.getFilePath()
+            lineNo = element.getStartLineNumber()
+        self.warningList.append ((filePath, lineNo, "WARNING", warnstr))
+
+
+    ########################################
+    # add info string to errorList
+
+    def addInfo (self, infostr, element=None):
+        filePath = ""
+        lineNo = 0
+        if element:
+            filePath = element.getFilePath()
+            lineNo = element.getStartLineNumber()
+        self.errorList.append ((filePath, lineNo, "INFO", infostr))
+
+
+    ########################################
+    # add error to errorList (if given) and raise exception
+
+    def raiseError (self, errstr, element=None):
+        self.addError (errstr, element)
+        self._raiseXsvalException ()
+
+
+    ########################################
+    # raise exception with complete errorList as exception string
+    # (only if errors occurred)
+
+    def flushOutput (self):
+        if self.warningProc == PRINT_WARNINGS and self.warningList != []:
+            print self._assembleSortedOutputList(self.warningList)
+            self.warningList = []
+        elif self.warningProc == STOP_ON_WARNINGS:
+            self.errorList.extend (self.warningList)
+
+        if self.errorList != []:
+            self._raiseXsvalException ()
+
+
+    ########################################
+    # Private methods
+
+    def _raiseXsvalException (self, additionalInfo=""):
+        output = self._assembleSortedOutputList(self.errorList) + additionalInfo
+        self.errorList = self.warningList = []
+        raise XsvalError (output)
+
+
+    def _assembleSortedOutputList (self, outputList):
+        outputList.sort()
+        outputStrList = []
+        for outElement in outputList:
+            outputStrList.append (self._assembleOutString(outElement))
+        return string.join (outputStrList, "\n")
+        
+        
+    def _assembleOutString (self, listElement):
+        fileStr = ""
+        lineStr = ""
+        if listElement[0] != "":
+            if self.verbose:
+                fileStr = "%s: " %(listElement[0])
+            else:
+                fileStr = "%s: " %(os.path.basename(listElement[0]))
+        if listElement[1] != 0:
+            lineStr = "line %d: " %(listElement[1])
+        return "%s: %s%s%s" %(listElement[2], fileStr, lineStr, listElement[3])
+    
+
+class XsvalError (StandardError):
+    pass
+