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

Changeset 1895

Show
Ignore:
Timestamp:
07/21/07 12:57:01 (1 year ago)
Author:
nahi
Message:
Files:

Legend:

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

    r1824 r1895  
    5757  def soap2obj(node, obj_class = nil) 
    5858    begin 
    59       return any2obj(node, obj_class) 
     59      unless obj_class 
     60        typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name) 
     61        obj_class = Mapping.class_from_name(typestr) 
     62      end 
     63      return Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class) 
    6064    rescue MappingError 
    6165    end 
     
    199203    end 
    200204  end 
    201  
    202   def any2obj(node, obj_class) 
    203     unless obj_class 
    204       typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name) 
    205       obj_class = Mapping.class_from_name(typestr) 
    206     end 
    207     if obj_class and obj_class.class_variables.include?('@@schema_element') 
    208       soap2stubobj(node, obj_class) 
    209     else 
    210       Mapping._soap2obj(node, Mapping::DefaultRegistry, obj_class) 
    211     end 
    212   end 
    213  
    214   def soap2stubobj(node, obj_class) 
    215     obj = Mapping.create_empty_object(obj_class) 
    216     unless node.is_a?(SOAPNil) 
    217       add_elements2stubobj(node, obj) 
    218     end 
    219     obj 
    220   end 
    221  
    222   def add_elements2stubobj(node, obj) 
    223     definition = Mapping.schema_definition_classdef(obj.class) 
    224     vars = {} 
    225     node.each do |name, value| 
    226       item = definition.elements.find { |k, v| k.elename == value.elename } 
    227       if item and item.mapped_class 
    228         # klass must be a SOAPBasetype or a class 
    229         if item.mapped_class.include?(::SOAP::SOAPBasetype) 
    230           if value.respond_to?(:data) 
    231             child = item.mapped_class.new(value.data).data 
    232           else 
    233             child = item.mapped_class.new(nil).data 
    234           end 
    235         else 
    236           child = Mapping._soap2obj(value, self, item.mapped_class) 
    237         end 
    238       else      # untyped element is treated as anyType. 
    239         child = Mapping._soap2obj(value, self) 
    240       end 
    241       if item and item.as_array? 
    242         (vars[name] ||= []) << child 
    243       else 
    244         vars[name] = child 
    245       end 
    246     end 
    247     Mapping.set_attributes(obj, vars) 
    248   end 
    249205end 
    250206 
  • trunk/lib/soap/mapping/wsdlliteralregistry.rb

    r1878 r1895  
    5353  # node should be a SOAPElement 
    5454  def soap2obj(node, obj_class = nil) 
    55     # obj_class is given when rpc/literal service.  but ignored for now. 
    5655    begin 
    5756      return any2obj(node, obj_class) 
  • trunk/lib/wsdl/soap/cgiStubCreator.rb

    r1824 r1895  
    4848  def dump_porttype(name) 
    4949    class_name = create_class_name(name, @modulepath) 
    50     result = MethodDefCreator.new(@definitions, @modulepath).dump(name) 
     50    defined_const = {} 
     51    result = MethodDefCreator.new(@definitions, @modulepath, defined_const).dump(name) 
    5152    methoddef = result[:methoddef] 
    5253    wsdl_name = @definitions.name ? @definitions.name.name : 'default' 
     
    5960] 
    6061    EOD 
     62    defined_const.each do |ns, tag| 
     63      c1.def_const(tag, dq(ns)) 
     64    end 
    6165    c2 = XSD::CodeGen::ClassDef.new(class_name + "App", 
    6266      "::SOAP::RPC::CGIStub") 
  • trunk/lib/wsdl/soap/classDefCreatorSupport.rb

    r1891 r1895  
    8989  end 
    9090 
     91  def assign_const(value, prefix = '') 
     92    return if value.nil? or @defined_const.key?(value) 
     93    name = value.scan(/[^:\/]+\/?\z/)[0] || 'C' 
     94    tag = prefix + safeconstname(name) 
     95    if @defined_const.value?(tag) 
     96      idx = 0 
     97      while true 
     98        tag = prefix + safeconstname(name + "_#{idx}") 
     99        break unless @defined_const.value?(tag) 
     100        idx += 1 
     101        raise RuntimeError.new("too much similar names") if idx > 100 
     102      end 
     103    end 
     104    @defined_const[value] = tag 
     105  end 
     106 
    91107  def create_type_name(element) 
    92108    if element.type == XSD::AnyTypeName 
  • trunk/lib/wsdl/soap/driverCreator.rb

    r1824 r1895  
    2929 
    3030  def dump(porttype = nil) 
    31     result = '' 
     31    result = "require 'soap/rpc/driver'\n\n" 
    3232    if @modulepath 
    33       result << "\n" 
    3433      @modulepath.each do |name| 
    3534        result << "module #{name}\n" 
    3635      end 
     36      result << "\n" 
    3737    end 
    3838    if porttype.nil? 
     
    5757  def dump_porttype(porttype) 
    5858    class_name = create_class_name(porttype) 
    59     result = MethodDefCreator.new(@definitions, @modulepath).dump(porttype) 
     59    defined_const = {} 
     60    result = MethodDefCreator.new(@definitions, @modulepath, defined_const).dump(porttype) 
    6061    methoddef = result[:methoddef] 
    6162    binding = @definitions.bindings.find { |item| item.type == porttype } 
     
    6768 
    6869    c = XSD::CodeGen::ClassDef.new(class_name, "::SOAP::RPC::Driver") 
    69     c.def_require("soap/rpc/driver") 
    7070    c.def_const("DefaultEndpointUrl", ndq(address)) 
    7171    c.def_code <<-EOD 
     
    102102      EOD 
    103103    end 
     104    defined_const.each do |ns, tag| 
     105      c.def_const(tag, dq(ns)) 
     106    end 
    104107    c.dump 
    105108  end 
  • trunk/lib/wsdl/soap/encodedMappingRegistryCreator.rb

    r1891 r1895  
    8989    parsed_element = parse_elements(typedef.elements, qname.namespace) 
    9090    var[:schema_element] = dump_schema_element_definition(parsed_element, 2) 
     91    assign_const(var[:schema_ns], 'Ns') 
    9192    dump_entry(@varname, var) 
    9293  end 
     
    111112    var[:schema_ns] = qname.namespace 
    112113    var[:schema_type] = qname.name 
     114    assign_const(var[:schema_ns], 'Ns') 
    113115    dump_entry(@varname, var) 
    114116  end 
  • trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb

    r1891 r1895  
    142142      var[:schema_attribute] = define_attribute(typedef.attributes) 
    143143    end 
     144    assign_const(var[:schema_ns], 'Ns') 
    144145    dump_entry(@varname, var) 
    145146  end 
     
    187188    parsed_element << [child_element_name.name, child_element_name, type, occurrence] 
    188189    var[:schema_element] = dump_schema_element_definition(parsed_element, 2) 
     190    assign_const(var[:schema_ns], 'Ns') 
    189191    dump_entry(@varname, var) 
    190192  end 
     
    206208      var[:schema_attribute] = define_attribute(type_or_element.attributes) 
    207209    end 
     210    assign_const(var[:schema_ns], 'Ns') 
    208211    dump_entry(@varname, var) 
    209212  end 
  • trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb

    r1891 r1895  
    5454      ndq(type) 
    5555    end 
    56   end 
    57  
    58   def assign_const(value, prefix = '') 
    59     return if value.nil? or @defined_const.key?(value) 
    60     name = value.scan(/[^:\/]+\z/)[0] || '' 
    61     tag = prefix + safeconstname(name) 
    62     if @defined_const.value?(tag) 
    63       idx = 0 
    64       while true 
    65         tag = prefix + safeconstname(name + "_#{idx}") 
    66         break unless @defined_const.value?(tag) 
    67         idx += 1 
    68         raise RuntimeError.new("too much similar names") if idx > 100 
    69       end 
    70     end 
    71     @defined_const[value] = tag 
    7256  end 
    7357 
  • trunk/lib/wsdl/soap/methodDefCreator.rb

    r1861 r1895  
    2121  attr_reader :definitions 
    2222 
    23   def initialize(definitions, modulepath
     23  def initialize(definitions, modulepath, defined_const
    2424    @definitions = definitions 
    2525    @modulepath = modulepath 
     
    3030    @encoded = false 
    3131    @literal = false 
     32    @defined_const = defined_const 
    3233  end 
    3334 
     
    139140    end 
    140141    if style == :rpc 
     142      assign_const(qname.namespace, 'Ns') 
    141143      return <<__EOD__ 
    142 [ #{qname.dump}, 
     144[ #{dqname(qname)}, 
    143145  #{definitions}] 
    144146__EOD__ 
     
    159161    elsif definedtype = @complextypes[part.type] 
    160162      case definedtype.compoundtype 
    161       when :TYPE_STRUCT, :TYPE_EMPTY    # ToDo: empty should be treated as void. 
    162         type = create_class_name(part.type, @modulepath) 
    163         [type, part.type.namespace, part.type.name] 
    164       when :TYPE_ARRAY 
    165         arytype = definedtype.find_arytype || XSD::AnyTypeName 
    166         arytypename = arytype.name.sub(/\[(?:,)*\]$/, '') 
    167         arytypedef = create_class_name(XSD::QName.new(nil, arytypename), @modulepath) 
    168         [arytypedef + '[]', part.type.namespace, part.type.name] 
    169       when :TYPE_SIMPLE 
     163      when :TYPE_STRUCT, :TYPE_EMPTY, :TYPE_ARRAY, :TYPE_SIMPLE 
    170164        type = create_class_name(part.type, @modulepath) 
    171165        [type, part.type.namespace, part.type.name] 
  • trunk/lib/wsdl/soap/standaloneServerStubCreator.rb

    r1824 r1895  
    4949  def dump_porttype(name) 
    5050    class_name = create_class_name(name, @modulepath) 
    51     result = MethodDefCreator.new(@definitions, @modulepath).dump(name) 
     51    defined_const = {} 
     52    result = MethodDefCreator.new(@definitions, @modulepath, defined_const).dump(name) 
    5253    methoddef = result[:methoddef] 
    5354 
     
    6263] 
    6364    EOD 
     65    defined_const.each do |ns, tag| 
     66      c1.def_const(tag, dq(ns)) 
     67    end 
    6468    c2 = XSD::CodeGen::ClassDef.new(class_name + "App", 
    6569      "::SOAP::RPC::StandaloneServer")