Class | SOAP::SOAPArray |
In: |
lib/soap/baseData.rb
|
Parent: | XSD::NSDBase |
ITEM_NAME | = | XSD::QName.new(nil, 'item') |
TypeParseRegexp | = | Regexp.new('^(.+)\[([\d,]*)\]$') |
arytype | [R] | |
offset | [R] | |
rank | [R] | |
size | [RW] | |
size_fixed | [RW] | |
sparse | [RW] |
Module function
# File lib/soap/baseData.rb, line 903 903: def self.decode(elename, type, arytype) 904: typestr, nofary = parse_type(arytype.name) 905: rank = nofary.count(',') + 1 906: plain_arytype = XSD::QName.new(arytype.namespace, typestr) 907: o = SOAPArray.new(type, rank, plain_arytype) 908: size = [] 909: nofary.split(',').each do |s| 910: if s.empty? 911: size.clear 912: break 913: else 914: size << s.to_i 915: end 916: end 917: unless size.empty? 918: o.size = size 919: o.size_fixed = true 920: end 921: o.elename = elename 922: o 923: end
# File lib/soap/baseData.rb, line 707 707: def initialize(type = nil, rank = 1, arytype = nil) 708: super() 709: @type = type || ValueArrayName 710: @rank = rank 711: @data = Array.new 712: @sparse = false 713: @offset = Array.new(rank, 0) 714: @size = Array.new(rank, 0) 715: @size_fixed = false 716: @position = nil 717: @arytype = arytype 718: end
# File lib/soap/baseData.rb, line 927 927: def self.create_arytype(typename, rank) 928: "#{typename}[" << ',' * (rank - 1) << ']' 929: end
# File lib/soap/baseData.rb, line 933 933: def self.parse_type(string) 934: TypeParseRegexp =~ string 935: return $1, $2 936: end
# File lib/soap/baseData.rb, line 729 729: def [](*idxary) 730: if idxary.size != @rank 731: raise ArgumentError.new("given #{idxary.size} params does not match rank: #{@rank}") 732: end 733: 734: retrieve(idxary) 735: end
# File lib/soap/baseData.rb, line 737 737: def []=(*idxary) 738: value = idxary.slice!(-1) 739: 740: if idxary.size != @rank 741: raise ArgumentError.new("given #{idxary.size} params(#{idxary})" + 742: " does not match rank: #{@rank}") 743: end 744: 745: idx = 0 746: while idx < idxary.size 747: if idxary[idx] + 1 > @size[idx] 748: @size[idx] = idxary[idx] + 1 749: end 750: idx += 1 751: end 752: 753: data = retrieve(idxary[0, idxary.size - 1]) 754: data[idxary.last] = value 755: 756: if value.is_a?(SOAPType) 757: value.elename = ITEM_NAME 758: # Sync type 759: unless @type.name 760: @type = XSD::QName.new(value.type.namespace, 761: SOAPArray.create_arytype(value.type.name, @rank)) 762: end 763: value.type ||= @type 764: end 765: 766: @offset = idxary 767: value.parent = self if value.respond_to?(:parent=) 768: offsetnext 769: end
# File lib/soap/baseData.rb, line 787 787: def deep_map(ary, &block) 788: ary.collect do |ele| 789: if ele.is_a?(Array) 790: deep_map(ele, &block) 791: else 792: new_obj = block.call(ele) 793: new_obj.elename = ITEM_NAME 794: new_obj 795: end 796: end 797: end
# File lib/soap/baseData.rb, line 771 771: def each 772: @data.each do |data| 773: yield(data) 774: end 775: end
# File lib/soap/baseData.rb, line 799 799: def include?(var) 800: traverse_data(@data) do |v, *rank| 801: if v.is_a?(SOAPBasetype) && v.data == var 802: return true 803: end 804: end 805: false 806: end
# File lib/soap/baseData.rb, line 720 720: def offset=(var) 721: @offset = var 722: @sparse = true 723: end
# File lib/soap/baseData.rb, line 781 781: def replace 782: @data = deep_map(@data) do |ele| 783: yield(ele) 784: end 785: end
# File lib/soap/baseData.rb, line 818 818: def soap2array(ary) 819: traverse_data(@data) do |v, *position| 820: iteary = ary 821: rank = 1 822: while rank < position.size 823: idx = position[rank - 1] 824: if iteary[idx].nil? 825: iteary = iteary[idx] = Array.new 826: else 827: iteary = iteary[idx] 828: end 829: rank += 1 830: end 831: if block_given? 832: iteary[position.last] = yield(v) 833: else 834: iteary[position.last] = v 835: end 836: end 837: end
# File lib/soap/baseData.rb, line 808 808: def traverse 809: traverse_data(@data) do |v, *rank| 810: unless @sparse 811: yield(v) 812: else 813: yield(v, *rank) if v && !v.is_a?(SOAPNil) 814: end 815: end 816: end
# File lib/soap/baseData.rb, line 881 881: def offsetnext 882: move = false 883: idx = @offset.size - 1 884: while !move && idx >= 0 885: @offset[idx] += 1 886: if @size_fixed 887: if @offset[idx] < @size[idx] 888: move = true 889: else 890: @offset[idx] = 0 891: idx -= 1 892: end 893: else 894: move = true 895: end 896: end 897: end
# File lib/soap/baseData.rb, line 847 847: def retrieve(idxary) 848: data = @data 849: rank = 1 850: while rank <= idxary.size 851: idx = idxary[rank - 1] 852: if data[idx].nil? 853: data = data[idx] = Array.new 854: else 855: data = data[idx] 856: end 857: rank += 1 858: end 859: data 860: end
# File lib/soap/baseData.rb, line 862 862: def traverse_data(data, rank = 1) 863: idx = 0 864: while idx < ranksize(rank) 865: if rank < @rank 866: traverse_data(data[idx], rank + 1) do |*v| 867: v[1, 0] = idx 868: yield(*v) 869: end 870: else 871: yield(data[idx], idx) 872: end 873: idx += 1 874: end 875: end