Class: Rightscale::RightSlicehostParser

Inherits:
Object
  • Object
show all
Defined in:
lib/slicehost_base.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 = {}) ⇒ RightSlicehostParser

Returns a new instance of RightSlicehostParser.



496
497
498
499
500
501
502
503
# File 'lib/slicehost_base.rb', line 496

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 RightSlicehostParser and method_missing helps us to skip their definition



568
569
570
571
572
573
574
575
# File 'lib/slicehost_base.rb', line 568

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.



492
493
494
# File 'lib/slicehost_base.rb', line 492

def result
  @result
end

#xml_libObject

Returns the value of attribute xml_lib.



494
495
496
# File 'lib/slicehost_base.rb', line 494

def xml_lib
  @xml_lib
end

#xmlpathObject (readonly)

Returns the value of attribute xmlpath.



493
494
495
# File 'lib/slicehost_base.rb', line 493

def xmlpath
  @xmlpath
end

Class Method Details

.xml_libObject



485
486
487
# File 'lib/slicehost_base.rb', line 485

def self.xml_lib
  @@xml_lib
end

.xml_lib=(new_lib_name) ⇒ Object



488
489
490
# File 'lib/slicehost_base.rb', line 488

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'


522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
# File 'lib/slicehost_base.rb', line 522

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'
        RightSaxParserCallback.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 = RightSaxParserCallback.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)



577
# File 'lib/slicehost_base.rb', line 577

def reset                     ; end

#tag_end(name) ⇒ Object



509
510
511
512
513
# File 'lib/slicehost_base.rb', line 509

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

#tag_start(name, attributes) ⇒ Object



504
505
506
507
508
# File 'lib/slicehost_base.rb', line 504

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

#tagend(name) ⇒ Object



579
# File 'lib/slicehost_base.rb', line 579

def tagend(name)              ; end

#tagstart(name, attributes) ⇒ Object



578
# File 'lib/slicehost_base.rb', line 578

def tagstart(name, attributes); end

#tagtext(text) ⇒ Object



580
# File 'lib/slicehost_base.rb', line 580

def tagtext(text)             ; end

#text(text) ⇒ Object



514
515
516
517
# File 'lib/slicehost_base.rb', line 514

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