Class: SOAP::SOAPArray

Inherits:
XSD::NSDBase show all
Includes:
Enumerable, SOAPCompoundtype
Defined in:
lib/soap/baseData.rb

Constant Summary

Constants included from SOAP

AttrActor, AttrActorName, AttrArrayType, AttrArrayTypeName, AttrEncodingStyle, AttrEncodingStyleName, AttrMustUnderstand, AttrMustUnderstandName, AttrOffset, AttrOffsetName, AttrPosition, AttrPositionName, AttrRoot, AttrRootName, Base64Literal, Charset, EleBody, EleBodyName, EleEnvelope, EleEnvelopeName, EleFault, EleFaultActor, EleFaultActorName, EleFaultCode, EleFaultCodeName, EleFaultDetail, EleFaultDetailName, EleFaultName, EleFaultString, EleFaultStringName, EleHeader, EleHeaderName, EncodingNamespace, EnvelopeNamespace, LiteralNamespace, MediaType, NS, NextActor, PropertyName, RPCRouter, RPCServerException, RPCUtils, SOAPNamespaceTag, SOAPProxy, TypeMap, VERSION, ValueArray, ValueArrayName, XSDNamespaceTag, XSINamespaceTag

Instance Attribute Summary collapse

Attributes included from SOAPCompoundtype

#qualified

Attributes included from SOAPType

#definedtype, #elename, #encodingstyle, #extraattr, #id, #parent, #precedents, #root

Attributes inherited from XSD::NSDBase

#type

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Enumerable

#inject

Methods included from SOAPType

#inspect, #rootnode

Methods inherited from XSD::NSDBase

inherited, #init, types

Constructor Details

#initialize(type = nil, rank = 1, arytype = nil) ⇒ SOAPArray

Returns a new instance of SOAPArray.



802
803
804
805
806
807
808
809
810
811
812
813
# File 'lib/soap/baseData.rb', line 802

def initialize(type = nil, rank = 1, arytype = nil)
  super()
  @type = type || ValueArrayName
  @rank = rank
  @data = Array.new
  @sparse = false
  @offset = Array.new(rank, 0)
  @size = Array.new(rank, 0)
  @size_fixed = false
  @position = nil
  @arytype = arytype
end

Instance Attribute Details

#arytypeObject (readonly)

Returns the value of attribute arytype.



800
801
802
# File 'lib/soap/baseData.rb', line 800

def arytype
  @arytype
end

#offsetObject

Returns the value of attribute offset.



798
799
800
# File 'lib/soap/baseData.rb', line 798

def offset
  @offset
end

#rankObject (readonly)

Returns the value of attribute rank.



798
799
800
# File 'lib/soap/baseData.rb', line 798

def rank
  @rank
end

#sizeObject

Returns the value of attribute size.



799
800
801
# File 'lib/soap/baseData.rb', line 799

def size
  @size
end

#size_fixedObject

Returns the value of attribute size_fixed.



799
800
801
# File 'lib/soap/baseData.rb', line 799

def size_fixed
  @size_fixed
end

#sparseObject

Returns the value of attribute sparse.



796
797
798
# File 'lib/soap/baseData.rb', line 796

def sparse
  @sparse
end

Class Method Details

.decode(elename, type, arytype) ⇒ Object



1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
# File 'lib/soap/baseData.rb', line 1002

def self.decode(elename, type, arytype)
  typestr, nofary = parse_type(arytype.name)
  rank = nofary.count(',') + 1
  plain_arytype = XSD::QName.new(arytype.namespace, typestr)
  o = SOAPArray.new(type, rank, plain_arytype)
  size = []
  nofary.split(',').each do |s|
    if s.empty?
	size.clear
	break
    else
	size << s.to_i
    end
  end
  unless size.empty?
    o.size = size
    o.size_fixed = true
  end
  o.elename = elename
  o
end

Instance Method Details

#[](*idxary) ⇒ Object



828
829
830
831
832
833
834
# File 'lib/soap/baseData.rb', line 828

def [](*idxary)
  if idxary.size != @rank
    raise ArgumentError.new("given #{idxary.size} params does not match rank: #{@rank}")
  end

  retrieve(idxary)
end

#[]=(*idxary) ⇒ Object



836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
# File 'lib/soap/baseData.rb', line 836

def []=(*idxary)
  value = idxary.slice!(-1)

  if idxary.size != @rank
    raise ArgumentError.new("given #{idxary.size} params(#{idxary})" +
      " does not match rank: #{@rank}")
  end

  idx = 0
  while idx < idxary.size
    if idxary[idx] + 1 > @size[idx]
	@size[idx] = idxary[idx] + 1
    end
    idx += 1
  end

  data = retrieve(idxary[0, idxary.size - 1])
  data[idxary.last] = value

  if value.is_a?(SOAPType)
    value.elename = ITEM_NAME
    # Sync type
    unless @type.name
	@type = XSD::QName.new(value.type.namespace,
 SOAPArray.create_arytype(value.type.name, @rank))
    end
    value.type ||= @type
  end

  @offset = idxary
  value.parent = self if value.respond_to?(:parent=)
  offsetnext
end

#add(value) ⇒ Object



820
821
822
# File 'lib/soap/baseData.rb', line 820

def add(value)
  self[*(@offset)] = value
end

#deep_map(ary, &block) ⇒ Object



886
887
888
889
890
891
892
893
894
895
896
# File 'lib/soap/baseData.rb', line 886

def deep_map(ary, &block)
  ary.collect do |ele|
    if ele.is_a?(Array)
	deep_map(ele, &block)
    else
	new_obj = block.call(ele)
	new_obj.elename = ITEM_NAME
	new_obj
    end
  end
end

#eachObject



870
871
872
873
874
# File 'lib/soap/baseData.rb', line 870

def each
  @data.each do |data|
    yield(data)
  end
end

#have_memberObject



824
825
826
# File 'lib/soap/baseData.rb', line 824

def have_member
  !@data.empty?
end

#include?(var) ⇒ Boolean

Returns:

  • (Boolean)


898
899
900
901
902
903
904
905
# File 'lib/soap/baseData.rb', line 898

def include?(var)
  traverse_data(@data) do |v, *rank|
    if v.is_a?(SOAPBasetype) && v.data == var
	return true
    end
  end
  false
end

#positionObject



938
939
940
# File 'lib/soap/baseData.rb', line 938

def position
  @position
end

#replaceObject



880
881
882
883
884
# File 'lib/soap/baseData.rb', line 880

def replace
  @data = deep_map(@data) do |ele|
    yield(ele)
  end
end

#soap2array(ary) ⇒ Object



917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
# File 'lib/soap/baseData.rb', line 917

def soap2array(ary)
  traverse_data(@data) do |v, *position|
    iteary = ary
    rank = 1
    while rank < position.size
	idx = position[rank - 1]
	if iteary[idx].nil?
 iteary = iteary[idx] = Array.new
	else
 iteary = iteary[idx]
	end
      rank += 1
    end
    if block_given?
	iteary[position.last] = yield(v)
    else
	iteary[position.last] = v
    end
  end
end

#to_aObject



876
877
878
# File 'lib/soap/baseData.rb', line 876

def to_a
  @data.dup
end

#traverseObject



907
908
909
910
911
912
913
914
915
# File 'lib/soap/baseData.rb', line 907

def traverse
  traverse_data(@data) do |v, *rank|
    unless @sparse
     yield(v)
    else
     yield(v, *rank) if v && !v.is_a?(SOAPNil)
    end
  end
end