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.



756
757
758
759
760
761
762
763
764
765
766
767
# File 'lib/soap/baseData.rb', line 756

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.



754
755
756
# File 'lib/soap/baseData.rb', line 754

def arytype
  @arytype
end

#offsetObject

Returns the value of attribute offset.



752
753
754
# File 'lib/soap/baseData.rb', line 752

def offset
  @offset
end

#rankObject (readonly)

Returns the value of attribute rank.



752
753
754
# File 'lib/soap/baseData.rb', line 752

def rank
  @rank
end

#sizeObject

Returns the value of attribute size.



753
754
755
# File 'lib/soap/baseData.rb', line 753

def size
  @size
end

#size_fixedObject

Returns the value of attribute size_fixed.



753
754
755
# File 'lib/soap/baseData.rb', line 753

def size_fixed
  @size_fixed
end

#sparseObject

Returns the value of attribute sparse.



750
751
752
# File 'lib/soap/baseData.rb', line 750

def sparse
  @sparse
end

Class Method Details

.decode(elename, type, arytype) ⇒ Object



952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
# File 'lib/soap/baseData.rb', line 952

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



778
779
780
781
782
783
784
# File 'lib/soap/baseData.rb', line 778

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

  retrieve(idxary)
end

#[]=(*idxary) ⇒ Object



786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
# File 'lib/soap/baseData.rb', line 786

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



774
775
776
# File 'lib/soap/baseData.rb', line 774

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

#deep_map(ary, &block) ⇒ Object



836
837
838
839
840
841
842
843
844
845
846
# File 'lib/soap/baseData.rb', line 836

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



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

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

#include?(var) ⇒ Boolean

Returns:

  • (Boolean)


848
849
850
851
852
853
854
855
# File 'lib/soap/baseData.rb', line 848

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

#positionObject



888
889
890
# File 'lib/soap/baseData.rb', line 888

def position
  @position
end

#replaceObject



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

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

#soap2array(ary) ⇒ Object



867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
# File 'lib/soap/baseData.rb', line 867

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



826
827
828
# File 'lib/soap/baseData.rb', line 826

def to_a
  @data.dup
end

#traverseObject



857
858
859
860
861
862
863
864
865
# File 'lib/soap/baseData.rb', line 857

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