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

Changeset 1444

Show
Ignore:
Timestamp:
02/11/05 12:56:47 (4 years ago)
Author:
nahi
Message:

support '-' in element name. half fix of #47 (attribute name is not supported yet).

Files:

Legend:

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

    r1373 r1444  
    3939  def setiv2soap(node, obj, map) 
    4040    # should we sort instance_variables? 
     41    if obj.class.class_variables.include?('@@schema_element') 
     42      elements = obj.class.class_eval('@@schema_element') 
     43    end 
    4144    obj.instance_variables.each do |var| 
    4245      name = var.sub(/^@/, '') 
    43       node.add(Mapping.name2elename(name), 
    44         Mapping._obj2soap(obj.instance_variable_get(var), map)) 
     46      if elements 
     47        type, qname = elements[name] 
     48        if qname 
     49          elename = qname.name 
     50        end 
     51      end 
     52      elename ||= Mapping.name2elename(name) 
     53      node.add(elename, Mapping._obj2soap(obj.instance_variable_get(var), map)) 
    4554    end 
    4655  end 
     
    6978      vars[Mapping.elename2name(name)] = Mapping._soap2obj(value, map) 
    7079    end 
    71     Mapping.set_instance_vars(obj, vars) 
     80    Mapping.set_attributes(obj, vars) 
    7281  end 
    7382end 
  • trunk/lib/soap/mapping/mapping.rb

    r1420 r1444  
    158158  end 
    159159 
    160   def self.set_instance_vars(obj, values) 
    161     values.each do |name, value| 
    162       setter = name + "=" 
    163       if obj.respond_to?(setter) 
    164         obj.__send__(setter, value) 
    165       else 
    166         obj.instance_variable_set('@' + name, value) 
    167       end 
    168     end 
    169   end 
    170  
    171160  # Allow only (Letter | '_') (Letter | Digit | '-' | '_')* here. 
    172161  # Caution: '.' is not allowed here. 
     
    244233  end 
    245234 
    246   def self.find_attribute(obj, attr_name) 
     235  def self.get_attribute(obj, attr_name) 
    247236    if obj.is_a?(::Hash) 
    248237      obj[attr_name] || obj[attr_name.intern] 
     
    255244      end 
    256245    end 
     246  end 
     247 
     248  def self.set_attributes(obj, values) 
     249    values.each do |attr_name, value| 
     250      name = XSD::CodeGen::GenSupport.safevarname(attr_name) 
     251      setter = name + "=" 
     252      if obj.respond_to?(setter) 
     253        obj.__send__(setter, value) 
     254      else 
     255        obj.instance_variable_set('@' + name, value) 
     256      end 
     257    end 
     258  end 
     259 
     260  def self.schema_element_definition(klass) 
     261    elements = {} 
     262    as_array = [] 
     263    klass.class_eval('@@schema_element').each do |varname, definition| 
     264      class_name, name = definition 
     265      if /\[\]$/ =~ class_name 
     266        class_name = class_name.sub(/\[\]$/, '') 
     267        as_array << class_name 
     268      end 
     269      elements[name] = class_name 
     270    end 
     271    [elements, as_array] 
     272  end 
     273 
     274  def self.schema_attribute_definition(klass) 
     275    klass.class_eval('@@schema_attribute') 
    257276  end 
    258277 
  • trunk/lib/soap/mapping/registry.rb

    r1426 r1444  
    438438      vars[name] = Mapping._soap2obj(value, self) 
    439439    end 
    440     Mapping.set_instance_vars(obj, vars) 
     440    Mapping.set_attributes(obj, vars) 
    441441  end 
    442442 
  • trunk/lib/soap/mapping/wsdlencodedregistry.rb

    r1438 r1444  
    169169    elements.each do |element| 
    170170      name = element.name.name 
    171       child_obj = obj.instance_variable_get('@' + name) 
     171      child_obj = Mapping.get_attribute(obj, name) 
    172172      soap_obj.add(name, 
    173173        Mapping._obj2soap(child_obj, self, element.type || element.name)) 
  • trunk/lib/soap/mapping/wsdlliteralregistry.rb

    r1438 r1444  
    3131    @rubytype_factory = RubytypeFactory.new(:allow_original_mapping => false) 
    3232    @schema_element_cache = {} 
     33    @schema_attribute_cache = {} 
    3334  end 
    3435 
     
    8586      o = SOAPElement.new(ele.name) 
    8687      ele.local_complextype.each_element do |child_ele| 
    87         o.add(_obj2soap(Mapping.find_attribute(obj, child_ele.name.name), 
     88        o.add(_obj2soap(Mapping.get_attribute(obj, child_ele.name.name), 
    8889          child_ele)) 
    8990      end 
     
    116117    o = SOAPElement.new(type.name) 
    117118    type.each_element do |child_ele| 
    118       o.add(_obj2soap(Mapping.find_attribute(obj, child_ele.name.name), 
     119      o.add(_obj2soap(Mapping.get_attribute(obj, child_ele.name.name), 
    119120        child_ele)) 
    120121    end 
     
    142143    elements, as_array = schema_element_definition(obj.class) 
    143144    elements.each do |elename, type| 
    144       child = Mapping.find_attribute(obj, elename) 
    145       name = ::XSD::QName.new(nil, elename) 
     145      child = Mapping.get_attribute(obj, elename) 
     146      name = XSD::QName.new(nil, elename) 
    146147      if as_array.include?(type) 
    147148        child.each do |item| 
     
    158159    if attributes 
    159160      attributes.each do |attrname, param| 
    160         attr = Mapping.find_attribute(obj, 'attr_' + attrname) 
     161        attr = Mapping.get_attribute(obj, 'attr_' + attrname) 
    161162        ele.extraattr[attrname] = attr 
    162163      end 
     
    166167  def base2soap(obj, type) 
    167168    soap_obj = nil 
    168     if type <= ::XSD::XSDString 
    169       soap_obj = type.new(::XSD::Charset.is_ces(obj, $KCODE) ? 
    170         ::XSD::Charset.encoding_conv(obj, $KCODE, ::XSD::Charset.encoding) : 
     169    if type <= XSD::XSDString 
     170      soap_obj = type.new(XSD::Charset.is_ces(obj, $KCODE) ? 
     171        XSD::Charset.encoding_conv(obj, $KCODE, XSD::Charset.encoding) : 
    171172        obj) 
    172173    else 
     
    190191  def soapele2obj(node, obj_class = nil) 
    191192    unless obj_class 
    192       typestr = ::XSD::CodeGen::GenSupport.safeconstname(node.elename.name) 
     193      typestr = XSD::CodeGen::GenSupport.safeconstname(node.elename.name) 
    193194      obj_class = Mapping.class_from_name(typestr) 
    194195    end 
     
    237238      end 
    238239    end 
    239     Mapping.set_instance_vars(obj, vars) 
     240    Mapping.set_attributes(obj, vars) 
    240241  end 
    241242 
    242243  def add_attributes2obj(node, obj) 
    243     Mapping.set_instance_vars(obj, {'__soap_attribute' => {}}) 
     244    Mapping.set_attributes(obj, {'__soap_attribute' => {}}) 
    244245    vars = {} 
    245246    attributes = schema_attribute_definition(obj.class) 
    246247    if attributes 
    247248      attributes.each do |attrname, class_name| 
    248         attr = node.extraattr[::XSD::QName.new(nil, attrname)] 
     249        attr = node.extraattr[XSD::QName.new(nil, attrname)] 
    249250        next if attr.nil? or attr.empty? 
    250251        klass = Mapping.class_from_name(class_name) 
     
    257258      end 
    258259    end 
    259     Mapping.set_instance_vars(obj, vars) 
     260    Mapping.set_attributes(obj, vars) 
    260261  end 
    261262 
     
    263264  # changed while a lifetime of a WSDLLiteralRegistry. 
    264265  def schema_element_definition(klass) 
    265     if @schema_element_cache.key?(klass) 
    266       return @schema_element_cache[klass] 
    267     end 
    268     elements = {} 
    269     as_array = [] 
    270     klass.class_eval('@@schema_element').each do |name, class_name| 
    271       if /\[\]$/ =~ class_name 
    272         class_name = class_name.sub(/\[\]$/, '') 
    273         as_array << class_name 
    274       end 
    275       elements[name] = class_name 
    276     end 
    277     @schema_element_cache[klass] = [elements, as_array] 
    278     return @schema_element_cache[klass] 
     266    @schema_element_cache[klass] ||= Mapping.schema_element_definition(klass) 
    279267  end 
    280268 
    281269  def schema_attribute_definition(klass) 
    282     klass.class_eval('@@schema_attribute'
     270    @schema_attribute_cache[klass] ||= Mapping.schema_attribute_definition(klass
    283271  end 
    284272end 
  • trunk/test/wsdl/ref/expectedProduct.rb

    r1431 r1444  
    88# urn:product 
    99class ProductBag 
    10   @@schema_type = "ProductBag" 
     10  @@schema_type = "Product-Bag" 
    1111  @@schema_ns = "urn:product" 
    1212  @@schema_attribute = {"version" => "SOAP::SOAPString", "yesno" => "SOAP::SOAPString"} 
    13   @@schema_element = {"bag" => "Product[]", "Rating" => "SOAP::SOAPString[]", "ProductBag" => nil, "comment_1" => nil, "comment_2" => "Comment[]"
     13  @@schema_element = {"bag" => "Product[]", "rating" => ["SOAP::SOAPString[]", XSD::QName.new("urn:product", "Rating")], "product_Bag" => [nil, XSD::QName.new("urn:product", "Product-Bag")], "comment_1" => nil, "comment_2" => ["Comment[]", XSD::QName.new(nil, "comment-2")]
    1414 
    1515  attr_accessor :bag 
     16  attr_accessor :product_Bag 
    1617  attr_accessor :comment_1 
    1718  attr_accessor :comment_2 
     
    2324  def Rating=(value) 
    2425    @rating = value 
    25   end 
    26  
    27   def ProductBag 
    28     @productBag 
    29   end 
    30  
    31   def ProductBag=(value) 
    32     @productBag = value 
    3326  end 
    3427 
     
    4942  end 
    5043 
    51   def initialize(bag = [], rating = [], productBag = nil, comment_1 = [], comment_2 = []) 
     44  def initialize(bag = [], rating = [], product_Bag = nil, comment_1 = [], comment_2 = []) 
    5245    @bag = bag 
    5346    @rating = rating 
    54     @productBag = productBag 
     47    @product_Bag = product_Bag 
    5548    @comment_1 = comment_1 
    5649    @comment_2 = comment_2 
     
    7366  @@schema_type = "Product" 
    7467  @@schema_ns = "urn:product" 
    75   @@schema_element = {"name" => "SOAP::SOAPString", "Rating" => "SOAP::SOAPString"
     68  @@schema_element = {"name" => "SOAP::SOAPString", "rating" => ["SOAP::SOAPString", XSD::QName.new("urn:product", "Rating")]
    7669 
    7770  attr_accessor :name 
  • trunk/test/wsdl/ref/product.wsdl

    r1443 r1444  
    5151      </element> 
    5252 
    53       <element name="ProductBag"> 
     53      <element name="Product-Bag"> 
    5454        <complexType> 
    5555          <sequence> 
    5656            <element name="bag" type="tns:Product" minOccurs="0" maxOccurs="unbounded"/> 
    5757            <element ref="tns:Rating" minOccurs="0" maxOccurs="unbounded"/> 
    58             <element ref="tns:ProductBag"/> 
     58            <element ref="tns:Product-Bag"/> 
    5959            <element name="comment_1" minOccurs="0" maxOccurs="unbounded"> 
    6060              <complexType> 
     
    6666              </complexType> 
    6767            </element> 
    68             <element name="comment_2" type="tns:Comment" minOccurs="0" maxOccurs="unbounded"/> 
     68            <element name="comment-2" type="tns:Comment" minOccurs="0" maxOccurs="unbounded"/> 
    6969          </sequence> 
    7070          <attribute ref="tns:version"/>