Class: Rightscale::RightSlicehostParser
Overview
:nodoc:
Direct Known Subclasses
SliceErrorResponseParser, Slicehost::BackupsParser, Slicehost::FlavorsParser, Slicehost::ImagesParser, Slicehost::RecordsParser, Slicehost::RightHttp2xxParser, Slicehost::SlicesParser, Slicehost::ZonesParser
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
-
#result ⇒ Object
Returns the value of attribute result.
-
#xml_lib ⇒ Object
Returns the value of attribute xml_lib.
-
#xmlpath ⇒ Object
readonly
Returns the value of attribute xmlpath.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(params = {}) ⇒ RightSlicehostParser
constructor
A new instance of RightSlicehostParser.
-
#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.
-
#parse(xml_text, params = {}) ⇒ Object
Parser method.
-
#reset ⇒ Object
the functions to be overriden by children (if nessesery).
- #tag_end(name) ⇒ Object
- #tag_start(name, attributes) ⇒ Object
- #tagend(name) ⇒ Object
- #tagstart(name, attributes) ⇒ Object
- #tagtext(text) ⇒ Object
- #text(text) ⇒ Object
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
#result ⇒ Object
Returns the value of attribute result.
492 493 494 |
# File 'lib/slicehost_base.rb', line 492 def result @result end |
#xml_lib ⇒ Object
Returns the value of attribute xml_lib.
494 495 496 |
# File 'lib/slicehost_base.rb', line 494 def xml_lib @xml_lib end |
#xmlpath ⇒ Object (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_lib ⇒ Object
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 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 |
#reset ⇒ Object
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 = '' (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 (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 |