Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 1468

Show
Ignore:
Timestamp:
04/14/05 16:40:52 (4 years ago)
Author:
nahi
Message:

SOAPElement <-> obj: allow multiple child elements which has the same name.
closes #87.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/baseData.rb

    r1459 r1468  
    445445  def to_obj 
    446446    hash = {} 
     447    proptype = {} 
    447448    each do |k, v| 
    448       hash[k] = v.respond_to?(:to_obj) ? v.to_obj : v.to_s 
     449      value = v.respond_to?(:to_obj) ? v.to_obj : v.to_s 
     450      case proptype[k] 
     451      when :single 
     452        hash[k] = [hash[k], value] 
     453        proptype[k] = :multi 
     454      when :multi 
     455        hash[k] << value 
     456      else 
     457        hash[k] = value 
     458        proptype[k] = :single 
     459      end 
    449460    end 
    450461    hash 
     
    557568    else 
    558569      hash = {} 
     570      proptype = {} 
    559571      each do |k, v| 
    560         hash[k] = v.respond_to?(:to_obj) ? v.to_obj : v.to_s 
     572        value = v.respond_to?(:to_obj) ? v.to_obj : v.to_s 
     573        case proptype[k] 
     574        when :single 
     575          hash[k] = [hash[k], value] 
     576          proptype[k] = :multi 
     577        when :multi 
     578          hash[k] << value 
     579        else 
     580          hash[k] = value 
     581          proptype[k] = :single 
     582        end 
    561583      end 
    562584      hash 
     
    575597  end 
    576598 
    577   def self.from_obj(hash_or_string, namespace = nil) 
     599  def self.from_obj(obj, namespace = nil) 
    578600    o = SOAPElement.new(nil) 
    579     case hash_or_string 
     601    case obj 
    580602    when nil 
    581603      o.text = nil 
    582604    when Hash 
    583       hash_or_string.each do |k, v| 
    584         child = self.from_obj(v, namespace) 
    585         child.elename = 
    586           k.is_a?(XSD::QName) ? k : XSD::QName.new(namespace, k.to_s) 
    587         o.add(child) 
     605      obj.each do |elename, value| 
     606        if value.is_a?(Array) 
     607          value.each do |subvalue| 
     608            child = from_obj(subvalue, namespace) 
     609            child.elename = to_elename(elename, namespace) 
     610            o.add(child) 
     611          end 
     612        else 
     613          child = from_obj(value, namespace) 
     614          child.elename = to_elename(elename, namespace) 
     615          o.add(child) 
     616        end 
    588617      end 
    589618    else 
    590       o.text = hash_or_string.to_s 
     619      o.text = obj.to_s 
    591620    end 
    592621    o 
     622  end 
     623 
     624  def self.to_elename(obj, namespace = nil) 
     625    if obj.is_a?(XSD::QName) 
     626      obj 
     627    elsif /\A(.+):([^:]+)\z/ =~ obj.to_s 
     628      XSD::QName.new($1, $2) 
     629    else 
     630      XSD::QName.new(namespace, obj.to_s) 
     631    end 
    593632  end 
    594633