Sha256: b8e9ad5db1746fa19cc079b82f168fea1f71d161d94687ba0650bf46dbb2e1df

Contents?: true

Size: 1.71 KB

Versions: 3

Compression:

Stored size: 1.71 KB

Contents

# Copyright (c) 2015 Sqreen. All Rights Reserved.
# Please refer to our terms for more information: https://www.sqreen.io/terms.html

require 'sqreen/log'

module Sqreen
  class CBTree
    include Enumerable
    # Callbacks tree:
    # class
    # methods
    # position

    def initialize
      @by_class = {}
    end

    def add(cb)
      @by_class[cb.klass] = {} unless @by_class[cb.klass]

      cb_klass = @by_class[cb.klass]
      unless cb_klass[cb.method]
        cb_klass[cb.method] = { :pre => [], :post => [], :failing => [] }
      end

      methods = cb_klass[cb.method]

      methods[:pre] << cb if cb.pre?
      methods[:post] << cb if cb.post?
      methods[:failing] << cb if cb.failing?
    end

    def remove(cb)
      types = @by_class[cb.klass][cb.method]

      types[:pre].delete cb  if cb.pre?
      types[:post].delete cb if cb.post?
      types[:failing].delete cb if cb.failing?
    end

    def get(klass, method, type = nil)
      k = @by_class[klass]
      unless k
        Sqreen.log.debug { format('Error: no cb registered for class %s (%s)', klass.inspect, klass.class) }
        Sqreen.log.debug { inspect }
        return []
      end
      cbs = k[method]
      unless cbs
        Sqreen.log.debug { format('Error: no cbs registered for method %s.%s', klass, method) }
        Sqreen.log.debug { inspect }
        return []
      end

      return cbs[type] unless type.nil?

      res = Set.new
      cbs.each_value { |v| res += v }
      res.to_a
    end

    def each
      @by_class.each_value do |values|
        values.each_value do |cbs|
          cbs.each_value do |cb_ary|
            cb_ary.each do |cb|
              yield cb
            end
          end
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 2 rubygems

Version Path
sqreen-1.11.0-java lib/sqreen/callback_tree.rb
sqreen-alt-1.11.0 lib/sqreen/callback_tree.rb
sqreen-1.11.0 lib/sqreen/callback_tree.rb