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)


136
137
138
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 136

def autocreate?
  changed_attributes.has_key? :profile
end

#content=(new_content) ⇒ Object



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

def content=(new_content)
  if inline?
    # inline datastreams may be transformed by fedora 3, so we test for equivalence instead of equality
    if !EquivalentXml.equivalent?(datastream_content, new_content)
      ng_xml_will_change! 
      @ng_xml = Nokogiri::XML::Document.parse(new_content)
      super(@ng_xml.to_s)
    end
  else
    if datastream_content != new_content
      ng_xml_will_change! 
      @ng_xml = Nokogiri::XML::Document.parse(new_content)
      super(@ng_xml.to_s)
    end
  end
  self.class.decorate_ng_xml @ng_xml
end

#content_changed?Boolean

Returns:

  • (Boolean)


103
104
105
106
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 103

def content_changed?
  return false if !xml_loaded
  super
end

#datastream_contentObject



81
82
83
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 81

def datastream_content
  @datastream_content ||= Nokogiri::XML(super).to_xml  {|config| config.no_declaration}.strip
end

#local_or_remote_content(ensure_fetch = true) ⇒ Object



131
132
133
134
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 131

def local_or_remote_content(ensure_fetch = true)
  @content = to_xml if ng_xml_changed? || autocreate?
  super
end

#ng_xmlObject



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 38

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

#ng_xml=(new_xml) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 50

def ng_xml=(new_xml)
  # before we set ng_xml, we load the datastream so we know if the new value differs.
  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 #{self.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)


77
78
79
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 77

def ng_xml_changed?
  changed_attributes.has_key? 'ng_xml'
end

#ng_xml_doesnt_change!Object



72
73
74
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 72

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



68
69
70
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 68

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

#to_xml(xml = nil) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 108

def to_xml(xml = nil)
  xml = self.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, "")
    if xml.root.nil?
      xml = ng_xml
    end
  end

  unless xml == ng_xml || ng_xml.root.nil?
    if xml.kind_of?(Nokogiri::XML::Document)
        xml.root.add_child(ng_xml.root)
    elsif xml.kind_of?(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
  
  return xml.to_xml {|config| config.no_declaration}.strip
end

#xml_loadedObject



140
141
142
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 140

def xml_loaded
  instance_variable_defined? :@ng_xml
end