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

Changeset 1655

Show
Ignore:
Timestamp:
10/30/05 22:10:25 (3 years ago)
Author:
nahi
Message:

added <choice/> support. closes #168.

Files:

Legend:

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

    r1650 r1655  
    348348    return nil unless schema_element 
    349349    schema_ns = schema_ns_definition(klass) 
    350     elements = [] 
    351     as_array = [] 
    352     have_any = false 
    353     schema_element.each do |varname, definition| 
    354       class_name, name = definition 
    355       if /\[\]$/ =~ class_name 
    356         class_name = class_name.sub(/\[\]$/, '') 
    357         as_array << (name ? name.name : varname) 
    358       end 
    359       if name == XSD::AnyTypeName 
    360         have_any = true 
    361       end 
    362       elements << 
    363         [name || XSD::QName.new(schema_ns, varname), class_name] 
    364     end 
    365     [elements, as_array, have_any] 
     350    parse_schema_element_definition(schema_ns, schema_element) 
     351  end 
     352 
     353  class SchemaElementDefinition 
     354    attr_reader :elename, :type 
     355 
     356    def initialize(elename, type, as_array) 
     357      @elename = elename 
     358      @type = type 
     359      @as_array = as_array 
     360    end 
     361 
     362    def as_array? 
     363      @as_array 
     364    end 
     365  end 
     366 
     367  class SchemaDefinition 
     368    attr_reader :elements 
     369 
     370    def initialize(*arg) 
     371      super 
     372      @elements = [] 
     373      @choice = false 
     374      @any = false 
     375    end 
     376 
     377    def choice? 
     378      @choice 
     379    end 
     380 
     381    def have_any? 
     382      @any 
     383    end 
     384 
     385    def set_choice 
     386      @choice = true 
     387    end 
     388 
     389    def set_any 
     390      @any = true 
     391    end 
    366392  end 
    367393 
     
    372398  class << Mapping 
    373399  private 
     400 
     401    def parse_schema_element_definition(schema_ns, schema_element) 
     402      definition = SchemaDefinition.new 
     403      if schema_element[0] == :choice 
     404        schema_element.shift 
     405        definition.set_choice 
     406      end 
     407      schema_element.each do |element| 
     408        varname, info = element 
     409        class_name, name = info 
     410        as_array = false 
     411        if /\[\]$/ =~ class_name 
     412          class_name = class_name.sub(/\[\]$/, '') 
     413          as_array = true 
     414        end 
     415        if name == XSD::AnyTypeName 
     416          definition.set_any 
     417        end 
     418        definition.elements << SchemaElementDefinition.new( 
     419          name || XSD::QName.new(schema_ns, varname), class_name, as_array) 
     420      end 
     421      definition 
     422    end 
    374423 
    375424    def class_schema_variable(sym, klass) 
  • trunk/lib/soap/mapping/wsdlencodedregistry.rb

    r1652 r1655  
    233233 
    234234  def add_elements2stubobj(node, obj) 
    235     elements, as_array = schema_element_definition(obj.class) 
     235    definition = schema_element_definition(obj.class) 
    236236    vars = {} 
    237237    node.each do |name, value| 
    238       item = elements.find { |k, v| k.name == name } 
     238      item = definition.elements.find { |k, v| k.elename.name == name } 
    239239      if item 
    240         elename, class_name = item 
    241         if klass = Mapping.class_from_name(class_name) 
     240        if klass = Mapping.class_from_name(item.type) 
    242241          # klass must be a SOAPBasetype or a class 
    243242          if klass.ancestors.include?(::SOAP::SOAPBasetype) 
     
    250249            child = Mapping._soap2obj(value, self, klass) 
    251250          end 
    252         elsif klass = Mapping.module_from_name(class_name) 
     251        elsif klass = Mapping.module_from_name(item.type) 
    253252          # simpletype 
    254253          if value.respond_to?(:data) 
    255254            child = value.data 
    256255          else 
    257             raise MappingError.new( 
    258               "cannot map to a module value: #{class_name}") 
     256            raise MappingError.new("cannot map to a module value: #{item.type}") 
    259257          end 
    260258        else 
    261           raise MappingError.new("unknown class: #{class_name}") 
     259          raise MappingError.new("unknown class: #{item.type}") 
    262260        end 
    263261      else      # untyped element is treated as anyType. 
  • trunk/lib/soap/mapping/wsdlliteralregistry.rb

    r1653 r1655  
    162162    end 
    163163    elements.each do |child_ele| 
    164       break if complexobj2soapchildren(obj, ele, child_ele
     164      break if complexobj2soapchildren(obj, ele, child_ele, true
    165165    end 
    166166    ele 
    167167  end 
    168168 
    169   def complexobj2soapchildren(obj, ele, child_ele
     169  def complexobj2soapchildren(obj, ele, child_ele, allow_nil_value = false
    170170    if child_ele.map_as_array? 
    171171      child = Mapping.get_attribute(obj, child_ele.name.name) 
     
    174174      end 
    175175      if child.nil? 
     176        return false if allow_nil_value 
    176177        if child_soap = nil2soap(child_ele) 
    177178          ele.add(child_soap) 
     
    188189      child = Mapping.get_attribute(obj, child_ele.name.name) 
    189190      if child.nil? 
     191        return false if allow_nil_value 
    190192        if child_soap = nil2soap(child_ele) 
    191193          ele.add(child_soap) 
     
    290292 
    291293  def add_elements2soap(obj, ele) 
    292     elements, as_array, have_any = schema_element_definition(obj.class) 
     294    definition = schema_element_definition(obj.class) 
    293295    any = nil 
    294     if have_any 
    295       any = scan_any(obj, elements) 
    296     end 
    297     if elements 
    298       elements.each do |elename, type| 
    299         if elename == XSD::AnyTypeName 
    300           if any 
    301             SOAPElement.from_objs(any).each do |child| 
    302               ele.add(child) 
    303             end 
    304           end 
    305         elsif child = Mapping.get_attribute(obj, elename.name) 
    306           if as_array.include?(elename.name) 
    307             child.each do |item| 
    308               ele.add(obj2soap(item, elename)) 
    309             end 
    310           else 
    311             ele.add(obj2soap(child, elename)) 
    312           end 
    313         elsif obj.is_a?(::Array) and as_array.include?(elename.name) 
    314           obj.each do |item| 
    315             ele.add(obj2soap(item, elename)) 
    316           end 
     296    if definition.have_any? 
     297      any = scan_any(obj, definition.elements) 
     298    end 
     299    definition.elements.each do |eledef| 
     300      if eledef.elename == XSD::AnyTypeName 
     301        if any 
     302          SOAPElement.from_objs(any).each do |child| 
     303            ele.add(child) 
     304          end 
     305        end 
     306      elsif child = Mapping.get_attribute(obj, eledef.elename.name) 
     307        if eledef.as_array? 
     308          child.each do |item| 
     309            ele.add(obj2soap(item, eledef.elename)) 
     310          end 
     311        else 
     312          ele.add(obj2soap(child, eledef.elename)) 
     313        end 
     314      elsif obj.is_a?(::Array) and eledef.as_array? 
     315        obj.each do |item| 
     316          ele.add(obj2soap(item, eledef.elename)) 
    317317        end 
    318318      end 
     
    384384 
    385385  def add_elesoap2stubobj(node, obj) 
    386     elements, as_array = schema_element_definition(obj.class) 
     386    definition = schema_element_definition(obj.class) 
    387387    vars = {} 
    388388    node.each do |name, value| 
    389       item = elements.find { |k, v| k.name == name } 
     389      item = definition.elements.find { |k, v| k.elename.name == name } 
    390390      if item 
    391         elename, class_name = item 
    392         if klass = Mapping.class_from_name(class_name) 
     391        if klass = Mapping.class_from_name(item.type) 
    393392          # klass must be a SOAPBasetype or a class 
    394393          if klass.ancestors.include?(::SOAP::SOAPBasetype) 
     
    401400            child = any2obj(value, klass) 
    402401          end 
    403         elsif klass = Mapping.module_from_name(class_name) 
     402        elsif klass = Mapping.module_from_name(item.type) 
    404403          # simpletype 
    405404          if value.respond_to?(:data) 
    406405            child = value.data 
    407406          else 
    408             raise MappingError.new( 
    409               "cannot map to a module value: #{class_name}") 
     407            raise MappingError.new("cannot map to a module value: #{item.type}") 
    410408          end 
    411409        else 
    412           raise MappingError.new("unknown class/module: #{class_name}") 
     410          raise MappingError.new("unknown class/module: #{item.type}") 
    413411        end 
    414412      else      # untyped element is treated as anyType. 
    415413        child = any2obj(value) 
    416414      end 
    417       if item and as_array.include?(elename.name) 
     415      if item and item.as_array? 
    418416        (vars[name] ||= []) << child 
    419417      else 
     
    508506  # changed while a lifetime of a WSDLLiteralRegistry. 
    509507  def schema_element_definition(klass) 
    510     @schema_element_cache[klass] ||= 
    511       Mapping.schema_element_definition(klass) 
     508    @schema_element_cache[klass] ||= Mapping.schema_element_definition(klass) 
    512509  end 
    513510 
  • trunk/lib/wsdl/soap/classDefCreator.rb

    r1653 r1655  
    11# WSDL4R - Creating class definition from WSDL 
    2 # Copyright (C) 2002, 2003, 2004  NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 
     2# Copyright (C) 2002, 2003, 2004, 2005  NAKAMURA, Hiroshi <nahi@ruby-lang.org>. 
    33 
    44# This program is copyrighted free software by NAKAMURA, Hiroshi.  You can 
     
    135135    schema_element, init_lines, init_params = 
    136136      parse_elements(c, typedef.elements, qname.namespace) 
     137    if typedef.choice? 
     138      schema_element.unshift(:choice) 
     139    end 
    137140    unless typedef.attributes.empty? 
    138141      define_attribute(c, typedef.attributes) 
     
    140143    end 
    141144    c.def_classvar('schema_element', 
    142       "[\n  " + 
    143         schema_element.collect { |definition| 
    144           dump_schema_element_definition(definition) 
    145         }.join(", \n  ") + 
    146       "\n]" 
     145      dump_schema_element_definition(schema_element, 2) 
    147146    ) 
    148147    c.def_method('initialize', *init_params) do 
     
    152151  end 
    153152 
    154   def dump_schema_element(schema_element) 
    155     schema_element.collect { |definition| 
    156       dump_schema_element_definition(definition) 
    157     }.join(', ') 
    158   end 
    159  
    160   def dump_schema_element_definition(definition) 
    161     if definition[0] == :sequence 
     153  def dump_schema_element_definition(definition, indent = 0) 
     154    return '[]' if definition.empty? 
     155    if definition[0] == :choice 
    162156      definition.shift 
    163       '[ :sequence, ' + dump_schema_element(definition) + ']' 
    164     elsif definition[0] == :choice 
    165       definition.shift 
    166       '[ :choice, ' + dump_schema_element(definition) + ']' 
     157      "[ :choice,\n" + ' ' * indent + 
     158        dump_schema_element(definition, indent) + ']' 
     159    elsif definition[0].is_a?(::Array) 
     160      "[\n" + ' ' * indent + 
     161        dump_schema_element(definition, indent) + ']' 
    167162    else 
    168163      varname, name, type = definition 
     
    177172      ']' 
    178173    end 
     174  end 
     175 
     176  def dump_schema_element(schema_element, indent = 0) 
     177    delimiter = ",\n" + " " * indent 
     178    schema_element.collect { |definition| 
     179      dump_schema_element_definition(definition, indent + 2) 
     180    }.join(delimiter) 
    179181  end 
    180182 
     
    207209        elsif element.type 
    208210          type = create_class_name(element.type) 
     211        elsif element.ref 
     212          type = create_class_name(element.ref) 
    209213        else 
    210214          type = nil      # means anyType. 
     
    229233        end 
    230234        # nil means @@schema_ns + varname 
    231         if element.name && varname == name && 
    232             element.name.namespace == base_namespace 
     235        eleqname = element.name || element.ref.name 
     236        if eleqname && varname == name && eleqname.namespace == base_namespace 
    233237          eleqname = nil 
    234         else 
    235           eleqname = element.name 
    236238        end 
    237239        schema_element << [varname, eleqname, type] 
     
    239241        child_schema_element, child_init_lines, child_init_params = 
    240242          parse_elements(c, element.elements, base_namespace) 
    241         schema_element << [:sequence].concat(child_schema_element) 
     243        schema_element << child_schema_element 
    242244        init_lines.concat(child_init_lines) 
    243245        init_params.concat(child_init_params) 
     
    245247        child_schema_element, child_init_lines, child_init_params = 
    246248          parse_elements(c, element.elements, base_namespace) 
    247         schema_element << [:choice].concat(child_schema_element) 
     249        child_schema_element.unshift(:choice) 
     250        schema_element << child_schema_element 
    248251        init_lines.concat(child_init_lines) 
    249252        init_params.concat(child_init_params) 
  • trunk/test/wsdl/any/expectedEcho.rb

    r1653 r1655  
    66  @@schema_ns = "urn:example.com:echo-type" 
    77  @@schema_element = [ 
    8     ["before", ["SOAP::SOAPString", XSD::QName.new(nil, "before")]],  
    9     ["any", [nil, XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType")]],  
    10     ["after", ["SOAP::SOAPString", XSD::QName.new(nil, "after")]] 
    11   ] 
     8    ["before", ["SOAP::SOAPString", XSD::QName.new(nil, "before")]], 
     9    ["any", [nil, XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType")]], 
     10    ["after", ["SOAP::SOAPString", XSD::QName.new(nil, "after")]]] 
    1211 
    1312  attr_accessor :before 
  • trunk/test/wsdl/marshal/person_org.rb

    r1653 r1655  
    66  @@schema_ns = "http://www.jin.gr.jp/~nahi/xmlns/sample/Person" 
    77  @@schema_element = [ 
    8     ["familyname", ["SOAP::SOAPString", XSD::QName.new(nil, "familyname")]],  
    9     ["givenname", ["SOAP::SOAPString", XSD::QName.new(nil, "givenname")]],  
    10     ["var1", ["SOAP::SOAPInt", XSD::QName.new(nil, "var1")]],  
    11     ["var2", ["SOAP::SOAPDouble", XSD::QName.new(nil, "var2")]],  
    12     ["var3", ["SOAP::SOAPString", XSD::QName.new(nil, "var3")]] 
    13   ] 
     8    ["familyname", ["SOAP::SOAPString", XSD::QName.new(nil, "familyname")]], 
     9    ["givenname", ["SOAP::SOAPString", XSD::QName.new(nil, "givenname")]], 
     10    ["var1", ["SOAP::SOAPInt", XSD::QName.new(nil, "var1")]], 
     11    ["var2", ["SOAP::SOAPDouble", XSD::QName.new(nil, "var2")]], 
     12    ["var3", ["SOAP::SOAPString", XSD::QName.new(nil, "var3")]]] 
    1413 
    1514  attr_accessor :familyname 
  • trunk/test/wsdl/ref/expectedProduct.rb

    r1653 r1655  
    1414  @@schema_attribute = {XSD::QName.new("urn:product", "version") => "SOAP::SOAPString", XSD::QName.new("urn:product", "yesno") => "SOAP::SOAPString"} 
    1515  @@schema_element = [ 
    16     ["bag", ["Product[]", XSD::QName.new(nil, "bag")]],  
    17     ["rating", ["SOAP::SOAPString[]", XSD::QName.new("urn:product", "Rating")]],  
    18     ["product_Bag", [nil, XSD::QName.new("urn:product", "Product-Bag")]],  
    19     ["comment_1", [nil, XSD::QName.new(nil, "comment_1")]],  
    20     ["comment_2", ["Comment[]", XSD::QName.new(nil, "comment-2")]] 
    21   ] 
     16    ["bag", ["Product[]", XSD::QName.new(nil, "bag")]], 
     17    ["rating", ["SOAP::SOAPString[]", XSD::QName.new("urn:product", "Rating")]], 
     18    ["product_Bag", ["ProductBag", XSD::QName.new("urn:product", "Product-Bag")]], 
     19    ["comment_1", [nil, XSD::QName.new(nil, "comment_1")]], 
     20    ["comment_2", ["Comment[]", XSD::QName.new(nil, "comment-2")]]] 
    2221 
    2322  attr_accessor :bag 
     
    6463  @@schema_type = "Creator" 
    6564  @@schema_ns = "urn:product" 
    66   @@schema_element = [ 
    67  
    68   ] 
     65  @@schema_element = [] 
    6966 
    7067  def initialize 
     
    7774  @@schema_ns = "urn:product" 
    7875  @@schema_element = [ 
    79     ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]],  
    80     ["rating", ["SOAP::SOAPString", XSD::QName.new("urn:product", "Rating")]] 
    81   ] 
     76    ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 
     77    ["rating", ["SOAP::SOAPString", XSD::QName.new("urn:product", "Rating")]]] 
    8278 
    8379  attr_accessor :name 
  • trunk/test/wsdl/simpletype/rpc/expectedEchoVersion.rb

    r1653 r1655  
    66  @@schema_ns = "urn:example.com:simpletype-rpc-type" 
    77  @@schema_element = [ 
    8     ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]],  
    9     ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]] 
    10   ] 
     8    ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]], 
     9    ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]]] 
    1110 
    1211  attr_accessor :version 
  • trunk/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb

    r1653 r1655  
    66  @@schema_ns = "urn:example.com:simpletype-rpc-type" 
    77  @@schema_element = [ 
    8     ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]],  
    9     ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]] 
    10   ] 
     8    ["version", ["SOAP::SOAPString", XSD::QName.new(nil, "version")]], 
     9    ["msg", ["SOAP::SOAPString", XSD::QName.new(nil, "msg")]]] 
    1110 
    1211  attr_accessor :version 
  • trunk/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb

    r1653 r1655  
    66  @@schema_ns = "urn:mysample" 
    77  @@schema_element = [ 
    8     ["something", ["SOAP::SOAPString", XSD::QName.new(nil, "something")]] 
    9   ] 
     8    ["something", ["SOAP::SOAPString", XSD::QName.new(nil, "something")]]] 
    109 
    1110  attr_accessor :something 
     
    2120  @@schema_ns = "urn:mysample" 
    2221  @@schema_element = [ 
    23     ["sectionID", ["SOAP::SOAPInt", XSD::QName.new(nil, "sectionID")]],  
    24     ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]],  
    25     ["description", ["SOAP::SOAPString", XSD::QName.new(nil, "description")]],  
    26     ["index", ["SOAP::SOAPInt", XSD::QName.new(nil, "index")]],  
    27     ["firstQuestion", ["Question", XSD::QName.new(nil, "firstQuestion")]] 
    28   ] 
     22    ["sectionID", ["SOAP::SOAPInt", XSD::QName.new(nil, "sectionID")]], 
     23    ["name", ["SOAP::SOAPString", XSD::QName.new(nil, "name")]], 
     24    ["description", ["SOAP::SOAPString", XSD::QName.new(nil, "description")]], 
     25    ["index", ["SOAP::SOAPInt", XSD::QName.new(nil, "index")]], 
     26    ["firstQuestion", ["Question", XSD::QName.new(nil, "firstQuestion")]]] 
    2927 
    3028  attr_accessor :sectionID