ManageIQ/manageiq-gems-pending

View on GitHub
lib/gems/pending/util/miq-xml.rb

Summary

Maintainability
A
35 mins
Test Coverage
C
74%
require 'time'
require 'util/xml/miq_rexml' # we must monkey patch rexml early

class MiqXml
  MIQ_XML_VERSION = 2.1 # Refactor Nokogiri handling

  DEFAULT_XML_TYPE = :rexml # REXML is always available so default it here.

  @nokogiri = false

  def self.loadFile(filename, xmlClass = DEFAULT_XML_TYPE)
    xml_document(xmlClass).loadFile(filename)
  end

  def self.load(data, xmlClass = DEFAULT_XML_TYPE)
    xml_document(xmlClass).load(data)
  end

  def self.createDoc(rootName, rootAttrs = nil, version = MIQ_XML_VERSION, xmlClass = DEFAULT_XML_TYPE)
    xml_document(xmlClass).createDoc(rootName, rootAttrs, version)
  end

  def self.newDoc(xmlClass = DEFAULT_XML_TYPE)
    xml_document(xmlClass).newDoc
  end

  def self.decode(encodedText, xmlClass = DEFAULT_XML_TYPE)
    return xml_document(xmlClass).load(MIQEncode.decode(encodedText)) if encodedText
    newDoc
  end

  def self.newNode(data = nil, xmlClass = DEFAULT_XML_TYPE)
    xml_document(xmlClass).newNode(data)
  end

  def self.xml_document(xmlClass)
    return xmlClass::Document if xmlClass.kind_of?(Module)
    begin
      case xmlClass
      when :rexml
        REXML::Document
      when :xmlhash
        XmlHash::Document
      when :nokogiri
        require_relative 'xml/miq_nokogiri'
        @nokogiri = true
        Nokogiri::XML::Document
      else
        REXML::Document
      end
    rescue
      REXML::Document
    end
  end

  def self.isXmlElement?(handle)
    return true if handle.kind_of?(REXML::Element) || handle.kind_of?(XmlHash::Element)
    return true if nokogiri? && handle.kind_of?(Nokogiri::XML::Node)
    false
  end

  def self.isXmlDoc?(handle)
    return true if handle.kind_of?(REXML::Document) || handle.kind_of?(XmlHash::Document)
    return true if nokogiri? && handle.kind_of?(Nokogiri::XML::Document)
    false
  end

  def self.isXml?(handle)
    return true if handle.kind_of?(REXML::Element) || handle.kind_of?(REXML::Document) || handle.kind_of?(XmlHash::Element) || handle.kind_of?(XmlHash::Document)
    return true if nokogiri? && (handle.kind_of?(Nokogiri::XML::Element) || handle.kind_of?(Nokogiri::XML::Document))
    false
  end

  def self.nokogiri?
    @nokogiri
  end
end