SOAP::SOAPArray (Class)

In: soap/baseData.rb
Parent: XSD::NSDBase

Methods

[]   []=   add   decode   deep_map   each   include?   new   offset=   position   replace   soap2array   to_a   traverse  

Constants

TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$')

Attributes

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

Included Modules

SOAPCompoundtype Enumerable

Public Class methods

Module function

[Source]

# File soap/baseData.rb, line 740
  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

[Source]

# File soap/baseData.rb, line 553
  def initialize(type = nil, rank = 1, arytype = nil)
    super(type || XSD::QName.new)
    @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

Public Instance methods

[Source]

# File soap/baseData.rb, line 574
  def [](*idxary)
    if idxary.size != @rank
      raise ArgumentError.new("Given #{ idxary.size } params does not match rank: #{ @rank }")
    end

    retrieve(idxary)
  end

[Source]

# File soap/baseData.rb, line 582
  def []=(*idxary)
    value = idxary.slice!(-1)

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

    for i in 0..(idxary.size - 1)
      if idxary[i] + 1 > @size[i]
        @size[i] = idxary[i] + 1
      end
    end

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

    if value.is_a?(SOAPType)
      value.elename = value.elename.dup_name('item')
      
      # Sync type

      unless @type.name
        @type = XSD::QName.new(value.type.namespace,
          SOAPArray.create_arytype(value.type.name, @rank))
      end

      unless value.type
        value.type = @type
      end
    end

    @offset = idxary
    offsetnext
  end

[Source]

# File soap/baseData.rb, line 570
  def add(value)
    self[*(@offset)] = value
  end

[Source]

# File soap/baseData.rb, line 632
  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 = new_obj.elename.dup_name('item')
        new_obj
      end
    end
  end

[Source]

# File soap/baseData.rb, line 616
  def each
    @data.each do |data|
      yield(data)
    end
  end

[Source]

# File soap/baseData.rb, line 644
  def include?(var)
    traverse_data(@data) do |v, *rank|
      if v.is_a?(SOAPBasetype) && v.data == var
        return true
      end
    end
    false
  end

[Source]

# File soap/baseData.rb, line 565
  def offset=(var)
    @offset = var
    @sparse = true
  end

[Source]

# File soap/baseData.rb, line 682
  def position
    @position
  end

[Source]

# File soap/baseData.rb, line 626
  def replace
    @data = deep_map(@data) do |ele|
      yield(ele)
    end
  end

[Source]

# File soap/baseData.rb, line 663
  def soap2array(ary)
    traverse_data(@data) do |v, *position|
      iteary = ary
      for rank in 1..(position.size - 1)
        idx = position[rank - 1]
        if iteary[idx].nil?
          iteary = iteary[idx] = Array.new
        else
          iteary = iteary[idx]
        end
      end
      if block_given?
        iteary[position.last] = yield(v)
      else
        iteary[position.last] = v
      end
    end
  end

[Source]

# File soap/baseData.rb, line 622
  def to_a
    @data.dup
  end

[Source]

# File soap/baseData.rb, line 653
  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

[Validate]