Class SOAP::SOAPArray
In: lib/soap/baseData.rb
Parent: XSD::NSDBase

Methods

[]   []=   add   create_arytype   decode   deep_map   each   include?   new   offset=   offsetnext   parse_type   position   ranksize   replace   retrieve   soap2array   to_a   traverse   traverse_data  

Included Modules

SOAPCompoundtype Enumerable

Constants

ITEM_NAME = XSD::QName.new(nil, 'item')
TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$')

Attributes

arytype  [R] 
offset  [R] 
rank  [R] 
size  [RW] 
size_fixed  [RW] 
sparse  [RW] 

Public Class methods

Module function

[Source]

     # 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

[Source]

     # 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

Private Class methods

[Source]

     # File lib/soap/baseData.rb, line 927
927:   def self.create_arytype(typename, rank)
928:     "#{typename}[" << ',' * (rank - 1) << ']'
929:   end

[Source]

     # File lib/soap/baseData.rb, line 933
933:   def self.parse_type(string)
934:     TypeParseRegexp =~ string
935:     return $1, $2
936:   end

Public Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # File lib/soap/baseData.rb, line 725
725:   def add(value)
726:     self[*(@offset)] = value
727:   end

[Source]

     # 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

[Source]

     # File lib/soap/baseData.rb, line 771
771:   def each
772:     @data.each do |data|
773:       yield(data)
774:     end
775:   end

[Source]

     # 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

[Source]

     # File lib/soap/baseData.rb, line 720
720:   def offset=(var)
721:     @offset = var
722:     @sparse = true
723:   end

[Source]

     # File lib/soap/baseData.rb, line 839
839:   def position
840:     @position
841:   end

[Source]

     # File lib/soap/baseData.rb, line 781
781:   def replace
782:     @data = deep_map(@data) do |ele|
783:       yield(ele)
784:     end
785:   end

[Source]

     # 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

[Source]

     # File lib/soap/baseData.rb, line 777
777:   def to_a
778:     @data.dup
779:   end

[Source]

     # 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

Private Instance methods

[Source]

     # 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

[Source]

     # File lib/soap/baseData.rb, line 877
877:   def ranksize(rank)
878:     @size[rank - 1]
879:   end

[Source]

     # 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

[Source]

     # 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

[Validate]