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
- #autocreate? ⇒ Boolean
- #content ⇒ Object
- #content=(new_content) ⇒ Object
- #content_changed? ⇒ Boolean
- #ng_xml ⇒ Object
- #ng_xml=(new_xml) ⇒ Object
-
#ng_xml_changed? ⇒ Boolean
don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods.
- #ng_xml_doesnt_change! ⇒ Object
-
#ng_xml_will_change! ⇒ Object
don’t want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods.
- #refresh_attributes ⇒ Object
- #remote_content ⇒ Object
- #to_xml(xml = nil) ⇒ Object
- #xml_loaded ⇒ Object
Instance Method Details
#autocreate? ⇒ Boolean
110 111 112 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 110 def autocreate? changed_attributes.key? :profile end |
#content ⇒ Object
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
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_xml ⇒ Object
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
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_attributes ⇒ Object
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_content ⇒ Object
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_loaded ⇒ Object
114 115 116 |
# File 'lib/active_fedora/datastreams/nokogiri_datastreams.rb', line 114 def xml_loaded instance_variable_defined? :@ng_xml end |