Class: JIJI::Permitter
- Inherits:
-
Object
- Object
- JIJI::Permitter
- Defined in:
- lib/jiji/agent/permitter.rb
Overview
任意のオブジェクトのAPIをセーフレベルの高い環境から呼び出せるようにする。
Defined Under Namespace
Classes: Request
Instance Method Summary collapse
-
#<<(request) ⇒ Object
リクエストを追加する。.
-
#close ⇒ Object
インスタンスを破棄する。不要になった場合に必ず呼び出すこと。.
-
#initialize(pool_size = 5, level = 2) ⇒ Permitter
constructor
- コンストラクタ pool_size
-
スレッドプールのサイズ.
-
#proxy(object, allows = [], proxy_result = []) ⇒ Object
- 指定したインスタンスのAPIをセーフレベルの高い環境から呼び出せるようにする。 object
- APIの呼び出しを許可するオブジェクト allows
- 許可するAPIを示す正規表現の配列 proxy_result
-
戻り値もプロキシを設定するAPIを示す正規表現の配列.
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 |
#close ⇒ Object
インスタンスを破棄する。不要になった場合に必ず呼び出すこと。
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 |