class SOAP::SOAPArray

Constants

ITEM_NAME
TypeParseRegexp

Attributes

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

Public Class Methods

new(type = nil, rank = 1, arytype = nil) click to toggle source
Calls superclass method SOAP::SOAPCompoundtype.new
# File lib/soap/baseData.rb, line 865
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

Private Class Methods

create_arytype(typename, rank) click to toggle source
# File lib/soap/baseData.rb, line 1076
def self.create_arytype(typename, rank)
  "#{typename}[" << ',' * (rank - 1) << ']'
end
decode(elename, type, arytype) click to toggle source
# File lib/soap/baseData.rb, line 1054
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
parse_type(string) click to toggle source
# File lib/soap/baseData.rb, line 1082
def self.parse_type(string)
  TypeParseRegexp =~ string
  return $1, $2
end

Public Instance Methods

[](*idxary) click to toggle source
# File lib/soap/baseData.rb, line 891
def [](*idxary)
  if idxary.size != @rank
    raise ArgumentError.new("given #{idxary.size} params does not match rank: #{@rank}")
  end
  retrieve(idxary)
end
[]=(*idxary) click to toggle source
# File lib/soap/baseData.rb, line 898
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) click to toggle source
# File lib/soap/baseData.rb, line 883
def add(value)
  self[*(@offset)] = value
end
deep_map(ary, &block) click to toggle source
# File lib/soap/baseData.rb, line 942
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
each() { |data| ... } click to toggle source
# File lib/soap/baseData.rb, line 926
def each
  @data.each do |data|
    yield(data)
  end
end
have_member() click to toggle source
# File lib/soap/baseData.rb, line 887
def have_member
  !@data.empty?
end
include?(var) click to toggle source
# File lib/soap/baseData.rb, line 954
def include?(var)
  traverse_data(@data) do |v, *rank|
    if v.is_a?(SOAPBasetype) && v.data == var
      return true
    end
  end
  false
end
offset=(var) click to toggle source
# File lib/soap/baseData.rb, line 878
def offset=(var)
  @offset = var
  @sparse = true
end
position() click to toggle source
# File lib/soap/baseData.rb, line 994
def position
  @position
end
replace() { |ele| ... } click to toggle source
# File lib/soap/baseData.rb, line 936
def replace
  @data = deep_map(@data) do |ele|
    yield(ele)
  end
end
soap2array(ary) { |v| ... } click to toggle source
# File lib/soap/baseData.rb, line 973
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_a() click to toggle source
# File lib/soap/baseData.rb, line 932
def to_a
  @data.dup
end
traverse() { |v| ... } click to toggle source
# File lib/soap/baseData.rb, line 963
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

Private Instance Methods

offsetnext() click to toggle source
# File lib/soap/baseData.rb, line 1036
def offsetnext
  move = false
  idx = @offset.size - 1
  while !move && idx >= 0
    @offset[idx] += 1
    if @size_fixed
      if @offset[idx] < @size[idx]
        move = true
      else
        @offset[idx] = 0
        idx -= 1
      end
    else
      move = true
    end
  end
end
ranksize(rank) click to toggle source
# File lib/soap/baseData.rb, line 1032
def ranksize(rank)
  @size[rank - 1]
end
retrieve(idxary) click to toggle source
# File lib/soap/baseData.rb, line 1002
def retrieve(idxary)
  data = @data
  rank = 1
  while rank <= idxary.size
    idx = idxary[rank - 1]
    if data[idx].nil?
      data = data[idx] = Array.new
    else
      data = data[idx]
    end
    rank += 1
  end
  data
end
traverse_data(data, rank = 1) { |*v| ... } click to toggle source
# File lib/soap/baseData.rb, line 1017
def traverse_data(data, rank = 1)
  idx = 0
  while idx < ranksize(rank)
    if rank < @rank and data[idx]
      traverse_data(data[idx], rank + 1) do |*v|
        v[1, 0] = idx
        yield(*v)
      end
    else
      yield(data[idx], idx)
    end
    idx += 1
  end
end