| 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