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 オブジェクトを取得する。当該オブジェクトが未登録であれば生成する。

Parameters:

  • iri (String)

    International Resource Identifier

  • namespace (String) (defaults to: nil)

    (デフォルトの名前空間, 指定がないときは名前空間を省略しない)

  • block (Block)

    オブジェクトが見つからない場合の代替処理

Returns:



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