class Tengine::Core::Handler::Visitor

HashとArrayで入れ子になったfilterのツリーをルートから各Leafの方向に辿っていくVisitorです。 正確にはVisitorパターンではないのですが、似ているのでメタファとしてVisitorとしました。

Public Class Methods

new(filter, event, session) click to toggle source
# File lib/tengine/core/handler.rb, line 101
def initialize(filter, event, session)
  @filter = filter
  @event = event
  @session = Tengine::Core::SessionWrapper.new(session)
  @session_reloaded = false
  @current = @filter
end

Public Instance Methods

and() click to toggle source
# File lib/tengine/core/handler.rb, line 133
def and
  children = @current["children"]
  # children.all?{|child| backup_current(child){ visit }} # これだと全てのchildrenについて評価せずfalseがあったら処理を抜けてしまいます。
  children.map{|child| backup_current(child){ visit }}.all?
end
backup_current(node) { || ... } click to toggle source
# File lib/tengine/core/handler.rb, line 123
def backup_current(node)
  backup = @current
  @current = node
  begin
    return yield
  ensure
    @current = backup
  end
end
find_or_mark_in_session() click to toggle source
# File lib/tengine/core/handler.rb, line 139
def find_or_mark_in_session
  name = @current['pattern'].to_s
  key = "mark_#{name}"
  if name == @event.event_type_name
    if session.system_properties[key].nil?
      session.system_update(key => true)
      Tengine.logger.debug("session.system_updated #{session.system_properties.inspect}")
    end
    return true
  else
    return session.system_properties[key]
  end
end
match_source_name?() click to toggle source
# File lib/tengine/core/handler.rb, line 153
def match_source_name?
  pattern = @current['pattern']
  @event.source_name.include?(pattern)
end
session() click to toggle source
# File lib/tengine/core/handler.rb, line 109
def session
  unless @session_reloaded
    @session.reload
    @session_reloaded = true
  end
  @session
end
visit() click to toggle source
# File lib/tengine/core/handler.rb, line 118
def visit
  Tengine.logger.debug("visiting #{@current.inspect}")
  send(@current['method'])
end