configurationengine/source/cone/public/parsecontext.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     1
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     3
# All rights reserved.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     4
# This component and the accompanying materials are made available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     6
# which accompanies this distribution, and is available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     8
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     9
# Initial Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    11
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    12
# Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    13
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    14
# Description: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    15
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    16
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    17
import threading
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
import logging
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    19
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
import cone.public.utils
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
class ParseContext(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
    Parse context class for handling exceptions and problems encountered
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
    when parsing a file (ConfML, ImplML or anything included from those).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
    The context contains the path to the file that is currently being parsed,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    28
    but the file path can also be overridden when calling a handler method
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    29
    (e.g. an ImplML file includes some other file, which in contains a problem).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    30
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    31
    Sub-classes should override _handle_exception() and _handle_problem(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    32
    NOT handle_exception() and handle_problem().
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    33
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    34
    def __init__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    35
        #: The file that is currently being parsed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    36
        self.current_file = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    37
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    38
    def handle_exception(self, exception, file_path=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    39
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    40
        Handle an exception that occurred while parsing a file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    41
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    42
        @param exception: The exception that occurred.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    43
        @param file_path: Override for the name of the file that was being parsed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    44
            If this is None, self.current_file is used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    45
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    46
        if file_path is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    47
            file_path = self.current_file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    48
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    49
        self._handle_exception(exception, file_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    50
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    51
    def handle_problem(self, problem, file_path=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    52
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    53
        Handle a Problem that occurred while parsing a file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    54
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    55
        @param problem: The problem object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    56
        @param file_path: Override for the name of the file that was being parsed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    57
            If this is None, self.current_file is used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    58
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    59
        if file_path is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    60
            file_path = self.current_file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    61
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    62
        self._handle_problem(problem, file_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
    def _handle_exception(self, exception, file_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
        Called to handle an exception that occurred while parsing a file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
        Note that this should always be called in an exception handler,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
        so you can safely use e.g. traceback.format_exc().
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    71
        @param exception: The exception that occurred.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
        @param file_path: The file that was being parsed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
        cone.public.utils.log_exception(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
            logging.getLogger('cone'),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    76
            "Error parsing '%s': %s" % (file_path, str(exception)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    77
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    78
    def _handle_problem(self, problem, file_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    80
        Called when parsing a file yields a problem.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    81
        @param problem: The problem object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    82
        @param file_path: Override for the name of the file that was being parsed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    83
            If this is None, self.current_file is used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    84
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    85
        problem.file = file_path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    86
        problem.log(logging.getLogger('cone'))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    87
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    88
# Thread-local storage for the contexts
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    89
_contexts = threading.local()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    90
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    91
def _init_contexts():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    92
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    93
    Initialize thread-local contexts if they are not initialized yet.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    94
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    95
    if not hasattr(_contexts, 'implml'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    96
        _contexts.implml = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    97
        _contexts.confml = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    98
        _contexts.implml_default = ParseContext()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    99
        _contexts.confml_default = ParseContext()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   100
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   101
def get_implml_context():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   102
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   103
    Get the current ImplML parse context.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   104
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   105
    _init_contexts()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   106
    if _contexts.implml is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   107
        return _contexts.implml
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   108
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   109
        return _contexts.implml_default
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   110
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   111
def set_implml_context(context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   112
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   113
    Set the current ImplML parse context.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   114
    @param context: The context to set. If None, the default context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   115
        will be used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   116
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   117
    _init_contexts()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   118
    _contexts.implml = context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   119
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   120
def get_confml_context():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   121
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   122
    Get the current ConfML parse context.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   123
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   124
    _init_contexts()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   125
    if _contexts.confml is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   126
        return _contexts.confml
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   127
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   128
        return _contexts.confml_default
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   129
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   130
def set_confml_context(context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   131
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   132
    Set the current ConfML parse context.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   133
    @param context: The context to set. If None, the default context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   134
        will be used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   135
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   136
    _init_contexts()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   137
    _contexts.confml = context