Class: Aws::AwsParser

Inherits:
Object show all
Defined in:
lib/awsbase/awsbase.rb

Overview

:nodoc:

Constant Summary collapse

DEFAULT_XML_LIBRARY =

default parsing library

'rexml'
@@supported_xml_libs =

a list of supported parsers

[DEFAULT_XML_LIBRARY, 'libxml']
@@xml_lib =

xml library name: ‘rexml’ | ‘libxml’

DEFAULT_XML_LIBRARY

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = {}) ⇒ AwsParser

Returns a new instance of AwsParser.



641
642
643
644
645
646
647
648
# File 'lib/awsbase/awsbase.rb', line 641

def initialize(params={})
  @xmlpath = ''
  @result  = false
  @text    = ''
  @xml_lib = params[:xml_lib] || @@xml_lib
  @logger  = params[:logger]
  reset
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *params) ⇒ Object

Parser must have a lots of methods (see /usr/lib/ruby/1.8/rexml/parsers/streamparser.rb) We dont need most of them in AwsParser and method_missing helps us to skip their definition



714
715
716
717
718
719
720
721
# File 'lib/awsbase/awsbase.rb', line 714

def method_missing(method, *params)
  # if the method is one of known - just skip it ...
  return if [:comment, :attlistdecl, :notationdecl, :elementdecl,
             :entitydecl, :cdata, :xmldecl, :attlistdecl, :instruction,
             :doctype].include?(method)
  # ... else - call super to raise an exception
  super(method, params)
end

Instance Attribute Details

#resultObject

Returns the value of attribute result.



637
638
639
# File 'lib/awsbase/awsbase.rb', line 637

def result
  @result
end

#xml_libObject

Returns the value of attribute xml_lib.



639
640
641
# File 'lib/awsbase/awsbase.rb', line 639

def xml_lib
  @xml_lib
end

#xmlpathObject (readonly)

Returns the value of attribute xmlpath.



638
639
640
# File 'lib/awsbase/awsbase.rb', line 638

def xmlpath
  @xmlpath
end

Class Method Details

.xml_libObject



630
631
632
# File 'lib/awsbase/awsbase.rb', line 630

def self.xml_lib
  @@xml_lib
end

.xml_lib=(new_lib_name) ⇒ Object



633
634
635
# File 'lib/awsbase/awsbase.rb', line 633

def self.xml_lib=(new_lib_name)
  @@xml_lib = new_lib_name
end

Instance Method Details

#parse(xml_text, params = {}) ⇒ Object

Parser method. Params:

xml_text         - xml message text(String) or Net:HTTPxxx instance (response)
params[:xml_lib] - library name: 'rexml' | 'libxml'


668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
# File 'lib/awsbase/awsbase.rb', line 668

def parse(xml_text, params={})
  # Get response body
  xml_text = xml_text.body unless xml_text.is_a?(String)
  @xml_lib = params[:xml_lib] || @xml_lib
  # check that we had no problems with this library otherwise use default
  @xml_lib = DEFAULT_XML_LIBRARY unless @@supported_xml_libs.include?(@xml_lib)
  # load xml library
  if @xml_lib=='libxml' && !defined?(XML::SaxParser)
    begin
      require 'xml/libxml'
      # is it new ? - Setup SaxParserCallback
      if XML::Parser::VERSION >= '0.5.1.0'
        SaxParserCallback.include_callback
      end
    rescue LoadError => e
      @@supported_xml_libs.delete(@xml_lib)
      @xml_lib = DEFAULT_XML_LIBRARY
      if @logger
        @logger.error e.inspect
        @logger.error e.backtrace
        @logger.info "Can not load 'libxml' library. '#{DEFAULT_XML_LIBRARY}' is used for parsing."
      end
    end
  end
  # Parse the xml text
  case @xml_lib
  when 'libxml'
    xml        = XML::SaxParser.new
    xml.string = xml_text
    # check libxml-ruby version
    if XML::Parser::VERSION >= '0.5.1.0'
      xml.callbacks = SaxParserCallback.new(self)
    else
      xml.on_start_element{|name, attr_hash| self.tag_start(name, attr_hash)}
      xml.on_characters{   |text|            self.text(text)}
      xml.on_end_element{  |name|            self.tag_end(name)}
    end
    xml.parse
  else
    REXML::Document.parse_stream(xml_text, self)
  end
end

#resetObject

the functions to be overriden by children (if nessesery)



723
# File 'lib/awsbase/awsbase.rb', line 723

def reset                     ; end

#tag_end(name) ⇒ Object



654
655
656
657
658
659
# File 'lib/awsbase/awsbase.rb', line 654

def tag_end(name)
  if @xmlpath =~ /^(.*?)\/?#{name}$/
    @xmlpath = $1
  end
  tagend(name)
end

#tag_start(name, attributes) ⇒ Object



649
650
651
652
653
# File 'lib/awsbase/awsbase.rb', line 649

def tag_start(name, attributes)
  @text = ''
  tagstart(name, attributes)
  @xmlpath += @xmlpath.empty? ? name : "/#{name}"
end

#tagend(name) ⇒ Object



725
# File 'lib/awsbase/awsbase.rb', line 725

def tagend(name)              ; end

#tagstart(name, attributes) ⇒ Object



724
# File 'lib/awsbase/awsbase.rb', line 724

def tagstart(name, attributes); end

#tagtext(text) ⇒ Object



726
# File 'lib/awsbase/awsbase.rb', line 726

def tagtext(text)             ; end

#text(text) ⇒ Object



660
661
662
663
# File 'lib/awsbase/awsbase.rb', line 660

def text(text)
  @text += text
  tagtext(text)
end