Module: OM::XML::Document

Extended by:
ActiveSupport::Concern
Defined in:
lib/om/xml/document.rb

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args) ⇒ Object


104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/om/xml/document.rb', line 104

def method_missing(method_name, *args)
  if matches = /([^=]+)=$/.match(method_name.to_s)
    name = matches[1].to_sym
  end

  name ||= method_name

  begin
    term = self.class.terminology.retrieve_term(name)

    if /=$/.match(method_name.to_s)
      node = OM::XML::DynamicNode.new(name, nil, self, term)
      return node.val=args
    else
      return OM::XML::DynamicNode.new(name, args.first, self, term)
    end
  rescue OM::XML::Terminology::BadPointerError
    super
  end
end

Instance Attribute Details

#ox_namespacesObject

Returns a hash combining the current documents namespaces (provided by nokogiri) and any namespaces that have been set up by your Terminology. Most importantly, this matches the 'oxns' namespace to the namespace you provided in your Terminology's root term config


85
86
87
# File 'lib/om/xml/document.rb', line 85

def ox_namespaces
  @ox_namespaces
end

Instance Method Details

#add_child_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and add it as a child of target_node, where target_node is one of:

  • a Nokogiri::XML::Node

  • a single-element Nokogiri::XML::NodeSet

  • a term_pointer array resolving to a single-element Nokogiri::XML::NodeSet

Additional arguments will be passed to the template unaltered.

Returns the new Nokogiri::XML::Node.


172
173
174
# File 'lib/om/xml/document.rb', line 172

def add_child_node(target_node, node_type, *args, &block)
  manipulate_node(:add_child, target_node, node_type, *args, &block)
end

#add_next_sibling_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the following sibling of target_node. Returns the new Nokogiri::XML::Node.


178
179
180
# File 'lib/om/xml/document.rb', line 178

def add_next_sibling_node(target_node, node_type, *args, &block)
  manipulate_node(:add_next_sibling, target_node, node_type, *args, &block)
end

#add_previous_sibling_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the preceding sibling of target_node. Returns the new Nokogiri::XML::Node.


184
185
186
# File 'lib/om/xml/document.rb', line 184

def add_previous_sibling_node(target_node, node_type, *args, &block)
  manipulate_node(:add_previous_sibling, target_node, node_type, *args, &block)
end

#after_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the following sibling of target_node. Returns target_node.


190
191
192
# File 'lib/om/xml/document.rb', line 190

def after_node(target_node, node_type, *args, &block)
  manipulate_node(:after, target_node, node_type, *args, &block)
end

#before_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the preceding sibling of target_node. Returns target_node.


196
197
198
# File 'lib/om/xml/document.rb', line 196

def before_node(target_node, node_type, *args, &block)
  manipulate_node(:before, target_node, node_type, *args, &block)
end

#find_by_terms(*term_pointer) ⇒ Object

term_pointer Variable length array of values in format [:accessor_name, :accessor_name …] or [:accessor_name=>index, :accessor_name …] @example:

find_by_terms( {:person => 1}, :first_name )

Currently, indexes must be integers.

Examples:

find_by_terms( [:person, 1, :first_name] )

Pass in your own xpath query if you don't want to bother with Term pointers but do want OM to handle namespaces for you.

find_by_terms('//oxns:name[@type="personal"][contains(oxns:role, "donor")]')

145
146
147
148
# File 'lib/om/xml/document.rb', line 145

def find_by_terms(*term_pointer)
  xpath = self.class.terminology.xpath_with_indexes(*term_pointer)
  find_by_xpath(xpath) unless xpath.nil?
end

#find_by_terms_and_value(*term_pointer) ⇒ Object

Applies the property's corresponding xpath query, returning the result Nokogiri::XML::NodeSet


131
132
133
134
# File 'lib/om/xml/document.rb', line 131

def find_by_terms_and_value(*term_pointer)
  xpath = self.class.terminology.xpath_for(*term_pointer)
  find_by_xpath(xpath) unless xpath.nil?
end

#find_by_xpath(xpath) ⇒ Object


126
127
128
# File 'lib/om/xml/document.rb', line 126

def find_by_xpath(xpath)
  ng_xml.xpath(xpath, ox_namespaces)
end

#ng_xml_changed?Boolean

Returns:

  • (Boolean)

100
101
102
# File 'lib/om/xml/document.rb', line 100

def ng_xml_changed?
  changed.include?('ng_xml')
end

#ng_xml_will_change!Object

This ensures that the stored XML is deleted

See Also:

  • ActiveModel::Dirty#attribute_will_change!
  • ActiveModel::Dirty#attribute_will_change!

90
91
92
93
94
95
96
97
98
# File 'lib/om/xml/document.rb', line 90

def ng_xml_will_change!
  # throw away older version.
  # This clears both @attributes_changed_by_setter and @mutations_from_database
  clear_attribute_changes [:ng_xml]
  # This clears the cached changes
  @cached_changed_attributes[:ng_xml] = nil if defined? @cached_changed_attributes

  attribute_will_change!(:ng_xml)
end

#node_exists?(*term_pointer) ⇒ Boolean

Test whether the document has a node corresponding to the given term_pointer

Parameters:

  • term_pointer (Array)

    to test

Returns:

  • (Boolean)

152
153
154
# File 'lib/om/xml/document.rb', line 152

def node_exists?(*term_pointer)
  !find_by_terms(*term_pointer).empty?
end

#replace_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and replace target_node with it. Returns the new Nokogiri::XML::Node.


202
203
204
# File 'lib/om/xml/document.rb', line 202

def replace_node(target_node, node_type, *args, &block)
  manipulate_node(:replace, target_node, node_type, *args, &block)
end

#swap_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and replace target_node with it. Returns target_node.


208
209
210
# File 'lib/om/xml/document.rb', line 208

def swap_node(target_node, node_type, *args, &block)
  manipulate_node(:swap, target_node, node_type, *args, &block)
end

#template(node_type, *args) ⇒ Object


161
162
163
# File 'lib/om/xml/document.rb', line 161

def template(node_type, *args)
  template_registry.instantiate(node_type, *args)
end

#template_registryObject

Access the class's template registry


157
158
159
# File 'lib/om/xml/document.rb', line 157

def template_registry
  self.class.template_registry
end