Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 1085

Show
Ignore:
Timestamp:
12/01/03 00:25:43 (5 years ago)
Author:
nahi
Message:

* add lock/unlock feature: avoid unexpected key reference by typo.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/property.rb

    r1084 r1085  
    1 # soap/property.rb: SOAP4R - Property definition. 
    2 # Copyright (C) 2000, 2001, 2002, 2003  NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 
     1# soap/property.rb: SOAP4R - Property implementation. 
     2# Copyright (C) 2003  NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 
    33 
    44# This program is copyrighted free software by NAKAMURA, Hiroshi.  You can 
     
    1414    @store = Hash.new 
    1515    @hook = Hash.new 
     16    @locked = false 
    1617  end 
    1718 
     
    3839  end 
    3940 
    40   # keys: downcased symbol 
     41  # keys: downcase symbol 
    4142  def keys 
    4243    @store.keys 
     44  end 
     45 
     46  def lock 
     47    each_key do |key| 
     48      key.lock 
     49    end 
     50    @locked = true 
     51  end 
     52 
     53  def unlock 
     54    @locked = false 
     55    each_key do |key| 
     56      key.unlock 
     57    end 
    4358  end 
    4459 
     
    4964    key = to_key(name) 
    5065    if rest.empty? 
     66      check_lock(key) 
    5167      @store[key] 
    5268    else 
     
    5975    key = to_key(name) 
    6076    if rest.empty? 
     77      check_lock(key) 
    6178      @store[key] = value 
    6279      local_hook(key) 
     
    7087    key = to_key(name) 
    7188    if rest.empty? 
     89      check_lock(key) 
    7290      (@hook[key] ||= []) << hook 
    7391    else 
     
    7896private 
    7997 
     98  def each_key 
     99    @store.each do |key, value| 
     100      if value.is_a?(::SOAP::Property) 
     101        yield(value) 
     102      end 
     103    end 
     104  end 
     105 
    80106  def deref_key(key) 
     107    check_lock(key) 
    81108    ref = @store[key] ||= self.class.new 
    82     unless ref.is_a?(SOAP::Property) 
    83       raise ArgumentError.new("key `#{key}' already defined as a value.") 
     109    unless ref.is_a?(::SOAP::Property) 
     110      raise ArgumentError.new("key `#{key}' already defined as a value") 
    84111    end 
    85112    ref 
     113  end 
     114 
     115  def check_lock(key) 
     116    if @locked and !@store.key?(key) 
     117      raise TypeError.new("cannot add any key to locked property") 
     118    end 
    86119  end 
    87120 
  • trunk/test/soap/test_property.rb

    r1084 r1085  
    124124    assert(@prop["a"].keys.member?(:c)) 
    125125  end 
     126 
     127  def test_lock 
     128    @prop["a.a"] = nil 
     129    @prop["a.b.c"] = 1 
     130    @prop["b"] = false 
     131    @prop.lock 
     132    assert_equal(nil, @prop["a.a"]) 
     133    assert_equal(1, @prop["a.b.c"]) 
     134    assert_equal(false, @prop["b"]) 
     135    assert_raises(TypeError) do 
     136      assert_nil(@prop["c"]) 
     137    end 
     138    assert_raises(TypeError) do 
     139      @prop["c"] = 2 
     140    end 
     141    assert_raises(TypeError) do 
     142      @prop["a.b.R"] 
     143    end 
     144    assert_raises(TypeError) do 
     145      @prop.add_hook("a.c") do 
     146        assert(false) 
     147      end 
     148    end 
     149    assert_nil(@prop["a.a"]) 
     150    @prop["a.b"] = nil 
     151    assert_nil(@prop["a.b"]) 
     152    # 
     153    @prop.unlock 
     154    assert_nil(@prop["c"]) 
     155    @prop["c"] = 2 
     156    assert_equal(2, @prop["c"]) 
     157    @prop["a.d.a.a"] = :foo 
     158    assert_equal(:foo, @prop["a.d.a.a"]) 
     159    tested = false 
     160    @prop.add_hook("a.c") do |name, value| 
     161      assert(true) 
     162      tested = true 
     163    end 
     164    @prop["a.c"] = 3 
     165    assert(tested) 
     166  end 
    126167end 
    127168