The MessageHandler can display and store application messages. Depending on the type of the message, a TjExeption can be raised (:error), or the program can be immedidately aborted (:fatal). Other types will just continue the program flow.
Initialize the MessageHandler.
# File lib/taskjuggler/MessageHandler.rb, line 123 def initialize reset end
# File lib/taskjuggler/MessageHandler.rb, line 154 def baselineSFI=(line) @baselineSFI[Thread.current.object_id] = line end
Clear the error log.
# File lib/taskjuggler/MessageHandler.rb, line 163 def clear # A counter for messages of type error. @errors = 0 # A list of all generated messages. @messages = [] end
Generate an critical message.
# File lib/taskjuggler/MessageHandler.rb, line 194 def critical(id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) addMessage(:critical, id, message, sourceFileInfo, line, data, scenario) end
Generate a debug message.
# File lib/taskjuggler/MessageHandler.rb, line 212 def debug(id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) addMessage(:debug, id, message, sourceFileInfo, line, data, scenario) end
Generate an error message.
# File lib/taskjuggler/MessageHandler.rb, line 188 def error(id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) addMessage(:error, id, message, sourceFileInfo, line, data, scenario) end
Generate a fatal message that will abort the application.
# File lib/taskjuggler/MessageHandler.rb, line 182 def fatal(id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) addMessage(:fatal, id, message, sourceFileInfo, line, data, scenario) end
Generate an info message.
# File lib/taskjuggler/MessageHandler.rb, line 206 def info(id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) addMessage(:info, id, message, sourceFileInfo, line, data, scenario) end
Set the log output level.
# File lib/taskjuggler/MessageHandler.rb, line 177 def logLevel=(level) @logLevel = checkLevel(level) end
Set the console output level.
# File lib/taskjuggler/MessageHandler.rb, line 172 def outputLevel=(level) @outputLevel = checkLevel(level) end
Reset the MessageHandler to the initial state. All messages will be purged and the error counter set to 0.
# File lib/taskjuggler/MessageHandler.rb, line 129 def reset # This setting controls what type of messages will be written to the # console. @outputLevel = 4 # This setting controls what type of messages will be written to the log # file. @logLevel = 3 # The full file name of the log file. @logFile = nil # The name of the current application @appName = 'unknown' # Set to true if program should be exited on warnings. @abortOnWarning = false # A SourceFileInfo object that will be used to baseline the provided # source file infos of the messages. We use a Hash to keep per Thread # values. @baselineSFI = {} # Each tread can request to only throw a TjRuntimeError instead of # using exit(). This hash keeps a flag for each thread using the # object_id of the Thread object as key. @trapSetup = {} clear end
Convert all messages into a single String.
# File lib/taskjuggler/MessageHandler.rb, line 218 def to_s text = '' @messages.each { |msg| text += msg.to_s } text end
# File lib/taskjuggler/MessageHandler.rb, line 158 def trapSetup=(enable) @trapSetup[Thread.current.object_id] = enable end
Generate a warning.
# File lib/taskjuggler/MessageHandler.rb, line 200 def warning(id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) addMessage(:warning, id, message, sourceFileInfo, line, data, scenario) end
Generate a message by specifying the type.
# File lib/taskjuggler/MessageHandler.rb, line 256 def addMessage(type, id, message, sourceFileInfo = nil, line = nil, data = nil, scenario = nil) # If we have a SourceFileInfo and a baseline SFI, we correct the # sourceFileInfo accordingly. baselineSFI = @baselineSFI[Thread.current.object_id] if sourceFileInfo && baselineSFI sourceFileInfo = TextParser::SourceFileInfo.new( baselineSFI.fileName, sourceFileInfo.lineNo + baselineSFI.lineNo - 1, sourceFileInfo.columnNo) end # Treat criticals like errors but without generating another # exception. msg = Message.new(type == :critical ? :error : type, id, message, sourceFileInfo, line, data, scenario) @messages << msg # Append the message to the log file if requested by the user. log(type, msg.to_log) if @logLevel >= LogLevels[type] # Print the message to $stderr if requested by the user. $stderr.puts msg.to_s if @outputLevel >= LogLevels[type] case type when :warning raise TjException.new, '' if @abortOnWarning when :critical # Increase the error counter. @errors += 1 when :error # Increase the error counter. @errors += 1 if @trapSetup[Thread.current.object_id] raise TjRuntimeError else exit 1 end when :fatal raise RuntimeError end end
# File lib/taskjuggler/MessageHandler.rb, line 226 def checkLevel(level) if level.is_a?(Fixnum) if level < 0 || level > 5 raise ArgumentError, "Unsupported level #{level}" end else unless (level = LogLevels[level]) raise ArgumentError, "Unsupported level #{level}" end end level end
# File lib/taskjuggler/MessageHandler.rb, line 240 def log(type, message) return unless @logFile timeStamp = Time.new.strftime("%Y-%m-%d %H:%M:%S") begin @logFile.untaint File.open(@logFile, 'a') do |f| f.write("#{timeStamp} #{type} #{@appName}[#{Process.pid}]: " + "#{message}\n") end rescue $stderr.puts "Cannot write to log file #{@logFile}: #{$!}" end end