class HrrRbNetconf::Server::Filter::Subtree

Constants

TYPE

Public Class Methods

add_elem(selected_element_xpaths, output_e, raw_output_e, output_e_duplicated) click to toggle source
# File lib/hrr_rb_netconf/server/filter/subtree.rb, line 36
def add_elem selected_element_xpaths, output_e, raw_output_e, output_e_duplicated
  if output_e_duplicated
    xpath, elem = selected_element_xpaths.find{ |xpath, elem| xpath == raw_output_e.xpath }
    unless xpath
      child_output_e = output_e.add raw_output_e.clone
      selected_element_xpaths.push [raw_output_e.xpath, child_output_e]
      [child_output_e, false]
    else
      [elem, true]
    end
  else
    child_output_e = output_e.add raw_output_e.clone
    selected_element_xpaths.push [raw_output_e.xpath, child_output_e]
    [child_output_e, false]
  end
end
content_match_nodes_match_all?(content_match_nodes, raw_output_e) click to toggle source
# File lib/hrr_rb_netconf/server/filter/subtree.rb, line 21
def content_match_nodes_match_all? content_match_nodes, raw_output_e
  content_match_nodes.all?{ |child_filter_e|
    child_filter_attributes = child_filter_e.attributes.to_a.reject{ |attr| (attr.prefix =='' && attr.name == 'xmlns') || attr.prefix == 'xmlns' }
    raw_output_e.elements.to_a.any?{ |child_raw_output_e|
      (child_filter_e.namespace == "" || child_filter_e.namespace == child_raw_output_e.namespace) && child_filter_e.name == child_raw_output_e.name && child_filter_e.text == child_raw_output_e.text && (
        child_filter_attributes.empty? || child_filter_attributes.reject{ |child_filter_attr|
          child_raw_output_e.attributes.to_a.reject{ |attr| (attr.prefix =='' && attr.name == 'xmlns') || attr.prefix == 'xmlns' }.any?{ |child_raw_output_attr|
            (child_filter_attr.namespace == "" || child_filter_attr.namespace == child_raw_output_attr.namespace) && child_filter_attr.name == child_raw_output_attr.name && child_filter_attr.value == child_raw_output_attr.value
          }
        }
      )
    }
  }
end
filter(raw_output_e, filter_e) click to toggle source
# File lib/hrr_rb_netconf/server/filter/subtree.rb, line 13
def filter raw_output_e, filter_e
  selected_element_xpaths = []
  output_xml_doc = REXML::Document.new 
  subtree_e = filter_e.elements[1]
  filter_recursively(selected_element_xpaths, output_xml_doc, raw_output_e, subtree_e)
  output_xml_doc.root
