sbsv2/raptor/python/filter_list.py
changeset 0 044383f39525
child 3 e1eecf4d390d
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/python/filter_list.py	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,170 @@
+#
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+# Class to control array of defined logging filters
+# This class will act as a switch, controlling the list of filters iteratively
+#
+
+import os
+import sys
+import raptor
+import filter_interface
+import pluginbox
+import traceback
+
+class FilterWriteException(Exception):
+	def __init__(self, value):
+		self.parameter = value
+	def __str__(self):
+		return repr(self.parameter)
+
+class BootstrapFilter(filter_interface.Filter):
+	def __init__(self):
+		self.out = sys.stdout
+
+	"""Use this until the CLI has supplied some real filters"""
+	def open(self, raptor_instance):
+		"""Set output to stdout for the various I/O methods to write to."""
+		self.raptor = raptor_instance
+		return True
+		
+	def write(self, text):
+		"""Write errors and warnings to stdout"""
+		
+		if text.startswith("<error>"):
+			start = text.find(">")
+			end = text.rfind("<")
+			self.out.write(str(raptor.name) + ": error: %s\n" \
+					% text[(start + 1):end])
+		elif text.startswith("<warning"):
+			start = text.find(">")
+			end = text.rfind("<")
+			self.out.write(str(raptor.name) + ": warning: %s\n" \
+					% text[(start + 1):end])
+		elif "error" in text or "warning" in text:
+			self.out.write(text)
+		return True
+
+	def summary(self):
+		"""Write Summary"""
+		return False
+	
+	def close(self):
+		"""Nothing to do for stdout"""
+		return True
+
+
+
+class FilterList(filter_interface.Filter):
+
+	def __init__(self):
+		self.out = [BootstrapFilter()]
+		self.filters = []
+		self.pbox = None
+
+	def open(self, raptor_instance, filternames, pbox):
+		"""
+			Call open function on each filter using raptor parameters provided
+			Returns: Boolean: Have the functions succeeded in opening the files?
+		"""
+		# Find all the filter plugins
+		self.pbox = pbox
+		possiblefilters = self.pbox.classesof(filter_interface.Filter)
+		unfound = []
+		self.filters = []
+		for f in filternames:
+			unfound.append(f) # unfound unless we find it
+			for pl in possiblefilters:
+				if pl.__name__.upper() == f.upper():
+					self.filters.append(pl())
+					unfound = unfound[:-1]
+		if unfound != []:
+			raise ValueError("requested filters not found: %s \
+			\nAvailable filters are: %s" % (str(unfound), self.format_output_list(possiblefilters)))
+
+		if self.filters == []:
+			self.out = [BootstrapFilter()]
+		else:
+			self.out=[]
+			for filter in self.filters:
+				if filter.open(raptor_instance):
+					self.out.append(filter)
+				else:
+					sys.stderr.write(str(raptor.name) + \
+							": error: Cannot open filter: %s\n" % str(filter))
+					ok = False
+					
+			if self.out == []:
+				sys.stderr.write(str(raptor.name) + \
+						": warning: All filters failed to open. " + \
+						"Defaulting to 'stdout'\n")
+				self.out = [BootstrapFilter()]
+
+	def write(self, text):
+		"""
+			Iterate through each filter, calling their write function
+		"""
+
+		if text is None:
+			return
+
+		badfilters = []
+		for filter in self.out:
+			try:
+				filter.write(text)
+			except Exception,e:
+				traceback.print_exc(file=sys.stdout)
+				sys.stdout.write("Called from: \n")
+				traceback.print_stack(file=sys.stdout)
+				sys.stdout.write("\n")
+				badfilters.append(filter)
+
+		if len(badfilters) > 0:
+			for f in badfilters:
+				self.out.remove(f) # dump the filter in case it causes repeated exceptions
+				sys.stdout.write("Removed filter %s because it generated an exception\n" % type(f))
+
+			if len(self.out) == 0:
+				sys.stdout.write("Falling back to bootstrap filter\n")
+				self.out = [BootstrapFilter()] # Try to fall back to something in the worst case
+
+	def summary(self):
+		"""
+			Run the summaries of all filters (prior to log end)
+		"""
+		for filter in self.out:
+			filter.summary()
+
+	def close(self):
+		"""
+			Iterate through each filter, calling their close function
+			Returns True if all the filters close properly
+		"""
+		returnVal = True
+		
+		for filter in self.out:
+			if (filter != sys.stdout) and (filter != sys.stderr):
+				returnVal = returnVal and filter.close()
+		
+		return returnVal
+
+	def format_output_list(self, possiblefilters):
+		"""
+			formats available filters
+		"""
+		filters_formatted = ""
+		for pl in possiblefilters:
+			filters_formatted += "\n  " + pl.__name__
+		return filters_formatted
+