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