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

Changeset 1012

Show
Ignore:
Timestamp:
10/14/03 01:07:13 (5 years ago)
Author:
nahi
Message:

* changed SOAPGenerator interface to allow complex XML attribute (extraattr)

encoding.

Files:

Legend:

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

    r972 r1012  
    4242 
    4343### 
     44## Marker of SOAP/DM types. 
     45# 
     46module SOAPType; end 
     47 
     48 
     49### 
    4450## Mix-in module for SOAP base type instances. 
    4551# 
    4652module SOAPBasetype 
     53  include SOAPType 
    4754  include SOAP 
    4855 
     
    7683# 
    7784module SOAPCompoundtype 
     85  include SOAPType 
    7886  include SOAP 
    7987 
     
    169177  end 
    170178 
    171   def SOAPReference.create_refid(obj) 
     179  def self.create_refid(obj) 
    172180    'id' << obj.__id__.to_s 
    173181  end 
     
    598606    data[idxary.last] = value 
    599607 
    600     if value.is_a?(SOAPBasetype) || value.is_a?(SOAPCompoundtype) 
     608    if value.is_a?(SOAPType) 
    601609      value.elename = value.elename.dup_name('item') 
    602610       
  • trunk/lib/soap/element.rb

    r950 r1012  
    8585  end 
    8686 
    87   def encode(buf, ns, attrs = {}, indent = ''
     87  def encode(generator, ns, attrs = {}
    8888    SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace) 
    8989    SOAPGenerator.assign_ns(attrs, ns, EncodingNamespace) 
    9090    attrs[ns.name(AttrEncodingStyleName)] = EncodingNamespace 
    9191    name = ns.name(@elename) 
    92     SOAPGenerator.encode_tag(buf, name, attrs, indent
     92    generator.encode_tag(name, attrs
    9393    yield(self.faultcode, false) 
    9494    yield(self.faultstring, false) 
    9595    yield(self.faultactor, false) 
    9696    yield(self.detail, false) if self.detail 
    97     SOAPGenerator.encode_tag_end(buf, name, indent, true) 
     97    generator.encode_tag_end(name, true) 
    9898  end 
    9999end 
     
    113113  end 
    114114 
    115   def encode(buf, ns, attrs = {}, indent = ''
    116     name = ns.name(@elename) 
    117     SOAPGenerator.encode_tag(buf, name, attrs, indent
     115  def encode(generator, ns, attrs = {}
     116    name = ns.name(@elename) 
     117    generator.encode_tag(name, attrs
    118118    if @is_fault 
    119119      yield(@data, true) 
     
    123123      end 
    124124    end 
    125     SOAPGenerator.encode_tag_end(buf, name, indent, true) 
     125    generator.encode_tag_end(name, true) 
    126126  end 
    127127 
     
    161161  end 
    162162 
    163   def encode(buf, ns, attrs = {}, indent = ''
     163  def encode(generator, ns, attrs = {}
    164164    attrs.each do |key, value| 
    165165      @content.attr[key] = value 
     
    186186  end 
    187187 
    188   def encode(buf, ns, attrs = {}, indent = ''
    189     name = ns.name(@elename) 
    190     SOAPGenerator.encode_tag(buf, name, attrs, indent
     188  def encode(generator, ns, attrs = {}
     189    name = ns.name(@elename) 
     190    generator.encode_tag(name, attrs
    191191    @data.each do |data| 
    192192      yield(data, true) 
    193193    end 
    194     SOAPGenerator.encode_tag_end(buf, name, indent, true) 
     194    generator.encode_tag_end(name, true) 
    195195  end 
    196196 
     
    216216  end 
    217217 
    218   def encode(buf, ns, attrs = {}, indent = ''
     218  def encode(generator, ns, attrs = {}
    219219    SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace, 
    220220      SOAPNamespaceTag) 
    221221    name = ns.name(@elename) 
    222     SOAPGenerator.encode_tag(buf, name, attrs, indent
     222    generator.encode_tag(name, attrs
    223223 
    224224    yield(@header, true) if @header and @header.length > 0 
    225225    yield(@body, true) 
    226226 
    227     SOAPGenerator.encode_tag_end(buf, name, indent, true) 
    228   end 
    229 end 
    230  
    231  
    232 end 
     227    generator.encode_tag_end(name, true) 
     228  end 
     229end 
     230 
     231 
     232end 
  • trunk/lib/soap/encodingstyle/aspDotNetHandler.rb

    r959 r1012  
    3939  ## encode interface. 
    4040  # 
    41   def encode_data(buf, ns, qualified, data, parent, indent = ''
     41  def encode_data(generator, ns, qualified, data, parent
    4242    attrs = {} 
    4343    name = if qualified and data.elename.namespace 
     
    5050    case data 
    5151    when SOAPRawString 
    52       SOAPGenerator.encode_tag(buf, name, attrs, indent
    53       buf << data.to_s 
     52      generator.encode_tag(name, attrs
     53      generator.encode_rawstring(data.to_s) 
    5454    when XSD::XSDString 
    55       SOAPGenerator.encode_tag(buf, name, attrs, indent) 
    56       buf << SOAPGenerator.encode_str(@charset ? 
    57         XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 
     55      generator.encode_tag(name, attrs) 
     56      generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 
    5857    when XSD::XSDAnySimpleType 
    59       SOAPGenerator.encode_tag(buf, name, attrs, indent
    60       buf << SOAPGenerator.encode_str(data.to_s) 
     58      generator.encode_tag(name, attrs
     59      generator.encode_string(data.to_s) 
    6160    when SOAPStruct 
    62       SOAPGenerator.encode_tag(buf, name, attrs, indent
     61      generator.encode_tag(name, attrs
    6362      data.each do |key, value| 
    6463        if !value.elename.namespace 
     
    6867      end 
    6968    when SOAPArray 
    70       SOAPGenerator.encode_tag(buf, name, attrs, indent
     69      generator.encode_tag(name, attrs
    7170      data.traverse do |child, *rank| 
    7271        data.position = nil 
     
    7978  end 
    8079 
    81   def encode_data_end(buf, ns, qualified, data, parent, indent = ""
     80  def encode_data_end(generator, ns, qualified, data, parent
    8281    name = if qualified and data.elename.namespace 
    8382        ns.name(data.elename) 
     
    8685      end 
    8786    cr = data.is_a?(SOAPCompoundtype) 
    88     SOAPGenerator.encode_tag_end(buf, name, indent, cr) 
     87    generator.encode_tag_end(name, cr) 
    8988  end 
    9089 
  • trunk/lib/soap/encodingstyle/handler.rb

    r959 r1012  
    7070  # 
    7171  # Returns a XML instance as a string. 
    72   def encode_data(buf, ns, qualified, data, parent, indent) 
     72  def encode_data(generator, ns, qualified, data, parent) 
    7373    raise NotImplementError.new('Method encode_data must be defined in derived class.') 
    7474  end 
    7575 
    76   def encode_data_end(buf, ns, qualified, data, parent, indent) 
     76  def encode_data_end(generator, ns, qualified, data, parent) 
    7777    raise NotImplementError.new('Method encode_data must be defined in derived class.') 
    7878  end 
  • trunk/lib/soap/encodingstyle/literalHandler.rb

    r959 r1012  
    3838  ## encode interface. 
    3939  # 
    40   def encode_data(buf, ns, qualified, data, parent, indent = ''
     40  def encode_data(generator, ns, qualified, data, parent
    4141    attrs = {} 
    4242    name = if qualified and data.elename.namespace 
     
    4949    case data 
    5050    when SOAPRawString 
    51       SOAPGenerator.encode_tag(buf, name, attrs, indent
    52       buf << data.to_s 
     51      generator.encode_tag(name, attrs
     52      generator.encode_rawstring(data.to_s) 
    5353    when XSD::XSDString 
    54       SOAPGenerator.encode_tag(buf, name, attrs, indent) 
    55       buf << SOAPGenerator.encode_str(@charset ? 
    56         XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 
     54      generator.encode_tag(name, attrs) 
     55      generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 
    5756    when XSD::XSDAnySimpleType 
    58       SOAPGenerator.encode_tag(buf, name, attrs, indent
    59       buf << SOAPGenerator.encode_str(data.to_s) 
     57      generator.encode_tag(name, attrs
     58      generator.encode_string(data.to_s) 
    6059    when SOAPStruct 
    61       SOAPGenerator.encode_tag(buf, name, attrs, indent
     60      generator.encode_tag(name, attrs
    6261      data.each do |key, value| 
    6362        value.elename.namespace = data.elename.namespace if !value.elename.namespace 
     
    6564      end 
    6665    when SOAPArray 
    67       SOAPGenerator.encode_tag(buf, name, attrs, indent
     66      generator.encode_tag(name, attrs
    6867      data.traverse do |child, *rank| 
    6968        data.position = nil 
     
    7170      end 
    7271    when SOAPElement 
    73       SOAPGenerator.encode_tag(buf, name, attrs.update(data.extraattr), 
    74         indent) 
    75       buf << data.text if data.text 
     72      generator.encode_tag(name, attrs.update(data.extraattr)) 
     73      generator.encode_rawstring(data.text) if data.text 
    7674      data.each do |key, value| 
    7775        value.elename.namespace = data.elename.namespace if !value.elename.namespace 
     
    8482  end 
    8583 
    86   def encode_data_end(buf, ns, qualified, data, parent, indent) 
     84  def encode_data_end(generator, ns, qualified, data, parent) 
    8785    name = if qualified and data.elename.namespace 
    8886        ns.name(data.elename) 
     
    9088        data.elename.name 
    9189      end 
    92     SOAPGenerator.encode_tag_end(buf, name, indent
     90    generator.encode_tag_end(name
    9391  end 
    9492 
  • trunk/lib/soap/encodingstyle/soapHandler.rb

    r1005 r1012  
    4141  ## encode interface. 
    4242  # 
    43   def encode_data(buf, ns, qualified, data, parent, indent = ''
    44     attrs = encode_attrs(ns, qualified, data, parent) 
     43  def encode_data(generator, ns, qualified, data, parent
     44    attrs = encode_attrs(generator, ns, data, parent) 
    4545 
    4646    if parent && parent.is_a?(SOAPArray) && parent.position 
     
    5656    end 
    5757 
    58     if data.respond_to?(:encode) 
    59       SOAPGenerator.encode_tag(buf, name, attrs, indent) 
    60       return data.encode(buf, ns, attrs, indent) 
    61     end 
    62  
    6358    case data 
    6459    when SOAPReference 
    6560      attrs['href'] = '#' << data.refid 
    66       SOAPGenerator.encode_tag(buf, name, attrs, indent
     61      generator.encode_tag(name, attrs
    6762    when SOAPRawString 
    68       SOAPGenerator.encode_tag(buf, name, attrs, indent
    69       buf << data.to_s 
     63      generator.encode_tag(name, attrs
     64      generator.encode_rawstring(data.to_s) 
    7065    when XSD::XSDString 
    71       SOAPGenerator.encode_tag(buf, name, attrs, indent) 
    72       buf << SOAPGenerator.encode_str(@charset ? 
    73         XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 
     66      generator.encode_tag(name, attrs) 
     67      generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s) 
    7468    when XSD::XSDAnySimpleType 
    75       SOAPGenerator.encode_tag(buf, name, attrs, indent
    76       buf << SOAPGenerator.encode_str(data.to_s) 
     69      generator.encode_tag(name, attrs
     70      generator.encode_string(data.to_s) 
    7771    when SOAPStruct 
    78       SOAPGenerator.encode_tag(buf, name, attrs, indent
     72      generator.encode_tag(name, attrs
    7973      data.each do |key, value| 
    8074        yield(value, false) 
    8175      end 
    8276    when SOAPArray 
    83       SOAPGenerator.encode_tag(buf, name, attrs, indent
     77      generator.encode_tag(name, attrs
    8478      data.traverse do |child, *rank| 
    8579        data.position = data.sparse ? rank : nil 
     
    9286  end 
    9387 
    94   def encode_data_end(buf, ns, qualified, data, parent, indent = ''
     88  def encode_data_end(generator, ns, qualified, data, parent
    9589    name = if qualified and data.elename.namespace 
    9690        ns.name(data.elename) 
     
    9993      end 
    10094    cr = data.is_a?(SOAPCompoundtype) 
    101     SOAPGenerator.encode_tag_end(buf, name, indent, cr) 
     95    generator.encode_tag_end(name, cr) 
    10296  end 
    10397 
     
    293287  end 
    294288 
    295   def encode_attrs(ns, qualified, data, parent) 
     289  def encode_attrs(generator, ns, data, parent) 
    296290    return {} if data.is_a?(SOAPReference) 
    297291    attrs = {} 
     
    331325    data.extraattr.each do |key, value| 
    332326      SOAPGenerator.assign_ns(attrs, ns, key.namespace) 
    333       attrs[ns.name(key)] = value       # ns.name(value) ? 
     327      attrs[ns.name(key)] = encode_attr_value(generator, ns, key, value) 
    334328    end 
    335329    if data.id 
     
    337331    end 
    338332    attrs 
     333  end 
     334 
     335  def encode_attr_value(generator, ns, qname, value) 
     336    if value.is_a?(SOAPType) 
     337      refid = SOAPReference.create_refid(value) 
     338      value.id = refid 
     339      generator.add_reftarget(qname.name, value) 
     340      '#' + refid 
     341    else 
     342      value.to_s 
     343    end 
    339344  end 
    340345 
     
    511516        next 
    512517      end 
    513       extraattr[qname] = value 
     518      extraattr[qname] = decode_attr_value(ns, qname, value) 
    514519    end 
    515520 
    516521    return is_nil, type, arytype, root, offset, position, href, id, extraattr 
     522  end 
     523 
     524  def decode_attr_value(ns, qname, value) 
     525    if /\A#/ =~ value 
     526      o = SOAPReference.new(value) 
     527      @refpool << o 
     528      o 
     529    else 
     530      value 
     531    end 
    517532  end 
    518533 
     
    527542      @refpool = @refpool.find_all { |ref| 
    528543        o = @idpool.find { |item| 
    529           ('#' << item.id == ref.refid) 
     544          '#' + item.id == ref.refid 
    530545        } 
    531546        unless o 
  • trunk/lib/soap/generator.rb

    r1006 r1012  
    4040  attr_accessor :default_encodingstyle 
    4141  attr_accessor :generate_explicit_type 
    42   attr_accessor :pretty 
    4342 
    4443  def initialize(opt = {}) 
     
    4948    @generate_explicit_type = 
    5049      opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true 
    51     @pretty = true # opt[:pretty] 
     50    @buf = @indent = @curr = nil 
    5251  end 
    5352 
    5453  def generate(obj, io = nil) 
     54    @buf = io || '' 
     55    @indent = '' 
     56 
    5557    prologue 
    5658    @handlers.each do |uri, handler| 
     
    5860    end 
    5961 
    60     io = '' if io.nil? 
    61  
    6262    ns = XSD::NS.new 
    63     io << xmldecl 
    64     encode_data(io, ns, true, obj, nil, 0
     63    @buf << xmldecl 
     64    encode_data(ns, true, obj, nil
    6565 
    6666    @handlers.each do |uri, handler| 
     
    6969    epilogue 
    7070 
    71     io 
    72   end 
    73  
    74   def encode_data(buf, ns, qualified, obj, parent, indent) 
     71    @buf 
     72  end 
     73 
     74  def encode_data(ns, qualified, obj, parent) 
    7575    if obj.is_a?(SOAPEnvelopeElement) 
    76       encode_element(buf, ns, qualified, obj, parent, indent) 
     76      encode_element(ns, qualified, obj, parent) 
    7777      return 
    7878    end 
    7979 
    8080    if @reftarget && !obj.precedents.empty? 
    81       @reftarget.add(obj.elename.name, obj) 
     81      add_reftarget(obj.elename.name, obj) 
    8282      ref = SOAPReference.new 
    8383      ref.elename.name = obj.elename.name 
     
    103103    end 
    104104 
    105     indent_str = ' ' * indent 
    106     child_indent = @pretty ? indent + 2 : indent 
    107     handler.encode_data(buf, ns, qualified, obj, parent, indent_str) do |child, child_q| 
    108       encode_data(buf, ns.clone_ns, child_q, child, obj, child_indent) 
    109     end 
    110     handler.encode_data_end(buf, ns, qualified, obj, parent, indent_str) 
    111   end 
    112  
    113   def encode_element(buf, ns, qualified, obj, parent, indent) 
    114     indent_str = ' ' * indent 
    115     child_indent = @pretty ? indent + 2 : indent 
     105    handler.encode_data(self, ns, qualified, obj, parent) do |child, child_q| 
     106      indent_backup, @indent = @indent, @indent + '  ' 
     107      encode_data(ns.clone_ns, child_q, child, obj) 
     108      @indent = indent_backup 
     109    end 
     110    handler.encode_data_end(self, ns, qualified, obj, parent) 
     111  end 
     112 
     113  def add_reftarget(name, node) 
     114    unless @reftarget 
     115      raise FormatEncodeError.new("Reftarget is not defined.") 
     116    end 
     117    @reftarget.add(name, node) 
     118  end 
     119 
     120  def encode_element(ns, qualified, obj, parent) 
    116121    attrs = {} 
    117122    if obj.is_a?(SOAPBody) 
    118123      @reftarget = obj 
    119       obj.encode(buf, ns, attrs, indent_str) do |child, child_q| 
    120         encode_data(buf, ns.clone_ns, child_q, child, obj, child_indent) 
     124      obj.encode(self, ns, attrs) do |child, child_q| 
     125        indent_backup, @indent = @indent, @indent + '  ' 
     126        encode_data(ns.clone_ns, child_q, child, obj) 
     127        @indent = indent_backup 
    121128      end 
    122129      @reftarget = nil 
     
    130137        end 
    131138      end 
    132       obj.encode(buf, ns, attrs, indent_str) do |child, child_q| 
    133         encode_data(buf, ns.clone_ns, child_q, child, obj, child_indent) 
     139      obj.encode(self, ns, attrs) do |child, child_q| 
     140        indent_backup, @indent = @indent, @indent + '  ' 
     141        encode_data(ns.clone_ns, child_q, child, obj) 
     142        @indent = indent_backup 
    134143      end 
    135144    end 
    136145  end 
    137146 
    138   def self.assign_ns(attrs, ns, namespace, tag = nil) 
    139     if namespace and !ns.assigned?(namespace) 
    140       tag = ns.assign(namespace, tag) 
    141       attrs['xmlns:' << tag] = namespace 
    142     end 
    143   end 
    144  
    145   def self.encode_tag(buf, elename, attrs = nil, indent = '') 
     147  def encode_tag(elename, attrs = nil) 
    146148    if attrs 
    147       buf << "\n#{ indent }<#{ elename }" << 
     149      @buf << "\n#{ @indent }<#{ elename }" << 
    148150        attrs.collect { |key, value| 
    149151          %Q[ #{ key }="#{ value }"] 
     
    151153        '>' 
    152154    else 
    153       buf << "\n#{ indent }<#{ elename }>" 
    154     end 
    155   end 
    156  
    157   def self.encode_tag_end(buf, elename, indent = '', cr = nil) 
     155      @buf << "\n#{ @indent }<#{ elename }>" 
     156    end 
     157  end 
     158 
     159  def encode_tag_end(elename, cr = nil) 
    158160    if cr 
    159       buf << "\n#{ indent }</#{ elename }>" 
    160     else 
    161       buf << "</#{ elename }>" 
    162     end 
     161      @buf << "\n#{ @indent }</#{ elename }>" 
     162    else 
     163      @buf << "</#{ elename }>" 
     164    end 
     165  end 
     166 
     167  def encode_rawstring(str) 
     168    @buf << str 
    163169  end 
    164170 
     
    172178  } 
    173179  EncodeCharRegexp = Regexp.new("[#{EncodeMap.keys.join}]") 
    174   def self.encode_str(str) 
    175     str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] } 
     180  def encode_string(str) 
     181    @buf << str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] } 
     182  end 
     183 
     184  def self.assign_ns(attrs, ns, namespace, tag = nil) 
     185    if namespace and !ns.assigned?(namespace) 
     186      tag = ns.assign(namespace, tag) 
     187      attrs['xmlns:' << tag] = namespace 
     188    end 
    176189  end 
    177190 
  • trunk/lib/soap/marshal.rb

    r981 r1012  
    5959    def unmarshal(stream, mapping_registry = MarshalMappingRegistry) 
    6060      header, body = SOAP::Processor.unmarshal(stream) 
     61      #Mapping.soap2obj(body.root_node, mapping_registry) 
    6162      Mapping.soap2obj(body.root_node, mapping_registry) 
    6263    end 
    6364  end 
    64  
    6565end 
    6666