1# ----------------------------------------------------------------------------------------------------
2#
3# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
4# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5#
6# This code is free software; you can redistribute it and/or modify it
7# under the terms of the GNU General Public License version 2 only, as
8# published by the Free Software Foundation.
9#
10# This code is distributed in the hope that it will be useful, but WITHOUT
11# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13# version 2 for more details (a copy is included in the LICENSE file that
14# accompanied this code).
15#
16# You should have received a copy of the GNU General Public License version
17# 2 along with this work; if not, write to the Free Software Foundation,
18# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19#
20# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21# or visit www.oracle.com if you need additional information or have any
22# questions.
23#
24# ----------------------------------------------------------------------------------------------------
25
26import re
27
28class OutputParser:
29
30    def __init__(self):
31        self.matchers = []
32
33    def addMatcher(self, matcher):
34        self.matchers.append(matcher)
35
36    def parse(self, output):
37        valueMaps = []
38        for matcher in self.matchers:
39            matcher.parse(output, valueMaps)
40        return valueMaps
41
42"""
43Produces a value map for each match of a given regular expression
44in some text. The value map is specified by a template map
45where each key and value in the template map is either a constant
46value or a named group in the regular expression. The latter is
47given as the group name enclosed in '<' and '>'.
48"""
49class ValuesMatcher:
50
51    def __init__(self, regex, valuesTemplate):
52        assert isinstance(valuesTemplate, dict)
53        self.regex = regex
54        self.valuesTemplate = valuesTemplate
55
56    def parse(self, text, valueMaps):
57        for match in self.regex.finditer(text):
58            valueMap = {}
59            for keyTemplate, valueTemplate in self.valuesTemplate.items():
60                key = self.get_template_value(match, keyTemplate)
61                value = self.get_template_value(match, valueTemplate)
62                assert not valueMap.has_key(key), key
63                valueMap[key] = value
64            valueMaps.append(valueMap)
65
66    def get_template_value(self, match, template):
67        def replace_var(m):
68            groupName = m.group(1)
69            return match.group(groupName)
70
71        return re.sub(r'<([\w]+)>', replace_var, template)
72