end
filter_recursively(selected_element_xpaths, output_e, raw_output_e, filter_e, options={}) click to toggle source
# File lib/hrr_rb_netconf/server/filter/subtree.rb, line 53
def filter_recursively selected_element_xpaths, output_e, raw_output_e, filter_e, options={}
  if filter_e
    if raw_output_e.name == filter_e.name
      # Namespace Selection
      filter_namespace = options['namespace'] || filter_e.namespace
      if filter_namespace == nil || filter_namespace == "" || raw_output_e.namespace == filter_namespace
        # Attribute Match Expressions
        filter_attributes = filter_e.attributes.to_a.reject{ |attr| (attr.prefix =='' && attr.name == 'xmlns') || attr.prefix == 'xmlns' }
        if filter_attributes.empty? || filter_attributes.reject{ |filter_attr|
          raw_output_e.attributes.to_a.reject{ |attr| (attr.prefix =='' && attr.name == 'xmlns') || attr.prefix == 'xmlns' }.any?{ |raw_output_attr|
            filter_attr.namespace == raw_output_attr.namespace && filter_attr.name == raw_output_attr.name && filter_attr.value == raw_output_attr.value
          }
        }.empty?
          if filter_e.has_elements?
            # Containment Nodes
            if filter_e.elements.to_a.select{ |c| c.has_text? }.empty?
              child_output_e, child_output_e_duplicated = add_elem selected_element_xpaths, output_e, raw_output_e, options['output_e_duplicated']
              raw_output_e.each_element{ |child_raw_output_e|
                filter_e.elements.to_a.select{ |c| c.name == child_raw_output_e.name && (c.namespace == "" || c.namespace == child_raw_output_e.namespace) }.each{ |child_filter_e|
                    unless child_output_e_duplicated
                      if selected_element_xpaths.any?{ |xpath, elem| xpath == child_raw_output_e.xpath }
                        child_output_e_duplicated = true
                      end
                    end
                  filter_recursively selected_element_xpaths, child_output_e, child_raw_output_e, child_filter_e, {'namespace' => filter_namespace, 'output_e_duplicated' => child_output_e_duplicated}
                }
              }
            # Content Match Nodes
            else
              content_match_nodes = filter_e.elements.to_a.select{ |c| c.has_text? }
              not_content_match_nodes = filter_e.elements.to_a.reject{ |c| c.has_text? }
              if content_match_nodes_match_all? content_match_nodes, raw_output_e
                child_output_e, child_output_e_duplicated = add_elem selected_element_xpaths, output_e, raw_output_e, options['output_e_duplicated']
                if not_content_match_nodes.empty?
                  raw_output_e.each_element{ |child_raw_output_e|
                    child_filter_e = filter_e.elements.to_a.find{ |c| (c.namespace == "" || child_raw_output_e.namespace == c.namespace) && child_raw_output_e.name == c.name }
                    if child_filter_e
                      filter_recursively selected_element_xpaths, child_output_e, child_raw_output_e, child_filter_e, {'namespace' => filter_namespace, 'output_e_duplicated' => child_output_e_duplicated}
                    else
                      filter_recursively selected_element_xpaths, child_output_e, child_raw_output_e, child_filter_e, {'namespace' => filter_namespace, 'in_filter' => true, 'output_e_duplicated' => child_output_e_duplicated}
                    end
                  }
                else
                  raw_output_e.each_element{ |child_raw_output_e|
                    child_filter_e = filter_e.elements.to_a.find{ |c| (c.namespace == "" || child_raw_output_e.namespace == c.namespace) && child_raw_output_e.name == c.name }
                    filter_recursively selected_element_xpaths, child_output_e, child_raw_output_e, child_filter_e, {'namespace' => filter_namespace, 'output_e_duplicated' => child_output_e_duplicated}
                  }
                end
              else
              end
            end
          else
            child_output_e, child_output_e_duplicated = add_elem selected_element_xpaths, output_e, raw_output_e, options['output_e_duplicated']
            if raw_output_e.has_text?
              child_output_e.text = raw_output_e.text
            else
              raw_output_e.each_element{ |child_raw_output_e|
                filter_recursively selected_element_xpaths, child_output_e, child_raw_output_e, nil, {'namespace' => filter_namespace, 'in_filter' => true, 'output_e_duplicated' => child_output_e_duplicated}
              }
            end
          end
        end
      end
    end
  elsif options['in_filter']
    # Namespace Selection
    filter_namespace = options['namespace']
    if filter_namespace == nil || filter_namespace == "" || raw_output_e.namespace == filter_namespace
      child_output_e, child_output_e_duplicated = add_elem selected_element_xpaths, output_e, raw_output_e, options['output_e_duplicated']
      if raw_output_e.has_text?
        child_output_e.text = raw_output_e.text
      end
      raw_output_e.each_element{ |child_raw_output_e|
        filter_recursively selected_element_xpaths, child_output_e, child_raw_output_e, filter_e, {'namespace' => filter_namespace, 'in_filter' => true, 'outout_e_duplicated' => child_output_e_duplicated}
      }
    end
  end
end