Class: LogStash::Inputs::Sttxml1

Inherits:
Base
  • Object
show all
Defined in:
lib/logstash/inputs/sttxml1.rb

Overview

Generate a repeating message.

This plugin is intented only as an example.

Instance Method Summary collapse

Instance Method Details

#registerObject



34
35
36
37
# File 'lib/logstash/inputs/sttxml1.rb', line 34

def register
  @host = Socket.gethostname
@logger.info("Registering file input", :path => @path)
end

#run(queue) ⇒ Object

def register



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/logstash/inputs/sttxml1.rb', line 39

def run(queue)
FileWatcher.new(@path).watch(@stat_interval) do |filename, event|
	if(event == :new)
		
		agentRegex = /#{@agent_regex}/
    	customerRegex = /#{@customer_regex}/
    	agentParties = 0
    	customerParties = 0
    	parties = Hash.new

		begin
			value = File.read(filename)
     		doc = Nokogiri::XML(value, nil, value.encoding.to_s)
      	clauses = []
      	event = LogStash::Event.new("host" => @host)
			
			doc.xpath("//Subject[@Name='RecognizeText']/Role").each do |link|
				who = "#{link.attribute('Name').content}"
				if(who=~agentRegex)
					if(!parties.key?(who))
						parties[who] = "agent#{agentParties}"
						agentParties += 1
					end
				end

				if(who=~customerRegex)
					if(!parties.key?(who))
						parties[who] = "customer#{customerParties}"
						customerParties += 1
					end
				end
				party = parties[who]
				event[party] = ''
				link.child.children.each do |item|
					begin_time, end_time, content = item.attribute('Begin').content.to_i, item.attribute('End').content.to_i, item.child.text
					event[party] += "#{party}-#{begin_time} #{content}\n"
					clauses << [ who, party, begin_time, end_time, content ]
				end
				event['parties'] = parties.keys
				event['dialogs'] =	clauses.sort_by { |_, _, begin_time, _, _| begin_time }.map { |_, party, begin_time, _, content| "#{party}-#{begin_time} #{content}" }.join("\n")
				event['vtt'] =	(clauses.sort_by { |_, _, begin_time, _, _| begin_time }.map do |who, party, begin_time, end_time, content| 
					"#{party}-#{begin_time}\n#{Time.at(begin_time/1000).utc.strftime('%H:%M:%S.')}#{'%.3d' % (begin_time%1000)} --> #{Time.at(end_time/1000).utc.strftime('%H:%M:%S.')}#{'%.3d' %(end_time%1000)}\n<v #{who}>#{content}</v>\n"
				end)
			end

     	decorate(event)
    		queue << event
		rescue => ex
			@logger.warn('Trouble parsing xml', :source => @source, :exception => ex, :backtrace => ex.backtrace)
      	return
		end
	end      
end

end