Method: When::Parts::Resource._instance
- Defined in:
- lib/when_exe/parts/resource.rb
._instance(iri, namespace = nil, &block) ⇒ When::Parts::Resource
オブジェクト生成&参照
指定した iri の When::Parts::Resource オブジェクトを取得する。当該オブジェクトが未登録であれば生成する。
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
# File 'lib/when_exe/parts/resource.rb', line 270 def _instance(iri, namespace=nil, &block) _setup_ unless @_pool case iri when Array ; return iri.map {|e| _instance(e, namespace)} # 配列は個別に処理 when Resource ; return iri # 登録済みはそのまま when String ; # 解析処理へ else ; raise ArgumentError, "can't convert #{iri.class} to String" # 例外 end # 内部文字列化 iri = When::EncodingConversion.to_internal_encoding(iri) # 階層がある場合は、階層をたどる iri = Resource._decode(iri) iri = $1 while iri =~ /\A\((.*)\)\z/ iri = namespace + iri if namespace && iri !~ IRIHeader root, *leaves= Resource._encode(iri).split(/::/) if leaves.size > 0 return leaves.inject(_instance(Resource._decode(root))) {|obj,leaf| obj[Resource._decode(leaf)]} end # 登録ずみなら、参照 iri = _extract_prefix(iri) path, query = iri.split(/\?/, 2) if When.multi_thread my_mutex = nil @_lock_.synchronize do @_pool ||= {} unless @_pool[iri] my_mutex = Mutex.new @_pool[iri] = my_mutex end end case @_pool[iri] when my_mutex; my_mutex.synchronize {@_pool[iri] = _create_object(iri, path, query, &block) } when Mutex ; @_pool[iri].synchronize {@_pool[iri]} else ; @_pool[iri] end else @_pool ||= {} @_pool[iri] ||= _create_object(iri, path, query, &block) end end |