Class: JIJI::Permitter

Inherits:
Object
  • Object
show all
Defined in:
lib/jiji/agent/permitter.rb

Overview

任意のオブジェクトのAPIをセーフレベルの高い環境から呼び出せるようにする。

Defined Under Namespace

Classes: Request

Instance Method Summary collapse

Constructor Details

#initialize(pool_size = 5, level = 2) ⇒ Permitter

コンストラクタ

pool_size

スレッドプールのサイズ



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/jiji/agent/permitter.rb', line 29

def initialize( pool_size=5, level=2 )
  @alive = true
  @alive_mutex = Mutex.new
  @q = Queue.new
  @ts = []
  pool_size.times {
   @ts << Thread.fork {
     $SAFE = level
      while( @alive_mutex.synchronize { @alive } )
        req = @q.pop
        req.exec(self) if req
      end
   }
  }
end

Instance Method Details

#<<(request) ⇒ Object

リクエストを追加する。



45
46
47
# File 'lib/jiji/agent/permitter.rb', line 45

def <<(request)
  @q.push request
end

#closeObject

インスタンスを破棄する。不要になった場合に必ず呼び出すこと。



49
50
51
52
53
54
55
56
57
# File 'lib/jiji/agent/permitter.rb', line 49

def close
  @alive_mutex.synchronize {
    @alive = false
  }
  @ts.length.times {
    @q.push nil
  }
  @ts.each {|t| t.join }
end

#proxy(object, allows = [], proxy_result = []) ⇒ Object

指定したインスタンスのAPIをセーフレベルの高い環境から呼び出せるようにする。

object

APIの呼び出しを許可するオブジェクト

allows

許可するAPIを示す正規表現の配列

proxy_result

戻り値もプロキシを設定するAPIを示す正規表現の配列



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/jiji/agent/permitter.rb', line 62

def proxy( object, allows=[], proxy_result=[])
  clazz = class << object
    include JIJI::Permitted
    self
  end
  object.permitter = self
  object.permitter_allows = allows
  object.permitter_proxy_result = proxy_result
  object.methods.each {|name|
    next unless allows.find {|a| name.to_s =~ a }

    # もともとのメソッドは、別名でキープしておく
    old = name.to_s + "_without_permittion"
    # 2重のアスペクト適用を防ぐ。
    next if clazz.method_defined? old.to_sym
    
    clazz.__send__(:alias_method, old.to_sym, name.to_sym )
    # インターセプタ適用対象のメソッドを上書きで定義。
    clazz.__send__(:alias_method, name.to_sym, :permitted_request )
  }
  object
end