Class: RGen::Instantiator::NodebasedXMLInstantiator

Inherits:
AbstractInstantiator show all
Defined in:
lib/rgen/instantiator/nodebased_xml_instantiator.rb

Direct Known Subclasses

DefaultXMLInstantiator

Defined Under Namespace

Classes: Visitor, XMLNodeDescriptor

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from AbstractInstantiator

resolve, resolve_by_id

Constructor Details

#initialize(env) ⇒ NodebasedXMLInstantiator

Returns a new instance of NodebasedXMLInstantiator.



66
67
68
69
70
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 66

def initialize(env)
  super
  @env = env
  @stack = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RGen::Instantiator::AbstractInstantiator

Class Method Details

.prune_levelObject

:nodoc:



23
24
25
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 23

def prune_level # :nodoc:
  @prune_level ||= 0
end

.set_prune_level(level) ⇒ Object

The prune level is the number of parent/children associations which is kept when the instantiator ascents the XML tree. If the level is 2, information for the node’s children and the childrens’ children will be available as an XMLNodeDescriptor object. If the level is 0 no pruning will take place, i.e. the whole information is kept until the end of the instantiation process. 0 is default.



19
20
21
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 19

def set_prune_level(level)
  @prune_level = level
end

Instance Method Details

#end_elementObject



95
96
97
98
99
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 95

def end_element
  node = @stack.pop
  on_ascent(node)
  prune_children(node, self.class.prune_level - 1) if self.class.prune_level > 0
end

#instantiate(text) ⇒ Object



77
78
79
80
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 77

def instantiate(text)
  parse(text)
  resolve
end

#instantiate_file(file) ⇒ Object



72
73
74
75
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 72

def instantiate_file(file)
  File.open(file) { |f| parse(f.read)}
  resolve
end

#namespacesObject



120
121
122
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 120

def namespaces
  @visitor.namespaces if @visitor
end

#on_ascent(node) ⇒ Object

This method is called when the XML parser goes up the tree. An XMLNodeDescriptor node describes the current node. Implementing classes must overwrite this method.



116
117
118
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 116

def on_ascent(node)
  raise "Overwrite this method !"
end

#on_chardata(str) ⇒ Object



101
102
103
104
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 101

def on_chardata(str)
  node = @stack.last
  node.chardata << str
end

#on_descent(node) ⇒ Object

This method is called when the XML parser goes down the tree. An XMLNodeDescriptor node describes the current node. Implementing classes must overwrite this method.



109
110
111
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 109

def on_descent(node)
  raise "Overwrite this method !"
end

#parse(src) ⇒ Object



82
83
84
85
86
87
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 82

def parse(src)
  @visitor = Visitor.new(self)
  parser = Nokogiri::XML::SAX::Parser.new(@visitor)
  parser.parse(src)
  @visitor = nil
end

#start_element(ns, qtag, prefix, tag, attributes) ⇒ Object



89
90
91
92
93
# File 'lib/rgen/instantiator/nodebased_xml_instantiator.rb', line 89

def start_element(ns, qtag, prefix, tag, attributes)
  node = XMLNodeDescriptor.new(ns, qtag, prefix, tag, @stack[-1], [], attributes)
  @stack.push node
  on_descent(node)
end