Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / cssutils / errorhandler.py @ 475

History | View | Annotate | Download (3.74 KB)

1
#!/usr/bin/env python
2
"""cssutils ErrorHandler
3

4
ErrorHandler
5
    used as log with usual levels (debug, info, warn, error)
6

7
    if instanciated with ``raiseExceptions=True`` raises exeptions instead
8
    of logging
9

10
log
11
    defaults to instance of ErrorHandler for any kind of log message from
12
    lexerm, parser etc.
13

14
    - raiseExceptions = [False, True]
15
    - setloglevel(loglevel)
16
"""
17
__all__ = ['ErrorHandler']
18
__docformat__ = 'restructuredtext'
19
__version__ = '$Id$'
20

    
21
import logging
22
import urllib2
23
import xml.dom
24

    
25
class _ErrorHandler(object):
26
    """
27
    handles all errors and log messages
28
    """
29
    def __init__(self, log, defaultloglevel=logging.INFO, 
30
                 raiseExceptions=True):
31
        """
32
        inits log if none given
33

34
        log
35
            for parse messages, default logs to sys.stderr
36
        defaultloglevel
37
            if none give this is logging.DEBUG
38
        raiseExceptions
39
            - True: Errors will be raised e.g. during building
40
            - False: Errors will be written to the log, this is the
41
              default behaviour when parsing
42
        """
43
        # may be disabled during setting of known valid items
44
        self.enabled = True
45
        
46
        if log:
47
            self._log = log
48
        else:
49
            import sys
50
            self._log = logging.getLogger('CSSUTILS')
51
            hdlr = logging.StreamHandler(sys.stderr)
52
            formatter = logging.Formatter('%(levelname)s\t%(message)s')
53
            hdlr.setFormatter(formatter)
54
            self._log.addHandler(hdlr)
55
            self._log.setLevel(defaultloglevel)
56
            
57
        self.raiseExceptions = raiseExceptions
58

    
59
    def __getattr__(self, name):
60
        "use self._log items"
61
        calls = ('debug', 'info', 'warn', 'error', 'critical', 'fatal')
62
        other = ('setLevel', 'getEffectiveLevel', 'addHandler', 'removeHandler')
63

    
64
        if name in calls:
65
            self._logcall = getattr(self._log, name)
66
            return self.__handle
67
        elif name in other:
68
            return getattr(self._log, name)
69
        else:
70
            raise AttributeError(
71
                '(errorhandler) No Attribute %r found' % name)
72

    
73
    def __handle(self, msg=u'', token=None, error=xml.dom.SyntaxErr,
74
                 neverraise=False, args=None):
75
        """
76
        handles all calls
77
        logs or raises exception
78
        """
79
        if self.enabled:
80
            if error is None:
81
                error = xml.dom.SyntaxErr
82
            
83
            line, col = None, None
84
            if token:
85
                if isinstance(token, tuple):
86
                    value, line, col = token[1], token[2], token[3]
87
                else:
88
                    value, line, col = token.value, token.line, token.col
89
                msg = u'%s [%s:%s: %s]' % (
90
                    msg, line, col, value)
91
    
92
            if error and self.raiseExceptions and not neverraise:
93
                if isinstance(error, urllib2.HTTPError) or isinstance(error, urllib2.URLError):
94
                    raise
95
                elif issubclass(error, xml.dom.DOMException): 
96
                    error.line = line
97
                    error.col = col
98
                raise error(msg)
99
            else:
100
                self._logcall(msg)
101

    
102
    def setLog(self, log):
103
        """set log of errorhandler's log"""
104
        self._log = log
105

    
106

    
107
class ErrorHandler(_ErrorHandler):
108
    "Singleton, see _ErrorHandler"
109
    instance = None
110

    
111
    def __init__(self,
112
            log=None, defaultloglevel=logging.INFO, raiseExceptions=True):
113

    
114
        if ErrorHandler.instance is None:
115
            ErrorHandler.instance = _ErrorHandler(log=log,
116
                                        defaultloglevel=defaultloglevel,
117
                                        raiseExceptions=raiseExceptions)
118
        self.__dict__ = ErrorHandler.instance.__dict__