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

Changeset 1812

Show
Ignore:
Timestamp:
05/27/07 11:19:19 (2 years ago)
Author:
nahi
Message:
  • performance tuning (memory and speed)
    • reuse ParseFrame? in SOAP::Parser
    • create SOAPElement instead of SOAPString in parsing for literal service SOAP message
    • duplicate XSD::NS only when needed
Files:

Legend:

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

    r1805 r1812  
    169169    o = node.node 
    170170    if o.is_a?(SOAPUnknown) 
    171       if /\A\s*\z/ =~ textbufstr 
    172         newnode = o.as_element 
    173       else 
    174         newnode = o.as_string 
    175       end 
     171      newnode = o.as_element 
    176172      node.replace_node(newnode) 
    177173      o = node.node 
  • trunk/lib/soap/mapping/literalregistry.rb

    r1810 r1812  
    199199        return elesoap2stubobj(node, obj_class, definition) 
    200200      else 
    201         # SOAPArray for literal? 
    202201        return elesoap2plainobj(node) 
    203202      end 
     
    209208 
    210209  def elesoap2stubobj(node, obj_class, definition) 
    211     obj = Mapping.create_empty_object(obj_class) 
    212     add_elesoap2stubobj(node, obj, definition) 
     210    obj = nil 
     211    if obj_class < ::String 
     212      obj = node.text 
     213    else 
     214      obj = Mapping.create_empty_object(obj_class) 
     215      add_elesoap2stubobj(node, obj, definition) 
     216    end 
    213217    add_attributes2stubobj(node, obj, definition) 
    214218    obj 
     
    216220 
    217221  def elesoap2plainobj(node) 
    218     obj = anytype2obj(node) 
    219     add_elesoap2plainobj(node, obj) 
     222    obj = nil 
     223    if node.members.empty? 
     224      obj = base2obj(node, ::SOAP::SOAPString) 
     225    else 
     226      obj = anytype2obj(node) 
     227      add_elesoap2plainobj(node, obj) 
     228    end 
    220229    add_attributes2obj(node, obj) 
    221230    obj 
     
    261270        base2obj(value, eledef.mapped_class) 
    262271      else 
    263         child_definition = schema_definition_from_class(eledef.mapped_class) 
    264         if child_definition 
    265           any2obj(value, child_definition.class_for) 
    266         else 
    267           any2obj(value, eledef.mapped_class) 
    268         end 
     272        any2obj(value, eledef.mapped_class) 
    269273      end 
    270274    else 
  • trunk/lib/soap/mapping/registry.rb

    r1804 r1812  
    259259          nil 
    260260        end 
    261     klass.new(v).data 
     261    if value.is_a?(klass) 
     262      v 
     263    else 
     264      klass.new(v).data 
     265    end 
    262266  end 
    263267 
  • trunk/lib/soap/parser.rb

    r1765 r1812  
    2929    attr_reader :node 
    3030    attr_reader :name 
    31     attr_reader :ns, :encodingstyle 
     31    attr_reader :ns 
     32    attr_reader :encodingstyle 
     33    attr_reader :handler 
    3234 
    3335    class NodeContainer 
     
    4749  public 
    4850 
    49     def initialize(ns, name, node, encodingstyle
     51    def initialize(ns, name, node, encodingstyle, handler
    5052      @ns = ns 
    5153      @name = name 
    52       self.node = node 
     54      @node = NodeContainer.new(node) 
    5355      @encodingstyle = encodingstyle 
    54     end 
    55  
    56     def node=(node) 
    57       @node = NodeContainer.new(node) 
     56      @handler = handler 
     57    end 
     58 
     59    # to avoid memory consumption 
     60    def update(ns, name, node, encodingstyle, handler) 
     61      @ns = ns 
     62      @name = name 
     63      @node.replace_node(node) 
     64      @encodingstyle = encodingstyle 
     65      @handler = handler 
     66      self 
    5867    end 
    5968  end 
     
    7079    @parser = XSD::XMLParser.create_parser(self, opt) 
    7180    @parsestack = nil 
     81    @recycleframe = nil 
    7282    @lastnode = nil 
    7383    @handlers = {} 
     
    107117    ns = parent = parent_encodingstyle = nil 
    108118    if lastframe 
    109       ns = lastframe.ns.clone_ns 
     119      ns = lastframe.ns 
    110120      parent = lastframe.node 
    111121      parent_encodingstyle = lastframe.encodingstyle 
     
    115125      parent_encodingstyle = nil 
    116126    end 
    117  
    118     attrs = XSD::XMLParser.filter_ns(ns, attrs) 
     127    # ns might be the same 
     128    ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 
    119129    encodingstyle = find_encodingstyle(ns, attrs) 
    120  
    121130    # Children's encodingstyle is derived from its parent. 
    122131    if encodingstyle.nil? 
     
    127136      end 
    128137    end 
    129  
    130     node = decode_tag(ns, name, attrs, parent, encodingstyle) 
    131  
    132     @parsestack << ParseFrame.new(ns, name, node, encodingstyle) 
     138    handler = find_handler(encodingstyle) 
     139    unless handler 
     140      raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") 
     141    end 
     142    node = decode_tag(ns, name, attrs, parent, handler) 
     143    if @recycleframe 
     144      @parsestack << @recycleframe.update(ns, name, node, encodingstyle, handler) 
     145      @recycleframe = nil 
     146    else 
     147      @parsestack << ParseFrame.new(ns, name, node, encodingstyle, handler) 
     148    end 
    133149  end 
    134150 
     
    137153    if lastframe 
    138154      # Need not to be cloned because character does not have attr. 
    139       decode_text(lastframe.ns, text, lastframe.encodingstyle
     155      decode_text(lastframe.ns, text, lastframe.handler
    140156    else 
    141157      # Ignore Text outside of SOAP Envelope. 
     
    149165      raise UnexpectedElementError.new("Closing element name '#{ name }' does not match with opening element '#{ lastframe.name }'.") 
    150166    end 
    151     decode_tag_end(lastframe.ns, lastframe.node, lastframe.encodingstyle
     167    decode_tag_end(lastframe.ns, lastframe.node, lastframe.handler
    152168    @lastnode = lastframe.node.node 
     169    @recycleframe = lastframe 
    153170  end 
    154171 
     
    164181  end 
    165182 
    166   def decode_tag(ns, name, attrs, parent, encodingstyle
     183  def decode_tag(ns, name, attrs, parent, handler
    167184    ele = ns.parse(name) 
    168  
    169185    # Envelope based parsing. 
    170186    if ((ele.namespace == @envelopenamespace) || 
     
    173189      return o if o 
    174190    end 
    175  
    176191    # Encoding based parsing. 
    177     handler = find_handler(encodingstyle) 
    178     if handler 
    179       return handler.decode_tag(ns, ele, attrs, parent) 
    180     else 
    181       raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") 
    182     end 
    183   end 
    184  
    185   def decode_tag_end(ns, node, encodingstyle) 
    186     return unless encodingstyle 
    187  
    188     handler = find_handler(encodingstyle) 
    189     if handler 
    190       return handler.decode_tag_end(ns, node) 
    191     else 
    192       raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") 
    193     end 
    194   end 
    195  
    196   def decode_text(ns, text, encodingstyle) 
    197     handler = find_handler(encodingstyle) 
    198  
    199     if handler 
    200       handler.decode_text(ns, text) 
    201     else 
    202       # How should I do? 
    203     end 
     192    return handler.decode_tag(ns, ele, attrs, parent) 
     193  end 
     194 
     195  def decode_tag_end(ns, node, handler) 
     196    return handler.decode_tag_end(ns, node) 
     197  end 
     198 
     199  def decode_text(ns, text, handler) 
     200    handler.decode_text(ns, text) 
    204201  end 
    205202 
  • trunk/lib/wsdl/parser.rb

    r1700 r1812  
    7575    ns = parent = nil 
    7676    if lastframe 
    77       ns = lastframe.ns.clone_ns 
     77      ns = lastframe.ns 
    7878      parent = lastframe.node 
    7979    else 
     
    8181      parent = nil 
    8282    end 
    83     attrs = XSD::XMLParser.filter_ns(ns, attrs) 
     83    # ns might be the same 
     84    ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 
    8485    node = decode_tag(ns, name, attrs, parent) 
    8586    @parsestack << ParseFrame.new(ns, name, node) 
  • trunk/lib/wsdl/xmlSchema/parser.rb

    r1700 r1812  
    7373    ns = parent = nil 
    7474    if lastframe 
    75       ns = lastframe.ns.clone_ns 
     75      ns = lastframe.ns 
    7676      parent = lastframe.node 
    7777    else 
     
    7979      parent = nil 
    8080    end 
    81     attrs = XSD::XMLParser.filter_ns(ns, attrs) 
     81    # ns might be the same 
     82    ns, attrs = XSD::XMLParser.filter_ns(ns, attrs) 
    8283    node = decode_tag(ns, name, attrs, parent) 
    8384    @parsestack << ParseFrame.new(ns, name, node) 
  • trunk/lib/xsd/datatypes.rb

    r1776 r1812  
    507507 
    508508module XSDDateTimeImpl 
    509   SecInDay = 86400      # 24 * 60 * 60 
     509  DayInSec = 86400      # 24 * 60 * 60 
     510  DayInMicro = 86400_000_000 
    510511 
    511512  def to_obj(klass) 
     
    523524  def to_time 
    524525    begin 
    525       if @data.offset * SecInDay == Time.now.utc_offset 
     526      if @data.offset * DayInSec == Time.now.utc_offset 
    526527        d = @data 
    527         usec = (d.sec_fraction * SecInDay * 1000000).round 
     528        usec = (d.sec_fraction * DayInMicro).round 
    528529        Time.local(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec) 
    529530      else 
    530531        d = @data.newof 
    531         usec = (d.sec_fraction * SecInDay * 1000000).round 
     532        usec = (d.sec_fraction * DayInMicro).round 
    532533        Time.gm(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec) 
    533534      end 
     
    585586      jd = DateTime.civil_to_jd(t.year, t.mon, t.mday, DateTime::ITALY) 
    586587      fr = DateTime.time_to_day_fraction(t.hour, t.min, [t.sec, 59].min) + 
    587         t.usec.to_r / 1000000 / SecInDay 
    588       of = t.utc_offset.to_r / SecInDay 
     588        t.usec.to_r / DayInMicro 
     589      of = t.utc_offset.to_r / DayInSec 
    589590      DateTime.new!(DateTime.jd_to_ajd(jd, fr, of), of, DateTime::ITALY) 
    590591    else 
     
    629630    data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr)) 
    630631    if secfrac 
    631       diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay 
     632      diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / DayInSec 
    632633      data += diffday 
    633634      # FYI: new0 and jd_to_rjd are not necessary to use if you don't have 
     
    654655      else 
    655656        s << sprintf("%.16f", 
    656           (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '') 
     657          (@data.sec_fraction * DayInSec).to_f).sub(/^0/, '').sub(/0*$/, '') 
    657658      end 
    658659    end 
     
    683684    data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr)) 
    684685    if secfrac 
    685       diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay 
     686      diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / DayInSec 
    686687      data += diffday 
    687688    end 
     
    704705      else 
    705706        s << sprintf("%.16f", 
    706           (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '') 
     707          (@data.sec_fraction * DayInSec).to_f).sub(/^0/, '').sub(/0*$/, '') 
    707708      end 
    708709    end 
  • trunk/lib/xsd/xmlparser.rb

    r1747 r1812  
    2323 
    2424  def filter_ns(ns, attrs) 
    25     return attrs if attrs.nil? or attrs.empty? 
     25    ns_updated = false 
     26    if attrs.nil? or attrs.empty? 
     27      return [ns, attrs] 
     28    end 
    2629    newattrs = {} 
    2730    attrs.each do |key, value| 
    2831      if (NSParseRegexp =~ key) 
     32        unless ns_updated 
     33          ns = ns.clone_ns 
     34          ns_updated = true 
     35        end 
    2936        # '' means 'default namespace'. 
    3037        tag = $1 || '' 
     
    3441      end 
    3542    end 
    36     newattrs 
     43    return [ns, newattrs] 
    3744  end 
    3845  module_function :filter_ns