Module: ActiveFedora::Datastreams::NokogiriDatastreams

Extended by:
ActiveSupport::Concern
Included in:
NomDatastream, OmDatastream
Defined in:
lib/active_fedora/datastreams/nokogiri_datastreams.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#autocreate?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 110

def autocreate?
  changed_attributes.key? :profile
end

#contentObject



105
106
107
108
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 105

def content
  @content = to_xml if ng_xml_changed? || autocreate?
  super
end

#content=(new_content) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 69

def content=(new_content)
  if remote_content != new_content.to_s
    ng_xml_will_change!
    @ng_xml = Nokogiri::XML::Document.parse(new_content)
    super(@ng_xml.to_s.strip)
  end
  self.class.decorate_ng_xml @ng_xml
end

#content_changed?Boolean

Returns:

  • (Boolean)


78
79
80
81
82
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 78

def content_changed?
  return true if autocreate? && new_record?
  return false unless xml_loaded
  ng_xml_changed?
end

#ng_xmlObject



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 16

def ng_xml
  @ng_xml ||= begin
    xml = if new_record?
            ## Load up the template
            self.class.xml_template
          else
            Nokogiri::XML::Document.parse(remote_content)
          end
    self.class.decorate_ng_xml xml
  end
end

#ng_xml=(new_xml) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 28

def ng_xml=(new_xml)
  # before we set ng_xml, we load the datastream so we know if the new value differs.
  # TODO reinstate this
  # local_or_remote_content(true)

  case new_xml
  when Nokogiri::XML::Document
    self.content = new_xml.to_xml
  when Nokogiri::XML::Node
    ## Cast a fragment to a document
    self.content = new_xml.to_s
  when String
    self.content = new_xml
  else
    raise TypeError, "You passed a #{new_xml.class} into the ng_xml of the #{dsid} datastream. OmDatastream.ng_xml= only accepts Nokogiri::XML::Document, Nokogiri::XML::Element, Nokogiri::XML::Node, or raw XML (String) as inputs."
  end
end

#ng_xml_changed?Boolean

don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods

Returns:

  • (Boolean)


61
62
63
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 61

def ng_xml_changed?
  changed_attributes.key? 'ng_xml'
end

#ng_xml_doesnt_change!Object



56
57
58
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 56

def ng_xml_doesnt_change!
  changed_attributes.delete('ng_xml')
end

#ng_xml_will_change!Object

don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods



52
53
54
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 52

def ng_xml_will_change!
  changed_attributes['ng_xml'] = nil
end

#refresh_attributesObject



46
47
48
49
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 46

def refresh_attributes
  changed_attributes.clear
  @ng_xml = nil
end

#remote_contentObject



65
66
67
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 65

def remote_content
  @ds_content ||= Nokogiri::XML(super).to_xml(&:no_declaration).strip
end

#to_xml(xml = nil) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 84

def to_xml(xml = nil)
  xml = ng_xml if xml.nil?
  ng_xml = self.ng_xml
  if ng_xml.respond_to?(:root) && ng_xml.root.nil? && self.class.respond_to?(:root_property_ref) && !self.class.root_property_ref.nil?
    ng_xml = self.class.generate(self.class.root_property_ref, "")
    xml = ng_xml if xml.root.nil?
  end

  unless xml == ng_xml || ng_xml.root.nil?
    if xml.is_a?(Nokogiri::XML::Document)
      xml.root.add_child(ng_xml.root)
    elsif xml.is_a?(Nokogiri::XML::Node)
      xml.add_child(ng_xml.root)
    else
      raise "You can only pass instances of Nokogiri::XML::Node into this method.  You passed in #{xml}"
    end
  end

  xml.to_xml.strip
end

#xml_loadedObject



114
115
116
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 114

def xml_loaded
  instance_variable_defined? :@ng_xml
end